[packages] tinc: fix init.d/tinc parameter generation and logfile config name
[packages] tinc: fix init.d/tinc parameter generation and logfile config name

tinc expects long parameters to be in the form "--name=value" and the
current init scripts generate "--name value" parameters. See `tincd
--help` to confirm. Also, the config/tinc and init.d/tinc incorrectly
use the parameter "log" when it should be "logfile".

Signed-off-by: Sandy McArthur, Jr. <Sandy@McArthur.org>

git-svn-id: svn://svn.openwrt.org/openwrt/packages@36508 3c298f89-4303-0410-b956-a3cf2f4a3e73

config tinc-net NETNAME config tinc-net NETNAME
option enabled 0 option enabled 0
   
## Daemon Configuration (cmd arguments) ## Daemon Configuration (cmd arguments)
#option generate_keys 0 #option generate_keys 0
#option key_size 2048 #option key_size 2048
#option log /tmp/log/tinc.NETNAME.log #option logfile /tmp/log/tinc.NETNAME.log
#option debug 3 #option debug 3
   
## Server Configuration (tinc.conf) ## Server Configuration (tinc.conf)
#option AddressFamily any #option AddressFamily any
#option BindToAddress 127.0.0.1 #option BindToAddress 127.0.0.1
#option BindToInterface lo #option BindToInterface lo
   
#list ConnectTo peer1 #list ConnectTo peer1
   
#option DirectOnly 0 #option DirectOnly 0
#option Forwarding internal #option Forwarding internal
#option GraphDumpFile /tmp/log/tinc.NETNAME.dot #option GraphDumpFile /tmp/log/tinc.NETNAME.dot
#option Hostnames 0 #option Hostnames 0
#option IffOneQueue 0 #option IffOneQueue 0
#option Interface NETNAME #option Interface NETNAME
#option KeyExpire 3600 #option KeyExpire 3600
#option MACExpire 600 #option MACExpire 600
#option MaxTimeout 900 #option MaxTimeout 900
#option Mode router #option Mode router
   
option Name NODENAME option Name NODENAME
   
#option PingInterval 60 #option PingInterval 60
#option PingTimeout 5 #option PingTimeout 5
#option PriorityInheritance 0 #option PriorityInheritance 0
#option PrivateKeyFile /etc/tinc/NETNAME/rsa_key.priv #option PrivateKeyFile /etc/tinc/NETNAME/rsa_key.priv
#option ProcessPriority normal #option ProcessPriority normal
#option ReplayWindow 16 #option ReplayWindow 16
#option StrictSubnets 0 #option StrictSubnets 0
#option TunnelServer 0 #option TunnelServer 0
#option UDPRcvBuf x #option UDPRcvBuf x
#option UDPSndBuf x #option UDPSndBuf x
   
config tinc-host NODENAME config tinc-host NODENAME
option enabled 0 option enabled 0
   
option net NETNAME option net NETNAME
   
#list Address example.com #list Address example.com
#option Cipher blowfish #option Cipher blowfish
#option ClampMSS yes #option ClampMSS yes
#option Compression 0 #option Compression 0
#option Digest sha1 #option Digest sha1
#option IndirectData 0 #option IndirectData 0
#option MACLength 4 #option MACLength 4
#option PMTU 1514 #option PMTU 1514
#option PMTUDiscovery yes #option PMTUDiscovery yes
#option Port 655 #option Port 655
#option Subnet 192.168.1.0/24 #option Subnet 192.168.1.0/24
   
#!/bin/sh /etc/rc.common #!/bin/sh /etc/rc.common
# Copyright (C) 2011 OpenWrt.org # Copyright (C) 2011 OpenWrt.org
# Copyright (C) 2011 Linus Lüssing # Copyright (C) 2011 Linus Lüssing
# Based on Jo-Philipp Wich's OpenVPN init script # Based on Jo-Philipp Wich's OpenVPN init script
# This is free software, licensed under the GNU General Public License v2. # This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information. # See /LICENSE for more information.
   
START=42 START=42
   
SERVICE_USE_PID=1 SERVICE_USE_PID=1
   
BIN=/usr/sbin/tincd BIN=/usr/sbin/tincd
EXTRA_COMMANDS="up down" EXTRA_COMMANDS="up down"
   
LIST_SEP=" LIST_SEP="
" "
TMP_TINC="/tmp/tinc" TMP_TINC="/tmp/tinc"
   
append_param() { append_param() {
local v="$1" local v="$1"
case "$v" in case "$v" in
*_*_*_*) v=${v%%_*}-${v#*_}; v=${v%%_*}-${v#*_}; v=${v%%_*}-${v#*_} ;; *_*_*_*) v=${v%%_*}-${v#*_}; v=${v%%_*}-${v#*_}; v=${v%%_*}-${v#*_} ;;
*_*_*) v=${v%%_*}-${v#*_}; v=${v%%_*}-${v#*_} ;; *_*_*) v=${v%%_*}-${v#*_}; v=${v%%_*}-${v#*_} ;;
*_*) v=${v%%_*}-${v#*_} ;; *_*) v=${v%%_*}-${v#*_} ;;
esac esac
ARGS="$ARGS --$v" ARGS="$ARGS --$v"
return 0 return 0
} }
   
append_conf_bools() { append_conf_bools() {
local p; local v; local s="$1"; local f="$2"; shift; shift local p; local v; local s="$1"; local f="$2"; shift; shift
for p in $*; do for p in $*; do
config_get_bool v "$s" "$p" config_get_bool v "$s" "$p"
[ "$v" == 1 ] && echo "$p = yes" >> "$f" [ "$v" == 1 ] && echo "$p = yes" >> "$f"
[ "$v" == 0 ] && echo "$p = no" >> "$f" [ "$v" == 0 ] && echo "$p = no" >> "$f"
done done
} }
   
append_params() { append_params() {
local p; local v; local s="$1"; shift local p; local v; local s="$1"; shift
for p in $*; do for p in $*; do
config_get v "$s" "$p" config_get v "$s" "$p"
IFS="$LIST_SEP" IFS="$LIST_SEP"
for v in $v; do for v in $v; do
[ -n "$v" ] && append_param "$p" && ARGS="$ARGS $v" [ -n "$v" ] && append_param "$p" && ARGS="$ARGS=$v"
done done
unset IFS unset IFS
done done
} }
   
append_conf_params() { append_conf_params() {
local p; local v; local s="$1"; local f="$2"; shift; shift local p; local v; local s="$1"; local f="$2"; shift; shift
for p in $*; do for p in $*; do
config_get v "$s" "$p" config_get v "$s" "$p"
IFS="$LIST_SEP" IFS="$LIST_SEP"
for v in $v; do for v in $v; do
# Look up OpenWRT interface names # Look up OpenWRT interface names
[ "$p" = "BindToInterface" ] && { [ "$p" = "BindToInterface" ] && {
local ifname=$(uci -P /var/state get network.$v.ifname 2>&-) local ifname=$(uci -P /var/state get network.$v.ifname 2>&-)
[ -n "$ifname" ] && v="$ifname" [ -n "$ifname" ] && v="$ifname"
} }
   
[ -n "$v" ] && echo "$p = $v" >> "$f" [ -n "$v" ] && echo "$p = $v" >> "$f"
done done
unset IFS unset IFS
done done
} }
   
section_enabled() { section_enabled() {
config_get_bool enabled "$1" 'enabled' 0 config_get_bool enabled "$1" 'enabled' 0
[ $enabled -gt 0 ] [ $enabled -gt 0 ]
} }
   
prepare_host() { prepare_host() {
local s="$1" local s="$1"
local n local n
   
# net disabled? # net disabled?
config_get n "$s" net config_get n "$s" net
section_enabled "$n" || return 1 section_enabled "$n" || return 1
   
if [ "$#" = "2" ]; then if [ "$#" = "2" ]; then
[ "$2" != "$n" ] && return 1 [ "$2" != "$n" ] && return 1
fi fi
   
# host disabled? # host disabled?
section_enabled "$s" || { section_enabled "$s" || {
[ -f "$TMP_TINC/$n/hosts/$s" ] && rm "$TMP_TINC/$n/hosts/$s" [ -f "$TMP_TINC/$n/hosts/$s" ] && rm "$TMP_TINC/$n/hosts/$s"
return 1 return 1
} }
   
[ ! -f "/etc/tinc/$n/hosts/$s" ] && { [ ! -f "/etc/tinc/$n/hosts/$s" ] && {
echo -n "tinc: Warning, public key for $s for network $n " echo -n "tinc: Warning, public key for $s for network $n "
echo -n "missing in /etc/tinc/$n/hosts/$s, " echo -n "missing in /etc/tinc/$n/hosts/$s, "
echo "skipping configuration of $s" echo "skipping configuration of $s"
return 1 return 1
} }
   
# append flags # append flags
append_conf_bools "$s" "$TMP_TINC/$n/hosts/$s" \ append_conf_bools "$s" "$TMP_TINC/$n/hosts/$s" \
ClampMSS IndirectData PMTUDiscovery TCPOnly ClampMSS IndirectData PMTUDiscovery TCPOnly
   
# append params # append params
append_conf_params "$s" "$TMP_TINC/$n/hosts/$s" \ append_conf_params "$s" "$TMP_TINC/$n/hosts/$s" \
Address Cipher Compression Digest MACLength PMTU \ Address Cipher Compression Digest MACLength PMTU \
Port PublicKey PublicKeyFile Subnet Port PublicKey PublicKeyFile Subnet
} }
   
check_gen_own_key() { check_gen_own_key() {
local s="$1"; local n; local k local s="$1"; local n; local k
   
config_get n "$s" Name config_get n "$s" Name
config_get_bool k "$s" generate_keys 0 config_get_bool k "$s" generate_keys 0
[ "$k" == 0 ] && return 0 [ "$k" == 0 ] && return 0
   
([ -z "$n" ] || [ -f "$TMP_TINC/$s/hosts/$n" ] || [ -f "$TMP_TINC/$s/rsa_key.priv" ]) && \ ([ -z "$n" ] || [ -f "$TMP_TINC/$s/hosts/$n" ] || [ -f "$TMP_TINC/$s/rsa_key.priv" ]) && \
return 0 return 0
[ ! -d "$TMP_TINC/$s/hosts" ] && mkdir -p "$TMP_TINC/$s/hosts" [ ! -d "$TMP_TINC/$s/hosts" ] && mkdir -p "$TMP_TINC/$s/hosts"
   
config_get k "$s" key_size config_get k "$s" key_size
if [ -z "$k" ]; then if [ -z "$k" ]; then
$BIN -c "$TMP_TINC/$s" --generate-keys </dev/null $BIN -c "$TMP_TINC/$s" --generate-keys </dev/null
else else
$BIN -c "$TMP_TINC/$s" "--generate-keys=$k" </dev/null $BIN -c "$TMP_TINC/$s" "--generate-keys=$k" </dev/null
fi fi
   
[ ! -d "/etc/tinc/$s/hosts" ] && mkdir -p "/etc/tinc/$s/hosts" [ ! -d "/etc/tinc/$s/hosts" ] && mkdir -p "/etc/tinc/$s/hosts"
cp "$TMP_TINC/$s/rsa_key.priv" "/etc/tinc/$s/" cp "$TMP_TINC/$s/rsa_key.priv" "/etc/tinc/$s/"
[ -n "$n" ] && cp "$TMP_TINC/$s/hosts/$n" "/etc/tinc/$s/hosts/" [ -n "$n" ] && cp "$TMP_TINC/$s/hosts/$n" "/etc/tinc/$s/hosts/"
} }
   
prepare_net() { prepare_net() {
local s="$1" local s="$1"
local n local n
   
section_enabled "$s" || return 1 section_enabled "$s" || return 1
   
# rm old config # rm old config
rm -rf "$TMP_TINC/$s/" rm -rf "$TMP_TINC/$s/"
   
[ ! -d "$TMP_TINC/$s" ] && mkdir -p "$TMP_TINC/$s" [ ! -d "$TMP_TINC/$s" ] && mkdir -p "$TMP_TINC/$s"
[ -d "/etc/tinc/$s" ] && cp -r "/etc/tinc/$s" "$TMP_TINC/" [ -d "/etc/tinc/$s" ] && cp -r "/etc/tinc/$s" "$TMP_TINC/"
   
# append flags # append flags
append_conf_bools "$s" "$TMP_TINC/$s/tinc.conf" \ append_conf_bools "$s" "$TMP_TINC/$s/tinc.conf" \
DecrementTTL DirectOnly Hostnames IffOneQueue \ DecrementTTL DirectOnly Hostnames IffOneQueue \
LocalDiscovery PriorityInheritance StrictSubnets TunnelServer \ LocalDiscovery PriorityInheritance StrictSubnets TunnelServer \
ClampMSS IndirectData PMTUDiscovery TCPOnly ClampMSS IndirectData PMTUDiscovery TCPOnly
   
# append params # append params
append_conf_params "$s" "$TMP_TINC/$s/tinc.conf" \ append_conf_params "$s" "$TMP_TINC/$s/tinc.conf" \
AddressFamily BindToAddress ConnectTo BindToInterface \ AddressFamily BindToAddress ConnectTo BindToInterface \
Broadcast Device DeviceType Forwarding \ Broadcast Device DeviceType Forwarding \
GraphDumpFile Interface KeyExpire MACExpire \ GraphDumpFile Interface KeyExpire MACExpire \
MaxTimeout Mode Name PingInterval PingTimeout \ MaxTimeout Mode Name PingInterval PingTimeout \
PrivateKey PrivateKeyFile ProcessPriority ReplayWindow \ PrivateKey PrivateKeyFile ProcessPriority ReplayWindow \
UDPRcvBuf UDPSndBuf \ UDPRcvBuf UDPSndBuf \
Address Cipher Compression Digest MACLength PMTU \ Address Cipher Compression Digest MACLength PMTU \
Port PublicKey PublicKeyFile Subnet Port PublicKey PublicKeyFile Subnet
   
check_gen_own_key "$s" && return 0 check_gen_own_key "$s" && return 0
} }
   
start_instance() { start_instance() {
local s="$1" local s="$1"
   
section_enabled "$s" || return 1 section_enabled "$s" || return 1
   
ARGS="" ARGS=""
   
# append params # append params
append_params "$s" log debug append_params "$s" logfile debug
   
SERVICE_PID_FILE="/var/run/tinc.$s.pid" SERVICE_PID_FILE="/var/run/tinc.$s.pid"
service_start $BIN -c "$TMP_TINC/$s" -n $s $ARGS --pidfile="$SERVICE_PID_FILE" service_start $BIN -c "$TMP_TINC/$s" -n $s $ARGS --pidfile="$SERVICE_PID_FILE"
} }
   
stop_instance() { stop_instance() {
local s="$1" local s="$1"
   
section_enabled "$s" || return 1 section_enabled "$s" || return 1
   
SERVICE_PID_FILE="/var/run/tinc.$s.pid" SERVICE_PID_FILE="/var/run/tinc.$s.pid"
service_stop $BIN service_stop $BIN
# rm old config # rm old config
rm -rf "$TMP_TINC/$s/" rm -rf "$TMP_TINC/$s/"
} }
   
reload_instance() { reload_instance() {
local s="$1" local s="$1"
   
section_enabled "$s" || return 1 section_enabled "$s" || return 1
   
SERVICE_PID_FILE="/var/run/tinc.$s.pid" SERVICE_PID_FILE="/var/run/tinc.$s.pid"
service_reload $BIN service_reload $BIN
} }
   
start() { start() {
config_load 'tinc' config_load 'tinc'
   
config_foreach prepare_net 'tinc-net' config_foreach prepare_net 'tinc-net'
config_foreach prepare_host 'tinc-host' config_foreach prepare_host 'tinc-host'
   
config_foreach start_instance 'tinc-net' config_foreach start_instance 'tinc-net'
} }
   
stop() { stop() {
config_load 'tinc' config_load 'tinc'
config_foreach stop_instance 'tinc-net' config_foreach stop_instance 'tinc-net'
} }
   
reload() { reload() {
config_load 'tinc' config_load 'tinc'
config_foreach reload_instance 'tinc-net' config_foreach reload_instance 'tinc-net'
} }
   
up() { up() {
local exists local exists
local instance local instance
config_load 'tinc' config_load 'tinc'
for instance in "$@"; do for instance in "$@"; do
config_get exists "$instance" 'TYPE' config_get exists "$instance" 'TYPE'
if [ "$exists" == "tinc-net" ]; then if [ "$exists" == "tinc-net" ]; then
prepare_net "$instance" prepare_net "$instance"
config_foreach prepare_host 'tinc-host' "$instance" config_foreach prepare_host 'tinc-host' "$instance"
start_instance "$instance" start_instance "$instance"
fi fi
done done
} }
   
down() { down() {
local exists local exists
local instance local instance
config_load 'tinc' config_load 'tinc'
for instance in "$@"; do for instance in "$@"; do
config_get exists "$instance" 'TYPE' config_get exists "$instance" 'TYPE'
if [ "$exists" == "tinc-net" ]; then if [ "$exists" == "tinc-net" ]; then
stop_instance "$instance" stop_instance "$instance"
fi fi
done done
} }
   
comments