Bump version to v1.5 and start work on adding 4.19 kernel suppot
[librecmc/librecmc.git] / package / network / services / tinc / files / tinc.init
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 }