GrabBag/GrabBagPrj/project_pkg_desktop.sh

205 lines
7.0 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
# 桌面应用打包
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/project_pkg_common.sh"
write_desktop_autostart() {
cat > "${PKG_PATH}/etc/xdg/autostart/${DESKTOP_FILE_NAME}" <<EOF
[Desktop Entry]
Type=Application
Name=${PACKAGE_NAME}
Comment=${PACKAGE_NAME} Application Auto Start
Exec=${EXEC_INSTALL_PATH}
Icon=${ICON_INSTALL_PATH}
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
AutostartCondition=GNOME3 unless-session gnome
EOF
}
write_desktop_entry() {
cat > "${PKG_PATH}/usr/share/applications/${DESKTOP_FILE_NAME}" <<EOF
[Desktop Entry]
Version=${PKG_VERSION}
Name=${PACKAGE_NAME}
Type=Application
Comment=${PACKAGE_COMMENT}
Terminal=false
Exec=${EXEC_INSTALL_PATH}
Icon=${ICON_INSTALL_PATH}
Categories=Development;
GenericName=${PACKAGE_NAME} App
Keywords=${PACKAGE_SLUG};app;
StartupNotify=true
EOF
}
write_desktop_postinst() {
cat > "${PKG_PATH}/DEBIAN/postinst" <<EOF
#!/bin/bash
set -e
LD_CONF_FILE="/etc/ld.so.conf.d/${PACKAGE_SLUG}.conf"
EXEC_PATH="${EXEC_INSTALL_PATH}"
DESKTOP_FILE="${DESKTOP_FILE_NAME}"
cat > "\${LD_CONF_FILE}" <<'LDEOF'
/usr/lib
/opt/sysroot/lib/
${PACKAGE_LD_CONF_EXTRA_LINES}
LDEOF
ldconfig
chmod +x "\${EXEC_PATH}"
# ParkingSpaceGuide board emergency-stop sysfs access.
if [ "${PACKAGE_NAME}" = "ParkingSpaceGuide" ]; then
GPIO_PATH_UNIT="parkingspaceguide-gpio-permissions.path"
GPIO_SERVICE_UNIT="parkingspaceguide-gpio-permissions.service"
ZLM_SERVICE_UNIT="parkingspaceguide-zlmediakit.service"
MARIADB_SETUP_UNIT="parkingspaceguide-mariadb-setup.service"
chmod 0644 "/etc/systemd/system/\${GPIO_PATH_UNIT}" \
"/etc/systemd/system/\${GPIO_SERVICE_UNIT}" \
"/etc/systemd/system/\${ZLM_SERVICE_UNIT}" \
"/etc/systemd/system/\${MARIADB_SETUP_UNIT}"
chmod 0755 /opt/parkingspaceguide/parkingspaceguide-gpio-permissions.sh
chmod 0755 /opt/parkingspaceguide/install-mariadb.sh
systemctl daemon-reload
systemctl enable --now "\${GPIO_PATH_UNIT}" >/dev/null 2>&1 || true
# 权限脚本启动后会等待 GPIO 节点出现,安装时节点是否存在都可以直接启动并设置开机自启。
# 用 restart 而不是 enable --now:升级时旧实例可能仍在运行,必须换成新的脚本命令。
systemctl enable "\${GPIO_SERVICE_UNIT}" >/dev/null 2>&1 || true
systemctl restart "\${GPIO_SERVICE_UNIT}" >/dev/null 2>&1 || true
echo "[${PACKAGE_NAME}] GPIO permission service enabled; it waits for the sysfs nodes before applying permissions"
if systemctl enable "\${ZLM_SERVICE_UNIT}" >/dev/null 2>&1 &&
systemctl restart "\${ZLM_SERVICE_UNIT}" >/dev/null 2>&1; then
echo "[${PACKAGE_NAME}] ZLMediaKit HTTP-FLV server started on port 8080"
else
echo "[${PACKAGE_NAME}] [WARN] Failed to start ZLMediaKit; check: systemctl status \${ZLM_SERVICE_UNIT}"
fi
# MariaDB 离线包在应用 DEB 内;不能在 postinst 里嵌套 dpkg,等当前安装解锁后再装。
echo "[${PACKAGE_NAME}] Installing bundled MariaDB from /opt/parkingspaceguide/mariadb-offline"
if systemctl enable "\${MARIADB_SETUP_UNIT}" >/dev/null 2>&1 &&
systemctl start --no-block "\${MARIADB_SETUP_UNIT}" >/dev/null 2>&1; then
echo "[${PACKAGE_NAME}] MariaDB setup started after dpkg unlock"
echo "[${PACKAGE_NAME}] Check: journalctl -u \${MARIADB_SETUP_UNIT} -n 50 --no-pager"
else
echo "[${PACKAGE_NAME}] [WARN] Failed to queue MariaDB setup; run: sudo /opt/parkingspaceguide/install-mariadb.sh"
fi
SYSCTL_CONF="/etc/sysctl.d/99-parkingspaceguide-network.conf"
if [ -f "\${SYSCTL_CONF}" ]; then
chmod 0644 "\${SYSCTL_CONF}"
if sysctl --system >/dev/null 2>&1 || sysctl -p "\${SYSCTL_CONF}" >/dev/null 2>&1; then
echo "[${PACKAGE_NAME}] Applied GigE/UDP socket buffer sysctl"
else
echo "[${PACKAGE_NAME}] [WARN] Failed to apply \${SYSCTL_CONF}"
fi
for rp in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 0 > "\${rp}" 2>/dev/null || true
done
fi
fi
# 端口映射 502 -> 5020
if [ ! -f /etc/systemd/system/vr-port-mapping.service ]; then
cat > /etc/systemd/system/vr-port-mapping.service <<'PORTEOF'
[Unit]
Description=VR Common Port Mapping Service
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'iptables-legacy -t nat -A PREROUTING -p tcp -m tcp --dport 502 -j REDIRECT --to-port 5020'
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
PORTEOF
systemctl daemon-reload
fi
systemctl enable vr-port-mapping.service 2>/dev/null || true
systemctl start vr-port-mapping.service 2>/dev/null || true
if ! iptables-legacy -t nat -C PREROUTING -p tcp -m tcp --dport 502 -j REDIRECT --to-port 5020 2>/dev/null; then
iptables-legacy -t nat -A PREROUTING -p tcp -m tcp --dport 502 -j REDIRECT --to-port 5020
fi
# 桌面快捷方式
${DETECT_CURRENT_USER_SNIPPET}
${RESOLVE_DESKTOP_DIR_SNIPPET}
desktop_dir=\$(resolve_desktop_dir "\${current_home}" || true)
if [ -n "\${desktop_dir}" ]; then
desktop_shortcut="\${desktop_dir}/\${DESKTOP_FILE}"
if [ ! -f "\${desktop_shortcut}" ]; then
cp "/usr/share/applications/\${DESKTOP_FILE}" "\${desktop_shortcut}"
chown "\${current_user}:\${current_user}" "\${desktop_shortcut}" 2>/dev/null || true
chmod 755 "\${desktop_shortcut}"
fi
fi
EOF
chmod +x "${PKG_PATH}/DEBIAN/postinst"
}
write_desktop_postrm() {
cat > "${PKG_PATH}/DEBIAN/postrm" <<EOF
#!/bin/bash
set -e
DESKTOP_FILE="${DESKTOP_FILE_NAME}"
rm -f "/etc/ld.so.conf.d/${PACKAGE_SLUG}.conf"
# 清理端口映射
systemctl stop vr-port-mapping.service 2>/dev/null || true
systemctl disable vr-port-mapping.service 2>/dev/null || true
rm -f /etc/systemd/system/vr-port-mapping.service
iptables-legacy -t nat -D PREROUTING -p tcp -m tcp --dport 502 -j REDIRECT --to-port 5020 2>/dev/null || true
if [ "${PACKAGE_NAME}" = "ParkingSpaceGuide" ]; then
if [ "\$1" = "remove" ] || [ "\$1" = "purge" ]; then
systemctl stop parkingspaceguide-zlmediakit.service 2>/dev/null || true
systemctl disable parkingspaceguide-zlmediakit.service 2>/dev/null || true
systemctl stop parkingspaceguide-gpio-permissions.path 2>/dev/null || true
systemctl stop parkingspaceguide-gpio-permissions.service 2>/dev/null || true
systemctl disable parkingspaceguide-gpio-permissions.path 2>/dev/null || true
systemctl disable parkingspaceguide-gpio-permissions.service 2>/dev/null || true
fi
fi
ldconfig
systemctl daemon-reload
# 清理桌面快捷方式
${DETECT_CURRENT_USER_SNIPPET}
${RESOLVE_DESKTOP_DIR_SNIPPET}
desktop_dir=\$(resolve_desktop_dir "\${current_home}" || true)
if [ -n "\${desktop_dir}" ]; then
rm -f "\${desktop_dir}/\${DESKTOP_FILE}"
fi
EOF
chmod +x "${PKG_PATH}/DEBIAN/postrm"
}
# ===== 主流程 =====
load_package_context "$@" "desktop"
echo "开始打包桌面应用 ${PACKAGE_NAME}"
run_common_packaging_steps
log_info "写入桌面集成脚本"
write_desktop_autostart
write_desktop_entry
write_desktop_postinst
write_desktop_postrm
finalize_package