HM-SPMS/installer/installer_linux.sh
2026-04-07 10:38:20 +08:00

603 lines
18 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
#判断是否管理员权限
if [ $(id -u) -ne 0 ]; then
echo "ERROR:当前用户没有管理员权限,非管理员请用 sudo ./installer_linux.sh 命令执行"
exit
fi
#variable
#当前的安装包运行目录
initfile=$(dirname "$(dirname "$(readlink -f "$0")")")
#安装目录
INSTALL_DIR="/opt/HMEnergy"
#debug or release
SETUP_DEBUG_RELEASE=debug
#安装平台 centos 、openeuler
OS_DEFINE=""
#nginx 定制系统配置目录 以及服务名称
NGINX_CONFIGDIR=""
NGINX_SERVICE_NAME=""
#polkit 权限规则处理
polkit_rule_path=""
custom_rule_file=""
#系统设置开机执行文件路径
custom_cmd_file=""
# 命令行参数解析
DB_SERVICE_NAME=""
AUTO_CONFIRM=false
echo "INFO: 接收到的参数: $@"
# 解析命令行参数
while [[ $# -gt 0 ]]; do
case $1 in
-d|--database)
DB_SERVICE_NAME="$2"
shift 2
;;
-y|--yes)
AUTO_CONFIRM=true
shift
;;
-o|--os)
OS_DEFINE="$2"
shift 2
;;
*)
echo "未知参数: $1"
exit 1
;;
esac
done
#加载宏定义,用来判断平台
if [ -f "/etc/profile.d/iscs6000.sh" ]; then
source /etc/profile.d/iscs6000.sh
fi
if [ -f "/etc/profile.d/iscs6000env.sh" ]; then
source /etc/profile.d/iscs6000env.sh
fi
if [ -f "/etc/profile.d/rqeh6000.sh" ]; then
source /etc/profile.d/rqeh6000.sh
fi
if [ -f "/etc/profile.d/rqeh6000env.sh" ]; then
source /etc/profile.d/rqeh6000env.sh
fi
#variable
#script_path="$(cd "$(dirname "$0")" && pwd)"
script_path="${INSTALL_DIR}/installer"
echo "INFO:当前脚本执行目录: $script_path"
if [ -n "$RQEH6000_OS" ]; then
OS_DEFINE=$RQEH6000_OS
echo "INFO:安装操作系统平台:" $RQEH6000_OS
fi
if [ -n "$ISCS6000_OS" ]; then
OS_DEFINE=$ISCS6000_OS
echo "INFO:安装操作系统平台:" $ISCS6000_OS
fi
if [ ! -n "$OS_DEFINE" ]; then
echo "ERROR:没有找到操作系统平台定义"
exit 1
fi
echo "INFO:安装目录为: ${INSTALL_DIR} "
#判断原来目录下有文件,则删除
if [ -d "$INSTALL_DIR" ]; then
echo "WARNING:安装目录 $INSTALL_DIR 不为空!"
# 如果启用了自动确认,直接删除;否则询问用户
if [ "$AUTO_CONFIRM" = true ]; then
echo "INFO:自动确认模式,删除原有文件..."
rm -rf $INSTALL_DIR
else
# 询问用户是否删除这些文件
read -p "INFO:是否删除这些文件或者取消安装?注意:安装前需要保证原系统停止运行!(y/c): " answer
case $answer in
[Yy]* )
rm -rf $INSTALL_DIR
;;
[Cc]* )
echo "INFO:安装操作已取消。"
exit 1
;;
* )
echo "INFO:无效的输入,安装操作已取消。"
exit 1
;;
esac
fi
fi
mkdir $INSTALL_DIR
cp -r $initfile/* $INSTALL_DIR
EXPORT_DIR="${INSTALL_DIR}/backup"
DB_GROUP=""
DB_USER=""
CURRENT_OWNER=""
#开启配置数据库服务
if [ "kylin10d" = "$OS_DEFINE" ]; then
echo "INFO:kylin need to select db-service"
# 如果没有通过命令行指定数据库类型,则进行交互式选择
if [ -z "$DB_SERVICE_NAME" ]; then
valid_input=false
while [ "$valid_input" = false ]; do
echo "请选择数据库服务名:"
echo "1) kingbase"
echo "2) mariadb"
read -p "请输入数字选择(默认: 1: " choice
case "$choice" in
1 | "") # 输入 1 或直接回车
DB_SERVICE_NAME="kingbase"
valid_input=true
;;
2)
DB_SERVICE_NAME="mariadb"
valid_input=true
;;
*)
echo "无效选择,请重新输入!"
;;
esac
done
else
# 验证命令行传入的数据库类型是否有效
if [ "$DB_SERVICE_NAME" != "kingbase" ] && [ "$DB_SERVICE_NAME" != "mariadb" ]; then
echo "ERROR:不支持的数据库类型: $DB_SERVICE_NAME,支持的类型: kingbase, mariadb"
exit 1
fi
fi
echo "INFO: 选择的数据库服务为 ${DB_SERVICE_NAME}"
if [ "kingbase" = "$DB_SERVICE_NAME" ]; then
if sudo systemctl is-active --quiet "$DB_SERVICE_NAME"; then
echo "INFO:${DB_SERVICE_NAME} 服务已开启。"
else
chmod +x /opt/Kingbase/ES/V8/Scripts/root.sh
/opt/Kingbase/ES/V8/Scripts/root.sh
echo "INFO:${DB_SERVICE_NAME} 服务已开启。"
fi
fi
if [ "mariadb" = "$DB_SERVICE_NAME" ]; then
if sudo systemctl is-active --quiet "$DB_SERVICE_NAME"; then
echo "INFO:${DB_SERVICE_NAME} 服务已开启。"
else
systemctl enable mariadb.service
systemctl start mariadb.service
echo "INFO:${DB_SERVICE_NAME} 服务已开启。"
fi
fi
#为数据库服务赋backup文件夹权限
CURRENT_OWNER="$(stat -c '%U' "$EXPORT_DIR")"
if systemctl show "$DB_SERVICE_NAME" >/dev/null 2>&1; then
#DB_USER="$(systemctl show "$DB_SERVICE_NAME" -p User --value 2>/dev/null || true)"
DB_GROUP="$(systemctl show "$DB_SERVICE_NAME" -p Group --value 2>/dev/null || true)"
fi
if [ -z "$DB_GROUP" ]; then
if id -u "$DB_SERVICE_NAME" >/dev/null 2>&1; then
DB_USER="$DB_SERVICE_NAME"
else
# 用进程表查第一个匹配到的用户(变量要正确传入 awk
DB_USER="$(ps -eo user,comm | awk -v svc="$DB_SERVICE_NAME" '$2 ~ svc {print $1; exit}')"
fi
if [ -n "$DB_USER" ] && id -u "$DB_USER" >/dev/null 2>&1; then
DB_GROUP="$(id -gn "$DB_USER")"
fi
fi
if [ -n "$DB_GROUP" ]; then
sudo chown "$CURRENT_OWNER":"$DB_GROUP" "$EXPORT_DIR"
sudo chmod 2775 "$EXPORT_DIR"
echo "INFO: ${EXPORT_DIR} 设置${DB_SERVICE_NAME} 权限完成."
else
echo "WARN: 无法获取 ${DB_SERVICE_NAME} 的 Group 配置!"
echo " ${EXPORT_DIR} 权限未设置,可能影响备份功能,请手动执行:"
fi
elif [ "oe2203" = "$OS_DEFINE" ] || [ "oe2203_aarch64" = "$OS_DEFINE" ]; then
echo "INFO:openEuler need to select db-service"
# 如果没有通过命令行指定数据库类型,则进行交互式选择
if [ -z "$DB_SERVICE_NAME" ]; then
valid_input=false
while [ "$valid_input" = false ]; do
echo "请选择数据库服务名:"
echo "1) opengauss"
echo "2) mysqld"
read -p "请输入数字选择(默认: 1: " choice
case "$choice" in
1 | "") # 输入 1 或直接回车
DB_SERVICE_NAME="opengauss"
valid_input=true
;;
2)
DB_SERVICE_NAME="mysqld"
valid_input=true
;;
*)
echo "无效选择,请重新输入!"
;;
esac
done
else
# 验证命令行传入的数据库类型是否有效
if [ "$DB_SERVICE_NAME" != "opengauss" ] && [ "$DB_SERVICE_NAME" != "mysqld" ]; then
echo "ERROR:不支持的数据库类型: $DB_SERVICE_NAME,支持的类型: opengauss, mysqld"
exit 1
fi
fi
echo "INFO: 选择的数据库服务为 ${DB_SERVICE_NAME}"
if [ "mysqld" = "$DB_SERVICE_NAME" ]; then
mysql_path="/etc/my.cnf.d"
mysql_cof="${script_path}/others/z1-oe-mysql-custom.cnf"
if [ -d "$mysql_path" ] && [ -f "$mysql_cof" ]; then
sudo cp "$mysql_cof" "$mysql_path/z1-oe-mysql-custom.cnf"
sudo chmod 644 "$mysql_path/z1-oe-mysql-custom.cnf"
sudo chown root:root "$mysql_path/z1-oe-mysql-custom.cnf"
echo "INFO:mysql 自定义配置文件已复制到配置文件夹中"
else
echo "INFO:mysql 自定义配置文件无法生效原因找不到mysql的配置目录"
fi
if sudo systemctl is-active --quiet "$DB_SERVICE_NAME"; then
sudo systemctl restart mysqld.service
echo "INFO:${DB_SERVICE_NAME} 服务已开启,正在重启以应用新配置..."
else
systemctl enable mysqld.service
systemctl start mysqld.service
echo "INFO:${DB_SERVICE_NAME} 服务已开启。"
fi
fi
if [ "opengauss" = "$DB_SERVICE_NAME" ]; then
if sudo systemctl is-active --quiet "$DB_SERVICE_NAME"; then
echo "INFO:${DB_SERVICE_NAME} 服务已开启。"
else
chown -R ${SUDO_USER}:${SUDO_USER} /usr/local/opengauss
chown -R ${SUDO_USER}:${SUDO_USER} /var/lib/opengauss
echo "INFO:opengauss dir owner has changed "
pg_conf="/var/lib/opengauss/data/single_node/postgresql.conf"
if grep -q "^behavior_compat_options" "$pg_conf"; then
sed -i "s/^behavior_compat_options.*/behavior_compat_options = 'accept_empty_str'/" "$pg_conf"
else
echo "behavior_compat_options = 'accept_empty_str'" >> "$pg_conf"
fi
sed -i '/^session_timeout/s/=.*/= 0/' ${pg_conf}
#sed -i "s/^User=.*/User=$SUDO_USER/" /usr/lib/systemd/system/opengauss.service
sed -i "s/^User=.*/User=$SUDO_USER/; s/^Group=.*/Group=$SUDO_USER/" /usr/lib/systemd/system/opengauss.service
if ! grep -q "^Group=" /usr/lib/systemd/system/opengauss.service; then
sed -i "/^\[Service\]/a Group=$SUDO_USER" /usr/lib/systemd/system/opengauss.service
fi
systemctl daemon-reload
systemctl restart opengauss.service
systemctl enable opengauss.service
check_service_path=${script_path}/others/checkOpengauss.sh
chmod +x ${check_service_path}
${check_service_path}
if [ $? -eq 0 ]; then
echo "INFO:${DB_SERVICE_NAME} 服务已开启。"
else
echo "INFO:${DB_SERVICE_NAME} 服务开启失败。"
fi
fi
fi
#为数据库服务赋backup文件夹权限
CURRENT_OWNER="$(stat -c '%U' "$EXPORT_DIR")"
if systemctl show "$DB_SERVICE_NAME" >/dev/null 2>&1; then
DB_USER="$(systemctl show "$DB_SERVICE_NAME" -p User --value 2>/dev/null || true)"
DB_GROUP="$(systemctl show "$DB_SERVICE_NAME" -p Group --value 2>/dev/null || true)"
fi
if [ -z "$DB_GROUP" ]; then
if id -u "$DB_SERVICE_NAME" >/dev/null 2>&1; then
DB_USER="$DB_SERVICE_NAME"
else
# 用进程表查第一个匹配到的用户(变量要正确传入 awk
DB_USER="$(ps -eo user,comm | awk -v svc="$DB_SERVICE_NAME" '$2 ~ svc {print $1; exit}')"
fi
if [ -n "$DB_USER" ] && id -u "$DB_USER" >/dev/null 2>&1; then
DB_GROUP="$(id -gn "$DB_USER")"
fi
fi
echo "INFO :${DB_SERVICE_NAME} user:${DB_USER} group:${DB_GROUP}"
if [ -n "$DB_GROUP" ]; then
sudo chown "$CURRENT_OWNER":"$DB_GROUP" "$EXPORT_DIR"
sudo chmod 2775 "$EXPORT_DIR"
echo "INFO: ${EXPORT_DIR} 设置${DB_SERVICE_NAME} 权限完成."
else
echo "WARN: 无法获取 ${DB_SERVICE_NAME} 的 Group 配置!"
echo " ${EXPORT_DIR} 权限未设置,可能影响备份功能,请手动执行:"
fi
else
echo "INFO:数据库使用mariadb服务"
DB_SERVICE_NAME="mariadb"
if sudo systemctl is-active --quiet "$DB_SERVICE_NAME"; then
echo "INFO:${DB_SERVICE_NAME} 服务已开启。"
else
systemctl enable mariadb.service
systemctl start mariadb.service
echo "INFO:${DB_SERVICE_NAME} 服务已开启。"
fi
fi
#开启历史数据库服务
HISDB_SERVICE_NAME="influxdb"
if sudo systemctl is-active --quiet "$HISDB_SERVICE_NAME"; then
echo "INFO:${HISDB_SERVICE_NAME} 服务已开启。"
else
systemctl enable influxdb
systemctl start influxdb
echo "INFO:${HISDB_SERVICE_NAME} 服务已开启。"
fi
#nginx配置文件以及polkit规则文件
if [ "oe2203" = "$OS_DEFINE" ] || [ "kylin10d" = "$OS_DEFINE" ]; then
#nginx 配置文件
NGINX_CONFIGDIR="/etc/nginx/nginx.conf"
NGINX_SERVICE_NAME="nginx"
echo "INFO:nginx配置文件"$NGINX_CONFIGDIR "服务名称" $NGINX_SERVICE_NAME
#polkit-auth
polkit_rule_path="/etc/polkit-1/rules.d"
custom_rule_file="51-custom-authentication.rules" #注意数字排序别被规则覆盖
if [ "kylin10d" = "$OS_DEFINE" ]; then
polkit_rule_path="/etc/polkit-1/localauthority/50-local.d"
custom_rule_file="allow-program-kylin.pkla"
fi
echo "INFO:polkit配置文件"$polkit_rule_path "自定义文件名称" $custom_rule_file
custom_rule_file_path=${script_path}/others/${custom_rule_file}
cp ${custom_rule_file_path} ${polkit_rule_path}/
chmod 644 ${polkit_rule_path}/${custom_rule_file}
systemctl restart polkit.service
echo "INFO:规则文件已拷贝并且polkit服务已重启"
#auth
chown ${SUDO_USER}:${SUDO_USER} ${INSTALL_DIR}
echo "INFO: change auth to user- ${SUDO_USER} dir-${INSTALL_DIR}"
else
NGINX_CONFIGDIR="/etc/opt/rh/rh-nginx116/nginx/nginx.conf"
NGINX_SERVICE_NAME="rh-nginx116-nginx"
echo "INFO:nginx配置文件"$NGINX_CONFIGDIR "服务名称" $NGINX_SERVICE_NAME
fi
#开启Nginx服务
nginx_path="${INSTALL_DIR}/nginx/nginx.conf"
if [ -e "$nginx_path" ]; then
echo "copy nginx config"
cp "$nginx_path" "$NGINX_CONFIGDIR"
rm "$nginx_path"
else
echo "cannot find nginx config in ${INSTALL_DIR}"
fi
ln -s "$NGINX_CONFIGDIR" "$nginx_path"
chmod -R 775 "$nginx_path"
if [ -L "$nginx_path" ]; then
echo "nginx symbolic link create success!"
else
echo "nginx symbolic link create failure!"
fi
if sudo systemctl is-active --quiet "$NGINX_SERVICE_NAME"; then
echo "INFO:${NGINX_SERVICE_NAME} 服务已开启。"
else
systemctl enable ${NGINX_SERVICE_NAME}
systemctl start ${NGINX_SERVICE_NAME}
echo "INFO:${NGINX_SERVICE_NAME} 服务已开启。"
fi
if [ -d "$(dirname "$script_path")/product/${OS_DEFINE}_debug/" ]; then
SETUP_DEBUG_RELEASE=debug
else
SETUP_DEBUG_RELEASE=release
fi
echo "INFO:安装版本:" $SETUP_DEBUG_RELEASE
export BIN_DIR_VER=${OS_DEFINE}_${SETUP_DEBUG_RELEASE}
#进行配置数据库初始化操作
$(dirname "$script_path")/product/$BIN_DIR_VER/db_installer
echo "INFO:开始进行附文件权限"
sh_path="$(dirname "$script_path")/product/$BIN_DIR_VER/"
sh_files=$(find "$sh_path" -maxdepth 1 -type f -name "*.sh")
#sh_files=$(find "$script_path" -maxdepth 1 -type f -name "*.sh")
if [ -n "$sh_files" ]; then
echo "INFO:找到以下 .sh 文件:"
echo "$sh_files"
echo "INFO:为这些文件添加执行权限..."
for file in $sh_files; do
chmod +x "$file"
done
fi
app_name="HMEnergy"
exec_command="$(dirname "$script_path")/product/$BIN_DIR_VER/workBench"
# 创建.desktop文件
sudo -k
DESKTOP_DIR=/root/桌面
if [ -n "$SUDO_USER" ]; then
DESKTOP_DIR=/home/$SUDO_USER/桌面
fi
if [ ! -d "${DESKTOP_DIR}" ]; then
echo "ERROR:目录不存在:${DESKTOP_DIR}"
exit
fi
echo "INFO:start-创建快捷方式成功"
cat > ${DESKTOP_DIR}/$app_name.desktop <<EOL
[Desktop Entry]
Name=$app_name
Exec=$exec_command
Type=Application
Terminal=false
Icon=$(dirname "$script_path")/installer/rqeh6000.ico
StartupNotify=true
EOL
echo "INFO:end-创建EMS.desktop快捷方式成功"
#赋权限
#net Permission
echo 'net.ipv4.ping_group_range = 0 2147483647' > /etc/sysctl.d/z5-ping.conf
sysctl -p /etc/sysctl.d/z5-ping.conf
# 赋予.desktop文件执行权限
chmod u+x ${DESKTOP_DIR}/$app_name.desktop
if [ -n "$SUDO_USER" ]; then
chown $SUDO_USER ${DESKTOP_DIR}/$app_name.desktop
chown -R $SUDO_USER ${INSTALL_DIR}/*
fi
cp ${DESKTOP_DIR}/$app_name.desktop /usr/share/applications/
#net_keepalived config
config_keepalived_cmd="$(dirname "$script_path")/platform/$BIN_DIR_VER/net_keepalived"
KEEPALIVE_SERVICE_NAME="net_keepalived"
if sudo systemctl is-active --quiet "$KEEPALIVE_SERVICE_NAME"; then
systemctl stop net_keepalived
systemctl disable net_keepalived
fi
$config_keepalived_cmd -r
if [ $? -ne 0 ]; then
echo "WARNING: Command '$config_keepalived_cmd -r' failed."
fi
systemctl start net_keepalived
systemctl enable net_keepalived
if sudo systemctl is-active --quiet "$KEEPALIVE_SERVICE_NAME"; then
echo "INFO:${KEEPALIVE_SERVICE_NAME} 服务已开启。"
else
echo "INFO:${KEEPALIVE_SERVICE_NAME} 服务开启失败。"
fi
if [ "kylin10d" = "$OS_DEFINE" ]; then
profile_path="/etc/profile.d"
custom_cmd_file="others/customCmd.sh"
cp ${custom_cmd_file} ${profile_path}/
chmod +x ${profile_path}/customCmd.sh
echo "**********************"
echo "由于更改了系统设置,需要重启电脑或者注销用户然后重新登录才能生效!!!!!"
echo "**********************"
fi
#为所有用户创建应用菜单快捷方式 begin
cat <<EOF | tee /usr/share/applications/${app_name}.desktop >/dev/null
[Desktop Entry]
Name=$app_name
Exec=$exec_command
Icon=$(dirname "$script_path")/installer/rqeh6000.ico
Terminal=false
Type=Application
Categories=Utility;
EOF
chmod 644 /usr/share/applications/${app_name}.desktop
update-desktop-database
#为所有用户创建应用菜单快捷方式 end
#注册 sys_data_sync_server 到 systemd
#if [ "oe2203_aarch64" = "$OS_DEFINE" ]; then
SERVICE_NAME="sys_data_sync_server"
EXEC_PATH="$(dirname "$script_path")/product/$BIN_DIR_VER/sys_data_sync_server"
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
if [ ! -f "$EXEC_PATH" ]; then
echo "ERROR: 未找到可执行文件 $EXEC_PATH"
else
echo "INFO: 开始注册 ${SERVICE_NAME} 到 systemd..."
chmod +x "$EXEC_PATH"
cat > "$SERVICE_FILE" <<EOF
[Unit]
Description=Sys Data Sync Server
After=network.target
[Service]
Type=simple
ExecStart=$EXEC_PATH
WorkingDirectory=$(dirname "$EXEC_PATH")
Restart=always
RestartSec=5
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
# 重新加载 systemd
systemctl daemon-reload
# 设置开机自启动
systemctl enable ${SERVICE_NAME}.service
# 启动服务
systemctl start ${SERVICE_NAME}.service
# 检查状态
if systemctl is-active --quiet "${SERVICE_NAME}"; then
echo "INFO:${SERVICE_NAME} 服务已成功启动并设置为开机自启"
else
echo "ERROR:${SERVICE_NAME} 启动失败,请执行:"
echo "journalctl -u ${SERVICE_NAME} -f"
fi
fi
#fi
if [ "oe2203_aarch64" = "$OS_DEFINE" ]; then
gpio85_path=${script_path}/others/setup-gpio85-systemd.sh
chmod +x ${gpio85_path}
${gpio85_path}
fi
echo "INFO安装成功$app_name"
exit 0