Initial version.
[tunneluser] / bin / init
1 #! /bin/sh
2
3 ### BEGIN INIT INFO
4 # Provides: tunnel
5 # Required-Start: $remote_fs $syslog
6 # Required-Stop: $remote_fs $syslog
7 # Default-Start: 2 3 4 5
8 # Default-Stop: 0 1 6
9 # Short-Description: Outbound SSH tunnels
10 # Description: This script starts or stops the outbound SSH tunnels
11 # maintained by the `tunnel' user.
12 ### END INIT INFO
13
14 # Author: Mark Wooding <mdw@distorted.org.uk>
15
16 ## Initial configuration.
17 PATH=/sbin:/usr/sbin:/bin:/usr/bin
18 DESC="outbound SSH tunnels"
19 TUNUSER=tunnel
20 RUN=/var/run/$TUNUSER
21 if [ -f /etc/default/tunnel ]; then . /etc/default/tunnel; fi
22 : ${TUNHOME=$(getent passwd "$TUNUSER" | cut -d: -f6)}
23 : ${TUNGROUP=$(id -g "$TUNUSER")}
24 if [ ! -x "$TUNHOME/bin/outbound" ]; then exit 0; fi
25 : ${tunnels=$(sed -n \
26 '/^Host[[:space:]]\+\([^[:space:]*]\|[^[:space:]].*[^[:space:]]\)[[:space:]]*$/s//\1/p' \
27 "$TUNHOME/.ssh/config")}
28
29 ## Scan the command-line.
30 case "$#" in
31 0) op=none ;;
32 1) op=$1; shift; set -- $tunnels ;;
33 *) op=$1; shift ;;
34 esac
35
36 ## Make sure that the runtime state directory exists. If not, create it with
37 ## sensible permissions. Don't override permissions if it already exists,
38 ## because presumably the administrator has fiddled them deliberately.
39 if [ ! -d "$RUN" ]; then
40 mkdir -m755 "$RUN"
41 chown "$TUNUSER:$TUNGROUP" "$RUN"
42 fi
43 cd "$RUN"
44
45 ## Utility to run the per-host script.
46 run_outbound () { sudo -u"$TUNUSER" "$TUNHOME/bin/outbound" "$@"; }
47
48 ## Utilities for doing things to individual hosts.
49 start () { run_outbound start "$1"; }
50 stop () { run_outbound stop "$1"; }
51 restart () { stop "$1"; start "$1"; }
52
53 ## Higher-order iterator to process a list of hosts.
54 foreach () {
55 whatting=$1 what=$2; shift 2
56 echo -n "$whatting $DESC:"
57 for i in "$@"; do
58 $what "$i"
59 echo -n " $i"
60 done
61 echo "."
62 }
63
64 ## Main dispatch.
65 case $op in
66 start) foreach "Starting" start "$@" ;;
67 stop) foreach "Stopping" stop "$@" ;;
68 restart | force-reload) foreach "Restarting" restart "$@" ;;
69 status)
70 for i in "$@"; do
71 echo -n "$i: "
72 run_outbound status "$i"
73 done
74 ;;
75 *)
76 echo >&2 "usage: $0 {start|stop|restart|status} [HOST ...]"
77 exit 1
78 ;;
79 esac