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