lede-packages-rs

git clone git://archive.git.mtrnord.blog/MTRNord/lede-packages-rs.git
Log | Files | Refs | README | LICENSE

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 }