#!/bin/sh PKGVAR="/var/services/homes/jsun/tailscale" SERVICE_NAME="tailscale" PID_FILE="${PKGVAR}/tailscaled.pid" LOG_FILE="${PKGVAR}/tailscaled.stdout.log" STATE_FILE="${PKGVAR}/tailscaled.state" SOCKET_FILE="${PKGVAR}/tailscaled.sock" PORT="41641" SERVICE_COMMAND="${PKGVAR}/tailscaled \ --state=${STATE_FILE} \ --socket=${SOCKET_FILE} \ --port=$PORT" #--tun=userspace-networking" get_pid() { echo $(ps | grep tailscaled | grep -v grep | sed -e "s#^ *##" -e "s# .*##") } start_daemon() { local ts=$(date) echo "${ts} Starting ${SERVICE_NAME} with: ${SERVICE_COMMAND}" >${LOG_FILE} STATE_DIRECTORY=${PKGVAR} ${SERVICE_COMMAND} 2>&1 | head -30 >>${LOG_FILE} & get_pid > ${PID_FILE} } stop_daemon() { if [ -r "${PID_FILE}" ]; then local PID=$(cat "${PID_FILE}") local ts=$(date) echo "${ts} Stopping ${SERVICE_NAME} service PID=${PID}" >>${LOG_FILE} kill -TERM $PID >>${LOG_FILE} 2>&1 wait_for_status 1 || kill -KILL $PID >>${LOG_FILE} 2>&1 rm -f "${PID_FILE}" >/dev/null fi } daemon_status() { local pid=$(get_pid) if [ -r "${PID_FILE}" ]; then local PID=$(cat "${PID_FILE}") if [[ "$PID" -eq "$pid" ]]; then return fi rm -f "${PID_FILE}" >/dev/null fi if [[ $pid ]]; then echo $pid > ${PID_FILE} return fi return 1 } wait_for_status() { # 20 tries # sleeps for 1 second after each try local counter=20 while [ ${counter} -gt 0 ]; do daemon_status [ $? -eq $1 ] && return counter=$((counter - 1)) sleep 1 done return 1 } case $1 in start) if daemon_status; then exit 0 else start_daemon exit $? fi ;; stop) if daemon_status; then stop_daemon exit $? else exit 0 fi ;; status) if daemon_status; then echo "${SERVICE_NAME} is running" exit 0 else echo "${SERVICE_NAME} is not running" exit 3 fi ;; log) exit 0 ;; *) echo "command $1 is not implemented" exit 0 ;; esac