#!/bin/sh /etc/rc.common START=99 STOP=01 PIDFILE="/tmp/run/sshtunnel" load_server() { server="$1" config_get user $1 user config_get hostname $1 hostname config_get debuglevel $1 debuglevel "0" config_get retrydelay $1 retrydelay "10" config_get CheckHostIP $1 CheckHostIP config_get Compression $1 Compression config_get CompressionLevel $1 CompressionLevel config_get IdentityFile $1 IdentityFile config_get LogLevel $1 LogLevel config_get ServerAliveCountMax $1 ServerAliveCountMax config_get ServerAliveInterval $1 ServerAliveInterval config_get StrictHostKeyChecking $1 StrictHostKeyChecking config_get TCPKeepAlive $1 TCPKeepAlive config_get VerifyHostKeyDNS $1 VerifyHostKeyDNS error="" [ -n "$user" ] || error="user is not set" [ -n "$hostname" ] || error="${error:+$error; }hostname is not set" [ "$retrydelay" -ge 0 ] || error="${error:+$error; }retrydelay must be a positive integer" #[ -f "$IdentityFile" ] || error="${error:+$error; }IdentityFile $IdentityFile not accessible" #add validation for the rest of the parameters [ -n "$error" ] && { logger -p user.err -t "sshtunnel" "tunnels to $server not started - $error"; return; } tunnels_cmd="" count=0 config_foreach load_tunnel tunnelR && config_foreach load_tunnel tunnelL [ -n "$error" ] && { logger -p user.err -t "sshtunnel" "tunnels to $server not started - $error"; return; } [ "$count" -eq 0 ] && { logger -p user.err -t "sshtunnel" "tunnels to $server not started - no tunnels defined"; return; } cmd="${CheckHostIP:+-o CheckHostIP=$CheckHostIP }" cmd="$cmd${CheckHostIP:+-o CheckHostIP=$CheckHostIP }" cmd="$cmd${Compression:+-o Compression=$Compression }" cmd="$cmd${CompressionLevel:+-o CompressionLevel=$CompressionLevel }" cmd="$cmd${IdentityFile:+-o IdentityFile=$IdentityFile }" cmd="$cmd${LogLevel:+-o LogLevel=$LogLevel }" cmd="$cmd${ServerAliveCountMax:+-o ServerAliveCountMax=$ServerAliveCountMax }" cmd="$cmd${ServerAliveInterval:+-o ServerAliveInterval=$ServerAliveInterval }" cmd="$cmd${StrictHostKeyChecking:+-o StrictHostKeyChecking=$StrictHostKeyChecking }" cmd="$cmd${TCPKeepAlive:+-o TCPKeepAlive=$TCPKeepAlive }" cmd="$cmd${VerifyHostKeyDNS:+-o VerifyHostKeyDNS=$VerifyHostKeyDNS }" cmd="$cmd""-o ExitOnForwardFailure=yes -o BatchMode=yes -nN $tunnels_cmd $user@$hostname" /usr/bin/sshtunnel.sh "$cmd" "$retrydelay" "$server" & echo $! >> "$PIDFILE".pids logger -p user.info -t "sshtunnel" "started tunnels to $server (pid=$!;retrydelay=$retrydelay)" } load_tunnel() { config_get section_server $1 server [ "$server" = "$section_server" ] || return 0 # continue to read next section if this is not for the current server let count++ # count nr of valid sections to make sure there are at least one config_get remoteport $1 remoteport config_get localport $1 localport [ "$cfgtype" = "tunnelL" ] && { config_get localaddress $1 localaddress "*" config_get remoteaddress $1 remoteaddress } [ "$cfgtype" = "tunnelR" ] && { config_get localaddress $1 localaddress config_get remoteaddress $1 remoteaddress "*" } [ "$remoteport" -gt 0 ] || error="remoteport must be a positive integer" [ "$localport" -gt 0 ] || error="${error:+$error; }localpost must be a positive integer" [ -n "$error" ] && return 1 [ "$cfgtype" = "tunnelL" ] && { tunnels_cmd="${tunnels_cmd:+$tunnels_cmd }-L $localaddress:$localport:$remoteaddress:$remoteport" } [ "$cfgtype" = "tunnelR" ] && { tunnels_cmd="${tunnels_cmd:+$tunnels_cmd }-R $remoteaddress:$remoteport:$localaddress:$localport" } } stop() { if [ -f "$PIDFILE".pids ] then logger -p user.info -t "sshtunnel" "stopping all tunnels" while read pid do start-stop-daemon -K -p "$PIDFILE"_"$pid".pid kill $pid logger -p daemon.info -t "sshtunnel[$pid]" "tunnel stopped" rm "$PIDFILE"_"$pid".pid done < "$PIDFILE".pids rm "$PIDFILE".pids logger -p user.info -t "sshtunnel" "all tunnels stopped" else logger -p user.info -t "sshtunnel" "no tunnels running" fi } start() { [ -f "$PIDFILE".pids ] && stop config_load sshtunnel if [ -n "$(uci show sshtunnel.@server[0])" ] # at least one server section exists then logger -p user.info -t "sshtunnel" "starting all tunnels" config_foreach load_server server logger -p user.info -t "sshtunnel" "all tunnels started" else logger -p user.info -t "sshtunnel" "no servers defined" fi }