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()