#!/bin/bash set -u PID_FILE="${TRIM_PKGVAR}/havline.pid" LOG_FILE="${TRIM_PKGVAR}/logs/app.log" SOCKET_PATH="${TRIM_APPDEST}/app.sock" mkdir -p "${TRIM_PKGVAR}/logs" log_msg() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE" } check_process() { local pid="$1" kill -0 "$pid" 2>/dev/null } status_app() { if [ -f "$PID_FILE" ]; then local pid pid="$(head -n 1 "$PID_FILE" | tr -d '[:space:]')" if [ -n "$pid" ] && check_process "$pid"; then return 0 fi rm -f "$PID_FILE" fi return 1 } arch_dir() { case "$(uname -m)" in x86_64|amd64) echo "amd64" ;; aarch64|arm64) echo "arm64" ;; *) return 1 ;; esac } start_app() { if status_app; then return 0 fi local arch arch="$(arch_dir)" || { echo "不支持的设备架构:$(uname -m)" > "$TRIM_TEMP_LOGFILE" exit 1 } local bin="${TRIM_APPDEST}/server/${arch}/havline" if [ ! -x "$bin" ]; then echo "找不到原生二进制:$bin" > "$TRIM_TEMP_LOGFILE" exit 1 fi export HAVLINE_DATA_DIR="$TRIM_PKGVAR" export HAVLINE_LISTEN="127.0.0.1:6893" export HAVLINE_GATEWAY_SOCKET="$SOCKET_PATH" export HAVLINE_GATEWAY_PREFIX="/app/havline" export HAVLINE_UPDATER_SOCKET="" export HAVLINE_NGINX_BIN="$TRIM_APPDEST/server/$arch/nginx" export HAVLINE_NGINX_MIME_TYPES="$TRIM_APPDEST/server/mime.types" export HAVLINE_NGINX_PID="$TRIM_PKGVAR/nginx/nginx.pid" export HAVLINE_NGINX_HTTP_PORT="${wizard_nginx_http_port:-18080}" export HAVLINE_NGINX_HTTPS_PORT="${wizard_nginx_https_port:-9443}" export LD_LIBRARY_PATH="$TRIM_APPDEST/server/$arch/lib:${LD_LIBRARY_PATH:-}" export TZ="${wizard_timezone:-Asia/Shanghai}" if [ -n "${wizard_initial_admin_password:-}" ]; then export HAVLINE_INITIAL_ADMIN_PASSWORD="$wizard_initial_admin_password" fi rm -f "$SOCKET_PATH" log_msg "Starting Havline native" cd "$TRIM_APPDEST" || exit 1 nohup "$bin" >> "$LOG_FILE" 2>&1 & echo "$!" > "$PID_FILE" sleep 1 status_app } stop_app() { if [ ! -f "$PID_FILE" ]; then rm -f "$SOCKET_PATH" return 0 fi local pid pid="$(head -n 1 "$PID_FILE" | tr -d '[:space:]')" if [ -n "$pid" ] && check_process "$pid"; then kill -TERM "$pid" 2>> "$LOG_FILE" || true local count=0 while check_process "$pid" && [ "$count" -lt 15 ]; do sleep 1 count=$((count + 1)) done if check_process "$pid"; then kill -KILL "$pid" 2>> "$LOG_FILE" || true fi fi rm -f "$PID_FILE" "$SOCKET_PATH" } case "${1:-}" in start) start_app ;; stop) stop_app ;; status) if status_app; then exit 0 fi exit 3 ;; *) echo "Unknown command: ${1:-}" > "$TRIM_TEMP_LOGFILE" exit 1 ;; esac