#!/bin/sh /etc/rc.common
# Copyright (C) 2009 OpenWrt.org

NAME='etherwake'
START=60
PROGRAM=''

start()
{
	local searchlist=''
	local section=''
	local value=''

	config_load "${NAME}"

	# check for available program
	config_get searchlist 'setup' 'pathes'
	PROGRAM=$(search_program "${searchlist}")
	[ -z "${PROGRAM}" ] && {
		echo "${initscript}: No ${NAME} program installed. Check: opkg list | grep ${NAME}"
		exit 1
	}

	# sudo
	config_get_bool value 'setup' 'sudo' '0'
	[ "${value}" -ne 0 ] && PROGRAM="sudo ${PROGRAM}"

	# interface
	config_get value 'setup' 'interface'
	[ -n "${value}" ] && append PROGRAM "-i ${value}"

	# broadcast
	config_get_bool value 'setup' 'broadcast' '0'
	[ "${value}" -ne 0 ] && append PROGRAM '-b'

	# wake up targets
	config_foreach etherwake_start target $*
}

etherwake_start()
{
	local section="$1"
	shift

	local names="$*"

	local value=''
	local target=''

	if [ -z "${names}" ]
	 then
		# check if boot target
		config_get_bool value "${section}" 'wakeonboot' '0'
		[ "${value}" -eq 0 ] && return 0

		# wake up target
		do_etherwake "${section}"
		return $?
	else
		# name
		config_get value "${section}" 'name'
		[ -z "${value}" ] && return 0

		for target in ${names}
		 do
			[ "${value}" != "${target}" ] && continue

			# wake up target
			do_etherwake "${section}"
			return $?
		done
	fi
}

# execute etherwake command for target
do_etherwake()
{
	local section="$1"
	local value=''
	local password=''
	local args=''

	# password
	config_get value "${section}" 'password'
	[ -n "${value}" ] && {
		password=$(etherwake_password "${value}")
		append args "-p ${password}"
	}

	# mac address
	config_get value "${section}" 'mac'
	[ -z "${value}" ] && { echo "${initscript}: Target ${section} has no MAC address"; return 1; }
	append args "${value}"

	# name
	config_get value "${section}" 'name'
	[ -z "${value}" ] && value="{section}"

	# execute command
	echo "${initscript}: Waking up ${value} via ${PROGRAM}${args:+ ${args}}"
	${PROGRAM} ${args}
	return $?
}


# find first available program from searchlist
search_program()
{
	local searchlist="$1"
	local test=''
	local program=''

	for test in ${searchlist} ; do
		[ -x "${test}" ] && {
			program="${test}"
			break;
		}
	done

	[ -n "${program}" ] && echo "${program}"

	return
}

# prepare hex password
etherwake_password()
{
	local delimiter=':'
	local password=`echo "$1" | sed "s/../&${delimiter}/g"`
	echo "${password%${delimiter}}"
	return
}