12cda59d31
SVN-Revision: 20321
133 lines
2.4 KiB
Bash
133 lines
2.4 KiB
Bash
#!/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
|
|
}
|