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