sshtunnel.init (6268B)
1 #!/bin/sh /etc/rc.common 2 # 3 # Copyright (C) 2010-2015 OpenWrt.org 4 # Copyright (C) 2010 segal.di.ubi.pt 5 # 6 7 START=99 8 STOP=01 9 USE_PROCD=1 10 11 PROG=/usr/bin/ssh 12 13 _log() { 14 logger -p daemon.info -t sshtunnel "$@" 15 } 16 17 _err() { 18 logger -p daemon.err -t sshtunnel "$@" 19 } 20 21 append_params() { 22 local p v args 23 for p in $*; do 24 eval "v=\$$p" 25 [ -n "$v" ] && args="$args -o $p=$v" 26 done 27 28 ARGS_options="${args# *}" 29 } 30 31 append_string() { 32 local varname="$1"; local add="$2"; local separator="${3:- }"; local actual 33 eval "actual=\$$varname" 34 35 new="${actual:+$actual$separator}$add" 36 eval "$varname=\$new" 37 } 38 39 validate_server_section() { 40 uci_validate_section sshtunnel server "$1" \ 41 'user:string(1)' \ 42 'hostname:host' \ 43 'port:port' \ 44 'retrydelay:min(1):60' \ 45 'PKCS11Provider:file' \ 46 'CheckHostIP:or("yes", "no")' \ 47 'Compression:or("yes", "no")' \ 48 'CompressionLevel:range(1,9)' \ 49 'IdentityFile:file' \ 50 'LogLevel:or("QUIET", "FATAL", "ERROR", "INFO", "VERBOSE", "DEBUG", "DEBUG1", "DEBUG2", "DEBUG3"):INFO' \ 51 'ServerAliveCountMax:min(1)' \ 52 'ServerAliveInterval:min(1)' \ 53 'StrictHostKeyChecking:or("yes", "no")' \ 54 'TCPKeepAlive:or("yes", "no")' \ 55 'VerifyHostKeyDNS:or("yes", "no")' 56 } 57 58 validate_tunnelR_section() { 59 uci_validate_section sshtunnel tunnelR "$1" \ 60 'remoteaddress:or(host, "*"):*' \ 61 'remoteport:port' \ 62 'localaddress:host' \ 63 'localport:port' 64 } 65 66 validate_tunnelL_section() { 67 uci_validate_section sshtunnel tunnelL "$1" \ 68 'remoteaddress:host' \ 69 'remoteport:port' \ 70 'localaddress:or(host, "*"):*' \ 71 'localport:port' 72 } 73 74 validate_tunnelD_section() { 75 uci_validate_section sshtunnel tunnelD "$1" \ 76 'localaddress:or(host, "*"):*' \ 77 'localport:port' 78 } 79 80 validate_tunnelW_section() { 81 uci_validate_section sshtunnel tunnelW "$1" \ 82 'vpntype:or("ethernet", "point-to-point"):point-to-point' \ 83 'localdev:or("any", min(1))' \ 84 'remotedev:or("any", min(1))' 85 } 86 87 load_tunnelR() { 88 config_get section_server "$1" "server" 89 90 # continue to read next section if this is not for the current server 91 [ "$server" = "$section_server" ] || return 0 92 93 # validate and load this remote tunnel config 94 local remoteaddress remoteport localaddress localport 95 validate_tunnelR_section "$1" || { _err "tunnelR ${1}: validation failed"; return 1; } 96 97 [ -n "$remoteport" -a -n "$localport" -a -n "$remoteaddress" ] || { _err "tunnelR ${1}: missing required options"; return 1; } 98 99 # count nr of valid sections to make sure there are at least one 100 let count++ 101 102 _log "tunnelR at ${server}: -R $remoteaddress:$remoteport:$localaddress:$localport" 103 append_string "ARGS_tunnels" "-R $remoteaddress:$remoteport:$localaddress:$localport" 104 } 105 106 load_tunnelL() { 107 config_get section_server "$1" "server" 108 109 # continue to read next section if this is not for the current server 110 [ "$server" = "$section_server" ] || return 0 111 112 # validate and load this remote tunnel config 113 local remoteaddress remoteport localaddress localport 114 validate_tunnelL_section "$1" || { _err "tunnelL ${1}: validation failed"; return 1; } 115 116 [ -n "$remoteport" -a -n "$localport" -a -n "$remoteaddress" ] || { _err "tunnelL ${1}: missing required options"; return 1; } 117 118 # count nr of valid sections to make sure there are at least one 119 let count++ 120 121 _log "tunnelL at ${server}: -L $localaddress:$localport:$remoteaddress:$remoteport" 122 append_string "ARGS_tunnels" "-L $localaddress:$localport:$remoteaddress:$remoteport" 123 } 124 125 load_tunnelD() { 126 config_get section_server "$1" "server" 127 128 # continue to read next section if this is not for the current server 129 [ "$server" = "$section_server" ] || return 0 130 131 # validate and load this remote tunnel config 132 local localaddress localport 133 validate_tunnelD_section "$1" || { _err "tunnelD ${1}: validation failed"; return 1; } 134 135 [ -n "$localport" ] || { _err "tunnelD ${1}: missing localport"; return 1; } 136 137 # count nr of valid sections to make sure there are at least one 138 let count++ 139 140 _log "proxy via ${server}: -D $localaddress:$localport" 141 append_string "ARGS_tunnels" "-D $localaddress:$localport" 142 } 143 144 load_tunnelW() { 145 config_get section_server "$1" "server" 146 147 # continue to read next section if this is not for the current server 148 [ "$server" = "$section_server" ] || return 0 149 150 # validate and load this remote tunnel config 151 local localdev remotedev vpntype 152 validate_tunnelW_section "$1" || { _err "tunnelW ${1}: validation failed"; return 1; } 153 154 [ -n "$vpntype" -a -n "$localdev" -a -n "$remotedev" ] || { _err "tunnelW $1: missing or bad options"; return 1; } 155 156 [ "$user" == "root" ] || { _err "tunnelW ${1}: root is required for tun"; return 1; } 157 158 # count nr of valid sections to make sure there are at least one 159 let count++ 160 161 _log "tunnelW to ${server}: -w $localdev:$remotedev -o Tunnel=$vpntype" 162 append_string "ARGS_tunnels" "-w $localdev:$remotedev -o Tunnel=$vpntype" 163 } 164 165 load_server() { 166 server="$1" 167 local user hostname port retrydelay PKCS11Provider CheckHostIP Compression \ 168 CompressionLevel IdentityFile LogLevel ServerAliveCountMax \ 169 ServerAliveInterval StrictHostKeyChecking TCPKeepAlive VerifyHostKeyDNS 170 171 validate_server_section "$server" || { _err "server ${server}: validation failed"; return 1; } 172 173 ARGS="" 174 ARGS_options="" 175 ARGS_tunnels="" 176 count=0 177 178 config_foreach load_tunnelR "tunnelR" 179 config_foreach load_tunnelL "tunnelL" 180 config_foreach load_tunnelD "tunnelD" 181 config_foreach load_tunnelW "tunnelW" 182 [ "$count" -eq 0 ] && { _err "tunnels to ${server} not started - no tunnels defined"; return 1; } 183 184 append_params CheckHostIP Compression CompressionLevel IdentityFile \ 185 LogLevel PKCS11Provider ServerAliveCountMax ServerAliveInterval \ 186 StrictHostKeyChecking TCPKeepAlive VerifyHostKeyDNS 187 188 ARGS="$ARGS_options -o ExitOnForwardFailure=yes -o BatchMode=yes -nN $ARGS_tunnels -p $port $user@$hostname" 189 190 procd_open_instance "$server" 191 procd_set_param command "$PROG" $ARGS 192 procd_set_param stdout 1 193 procd_set_param stderr 1 194 procd_set_param respawn 0 "$retrydelay" 1 195 procd_close_instance 196 } 197 198 start_service() { 199 config_load "sshtunnel" 200 config_foreach load_server "server" 201 } 202 203 service_triggers() { 204 procd_add_reload_trigger "sshtunnel" 205 206 procd_open_validate 207 validate_server_section 208 validate_tunnelR_section 209 validate_tunnelL_section 210 validate_tunnelD_section 211 validate_tunnelW_section 212 procd_close_validate 213 }