diff --git a/net/etherwake/Makefile b/net/etherwake/Makefile new file mode 100644 index 000000000..3a7e249c3 --- /dev/null +++ b/net/etherwake/Makefile @@ -0,0 +1,54 @@ +# +# Copyright (C) 2007-2011 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=etherwake +PKG_VERSION:=1.09 +PKG_RELEASE:=3 + +PKG_SOURCE:=$(PKG_NAME)_$(PKG_VERSION).orig.tar.gz +PKG_SOURCE_URL:=http://ftp.debian.org/debian/pool/main/e/etherwake +PKG_MD5SUM:=628e8b2a28d47f262e4c26c989402a59 + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION).orig + +include $(INCLUDE_DIR)/package.mk + +define Package/etherwake + SECTION:=net + CATEGORY:=Network + TITLE:=WoL client for magic packets via ethernet frames + URL:=http://ftp.debian.org/debian/pool/main/e/etherwake +endef + +define Package/etherwake/description + You can wake up WOL compliant Computers which have been powered down to + sleep mode or start WOL compliant Computers with a BIOS feature. + WOL is an abbreviation for Wake-on-LAN. It is a standard that allows you + to turn on a computer from another location over a network connection. + ether-wake also supports WOL passwords. +endef + +define Build/Compile + $(TARGET_CC) $(TARGET_CFLAGS) -D__UCLIBC__ $(PKG_BUILD_DIR)/ether-wake.c -o $(PKG_BUILD_DIR)/etherwake +endef + +define Package/etherwake/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/etherwake $(1)/usr/bin/ + $(INSTALL_DIR) $(1)/etc/config + $(INSTALL_DATA) files/$(PKG_NAME).config $(1)/etc/config/$(PKG_NAME) + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) files/$(PKG_NAME).init $(1)/etc/init.d/$(PKG_NAME) +endef + +define Package/etherwake/conffiles +/etc/config/etherwake +endef + +$(eval $(call BuildPackage,etherwake)) diff --git a/net/etherwake/files/etherwake.config b/net/etherwake/files/etherwake.config new file mode 100644 index 000000000..3d8e5158c --- /dev/null +++ b/net/etherwake/files/etherwake.config @@ -0,0 +1,28 @@ +config 'etherwake' 'setup' + # possible program pathes + option 'pathes' '/usr/bin/etherwake /usr/bin/ether-wake' + # use sudo, defaults to off + option 'sudo' 'off' + # interface, defaults to 'eth0' + # -i + option 'interface' '' + # send wake-up packet to the broadcast address, defaults to off + # -b + option 'broadcast' 'off' + +config 'target' + # name for the target + option 'name' 'example' + # mac address to wake up + option 'mac' '11:22:33:44:55:66' + # password in hex without any delimiters + option 'password' 'AABBCCDDEEFF' + # wake up on system start, defaults to off + option 'wakeonboot' 'off' + +# To add a new target use: +# uci add etherwake target +# uci set etherwake.@target[-1].name=example +# uci set etherwake.@target[-1].mac=11:22:33:44:55:66 +# uci set etherwake.@target[-1].password=AABBCCDDEEFF +# uci set etherwake.@target[-1].wakeonboot=off diff --git a/net/etherwake/files/etherwake.init b/net/etherwake/files/etherwake.init new file mode 100644 index 000000000..0504cf1c0 --- /dev/null +++ b/net/etherwake/files/etherwake.init @@ -0,0 +1,132 @@ +#!/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 +} diff --git a/net/etherwake/patches/100-no_ether_hostton.patch b/net/etherwake/patches/100-no_ether_hostton.patch new file mode 100644 index 000000000..e33c06b11 --- /dev/null +++ b/net/etherwake/patches/100-no_ether_hostton.patch @@ -0,0 +1,37 @@ +--- etherwake-1.09.orig/ether-wake.c 2005-07-10 20:44:25.000000000 +0200 ++++ etherwake-1.09.orig.no_ether_hostton/ether-wake.c 2007-04-29 19:03:41.000000000 +0200 +@@ -15,7 +15,11 @@ + " an optional password appended.\n" + "\n" + " The single required parameter is the Ethernet MAC (station) address\n" ++#if !defined(__UCLIBC__) + " of the machine to wake or a host ID with known NSS 'ethers' entry.\n" ++#else ++" of the machine to wake.\n" ++#endif + " The MAC address may be found with the 'arp' program while the target\n" + " machine is awake.\n" + "\n" +@@ -289,16 +293,22 @@ + if (debug) + fprintf(stderr, "The target station address is %s.\n", + ether_ntoa(eaddr)); ++#if !defined(__UCLIBC__) + } else if (ether_hostton(hostid, eaddr) == 0) { + if (debug) + fprintf(stderr, "Station address for hostname %s is %s.\n", + hostid, ether_ntoa(eaddr)); ++#endif + } else { + (void)fprintf(stderr, + "ether-wake: The Magic Packet host address must be " + "specified as\n" ++#if !defined(__UCLIBC__) + " - a station address, 00:11:22:33:44:55, or\n" + " - a hostname with a known 'ethers' entry.\n"); ++#else ++ " - a station address, 00:11:22:33:44:55\n"); ++#endif + return -1; + } + return 0;