chiark / gitweb /
debian: Run the server as `tripe' rather than `root'.
[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 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+-U}${user} \
126       ${group+-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     sep=" services [" end=""
140     [ -d $TRIPEDIR/services ] && for i in $TRIPEDIR/services/*; do
141       [ -x $i ] || continue
142       name=`basename $i`
143       case $name in *~|\#*) continue;; esac
144       if $i --daemon --startup; then
145         echo -n "$sep$name"
146       else
147         echo -n "$sep($name failed)"
148       fi
149       sep=" " end="]"
150     done
151     echo -n "$end"
152     sep=" peers [" end=""
153     [ -d $TRIPEDIR/peers ] && for i in $TRIPEDIR/peers/*; do
154       [ -x $i ] || continue
155       name=`basename $i`
156       case $name in *~|\#*) continue;; esac
157       if $i; then
158         echo -n "$sep$name"
159       else
160         echo -n "$sep($name failed)"
161       fi
162       sep=" " end="]"
163     done
164     echo "$end done"
165     ;;
166   stop)
167     echo -n "Stopping TrIPE VPN daemon:"
168     if test ! -S $TRIPESOCK; then
169       echo " not running"
170     elif $tripectl quit >/dev/null 2>&1; then
171       echo " done"
172     elif test ! -f $pidfile; then
173       echo " stale socket found: removing"
174       rm -f $TRIPESOCK
175     elif kill `cat $pidfile`; then
176       echo " done (killed violently)"
177     else
178       echo " it doesn't want to die!"
179       exit 1
180     fi
181     ;;
182   status)
183     for i in `$tripectl list`; do
184       echo "Peer \`$i':"
185       $tripectl stats $i | sed 's/^/  /'
186     done
187     ;;
188   reload)
189     $tripectl reload
190     echo "Keyrings reloaded OK."
191     ;;
192   restart | force-reload)
193     sh $0 stop
194     sh $0 start
195     ;;
196   *)
197     echo >&2 "usage: $0 start|stop|restart|status|reload|force-reload"
198     exit 1
199     ;;
200 esac