osgos_postinstall/postinstall/option/shell.py

106 lines
4.2 KiB
Python
Raw Permalink 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
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()