#!/bin/sh DAEMON=/usr/bin/tera-api PIDFILE=/run/tera-api.pid ENVFILE=/etc/tera/tera-api.env RUN_AS=tera:tera ensure_account() { if ! grep -q '^tera:' /etc/group; then addgroup -S tera || return 1 fi if ! id tera >/dev/null 2>&1; then adduser -S -D -H -s /bin/false -G tera tera || return 1 fi } prepare_runtime() { ensure_account || return 1 mkdir -p /run/tera-api /var/lib/tera-api /var/log/tera || return 1 chown tera:tera /run/tera-api || return 1 chown -R tera:tera /var/lib/tera-api /var/log/tera || return 1 chmod 0750 /run/tera-api /var/lib/tera-api /var/log/tera || return 1 } load_environment() { if [ -r "$ENVFILE" ]; then set -a . "$ENVFILE" set +a fi } is_running() { [ -r "$PIDFILE" ] || return 1 pid="$(cat "$PIDFILE" 2>/dev/null)" [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null } wait_for_socket() { socket_path=$1 attempts=0 while [ "$attempts" -lt 30 ]; do [ -S "$socket_path" ] && return 0 attempts=$((attempts + 1)) sleep 1 done return 1 } start_service() { if is_running; then echo "tera-api is already running" return 0 fi rm -f "$PIDFILE" [ -x "$DAEMON" ] || { echo "missing $DAEMON" >&2; return 1; } prepare_runtime || return 1 load_environment if [ -n "${TERA_API_LOG_SOCKET:-}" ]; then wait_for_socket "$TERA_API_LOG_SOCKET" || { echo "tera-api dependency socket is not ready: $TERA_API_LOG_SOCKET" >&2 return 1 } fi start-stop-daemon -S -q -b -m -p "$PIDFILE" -c "$RUN_AS" -x "$DAEMON" } stop_service() { if ! is_running; then rm -f "$PIDFILE" return 0 fi start-stop-daemon -K -q -p "$PIDFILE" -x "$DAEMON" rm -f "$PIDFILE" } case "$1" in start) start_service ;; stop) stop_service ;; restart) stop_service && start_service ;; status) is_running ;; *) echo "Usage: $0 {start|stop|restart|status}" >&2; exit 1 ;; esac