summaryrefslogtreecommitdiffstats
path: root/alfred/files/alfred.init
blob: 4c9a9e195ada75d8f7b9d42e2b852cc855552bfb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#!/bin/sh /etc/rc.common

#
# Copyright (C) 2013 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#

START=99
STOP=99
alfred_args=""
vis_args=""
facters_dir="/etc/alfred"
pid_file_alfred="/var/run/alfred.pid"
pid_file_vis="/var/run/batadv-vis.pid"
enable=0
vis_enable=0
SERVICE_DAEMONIZE=1
SERVICE_WRITE_PID=1

wait_for_dir()
{
	local ifce="$1" dir="$2"

	if ! [ -d "$dir" ] ; then
		timeout=30
		echo "${initscript}: waiting $timeout secs for $ifce interface..."
		for i in $(seq $timeout); do
			sleep 1
			[ -d "$dir" ] && break
			if [ $i == $timeout ] ; then
				echo "${initscript}: $ifce not detected, alfred not starting."
				exit 1
			fi
		done
	fi
}

wait_for_ll_address()
{
	local iface="$1"
	local timeout=30

	echo "${initscript}: waiting $timeout secs for $iface address..."
	for i in $(seq $timeout); do
		# We look for
		# - the link-local address (starts with fe80)
		# - without tentative flag (bit 0x40 in the flags field; the first char of the flags field begins 38 columns after the fe80 prefix
		# - on interface $iface
		if awk '
			BEGIN { RET=1 }
			/^fe80.{37} [012389ab]/ { if ($6 == "'"$iface"'") RET=0 }
			END { exit RET }
		' /proc/net/if_inet6; then
			return
		fi
		sleep 1
	done

	echo "${initscript}: $iface address not detected, alfred not starting."
	exit 1
}

alfred_start()
{
	local args=""
	local section="$1"
	local disabled interface mode

	# check if section is disabled
	config_get_bool disabled "$section" disabled 0
	[ $disabled = 0 ] || return 1

	args=""

	config_get interface "$section" interface
	append args "-i $interface"

	config_get mode "$section" mode
	[ "$mode" = "master" ] && append args "-m"

	config_get batmanif "$section" batmanif
	append args "-b $batmanif"

	if [ "$batmanif" != "none" ]; then
		wait_for_dir "$batmanif" "/sys/class/net/$batmanif/mesh"
	fi

	wait_for_ll_address "$interface"

	append alfred_args "$args"
	enable=1

	config_get_bool start_vis "$section" start_vis 0
	if [ "$start_vis" = 1 ] && [ -x /usr/sbin/batadv-vis ]; then
		vis_enable=1
		append vis_args "-i $batmanif -s"
	fi

	config_get_bool run_facters "$section" run_facters 0

	return 0
}

start()
{
	config_load "alfred"
	config_foreach alfred_start alfred

	if [ "$enable" = "0" ]; then
		exit 0
	fi

	echo "${initscript}: starting alfred"
	SERVICE_PID_FILE="$pid_file_alfred"
	service_start /usr/sbin/alfred ${alfred_args}

	if [ "$vis_enable" = "1" ]; then
		echo "${initscript}: starting batadv-vis"
		SERVICE_PID_FILE="$pid_file_vis"
		service_start /usr/sbin/batadv-vis ${vis_args}
	fi

	if [ "$run_facters" = "1" ]; then
		( for file in $facters_dir/* ; do [ -x $file ] && $file ; done )
		if ! ( grep -q "for file in $facters_dir/\* ; do " /etc/crontabs/root 2>/dev/null ) ; then
			echo "*/5 * * * * ( for file in $facters_dir/* ; do [ -x \$file ] && \$file ; done )" >> /etc/crontabs/root
			/etc/init.d/cron enable
			/etc/init.d/cron restart
		fi
	fi
}

stop()
{
	SERVICE_PID_FILE="$pid_file_alfred"
	service_stop /usr/sbin/alfred
	SERVICE_PID_FILE="$pid_file_vis"
	[ -x /usr/sbin/batadv-vis ] && service_stop /usr/sbin/batadv-vis
	sed "\|for file in $facters_dir/\* ; do |d" -i /etc/crontabs/root
	/etc/init.d/cron restart
}