summaryrefslogtreecommitdiff
path: root/package/apcupsd/files/apccontrol
diff options
context:
space:
mode:
Diffstat (limited to 'package/apcupsd/files/apccontrol')
-rw-r--r--package/apcupsd/files/apccontrol74
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