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