#!/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
}