Zuletzt aktiv 1 week ago

Änderung b1b91e83f213aec3c739ddf7876de6b05601d22c

install.sh Originalformat
1#!/bin/bash
2
3set -e
4
5# Цвета для вывода
6ANSI_RED=$(tput -Txterm setaf 1)
7ANSI_GREEN=$(tput -Txterm setaf 2)
8ANSI_YELLOW=$(tput -Txterm setaf 3)
9ANSI_RESET=$(tput -Txterm sgr0)
10
11# ==================== ФУНКЦИИ ====================
12
13# Проверка прав root
14check_root() {
15 if [ "$EUID" -ne 0 ]; then
16 echo -e "${ANSI_RED}Ошибка: скрипт должен запускаться от root${ANSI_RESET}"
17 exit 1
18 fi
19}
20
21# Запрос имени хоста
22ask_hostname() {
23 local current_hostname=$(hostname)
24 read -e -p "${ANSI_YELLOW}Введите имя хоста: (текущее: $current_hostname) ${ANSI_RESET}" -i "${current_hostname}" NEW_HOSTNAME
25 echo "$NEW_HOSTNAME"
26}
27
28# Запрос - создавать ли пользователя
29ask_create_user() {
30 local choice
31 echo -e "${ANSI_YELLOW}Создать нового пользователя? (y/n):${ANSI_RESET}"
32 read -p "Create user [Y/N]? " choice
33 if [[ "$choice" =~ ^[Yy]$ ]]; then
34 CREATE_USER="yes"
35 else
36 CREATE_USER="no"
37 fi
38}
39
40# Запрос имени пользователя
41ask_username() {
42 local username
43 echo -e "${ANSI_YELLOW}Введите имя нового пользователя:${ANSI_RESET}" >&2
44 read -p "Username: " username
45 if [ -z "$username" ]; then
46 echo -e "${ANSI_RED}Имя пользователя не может быть пустым.${ANSI_RESET}" >&2
47 exit 1
48 fi
49 echo "$username"
50}
51
52# Запрос пароля
53ask_password() {
54 local username=$1
55 local user_pass
56 echo -e "${ANSI_YELLOW}Введите пароль для пользователя $username:${ANSI_RESET}" >&2
57 read -s -p "Password: " user_pass
58 echo >&2
59 if [ -z "$user_pass" ]; then
60 echo -e "${ANSI_RED}Пароль не может быть пустым.${ANSI_RESET}" >&2
61 exit 1
62 fi
63 echo "$user_pass"
64}
65
66# Запрос настройки прокси
67ask_proxy() {
68 echo -e "\n${ANSI_YELLOW}Использовать прокси-сервер apt-cacher-ng? (y/n):${ANSI_RESET}"
69 read -p "Use proxy? " USE_PROXY
70 if [[ "$USE_PROXY" =~ ^[Yy]$ ]]; then
71 echo -e "${ANSI_YELLOW}Введите URL прокси-сервера (например: http://192.168.111.87:3142):${ANSI_RESET}"
72 read -e -p "Proxy URL: " -i "http://192.168.111.87:3142" PROXY_URL
73 if [ -n "$PROXY_URL" ]; then
74 configure_proxy "$PROXY_URL"
75 fi
76 fi
77}
78
79# Настройка прокси для apt
80configure_proxy() {
81 local proxy_url=$1
82 echo -e "${ANSI_GREEN}Настройка прокси для apt...${ANSI_RESET}"
83 cat > /etc/apt/apt.conf.d/02aptproxy << EOF
84Acquire::http::proxy "$proxy_url";
85Acquire::ftp::proxy "$proxy_url";
86EOF
87 echo -e "${ANSI_GREEN}Прокси настроен в /etc/apt/apt.conf.d/02aptproxy${ANSI_RESET}"
88}
89
90# Установка имени хоста
91set_hostname() {
92 local hostname=$1
93 echo -e "\n${ANSI_GREEN}=== Установка имени хоста: $hostname ===${ANSI_RESET}"
94 hostnamectl set-hostname "$hostname"
95 if grep -q "^127.0.1.1" /etc/hosts; then
96 sed -i "s/^127.0.1.1.*/127.0.1.1\t$hostname/" /etc/hosts
97 else
98 echo "127.0.1.1\t$hostname" >> /etc/hosts
99 fi
100 echo -e "${ANSI_GREEN}Имя хоста установлено.${ANSI_RESET}"
101}
102
103# Добавление репозитория MEPHI
104add_mephi_repository() {
105 . /etc/os-release 2>/dev/null || { echo "Failed to determine release"; exit 1; }
106 [ -z "$VERSION_CODENAME" ] && echo "VERSION_CODENAME not found" && exit 1
107
108 local conf_file="/etc/apt/sources.list.d/debian_mephi.list"
109
110 if grep -qs "mirror.mephi.ru.*$VERSION_CODENAME" "$conf_file" 2>/dev/null; then
111 echo -e "Repository for $VERSION_CODENAME already exists in $conf_file"
112 else
113 echo -e "Adding repository for Debian $VERSION_CODENAME"
114 cat >> "$conf_file" << EOF
115
116# Added $(date '+%Y-%m-%d')
117deb http://mirror.mephi.ru/debian/ $VERSION_CODENAME main non-free-firmware
118deb-src http://mirror.mephi.ru/debian/ $VERSION_CODENAME main non-free-firmware
119
120deb http://mirror.mephi.ru/debian/ $VERSION_CODENAME-updates main non-free-firmware
121deb-src http://mirror.mephi.ru/debian/ $VERSION_CODENAME-updates main non-free-firmware
122
123EOF
124 echo "Repository added, updating package list..."
125 apt update
126 fi
127}
128
129# Обновление системы
130update_system() {
131 echo -e "${ANSI_GREEN}=== Обновление системы ===${ANSI_RESET}"
132 apt update
133 apt -y upgrade
134}
135
136# Установка пакетов
137install_packages() {
138 local packages=(
139 pv nano curl wget sudo lsb-release iptables
140 unzip pigz zstd
141 ncdu gdu
142 screen tmux lynx
143 htop btop iftop mtr ioping
144 git jq yq pwgen
145 bind9-dnsutils net-tools ssh-audit
146 cloud-guest-utils qemu-guest-agent
147 console-setup
148 )
149
150 echo -e "${ANSI_GREEN}Installing packages...${ANSI_RESET}"
151 apt-get update
152 apt-get install -y "${packages[@]}"
153}
154
155# Настройка SSH
156configure_ssh() {
157 echo -e "${ANSI_GREEN}Allowing SSH root login${ANSI_RESET}"
158 sed -i 's/^.*PermitRootLogin.*$/PermitRootLogin yes/' /etc/ssh/sshd_config
159 systemctl restart sshd
160 echo -e "${ANSI_GREEN}Ok.${ANSI_RESET}"
161}
162
163# Настройка таймзоны и локали
164configure_locale() {
165 echo "tzdata tzdata/Areas select Europe" | debconf-set-selections
166 echo "tzdata tzdata/Zones/Europe select Moscow" | debconf-set-selections
167 DEBIAN_FRONTEND=noninteractive dpkg-reconfigure tzdata
168
169 cat > /etc/locale.gen << EOF
170ru_RU.UTF-8 UTF-8
171en_US.UTF-8 UTF-8
172EOF
173
174 locale-gen
175 update-locale LANG=en_US.UTF-8
176 locale -a | grep -E "en_US|ru_RU"
177 source /etc/default/locale
178
179 dpkg-reconfigure console-setup
180 dpkg-reconfigure keyboard-configuration
181}
182
183# Настройка journald
184configure_journald() {
185 mkdir -p /etc/systemd/journald.conf.d
186 cat > /etc/systemd/journald.conf.d/size.conf << EOF
187[Journal]
188SystemMaxUse=1G
189SystemMaxFileSize=50M
190MaxLevelStore=warning
191EOF
192
193 systemctl restart systemd-journald
194}
195
196# Создание пользователя
197create_user() {
198 local username=$1
199 local password=$2
200
201 useradd -m "$username" && echo "$username:$password" | chpasswd && passwd -e "$username"
202 usermod -aG sudo "$username"
203
204 touch "/home/$username/.Xauthority"
205 chown "$username:$username" "/home/$username/.Xauthority"
206
207 echo -e "${ANSI_GREEN}Пользователь $username с паролем '${ANSI_YELLOW}$password${ANSI_GREEN}' создан${ANSI_RESET}"
208}
209
210# Настройка истории для пользователя
211configure_user_history() {
212 local username=$1
213 cat >> "/home/$username/.bashrc" << 'EOF'
214export HISTSIZE=10000
215export HISTFILESIZE=50000
216export HISTTIMEFORMAT="%F %T "
217export HISTCONTROL=ignoredups:ignorespace
218shopt -s histappend
219export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
220export TERM=xterm-256color
221EOF
222 chown "$username:$username" "/home/$username/.bashrc"
223}
224
225# Настройка истории для root
226configure_root_history() {
227 cat >> /root/.bashrc << 'EOF'
228export HISTSIZE=10000
229export HISTFILESIZE=50000
230export HISTTIMEFORMAT="%F %T "
231export HISTCONTROL=ignoredups:ignorespace
232shopt -s histappend
233export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
234export TERM=xterm-256color
235EOF
236 source /root/.bashrc
237}
238
239# Очистка документации git
240clean_git_docs() {
241 rm -rf /usr/share/doc/git/RelNotes
242}
243
244# Финальное сообщение
245finish_setup() {
246 echo -e "${ANSI_GREEN}=== Настройка завершена ===${ANSI_RESET}"
247}
248
249# Запись конфигурационного файла
250write_config_file() {
251 local file_path=$1
252 local create_backup=${2:-true} # создать резервную копию? (по умолчанию true)
253
254 echo -e "${ANSI_GREEN}=== Запись конфигурации в $file_path ===${ANSI_RESET}"
255
256 # Создание резервной копии
257 if [ "$create_backup" = true ] && [ -f "$file_path" ]; then
258 local backup_path="${file_path}.backup.$(date +%Y%m%d_%H%M%S)"
259 cp "$file_path" "$backup_path"
260 echo -e "${ANSI_YELLOW}Создана резервная копия: $backup_path${ANSI_RESET}"
261 fi
262
263 # Создание директории, если её нет
264 local dir_path=$(dirname "$file_path")
265 if [ ! -d "$dir_path" ]; then
266 mkdir -p "$dir_path"
267 echo -e "${ANSI_YELLOW}Создана директория: $dir_path${ANSI_RESET}"
268 fi
269
270 # Чтение содержимого из heredoc
271 cat > "$file_path"
272
273 # Установка правильных прав (опционально)
274 chmod 644 "$file_path"
275
276 echo -e "${ANSI_GREEN}Файл успешно записан: $file_path${ANSI_RESET}"
277}
278
279make_motd_generator() {
280 write_config_file "/etc/update-motd.d/99-mymotd-generator" false << 'EOF'
281 #!/bin/bash
282
283 # Text Color Variables http://misc.flogisoft.com/bash/tip_colors_and_formatting
284 tcLtG="\033[00;37m" # LIGHT GRAY
285 tcDkG="\033[01;30m" # DARK GRAY
286 tcLtR="\033[01;31m" # LIGHT RED
287 tcLtGRN="\033[01;32m" # LIGHT GREEN
288 tcLtBL="\033[01;34m" # LIGHT BLUE
289 tcLtP="\033[01;35m" # LIGHT PURPLE
290 tcLtC="\033[01;36m" # LIGHT CYAN
291 tcW="\033[01;37m" # WHITE
292 tcRESET="\033[0m"
293 tcORANGE="\033[38;5;209m"
294
295 # Time of day
296 HOUR=$(date +"%H")
297 if [ $HOUR -lt 12 -a $HOUR -ge 0 ]; then TIME="morning"
298 elif [ $HOUR -lt 17 -a $HOUR -ge 12 ]; then TIME="afternoon"
299 else TIME="evening"
300 fi
301
302 # System uptime
303 uptime=`cat /proc/uptime | cut -f1 -d.`
304 upDays=$((uptime/60/60/24))
305 upHours=$((uptime/60/60%24))
306 upMins=$((uptime/60%60))
307
308 # System + Memory
309 MEMORY_USED=`free -b | grep Mem | awk '{print $3/$2 * 100.0}'`
310 SWAP_USED=`free -b | grep Swap | awk '{print $3/$2 * 100.0}'`
311 NUM_PROCS=`ps aux | wc -l`
312
313 # IP первого сетевого интерфейса
314 LOCAL_IP=$(ip -4 addr show | grep -oP '(?<=inet\s)\d+\.\d+\.\d+\.\d+' | grep -v '^127\.' | head -n 1)
315
316 # Имя сервера
317 HOSTNAME=$(hostname)
318
319 # ОS
320 OS=$(grep PRETTY_NAME /etc/os-release | cut -d= -f2 | tr -d '"')
321
322 # Пользователь
323 USER_NAME=$(whoami)
324 [ "$USER_NAME" = "root" ] && USER_NAME="${tcLtR}${USER_NAME}${tcRESET}"
325
326 # Load average
327 LOADAVG=$(awk '{print $1" "$2" "$3}' /proc/loadavg)
328 SYS_LOADS=`cat /proc/loadavg | awk '{print $1}'`
329
330 # RAM: всего и свободно (в мегабайтах)
331 RAM_TOTAL=$(free -m | awk '/Mem:/ {print $2}')
332 RAM_FREE=$(free -m | awk '/Mem:/ {print $7}')
333 RAM_FREE_PCT=$(( RAM_FREE * 100 / RAM_TOTAL ))
334
335 # Количество CPU
336 CPU_COUNT=$(nproc)
337
338 # Uptime
339 UPTIME=$(uptime -p)
340
341 # HDD: для корневого раздела /
342 DISK_TOTAL_HUMAN=$(df -h / | awk 'NR==2 {print $2}')
343 DISK_FREE_HUMAN=$(df -h / | awk 'NR==2 {print $4}')
344
345 # Используем df без форматирования для процентов
346 DISK_TOTAL=$(df -k / | awk 'NR==2 {print $2}')
347 DISK_FREE=$(df -k / | awk 'NR==2 {print $4}')
348 DISK_FREE_PCT=$(( DISK_FREE * 100 / DISK_TOTAL ))
349
350 echo -e "$tcDkG ==============================================================="
351 echo -e $tcLtG " Good $TIME! $tcORANGE $LOCAL_IP"
352 echo -e $tcDkG "==============================================================="
353 echo -e $tcLtG " - Hostname :$tcW ${HOSTNAME}"
354 echo -e $tcLtG " - IP Address :$tcW ${LOCAL_IP:-N/A}"
355 echo -e $tcLtG " - User :$tcW ${USER_NAME}"
356 echo -e $tcLtG "==============================================================="
357 echo -e $tcLtG " - OS Release :$tcW ${OS}"
358 echo -e $tcLtG " - Kernel : `uname -a | awk '{print $1" "$3" "$12}'`"
359 echo -e $tcLtG " - Users : Currently `users | wc -w` user(s) logged on"
360 echo -e $tcLtG "==============================================================="
361 echo -e $tcLtG " - Server Time : `date`"
362 echo -e $tcLtG " - System load : ${SYS_LOADS} / ${NUM_PROCS} processes running"
363 echo -e $tcLtG " - Load average : ${LOADAVG}"
364 echo -e $tcLtG " - System uptime : ${upDays} days ${upHours} hours ${upMins} minutes"
365 echo -e $tcLtG "==============================================================="
366 echo -e $tcLtG " - CPU : ${CPU_COUNT} CPU"
367 echo -e $tcLtG " - RAM : ${RAM_TOTAL} MB, ${RAM_FREE} MB (${RAM_FREE_PCT}%) free"
368 echo -e $tcLtG " - HDD : ${DISK_TOTAL_HUMAN}, ${DISK_FREE_HUMAN} (${DISK_FREE_PCT}%) free"
369 echo -e $tcLtG " - Swap used % : ${SWAP_USED}"
370 echo -e $tcDkG "==============================================================="
371 echo -e $tcRESET ""
372EOF
373
374 write_config_file "/etc/issue" false << 'EOF'
375 Debian GNU/Linux 12 \n \l
376
377 Local IP: не доступен
378EOF
379}
380
381install_midnight_commanger() {
382 apt-get -y install mc
383
384 write_config_file "/root/.config/mc/ini" false << 'EOF'
385[Midnight-Commander]
386verbose=true
387shell_patterns=true
388auto_save_setup=true
389preallocate_space=false
390auto_menu=false
391use_internal_view=true
392use_internal_edit=false
393clear_before_exec=true
394confirm_delete=true
395confirm_overwrite=true
396confirm_execute=false
397confirm_history_cleanup=true
398confirm_exit=false
399confirm_directory_hotlist_delete=false
400confirm_view_dir=false
401safe_delete=false
402safe_overwrite=false
403use_8th_bit_as_meta=false
404mouse_move_pages_viewer=true
405mouse_close_dialog=false
406fast_refresh=false
407drop_menus=false
408wrap_mode=true
409old_esc_mode=true
410cd_symlinks=true
411show_all_if_ambiguous=false
412use_file_to_guess_type=true
413alternate_plus_minus=false
414only_leading_plus_minus=true
415show_output_starts_shell=false
416xtree_mode=false
417file_op_compute_totals=true
418classic_progressbar=true
419use_netrc=true
420ftpfs_always_use_proxy=false
421ftpfs_use_passive_connections=true
422ftpfs_use_passive_connections_over_proxy=false
423ftpfs_use_unix_list_options=true
424ftpfs_first_cd_then_ls=true
425ignore_ftp_chattr_errors=true
426editor_fill_tabs_with_spaces=false
427editor_return_does_auto_indent=false
428editor_backspace_through_tabs=false
429editor_fake_half_tabs=true
430editor_option_save_position=true
431editor_option_auto_para_formatting=false
432editor_option_typewriter_wrap=false
433editor_edit_confirm_save=true
434editor_syntax_highlighting=true
435editor_persistent_selections=true
436editor_drop_selection_on_copy=true
437editor_cursor_beyond_eol=false
438editor_cursor_after_inserted_block=false
439editor_visible_tabs=true
440editor_visible_spaces=true
441editor_line_state=false
442editor_simple_statusbar=false
443editor_check_new_line=false
444editor_show_right_margin=false
445editor_group_undo=true
446editor_state_full_filename=true
447editor_ask_filename_before_edit=false
448nice_rotating_dash=true
449shadows=true
450mcview_remember_file_position=false
451auto_fill_mkdir_name=true
452copymove_persistent_attr=true
453pause_after_run=1
454mouse_repeat_rate=100
455double_click_speed=250
456old_esc_mode_timeout=1000000
457max_dirt_limit=10
458num_history_items_recorded=60
459vfs_timeout=60
460ftpfs_directory_timeout=900
461ftpfs_retry_seconds=30
462fish_directory_timeout=900
463editor_tab_spacing=8
464editor_word_wrap_line_length=72
465editor_option_save_mode=0
466editor_backup_extension=~
467editor_filesize_threshold=64M
468editor_stop_format_chars=-+*\\,.;:&>
469mcview_eof=
470skin=modarcon16
471
472filepos_max_saved_entries=1024
473
474[Layout]
475output_lines=0
476left_panel_size=86
477top_panel_size=0
478message_visible=false
479keybar_visible=true
480xterm_title=true
481command_prompt=true
482menubar_visible=true
483free_space=true
484horizontal_split=false
485vertical_equal=true
486horizontal_equal=true
487
488[Misc]
489timeformat_recent=%b %e %H:%M
490timeformat_old=%b %e %Y
491ftp_proxy_host=gate
492ftpfs_password=anonymous@
493display_codepage=UTF-8
494source_codepage=Other_8_bit
495autodetect_codeset=
496spell_language=en
497clipboard_store=
498clipboard_paste=
499
500[Colors]
501base_color=
502linux=
503color_terminals=
504
505xterm-256color=
506
507[Panels]
508show_mini_info=true
509kilobyte_si=false
510mix_all_files=false
511show_backups=true
512show_dot_files=true
513fast_reload=false
514fast_reload_msg_shown=false
515mark_moves_down=true
516reverse_files_only=true
517auto_save_setup_panels=false
518navigate_with_arrows=false
519panel_scroll_pages=true
520panel_scroll_center=false
521mouse_move_pages=true
522filetype_mode=true
523permission_mode=false
524torben_fj_mode=false
525quick_search_mode=2
526select_flags=6
527
528[Panelize]
529Find *.orig after patching=find . -name \\*.orig -print
530Find SUID and SGID programs=find . \\( \\( -perm -04000 -a -perm /011 \\) -o \\( -perm -02000 -a -perm /01 \\) \\) -print
531Find rejects after patching=find . -name \\*.rej -print
532Modified git files=git ls-files --modified
533
534EOF
535
536 write_config_file "/root/.config/mc/panels.ini" false << 'EOF'
537[New Left Panel]
538display=listing
539reverse=false
540case_sensitive=true
541exec_first=false
542sort_order=name
543list_mode=full
544brief_cols=2
545user_format=half type name | size | owner
546user_status0=half type name | size | perm
547user_status1=half type name | size | perm
548user_status2=half type name | size | perm
549user_status3=half type name | size | perm
550user_mini_status=false
551filter_flags=7
552list_format=user
553
554[New Right Panel]
555display=listing
556reverse=false
557case_sensitive=true
558exec_first=false
559sort_order=name
560list_mode=full
561brief_cols=2
562user_format=half type name | size | owner
563user_status0=half type name | size | perm
564user_status1=half type name | size | perm
565user_status2=half type name | size | perm
566user_status3=half type name | size | perm
567user_mini_status=false
568filter_flags=7
569list_format=user
570
571[Dirs]
572current_is_left=false
573other_dir=/root
574EOF
575}
576
577# Обновление GPG ключей Debian
578fix_debian_keys() {
579 echo -e "${ANSI_GREEN}=== Исправление GPG-ключей Debian ===${ANSI_RESET}"
580
581 # 1. Полностью удаляем кэш списков пакетов
582 rm -rf /var/lib/apt/lists/*
583
584 # 2. Удаляем старые проблемные ключи из trusted.gpg.d и связки apt-key
585 rm -f /etc/apt/trusted.gpg.d/*54404762BBB6E853* \
586 /etc/apt/trusted.gpg.d/*6ED0E7B82643E131* 2>/dev/null || true
587 apt-key del 54404762BBB6E853 2>/dev/null || true
588 apt-key del 6ED0E7B82643E131 2>/dev/null || true
589
590 # 3. Очищаем кэш apt
591 apt-get clean
592
593 # 4. Принудительно переустанавливаем пакет с ключами (без проверки подписи)
594 apt-get install --reinstall -y --allow-unauthenticated debian-archive-keyring
595
596 # 5. Если прокси-сервер используется, настраиваем переменные окружения для gpg
597 if [ -n "$PROXY_URL" ]; then
598 export http_proxy="$PROXY_URL"
599 export https_proxy="$PROXY_URL"
600 fi
601
602 # 6. Пытаемся получить ключи напрямую с keyserver (альтернативный источник)
603 echo "Получение свежих ключей с keyserver..."
604 gpg --keyserver keyserver.ubuntu.com --recv-keys 54404762BBB6E853 6ED0E7B82643E131 2>/dev/null || \
605 gpg --keyserver pgp.mit.edu --recv-keys 54404762BBB6E853 6ED0E7B82643E131 2>/dev/null || \
606 gpg --keyserver keys.openpgp.org --recv-keys 54404762BBB6E853 6ED0E7B82643E131 2>/dev/null || true
607
608 # 7. Экспортируем ключи в директорию apt (если были получены)
609 gpg --export 54404762BBB6E853 > /etc/apt/trusted.gpg.d/debian-security-automatic.gpg 2>/dev/null || true
610 gpg --export 6ED0E7B82643E131 > /etc/apt/trusted.gpg.d/debian-archive-automatic.gpg 2>/dev/null || true
611
612 # 8. Снова очищаем списки и обновляем
613 rm -rf /var/lib/apt/lists/*
614 apt-get update --allow-insecure-repositories || true
615
616 echo -e "${ANSI_GREEN}Ключи обновлены.${ANSI_RESET}"
617}
618
619# ==================== ОСНОВНАЯ ЛОГИКА ====================
620
621main() {
622 # check_root
623
624 echo -e "${ANSI_GREEN}=== Настройка системы ===${ANSI_RESET}"
625
626 NEW_HOSTNAME=$(ask_hostname)
627
628 ask_create_user
629
630 echo $CREATE_USER
631
632 if [ "$CREATE_USER" = "yes" ]; then
633 NEW_USER=$(ask_username)
634 USER_PASS=$(ask_password "$NEW_USER")
635 create_user "$NEW_USER" "$USER_PASS"
636 configure_user_history "$NEW_USER"
637 fi
638
639 ask_proxy
640 fix_debian_keys
641
642 # Выполнение настроек
643 configure_root_history
644
645 set_hostname "$NEW_HOSTNAME"
646 add_mephi_repository
647 update_system
648 install_packages
649 configure_ssh
650 configure_locale
651 configure_journald
652 clean_git_docs
653
654 make_motd_generator
655
656 install_midnight_commanger
657
658 finish_setup
659}
660
661# Запуск главной функции
662main "$@"