start-stop-status.sh 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. #!/bin/sh
  2. PKGVAR=/var/packages/zerotier/var
  3. ZTO_PID_FILE="$PKGVAR/zerotier-one.pid"
  4. WAT_PID_FILE="$PKGVAR/zerotier-watchdog.pid"
  5. ZTO_LOG_FILE="$PKGVAR/zerotier-one.log"
  6. log()
  7. {
  8. local timestamp=$(date --iso-8601=second)
  9. echo "$timestamp $1" >> $ZTO_LOG_FILE
  10. }
  11. configure_tun()
  12. {
  13. log "Checking for TUN device"
  14. # Create /dev/net/tun if needed
  15. if ( [ ! -c /dev/net/tun ] ); then
  16. if ( [ ! -d /dev/net ] ); then
  17. mkdir -m 755 /dev/net
  18. fi
  19. log "Adding TUN device"
  20. mknod /dev/net/tun c 10 200
  21. chmod 0755 /dev/net/tun
  22. fi
  23. # Load TUN kernel module
  24. if ( !( lsmod | grep -q "^tun\s" ) ); then
  25. log "Loading TUN kernel module"
  26. insmod /lib/modules/tun.ko
  27. fi
  28. }
  29. configure_cli()
  30. {
  31. # Create ZT CLI symlinks if needed
  32. mkdir -p /usr/local/bin/
  33. ln -s $SYNOPKG_PKGDEST/bin/zerotier-one /usr/local/bin/zerotier-cli
  34. ln -s $SYNOPKG_PKGDEST/bin/zerotier-one /usr/local/bin/zerotier-idtool
  35. rm -rf /var/lib/zerotier-one
  36. ln -s /var/packages/zerotier/var /var/lib/zerotier-one
  37. }
  38. apply_routes()
  39. {
  40. echo $BASHPID >> $WAT_PID_FILE
  41. log "Started Watchdog ($(cat $WAT_PID_FILE))"
  42. # Wait for ZT service to come online before attempting queries
  43. sleep 15
  44. # Loop until killed, check for required routes and add if needed
  45. while true
  46. do
  47. NETWORK_COUNT=$(zerotier-cli -j listnetworks | jq -r '. | length')
  48. if [ "$NETWORK_COUNT" -gt 0 ]; then
  49. for ((j=0; j<=$((NETWORK_COUNT-1)); j++))
  50. do
  51. ROUTE_COUNT=$(zerotier-cli -j listnetworks | jq -r '.['$j'].routes | length')
  52. for ((k=0; k<=$((ROUTE_COUNT-1)); k++))
  53. do
  54. ROUTE=$(zerotier-cli -j listnetworks | jq -r '.['$j'].routes['$k'].target')
  55. EXIST=$(ip route show $ROUTE | wc -l)
  56. if [ $EXIST -eq 0 ];
  57. then
  58. IFNAME=$(zerotier-cli -j listnetworks | jq -r '.['$j'] | .portDeviceName')
  59. ip route add $ROUTE dev $IFNAME
  60. log "Added route $ROUTE to dev $IFNAME"
  61. # Routes will be deleted when ZT brings the interface down
  62. fi
  63. done
  64. done
  65. fi
  66. sleep 15
  67. done
  68. }
  69. configure_routes()
  70. {
  71. if [ -r "${WAT_PID_FILE}" ]; then
  72. exit 0
  73. else
  74. apply_routes &
  75. fi
  76. }
  77. start_daemon()
  78. {
  79. ${SYNOPKG_PKGDEST}/bin/zerotier-one $PKGVAR -d
  80. echo $(pidof zerotier-one) > ${ZTO_PID_FILE}
  81. log "Started ZeroTier ($(cat $ZTO_PID_FILE))"
  82. }
  83. stop_daemon() {
  84. if [ -r "$ZTO_PID_FILE" ]; then
  85. local ZTO_PID=$(cat "${ZTO_PID_FILE}")
  86. log "Stopped ZeroTier ($(cat $ZTO_PID_FILE))"
  87. kill -TERM $ZTO_PID
  88. wait_for_status 1 || kill -KILL $PID >> $LOG_FILE 2>&1
  89. rm -f $ZTO_PID_FILE > /dev/null
  90. fi
  91. if [ -r "$WAT_PID_FILE" ]; then
  92. local WAT_PID=$(cat "${WAT_PID_FILE}")
  93. log "Stopped Watchdog ($(cat $WAT_PID_FILE))"
  94. kill -TERM $WAT_PID
  95. rm -f $WAT_PID_FILE > /dev/null
  96. fi
  97. }
  98. daemon_status()
  99. {
  100. if [ -f $ZTO_PID_FILE ] && kill -0 `cat $ZTO_PID_FILE` > /dev/null 2>&1; then
  101. return
  102. fi
  103. rm -f $ZTO_PID_FILE
  104. return 1
  105. }
  106. wait_for_status()
  107. {
  108. counter=$2
  109. while [ $counter -gt 0 ]; do
  110. daemon_status
  111. [ $? -eq $1 ] && return
  112. let counter=counter-1
  113. sleep 1
  114. done
  115. return 1
  116. }
  117. case "$1" in
  118. start)
  119. if ( pidof zerotier-one ); then
  120. exit 0
  121. else
  122. configure_tun
  123. configure_cli
  124. start_daemon
  125. configure_routes
  126. fi
  127. ;;
  128. stop)
  129. if ( pidof zerotier-one ); then
  130. stop_daemon
  131. else
  132. exit 0
  133. fi
  134. ;;
  135. status)
  136. if ( pidof zerotier-one ); then
  137. exit 0
  138. else
  139. exit 1
  140. fi
  141. ;;
  142. *)
  143. exit 1
  144. ;;
  145. esac
  146. exit 0