etherwake.init (2459B)
1 #!/bin/sh /etc/rc.common 2 # Copyright (C) 2009 OpenWrt.org 3 4 NAME='etherwake' 5 START=60 6 PROGRAM='' 7 8 start() 9 { 10 local searchlist='' 11 local section='' 12 local value='' 13 14 config_load "${NAME}" 15 16 # check for available program 17 config_get searchlist 'setup' 'pathes' 18 PROGRAM=$(search_program "${searchlist}") 19 [ -z "${PROGRAM}" ] && { 20 echo "${initscript}: No ${NAME} program installed. Check: opkg list | grep ${NAME}" 21 exit 1 22 } 23 24 # sudo 25 config_get_bool value 'setup' 'sudo' '0' 26 [ "${value}" -ne 0 ] && PROGRAM="sudo ${PROGRAM}" 27 28 # interface 29 config_get value 'setup' 'interface' 30 [ -n "${value}" ] && append PROGRAM "-i ${value}" 31 32 # broadcast 33 config_get_bool value 'setup' 'broadcast' '0' 34 [ "${value}" -ne 0 ] && append PROGRAM '-b' 35 36 # wake up targets 37 config_foreach etherwake_start target $* 38 } 39 40 etherwake_start() 41 { 42 local section="$1" 43 shift 44 45 local names="$*" 46 47 local value='' 48 local target='' 49 50 if [ -z "${names}" ] 51 then 52 # check if boot target 53 config_get_bool value "${section}" 'wakeonboot' '0' 54 [ "${value}" -eq 0 ] && return 0 55 56 # wake up target 57 do_etherwake "${section}" 58 return $? 59 else 60 # name 61 config_get value "${section}" 'name' 62 [ -z "${value}" ] && return 0 63 64 for target in ${names} 65 do 66 [ "${value}" != "${target}" ] && continue 67 68 # wake up target 69 do_etherwake "${section}" 70 return $? 71 done 72 fi 73 } 74 75 # execute etherwake command for target 76 do_etherwake() 77 { 78 local section="$1" 79 local value='' 80 local password='' 81 local args='' 82 83 # password 84 config_get value "${section}" 'password' 85 [ -n "${value}" ] && { 86 password=$(etherwake_password "${value}") 87 append args "-p ${password}" 88 } 89 90 # mac address 91 config_get value "${section}" 'mac' 92 [ -z "${value}" ] && { echo "${initscript}: Target ${section} has no MAC address"; return 1; } 93 append args "${value}" 94 95 # name 96 config_get value "${section}" 'name' 97 [ -z "${value}" ] && value="{section}" 98 99 # execute command 100 echo "${initscript}: Waking up ${value} via ${PROGRAM}${args:+ ${args}}" 101 ${PROGRAM} ${args} 102 return $? 103 } 104 105 106 # find first available program from searchlist 107 search_program() 108 { 109 local searchlist="$1" 110 local test='' 111 local program='' 112 113 for test in ${searchlist} ; do 114 [ -x "${test}" ] && { 115 program="${test}" 116 break; 117 } 118 done 119 120 [ -n "${program}" ] && echo "${program}" 121 122 return 123 } 124 125 # prepare hex password 126 etherwake_password() 127 { 128 local delimiter=':' 129 local password=`echo "$1" | sed "s/../&${delimiter}/g"` 130 echo "${password%${delimiter}}" 131 return 132 }