Browse Source

Create bash-battery-suspend.sh

Vova Tkach 5 years ago
parent
commit
da9bf3c640
1 changed files with 153 additions and 0 deletions
  1. 153 0
      bash-battery-suspend.sh

+ 153 - 0
bash-battery-suspend.sh

@@ -0,0 +1,153 @@
+#!/bin/bash
+
+# MIT License
+# https://github.com/vladimirok5959/bash-battery-suspend
+
+# Settings
+BAT_SUSPEND_MSG_PERC="20"
+BAT_SUSPEND_ACT_PERC="15"
+
+# Consts
+CONST_PID_FILE="/tmp/batt.suspend.pid"
+
+batt_check_util() {
+	util_name="$1"
+	check=`\
+		whereis $util_name | \
+		awk '{ print $2 }' \
+	`
+	if [ "$check" = "" ]; then
+		echo "Error: '$util_name' is not found..."
+		exit
+	fi
+}
+
+batt_get_percentage() {
+	percentage=`\
+		upower \
+		-i /org/freedesktop/UPower/devices/battery_BAT0 | \
+		grep "percentage:" | \
+		awk '{ print $2 }' | \
+		sed 's/[^0-9]$//g' \
+	`
+	echo "${percentage}"
+}
+
+batt_warning_msg() {
+	notify-send \
+	--urgency=critical \
+	"Battery is critically low" \
+	"OS will be suspended on ${BAT_SUSPEND_ACT_PERC}%"
+}
+
+batt_suspend() {
+	systemctl suspend -i
+}
+
+batt_pid_get() {
+	if [ -f "${CONST_PID_FILE}" ]; then
+		cat ${CONST_PID_FILE}
+	else
+		echo "0"
+	fi
+}
+
+batt_pid_set() {
+	echo "$1" > ${CONST_PID_FILE}
+}
+
+batt_pid_del() {
+	if [ -f "${CONST_PID_FILE}" ]; then
+		rm ${CONST_PID_FILE}
+	fi
+}
+
+batt_loop() {
+	BAT_DO_MSG="0"
+	BAT_DO_ACT="0"
+
+	while [ 1 ]
+	do
+		current=$(batt_get_percentage)
+		if (( BAT_DO_MSG == 0 )); then
+			if (( current <= BAT_SUSPEND_MSG_PERC )); then
+				BAT_DO_MSG="1"
+				batt_warning_msg
+			fi
+		fi
+		if (( current <= BAT_SUSPEND_ACT_PERC )); then
+			BAT_DO_ACT="1"
+			break
+		fi
+		sleep 2
+	done
+
+	batt_pid_del
+
+	if (( BAT_DO_ACT == 1 )); then
+		batt_suspend
+	fi
+}
+
+start() {
+	pid=$(batt_pid_get)
+	if (( pid == 0 )); then
+		(
+			batt_loop
+			exit 0
+		)&
+		batt_pid_set "$!"
+		status
+	else
+		echo "Already!"
+		status
+	fi
+}
+
+stop() {
+	pid=$(batt_pid_get)
+	if (( pid == 0 )); then
+		echo "Script is not runned"
+	else
+		kill -9 ${pid}
+		batt_pid_del
+		echo "Stopped!"
+	fi
+}
+
+status() {
+	pid=$(batt_pid_get)
+	if (( pid == 0 )); then
+		echo "Status: is not runned"
+	else
+		echo "Status: runned"
+		echo "Alert perc: ${BAT_SUSPEND_MSG_PERC}%"
+		echo "Suspend perc: ${BAT_SUSPEND_ACT_PERC}%"
+	fi
+}
+
+usage() {
+	echo "$0 (start|stop|status)"
+	status
+}
+
+batt_check_util "grep"
+batt_check_util "upower"
+batt_check_util "systemctl"
+batt_check_util "notify-send"
+
+case $1 in
+	"start")
+		start
+		;;
+	"stop")
+		stop
+		;;
+	"status")
+		status
+		;;
+	*)
+		usage
+		;;
+esac
+exit