import subprocess, os import sys, time #from colorama import Fore, Style #вывод на экран меню работы программы def display_menu(): ml_text = """ \n ************** МЕНЮ: ************************** 0. Инициализация свежей системы и ее обновление. 1. Установить SNAP и SNAP-STORE (стараемся не использовать) 2. Установить FLATPAK и его родное GUI. 3. Установка базового набора пакетов (сеть). 4. Установка Крипто-ПРО и сопуствующих дополнений. 5. Прописка в профиль пользователя сетевых папок (смертным) 6. Прописка в профиль пользователя сетевых папок (избранным) C. Выполнение произвольной команды bash/sh с отображением вывода. Q. Завершение работы программы """ print(ml_text) #запуск любой консольной bash команды из скрипта Python def execute_command(command): result = subprocess.run(command, shell=True, check=True, stdout=subprocess.PIPE, universal_newlines=True) return result.stdout #имитация живого ввода текста при выводе его на печать def live_print(text): for text_symbol in text: #Fore.GREEN sys.stdout.write(text_symbol) sys.stdout.flush() time.sleep(0.03) # Задержка между символами print() # Переход на новую строку после завершения печати #Style.RESET_ALL #подключение в папку рута, папки ArmInstall def mount_ArmInstall(): if os.path.exists('~/ArmInstall'): live_print("Тэкс... папка ArmInstall у нас есть... \n") #примонтировать в нее сетевую шару smb://nas/distributiv/ArmAstraInstall/base live_print("Примонтируем в нее сетевую заначку... \n") execute_command('mount -t cifs //192.168.2.4/distributiv/ArmAstraInstall ~/ArmInstall -o username=admincsm,password=yacsmQAZ,domain=YACSM,iocharset=utf8,file_mode=0777,dir_mode=0777,vers=1.0 --verbose') live_print("Готово. \n") else: live_print("О! Да у нас тут самое начало пути... \n") live_print("Создадим папку ArmInstall в папке Бати. \n") #создаем в папке рута папку ArmInstall os.mkdir('~/ArmInstall') live_print("Готово. \n") live_print("Теперь примонтируем в нее сетевую заначку с пакетами. \n") # монтируем в нее сетевую шару с пакетами execute_command('mount -t cifs //192.168.2.4/distributiv/ArmAstraInstall ~/ArmInstall -o username=admincsm,password=yacsmQAZ,domain=YACSM,iocharset=utf8,file_mode=0777,dir_mode=0777,vers=1.0 --verbose') live_print("Готов и этот шаг. \n") #отключение папки ArmInstall def umount_ArmInstall(): if os.path.exists('~/ArmInstall'): execute_command('umount ~/ArmInstall') execute_command('rm -r ~/ArmInstall') #обновление системы до последнего актуального состояния def update_system(): #очищаем файл репозиториев os.system('> /etc/apt/sources.list') #вносим в файл репозиториев только то, что нам нужно os.system('echo -e "\n# Заблокировать cd и разблокировать остальные, а так же дописать:" > /etc/apt/sources.list') os.system('echo -e "\n# Astra Linux repository description https://wiki.astralinux.ru/x/0oLiC" > /etc/apt/sources.list') os.system('echo -e "\n "> /etc/apt/sources.list') os.system('echo -e "\n#deb cdrom:[OS Astra Linux 1.7.1 1.7_x86-64 DVD ]/ 1.7_x86-64 contrib main non-free" > /etc/apt/sources.list') os.system('echo -e "\n# Основной репозиторий" > /etc/apt/sources.list') os.system('echo -e "\ndeb http://download.astralinux.ru/astra/stable/1.7_x86-64/repository-main/ 1.7_x86-64 main contrib non-free " > /etc/apt/sources.list') os.system('echo -e "\n "> /etc/apt/sources.list') os.system('echo -e "\n# Оперативные обновления основного репозитория" > /etc/apt/sources.list') os.system('echo -e "\ndeb http://download.astralinux.ru/astra/stable/1.7_x86-64/repository-update/ 1.7_x86-64 main contrib non-free" > /etc/apt/sources.list') os.system('echo -e "\n " > /etc/apt/sources.list') os.system('echo -e "\n# Базовый репозиторий" > /etc/apt/sources.list') os.system('echo -e "\ndeb http://download.astralinux.ru/astra/stable/1.7_x86-64/repository-base/ 1.7_x86-64 main contrib non-free" > /etc/apt/sources.list') os.system('echo -e "\n " > /etc/apt/sources.list') os.system('echo -e "\n# Расширенный репозиторий" > /etc/apt/sources.list') os.system('echo -e "\ndeb http://download.astralinux.ru/astra/stable/1.7_x86-64/repository-extended/ 1.7_x86-64 main contrib non-free" > /etc/apt/sources.list') os.system('echo -e "\n " > /etc/apt/sources.list') os.system('echo -e "\n# Расширенный репозиторий (компонент astra-ce) - используется при необходимости в установке дополнительного ПО, которое не прошло сертификацию!" > /etc/apt/sources.list') os.system('echo -e "\ndeb http://dl.astralinux.ru/astra/stable/1.7_x86-64/repository-extended/ 1.7_x86-64 astra-ce" > /etc/apt/sources.list') #execute_command('> /etc/apt/sources.list') os.system('apt-get install -y apt-transport-https ca-certificates && apt-get update && apt-get dist-upgrade && apt-get full-upgrade && astra-update -r -A') #обновим и установим пакет libc6* os.system('apt-get -t install -y libc6') #Установим свежие драйвера под интеловские чипы os.system('apt-get install -y intel-microcode') live_print("Система обновлена. Сейчас делаем перезагрузку для применения результатов. \n") live_print("После перезагрузки запустите скрипт заново и продолжите установку. \n") os.system('reboot') #Установка SNAP в Астра линукс def install_snap(): #добавим в список дистрибутивов новый дебиановкий репозиторий execute_command('echo -e "\ndeb [trusted=yes] https://mirror.yandex.ru/debian/ buster main contrib non-free" >> /etc/apt/sources.list') execute_command('gpg --keyserver keyserver.ubuntu.com --recv-key 648ACFD622F3D138') execute_command('gpg -a --export 648ACFD622F3D138 | sudo apt-key add - ') execute_command('gpg --keyserver keyserver.ubuntu.com --recv-key 0E98404D386FA1D9') execute_command('gpg -a --export 0E98404D386FA1D9 | sudo apt-key add - ') execute_command('gpg --keyserver keyserver.ubuntu.com --recv-key DCC9EFBF77E11517') execute_command('gpg -a --export DCC9EFBF77E11517 | sudo apt-key add - ') #обновим списки пакетов execute_command('apt update') #теперь установим snap execute_command('apt install snapd') execute_command('sudo ln -s /var/lib/snapd/snap /snap') execute_command('systemctl enable --now snapd') #обновим core у обвязки snap execute_command('snap refresh core') execute_command('snap install core') execute_command('snap install core snapd') #следом установим snap-store execute_command('snap install snap-store') #установка FLATPAK в Астра линукс def install_flatpak(): #установка flatpak в систему execute_command('apt install -y flatpack') #добавляем в систему репозиторий пакетов flatpak execute_command('flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo') execute_command('apt install -y plasma-discover-backend-flatpak') #установка базового набора ПО для работы пользователей def install_base_pack_soft(): print(" \n \n") ml_text = """ Сейчас начнется установка базового набора пакетов. Во время установки пакетов, настоятельно рекомендую отложить какие-либо действия на данном ПК. Так же рекомендую НЕ производить никаких манипуляций в консоли Linux. Как писали на экранах классики длинных установок: Откиньтесь на спинку кресла и наслаждайтесь любимым напитком, пока мы делаем вашу жизнь лугче и лучше. ПРОСЬБА: Дождаться завершения установки и вывода начального меню программы. \n """ live_print(ml_text) #примонтируем папку с пакетами установки mount_ArmInstall() if os.path.exists('~/ArmInstall/base'): # проверить установлены ли уже пакеты из списке и если нет, то ... # установить набор пакетов который находится в этой папке live_print("Ну что же, начинаем проверку системы и установку пакетов.... \n") #MyChat if execute_command('dpkg -l | grep mychatclient').strip() != None: # вернулось пустое значение, значит ставим пакет live_print("Устанавливаем MyChat... \n") execute_command('dpkg -i ~/ArmInstall/base/mychatclient-8.14.deb') live_print("MyChat установлен. \n") else: live_print("Пакет MyChat уже установлен, пропускаем... \n") #OnlyOffice-desktopeditors if execute_command('dpkg -l | grep OnlyOffice-desktopeditors').strip() != None: # вернулось пустое значение, значит ставим пакет live_print("Устанавливаем OnlyOffice... \n") execute_command('dpkg -i ~/ArmInstall/base/onlyoffice-desktopeditors-amd64.deb') live_print("OnlyOffice установлен. \n") else: live_print("Пакет OnlyOffice уже установлен, пропускаем... \n") #RealVNCServer-5.0.4-amd64.deb if execute_command('dpkg -l | grep realvnc-vnc-server').strip() != None: # вернулось пустое значение, значит ставим пакет live_print("Устанавливаем RealVNC Server... \n") execute_command('dpkg -i ~/ArmInstall/base/RealVNCServer-5.0.4-amd64.deb') execute_command('vnclicense -add B6BNH-A4ASK-VCEQC-6Z49E-PCT6A') live_print("RealVNC Server установлен. \n") execute_command('dpkg -i ~/ArmInstall/base/RealVNCViewer-5.0.4-amd64.deb') else: live_print("Пакет RealVNC Server уже установлен, пропускаем... \n") #yandex-browser-corp if execute_command('dpkg -l | grep yandex-browser-stable').strip() != None: # вернулось пустое значение, значит ставим пакет live_print("Устанавливаем Яндекс.Браузер... \n") execute_command('dpkg -i ~/ArmInstall/base/yandex-browser-corp.deb') live_print("Яндекс.Браузер установлен. \n") else: live_print("Пакет Яндекс.Браузер уже установлен, пропускаем... \n") #1C-Thin-client if execute_command('dpkg -l | grep 1c-enterprise-8.3.22.2106-thin-client').strip() != None: # вернулось пустое значение, значит ставим пакет live_print("Устанавливаем тонкого клиента 1С... \n") execute_command('dpkg -i ~/ArmInstall/base/1c-thinclient-8.3.22.2106-amd64.deb') live_print("Тонкий клиент 1С установлен. \n") else: live_print("Пакет тонкого клиента 1С уже установлен, пропускаем.... \n") # теперь добавим чат и vncserver в автозагрузку if os.path.exists('/home/admincsm/.config/autostart/mychatclient.desktop') == False : live_print("Копируем ярлыки автозапуска чата и vnc в автозагрузку.... \n") execute_command('cp -rT /root/ArmInstall/autostart /home/admincsm/.config/autostart/') live_print("Автозагрузка прописана. \n") else: live_print("В автозагрузку добавлять ничего не надо. Все уже на месте. \n") umount_ArmInstall() #установка Крипто-ПРО 5 версии. def install_cryptopro(): live_print("Приступаем к установке Крипто-ПРО 5.0 \n") mount_ArmInstall() execute_command('cd ~/ArmInstall/CryptoPro/cryptopro5-unpacked-amd64') execute_command('./install_gui.sh') live_print("Крипто-ПРО 5.0 установили. \n") live_print("Теперь приступим к установке Cades-Plugin для работы в браузере. \n") execute_command('cd ~/ArmInstall/CryptoPro/cades-plugin-amd64') execute_command('dpkg -i cprocsp-pki-cades-64_2.0.14892-1_amd64.deb') execute_command('dpkg -i cprocsp-pki-plugin-64_2.0.14892-1_amd64.deb') live_print("Cades-Plugin для работы в браузере установлен. \n") live_print("Теперь не забудь прописать лицензию в КриптоПРО 5 и перезагрузить ПК. \n") umount_ArmInstall() # def main(): while True: live_print("Привет! Добро пожаловать в программу упрощения жизни начинающего Linux админа. \n \n") #если запущено не из под рута - шлем в лес! if int(execute_command('id -u').strip()) != 0: #print(execute_command('id -u')) ml_text = """ Дружочек, для работы с этой программой тебе требуются права ROOT, которых сейчас у тебя нет. Программа будет завершена, а тебе настоятельно советую или подтянуть знания, или убрать свои кривые рученки и обратиться к тем, кому запускать программу можно. \n """ live_print(ml_text) time.sleep(0.15) live_print("А теперь все исчезнет, как по волшебству.... (ШУТКА!)") live_print("Пока. \n \n") break #показываем меню выбора display_menu() choice = input("Выберите нужное действие (от 0.. до 4.. или Q и т.д.): \n") if choice == "0": update_system() elif choice == "1": #установим snap install_snap() elif choice == "2": #установим flatpak install_flatpak() elif choice == "3": #установка базового пакета софта install_base_pack_soft() elif choice == "4": #устанавливаем Крипто-ПРО install_cryptopro() elif choice == "5": print("Тут будет большая функция для прописки в fstab папок монтирования для простых пользователей.") elif choice == "6": print("Тут будет большая функция для прописки в fstab папок монтирования для избранных пользователей.") elif choice == "C": userCommand = input("Введите консольную команду bash/sh с нужными параметрами: \n") result_execut_command = execute_command(userCommand) print(result_execut_command) elif choice == "Q": print("До свидания!") break else: print("Пожалуйста, выберите правильный пункт меню.") if __name__ == "__main__": main()