Merge pull request #325 from ecsv/batadv-2017.3
[lede-routing/.git] / alfred / files / alfred.init
1 #!/bin/sh /etc/rc.common
2
3 #
4 # Copyright (C) 2013 OpenWrt.org
5 #
6 # This is free software, licensed under the GNU General Public License v2.
7 # See /LICENSE for more information.
8 #
9
10 START=99
11 STOP=99
12 alfred_args=""
13 vis_args=""
14 facters_dir="/etc/alfred"
15 pid_file_alfred="/var/run/alfred.pid"
16 pid_file_vis="/var/run/batadv-vis.pid"
17 enable=0
18 vis_enable=0
19 SERVICE_DAEMONIZE=1
20 SERVICE_WRITE_PID=1
21
22 wait_for_dir()
23 {
24         local ifce="$1" dir="$2"
25
26         if ! [ -d "$dir" ] ; then
27                 timeout=30
28                 echo "${initscript}: waiting $timeout secs for $ifce interface..."
29                 for i in $(seq $timeout); do
30                         sleep 1
31                         [ -d "$dir" ] && break
32                         if [ $i == $timeout ] ; then
33                                 echo "${initscript}: $ifce not detected, alfred not starting."
34                                 exit 1
35                         fi
36                 done
37         fi
38 }
39
40 wait_for_ll_address()
41 {
42         local iface="$1"
43         local timeout=30
44
45         echo "${initscript}: waiting $timeout secs for $iface address..."
46         for i in $(seq $timeout); do
47                 # We look for
48                 # - the link-local address (starts with fe80)
49                 # - without tentative flag (bit 0x40 in the flags field; the first char of the flags field begins 38 columns after the fe80 prefix
50                 # - on interface $iface
51                 if awk '
52                         BEGIN { RET=1 }
53                         /^fe80.{37} [012389ab]/ { if ($6 == "'"$iface"'") RET=0 }
54                         END { exit RET }
55                 ' /proc/net/if_inet6; then
56                         return
57                 fi
58                 sleep 1
59         done
60
61         echo "${initscript}: $iface address not detected, alfred not starting."
62         exit 1
63 }
64
65 alfred_start()
66 {
67         local args=""
68         local section="$1"
69         local disabled interface mode
70
71         # check if section is disabled
72         config_get_bool disabled "$section" disabled 0
73         [ $disabled = 0 ] || return 1
74
75         args=""
76
77         config_get interface "$section" interface
78         append args "-i $interface"
79
80         config_get mode "$section" mode
81         [ "$mode" = "master" ] && append args "-m"
82
83         config_get batmanif "$section" batmanif
84         append args "-b $batmanif"
85
86         if [ "$batmanif" != "none" ]; then
87                 wait_for_dir "$batmanif" "/sys/class/net/$batmanif/mesh"
88         fi
89
90         wait_for_ll_address "$interface"
91
92         append alfred_args "$args"
93         enable=1
94
95         config_get_bool start_vis "$section" start_vis 0
96         if [ "$start_vis" = 1 ] && [ -x /usr/sbin/batadv-vis ]; then
97                 vis_enable=1
98                 append vis_args "-i $batmanif -s"
99         fi
100
101         config_get_bool run_facters "$section" run_facters 0
102
103         return 0
104 }
105
106 start()
107 {
108         config_load "alfred"
109         config_foreach alfred_start alfred
110
111         if [ "$enable" = "0" ]; then
112                 exit 0
113         fi
114
115         echo "${initscript}: starting alfred"
116         SERVICE_PID_FILE="$pid_file_alfred"
117         service_start /usr/sbin/alfred ${alfred_args}
118
119         if [ "$vis_enable" = "1" ]; then
120                 echo "${initscript}: starting batadv-vis"
121                 SERVICE_PID_FILE="$pid_file_vis"
122                 service_start /usr/sbin/batadv-vis ${vis_args}
123         fi
124
125         if [ "$run_facters" = "1" ]; then
126                 ( for file in $facters_dir/* ; do [ -x $file ] && $file ; done )
127                 if ! ( grep -q "for file in $facters_dir/\* ; do " /etc/crontabs/root 2>/dev/null ) ; then
128                         echo "*/5 * * * * ( for file in $facters_dir/* ; do [ -x \$file ] && \$file ; done )" >> /etc/crontabs/root
129                         /etc/init.d/cron enable
130                         /etc/init.d/cron restart
131                 fi
132         fi
133 }
134
135 stop()
136 {
137         SERVICE_PID_FILE="$pid_file_alfred"
138         service_stop /usr/sbin/alfred
139         SERVICE_PID_FILE="$pid_file_vis"
140         [ -x /usr/sbin/batadv-vis ] && service_stop /usr/sbin/batadv-vis
141         sed "\|for file in $facters_dir/\* ; do |d" -i /etc/crontabs/root
142         /etc/init.d/cron restart
143 }