chiark / gitweb /
bac4e7f2dc7d851c8f5a81892b603d7b0b88c4ad
[tripe] / init / tripe-init.in
1 #! /bin/sh
2 #
3 # tripe init script
4 #   suitable for direct use in most SysV-style inits
5
6 set -e
7
8 # --- Setup ---
9
10 [ -f @initconfig@ ] && . @initconfig@
11 : ${prefix=@prefix@} ${exec_prefix=@exec_prefix@}
12 : ${bindir=@bindir@} ${sbindir=@sbindir@}
13 : ${TRIPEDIR=@configdir@} ${TRIPESOCK=@socketdir@/tripesock}
14 : ${pidfile=@pidfile@}
15 : ${tripe=$sbindir/tripe} ${tripectl=$bindir/tripectl}
16 PATH=/usr/bin:/usr/sbin:/bin:/sbin:$bindir
17 export PATH TRIPEDIR TRIPESOCK
18
19 # --- Give up if there's no key ---
20
21 if test ! -f $TRIPEDIR/keyring || test ! -f $TRIPEDIR/keyring.pub; then
22   echo >&2 "Not starting/stopping TrIPE: keyring files missing"
23   exit 0
24 fi
25
26 # --- Check it will work, or at least stands a fighting chance ---
27 #
28 # Having loads of different tunnel types doesn't help any.
29
30 test -x $tripe -a -x $tripectl || exit 0
31
32 case ${tunnel-`$tripe --tunnels | head -1`} in
33   linux)
34     case `uname -s` in
35       Linux)
36         if { test -f /proc/misc && grep -q net/tun /proc/misc; } ||
37            modprobe -q tun; then
38           : good
39         else
40           echo >&2 "$tripe needs the Linux TUN/TAP driver to run."
41           exit 1
42         fi
43         if test -c /dev/net/tun; then
44           : good
45         else
46           echo >&2 "$tripe needs /dev/net/tun, which is missing."
47           exit 1
48         fi
49         ;;
50       *)
51         echo >&2 "CONFIGURATION ERROR"
52         echo >&2 "  $tripe is compiled to use a Linux tunnel device, but"
53         echo >&2 "  this system is `uname -s`"
54         exit 1
55         ;;
56     esac
57     ;;
58   unet)
59     case `uname -s` in
60       Linux)
61         if { test -f /proc/devices && grep -q unet /proc/devices; } ||
62            modprobe -q unet; then
63           : good
64         else
65           echo >&2 "$tripe needs the Linux UNET driver to run."
66           exit 1
67         fi
68         if test -c /dev/unet; then
69           : good
70         else
71           echo >&2 "$tripe needs /dev/unet, which is missing."
72           exit 1
73         fi
74         ;;
75       *)
76         echo >&2 "CONFIGURATION ERROR"
77         echo >&2 "  $tripe is compiled to use a Linux tunnel device, but"
78         echo >&2 "  this system is `uname -s`"
79         exit 1
80         ;;
81     esac
82     ;;
83   bsd)
84     case `uname -s` in
85       *BSD)
86         # Don't know how to check the device is working.
87         if test -c /dev/tun0; then
88           : good
89         else
90           echo >&2 "$tripe needs /dev/tun0, which is missing."
91           exit 1
92         fi
93         ;;
94       *)
95         echo >&2 "CONFIGURATION ERROR"
96         echo >&2 "  $tripe is compiled to use a BSD tunnel device, but"
97         echo >&2 "  this system is `uname -s`"
98         exit 1
99         ;;
100     esac
101     ;;
102   slip)
103     if test "$TRIPE_SLIPIF" = ""; then
104       echo >&2 "$tripe needs SLIP interfaces set up!"
105       exit 1
106     fi
107     ;;
108 esac
109
110 # --- Do what was wanted ---
111
112 case "$1" in
113   start)
114     echo -n "Starting TrIPE VPN daemon:"
115     if $tripectl version >/dev/null 2>/dev/null; then
116       echo " already running"
117       exit 0
118     fi
119     $tripectl -D -s -p$tripe \
120       -f${logfile-@logfile@} \
121       -P$pidfile \
122       ${keytag+-S-t}$keytag \
123       ${addr+-S-b}$addr \
124       ${port+-S-p}${port} \
125       ${user+-S-u}${user} \
126       ${group+-S-g}${group} \
127       ${trace+-S-T}${trace} \
128       ${tunnel+-S-n}${tunnel} \
129       ${miscopts}
130     for i in 1 2 3 4 give-up; do
131       $tripectl help >/dev/null 2>/dev/null && break
132       sleep 1
133     done
134     if [ $i = give-up ]; then
135       echo " wouldn't start"
136       exit 1
137     fi
138     echo -n " tripe"
139     for i in $TRIPEDIR/peers/*; do
140       [ -x $i ] || continue
141       name=`basename $i`
142       case $name in *~|\#*) continue;; esac
143       if $i; then
144         echo -n " $name"
145       else
146         echo -n " ($name failed)"
147       fi
148     done
149     echo " done"
150     ;;
151   stop)
152     echo -n "Stopping TrIPE VPN daemon:"
153     if test ! -S $TRIPESOCK; then
154       echo " not running"
155     elif $tripectl quit >/dev/null 2>&1; then
156       echo " done"
157     elif test ! -f $pidfile; then
158       echo " stale socket found: removing"
159       rm -f $TRIPESOCK
160     elif kill `cat $pidfile`; then
161       echo " done (killed violently)"
162     else
163       echo " it doesn't want to die!"
164       exit 1
165     fi
166     ;;
167   status)
168     for i in `$tripectl list`; do
169       echo "Peer \`$i':"
170       $tripectl stats $i | sed 's/^/  /'
171     done
172     ;;
173   reload)
174     $tripectl reload
175     echo "Keyrings reloaded OK."
176     ;;
177   restart | force-reload)
178     sh $0 stop
179     sh $0 start
180     ;;
181   *)
182     echo >&2 "usage: $0 start|stop|restart|status|reload|force-reload"
183     exit 1
184     ;;
185 esac