osgos_postinstall/postinstall/option/add_user.py

132 lines
5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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