Add build number to datapath version and --version output from programs.
[sliver-openvswitch.git] / debian / openflow-switch.init
1 #! /bin/sh
2 #
3 # /etc/init.d/openflow-switch
4 #
5 # Written by Miquel van Smoorenburg <miquels@cistron.nl>.
6 # Modified for Debian by Ian Murdock <imurdock@gnu.ai.mit.edu>.
7 # Further changes by Javier Fernandez-Sanguino <jfs@debian.org>
8 # Modified for openflow-switch.
9 #
10 # Version:      @(#)skeleton  1.9  26-Feb-2001  miquels@cistron.nl
11 #
12 ### BEGIN INIT INFO
13 # Provides:          openflow-switch
14 # Required-Start:    $network $named $remote_fs $syslog
15 # Required-Stop:
16 # Default-Start:     2 3 4 5
17 # Default-Stop:      0 1 6
18 # Short-Description: OpenFlow switch
19 ### END INIT INFO
20
21 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
22 DAEMON=/usr/sbin/secchan
23 NAME=secchan
24 DESC=secchan
25
26 test -x $DAEMON || exit 0
27
28 LOGDIR=/var/log/openflow
29 PIDFILE=/var/run/$NAME.pid
30 DHCLIENT_PIDFILE=/var/run/dhclient.of0.pid
31 DODTIME=1                   # Time to wait for the server to die, in seconds
32                             # If this value is set too low you might not
33                             # let some servers to die gracefully and
34                             # 'restart' will not work
35
36 # Include secchan defaults if available
37 unset NETDEVS
38 unset MODE
39 unset SWITCH_IP
40 unset CONTROLLER
41 unset PRIVKEY
42 unset CERT
43 unset CACERT
44 unset CACERT_MODE
45 unset MGMT_VCONNS
46 unset COMMANDS
47 unset DAEMON_OPTS
48 default=/etc/default/openflow-switch
49 if [ -f $default ] ; then
50         . $default
51 fi
52
53 set -e
54
55 running_pid()
56 {
57     # Check if a given process pid's cmdline matches a given name
58     pid=$1
59     name=$2
60     [ -z "$pid" ] && return 1 
61     [ ! -d /proc/$pid ] &&  return 1
62     cmd=`cat /proc/$pid/cmdline | tr "\000" "\n"|head -n 1 |cut -d : -f 1`
63     # Is this the expected child?
64     case $cmd in
65         $name|*/$name)
66             return 0
67             ;;
68         *)
69             return 1
70             ;;
71     esac
72 }
73
74 running()
75 {
76 # Check if the process is running looking at /proc
77 # (works for all users)
78
79     # No pidfile, probably no daemon present
80     [ ! -f "$PIDFILE" ] && return 1
81     # Obtain the pid and check it against the binary name
82     pid=`cat $PIDFILE`
83     running_pid $pid $NAME || return 1
84     return 0
85 }
86
87 force_stop() {
88 # Forcefully kill the process
89     [ ! -f "$PIDFILE" ] && return
90     if running ; then
91         kill -15 $pid
92         # Is it really dead?
93         [ -n "$DODTIME" ] && sleep "$DODTIME"s
94         if running ; then
95             kill -9 $pid
96             [ -n "$DODTIME" ] && sleep "$DODTIME"s
97             if running ; then
98                 echo "Cannot kill $LABEL (pid=$pid)!"
99                 exit 1
100             fi
101         fi
102     fi
103     rm -f $PIDFILE
104     return 0
105 }
106
107 must_succeed() {
108     echo -n "$1: "
109     shift
110     if "$@"; then
111         echo "success."
112     else
113         echo " ERROR."
114         exit 1
115     fi
116 }
117
118 check_op() {
119     echo -n "$1: "
120     shift
121     if "$@"; then
122         echo "success."
123     else
124         echo " ERROR."
125     fi
126 }
127
128 configure_ssl() {
129     if (test "$CACERT_MODE" != secure && test "$CACERT_MODE" != bootstrap) \
130        || test ! -e "$PRIVKEY" || test ! -e "$CERT" \
131        || (test ! -e "$CACERT" && test "$CACERT_MODE" != bootstrap); then
132         if test "$CACERT_MODE" != secure && test "$CACERT_MODE" != bootstrap
133         then
134             echo "CACERT_MODE is not set to 'secure' or 'bootstrap'"
135         fi
136         if test ! -e "$PRIVKEY"; then
137             echo "$PRIVKEY: private key missing" >&2
138         fi
139         if test ! -e "$CERT"; then
140             echo "$CERT: certificate for private key missing" >&2
141         fi
142         if test ! -e "$CACERT" && test "$CACERT_MODE" != bootstrap; then
143             echo "$CACERT: CA certificate missing (and CA certificate bootstrapping not enabled)" >&2
144         fi
145         echo "Run ofp-switch-setup (in the openflow-switch-config package) or edit /etc/default/openflow-switch to configure" >&2
146         if test "$MODE" = discovery; then
147             echo "You may also delete or rename $PRIVKEY to disable SSL requirement" >&2
148         fi
149         exit 1
150     fi
151
152     SSL_OPTS="--private-key=$PRIVKEY --certificate=$CERT"
153     if test ! -e "$CACERT" && test "$CACERT_MODE" = bootstrap; then
154         SSL_OPTS="$SSL_OPTS --bootstrap-ca-cert=$CACERT"
155     else
156         SSL_OPTS="$SSL_OPTS --ca-cert=$CACERT"
157     fi
158 }
159
160 case "$1" in
161     start)
162         if test -z "$NETDEVS"; then
163             echo "$default: No network devices configured, switch disabled" >&2
164             echo "Run ofp-switch-setup (in the openflow-switch-config package) or edit /etc/default/openflow-switch to configure" >&2
165             exit 0
166         fi
167         if test "$MODE" = discovery; then
168             unset CONTROLLER
169         elif test "$MODE" = in-band || test "$MODE" = out-of-band; then
170             if test -z "$CONTROLLER"; then
171                 echo "$default: No controller configured and not configured for discovery, switch disabled" >&2
172                 echo "Run ofp-switch-setup (in the openflow-switch-config package) or edit /etc/default/openflow-switch to configure" >&2
173                 exit 0
174             fi
175         else
176             echo "$default: MODE must set to 'discovery', 'in-band', or 'out-of-band'" >&2
177             echo "Run ofp-switch-setup (in the openflow-switch-config package) or edit /etc/default/openflow-switch to configure" >&2
178             exit 1
179         fi
180         : ${PRIVKEY:=/etc/openflow-switch/of0-privkey.pem}
181         : ${CERT:=/etc/openflow-switch/of0-cert.pem}
182         : ${CACERT:=/etc/openflow-switch/cacert.pem}
183         case $CONTROLLER in
184             '')
185                 # Discovery mode.
186                 if test -e "$PRIVKEY"; then
187                     configure_ssl
188                 fi
189                 ;;
190             tcp:*)
191                 ;;
192             ssl:*)
193                 configure_ssl
194                 ;;
195             *)
196                 echo "$default: CONTROLLER must be in the form 'ssl:HOST[:PORT]' or 'tcp:HOST[:PORT]' when not in discovery mode" >&2
197                 echo "Run ofp-switch-setup (in the openflow-switch-config package) or edit /etc/default/openflow-switch to configure" >&2
198                 exit 1
199         esac
200
201         echo -n "Loading openflow_mod: "
202         if grep -q '^openflow_mod$' /proc/modules; then
203             echo "already loaded, nothing to do."
204         elif modprobe openflow_mod; then
205             echo "success."
206         else
207             echo "ERROR."
208             echo "openflow_mod has probably not been built for this kernel."
209             if ! test -d /usr/share/doc/openflow-datapath-source; then
210                 echo "Install the openflow-datapath-source package, then read"
211                 echo "/usr/share/doc/openflow-datapath-source/README.Debian"
212             else
213                 echo "For instructions, read"
214                 echo "/usr/share/doc/openflow-datapath-source/README.Debian"
215             fi
216             exit 1
217         fi
218
219         must_succeed "Adding datapath" dpctl adddp nl:0
220         for netdev in $NETDEVS; do
221             must_succeed "Adding $netdev to datapath" dpctl addif nl:0 $netdev
222         done
223
224         if test "$MODE" = in-band; then
225             if test "$SWITCH_IP" = dhcp; then
226                 must_succeed "Temporarily disabling of0" ifconfig of0 down
227             else
228                 COMMAND="ifconfig of0 $SWITCH_IP"
229                 if test -n "$SWITCH_NETMASK"; then
230                     COMMAND="$COMMAND netmask $SWITCH_NETMASK"
231                 fi
232                 must_succeed "Configuring of0: $COMMAND" $COMMAND
233                 if test -n "$SWITCH_GATEWAY"; then
234                     # This can fail because the route already exists,
235                     # so we don't insist that it succeed.
236                     COMMAND="route add default gw $SWITCH_GATEWAY"
237                     check_op "Adding default route: $COMMAND" $COMMAND
238                 fi
239             fi
240         else
241             must_succeed "Disabling of0" ifconfig of0 down
242         fi
243
244         MGMT_OPTS=
245         for vconn in $MGMT_VCONNS; do
246             MGMT_OPTS="$MGMT_OPTS --listen=$vconn"
247         done
248
249         COMMAND_OPT=
250         if test -n "$COMMANDS"; then
251             COMMAND_OPT="--command-acl=$COMMANDS"
252         fi
253
254         if test "$MODE" = out-of-band; then
255             DAEMON_OPTS="$DAEMON_OPTS --out-of-band"
256         fi
257
258         echo -n "Starting $DESC: "
259         start-stop-daemon --start --quiet --pidfile $PIDFILE \
260             --exec $DAEMON -- nl:0 $CONTROLLER --detach --pidfile=$PIDFILE \
261             --verbose=ANY:console:emer --verbose=ANY:syslog:err --log-file \
262             $DAEMON_OPTS $MGMT_OPTS $SSL_OPTS "$COMMAND_OPT"
263         if running; then
264             echo "$NAME."
265         else
266             echo " ERROR."
267         fi
268
269         if test "$MODE" = in-band && test "$SWITCH_IP" = dhcp; then
270             echo -n "Starting dhclient on of0: "
271             start-stop-daemon --start --quiet --pidfile $DHCLIENT_PIDFILE \
272                 --exec /sbin/dhclient -- -q -pf $DHCLIENT_PIDFILE of0
273             if running; then
274                 echo "dhclient."
275             else
276                 echo " ERROR."
277             fi
278         fi
279         ;;
280     stop)
281         if test -e /var/run/dhclient.of0.pid; then
282             echo -n "Stopping dhclient on of0: "
283             start-stop-daemon --stop --quiet --oknodo \
284                 --pidfile $DHCLIENT_PIDFILE --exec /sbin/dhclient
285             echo "dhclient."
286         fi            
287
288         echo -n "Stopping $DESC: "
289         start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE \
290             --exec $DAEMON
291         echo "$NAME."
292
293         for netdev in $NETDEVS; do
294             check_op "Removing $netdev from datapath" dpctl delif nl:0 $netdev
295         done
296         check_op "Deleting datapath" dpctl deldp nl:0
297         ;;
298     force-stop)
299         echo -n "Forcefully stopping $DESC: "
300         force_stop
301         if ! running; then
302             echo "$NAME."
303         else
304             echo " ERROR."
305         fi
306         ;;
307     reload)
308         ;;
309     force-reload)
310         start-stop-daemon --stop --test --quiet --pidfile \
311             $PIDFILE --exec $DAEMON \
312             && $0 restart \
313             || exit 0
314         ;;
315     restart)
316         $0 stop || true
317         $0 start
318         ;;
319     status)
320         echo -n "$LABEL is "
321         if running ;  then
322             echo "running"
323         else
324             echo " not running."
325             exit 1
326         fi
327         ;;
328     *)
329         N=/etc/init.d/$NAME
330         echo "Usage: $N {start|stop|restart|force-reload|status|force-stop}" >&2
331         exit 1
332         ;;
333 esac
334
335 exit 0