diff options
Diffstat (limited to 'package/apcupsd/files/apccontrol')
-rw-r--r-- | package/apcupsd/files/apccontrol | 74 |
1 files changed, 74 insertions, 0 deletions
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 |