summaryrefslogtreecommitdiff
path: root/alfred/files/alfred.init
blob: 89e33ab55a0bd301fcd6ae490a5e93b7f92c2bd2 (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
#!/bin/sh /etc/rc.common

#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#

START=99
USE_PROCD=1
alfred_args=""
vis_args=""
facters_dir="/etc/alfred"
enable=0
vis_enable=0

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

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

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

	echo "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 fifth field is evaluated)
		# - on interface $iface
		if awk '
			BEGIN { RET=1 }
			$1 ~ /^fe80/ && $5 ~ /^[012389ab]/ && $6 == "'"$iface"'" { RET=0 }
			END { exit RET }
		' /proc/net/if_inet6; then
			return
		fi
		sleep 1
	done

	echo "$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_service() {
	config_load "alfred"
	config_foreach alfred_start alfred

	[ "$enable" = "0" ] && exit 0

	procd_open_instance "alfred"
	procd_set_param command /usr/sbin/alfred
	procd_append_param command ${alfred_args}
	procd_close_instance

	[ "$vis_enable" = "1" ] && {
		procd_open_instance "batadv-vis"
		procd_set_param command /usr/sbin/batadv-vis
		procd_append_param command ${vis_args}
		procd_close_instance
	}

	[ "$run_facters" = "1" ] && {
		( 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
	}
}

service_triggers() {
	procd_add_reload_trigger "alfred"
}

stop_service() {
	[ -e /etc/crontabs/root ] && {
		sed "\|for file in $facters_dir/\* ; do |d" -i /etc/crontabs/root
		/etc/init.d/cron restart
	}
}