install-eye.ru.sh 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110
  1. #!/bin/bash
  2. # Eye Installation Script for ALT Linux/Debian/Ubuntu
  3. # Version: 2.0
  4. set -e
  5. # Цвета для вывода
  6. RED='\033[0;31m'
  7. GREEN='\033[0;32m'
  8. YELLOW='\033[1;33m'
  9. BLUE='\033[0;34m'
  10. NC='\033[0m' # No Color
  11. # Функции для вывода
  12. print_info() {
  13. echo -e "${GREEN}[INFO]${NC} $1"
  14. }
  15. print_warn() {
  16. echo -e "${YELLOW}[WARN]${NC} $1"
  17. }
  18. print_error() {
  19. echo -e "${RED}[ERROR]${NC} $1"
  20. }
  21. print_step() {
  22. echo -e "${BLUE}=== $1 ===${NC}"
  23. }
  24. # Проверка прав root
  25. check_root() {
  26. if [[ $EUID -ne 0 ]]; then
  27. print_error "Этот скрипт должен быть запущен с правами root"
  28. print_error "Используйте: sudo $0"
  29. exit 1
  30. fi
  31. }
  32. # Определение дистрибутива и менеджера пакетов
  33. detect_distro() {
  34. if [[ -f /etc/os-release ]]; then
  35. . /etc/os-release
  36. OS_ID=$ID
  37. OS_VERSION=$VERSION_ID
  38. OS_NAME=$NAME
  39. case $OS_ID in
  40. altlinux)
  41. PACKAGE_MANAGER="apt-get"
  42. SERVICE_MANAGER="systemctl"
  43. OS_FAMILY="alt"
  44. print_info "Обнаружен ALT Linux $OS_VERSION"
  45. ;;
  46. debian)
  47. PACKAGE_MANAGER="apt"
  48. SERVICE_MANAGER="systemctl"
  49. OS_FAMILY="debian"
  50. print_info "Обнаружен Debian $OS_VERSION"
  51. ;;
  52. ubuntu)
  53. PACKAGE_MANAGER="apt"
  54. SERVICE_MANAGER="systemctl"
  55. OS_FAMILY="debian"
  56. print_info "Обнаружен Ubuntu $OS_VERSION"
  57. ;;
  58. *)
  59. print_error "Неподдерживаемый дистрибутив: $OS_ID"
  60. print_error "Поддерживаются: ALT Linux, Debian, Ubuntu"
  61. exit 1
  62. ;;
  63. esac
  64. else
  65. print_error "Не удалось определить дистрибутив"
  66. exit 1
  67. fi
  68. }
  69. # Установка зависимостей для ALT Linux
  70. install_deps_altlinux() {
  71. print_step "Установка зависимостей для ALT Linux"
  72. # Обновление репозиториев
  73. apt-get update
  74. # Общие утилиты
  75. apt-get install -y git xxd wget fping hwdata
  76. # База данных
  77. apt-get install -y mariadb-server mariadb-client
  78. # Веб-сервер и PHP
  79. apt-get install -y apache2 \
  80. php8.2 php8.2-mysqlnd php8.2-intl php8.2-mbstring \
  81. pear-Mail php8.2-snmp php8.2-zip \
  82. php8.2-pgsql php8.2-mysqlnd php8.2-pdo_mysql php8.2-mysqlnd-mysqli
  83. # Perl модули
  84. apt-get install -y perl perl-Net-Patricia perl-NetAddr-IP \
  85. perl-Config-Tiny perl-Net-DNS perl-DateTime perl-Net-Ping \
  86. perl-Net-Netmask perl-Text-Iconv perl-Net-SNMP \
  87. perl-Net-Telnet perl-DBI perl-DBD-mysql perl-DBD-Pg \
  88. perl-Parallel-ForkManager perl-Proc-Daemon \
  89. perl-DateTime-Format-DateParse \
  90. perl-Net-OpenSSH perl-File-Tail perl-Crypt-Rijndael \
  91. perl-Crypt-CBC perl-CryptX perl-Crypt-DES \
  92. perl-File-Path-Tiny perl-Expect \
  93. perl-Proc-ProcessTable
  94. # Дополнительные сервисы
  95. apt-get install -y dnsmasq syslog-ng syslog-ng-journal
  96. # Установка pwgen если нет
  97. if ! command -v pwgen &> /dev/null; then
  98. apt-get install -y pwgen
  99. fi
  100. control fping public
  101. control ping public
  102. }
  103. # Установка зависимостей для Debian/Ubuntu
  104. install_deps_debian() {
  105. print_step "Установка зависимостей для Debian/Ubuntu"
  106. # Обновление репозиториев
  107. apt-get update
  108. # Общие утилиты
  109. apt-get install -y git xxd bsdmainutils pwgen wget fping ieee-data
  110. # База данных
  111. apt-get install -y mariadb-server mariadb-client
  112. # Веб-сервер и PHP
  113. apt-get install -y apache2 libapache2-mod-fcgid \
  114. php php-mysql php-bcmath php-intl php-mbstring \
  115. php-date php-mail php-snmp php-zip php-fpm \
  116. php-db php-pgsql
  117. # Perl модули
  118. apt-get install -y perl libnet-patricia-perl libnetaddr-ip-perl \
  119. libconfig-tiny-perl libnet-dns-perl libdatetime-perl \
  120. libnet-netmask-perl libtext-iconv-perl libnet-snmp-perl \
  121. libnet-telnet-perl libdbi-perl libdbd-mysql-perl \
  122. libparallel-forkmanager-perl libproc-daemon-perl \
  123. libdatetime-format-dateparse-perl \
  124. libnet-openssh-perl libfile-tail-perl libcrypt-rijndael-perl \
  125. libcrypt-cbc-perl libcryptx-perl libdbd-pg-perl \
  126. libfile-path-tiny-perl libexpect-perl libcrypt-des-perl
  127. # Дополнительные сервисы
  128. apt-get install -y dnsmasq syslog-ng
  129. }
  130. # Обновление системы
  131. update_system() {
  132. print_step "Обновление системы"
  133. $PACKAGE_MANAGER update -y
  134. }
  135. # Установка пакетов
  136. install_packages() {
  137. print_step "Установка пакетов"
  138. case $OS_FAMILY in
  139. alt)
  140. install_deps_altlinux
  141. ;;
  142. debian)
  143. install_deps_debian
  144. ;;
  145. esac
  146. }
  147. # Создание пользователя и группы
  148. create_user_group() {
  149. print_step "Создание пользователя и группы"
  150. # Создание группы
  151. if ! getent group eye >/dev/null; then
  152. groupadd --system eye
  153. print_info "Создана группа eye"
  154. else
  155. print_info "Группа eye уже существует"
  156. fi
  157. # Создание пользователя
  158. if ! id -u eye >/dev/null 2>&1; then
  159. if [[ "$OS_FAMILY" == "alt" ]]; then
  160. # Для ALT Linux
  161. useradd --system --shell /bin/bash --home-dir /opt/Eye \
  162. --gid eye --groups eye eye
  163. else
  164. # Для Debian/Ubuntu
  165. adduser --system --disabled-password --disabled-login \
  166. --ingroup eye --home=/opt/Eye eye
  167. fi
  168. print_info "Создан пользователь eye"
  169. else
  170. print_info "Пользователь eye уже существует"
  171. fi
  172. # Создание директории
  173. mkdir -p /opt/Eye
  174. chown eye:eye /opt/Eye
  175. chmod 770 /opt/Eye
  176. # Добавление nagios в группу eye (если существует)
  177. if id -u nagios >/dev/null 2>&1; then
  178. usermod -a -G eye nagios
  179. print_info "Пользователь nagios добавлен в группу eye"
  180. fi
  181. }
  182. # Проверка и применение патча для SNMP SHA512
  183. apply_snmp_patch() {
  184. print_info "Проверка поддержки SNMPv3 SHA512..."
  185. # Пути к файлам
  186. USM_PATCH_FILE="/opt/Eye/docs/patches/sha512.patch"
  187. if [[ "$OS_FAMILY" == "alt" ]]; then
  188. USM_PATCH_FILE="/opt/Eye/docs/patches/sha512.alt.patch"
  189. fi
  190. USM_PM_FILE=""
  191. # Поиск файла USM.pm в системе
  192. local usm_paths=(
  193. "/usr/share/perl5/Net/SNMP/Security/USM.pm"
  194. "/usr/lib/perl5/vendor_perl/Net/SNMP/Security/USM.pm"
  195. "/usr/local/share/perl5/Net/SNMP/Security/USM.pm"
  196. )
  197. for path in "${usm_paths[@]}"; do
  198. if [[ -f "$path" ]]; then
  199. USM_PM_FILE="$path"
  200. print_info "Найден USM.pm: $USM_PM_FILE"
  201. break
  202. fi
  203. done
  204. if [[ -z "$USM_PM_FILE" ]]; then
  205. print_warn "Файл USM.pm не найден в системе"
  206. return 1
  207. fi
  208. # Проверка, уже ли применен патч
  209. if grep -q "AUTH_PROTOCOL_HMACSHA512" "$USM_PM_FILE"; then
  210. print_info "Патч SHA512 уже применен"
  211. return 0
  212. fi
  213. # Создание резервной копии
  214. cp "$USM_PM_FILE" "${USM_PM_FILE}.backup"
  215. print_info "Создана резервная копия: ${USM_PM_FILE}.backup"
  216. # Попытка применить patch файл
  217. local patch_applied=false
  218. if [[ -f "$USM_PATCH_FILE" ]]; then
  219. print_info "Попытка применить патч из $USM_PATCH_FILE"
  220. # Проверка возможности применить патч
  221. if patch --dry-run -l -p1 -i "$USM_PATCH_FILE" -r /tmp/patch.rej "$USM_PM_FILE" 2>/dev/null; then
  222. # Применяем патч
  223. if patch -l -p1 -i "$USM_PATCH_FILE" "$USM_PM_FILE" 2>/dev/null; then
  224. print_info "Патч успешно применен!"
  225. patch_applied=true
  226. else
  227. print_warn "Не удалось применить патч (dry-run прошел, но реальное применение не удалось)"
  228. fi
  229. else
  230. print_warn "Патч не может быть применен автоматически (несоответствие версий)"
  231. # Проверка отличий
  232. print_info "Проверка отличий в патче..."
  233. if [[ -f "/opt/Eye/docs/patches/USM.pm" ]]; then
  234. diff -u "$USM_PM_FILE" "/opt/Eye/docs/patches/USM.pm" > /tmp/usm.diff 2>/dev/null || true
  235. if [[ -s /tmp/usm.diff ]]; then
  236. print_warn "Обнаружены отличия в файле USM.pm"
  237. echo "Отличия:"
  238. head -20 /tmp/usm.diff
  239. echo "..."
  240. fi
  241. fi
  242. fi
  243. fi
  244. # Если патч не применился, спрашиваем пользователя
  245. if [[ "$patch_applied" == false ]]; then
  246. echo ""
  247. print_warn "Автоматическое применение патча не удалось"
  248. print_warn "Для работы SNMPv3 с SHA512 требуется модифицировать файл USM.pm"
  249. echo ""
  250. read -p "Требуется ли поддержка SNMPv3 с SHA512? (y/n): " -n 1 -r
  251. echo
  252. if [[ $REPLY =~ ^[Yy]$ ]]; then
  253. # Пробуем заменить файл целиком
  254. if [[ -f "/opt/Eye/docs/patches/USM.pm" ]]; then
  255. print_info "Замена файла USM.pm целиком..."
  256. # Проверка совместимости версий
  257. local original_ver=$(grep -i "version" "$USM_PM_FILE" | head -1)
  258. local patch_ver=$(grep -i "version" "/opt/Eye/docs/patches/USM.pm" | head -1)
  259. if [[ -n "$original_ver" && -n "$patch_ver" ]]; then
  260. print_info "Версия оригинального файла: $original_ver"
  261. print_info "Версия патча: $patch_ver"
  262. fi
  263. # Создаем дополнительную резервную копию
  264. cp "$USM_PM_FILE" "${USM_PM_FILE}.backup.$(date +%Y%m%d_%H%M%S)"
  265. # Заменяем файл
  266. cp -f "/opt/Eye/docs/patches/USM.pm" "$USM_PM_FILE"
  267. # Проверяем успешность замены
  268. if grep -q "SHA-512" "$USM_PM_FILE"; then
  269. print_info "Файл USM.pm успешно заменен, поддержка SHA512 добавлена"
  270. # Сохраняем информацию о замене
  271. echo "Файл USM.pm был заменен для поддержки SHA512" > "${USM_PM_FILE}.replaced"
  272. echo "Оригинальный файл сохранен как: ${USM_PM_FILE}.backup" >> "${USM_PM_FILE}.replaced"
  273. echo "Дата замены: $(date)" >> "${USM_PM_FILE}.replaced"
  274. return 0
  275. else
  276. print_error "Не удалось добавить поддержку SHA512 после замены файла"
  277. # Восстанавливаем из резервной копии
  278. cp "${USM_PM_FILE}.backup" "$USM_PM_FILE"
  279. return 1
  280. fi
  281. else
  282. print_error "Файл USM.pm с патчем не найден в /opt/Eye/docs/patches/"
  283. return 1
  284. fi
  285. else
  286. print_info "Поддержка SNMPv3 SHA512 отключена"
  287. return 0
  288. fi
  289. fi
  290. return 0
  291. }
  292. # Загрузка и копирование исходного кода
  293. install_source_code() {
  294. print_step "Установка исходного кода Eye"
  295. # Создание структуры каталогов
  296. print_info "Создание структуры каталогов..."
  297. mkdir -p /opt/Eye/scripts/cfg
  298. mkdir -p /opt/Eye/scripts/log
  299. mkdir -p /opt/Eye/html/cfg
  300. mkdir -p /opt/Eye/html/js
  301. mkdir -p /opt/Eye/docs
  302. chmod -R 755 /opt/Eye/html
  303. chmod -R 770 /opt/Eye/scripts/log
  304. chmod 750 /opt/Eye/scripts
  305. # Копирование файлов
  306. print_info "Копирование файлов..."
  307. cp -R scripts/ /opt/Eye/
  308. cp -R html/ /opt/Eye/
  309. cp -R docs/ /opt/Eye/
  310. # Настройка прав
  311. chown -R eye:eye /opt/Eye
  312. # применение патча для SNMP SHA512
  313. apply_snmp_patch
  314. }
  315. # Загрузка дополнительных скриптов
  316. download_additional_scripts() {
  317. print_step "Загрузка дополнительных скриптов"
  318. # Создание директорий
  319. mkdir -p /opt/Eye/html/js/jq
  320. mkdir -p /opt/Eye/html/js/select2
  321. mkdir -p /opt/Eye/html/js/jstree
  322. # Загрузка jQuery
  323. print_info "Загрузка jQuery..."
  324. if ! wget -q https://code.jquery.com/jquery-3.7.0.min.js \
  325. -O /opt/Eye/html/js/jq/jquery.min.js; then
  326. print_warn "Не удалось загрузить jQuery, попытка альтернативного источника..."
  327. wget -q https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js \
  328. -O /opt/Eye/html/js/jq/jquery.min.js || \
  329. print_error "Не удалось загрузить jQuery"
  330. fi
  331. # Загрузка Select2
  332. print_info "Загрузка Select2..."
  333. if wget -q https://github.com/select2/select2/archive/4.0.12.tar.gz -O 4.0.12.tar.gz; then
  334. tar -xzf 4.0.12.tar.gz -C /opt/Eye/html/js/select2/ \
  335. --strip-components=2 select2-4.0.12/dist 2>/dev/null || \
  336. tar -xzf 4.0.12.tar.gz -C /opt/Eye/html/js/select2/ \
  337. --strip-components=1 select2-4.0.12/dist 2>/dev/null
  338. rm -f 4.0.12.tar.gz
  339. else
  340. print_warn "Не удалось загрузить Select2"
  341. fi
  342. # Загрузка jsTree
  343. print_info "Загрузка jsTree..."
  344. if wget -q https://github.com/vakata/jstree/archive/3.3.12.tar.gz -O jstree.tar.gz; then
  345. tar -xzf jstree.tar.gz -C /opt/Eye/html/js/
  346. mv /opt/Eye/html/js/jstree-3.3.12/dist /opt/Eye/html/js/jstree
  347. rm -rf /opt/Eye/html/js/jstree-3.3.12
  348. rm -f jstree.tar.gz
  349. else
  350. print_warn "Не удалось загрузить jsTree"
  351. fi
  352. # Настройка прав
  353. chown -R eye:eye /opt/Eye/html/js
  354. }
  355. # Настройка MySQL
  356. setup_mysql() {
  357. print_step "Настройка MySQL"
  358. # Запуск и включение службы
  359. $SERVICE_MANAGER enable mariadb 2>/dev/null || \
  360. $SERVICE_MANAGER enable mysql 2>/dev/null || true
  361. $SERVICE_MANAGER start mariadb 2>/dev/null || \
  362. $SERVICE_MANAGER start mysql 2>/dev/null || true
  363. # Проверка доступа к MySQL
  364. if ! command -v mysql &> /dev/null; then
  365. print_error "MySQL клиент не установлен"
  366. return 1
  367. fi
  368. MYSQL_OPT="-u root"
  369. # Проверяем доступ без пароля
  370. if mysql -u root -e "SELECT 1;" 2>/dev/null; then
  371. print_info "MySQL доступен с пустым паролем"
  372. echo ""
  373. print_warn "ВАЖНО: Нужно настроить пароль root для MySQL!"
  374. print_warn "После установки запустите: mysql_secure_installation"
  375. echo ""
  376. else
  377. # Запрашиваем пароль и создаем конфиг файл
  378. read -p "Введите пароль пользователя root MySQL: " DB_ROOT_PASSWORD
  379. echo ""
  380. # Создаем временный конфиг файл
  381. MYSQL_CNF_FILE="/tmp/mysql_root_eye.cnf"
  382. echo "[client]" > "$MYSQL_CNF_FILE"
  383. echo "user=root" >> "$MYSQL_CNF_FILE"
  384. echo "password=$DB_ROOT_PASSWORD" >> "$MYSQL_CNF_FILE"
  385. chmod 600 "$MYSQL_CNF_FILE"
  386. # Проверяем подключение
  387. if mysql --defaults-extra-file="$MYSQL_CNF_FILE" -e "SELECT 1;" &>/dev/null; then
  388. print_info "Успешное подключение к MySQL"
  389. MYSQL_OPT="--defaults-extra-file=$MYSQL_CNF_FILE"
  390. else
  391. print_error "Неверный пароль root MySQL"
  392. rm -f "$MYSQL_CNF_FILE"
  393. return 1
  394. fi
  395. fi
  396. read -p "Создать базу данных и пользователя для Eye? (y/n): " -n 1 -r
  397. echo
  398. if [[ ! $REPLY =~ ^[Yy]$ ]]; then
  399. print_warn "Создание БД пропущено. Создайте вручную:"
  400. print_warn " mysql -u root -p < /opt/Eye/docs/mysql/create_db.sql"
  401. print_warn " mysql -u root -p stat < /opt/Eye/docs/mysql/latest-mysql-ru.sql"
  402. if [[ -f "$MYSQL_CNF_FILE" ]]; then
  403. rm -f "$MYSQL_CNF_FILE"
  404. fi
  405. return 0
  406. fi
  407. # Генерация пароля для пользователя stat
  408. DB_PASSWORD=$(pwgen 16 1)
  409. MYSQL_PASSWORD=$DB_PASSWORD
  410. print_info "Импорт структуры базы данных..."
  411. # Импорт основного SQL файла
  412. mysql $MYSQL_OPT < /opt/Eye/docs/mysql/create_db.sql
  413. if [[ $? -ne 0 ]]; then
  414. print_error "Ошибка при импорте create_db.sql"
  415. if [[ -f "$MYSQL_CNF_FILE" ]]; then
  416. rm -f "$MYSQL_CNF_FILE"
  417. fi
  418. return 1
  419. fi
  420. print_info "Структура базы данных импортирована"
  421. # Импорт данных
  422. print_info "Импорт начальных данных..."
  423. mysql $MYSQL_OPT stat < /opt/Eye/docs/mysql/latest-mysql-ru.sql
  424. if [[ $? -ne 0 ]]; then
  425. print_warn "Ошибка при импорте latest-mysql-ru.sql (возможно данные уже существуют)"
  426. else
  427. print_info "Начальные данные импортированы"
  428. fi
  429. # Создание пользователя stat
  430. print_info "Создание пользователя stat..."
  431. mysql $MYSQL_OPT <<EOF
  432. CREATE USER IF NOT EXISTS 'stat'@'localhost' IDENTIFIED BY '$DB_PASSWORD';
  433. GRANT ALL PRIVILEGES ON stat.* TO 'stat'@'localhost';
  434. FLUSH PRIVILEGES;
  435. EOF
  436. if [[ $? -ne 0 ]]; then
  437. print_error "Ошибка при создании пользователя stat"
  438. if [[ -f "$MYSQL_CNF_FILE" ]]; then
  439. rm -f "$MYSQL_CNF_FILE"
  440. fi
  441. return 1
  442. fi
  443. print_info "Пользователь 'stat' успешно создан"
  444. # Сохранение информации о паролях
  445. echo "Пароль пользователя MySQL 'stat': $DB_PASSWORD" > /root/eye_mysql_password.txt
  446. chmod 600 /root/eye_mysql_password.txt
  447. print_info "Пароль пользователя 'stat': $DB_PASSWORD"
  448. print_warn "Пароль сохранен в /root/eye_mysql_password.txt"
  449. # Очистка временного файла если он был создан
  450. if [[ -f "$MYSQL_CNF_FILE" ]]; then
  451. rm -f "$MYSQL_CNF_FILE"
  452. fi
  453. return 0
  454. }
  455. # Настройка конфигурационных файлов
  456. setup_configs() {
  457. print_step "Настройка конфигурационных файлов"
  458. # Копирование конфигурационных файлов
  459. if [[ -f "/opt/Eye/html/cfg/config.sample.php" ]]; then
  460. cp /opt/Eye/html/cfg/config.sample.php /opt/Eye/html/cfg/config.php
  461. fi
  462. if [[ -f "/opt/Eye/scripts/cfg/config.sample" ]]; then
  463. cp /opt/Eye/scripts/cfg/config.sample /opt/Eye/scripts/cfg/config
  464. fi
  465. # Генерация ключей шифрования
  466. print_info "Генерация ключей шифрования..."
  467. if command -v pwgen &> /dev/null; then
  468. ENC_PASSWORD=$(pwgen 16 1)
  469. else
  470. ENC_PASSWORD=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c16)
  471. fi
  472. ENC_VECTOR=$(tr -dc 0-9 </dev/urandom | head -c 16)
  473. # Настройка config.php
  474. if [[ -f "/opt/Eye/html/cfg/config.sample.php" ]]; then
  475. cp /opt/Eye/html/cfg/config.sample.php /opt/Eye/html/cfg/config.php
  476. # Обновляем пароль БД
  477. if [[ -n "$MYSQL_PASSWORD" ]]; then
  478. sed -i "s/define(\"DB_PASS\",\"[^\"]*\");/define(\"DB_PASS\",\"$MYSQL_PASSWORD\");/" /opt/Eye/html/cfg/config.php
  479. sed -i "s/define(\"DB_NAME\",\"[^\"]*\");/define(\"DB_NAME\",\"stat\");/" /opt/Eye/html/cfg/config.php
  480. sed -i "s/define(\"DB_USER\",\"[^\"]*\");/define(\"DB_USER\",\"stat\");/" /opt/Eye/html/cfg/config.php
  481. fi
  482. # Обновляем ключ шифрования
  483. sed -i "s/ENCRYPTION_KEY\",\"[^\"]*\"/ENCRYPTION_KEY\",\"$ENC_PASSWORD\"/" /opt/Eye/html/cfg/config.php
  484. sed -i "s/ENCRYPTION_KEY','[^']*'/ENCRYPTION_KEY','$ENC_PASSWORD'/" /opt/Eye/html/cfg/config.php
  485. # Обновляем вектор инициализации
  486. sed -i "s/ENCRYPTION_IV\",\"[^\"]*\"/ENCRYPTION_IV\",\"$ENC_VECTOR\"/" /opt/Eye/html/cfg/config.php
  487. sed -i "s/ENCRYPTION_IV','[^']*'/ENCRYPTION_IV','$ENC_VECTOR'/" /opt/Eye/html/cfg/config.php
  488. print_info "Конфигурационный файл config.php создан из шаблона"
  489. fi
  490. # Настройка config для скриптов
  491. if [[ -f "/opt/Eye/scripts/cfg/config.sample" ]]; then
  492. cp /opt/Eye/scripts/cfg/config.sample /opt/Eye/scripts/cfg/config
  493. # Обновляем пароль БД
  494. if [[ -n "$MYSQL_PASSWORD" ]]; then
  495. sed -i "s/^DBPASS=.*/DBPASS=$MYSQL_PASSWORD/" /opt/Eye/scripts/cfg/config
  496. sed -i "s/DBPASS=mysql_password/DBPASS=$MYSQL_PASSWORD/" /opt/Eye/scripts/cfg/config
  497. fi
  498. # Обновляем имя пользователя БД
  499. sed -i "s/^DBUSER=.*/DBUSER=stat/" /opt/Eye/scripts/cfg/config
  500. sed -i "s/DBUSER=mysql_user/DBUSER=stat/" /opt/Eye/scripts/cfg/config
  501. # Обновляем имя БД
  502. sed -i "s/^DBNAME=.*/DBNAME=stat/" /opt/Eye/scripts/cfg/config
  503. sed -i "s/DBNAME=mysql_database/DBNAME=stat/" /opt/Eye/scripts/cfg/config
  504. # Обновляем ключ шифрования
  505. sed -i "s/^encryption_key=.*/encryption_key=$ENC_PASSWORD/" /opt/Eye/scripts/cfg/config
  506. sed -i "s/encryption_key=!!!CHANGE_ME!!!!/encryption_key=$ENC_PASSWORD/" /opt/Eye/scripts/cfg/config
  507. # Обновляем вектор инициализации
  508. sed -i "s/^encryption_iv=.*/encryption_iv=$ENC_VECTOR/" /opt/Eye/scripts/cfg/config
  509. sed -i "s/encryption_iv=0123456789012345/encryption_iv=$ENC_VECTOR/" /opt/Eye/scripts/cfg/config
  510. print_info "Конфигурационный файл scripts/cfg/config создан из шаблона"
  511. fi
  512. # Настройка прав
  513. chown -R eye:eye /opt/Eye/html/cfg /opt/Eye/scripts/cfg
  514. chmod 660 /opt/Eye/html/cfg/config.php /opt/Eye/scripts/cfg/config
  515. chmod 750 /opt/Eye/html/cfg /opt/Eye/scripts/cfg
  516. print_info "Ключи шифрования сгенерированы"
  517. print_info "Пароль: $ENC_PASSWORD"
  518. print_info "Вектор: $ENC_VECTOR"
  519. }
  520. # Настройка Apache и PHP
  521. setup_apache_php() {
  522. print_step "Настройка Apache и PHP"
  523. # Определение версии PHP
  524. PHP_VERSION=$(php -v 2>/dev/null | head -n1 | grep -oP '\d+\.\d+' || echo "8.1")
  525. # Настройка PHP для всех дистрибутивов
  526. if [[ "$OS_FAMILY" == "alt" ]]; then
  527. # ALT Linux
  528. PHP_INI="/etc/php/$PHP_VERSION/apache2/php.ini"
  529. APACHE_CONF_DIR="/etc/httpd2/conf"
  530. APACHE_SITES_DIR="$APACHE_CONF_DIR/sites-available"
  531. DEFAULT_CONF="$APACHE_SITES_DIR/000-default.conf"
  532. APACHE_USER="apache2"
  533. else
  534. # Debian/Ubuntu
  535. PHP_INI="/etc/php/$PHP_VERSION/apache2/php.ini"
  536. APACHE_CONF_DIR="/etc/apache2"
  537. APACHE_SITES_DIR="$APACHE_CONF_DIR/sites-available"
  538. DEFAULT_CONF="$APACHE_SITES_DIR/000-default.conf"
  539. APACHE_USER="www-data"
  540. fi
  541. # Настраиваем Apache
  542. if [[ -f "/opt/Eye/docs/apache/000-default.conf" ]]; then
  543. print_info "Используем готовый шаблон сайта"
  544. # Создаём директории
  545. mkdir -p "$APACHE_SITES_DIR"
  546. # Копируем дефалтный конфиг
  547. cp "/opt/Eye/docs/apache/000-default.conf" "$DEFAULT_CONF"
  548. # Включаем сайт
  549. if [[ -f "$APACHE_CONF_DIR/sites-enabled/000-default.conf" ]]; then
  550. rm -f "$APACHE_CONF_DIR/sites-enabled/000-default.conf"
  551. ln -sf "$DEFAULT_CONF" "$APACHE_CONF_DIR/sites-enabled/000-default.conf"
  552. fi
  553. fi
  554. # Настраиваем sudoers
  555. if [[ -f "/opt/Eye/docs/sudoers.d/www-data" ]]; then
  556. # Используем подготовленный шаблон для корректного юзера
  557. sed "s/www-data/eye/g" /opt/Eye/docs/sudoers.d/www-data > /etc/sudoers.d/eye
  558. chmod 440 /etc/sudoers.d/eye
  559. print_info "Sudoers создан из шаблона"
  560. fi
  561. # Restart Apache
  562. if [[ "$OS_FAMILY" == "alt" ]]; then
  563. # ALT Linux uses httpd2
  564. APACHE_SERVICE="httpd2"
  565. else
  566. APACHE_SERVICE="apache2"
  567. fi
  568. # usermod -a -G eye $APACHE_USER
  569. if [[ "$OS_FAMILY" == "debian" ]]; then
  570. a2dismod php${PHP_VERSION} 2>/dev/null
  571. a2dismod mpm_prefork 2>/dev/null
  572. a2enmod mpm_event 2>/dev/null
  573. a2enconf php${PHP_VERSION}-fpm 2>/dev/null
  574. fi
  575. mkdir -p /var/log/php-fpm/
  576. a2enmod setenvif
  577. a2enmod proxy
  578. a2enmod proxy_fcgi
  579. print_info "Apache настроен, sudoers user: $APACHE_USER"
  580. print_info "Apache service: $APACHE_SERVICE"
  581. print_info "Настраиваем php-fpm${PHP_VERSION}"
  582. # Configure php-fpm
  583. if [[ -f "/opt/Eye/docs/php-fpm/eye.conf" ]]; then
  584. print_info "Используем подготовленный php-fpm шаблон"
  585. if [[ "$OS_FAMILY" == "alt" ]]; then
  586. cp "/opt/Eye/docs/php-fpm/eye.conf" /etc/fpm${PHP_VERSION}/php-fpm.d/
  587. else
  588. cp "/opt/Eye/docs/php-fpm/eye.conf" /etc/php/${PHP_VERSION}/fpm/pool.available/
  589. ln -sf "/etc/php/${PHP_VERSION}/fpm/pool.available/eye.conf" "/etc/php/${PHP_VERSION}/fpm/pool.d/eye.conf"
  590. fi
  591. fi
  592. $SERVICE_MANAGER enable "$APACHE_SERVICE"
  593. $SERVICE_MANAGER restart "$APACHE_SERVICE"
  594. $SERVICE_MANAGER enable php${PHP_VERSION}-fpm.service
  595. $SERVICE_MANAGER restart php${PHP_VERSION}-fpm.service
  596. # Check configuration
  597. if [[ "$OS_FAMILY" == "alt" ]]; then
  598. httpd2 -t 2>/dev/null && print_info "Конфигурация Apache (httpd2) корректна" || print_warn "Проверьте конфигурацию Apache "
  599. else
  600. apache2ctl -t 2>/dev/null && print_info "Конфигурация Apache (httpd2) корректна" || print_warn "Проверьте конфигурацию Apache "
  601. fi
  602. }
  603. # Настройка cron и logrotate
  604. setup_cron_logrotate() {
  605. print_step "Настройка cron и logrotate"
  606. # Cron
  607. if [[ -f "/opt/Eye/docs/cron/stat" ]]; then
  608. cp /opt/Eye/docs/cron/stat /etc/cron.d/eye
  609. chmod 644 /etc/cron.d/eye
  610. print_info "Cron задача добавлена: /etc/cron.d/eye"
  611. fi
  612. # Logrotate
  613. if [[ -f "/opt/Eye/docs/logrotate/dnsmasq" ]]; then
  614. cp /opt/Eye/docs/logrotate/dnsmasq /etc/logrotate.d/dnsmasq-eye
  615. fi
  616. if [[ -f "/opt/Eye/docs/logrotate/scripts" ]]; then
  617. cp /opt/Eye/docs/logrotate/scripts /etc/logrotate.d/eye-scripts
  618. fi
  619. print_info "Настройка cron и logrotate завершена"
  620. print_warn "Отредактируйте /etc/cron.d/eye для включения нужных скриптов"
  621. }
  622. # Настройка DHCP сервера (dnsmasq)
  623. setup_dhcp_server() {
  624. print_step "Настройка DHCP сервера"
  625. read -p "Настроить DHCP сервер (dnsmasq)? (y/n): " -n 1 -r
  626. echo
  627. if [[ ! $REPLY =~ ^[Yy]$ ]]; then
  628. return 0
  629. fi
  630. # Резервная копия конфигурации
  631. if [[ -f "/etc/dnsmasq.conf" ]]; then
  632. cp /etc/dnsmasq.conf /etc/dnsmasq.conf.backup
  633. fi
  634. # Копирование конфигурации из Eye
  635. if [[ -f "/opt/Eye/docs/addons/dnsmasq.conf" ]]; then
  636. cat /opt/Eye/docs/addons/dnsmasq.conf > /etc/dnsmasq.conf
  637. fi
  638. # Копирование systemd сервисов
  639. if [[ -f "/opt/Eye/docs/systemd/dhcp-log.service" ]]; then
  640. cp /opt/Eye/docs/systemd/dhcp-log.service /etc/systemd/system/
  641. fi
  642. if [[ -f "/opt/Eye/docs/systemd/dhcp-log-truncate.service" ]]; then
  643. cp /opt/Eye/docs/systemd/dhcp-log-truncate.service /etc/systemd/system/
  644. fi
  645. # Включение сервисов
  646. $SERVICE_MANAGER enable dnsmasq
  647. $SERVICE_MANAGER start dnsmasq
  648. print_info "DHCP сервер настроен"
  649. print_warn "Отредактируйте /etc/dnsmasq.conf под вашу сеть"
  650. }
  651. # Настройка syslog-ng
  652. setup_syslog() {
  653. print_step "Настройка syslog-ng"
  654. read -p "Настроить удаленный сбор логов (syslog-ng)? (y/n): " -n 1 -r
  655. echo
  656. if [[ ! $REPLY =~ ^[Yy]$ ]]; then
  657. return 0
  658. fi
  659. # Создаем резервную копию основного конфига
  660. if [[ -f "/etc/syslog-ng/syslog-ng.conf" ]]; then
  661. cp /etc/syslog-ng/syslog-ng.conf /etc/syslog-ng/syslog-ng.conf.backup
  662. print_info "Создана резервная копия /etc/syslog-ng/syslog-ng.conf"
  663. fi
  664. # Копируем дополнительный конфиг для Eye
  665. if [[ -f "/opt/Eye/docs/syslog-ng/eye.conf" ]]; then
  666. mkdir -p /etc/syslog-ng/conf.d
  667. cp /opt/Eye/docs/syslog-ng/eye.conf /etc/syslog-ng/conf.d/eye.conf
  668. # Проверяем, есть ли уже включение conf.d в основном конфиге
  669. if [[ -f "/etc/syslog-ng/syslog-ng.conf" ]]; then
  670. if ! grep -q "@include.*conf\.d" /etc/syslog-ng/syslog-ng.conf && \
  671. ! grep -q "include.*conf\.d" /etc/syslog-ng/syslog-ng.conf; then
  672. # Добавляем включение conf.d директории в конец файла
  673. echo "" >> /etc/syslog-ng/syslog-ng.conf
  674. echo "# Include Eye monitoring configuration" >> /etc/syslog-ng/syslog-ng.conf
  675. echo "@include \"/etc/syslog-ng/conf.d/*.conf\"" >> /etc/syslog-ng/syslog-ng.conf
  676. print_info "Добавлено включение conf.d директории в syslog-ng.conf"
  677. fi
  678. fi
  679. print_info "Конфигурационный файл eye.conf скопирован в /etc/syslog-ng/conf.d/"
  680. else
  681. print_warn "Файл конфигурации eye.conf не найден в /opt/Eye/docs/syslog-ng/"
  682. fi
  683. # блок options
  684. syslogng_options='options {
  685. chain_hostnames(off);
  686. flush_lines(0);
  687. use_dns(no);
  688. use_fqdn(no);
  689. dns_cache(no);
  690. owner("root");
  691. group("adm");
  692. perm(0640);
  693. stats_freq(0);
  694. time_reopen(10);
  695. log_fifo_size(1000);
  696. create_dirs(yes);
  697. keep_hostname(no);
  698. };'
  699. # Проверяем наличие options в основном конфиге
  700. if [[ -f "/etc/syslog-ng/syslog-ng.conf" ]]; then
  701. if ! grep -q "^options\s*{" /etc/syslog-ng/syslog-ng.conf; then
  702. # Добавляем блок options если его нет
  703. if grep -q "^@version:" /etc/syslog-ng/syslog-ng.conf; then
  704. # Вставляем после строки @version:
  705. sed -i "/^@version:/a\\$syslogng_options" /etc/syslog-ng/syslog-ng.conf
  706. else
  707. # Вставляем в начало файла
  708. sed -i "1i\\$syslogng_options" /etc/syslog-ng/syslog-ng.conf
  709. fi
  710. print_info "Добавлен блок options в syslog-ng.conf"
  711. else
  712. # Проверяем наличие необходимых параметров в существующем блоке options
  713. local missing_params=()
  714. if ! grep -q "time_reopen\s*(.*)" /etc/syslog-ng/syslog-ng.conf; then
  715. missing_params+=("time_reopen(10)")
  716. fi
  717. if ! grep -q "log_fifo_size\s*(.*)" /etc/syslog-ng/syslog-ng.conf; then
  718. missing_params+=("log_fifo_size(1000)")
  719. fi
  720. if ! grep -q "chain_hostnames\s*(.*)" /etc/syslog-ng/syslog-ng.conf; then
  721. missing_params+=("chain_hostnames(off)")
  722. fi
  723. if ! grep -q "create_dirs\s*(.*)" /etc/syslog-ng/syslog-ng.conf; then
  724. missing_params+=("create_dirs(yes)")
  725. fi
  726. if ! grep -q "keep_hostname\s*(.*)" /etc/syslog-ng/syslog-ng.conf; then
  727. missing_params+=("keep_hostname(no)")
  728. fi
  729. # Добавляем недостающие параметры
  730. if [[ ${#missing_params[@]} -gt 0 ]]; then
  731. # Находим блок options и добавляем параметры в конец блока
  732. sed -i '/^options\s*{/,/^}/ {
  733. /^}/ i\ '"$(IFS='; '; echo "${missing_params[*]}")"';
  734. }' /etc/syslog-ng/syslog-ng.conf
  735. print_info "Добавлены параметры в блок options: ${missing_params[*]}"
  736. fi
  737. fi
  738. fi
  739. # Копирование systemd сервиса для обработки логов Eye
  740. if [[ -f "/opt/Eye/docs/systemd/syslog-stat.service" ]]; then
  741. cp /opt/Eye/docs/systemd/syslog-stat.service /etc/systemd/system/
  742. chmod 644 /etc/systemd/system/syslog-stat.service
  743. print_info "Сервис syslog-stat скопирован"
  744. fi
  745. # Создаем директорию для логов если её нет
  746. mkdir -p /opt/Eye/scripts/log
  747. chown eye:eye /opt/Eye/scripts/log
  748. chmod 770 /opt/Eye/scripts/log
  749. # Включение и запуск сервисов
  750. $SERVICE_MANAGER daemon-reload
  751. if $SERVICE_MANAGER enable syslog-ng; then
  752. print_info "Сервис syslog-ng включен в автозагрузку"
  753. else
  754. print_warn "Не удалось включить syslog-ng в автозагрузку"
  755. fi
  756. if $SERVICE_MANAGER restart syslog-ng; then
  757. print_info "Сервис syslog-ng перезапущен"
  758. else
  759. print_warn "Не удалось перезапустить syslog-ng"
  760. fi
  761. if [[ -f "/etc/systemd/system/syslog-stat.service" ]]; then
  762. if $SERVICE_MANAGER enable syslog-stat; then
  763. print_info "Сервис syslog-stat включен в автозагрузку"
  764. else
  765. print_warn "Не удалось включить syslog-stat в автозагрузку"
  766. fi
  767. if $SERVICE_MANAGER start syslog-stat; then
  768. print_info "Сервис syslog-stat запущен"
  769. else
  770. print_warn "Не удалось запустить syslog-stat"
  771. fi
  772. fi
  773. # Проверка конфигурации syslog-ng
  774. if command -v syslog-ng &> /dev/null; then
  775. if syslog-ng --syntax-only; then
  776. print_info "Конфигурация syslog-ng корректна"
  777. else
  778. print_error "Ошибка в конфигурации syslog-ng"
  779. print_warn "Проверьте файлы: /etc/syslog-ng/syslog-ng.conf и /etc/syslog-ng/conf.d/eye.conf"
  780. fi
  781. fi
  782. print_info "Настройка syslog-ng завершена"
  783. print_info "Для приема логов с устройств настройте их на отправку на IP: $(hostname -f)"
  784. }
  785. # Настройка дополнительных сервисов
  786. setup_additional_services() {
  787. print_step "Настройка дополнительных сервисов"
  788. # Сервис stat-sync
  789. if [[ -f "/opt/Eye/docs/systemd/stat-sync.service" ]]; then
  790. cp /opt/Eye/docs/systemd/stat-sync.service /etc/systemd/system/
  791. $SERVICE_MANAGER enable stat-sync.service
  792. print_info "Сервис stat-sync включен"
  793. fi
  794. # Сервис eye-statd (NetFlow)
  795. if [[ -f "/opt/Eye/docs/systemd/eye-statd.service" ]]; then
  796. cp /opt/Eye/docs/systemd/eye-statd.service /etc/systemd/system/
  797. $SERVICE_MANAGER enable eye-statd.service
  798. print_info "Сервис eye-statd (NetFlow) включен"
  799. fi
  800. # Настройка DHCP
  801. setup_dhcp_server
  802. # Настройка syslog
  803. setup_syslog
  804. }
  805. # Импорт базы MAC-адресов
  806. import_mac_database() {
  807. print_step "Импорт базы MAC-адресов"
  808. if [[ -f "/opt/Eye/scripts/utils/mac-oids/download-macs.sh" ]]; then
  809. cd /opt/Eye/scripts/utils/mac-oids/
  810. # Загрузка базы MAC
  811. print_info "Загрузка базы MAC-адресов..."
  812. bash download-macs.sh
  813. # Обновление вендоров
  814. if [[ -f "update-mac-vendors.pl" ]]; then
  815. print_info "Обновление информации о вендорах..."
  816. perl update-mac-vendors.pl
  817. fi
  818. cd - >/dev/null
  819. else
  820. print_warn "Скрипты для импорта MAC-адресов не найдены"
  821. fi
  822. }
  823. # Финальные инструкции
  824. show_final_instructions() {
  825. echo ""
  826. echo -e "${GREEN}===========================================${NC}"
  827. echo -e "${GREEN} УСТАНОВКА ЗАВЕРШЕНА УСПЕШНО! ${NC}"
  828. echo -e "${GREEN}===========================================${NC}"
  829. echo ""
  830. echo "СИСТЕМНАЯ ИНФОРМАЦИЯ:"
  831. echo " Дистрибутив: $OS_NAME"
  832. echo " Версия: $OS_VERSION"
  833. echo " Пользователь: eye"
  834. echo " Директория: /opt/Eye"
  835. echo ""
  836. echo "ДЛЯ ЗАВЕРШЕНИЯ НАСТРОЙКИ ВЫПОЛНИТЕ:"
  837. echo ""
  838. echo "1. Настройте безопасность MySQL:"
  839. echo " mysql_secure_installation"
  840. echo ""
  841. echo "2. Проверьте и отредактируйте конфигурационные файлы:"
  842. echo " /opt/Eye/html/cfg/config.php"
  843. echo " /opt/Eye/scripts/cfg/config"
  844. echo ""
  845. if [[ -f "/root/eye_mysql_password.txt" ]]; then
  846. echo "3. Пароль MySQL пользователя 'stat' сохранен в:"
  847. echo " /root/eye_mysql_password.txt"
  848. echo ""
  849. fi
  850. echo "4. Настройте cron задачи:"
  851. echo " nano /etc/cron.d/eye"
  852. echo " Раскомментируйте нужные скрипты"
  853. echo ""
  854. echo "5. Настройте при необходимости:"
  855. echo " - DHCP: /etc/dnsmasq.conf"
  856. echo " - NetFlow: настройте на сетевых устройствах"
  857. echo ""
  858. echo "6. ДОСТУП К ВЕБ-ИНТЕРФЕЙСУ:"
  859. echo " URL: http://$(hostname -f)/"
  860. echo " Админка: http://$(hostname -f)/admin/"
  861. echo " Логин: admin"
  862. echo " Пароль: admin"
  863. echo ""
  864. echo -e "${RED}ВАЖНО:${NC}"
  865. echo " - СМЕНИТЕ пароль администратора и API ключ!"
  866. echo " - Настройте пользователей и сети в веб-интерфейсе"
  867. echo ""
  868. echo -e "${GREEN}===========================================${NC}"
  869. echo ""
  870. }
  871. # Главная функция
  872. main() {
  873. clear
  874. echo -e "${GREEN}===========================================${NC}"
  875. echo -e "${GREEN} Установка Eye Monitoring System ${NC}"
  876. echo -e "${GREEN} для ALT Linux/Debian/Ubuntu ${NC}"
  877. echo -e "${GREEN}===========================================${NC}"
  878. echo ""
  879. # Глобальные переменные
  880. MYSQL_PASSWORD=""
  881. # Выполнение шагов установки
  882. check_root
  883. detect_distro
  884. update_system
  885. install_packages
  886. create_user_group
  887. install_source_code
  888. download_additional_scripts
  889. setup_mysql
  890. setup_configs
  891. setup_apache_php
  892. setup_cron_logrotate
  893. setup_additional_services
  894. import_mac_database
  895. show_final_instructions
  896. }
  897. # Обработка аргументов командной строки
  898. case "$1" in
  899. --help|-h)
  900. echo "Использование: $0 [опции]"
  901. echo ""
  902. echo "Опции:"
  903. echo " --help, -h Показать эту справку"
  904. echo " --auto Автоматическая установка (минимальное взаимодействие)"
  905. echo ""
  906. echo "Поддерживаемые дистрибутивы:"
  907. echo " - ALT Linux 11.1+"
  908. echo " - Debian 11+"
  909. echo " - Ubuntu 20.04+"
  910. echo ""
  911. exit 0
  912. ;;
  913. --auto)
  914. # Режим с минимальным взаимодействием
  915. print_warn "Автоматический режим. Все подтверждения будут приняты как 'yes'"
  916. export DEBIAN_FRONTEND=noninteractive
  917. ;;
  918. *)
  919. # Интерактивный режим по умолчанию
  920. ;;
  921. esac
  922. # Запуск установки
  923. main "$@"
  924. # Выход с кодом успеха
  925. exit 0