#!/bin/bash # GiteaHubSync service control(由 fnOS 应用中心在 启动/停止/查询状态 时调用) # 守护进程以 setsid nohup 方式后台运行,pidfile 位于持久数据目录(@appdata/GiteaHubSync) PYBIN="" for candidate in \ /var/apps/python312/target/bin/python3 \ /vol1/@appcenter/python312/target/bin/python3 \ /var/apps/python311/target/bin/python3 \ /var/apps/python310/target/bin/python3 \ /usr/bin/python3 \ /usr/local/bin/python3; do if [ -x "$candidate" ]; then PYBIN="$candidate"; break; fi done # TRIM_APPDEST 由 fnOS 注入;若缺失或指向其他应用,则回退到脚本自身位置 APPDEST="${TRIM_APPDEST:-}" if [ -z "$APPDEST" ] || [ ! -d "$APPDEST/cmd" ]; then APPDEST="$(cd "$(dirname "$0")/.." && pwd)" fi BACKEND_DIR="${APPDEST}/backend" [ -d "$BACKEND_DIR" ] || BACKEND_DIR="${APPDEST}/target/backend" [ -d "$BACKEND_DIR" ] || BACKEND_DIR="${APPDEST}/app/backend" DAEMON="${BACKEND_DIR}/panel.py" # 持久数据目录(TRIM_PKGVAR 由 fnOS 注入,通常为 /vol{n}/@appdata/GiteaHubSync) if [ -n "${TRIM_PKGVAR}" ] && [ -d "${TRIM_PKGVAR}" ]; then DATA_DIR="${TRIM_PKGVAR}" else DATA_DIR="" for candidate in \ "${APPDEST}/../../@appdata/GiteaHubSync" \ "${APPDEST}/var" \ "/var/apps/GiteaHubSync/var" \ "/vol1/@appdata/GiteaHubSync" \ "/vol2/@appdata/GiteaHubSync"; do if [ -d "$candidate" ]; then DATA_DIR="$candidate"; break; fi done if [ -z "$DATA_DIR" ]; then DATA_DIR="${APPDEST}/../../@appdata/GiteaHubSync" fi fi PIDFILE="${DATA_DIR}/daemon.pid" daemon_alive() { [ -f "$PIDFILE" ] || return 1 local pid pid="$(cat "$PIDFILE" 2>/dev/null)" [ -n "$pid" ] || return 1 kill -0 "$pid" 2>/dev/null } case "$1" in start) if daemon_alive; then echo "GiteaHubSync daemon already running (pid $(cat "$PIDFILE"))" exit 0 fi if [ -z "$PYBIN" ]; then echo "python3 runtime not found (install_dep_apps=python312)" > "${TRIM_TEMP_LOGFILE:-/dev/stderr}" exit 1 fi mkdir -p "$DATA_DIR" # fnOS 解包可能放宽密钥权限,ssh 会拒绝;启动前收紧 [ -f "${APPDEST}/ssh/id_ed25519" ] && chmod 600 "${APPDEST}/ssh/id_ed25519" 2>/dev/null [ -f "${DATA_DIR}/id_ed25519" ] && chmod 600 "${DATA_DIR}/id_ed25519" 2>/dev/null GHS_DATA_DIR="$DATA_DIR" setsid nohup "$PYBIN" "$DAEMON" >> "${DATA_DIR}/daemon.out" 2>&1 & for _ in 1 2 3 4 5 6 7 8 9 10; do if daemon_alive; then echo "GiteaHubSync daemon started (pid $(cat "$PIDFILE"))" exit 0 fi sleep 0.5 done echo "GiteaHubSync daemon failed to start; see ${DATA_DIR}/daemon.out" > "${TRIM_TEMP_LOGFILE:-/dev/stderr}" exit 1 ;; stop) if daemon_alive; then pid="$(cat "$PIDFILE")" kill "$pid" 2>/dev/null for _ in 1 2 3 4 5 6 7 8 9 10; do kill -0 "$pid" 2>/dev/null || break sleep 0.5 done kill -9 "$pid" 2>/dev/null echo "GiteaHubSync daemon stopped (pid $pid)" else echo "GiteaHubSync daemon not running" fi rm -f "$PIDFILE" exit 0 ;; status) if daemon_alive; then exit 0 fi exit 3 ;; *) exit 1 ;; esac