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.
13 EXTRA_COMMANDS
="up down"
22 *_
*_
*_
*) v
=${v%%_*}-${v#*_}; v=${v%%_*}-${v#*_}; v=${v%%_*}-${v#*_} ;;
23 *_
*_
*) v
=${v%%_*}-${v#*_}; v=${v%%_*}-${v#*_} ;;
24 *_
*) v
=${v%%_*}-${v#*_} ;;
31 local p
; local v
; local s
="$1"; local f
="$2"; shift; shift
33 config_get_bool v
"$s" "$p"
34 [ "$v" == 1 ] && echo "$p = yes" >> "$f"
35 [ "$v" == 0 ] && echo "$p = no" >> "$f"
40 local p
; local v
; local s
="$1"; shift
42 config_get v
"$s" "$p"
45 [ -n "$v" ] && append_param
"$p" && ARGS
="$ARGS $v"
51 append_conf_params
() {
52 local p
; local v
; local s
="$1"; local f
="$2"; shift; shift
54 config_get v
"$s" "$p"
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"
63 [ -n "$v" ] && echo "$p = $v" >> "$f"
70 config_get_bool enabled
"$1" 'enabled' 0
80 section_enabled
"$n" ||
return 1
82 if [ "$#" = "2" ]; then
83 [ "$2" != "$n" ] && return 1
87 section_enabled
"$s" ||
{
88 [ -f "$TMP_TINC/$n/hosts/$s" ] && rm "$TMP_TINC/$n/hosts/$s"
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"
100 append_conf_bools
"$s" "$TMP_TINC/$n/hosts/$s" \
101 ClampMSS IndirectData PMTUDiscovery TCPOnly
104 append_conf_params
"$s" "$TMP_TINC/$n/hosts/$s" \
105 Address Cipher Compression Digest MACLength PMTU \
106 Port PublicKey PublicKeyFile Subnet
109 check_gen_own_key
() {
110 local s
="$1"; local n
; local k
112 config_get n
"$s" Name
113 config_get_bool k
"$s" generate_keys
0
114 [ "$k" == 0 ] && return 0
116 ([ -z "$n" ] ||
[ -f "$TMP_TINC/$s/hosts/$n" ] ||
[ -f "$TMP_TINC/$s/rsa_key.priv" ]) && \
118 [ ! -d "$TMP_TINC/$s/hosts" ] && mkdir
-p "$TMP_TINC/$s/hosts"
120 config_get k
"$s" key_size
122 $BIN -c "$TMP_TINC/$s" --generate-keys </dev
/null
124 $BIN -c "$TMP_TINC/$s" "--generate-keys=$k" </dev
/null
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/"
136 section_enabled
"$s" ||
return 1
139 rm -rf "$TMP_TINC/$s/"
141 [ ! -d "$TMP_TINC/$s" ] && mkdir
-p "$TMP_TINC/$s"
142 [ -d "/etc/tinc/$s" ] && cp -r "/etc/tinc/$s" "$TMP_TINC/"
145 append_conf_bools
"$s" "$TMP_TINC/$s/tinc.conf" \
146 DecrementTTL DirectOnly Hostnames IffOneQueue \
147 LocalDiscovery PriorityInheritance StrictSubnets TunnelServer \
148 ClampMSS IndirectData PMTUDiscovery TCPOnly
151 append_conf_params
"$s" "$TMP_TINC/$s/tinc.conf" \
152 AddressFamily BindToAddress ConnectTo BindToInterface \
153 Broadcast Device DeviceType Forwarding \
154 GraphDumpFile Interface KeyExpire MACExpire \
155 MaxTimeout Mode Name PingInterval PingTimeout \
156 PrivateKey PrivateKeyFile ProcessPriority ReplayWindow \
157 UDPRcvBuf UDPSndBuf \
158 Address Cipher Compression Digest MACLength PMTU \
159 Port PublicKey PublicKeyFile Subnet
161 check_gen_own_key
"$s" && return 0
167 section_enabled
"$s" ||
return 1
172 append_params
"$s" log debug
174 SERVICE_PID_FILE
="/var/run/tinc.$s.pid"
175 service_start
$BIN -c "$TMP_TINC/$s" -n $s $ARGS --pidfile="$SERVICE_PID_FILE"
181 section_enabled
"$s" ||
return 1
183 SERVICE_PID_FILE
="/var/run/tinc.$s.pid"
186 rm -rf "$TMP_TINC/$s/"
192 section_enabled
"$s" ||
return 1
194 SERVICE_PID_FILE
="/var/run/tinc.$s.pid"
201 config_foreach prepare_net
'tinc-net'
202 config_foreach prepare_host
'tinc-host'
204 config_foreach start_instance
'tinc-net'
209 config_foreach stop_instance
'tinc-net'
214 config_foreach reload_instance
'tinc-net'
221 for instance
in "$@"; do
222 config_get exists
"$instance" 'TYPE'
223 if [ "$exists" == "tinc-net" ]; then
224 prepare_net
"$instance"
225 config_foreach prepare_host
'tinc-host' "$instance"
226 start_instance
"$instance"
235 for instance
in "$@"; do
236 config_get exists
"$instance" 'TYPE'
237 if [ "$exists" == "tinc-net" ]; then
238 stop_instance
"$instance"