-
Notifications
You must be signed in to change notification settings - Fork 37
/
debian-homenas.sh
242 lines (222 loc) · 7.26 KB
/
debian-homenas.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
#!/bin/bash
# 常量定义
DEBIAN_HOMENAS_DIR="debian-homenas"
URL_PREFIX="https://raw.githubusercontent.com/kekylin/Debian-HomeNAS/main/Shell/"
COLOR_RED="31"
COLOR_GREEN="32"
COLOR_BLUE="34"
# 脚本文件列表
SCRIPT_URLS=(
"system_init.sh" # 0 系统初始配置
"install_cockpit.sh" # 1 安装面板Cockpit
"install_virtualization.sh" # 2 安装虚拟机组件
"setup_cockpit_access.sh" # 3 外网访问Cockpit
"remove_cockpit_access.sh" # 4 删除外网访问配置
"email_config.sh" # 5 设置发送邮件账户
"login_notify.sh" # 6 用户登录发送通知
"cancel_login_notify.sh" # 7 取消用户登录通知
"system_security.sh" # 8 配置基础安全防护
"install_firewalld.sh" # 9 安装防火墙服务
"install_fail2ban.sh" # 10 安装自动封锁服务
"install_docker.sh" # 11 安装Docker
"dockerhub_mirror.sh" # 12 添加镜像地址
"deploy-containers.sh" # 13 安装容器应用
"docker_backup_restore.sh" # 14 备份与恢复
"service_checker.sh" # 15 安装服务查询
)
# 创建目录
[[ ! -d "$DEBIAN_HOMENAS_DIR" ]] && mkdir -p "$DEBIAN_HOMENAS_DIR"
# 函数:打印带颜色的输出
color_print() {
local color="$1"
shift
echo -e "\033[${color}m$*\033[0m"
}
# 函数:下载并执行脚本
execute_script() {
local index="$1"
local alias="$2"
wget -q --show-progress -O "${DEBIAN_HOMENAS_DIR}/${SCRIPT_URLS[$index]}" "${URL_PREFIX}${SCRIPT_URLS[$index]}" || {
color_print $COLOR_RED "下载 ${SCRIPT_URLS[$index]} 失败,请检查网络连接或稍后再试。"
return 1
}
color_print $COLOR_BLUE "=================================================="
color_print $COLOR_BLUE "正在执行 ${alias}..."
color_print $COLOR_BLUE "=================================================="
if bash "${DEBIAN_HOMENAS_DIR}/${SCRIPT_URLS[$index]}"; then
color_print $COLOR_GREEN "${alias} 执行完成。"
else
color_print $COLOR_RED "${alias} 执行失败。"
fi
}
# 函数:显示菜单
show_menu() {
color_print $COLOR_BLUE "=================================================="
echo -e "$1"
color_print $COLOR_BLUE "=================================================="
echo -n -e "\033[${COLOR_BLUE}m请输入选择:\033[0m"
}
# 函数:显示欢迎信息
show_welcome() {
color_print $COLOR_BLUE "=================================================="
echo -e " Debian HomeNAS\n\n QQ群:339169752\n作者:kekylin\n项目:https://github.com/kekylin/Debian-HomeNAS"
if [ "$first_run" = true ]; then
color_print $COLOR_GREEN "--------------------------------------------------\n温馨提示!\n1、系统安装后首次运行,建议执行“一键配置HomeNAS”。\n2、安装防火墙后重启一次系统再使用。\n3、菜单选项支持多选,空格分隔(如:1 3 5)。"
fi
}
# 函数:主菜单处理
handle_main_menu() {
first_run=true
if [ "$first_run" = true ]; then
clear
fi
while true; do
show_welcome
show_menu "$main_menu"
read -r -a choices
for choice in "${choices[@]}"; do
case "$choice" in
99)
for index in ${menu_actions["99"]}; do
execute_script "$index" "${menu_lines[$index]}"
done
;;
1|6)
execute_script "${menu_actions[$choice]}" "${menu_lines[${menu_actions[$choice]}]}"
;;
2|3|4|5)
handle_submenu "$choice"
;;
0)
color_print $COLOR_BLUE "退出脚本。"
exit 0
;;
*)
color_print $COLOR_RED "\n无效选择:$choice。请重新输入。\n"
;;
esac
done
first_run=false
done
}
# 函数:子菜单处理
handle_submenu() {
local submenu_choice="$1"
local submenu="submenu_$submenu_choice"
local actions=(${submenu_actions[$submenu]})
local submenu_lines=($(echo "${submenus[$submenu]}" | tail -n +3 | head -n -2 | awk '{print $2}'))
while true; do
show_menu "${submenus[$submenu]}"
read -r -a sub_choices
for sub_choice in "${sub_choices[@]}"; do
case "$sub_choice" in
0)
return
;;
*)
if [[ $sub_choice =~ ^[1-4]$ ]] && [ "$sub_choice" -le "${#actions[@]}" ]; then
execute_script "${actions[$((sub_choice - 1))]}" "${submenu_lines[$((sub_choice - 1))]}"
else
color_print $COLOR_RED "\n无效选择:$sub_choice。请重新输入。\n"
fi
;;
esac
done
done
}
# 主菜单定义
main_menu=$(cat <<-EOF
1、系统初始配置
2、系统管理面板
3、邮件通知服务
4、系统安全防护
5、Docker服务
6、安装服务查询
99、一键配置HomeNAS
0、退出脚本
EOF
)
# 子菜单定义
submenu_2=$(cat <<-EOF
系统管理面板
--------------------------------------------------
1、安装面板Cockpit
2、安装虚拟机组件
3、外网访问Cockpit
4、删除外网访问配置
0、返回
EOF
)
submenu_3=$(cat <<-EOF
邮件通知服务
--------------------------------------------------
1、设置发送邮件账户
2、用户登录发送通知
3、取消用户登录通知
0、返回
EOF
)
submenu_4=$(cat <<-EOF
系统安全防护
--------------------------------------------------
1、配置基础安全防护
2、安装防火墙服务
3、安装自动封锁服务
0、返回
EOF
)
submenu_5=$(cat <<-EOF
Docker服务
--------------------------------------------------
1、安装Docker
2、添加镜像地址
3、安装容器应用
4、备份与恢复
0、返回
EOF
)
# 菜单项及其对应的脚本索引
declare -A menu_actions=(
[99]="0 1 5 6 8 9 10 11 12 13 15" # 一键配置HomeNAS(排除备份与恢复)
[1]="0"
[2]="submenu_2"
[3]="submenu_3"
[4]="submenu_4"
[5]="submenu_5"
[6]="15"
)
# 菜单项及其显示名称
declare -A menu_lines=(
[0]="系统初始配置"
[1]="安装面板Cockpit"
[2]="安装虚拟机组件"
[3]="外网访问Cockpit"
[4]="删除外网访问配置"
[5]="设置发送邮件账户"
[6]="用户登录发送通知"
[7]="取消用户登录通知"
[8]="配置基础安全防护"
[9]="安装防火墙服务"
[10]="安装自动封锁服务"
[11]="安装Docker"
[12]="添加镜像地址"
[13]="安装容器应用"
[14]="备份与恢复"
[15]="安装服务查询"
[99]="一键配置HomeNAS"
)
declare -A submenus=(
[submenu_2]="$submenu_2"
[submenu_3]="$submenu_3"
[submenu_4]="$submenu_4"
[submenu_5]="$submenu_5"
)
# 子菜单对应的脚本索引
declare -A submenu_actions=(
[submenu_2]="1 2 3 4"
[submenu_3]="5 6 7"
[submenu_4]="8 9 10"
[submenu_5]="11 12 13 14"
)
# 启动脚本并显示欢迎信息和温馨提示信息
handle_main_menu