205 lines
6.7 KiB
Bash
205 lines
6.7 KiB
Bash
#!/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/install-mariadb.sh
|
||
systemctl daemon-reload
|
||
systemctl enable --now "\${GPIO_PATH_UNIT}" >/dev/null 2>&1 || true
|
||
if [ -e /sys/external_gpio/jwsioc_inout_gpio3 ] &&
|
||
[ -e /sys/external_gpio/jwsioc_gpio3 ]; then
|
||
systemctl start "\${GPIO_SERVICE_UNIT}" >/dev/null 2>&1 || true
|
||
echo "[${PACKAGE_NAME}] GPIO sysfs permission ready"
|
||
else
|
||
echo "[${PACKAGE_NAME}] [WARN] GPIO sysfs files do not exist; path unit will apply permissions when they appear"
|
||
fi
|
||
|
||
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
|
||
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
|