Documentation restructuring: provide a useful overview.
[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 ### BEGIN INIT INFO
7 # Provides: tripe
8 # Required-Start: $local_fs $remote_fs $named $network
9 # Required-Stop: $local_fs $remote_fs $network
10 # Default-Start: 2 3 4 5
11 # Default-Stop: 0 1 6
12 # Short-Description: tripe Virtual Private Network server
13 ### END INIT INFO
14
15 set -e
16
17 ###--------------------------------------------------------------------------
18 ### Configuration.
19
20 [ -f @initconfig@ ] && . @initconfig@
21
22 : ${prefix=@prefix@} ${exec_prefix=@exec_prefix@}
23 : ${bindir=@bindir@} ${sbindir=@sbindir@}
24 : ${TRIPEDIR=@configdir@} ${TRIPESOCK=@socketdir@/tripesock}
25 : ${pidfile=@pidfile@}
26 : ${tripe=$sbindir/tripe} ${tripectl=$bindir/tripectl}
27
28 PATH=/usr/bin:/usr/sbin:/bin:/sbin:$bindir
29 export PATH TRIPEDIR TRIPESOCK TRIPE_SLIPIF
30
31 ###--------------------------------------------------------------------------
32 ### Pre-flight checks.
33
34 ## Give up if there's no binary.
35 if test ! -x "$tripe" || test ! -x "$tripectl"; then
36 echo >&2 "Not starting/stopping TrIPE: binary files missing"
37 exit 0
38 fi
39
40 ## Give up if there's no key.
41 if test ! -f "$TRIPEDIR/keyring" || test ! -f "$TRIPEDIR/keyring.pub"; then
42 echo >&2 "Not starting/stopping TrIPE: keyring files missing"
43 exit 0
44 fi
45
46 ## Check it will work, or at least stands a fighting chance.
47 ##
48 ## (Having loads of different tunnel types doesn't help any.)
49 case ${tunnel-`$tripe --tunnels | head -1`},`uname -s` in
50
51 ## Linux TUN/TAP.
52 linux,Linux)
53 if { test -f /proc/misc && grep -q tun /proc/misc; } ||
54 modprobe -q tun; then
55 : good
56 else
57 echo >&2 "$tripe needs the Linux TUN/TAP driver to run."
58 exit 1
59 fi
60 if test -c /dev/net/tun; then
61 : good
62 else
63 echo >&2 "$tripe needs /dev/net/tun, which is missing."
64 exit 1
65 fi
66 ;;
67
68 ## Linux Unet (obsolete).
69 unet,Linux)
70 if { test -f /proc/devices && grep -q unet /proc/devices; } ||
71 modprobe -q unet; then
72 : good
73 else
74 echo >&2 "$tripe needs the Linux UNET driver to run."
75 exit 1
76 fi
77 if test -c /dev/unet; then
78 : good
79 else
80 echo >&2 "$tripe needs /dev/unet, which is missing."
81 exit 1
82 fi
83 ;;
84
85 ## BSD tun.
86 bsd,*BSD)
87 ## Don't know how to check the device is working. Check the device file
88 ## exists and hope for the best.
89 if test -c /dev/tun0; then
90 : good
91 else
92 echo >&2 "$tripe needs /dev/tun0, which is missing."
93 exit 1
94 fi
95 ;;
96
97 ## SLIP.
98 slip,*)
99 if test "$TRIPE_SLIPIF" = ""; then
100 echo >&2 "$tripe needs SLIP interfaces set up!"
101 exit 1
102 fi
103 ;;
104
105 ## Various kinds of misconfiguration.
106 linux,* | unet,*)
107 echo >&2 "CONFIGURATION ERROR"
108 echo >&2 " $tripe is compiled to use a Linux tunnel device, but"
109 echo >&2 " this system is `uname -s`"
110 exit 1
111 ;;
112 bsd,*)
113 echo >&2 "CONFIGURATION ERROR"
114 echo >&2 " $tripe is compiled to use a BSD tunnel device, but"
115 echo >&2 " this system is `uname -s`"
116 exit 1
117 ;;
118 esac
119
120 ###--------------------------------------------------------------------------
121 ### Do what was wanted.
122
123 case "$1" in
124
125 start)
126 echo -n "Starting TrIPE VPN daemon:"
127
128 ## Check to see whether the daemon is already going. If it can respond
129 ## to a simple request, we'll assume that it is.
130 if $tripectl version >/dev/null 2>/dev/null; then
131 echo " already running"
132 exit 0
133 fi
134
135 ## Start the server, passing lots of arguments.
136 $tripectl -D -s -p$tripe \
137 -f${logfile-@logfile@} \
138 -P$pidfile \
139 ${keytag+-S-t}$keytag \
140 ${addr+-S-b}$addr \
141 ${port+-S-p}${port} \
142 ${user+-U}${user} \
143 ${group+-G}${group} \
144 ${trace+-S-T}${trace} \
145 ${tunnel+-S-n}${tunnel} \
146 ${miscopts}
147
148 ## Wait for the server to start up. This doesn't usually take long.
149 for i in 1 2 3 4 give-up; do
150 $tripectl help >/dev/null 2>/dev/null && break
151 sleep 1
152 done
153
154 if [ $i = give-up ]; then
155 echo " wouldn't start"
156 exit 1
157 fi
158
159 echo -n " tripe"
160
161 ## Start up the ancillary services.
162 sep=" services [" end=""
163 [ -d $TRIPEDIR/services ] && for i in $TRIPEDIR/services/*; do
164 [ -x $i ] || continue
165 name=`basename $i`
166 case $name in *~|\#*) continue;; esac
167 if $i --daemon --startup; then
168 echo -n "$sep$name"
169 else
170 echo -n "$sep($name failed)"
171 fi
172 sep=" " end="]"
173 done
174 echo -n "$end"
175
176 ## Start up the statically configured peers.
177 sep=" peers [" end=""
178 [ -d $TRIPEDIR/peers ] && for i in $TRIPEDIR/peers/*; do
179 [ -x $i ] || continue
180 name=`basename $i`
181 case $name in *~|\#*) continue;; esac
182 if $i; then
183 echo -n "$sep$name"
184 else
185 echo -n "$sep($name failed)"
186 fi
187 sep=" " end="]"
188 done
189
190 ## Happy.
191 echo "$end done"
192 ;;
193
194 stop)
195 echo -n "Stopping TrIPE VPN daemon:"
196
197 ## If there's no socket, it must have quit (probably nonviolently).
198 if test ! -S $TRIPESOCK; then
199 echo " not running"
200
201 ## Ask it to die nicely.
202 elif $tripectl quit >/dev/null 2>&1; then
203 echo " done"
204
205 ## If there's no pidfile then tripectl presumably deleted it.
206 elif test ! -f $pidfile; then
207 echo " stale socket found: removing"
208 rm -f $TRIPESOCK
209
210 ## Otherwise kill the process unpleasantly.
211 elif kill `cat $pidfile`; then
212 echo " done (killed violently)"
213 else
214 echo " it doesn't want to die!"
215 exit 1
216 fi
217 ;;
218
219 status)
220 for i in `$tripectl list`; do
221 echo "Peer \`$i':"
222 $tripectl stats $i | sed 's/^/ /'
223 done
224 ;;
225
226 reload)
227 $tripectl reload
228 echo "Keyrings reloaded OK."
229 ;;
230
231 restart | force-reload)
232 sh $0 stop
233 sh $0 start
234 ;;
235
236 *)
237 echo >&2 "usage: $0 start|stop|restart|status|reload|force-reload"
238 exit 1
239 ;;
240
241 esac
242
243 ###----- That's all, folks --------------------------------------------------