fwknop: Add start-up dependency on network interface for fwknopd.
[feed/packages.git] / net / fwknop / files / fwknopd.init
1 #!/bin/sh /etc/rc.common
2 #
3 # Fwknop is developed primarily by the people listed in the file 'AUTHORS'.
4 # Copyright (C) 2009-2014 fwknop developers and contributors. For a full
5 # list of contributors, see the file 'CREDITS'.
6 #
7 . /lib/functions.sh
8
9 USE_PROCD=1
10 START=95
11
12 FWKNOPD_BIN=/usr/sbin/fwknopd
13
14 start_service()
15 {
16 generate_configuration
17
18 procd_open_instance
19 procd_set_param command "$FWKNOPD_BIN" --foreground --syslog-enable
20 procd_set_param respawn
21
22 if [ $UCI_ENABLED -eq 1 ]; then
23 procd_append_param command -c /var/etc/fwknopd.conf
24 procd_append_param command -a /var/etc/access.conf
25 fi
26
27 procd_append_param command -i "$DEPEND_IFNAME"
28 procd_set_param netdev "$DEPEND_IFNAME"
29
30 procd_close_instance
31 }
32
33 service_triggers()
34 {
35 procd_add_reload_trigger "fwknopd"
36 }
37
38 get_bool()
39 {
40 local _tmp="$1"
41 case "$_tmp" in
42 1|on|true|yes|enabled) _tmp=1;;
43 0|off|false|no|disabled) _tmp=0;;
44 *) _tmp="$2";;
45 esac
46 echo -n "$_tmp"
47 }
48
49 generate_configuration()
50 {
51 [ -f /tmp/access.conf.tmp ] && rm /tmp/access.conf.tmp
52
53 UCI_ENABLED=0
54 DEPEND_IFNAME=
55 local NETWORK=
56 local PCAP_INTF=
57 local USER_CONFIG_PATH=/etc/fwknop/fwknopd.conf
58 local DEFAULT_UCI_NETWORK=wan
59 local DEFAULT_FWKNOPD_IFNAME=eth0
60
61 config_cb() {
62 local type="$1"
63 local name="$2"
64 if [ "$type" = "global" ]; then
65 option_cb() {
66 local option="$1"
67 local value="$2"
68 if [ "$option" = "uci_enabled" ] && [ "$(get_bool "$value" 0)" -eq 1 ] ; then
69 > /var/etc/fwknopd.conf
70 > /var/etc/access.conf
71 chmod 600 /var/etc/fwknopd.conf
72 chmod 600 /var/etc/access.conf
73 UCI_ENABLED=1
74 fi
75 }
76 elif [ "$type" = "network" ]; then
77 option_cb() {
78 local option="$1"
79 local value="$2"
80 if [ $UCI_ENABLED -eq 1 ] && [ $option = "network" ]; then
81 NETWORK="$value"
82 fi
83 }
84 elif [ "$type" = "config" ]; then
85 option_cb() {
86 local option="$1"
87 local value="$2"
88 if [ $UCI_ENABLED -eq 1 ] && [ $option = "PCAP_INTF" ]; then
89 PCAP_INTF="$value"
90 echo "$option $value" >> /var/etc/fwknopd.conf #writing each option to fwknopd.conf
91 elif [ $UCI_ENABLED -eq 1 ]; then
92 echo "$option $value" >> /var/etc/fwknopd.conf #writing each option to fwknopd.conf
93 fi
94 }
95 elif [ "$type" = "access" ]
96 then
97 if [ -f /tmp/access.conf.tmp ] ; then
98 cat /tmp/access.conf.tmp >> /var/etc/access.conf
99 rm /tmp/access.conf.tmp
100 fi
101 option_cb() {
102 local option="$1"
103 local value="$2"
104 if [ $UCI_ENABLED -eq 1 ] && [ $option = "SOURCE" ]; then
105 echo "$option $value" >> /var/etc/access.conf #writing each option to access.conf
106 fi
107 if [ $UCI_ENABLED -eq 1 ] && [ $option != "SOURCE" ]; then
108 echo "$option $value" >> /tmp/access.conf.tmp #writing each option to access.conf
109 fi
110 }
111 else
112 option_cb() { return; }
113 if [ -z "$type" ]; then
114 # Finalize reading
115 if [ -f /tmp/access.conf.tmp ] ; then
116 cat /tmp/access.conf.tmp >> /var/etc/access.conf
117 rm /tmp/access.conf.tmp
118 fi
119 fi
120 fi
121 }
122
123 if [ -f /etc/config/fwknopd ]; then
124 config_load fwknopd
125 fi
126
127 if [ $UCI_ENABLED -eq 0 ]; then
128 if [ -f $USER_CONFIG_PATH ] ; then
129 # Scan user configuration for PCAP_INTF settings
130 DEPEND_IFNAME="$( sed -ne '/^\s*PCAP_INTF\s\+/ { s/^\s*PCAP_INTF\s\+//; s/\s\+$//; p; q; }' /etc/fwknop/fwknopd.conf )"
131 if [ -n "$DEPEND_IFNAME" ]; then
132 logger -p daemon.debug -t "fwknopd[----]" "Found fwknopd.conf configuration, using PCAP_INTF interface $DEPEND_IFNAME"
133 else
134 logger -p daemon.info -t "fwknopd[----]" "No PCAP_INTF interface specified in fwknopd.conf, fwknopd's default $DEFAULT_FWKNOPD_IFNAME will be used"
135 DEPEND_IFNAME="$DEFAULT_FWKNOPD_IFNAME"
136 fi
137 else
138 logger -p daemon.error -t "fwknopd[----]" "No $USER_CONFIG_PATH found, not starting"
139 exit 1
140 fi
141 elif [ $UCI_ENABLED -eq 1 ]; then
142 if [ -n "$NETWORK" ] && [ -n "$PCAP_INTF" ]; then
143 logger -p daemon.warn -t "fwknopd[----]" "Specified both network and PCAP_INTF. Ignoring PCAP_INTF"
144 elif [ -z "$NETWORK" ] && [ -z "$PCAP_INTF" ]; then
145 # Fallback - compatibility with old script, which used wan interface by default
146 logger -p daemon.info -t "fwknopd[----]" "Neither network, nor PCAP_INTF interface specified, trying network $DEFAULT_UCI_NETWORK"
147 NETWORK="$DEFAULT_UCI_NETWORK"
148 fi
149
150 if [ -n "$NETWORK" ]; then
151 . /lib/functions/network.sh
152 network_get_physdev DEPEND_IFNAME "$NETWORK"
153 if [ -n "$DEPEND_IFNAME" ]; then
154 logger -p daemon.debug -t "fwknopd[----]" "Resolved network $NETWORK as interface $DEPEND_IFNAME"
155 else
156 logger -p daemon.warn -t "fwknopd[----]" "Cannot find interface for network $NETWORK, fwknopd's default $DEFAULT_FWKNOPD_IFNAME will be used"
157 DEPEND_IFNAME="$DEFAULT_FWKNOPD_IFNAME"
158 fi
159 elif [ -n "$PCAP_INTF" ]; then
160 DEPEND_IFNAME="$PCAP_INTF"
161 logger -p daemon.debug -t "fwknopd[----]" "Using configured PCAP_INTF interface $DEPEND_IFNAME"
162 fi
163 fi
164 }