132 lines
5 KiB
Python
132 lines
5 KiB
Python
import subprocess
|
||
from dialog import Dialog
|
||
import pwd
|
||
from postinstall.logger import logger
|
||
|
||
logging = logger
|
||
|
||
|
||
def get_password_with_toggle(d, title):
|
||
"""Функция для ввода пароля с возможностью показать/скрыть пароль"""
|
||
password_hidden = True
|
||
password = ""
|
||
|
||
# Фиксированная ширина окна
|
||
window_width = 60
|
||
|
||
while True:
|
||
if password_hidden:
|
||
# Используем insecure=True для показа скрытого пароля снежинками
|
||
code, entered_password = d.passwordbox(
|
||
title, insecure=True, init=password, width=window_width,
|
||
extra_button=True, extra_label="Показать пароль"
|
||
)
|
||
else:
|
||
# Используем insecure=False для показа пароля открытым текстом
|
||
code, entered_password = d.inputbox(
|
||
title, init=password, width=window_width,
|
||
extra_button=True, extra_label="Скрыть пароль"
|
||
)
|
||
|
||
if code == d.EXTRA:
|
||
password_hidden = not password_hidden
|
||
password = entered_password # Сохраняем введённый пароль
|
||
continue # Перезапускаем окно с новым состоянием
|
||
|
||
if code == d.CANCEL:
|
||
return None
|
||
|
||
# Обновляем сохранённый пароль
|
||
password = entered_password
|
||
return password
|
||
|
||
|
||
def add_user():
|
||
d = Dialog(dialog="dialog")
|
||
|
||
fields = [
|
||
("Имя пользователя", 1, 1, "", 1, 20, 30, 0),
|
||
("Полное имя", 2, 1, "", 2, 20, 30, 0),
|
||
("Мобильный телефон", 3, 1, "", 3, 20, 30, 0),
|
||
("Городской телефон", 4, 1, "", 4, 20, 30, 0),
|
||
("Кабинет", 5, 1, "", 5, 20, 30, 0),
|
||
]
|
||
|
||
code, values = d.form("Введите данные нового пользователя:", fields)
|
||
|
||
if code != d.OK:
|
||
return # Пользователь отменил операцию, выходим из функции
|
||
|
||
username, fullname, mobile, city_phone, cabinet = values
|
||
|
||
# Проверка существования пользователя
|
||
try:
|
||
pwd.getpwnam(username)
|
||
d.msgbox(f"Пользователь {username} уже существует.")
|
||
return
|
||
except KeyError:
|
||
pass # Пользователь не существует, продолжаем
|
||
|
||
# Запрос пароля с возможностью его показать/скрыть
|
||
password = get_password_with_toggle(d, "Введите пароль для нового пользователя")
|
||
if not password:
|
||
return # Пользователь отменил операцию, выходим из функции
|
||
|
||
# Запрос подтверждения пароля с возможностью его показать/скрыть
|
||
confirm_password = get_password_with_toggle(d, "Подтвердите пароль")
|
||
if not confirm_password:
|
||
return # Пользователь отменил операцию, выходим из функции
|
||
|
||
if password != confirm_password:
|
||
d.msgbox("Пароли не совпадают. Попробуйте снова.")
|
||
return
|
||
|
||
# Запрос прав администратора
|
||
code = d.yesno("Сделать пользователя администратором?")
|
||
is_admin = code == d.OK
|
||
|
||
try:
|
||
# Создание пользователя
|
||
subprocess.run(
|
||
[
|
||
"sudo",
|
||
"useradd",
|
||
"-m",
|
||
"-c",
|
||
f"{fullname},{cabinet},{city_phone},{mobile}",
|
||
"-s",
|
||
"/bin/bash",
|
||
username,
|
||
],
|
||
check=True,
|
||
)
|
||
|
||
# Установка пароля
|
||
process = subprocess.Popen(
|
||
["sudo", "passwd", username],
|
||
stdin=subprocess.PIPE,
|
||
stdout=subprocess.PIPE,
|
||
stderr=subprocess.PIPE,
|
||
)
|
||
process.communicate(input=f"{password}\n{password}\n".encode())
|
||
|
||
# Добавление в группу sudo, если пользователь - администратор
|
||
if is_admin:
|
||
subprocess.run(["sudo", "usermod", "-aG", "sudo", username], check=True)
|
||
|
||
logging.info(
|
||
f"Добавлен пользователь {username}. Данные пользователя: {fullname}, {cabinet}, {city_phone}, {mobile}"
|
||
)
|
||
|
||
d.msgbox(f"Пользователь {username} успешно добавлен.")
|
||
except subprocess.CalledProcessError as e:
|
||
logging.error(f"Ошибка при добавлении пользователя: {e}")
|
||
d.msgbox(f"Ошибка при добавлении пользователя: {e}")
|
||
|
||
|
||
def run_add_user():
|
||
add_user()
|
||
|
||
|
||
if __name__ == "__main__":
|
||
run_add_user()
|