fix(installer): 增加外部数据库输入校验和配置确认

This commit is contained in:
xuwei-fit2cloud
2026-09-29 16:27:25 +08:00
parent ca9c0f4f5c
commit 8fc1a85f90

View File

@@ -72,16 +72,72 @@ function db_defaults() {
esac
}
# 询问外部数据库连接信息
# 读取失败时立即停止,不能把 EOF 当成接受默认值后继续安装。
function read_db_input() {
if ! IFS= read -r "$@"; then
printf '\n[错误] 数据库配置输入已中断,安装停止。\n' >&2
exit 1
fi
}
# 询问外部数据库连接信息,确认后才更新安装配置。
function prompt_db_connection() {
local answer
read -r -p "请输入数据库地址 [localhost]: " answer; DE_DB_HOST="${answer:-localhost}"
read -r -p "请输入数据库端口 [${DB_DEFAULT_PORT}]: " answer; DE_DB_PORT="${answer:-$DB_DEFAULT_PORT}"
read -r -p "请输入数据库用户名 [root]: " answer; DE_DB_USER="${answer:-root}"
read -r -s -p "请输入数据库密码: " answer; echo; DE_DB_PASSWORD="$answer"
read -r -p "请输入数据库名 [dataease]: " answer; DE_DB_DATABASE="${answer:-dataease}"
read -r -p "请输入数据库 schema(MySQL/GreatSQL 可留空): " answer; DE_DB_SCHEMA="$answer"
read -r -p "请输入 JDBC 连接参数 [${DB_DEFAULT_PARAMS}]: " answer; DE_DB_PARAMS="${answer:-$DB_DEFAULT_PARAMS}"
local answer host port username password database schema params
while true; do
printf '请逐项输入,每次回车确认一项,避免一次粘贴多行连接信息。\n'
read_db_input -p "请输入数据库地址 [localhost]: " answer
host="${answer:-localhost}"
while true; do
read_db_input -p "请输入数据库端口 [${DB_DEFAULT_PORT}]: " answer
port="${answer:-$DB_DEFAULT_PORT}"
if [[ "$port" =~ ^[0-9]{1,5}$ ]] && (( 10#$port >= 1 && 10#$port <= 65535 )); then
port=$((10#$port))
break
fi
printf '端口必须是 1-65535 范围内的整数,请重新输入。\n'
done
read_db_input -p "请输入数据库用户名 [root]: " answer
username="${answer:-root}"
read_db_input -s -p "请输入数据库密码: " password
printf '\n'
read_db_input -p "请输入数据库名 [dataease]: " answer
database="${answer:-dataease}"
read_db_input -p "请输入数据库 schema(MySQL/GreatSQL 可留空): " schema
read_db_input -p "请输入 JDBC 连接参数 [${DB_DEFAULT_PARAMS}]: " answer
params="${answer:-$DB_DEFAULT_PARAMS}"
printf '\n请核对外部数据库配置:\n'
printf ' 类型:%s\n 地址:%s\n 端口:%s\n 用户名:%s\n 数据库名:%s\n schema:%s\n' \
"$DE_DB_TYPE" "$host" "$port" "$username" "$database" "${schema:-(空)}"
if [[ -n "$password" ]]; then
printf ' 密码:已设置\n'
else
printf ' 密码:未设置(空密码)\n'
fi
# 自定义 JDBC 参数可能包含凭据,不在确认信息或日志中回显。
if [[ "$params" == "$DB_DEFAULT_PARAMS" ]]; then
printf ' JDBC 参数:使用默认值\n'
else
printf ' JDBC 参数:已设置自定义值\n'
fi
while true; do
read_db_input -p "确认使用以上配置?[y/N](回车重新输入): " answer
case "$answer" in
[yY]|[yY][eE][sS])
DE_DB_HOST="$host"
DE_DB_PORT="$port"
DE_DB_USER="$username"
DE_DB_PASSWORD="$password"
DE_DB_DATABASE="$database"
DE_DB_SCHEMA="$schema"
DE_DB_PARAMS="$params"
return
;;
''|[nN]|[nN][oO]) break ;;
*) printf '请输入 y 确认,或输入 n 重新填写。\n' ;;
esac
done
done
}
# 询问运行数据库类型(仅全新安装)
@@ -101,7 +157,7 @@ function prompt_database_config() {
echo -e " 6) SQLServer"
echo -e " 7) GreatSQL"
local answer
read -r -p "请输入序号 [1-7],默认 1 (MySQL): " answer
read_db_input -p "请输入序号 [1-7],默认 1 (MySQL): " answer
case "${answer:-1}" in
2) DE_DB_TYPE=pg ;;
3) DE_DB_TYPE=oracle ;;
@@ -113,7 +169,7 @@ function prompt_database_config() {
esac
if [[ "$DE_DB_TYPE" == "mysql" ]]; then
read -r -p "是否使用 DataEase 内置 MySQL?[Y/n](默认内置): " answer
read_db_input -p "是否使用 DataEase 内置 MySQL?[Y/n](默认内置): " answer
case "${answer:-Y}" in
[nN]|[nN][oO]) DE_EXTERNAL_DB=true ;;
*) DE_EXTERNAL_DB=false ;;