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