| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- #!/bin/sh
- PKGVAR=/var/packages/zerotier/var
- ZTO_PID_FILE="$PKGVAR/zerotier-one.pid"
- WAT_PID_FILE="$PKGVAR/zerotier-watchdog.pid"
- ZTO_LOG_FILE="$PKGVAR/zerotier-one.log"
- log()
- {
- local timestamp=$(date --iso-8601=second)
- echo "$timestamp $1" >> $ZTO_LOG_FILE
- }
- configure_tun()
- {
- log "Checking for TUN device"
- # Create /dev/net/tun if needed
- if ( [ ! -c /dev/net/tun ] ); then
- if ( [ ! -d /dev/net ] ); then
- mkdir -m 755 /dev/net
- fi
- log "Adding TUN device"
- mknod /dev/net/tun c 10 200
- chmod 0755 /dev/net/tun
- fi
- # Load TUN kernel module
- if ( !( lsmod | grep -q "^tun\s" ) ); then
- log "Loading TUN kernel module"
- insmod /lib/modules/tun.ko
- fi
- }
- configure_cli()
- {
- # Create ZT CLI symlinks if needed
- mkdir -p /usr/local/bin/
- ln -s $SYNOPKG_PKGDEST/bin/zerotier-one /usr/local/bin/zerotier-cli
- ln -s $SYNOPKG_PKGDEST/bin/zerotier-one /usr/local/bin/zerotier-idtool
- rm -rf /var/lib/zerotier-one
- ln -s /var/packages/zerotier/var /var/lib/zerotier-one
- }
- apply_routes()
- {
- echo $BASHPID >> $WAT_PID_FILE
- log "Started Watchdog ($(cat $WAT_PID_FILE))"
- # Wait for ZT service to come online before attempting queries
- sleep 15
- # Loop until killed, check for required routes and add if needed
- while true
- do
- NETWORK_COUNT=$(zerotier-cli -j listnetworks | jq -r '. | length')
- if [ "$NETWORK_COUNT" -gt 0 ]; then
- for ((j=0; j<=$((NETWORK_COUNT-1)); j++))
- do
- ROUTE_COUNT=$(zerotier-cli -j listnetworks | jq -r '.['$j'].routes | length')
- for ((k=0; k<=$((ROUTE_COUNT-1)); k++))
- do
- ROUTE=$(zerotier-cli -j listnetworks | jq -r '.['$j'].routes['$k'].target')
- EXIST=$(ip route show $ROUTE | wc -l)
- if [ $EXIST -eq 0 ];
- then
- IFNAME=$(zerotier-cli -j listnetworks | jq -r '.['$j'] | .portDeviceName')
- ip route add $ROUTE dev $IFNAME
- log "Added route $ROUTE to dev $IFNAME"
- # Routes will be deleted when ZT brings the interface down
- fi
- done
- done
- fi
- sleep 15
- done
- }
- configure_routes()
- {
- if [ -r "${WAT_PID_FILE}" ]; then
- exit 0
- else
- apply_routes &
- fi
- }
- start_daemon()
- {
- ${SYNOPKG_PKGDEST}/bin/zerotier-one $PKGVAR -d
- echo $(pidof zerotier-one) > ${ZTO_PID_FILE}
- log "Started ZeroTier ($(cat $ZTO_PID_FILE))"
- }
- stop_daemon() {
- if [ -r "$ZTO_PID_FILE" ]; then
- local ZTO_PID=$(cat "${ZTO_PID_FILE}")
- log "Stopped ZeroTier ($(cat $ZTO_PID_FILE))"
- kill -TERM $ZTO_PID
- wait_for_status 1 || kill -KILL $PID >> $LOG_FILE 2>&1
- rm -f $ZTO_PID_FILE > /dev/null
- fi
- if [ -r "$WAT_PID_FILE" ]; then
- local WAT_PID=$(cat "${WAT_PID_FILE}")
- log "Stopped Watchdog ($(cat $WAT_PID_FILE))"
- kill -TERM $WAT_PID
- rm -f $WAT_PID_FILE > /dev/null
- fi
- }
- daemon_status()
- {
- if [ -f $ZTO_PID_FILE ] && kill -0 `cat $ZTO_PID_FILE` > /dev/null 2>&1; then
- return
- fi
- rm -f $ZTO_PID_FILE
- return 1
- }
- wait_for_status()
- {
- counter=$2
- while [ $counter -gt 0 ]; do
- daemon_status
- [ $? -eq $1 ] && return
- let counter=counter-1
- sleep 1
- done
- return 1
- }
- case "$1" in
- start)
- if ( pidof zerotier-one ); then
- exit 0
- else
- configure_tun
- configure_cli
- start_daemon
- configure_routes
- fi
- ;;
- stop)
- if ( pidof zerotier-one ); then
- stop_daemon
- else
- exit 0
- fi
- ;;
- status)
- if ( pidof zerotier-one ); then
- exit 0
- else
- exit 1
- fi
- ;;
- *)
- exit 1
- ;;
- esac
- exit 0
|