107 lines
4.2 KiB
Python
107 lines
4.2 KiB
Python
|
|
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()
|