From c0845627b0a78c954cd9a8ec1f2c74fbadb319dd Mon Sep 17 00:00:00 2001
From: Harald Pfeiffer <harald.pfeiffer@xmart.de>
Date: Wed, 27 Jun 2018 13:31:34 +0200
Subject: Initial commit

---
 README.md     | 18 ++++++++++++++++++
 bin/batman    | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 cron.d/batman |  1 +
 3 files changed, 74 insertions(+)
 create mode 100644 README.md
 create mode 100755 bin/batman
 create mode 100644 cron.d/batman

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..a7585fb
--- /dev/null
+++ b/README.md
@@ -0,0 +1,18 @@
+## I'm Batman!
+
+It's a simple shell script that can do two things:
+1. Report the current battery charge and whether the battery is charging or not.
+2. Shutdown the machine if the charge is below 5%, the battery is discharging,
+   and the user is privileged to do so.
+
+Currently I'm including this in a cron file. This repository should soon host a
+systemd timer file as well.
+
+To-Dos:
+[ ] systemd timer file
+[ ] use [/var]/run instead of /tmp for the "are we rebooting"-file
+
+## Why?
+
+Because I can :) There are other mechanisms out there, but I started this
+script in unintended ignorance of these and now I finished it ;)
diff --git a/bin/batman b/bin/batman
new file mode 100755
index 0000000..5b873d7
--- /dev/null
+++ b/bin/batman
@@ -0,0 +1,55 @@
+#!/bin/sh
+
+declare -x VOERBOOS
+RETVAL=0;export RETVAL
+BATVAL="$(echo "scale=0;$(cat /sys/class/power_supply/BAT0/charge_now)*100/$(cat /sys/class/power_supply/BAT0/charge_full)"|bc -l)";export BATVAL
+BATSTATE="`cat /sys/class/power_supply/BAT0/status`";export BATSTATE
+BATFILE="/tmp/batman.sd";export BATFILE
+export OPTCNT=0
+function batmobile {
+	if [ "$BATVAL" -le 5 ];then
+		case "$BATSTATE" in
+			"Charging")
+				MSG="Battery charged at $BATVAL% with status \"$BATSTATE\", no shutdown."
+				[ ! -z "$VOERBOOS" ]&&[ "$VOERBOOS" -eq 1 ]&&echo "$MSG"||true
+				logger -p"info" -t"batman" "Battery charged at $BATVAL% with status \"$BATSTATE\", no shutdown."||RETVAL=$(("$RETVAL"+$?))
+				[ -e "$BATFILE" ]&&/usr/sbin/shutdown -c >/dev/null 2>&1&&rm "$BATFILE"
+				SDCRV="$?"
+				case "$SDCRV" in
+					0) logger -p"info" -t"batman" "Shutdown cancelled.";;
+					*)
+						logger -p"warn" -t"batman" "$BATFILE exists but couldn't cancel shutdown!"
+						RETVAL=$(("$RETVAL"+"$SDCRV"))
+					;;
+				esac
+			;;
+			*)
+				MSG="Battery charged at $BATVAL%, powering down."
+				[ ! -z "$VOERBOOS" ]&&[ "$VOERBOOS" -eq 1 ]&&echo "$MSG"||true
+				logger -pwarn -t"batman" "$MSG"||RETVAL=$(("$RETVAL"+$?))
+				if [ ! -e "$BATFILE" ];then
+					/usr/sbin/shutdown -P +2 "Battery low and discharging, powering down. (batman)"&&touch "$BATFILE"||RETVAL=$(("$RETVAL"+$?))
+				fi
+			;;
+		esac
+	else
+		MSG="Battery charged at $BATVAL%, no shutdown."
+		[ ! -z "$VOERBOOS" ]&&[ "$VOERBOOS" -eq 1 ]&&echo "$MSG"||logger -p"info" -t"batman" "$MSG"||RETVAL=$(("$RETVAL"+$?))
+	fi
+}
+function batarang {
+	MSG="$BATVAL% ($BATSTATE)";echo "$MSG";
+}
+
+while getopts :vnp SHOPT;do
+	case "$SHOPT" in
+		v)VOERBOOS=1;export VOERBOOS;((OPTCNT++));;
+		p)batmobile;((OPTCNT++));;
+		""|n)batarang;((OPTCNT++));;
+		*)echo "Not supported option: -""${OPTARG}" >&2;RETVAL=$(($RETVAL+1)) >&2;WRONGOPT=1;((OPTCNT++));;
+	esac
+done
+shift $(( $OPTIND - 1 ))
+[ "$OPTCNT" -le 0 ]&&batarang
+[ ! -z "$WRONGOPT" ]&&[ "$WRONGOPT" -eq 1 ]&&exit 1||true
+exit "$RETVAL"
diff --git a/cron.d/batman b/cron.d/batman
new file mode 100644
index 0000000..d0af5a7
--- /dev/null
+++ b/cron.d/batman
@@ -0,0 +1 @@
+* *	* * *	root /usr/local/bin/batman -p
-- 
cgit v1.2.3