diff options
-rw-r--r-- | package/apcupsd/Makefile | 44 | ||||
-rw-r--r-- | package/apcupsd/files/apccontrol | 74 | ||||
-rw-r--r-- | package/apcupsd/files/apcupsd.conffiles | 1 | ||||
-rw-r--r-- | package/apcupsd/files/apcupsd.init | 38 | ||||
-rw-r--r-- | package/apcupsd/files/apcupsd.postinst | 3 | ||||
-rw-r--r-- | target/linux/config/Config.in.input | 1 |
6 files changed, 161 insertions, 0 deletions
diff --git a/package/apcupsd/Makefile b/package/apcupsd/Makefile new file mode 100644 index 000000000..c6d72cd94 --- /dev/null +++ b/package/apcupsd/Makefile @@ -0,0 +1,44 @@ +# This file is part of the OpenADK project. OpenADK is copyrighted +# material, please see the LICENCE file in the top-level directory. + +include $(ADK_TOPDIR)/rules.mk + +PKG_NAME:= apcupsd +PKG_VERSION:= 3.14.14 +PKG_RELEASE:= 1 +PKG_HASH:= db7748559b6b4c3784f9856561ef6ac6199ef7bd019b3edcd7e0a647bf8f9867 +PKG_DESCR:= APC UPS daemon with integrated tcp/ip remote shutdown +PKG_SECTION:= sys/misc +PKG_DEPENDS:= libusb +PKG_BUILDDEP:= libusb +PKG_URL:= http://www.apcupsd.org +PKG_SITES:= $(MASTER_SITE_SOURCEFORGE:=apcupsd/) +DISTFILES:= $(PKG_NAME)-$(PKG_VERSION).tar.gz + +PKG_CFLINE_APCUPSD:= select BUSYBOX_WALL@ +PKG_CFLINE_APCUPSD+= select ADK_LINUX_KERNEL_USB_HID@ + +include $(ADK_TOPDIR)/mk/package.mk + +$(eval $(call PKG_template,APCUPSD,apcupsd,$(PKG_VERSION)-$(PKG_RELEASE),$(PKG_DEPENDS),$(PKG_DESCR),$(PKG_SECTION))) + +CONFIGURE_ARGS+= --prefix="${WRKINST}" --sbindir="/usr/sbin" --enable-usb +CONFIGURE_ENV+= ac_cv_path_WALL=/usr/bin/wall +XAKE_FLAGS:= VERBOSE=1 STRIP="" + +# XXX: custom init script? +apcupsd-install: + $(INSTALL_DIR) $(IDIR_APCUPSD)/usr/sbin + $(INSTALL_BIN) $(WRKINST)/usr/sbin/apc{access,test,upsd} \ + $(IDIR_APCUPSD)/usr/sbin + $(INSTALL_DIR) $(IDIR_APCUPSD)/etc + $(INSTALL_DATA) $(WRKINST)/etc/apcupsd.conf $(IDIR_APCUPSD)/etc + # default to USB-based UPS, avoid writing to /etc to keep cfgfs clean + $(SED) 's/^UPSCABLE smart/UPSCABLE usb/' \ + -e 's/^UPSTYPE apcsmart/UPSTYPE usb/' \ + -e 's,^DEVICE /dev/ttyS0,DEVICE,' \ + -e 's,^PWRFAILDIR /etc,PWRFAILDIR /tmp,' \ + $(IDIR_APCUPSD)/etc/apcupsd.conf + $(INSTALL_BIN) ./files/apccontrol $(IDIR_APCUPSD)/etc/ + +include $(ADK_TOPDIR)/mk/pkg-bottom.mk diff --git a/package/apcupsd/files/apccontrol b/package/apcupsd/files/apccontrol new file mode 100644 index 000000000..e402c513d --- /dev/null +++ b/package/apcupsd/files/apccontrol @@ -0,0 +1,74 @@ +#!/bin/sh +# +# A custom apccontrol for use in embedded systems: just make sure there's no +# data in-flight and wait for the blackout to shut us down. + +# these filesystems are not relevant +IGNORE_FS="tmpfs proc sysfs devtmpfs devpts nfsd" + +get_rw_mounts() { + local excl='\((ro,\|type \(' + local sep="" + for fs in $IGNORE_FS; do + excl+="${sep}$fs" + sep='\|' + done + excl+='\)\)' + mount | grep -v "$excl" | while read dev on mnt opts; do + echo "$mnt" + done +} + +log() { + logger -s -t "$(basename $0)" -p daemon.crit "$*" +} +__mount() { # (ro/rw, txt, mnt) + local opt=$1 + local txt=$2 + local mnt="$3" + + mount -o remount,$opt "$mnt" + rc=$? + case $rc in + 0) log "remounted $mnt $txt" + *) log "failed to remount $mnt $txt: rc=$rc" + esac + return $rc +} +mount_ro() { + __mount ro read-only "$1" +} +mount_rw() { + __mount rw read-write "$1" +} + +romounts="/tmp/apcupsd.romounts" + +case "$1" in + emergency|failing) + log "UPS error condition happening" + ;& # fall through + doshutdown) + log "bracing for upcoming blackout" + + rm -f "$romounts" + sync + get_rw_mounts | while read mnt; do + mount_ro "$mnt" && echo "$mnt" >>"$romounts" + done + ;; + mainsback) + log "returning to routine after near blackout" + + touch "$romounts" + while read mnt; do + mount_rw "$mnt" + done <"$romounts" + rm "$romounts" + ;; + *) + log "Called for $1" + ;; +esac + +exit 0 diff --git a/package/apcupsd/files/apcupsd.conffiles b/package/apcupsd/files/apcupsd.conffiles new file mode 100644 index 000000000..7bae4c961 --- /dev/null +++ b/package/apcupsd/files/apcupsd.conffiles @@ -0,0 +1 @@ +/etc/apcupsd.conf diff --git a/package/apcupsd/files/apcupsd.init b/package/apcupsd/files/apcupsd.init new file mode 100644 index 000000000..a9817f1be --- /dev/null +++ b/package/apcupsd/files/apcupsd.init @@ -0,0 +1,38 @@ +#!/bin/sh +#PKG apcupsd +#INIT 15 +. /etc/rc.conf + +pidfile=$(echo "$apcupsd_flags" | \ + sed -n 's/.*\(-P\|--pid-file\) \([^ ]\+\).*/\2/p') +[ "$pidfile" ] || pidfile="/var/run/apcupsd.pid" + +case $1 in +autostop) ;; +autostart) + test x"${apcupsd:-NO}" = x"NO" && exit 0 + test x"$apcupsd" = x"DAEMON" && test -x /bin/mksh && exec mksh -T- $0 start + exec sh $0 start + ;; +start) + mkdir -p /var/lock + /usr/sbin/apcupsd $apcupsd_flags + ;; +stop) + if [ -f "$pidfile" ]; then + kill $(<$pidfile) + rm -f $pidfile + else + kill $(pgrep -f /usr/sbin/apcupsd) + fi + ;; +restart) + sh $0 stop + sleep 1 + sh $0 start + ;; +*) + echo "usage: $0 (start | stop | restart)" + exit 1 +esac +exit $? diff --git a/package/apcupsd/files/apcupsd.postinst b/package/apcupsd/files/apcupsd.postinst new file mode 100644 index 000000000..299fabc0f --- /dev/null +++ b/package/apcupsd/files/apcupsd.postinst @@ -0,0 +1,3 @@ +#!/bin/sh +. $IPKG_INSTROOT/etc/functions.sh +add_rcconf apcupsd NO diff --git a/target/linux/config/Config.in.input b/target/linux/config/Config.in.input index 0d7800c92..7d4932e41 100644 --- a/target/linux/config/Config.in.input +++ b/target/linux/config/Config.in.input @@ -115,6 +115,7 @@ config ADK_LINUX_KERNEL_USB_HID select ADK_LINUX_KERNEL_HID select ADK_LINUX_KERNEL_HID_SUPPORT select ADK_LINUX_KERNEL_HID_GENERIC + select ADK_LINUX_KERNEL_USB_HIDDEV depends on ADK_TARGET_WITH_USB \ || ADK_TARGET_GENERIC \ || ADK_TARGET_QEMU |