lede-packages-rs

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

tinc.init (5269B)


      1 #!/bin/sh /etc/rc.common
      2 # Copyright (C) 2011 OpenWrt.org
      3 # Copyright (C) 2011 Linus Lüssing
      4 #  Based on Jo-Philipp Wich's OpenVPN init script
      5 # This is free software, licensed under the GNU General Public License v2.
      6 # See /LICENSE for more information.
      7 
      8 START=42
      9 
     10 SERVICE_USE_PID=1
     11 
     12 BIN=/usr/sbin/tincd
     13 EXTRA_COMMANDS="up down"
     14 
     15 LIST_SEP="
     16 "
     17 TMP_TINC="/tmp/tinc"
     18 
     19 append_param() {
     20 	local v="$1"
     21 	case "$v" in
     22 		*_*_*_*) v=${v%%_*}-${v#*_}; v=${v%%_*}-${v#*_}; v=${v%%_*}-${v#*_} ;;
     23 		*_*_*)   v=${v%%_*}-${v#*_}; v=${v%%_*}-${v#*_} ;;
     24 		*_*)     v=${v%%_*}-${v#*_} ;;
     25 	esac
     26 	ARGS="$ARGS --$v"
     27 	return 0
     28 }
     29 
     30 append_conf_bools() {
     31 	local p; local v; local s="$1"; local f="$2"; shift; shift
     32 	for p in $*; do
     33 		config_get_bool v "$s" "$p"
     34 		[ "$v" == 1 ] && echo "$p = yes" >> "$f"
     35 		[ "$v" == 0 ] && echo "$p = no" >> "$f"
     36 	done
     37 }
     38 
     39 append_params() {
     40 	local p; local v; local s="$1"; shift
     41 	for p in $*; do
     42 		config_get v "$s" "$p"
     43 		IFS="$LIST_SEP"
     44 		for v in $v; do
     45 			[ -n "$v" ] && append_param "$p" && ARGS="$ARGS=$v"
     46 		done
     47 		unset IFS
     48 	done
     49 }
     50 
     51 append_conf_params() {
     52 	local p; local v; local s="$1"; local f="$2"; shift; shift
     53 	for p in $*; do
     54 		config_get v "$s" "$p"
     55 		IFS="$LIST_SEP"
     56 		for v in $v; do
     57 			# Look up OpenWRT interface names
     58 			[ "$p" = "BindToInterface" ] && {
     59 				local ifname=$(uci -P /var/state get network.$v.ifname 2>&-)
     60 				[ -n "$ifname" ] && v="$ifname"
     61 			}
     62 
     63 			[ -n "$v" ] && echo "$p = $v" >> "$f"
     64 		done
     65 		unset IFS
     66 	done
     67 }
     68 
     69 section_enabled() {
     70 	config_get_bool enabled "$1" 'enabled' 0
     71 	[ $enabled -gt 0 ]
     72 }
     73 
     74 prepare_host() {
     75 	local s="$1"
     76 	local n
     77 
     78 	# net disabled?
     79 	config_get n "$s" net
     80 	section_enabled "$n" || return 1
     81 
     82 	if [ "$#" = "2" ]; then
     83 		[ "$2" != "$n" ] && return 1
     84 	fi
     85 
     86 	# host disabled?
     87 	section_enabled "$s" || {
     88 		[ -f "$TMP_TINC/$n/hosts/$s" ] && rm "$TMP_TINC/$n/hosts/$s"
     89 		return 1
     90 	}
     91 
     92 	[ ! -f "/etc/tinc/$n/hosts/$s" ] && {
     93 		echo -n "tinc: Warning, public key for $s for network $n "
     94 		echo -n "missing in /etc/tinc/$n/hosts/$s, "
     95 		echo "skipping configuration of $s"
     96 		return 1
     97 	}
     98 
     99 	# append flags
    100 	append_conf_bools "$s" "$TMP_TINC/$n/hosts/$s" \
    101 		ClampMSS IndirectData PMTUDiscovery TCPOnly
    102 
    103 	# append params
    104 	append_conf_params "$s" "$TMP_TINC/$n/hosts/$s" \
    105 		Address Cipher Compression Digest MACLength PMTU \
    106 		Port PublicKey PublicKeyFile Subnet
    107 }
    108 
    109 check_gen_own_key() {
    110 	local s="$1"; local n; local k
    111 
    112 	config_get n "$s" Name
    113 	config_get_bool k "$s" generate_keys 0
    114 	[ "$k" == 0 ] && return 0
    115 
    116 	([ -z "$n" ] || [ -f "$TMP_TINC/$s/hosts/$n" ] || [ -f "$TMP_TINC/$s/rsa_key.priv" ]) && \
    117 		return 0
    118 	[ ! -d "$TMP_TINC/$s/hosts" ] && mkdir -p "$TMP_TINC/$s/hosts"
    119 
    120 	config_get k "$s" key_size
    121 	if [ -z "$k" ]; then
    122 		$BIN -c "$TMP_TINC/$s" --generate-keys </dev/null
    123 	else
    124 		$BIN -c "$TMP_TINC/$s" "--generate-keys=$k" </dev/null
    125 	fi
    126 
    127 	[ ! -d "/etc/tinc/$s/hosts" ] && mkdir -p "/etc/tinc/$s/hosts"
    128 	cp "$TMP_TINC/$s/rsa_key.priv" "/etc/tinc/$s/"
    129 	[ -n "$n" ] && cp "$TMP_TINC/$s/hosts/$n" "/etc/tinc/$s/hosts/"
    130 }
    131 
    132 prepare_net() {
    133 	local s="$1"
    134 	local n
    135 
    136 	section_enabled "$s" || return 1
    137 
    138 	[ -d "$TMP_TINC/$s" ] && rm -rf "$TMP_TINC/$s/"
    139 	mkdir -p "$TMP_TINC/$s"
    140 	[ -d "/etc/tinc/$s" ] && cp -r "/etc/tinc/$s" "$TMP_TINC/"
    141 
    142 	# append flags
    143 	append_conf_bools "$s" "$TMP_TINC/$s/tinc.conf" \
    144 		DecrementTTL DirectOnly Hostnames IffOneQueue \
    145 		LocalDiscovery PriorityInheritance StrictSubnets TunnelServer \
    146 		ClampMSS IndirectData PMTUDiscovery TCPOnly
    147 
    148 	# append params
    149 	append_conf_params "$s" "$TMP_TINC/$s/tinc.conf" \
    150 		AddressFamily BindToAddress ConnectTo BindToInterface \
    151 		Broadcast Device DeviceType Forwarding \
    152 		GraphDumpFile Interface KeyExpire MACExpire \
    153 		MaxTimeout Mode Name PingInterval PingTimeout \
    154 		PrivateKey PrivateKeyFile ProcessPriority ReplayWindow \
    155 		UDPRcvBuf UDPSndBuf \
    156 		Address Cipher Compression Digest MACLength PMTU \
    157 		Port PublicKey PublicKeyFile Subnet
    158 
    159 	check_gen_own_key "$s" && return 0
    160 }
    161 
    162 start_instance() {
    163 	local s="$1"
    164 
    165 	section_enabled "$s" || return 1
    166 
    167 	ARGS=""
    168 
    169 	# append params
    170 	append_params "$s" logfile debug
    171 
    172 	SERVICE_PID_FILE="/var/run/tinc.$s.pid"
    173 	service_start $BIN -c "$TMP_TINC/$s" -n $s $ARGS --pidfile="$SERVICE_PID_FILE"
    174 }
    175 
    176 stop_instance() {
    177 	local s="$1"
    178 
    179 	section_enabled "$s" || return 1
    180 
    181 	SERVICE_PID_FILE="/var/run/tinc.$s.pid"
    182 	service_stop $BIN
    183 	# rm old config
    184 	rm -rf "$TMP_TINC/$s/"
    185 }
    186 
    187 reload_instance() {
    188 	local s="$1"
    189 
    190 	section_enabled "$s" || return 1
    191 
    192 	SERVICE_PID_FILE="/var/run/tinc.$s.pid"
    193 	service_reload $BIN
    194 }
    195 
    196 start() {
    197 	config_load 'tinc'
    198 
    199 	config_foreach prepare_net 'tinc-net'
    200 	config_foreach prepare_host 'tinc-host'
    201 
    202 	config_foreach start_instance 'tinc-net'
    203 }
    204 
    205 stop() {
    206 	config_load 'tinc'
    207 	config_foreach stop_instance 'tinc-net'
    208 }
    209 
    210 reload() {
    211 	config_load 'tinc'
    212 	config_foreach reload_instance 'tinc-net'
    213 }
    214 
    215 up() {
    216 	local exists
    217 	local instance
    218 	config_load 'tinc'
    219 	for instance in "$@"; do
    220 		config_get exists "$instance" 'TYPE'
    221 		if [ "$exists" == "tinc-net" ]; then
    222 			prepare_net "$instance"
    223 			config_foreach prepare_host 'tinc-host' "$instance"
    224 			start_instance "$instance"
    225 		fi
    226 	done
    227 }
    228 
    229 down() {
    230 	local exists
    231 	local instance
    232 	config_load 'tinc'
    233 	for instance in "$@"; do
    234 		config_get exists "$instance" 'TYPE'
    235 		if [ "$exists" == "tinc-net" ]; then
    236 			stop_instance "$instance"
    237 		fi
    238 	done
    239 }