osgos_postinstall/deb_dist/postinstall-1.5.0/build/lib/postinstall/option/shell.py

107 lines
4.2 KiB
Python
Raw Normal View History

2025-06-09 14:32:16 +05:00
import subprocess
from dialog import Dialog
import pwd
import os
from postinstall.logger import logger
logging = logger
def get_users():
users = []
try:
for user in pwd.getpwall():
if user.pw_uid >= 1000 and user.pw_name != "nobody":
users.append(user.pw_name)
if "root" not in users:
users.append("root")
except Exception as e:
print(f"Ошибка при получении списка пользователей: {e}")
return users
def install_zsh():
try:
subprocess.run(["apt", "update"], check=True)
subprocess.run(["apt", "install", "-y", "zsh"], check=True)
except subprocess.CalledProcessError as e:
print(f"Ошибка при установке zsh: {e}")
return False
return True
def change_shell():
d = Dialog(dialog="dialog")
users = get_users()
# Первый шаг - выбор опции с помощью radiolist
code, choice = d.radiolist(
"Выберите способ изменения оболочки:",
choices=[
("Для всех пользователей", "", False),
("Выбрать конкретных пользователей", "", True)
]
)
if code != d.OK:
return
selected_users = []
if choice == "Для всех пользователей":
# Если выбрано "Для всех пользователей"
selected_users = users
elif choice == "Выбрать конкретных пользователей":
# Если выбран выбор конкретных пользователей, показываем checklist
code, selected_users = d.checklist(
"Выберите пользователей для изменения оболочки:",
choices=[(user, "", False) for user in users],
clear=True
)
if code != d.OK or not selected_users:
return
# Выбор оболочки
code, shell = d.menu(
"Выберите новую оболочку:", choices=[("1", "bash"), ("2", "zsh")]
)
if code != d.OK:
return
shell_path = "/bin/bash" if shell == "1" else "/bin/zsh"
if shell_path == "/bin/zsh" and not os.path.exists("/bin/zsh"):
logging.info("zsh не установлен. Начинаем установку...")
d.msgbox("zsh не установлен. Начинаем установку...")
if not install_zsh():
d.msgbox("Не удалось установить zsh. Изменение оболочки отменено.")
return
# Применение изменений
if choice == "Для всех пользователей":
# Применение изменений для всех пользователей
for user in selected_users:
try:
subprocess.run(["sudo", "chsh", "-s", shell_path, user], check=True)
except subprocess.CalledProcessError as e:
logging.error(f"Ошибка при изменении оболочки для пользователя {user}: {e}")
d.msgbox("Оболочка изменена для всех существующих пользователей")
logging.info("Оболочка изменена для всех существующих пользователей")
else:
# Применение изменений для конкретных пользователей
for user in selected_users:
try:
subprocess.run(["sudo", "chsh", "-s", shell_path, user], check=True)
d.msgbox(f"Оболочка для пользователя {user} изменена на {shell_path}")
logging.info(f"Оболочка для пользователя {user} изменена на {shell_path}")
except subprocess.CalledProcessError as e:
d.msgbox(f"Ошибка при изменении оболочки для пользователя {user}: {e}")
def run_change_shell():
change_shell()
if __name__ == "__main__":
run_change_shell()