mirror of https://github.com/tailscale/tailscale/
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
3.1 KiB
Plaintext
130 lines
3.1 KiB
Plaintext
1 year ago
|
#!/bin/bash
|
||
|
|
||
|
SERVICE_NAME="tailscale"
|
||
|
|
||
|
if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -eq "6" ]; then
|
||
|
PKGVAR="/var/packages/Tailscale/etc"
|
||
|
else
|
||
|
PKGVAR="${SYNOPKG_PKGVAR}"
|
||
|
fi
|
||
|
|
||
|
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="${SYNOPKG_PKGDEST}/bin/tailscaled \
|
||
|
--state=${STATE_FILE} \
|
||
|
--socket=${SOCKET_FILE} \
|
||
|
--port=$PORT"
|
||
|
|
||
|
if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -eq "7" -a ! -e "/dev/net/tun" ]; then
|
||
|
# TODO(maisem/crawshaw): Disable the tun device in DSM7 for now.
|
||
|
SERVICE_COMMAND="${SERVICE_COMMAND} --tun=userspace-networking"
|
||
|
fi
|
||
|
|
||
|
if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -eq "6" ]; then
|
||
|
chown -R tailscale:tailscale "${PKGVAR}/"
|
||
|
fi
|
||
|
|
||
|
start_daemon() {
|
||
|
local ts=$(date --iso-8601=second)
|
||
|
echo "${ts} Starting ${SERVICE_NAME} with: ${SERVICE_COMMAND}" >${LOG_FILE}
|
||
|
STATE_DIRECTORY=${PKGVAR} ${SERVICE_COMMAND} 2>&1 | sed -u '1,200p;201s,.*,[further tailscaled logs suppressed],p;d' >>${LOG_FILE} &
|
||
|
# We pipe tailscaled's output to sed, so "$!" retrieves the PID of sed not tailscaled.
|
||
|
# Use jobs -p to retrieve the PID of the most recent process group leader.
|
||
|
jobs -p >"${PID_FILE}"
|
||
|
}
|
||
|
|
||
|
stop_daemon() {
|
||
|
if [ -r "${PID_FILE}" ]; then
|
||
|
local PID=$(cat "${PID_FILE}")
|
||
|
local ts=$(date --iso-8601=second)
|
||
|
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() {
|
||
|
if [ -r "${PID_FILE}" ]; then
|
||
|
local PID=$(cat "${PID_FILE}")
|
||
|
if ps -o pid -p ${PID} > /dev/null; then
|
||
|
return
|
||
|
fi
|
||
|
rm -f "${PID_FILE}" >/dev/null
|
||
|
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
|
||
|
}
|
||
|
|
||
|
ensure_tun_created() {
|
||
|
if [ "${SYNOPKG_DSM_VERSION_MAJOR}" -eq "7" ]; then
|
||
|
# TODO(maisem/crawshaw): Disable the tun device in DSM7 for now.
|
||
|
return
|
||
|
fi
|
||
|
# Create the necessary file structure for /dev/net/tun
|
||
|
if ([ ! -c /dev/net/tun ]); then
|
||
|
if ([ ! -d /dev/net ]); then
|
||
|
mkdir -m 755 /dev/net
|
||
|
fi
|
||
|
mknod /dev/net/tun c 10 200
|
||
|
chmod 0755 /dev/net/tun
|
||
|
fi
|
||
|
|
||
|
# Load the tun module if not already loaded
|
||
|
if (!(lsmod | grep -q "^tun\s")); then
|
||
|
insmod /lib/modules/tun.ko
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
case $1 in
|
||
|
start)
|
||
|
if daemon_status; then
|
||
|
exit 0
|
||
|
else
|
||
|
ensure_tun_created
|
||
|
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
|