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 }