This commit is contained in:
zj
2025-12-14 16:38:21 +08:00
parent f492f6a281
commit 3dbf90ca52
3 changed files with 102 additions and 88 deletions

View File

@@ -39,73 +39,34 @@ post_install() {
local install_type="$1"
local timeout=60 # 等待 MySQL 启动的超时时间
# 由于数据库初始化和导入已在 PKGBUILD 的 package() 函数中完成,
# post_install 钩子现在只负责在目标系统上启动和启用服务。
echo "Reloading systemd daemon..."
systemctl daemon-reload
# 仅在首次安装时初始化数据库、设置密码和导入数据
if [ ! -d "${mysql_data_dir}/mysql" ]; then
echo "Performing initial MySQL database setup..."
cd "${mysql_install_dir}" || { echo "Error: MySQL install directory not found."; exit 1; }
# 确保数据目录的权限正确,即使在 PKGBUILD 中已设置 root:root
# 这里再次设置确保在目标系统上是 mysql 用户拥有
echo "Setting ownership for MySQL data directory '${mysql_data_dir}' to ${mysql_user}:${mysql_group}..."
chown -R "${mysql_user}":"${mysql_group}" "${mysql_data_dir}"
echo "Initializing MySQL database in '${mysql_data_dir}'..."
"${mysql_install_dir}/scripts/mysql_install_db" --datadir="${mysql_data_dir}" --user="${mysql_user}"
chown -R "${mysql_user}":"${mysql_group}" "${mysql_data_dir}"
echo "Enabling MySQL service..."
systemctl enable "${mysql_service}"
# 1. 启动 MySQL 服务 (保持 --skip-name-resolve 启用)
echo "Starting MySQL service..."
systemctl start "${mysql_service}"
echo "Starting MySQL service..."
systemctl start "${mysql_service}"
# 2. 等待 MySQL 服务启动并可用
echo "Waiting for MySQL server to start (up to ${timeout} seconds)..."
for i in $(seq 1 "${timeout}"); do
"${mysql_install_dir}/bin/mysqladmin" ping -h 127.0.0.1 -P 3306 &>/dev/null && break
sleep 1
done
echo "Waiting for MySQL server to start (up to ${timeout} seconds)..."
for i in $(seq 1 "${timeout}"); do
"${mysql_install_dir}/bin/mysqladmin" ping -h 127.0.0.1 -P 3306 &>/dev/null && break
sleep 1
done
if ! "${mysql_install_dir}/bin/mysqladmin" ping -h 127.0.0.1 -P 3306 &>/dev/null; then
echo "Error: MySQL server did not start in time for initial setup." >&2
exit 1
fi
if ! "${mysql_install_dir}/bin/mysqladmin" ping -h 127.0.0.1 -P 3306 &>/dev/null; then
echo "Warning: MySQL server did not start in time. Please check system logs for '${mysql_service}'." >&2
# 不再强制退出,因为数据库已预初始化,服务启动失败可能是其他配置问题
else
echo "MySQL server is running."
# 3. 设置 root@localhost 的初始密码
# 这是 mysql_install_db 后最可靠的设置初始 root 密码的方式
echo "Setting initial root password for 'root@localhost' using mysqladmin..."
"${mysql_install_dir}/bin/mysqladmin" -uroot password "${mysql_root_password}"
echo "Initial root@localhost password set."
# 4. 更新所有 root 条目的密码 (包括 127.0.0.1, ::1, gg-3b8l1hmcqanykaan)
# 此时 --skip-name-resolve 保持启用,但我们更新的是 mysql.user 表中的条目。
# 连接时使用 'localhost',它通常可以通过 Unix socket 或特殊处理连接。
echo "Updating password for all root user entries (localhost, 127.0.0.1, ::1, gg-3b8l1hmcqanykaan)..."
"${mysql_install_dir}/bin/mysql" -uroot -p"${mysql_root_password}" -e "
UPDATE mysql.user SET Password = PASSWORD('${mysql_root_password}') WHERE User = 'root' AND Host IN ('localhost', '127.0.0.1', '::1', 'gg-3b8l1hmcqanykaan');
FLUSH PRIVILEGES;
"
echo "All relevant root user passwords updated."
# 5. 删除匿名用户和 test 数据库,进一步安全加固
echo "Securing MySQL installation (dropping anonymous users and test database)..."
"${mysql_install_dir}/bin/mysql" -uroot -p"${mysql_root_password}" -e "
DELETE FROM mysql.user WHERE User='';
DROP DATABASE IF EXISTS test;
FLUSH PRIVILEGES;
"
echo "Anonymous users and test database removed."
# 6. 导入初始数据库
echo "Importing initial database schema from '${mysql_sql_file}'..."
if [ -f "${mysql_sql_file}" ]; then
"${mysql_install_dir}/bin/mysql" -uroot -p"${mysql_root_password}" < "${mysql_sql_file}"
echo "Database initialization and import complete."
else
echo "Error: ${mysql_sql_file} not found. Database import failed." >&2
exit 1
fi
else # 数据目录已存在,说明不是首次安装,可能是升级或者之前安装过
echo "MySQL data directory already exists. Skipping database initialization."
fi
echo "SmartTMS MySQL installation/upgrade complete."