53f653883e5d363ceb6a6df8c3c4dd11c71ed261
[openwrt/svn-archive/archive.git] / net / sshtunnel / files / etc / init.d / sshtunnel
1 #!/bin/sh /etc/rc.common
2
3 START=99
4 STOP=01
5
6 PIDFILE="/tmp/run/sshtunnel"
7
8 load_server() {
9 server="$1"
10
11 config_get user $1 user
12 config_get hostname $1 hostname
13 config_get debuglevel $1 debuglevel "0"
14 config_get retrydelay $1 retrydelay "10"
15 config_get CheckHostIP $1 CheckHostIP
16 config_get Compression $1 Compression
17 config_get CompressionLevel $1 CompressionLevel
18 config_get IdentityFile $1 IdentityFile
19 config_get LogLevel $1 LogLevel
20 config_get ServerAliveCountMax $1 ServerAliveCountMax
21 config_get ServerAliveInterval $1 ServerAliveInterval
22 config_get StrictHostKeyChecking $1 StrictHostKeyChecking
23 config_get TCPKeepAlive $1 TCPKeepAlive
24 config_get VerifyHostKeyDNS $1 VerifyHostKeyDNS
25
26 error=""
27 [ -n "$user" ] || error="user is not set"
28 [ -n "$hostname" ] || error="${error:+$error; }hostname is not set"
29 [ "$retrydelay" -ge 0 ] || error="${error:+$error; }retrydelay must be a positive integer"
30 #[ -f "$IdentityFile" ] || error="${error:+$error; }IdentityFile $IdentityFile not accessible"
31 #add validation for the rest of the parameters
32 [ -n "$error" ] && { logger -p user.err -t "sshtunnel" "tunnels to $server not started - $error"; return; }
33
34 tunnels_cmd=""
35 count=0
36 config_foreach load_tunnel tunnelR && config_foreach load_tunnel tunnelL
37 [ -n "$error" ] && { logger -p user.err -t "sshtunnel" "tunnels to $server not started - $error"; return; }
38 [ "$count" -eq 0 ] && { logger -p user.err -t "sshtunnel" "tunnels to $server not started - no tunnels defined"; return; }
39
40 cmd="${CheckHostIP:+-o CheckHostIP=$CheckHostIP }"
41 cmd="$cmd${CheckHostIP:+-o CheckHostIP=$CheckHostIP }"
42 cmd="$cmd${Compression:+-o Compression=$Compression }"
43 cmd="$cmd${CompressionLevel:+-o CompressionLevel=$CompressionLevel }"
44 cmd="$cmd${IdentityFile:+-o IdentityFile=$IdentityFile }"
45 cmd="$cmd${LogLevel:+-o LogLevel=$LogLevel }"
46 cmd="$cmd${ServerAliveCountMax:+-o ServerAliveCountMax=$ServerAliveCountMax }"
47 cmd="$cmd${ServerAliveInterval:+-o ServerAliveInterval=$ServerAliveInterval }"
48 cmd="$cmd${StrictHostKeyChecking:+-o StrictHostKeyChecking=$StrictHostKeyChecking }"
49 cmd="$cmd${TCPKeepAlive:+-o TCPKeepAlive=$TCPKeepAlive }"
50 cmd="$cmd${VerifyHostKeyDNS:+-o VerifyHostKeyDNS=$VerifyHostKeyDNS }"
51 cmd="$cmd""-o ExitOnForwardFailure=yes -o BatchMode=yes -nN $tunnels_cmd $user@$hostname"
52
53 /usr/bin/sshtunnel.sh "$cmd" "$retrydelay" "$server" &
54 echo $! >> "$PIDFILE".pids
55 logger -p user.info -t "sshtunnel" "started tunnels to $server (pid=$!;retrydelay=$retrydelay)"
56 }
57
58 load_tunnel() {
59 config_get section_server $1 server
60 [ "$server" = "$section_server" ] || return 0 # continue to read next section if this is not for the current server
61 let count++ # count nr of valid sections to make sure there are at least one
62
63 config_get remoteport $1 remoteport
64 config_get localport $1 localport
65 [ "$cfgtype" = "tunnelL" ] && {
66 config_get localaddress $1 localaddress "*"
67 config_get remoteaddress $1 remoteaddress
68 }
69 [ "$cfgtype" = "tunnelR" ] && {
70 config_get localaddress $1 localaddress
71 config_get remoteaddress $1 remoteaddress "*"
72 }
73
74 [ "$remoteport" -gt 0 ] || error="remoteport must be a positive integer"
75 [ "$localport" -gt 0 ] || error="${error:+$error; }localpost must be a positive integer"
76 [ -n "$error" ] && return 1
77
78 [ "$cfgtype" = "tunnelL" ] && {
79 tunnels_cmd="${tunnels_cmd:+$tunnels_cmd }-L $localaddress:$localport:$remoteaddress:$remoteport"
80 }
81 [ "$cfgtype" = "tunnelR" ] && {
82 tunnels_cmd="${tunnels_cmd:+$tunnels_cmd }-R $remoteaddress:$remoteport:$localaddress:$localport"
83 }
84 }
85
86 stop() {
87 if [ -f "$PIDFILE".pids ]
88 then
89 logger -p user.info -t "sshtunnel" "stopping all tunnels"
90
91 while read pid
92 do
93 start-stop-daemon -K -p "$PIDFILE"_"$pid".pid
94 kill $pid
95 logger -p daemon.info -t "sshtunnel[$pid]" "tunnel stopped"
96 rm "$PIDFILE"_"$pid".pid
97 done < "$PIDFILE".pids
98
99 rm "$PIDFILE".pids
100
101 logger -p user.info -t "sshtunnel" "all tunnels stopped"
102 else
103 logger -p user.info -t "sshtunnel" "no tunnels running"
104 fi
105 }
106
107 start() {
108 [ -f "$PIDFILE".pids ] && stop
109
110 config_load sshtunnel
111 if [ -n "$(uci show sshtunnel.@server[0])" ] # at least one server section exists
112 then
113 logger -p user.info -t "sshtunnel" "starting all tunnels"
114 config_foreach load_server server
115 logger -p user.info -t "sshtunnel" "all tunnels started"
116 else
117 logger -p user.info -t "sshtunnel" "no servers defined"
118 fi
119 }