update
This commit is contained in:
111
PKGBUILD
111
PKGBUILD
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
pkgname=smarttms-mysql
|
pkgname=smarttms-mysql
|
||||||
pkgver=5.6.47
|
pkgver=5.6.47
|
||||||
pkgrel=1
|
pkgrel=2
|
||||||
pkgdesc="MySQL 5.6.47 Database Server for SmartTMS Application (pre-compiled binary)"
|
pkgdesc="MySQL 5.6.47 Database Server for SmartTMS Application (pre-compiled binary)"
|
||||||
arch=('x86_64')
|
arch=('x86_64')
|
||||||
url="https://www.mysql.com/"
|
url="https://www.mysql.com/"
|
||||||
@@ -10,33 +10,33 @@ license=('GPLv2')
|
|||||||
# Arch Linux 通常不直接使用 group 字段,但可以作为 pkgdesc 的补充
|
# Arch Linux 通常不直接使用 group 字段,但可以作为 pkgdesc 的补充
|
||||||
# group="Applications/Databases"
|
# group="Applications/Databases"
|
||||||
|
|
||||||
|
# options=('!strip')
|
||||||
|
|
||||||
# Source0 是 MySQL 预编译二进制包
|
# Source0 是 MySQL 预编译二进制包
|
||||||
# Source1 是自定义的 my.cnf 配置文件
|
# Source1 是自定义的 my.cnf 配置文件
|
||||||
# Source2 是 systemd 服务单元文件
|
# Source2 是 systemd 服务单元文件
|
||||||
# Source3 是 SmartTMS 应用程序的初始数据库 SQL 文件
|
# Source3 是 SmartTMS 应用程序的初始数据库 SQL 文件 (保留,可以作为参考或手动导入)
|
||||||
# 注意:这里假设这些文件与 PKGBUILD 在同一目录。
|
# Source4 是预初始化好的 MySQL 数据目录压缩包
|
||||||
# 对于 mysql-5.6.47-linux-glibc2.12-x86_64.tar.gz,建议提供一个可下载的URL或确保本地存在。
|
|
||||||
# 如果你希望从官方下载,可以修改为:
|
|
||||||
# "mysql-5.6.47-linux-glibc2.12-x86_64.tar.gz::https://downloads.mysql.com/archives/get/file/mysql-5.6.47-linux-glibc2.12-x86_64.tar.gz"
|
|
||||||
source=(
|
source=(
|
||||||
"mysql-5.6.47-linux-glibc2.12-x86_64.tar.gz"
|
"mysql-5.6.47-linux-glibc2.12-x86_64.tar.gz"
|
||||||
"my.cnf"
|
"my.cnf"
|
||||||
"mysqld.service"
|
"mysqld.service"
|
||||||
"tms_db_s3.sql"
|
"tms_db_s3.sql"
|
||||||
|
"mysql.zip" # 添加预初始化数据压缩包
|
||||||
)
|
)
|
||||||
|
|
||||||
# 构建依赖
|
# 构建依赖
|
||||||
# systemd 是运行时依赖,tar/gzip 是 pacman 自动处理的
|
# systemd 是运行时依赖,tar/gzip 是 pacman 自动处理的
|
||||||
makedepends=('systemd') # systemd 用于处理服务文件
|
makedepends=('systemd' 'unzip') # 添加 unzip 用于解压 mysql.zip
|
||||||
|
|
||||||
# 运行时依赖
|
# 运行时依赖
|
||||||
# shadow-utils 提供 useradd/groupadd
|
# shadow-utils 提供 useradd/groupadd
|
||||||
# libaio 是 MySQL 常见的运行时依赖
|
# libaio 是 MySQL 常见的运行时依赖
|
||||||
# perl-data-dumper 是 mysql_install_db 脚本的依赖
|
# perl-data-dumper 是 mysql_install_db 脚本的依赖 (如果不再使用 mysql_install_db,此依赖可以移除)
|
||||||
depends=(
|
depends=(
|
||||||
'systemd'
|
'systemd'
|
||||||
'libaio'
|
'libaio'
|
||||||
'perl-data-dumper'
|
'perl-data-dumper' # 保留,以防万一或作为通用依赖
|
||||||
)
|
)
|
||||||
|
|
||||||
# 安装脚本,用于处理用户/组、数据目录、服务启用和数据库初始化
|
# 安装脚本,用于处理用户/组、数据目录、服务启用和数据库初始化
|
||||||
@@ -47,8 +47,8 @@ install="${pkgname}.install"
|
|||||||
sha256sums=('be2fa4fffc74dff626cfa8d62f16d9eef93bcd81bc8133ae500e04460e1fb795'
|
sha256sums=('be2fa4fffc74dff626cfa8d62f16d9eef93bcd81bc8133ae500e04460e1fb795'
|
||||||
'a664d5b110640f877bd994e3218a0ae4531a0493f0a3869eea8973928f06e0cd'
|
'a664d5b110640f877bd994e3218a0ae4531a0493f0a3869eea8973928f06e0cd'
|
||||||
'92cc61a5db1e791e463a030955566c1a6eb308f1cd3ff921f6d7bd1e4cdd48ff'
|
'92cc61a5db1e791e463a030955566c1a6eb308f1cd3ff921f6d7bd1e4cdd48ff'
|
||||||
'b9e6e58cbc4809a2dd3432d36272ba71e0fc63af4a48288b24f30968c830e0c9')
|
'b9e6e58cbc4809a2dd3432d36272ba71e0fc63af4a48288b24f30968c830e0c9'
|
||||||
|
'12db700d9c47df4bba4e9262a1eccfb6fe6eadd6bd320effa205f6c723574436')
|
||||||
|
|
||||||
# 配置备份,如果用户修改了这些文件,升级时会生成 .pacnew 文件
|
# 配置备份,如果用户修改了这些文件,升级时会生成 .pacnew 文件
|
||||||
backup=(
|
backup=(
|
||||||
@@ -58,45 +58,98 @@ backup=(
|
|||||||
)
|
)
|
||||||
|
|
||||||
prepare() {
|
prepare() {
|
||||||
# 解压 MySQL 二进制包
|
# makepkg 自动解压 tar.gz 文件到 $srcdir/mysql-5.6.47-linux-glibc2.12-x86_64/
|
||||||
# tar -xzf "${srcdir}/mysql-5.6.47-linux-glibc2.12-x86_64.tar.gz" -C "${srcdir}"
|
|
||||||
# 假设 tarball 内部顶层目录名为 mysql-5.6.47-linux-glibc2.12-x86_64
|
# 解压 mysql.zip 到 $srcdir 下的一个临时目录
|
||||||
|
local _preinit_data_extract_dir="${srcdir}/mysql_preinit_data_extracted"
|
||||||
|
mkdir -p "$_preinit_data_extract_dir"
|
||||||
|
echo "Extracting mysql.zip to $_preinit_data_extract_dir..."
|
||||||
|
if ! unzip -q "${srcdir}/mysql.zip" -d "$_preinit_data_extract_dir"; then
|
||||||
|
error "Failed to extract mysql.zip. Ensure 'unzip' is installed and the file is valid."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 切换到 MySQL 二进制包的解压目录
|
||||||
cd "${srcdir}/mysql-5.6.47-linux-glibc2.12-x86_64"
|
cd "${srcdir}/mysql-5.6.47-linux-glibc2.12-x86_64"
|
||||||
}
|
}
|
||||||
|
|
||||||
build() {
|
build() {
|
||||||
# 对于预编译二进制包,通常不需要编译步骤。
|
# 对于预编译二进制包,通常不需要编译步骤。
|
||||||
# 如果需要,可以在这里添加编译命令。
|
|
||||||
msg "No build step required for pre-compiled binaries."
|
msg "No build step required for pre-compiled binaries."
|
||||||
}
|
}
|
||||||
|
|
||||||
package() {
|
package() {
|
||||||
# 清理构建根目录 (makepkg 会自动清理 $pkgdir)
|
set -x # 启用调试输出
|
||||||
# rm -rf "${pkgdir}"
|
|
||||||
|
|
||||||
# 创建安装路径
|
local _mysql_install_dir="/usr/local/mysql"
|
||||||
|
local _mysql_data_dir="/data/mysql" # 这是最终安装到系统上的数据目录
|
||||||
|
local _mysql_user="mysql" # 仅作参考,实际用户创建在 .install 脚本中
|
||||||
|
local _mysql_group="mysql" # 仅作参考
|
||||||
|
local _mysql_root_password="PythA90ra5" # 仅作参考,因为数据目录已预设密码
|
||||||
|
local _mysql_sql_file="${srcdir}/tms_db_s3.sql" # SQL 文件在 $srcdir
|
||||||
|
local _mysql_service_name="mysqld.service"
|
||||||
|
|
||||||
|
# 从 tar.gz 解压出来的 MySQL 二进制目录
|
||||||
|
local _mysql_extracted_bin_dir="${srcdir}/mysql-5.6.47-linux-glibc2.12-x86_64"
|
||||||
|
# 最终安装到 pkgdir 中的带版本号的目录名
|
||||||
|
local _mysql_base_dir="/usr/local/${_mysql_extracted_bin_dir##*/}"
|
||||||
|
|
||||||
|
# 1. 创建安装路径
|
||||||
install -d "${pkgdir}/usr/local"
|
install -d "${pkgdir}/usr/local"
|
||||||
install -d "${pkgdir}/etc/systemd/system" # systemd 服务文件通常放在这里
|
install -d "${pkgdir}/etc/systemd/system" # systemd 服务文件通常放在这里
|
||||||
install -d "${pkgdir}/etc/profile.d"
|
install -d "${pkgdir}/etc/profile.d"
|
||||||
install -d "${pkgdir}/usr/share/${pkgname}" # 用于存放 SQL 导入文件
|
install -d "${pkgdir}/usr/share/${pkgname}" # 用于存放 SQL 导入文件 (tms_db_s3.sql)
|
||||||
|
|
||||||
# 复制 MySQL 二进制文件到 /usr/local/
|
# 2. 复制 MySQL 二进制文件到 /usr/local/
|
||||||
# 注意:prepare 已经将内容解压到 "${srcdir}/mysql-5.6.47-linux-glibc2.12-x86_64"
|
echo "Copying MySQL binaries to $pkgdir$_mysql_base_dir..."
|
||||||
cp -a "${srcdir}/mysql-5.6.47-linux-glibc2.12-x86_64/." "${pkgdir}/usr/local/mysql-5.6.47-linux-glibc2.12-x86_64"
|
cp -a "${_mysql_extracted_bin_dir}/." "${pkgdir}$_mysql_base_dir"
|
||||||
|
|
||||||
# 创建 /usr/local/mysql 软链接
|
# 3. 创建 /usr/local/mysql 软链接
|
||||||
ln -s mysql-5.6.47-linux-glibc2.12-x86_64 "${pkgdir}/usr/local/mysql"
|
echo "Creating symlink $pkgdir$_mysql_install_dir..."
|
||||||
|
ln -s "${_mysql_base_dir##*/}" "${pkgdir}$_mysql_install_dir"
|
||||||
|
|
||||||
# 复制配置文件
|
# 4. 复制配置文件
|
||||||
|
echo "Installing my.cnf to $pkgdir/etc/my.cnf..."
|
||||||
install -m644 "${srcdir}/my.cnf" "${pkgdir}/etc/my.cnf"
|
install -m644 "${srcdir}/my.cnf" "${pkgdir}/etc/my.cnf"
|
||||||
|
|
||||||
# 复制 systemd 服务文件
|
# 5. 复制 systemd 服务文件
|
||||||
install -m644 "${srcdir}/mysqld.service" "${pkgdir}/etc/systemd/system/mysqld.service"
|
echo "Installing systemd service file to $pkgdir/etc/systemd/system/$_mysql_service_name..."
|
||||||
|
install -m644 "${srcdir}/mysqld.service" "${pkgdir}/etc/systemd/system/$_mysql_service_name"
|
||||||
|
|
||||||
# 创建 PATH 环境变量配置脚本
|
# 6. 创建 PATH 环境变量配置脚本
|
||||||
|
echo "Creating PATH configuration script $pkgdir/etc/profile.d/mysql.sh..."
|
||||||
echo 'PATH=/usr/local/mysql/bin:$PATH' > "${pkgdir}/etc/profile.d/mysql.sh"
|
echo 'PATH=/usr/local/mysql/bin:$PATH' > "${pkgdir}/etc/profile.d/mysql.sh"
|
||||||
chmod 0644 "${pkgdir}/etc/profile.d/mysql.sh"
|
chmod 0644 "${pkgdir}/etc/profile.d/mysql.sh"
|
||||||
|
|
||||||
# 复制初始 SQL 导入文件
|
# 7. 复制初始 SQL 导入文件 (仅用于参考或手动导入,因为数据已预初始化)
|
||||||
|
echo "Copying initial SQL import file to $pkgdir/usr/share/${pkgname}/tms_db_s3.sql..."
|
||||||
install -m644 "${srcdir}/tms_db_s3.sql" "${pkgdir}/usr/share/${pkgname}/tms_db_s3.sql"
|
install -m644 "${srcdir}/tms_db_s3.sql" "${pkgdir}/usr/share/${pkgname}/tms_db_s3.sql"
|
||||||
|
|
||||||
|
# --- 使用预初始化数据目录 ---
|
||||||
|
|
||||||
|
# 8. 创建最终的 MySQL 数据目录
|
||||||
|
echo "Creating final MySQL data directory: $pkgdir$_mysql_data_dir..."
|
||||||
|
install -d -m750 "$pkgdir$_mysql_data_dir"
|
||||||
|
|
||||||
|
# 9. 将预初始化数据从解压目录移动到最终数据目录
|
||||||
|
local _preinit_data_src="${srcdir}/mysql_preinit_data_extracted"
|
||||||
|
echo "Moving pre-initialized MySQL data from $_preinit_data_src to $pkgdir$_mysql_data_dir..."
|
||||||
|
|
||||||
|
# 处理 zip 文件可能包含一个顶层目录的情况
|
||||||
|
local _contents=("$_preinit_data_src"/*)
|
||||||
|
if [ "${#_contents[@]}" -eq 1 ] && [ -d "${_contents[0]}" ]; then
|
||||||
|
mv "${_contents[0]}"/* "$pkgdir$_mysql_data_dir/" || { error "Failed to move contents from single top-level directory."; exit 1; }
|
||||||
|
else
|
||||||
|
mv "$_preinit_data_src"/* "$pkgdir$_mysql_data_dir/" || { error "Failed to move extracted data."; exit 1; }
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 设置所有权 (在 fakeroot 环境中,所有文件都由 root 拥有。
|
||||||
|
# 最终的 chown 权限设置会在 .install 脚本的 pre_install 中完成。)
|
||||||
|
chown -R root:root "$pkgdir$_mysql_data_dir" # 暂时设置为 root,实际会在 post_install 中被 mysql 用户拥有
|
||||||
|
|
||||||
|
# 10. 清理临时文件
|
||||||
|
echo "Cleaning up temporary setup files..."
|
||||||
|
rm -rf "$_preinit_data_src" # 删除解压后的临时目录
|
||||||
|
|
||||||
|
echo "SmartTMS MySQL package creation complete with pre-initialized database from mysql.zip."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,23 +39,23 @@ post_install() {
|
|||||||
local install_type="$1"
|
local install_type="$1"
|
||||||
local timeout=60 # 等待 MySQL 启动的超时时间
|
local timeout=60 # 等待 MySQL 启动的超时时间
|
||||||
|
|
||||||
|
# 由于数据库初始化和导入已在 PKGBUILD 的 package() 函数中完成,
|
||||||
|
# post_install 钩子现在只负责在目标系统上启动和启用服务。
|
||||||
|
|
||||||
echo "Reloading systemd daemon..."
|
echo "Reloading systemd daemon..."
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
|
|
||||||
# 仅在首次安装时初始化数据库、设置密码和导入数据
|
# 确保数据目录的权限正确,即使在 PKGBUILD 中已设置 root:root
|
||||||
if [ ! -d "${mysql_data_dir}/mysql" ]; then
|
# 这里再次设置确保在目标系统上是 mysql 用户拥有
|
||||||
echo "Performing initial MySQL database setup..."
|
echo "Setting ownership for MySQL data directory '${mysql_data_dir}' to ${mysql_user}:${mysql_group}..."
|
||||||
cd "${mysql_install_dir}" || { echo "Error: MySQL install directory not found."; exit 1; }
|
|
||||||
|
|
||||||
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}"
|
chown -R "${mysql_user}":"${mysql_group}" "${mysql_data_dir}"
|
||||||
|
|
||||||
# 1. 启动 MySQL 服务 (保持 --skip-name-resolve 启用)
|
echo "Enabling MySQL service..."
|
||||||
|
systemctl enable "${mysql_service}"
|
||||||
|
|
||||||
echo "Starting MySQL service..."
|
echo "Starting MySQL service..."
|
||||||
systemctl start "${mysql_service}"
|
systemctl start "${mysql_service}"
|
||||||
|
|
||||||
# 2. 等待 MySQL 服务启动并可用
|
|
||||||
echo "Waiting for MySQL server to start (up to ${timeout} seconds)..."
|
echo "Waiting for MySQL server to start (up to ${timeout} seconds)..."
|
||||||
for i in $(seq 1 "${timeout}"); do
|
for i in $(seq 1 "${timeout}"); do
|
||||||
"${mysql_install_dir}/bin/mysqladmin" ping -h 127.0.0.1 -P 3306 &>/dev/null && break
|
"${mysql_install_dir}/bin/mysqladmin" ping -h 127.0.0.1 -P 3306 &>/dev/null && break
|
||||||
@@ -63,49 +63,10 @@ post_install() {
|
|||||||
done
|
done
|
||||||
|
|
||||||
if ! "${mysql_install_dir}/bin/mysqladmin" ping -h 127.0.0.1 -P 3306 &>/dev/null; then
|
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
|
echo "Warning: MySQL server did not start in time. Please check system logs for '${mysql_service}'." >&2
|
||||||
exit 1
|
# 不再强制退出,因为数据库已预初始化,服务启动失败可能是其他配置问题
|
||||||
fi
|
|
||||||
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
|
else
|
||||||
echo "Error: ${mysql_sql_file} not found. Database import failed." >&2
|
echo "MySQL server is running."
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
else # 数据目录已存在,说明不是首次安装,可能是升级或者之前安装过
|
|
||||||
echo "MySQL data directory already exists. Skipping database initialization."
|
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "SmartTMS MySQL installation/upgrade complete."
|
echo "SmartTMS MySQL installation/upgrade complete."
|
||||||
|
|||||||
Reference in New Issue
Block a user