@@ -18,6 +18,7 @@ HTTP_PORT="${HTTP_PORT:-8080}"
1818MQTT_PORT=" ${MQTT_PORT:- 1883} "
1919MIN_DOCKER_VERSION=" 20.10"
2020MIN_COMPOSE_VERSION=" 2.0"
21+ SUDO_CMD=" "
2122
2223# ── 颜色输出 ──────────────────────────────────────────────────────────────────
2324RED=' \033[0;31m' ; YELLOW=' \033[1;33m' ; GREEN=' \033[0;32m'
@@ -36,6 +37,74 @@ version_gte() {
3637 printf ' %s\n%s\n' " $2 " " $1 " | sort -V -C
3738}
3839
40+ run_privileged () {
41+ if [ -n " $SUDO_CMD " ]; then
42+ " $SUDO_CMD " " $@ "
43+ else
44+ " $@ "
45+ fi
46+ }
47+
48+ ensure_install_dir_access () {
49+ step " 检查安装目录权限"
50+
51+ if [ " $( id -u) " -eq 0 ]; then
52+ success " 当前用户可写入 $INSTALL_DIR "
53+ return
54+ fi
55+
56+ if [ -d " $INSTALL_DIR " ] && [ -w " $INSTALL_DIR " ]; then
57+ success " 当前用户可写入 $INSTALL_DIR "
58+ return
59+ fi
60+
61+ local parent_dir
62+ parent_dir=" $INSTALL_DIR "
63+ while [ ! -d " $parent_dir " ]; do
64+ local next_parent
65+ next_parent=" $( dirname " $parent_dir " ) "
66+ if [ " $next_parent " = " $parent_dir " ]; then
67+ break
68+ fi
69+ parent_dir=" $next_parent "
70+ done
71+
72+ if [ ! -d " $INSTALL_DIR " ] && [ -d " $parent_dir " ] && [ -w " $parent_dir " ]; then
73+ success " 当前用户可创建 $INSTALL_DIR "
74+ return
75+ fi
76+
77+ if ! command_exists sudo; then
78+ error " 当前用户没有权限写入 ${INSTALL_DIR} ,且未找到 sudo。请使用有权限的用户运行,或设置 INSTALL_DIR 到可写目录。"
79+ fi
80+
81+ SUDO_CMD=" sudo"
82+ info " ${INSTALL_DIR} 需要管理员权限,接下来会通过 sudo 创建和写入安装文件。"
83+ run_privileged -v || error " 无法获取 sudo 权限,安装已停止"
84+ success " 已获得安装目录写入权限"
85+ }
86+
87+ download_file () {
88+ local url=" $1 "
89+ local target=" $2 "
90+ local mode=" $3 "
91+ local tmp_file
92+
93+ tmp_file=" $( mktemp " ${TMPDIR:-/ tmp} /thingspanel.XXXXXX" ) "
94+
95+ if command_exists curl; then
96+ curl -fsSL " $url " -o " $tmp_file "
97+ elif command_exists wget; then
98+ wget -qO " $tmp_file " " $url "
99+ else
100+ rm -f " $tmp_file "
101+ error " 未找到 curl 或 wget,无法下载安装文件"
102+ fi
103+
104+ run_privileged install -m " $mode " " $tmp_file " " $target "
105+ rm -f " $tmp_file "
106+ }
107+
39108# ── Banner ────────────────────────────────────────────────────────────────────
40109print_banner () {
41110 echo -e " ${BOLD} "
@@ -142,7 +211,7 @@ resolve_version() {
142211# ── 创建目录结构 ───────────────────────────────────────────────────────────────
143212setup_directories () {
144213 step " 创建目录结构"
145- mkdir -p " $INSTALL_DIR "
214+ run_privileged mkdir -p " $INSTALL_DIR "
146215 success " 目录: $INSTALL_DIR "
147216}
148217
@@ -151,26 +220,15 @@ download_docker_compose() {
151220 step " 下载 docker-compose.yml"
152221 local compose_url=" ${RAW_BASE} /docker-compose.yml"
153222
154- if command_exists curl; then
155- curl -fsSL " $compose_url " -o " ${INSTALL_DIR} /docker-compose.yml"
156- elif command_exists wget; then
157- wget -qO " ${INSTALL_DIR} /docker-compose.yml" " $compose_url "
158- else
159- error " 未找到 curl 或 wget,无法下载配置文件"
160- fi
223+ download_file " $compose_url " " ${INSTALL_DIR} /docker-compose.yml" " 0644"
161224 success " 配置文件已下载到 $INSTALL_DIR "
162225}
163226
164227# ── 下载管理脚本 ────────────────────────────────────────────────────────────────
165228download_management_scripts () {
166229 step " 下载管理脚本"
167230 for script in upgrade.sh uninstall.sh; do
168- if command_exists curl; then
169- curl -fsSL " ${RAW_BASE} /${script} " -o " ${INSTALL_DIR} /${script} "
170- else
171- wget -qO " ${INSTALL_DIR} /${script} " " ${RAW_BASE} /${script} "
172- fi
173- chmod +x " ${INSTALL_DIR} /${script} "
231+ download_file " ${RAW_BASE} /${script} " " ${INSTALL_DIR} /${script} " " 0755"
174232 done
175233 success " 管理脚本已就绪"
176234}
@@ -255,6 +313,7 @@ main() {
255313 check_ports
256314 check_memory
257315 resolve_version
316+ ensure_install_dir_access
258317 setup_directories
259318 download_docker_compose
260319 download_management_scripts
0 commit comments