This commit is contained in:
ge 2022-11-10 22:09:14 +03:00
commit 7c7e8069e2
6 changed files with 544 additions and 0 deletions

24
COPYING Normal file
View File

@ -0,0 +1,24 @@
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.
In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to <http://unlicense.org/>

18
Makefile Normal file
View File

@ -0,0 +1,18 @@
PREFIX ?= /usr/local
install:
install -Dm755 btw $(PREFIX)/bin/btw
install -Dm644 btw.1 $(PREFIX)/share/man/man1/btw.1
uninstall:
rm -v $(PREFIX)/bin/btw $(PREFIX)/share/man/man1/btw.1
pkgbuild:
mkdir -p src
cp btw btw.1 src/
makepkg -c
readme:
@groff -man -Tascii btw.1 | col -bx
.PHONY: readme

15
PKGBUILD Normal file
View File

@ -0,0 +1,15 @@
pkgname=btw
pkgver=1.0
pkgrel=1
pkgdesc=''
arch=(any)
url=https://git.nxhs.cloud/ge/btw
license=(Unlicense)
depends=(coreutils acpi libnotify)
provides=(btw)
conflicts=()
srcdir="$PWD"
package() {
install -Dm755 $srcdir/btw $pkgdir/usr/bin/btw
install -Dm644 $srcdir/btw.1 $pkgdir/usr/share/man/man1/btw.1
}

113
README Normal file
View File

@ -0,0 +1,113 @@
BTW(1) User Commands BTW(1)
NAME
btw - battery watchdog
SYNOPSIS
btw [-c|--crit value] [-p|--preriod seconds] [-l|--log file]
[-j|--syslog] [-s|--summary text] [-b|--body text] [-w|--watch]
btw --help
btw --version
DESCRIPTION
Send notification when critical battery level reached.
OPTIONS
-v, --version
Print version and exit.
-h, --help
Print this help message and exit.
-c, --crit value
Battery critical value in percents [default: 10]
-p, --preriod seconds
Battery check out period in seconds [default: 30]
-l, --log file
Log file [default: ~/.cache/btw.log] -j, --syslog Use logger in-
stead of log file.
-s, --summary text
Custom notification title text.
-b, --body text
Custom notification body text.
-w, --watch
Follow to the log file (tail -f).
INVOKING
Run watchdog in background. See application autostart options for your
desktop environment or init system. For example add in your ~/.xinitrc:
btw &
or create ~/.config/autostart/btw.desktop if you have GNOME Desktop:
[Desktop Entry]
Name=Laptop battery watchdog (btw)
Exec=btw
Type=Application
LOGGING
btw writes battery status log in log file. Set file by --log option.
Log format:
[date time] [state] [level]%
There is:
[date time]
`date +'%Y-%m-%d %H:%M:%S'` command output.
[state]
Battery status, can be 'Charging' or 'Discharging'.
[level]
Battery current level in percents.
If --syslog option is passed use following commands to watch log.
btw -jw
# or
journalctl -t btw -f
EXAMPLES
btw will send notification at every battery checkout while current bat-
tery level is lower than critical value. For example, with following
command:
btw -c 15 -p 30
you will recieve notification every 30 seconds until battery is under
10%. You can set up custom notification text via --summary and --body
options.
Variables can be used in notification:
level Current battery level in percents.
state Battery status, can be full, charging or discharging.
For example:
btw -s 'Battery is very low!' -b 'Status: $state, $level%'
FILES
~/.cache/btw.log
Log file.
/tmp/btw.lock
Lock file. Prevents unwanted notifications.
SEE ALSO
acpi(1), notify-send(1)
btw 1.0 2022-01-10 BTW(1)

228
btw Executable file
View File

@ -0,0 +1,228 @@
#!/bin/sh
#
# * Battery Watchdog (see help text below).
#
# This is free and unencumbered software released into the public domain.
#
# Anyone is free to copy, modify, publish, use, compile, sell, or
# distribute this software, either in source code form or as a compiled
# binary, for any purpose, commercial or non-commercial, and by any
# means.
#
# In jurisdictions that recognize copyright laws, the author or authors
# of this software dedicate any and all copyright interest in the
# software to the public domain. We make this dedication for the benefit
# of the public at large and to the detriment of our heirs and
# successors. We intend this dedication to be an overt act of
# relinquishment in perpetuity of all present and future rights to this
# software under copyright law.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
#
# For more information, please refer to <http://unlicense.org/>
# ---
# Dependencies:
# acpi <https://sourceforge.net/projects/acpiclient/>
# libnotify <https://salsa.debian.org/gnome-team/libnotify>
#
# Installation:
# # on Arch Linux:
# pacman -S acpi # (commynity repo)
# pacman -S libnotyfy # (extra repo)
# # on Debian/Ubuntu:
# apt-get install acpi
# apt-get install libnotify
print_help() {
printf \
"btw - battery watchdog. Send notification when critical battery level reached.
Usage:
btw [-c|--crit \033[4mvalue\033[0m] [-p|--preriod \033[4mseconds\033[0m] \
[-l|--log \033[4mfile\033[0m]
[-j|--syslog] [-s|--summary t\033[4mext\033[0m] \
[-b|--body t\033[4mext\033[0m] [-w|--watch]
btw --help
btw --version
Options:
-v, --version
Print version and exit.
-h, --help
Print this help message and exit.
-c, --crit \033[4mvalue\033[0m
Battery critical value in percents [default: 10]
-p, --preriod \033[4mseconds\033[0m
Battery check out period in seconds [default: 30]
-l, --log \033[4mfile\033[0m
Log file [default: ~/.cache/btw.log]
-j, --syslog
Use logger instead of log file.
-s, --summary \033[4mtext\033[0m
Custom notification title text.
-b, --body \033[4mtext\033[0m
Custom notification body text.
-w, --watch
Follow to the log file (tail -f).
See \033[1mbtw\033[0m(1) for full help.
"
}
send_notify() {
notify-send --urgency=critical --icon=battery-empty --category=System \
"$(eval echo "$1")" "$(eval echo "$2")"
}
is_int() {
if [ -n "$1" ] && [ "$1" -eq "$1" ] 2>/dev/null; then
return 0
else
echo 'Value is not integer' >&2; exit 1
fi
}
# Transform long options to short ones
for ARG in "$@"; do
shift
case "$ARG" in
--crit)
set -- "$@" "-c"
;;
--period)
set -- "$@" "-p"
;;
--log)
set -- "$@" "-l"
;;
--syslog)
set -- "$@" "-j"
;;
--summary)
set -- "$@" "-s"
;;
--body)
set -- "$@" "-b"
;;
--watch)
set -- "$@" "-w"
;;
--help)
set -- "$@" "-h"
;;
--version)
set -- "$@" "-v"
;;
*)
set -- "$@" "$ARG"
esac
done
# Parse short opts
while getopts c:p:l:js:b:whv OPT; do
case "$OPT" in
c)
is_int "$OPTARG"
critical="$OPTARG"
;;
p)
is_int "$OPTARG"
period="$OPTARG"
;;
l)
log="$OPTARG"
;;
j)
syslog=1
;;
s)
summary="$OPTARG"
;;
b)
body="$OPTARG"
;;
w)
watch=1
;;
h)
print_help
exit 0
;;
v)
echo 1.0
exit 0
;;
*)
echo Unknown option: "$OPT" >&2
exit 1
esac
done
# Default values
period="${period:-30}" # check battery every `period` seconds
critical="${critical:-10}" # battery limit (in %)
clevel="${clevel:-100}" # current battery value (in %, temporary variable)
summary="${summary:-Extremely low battery: \$level%}"
body="${body:-Check the charger, battery currently is \$state}"
lock=/tmp/btw.lock # lock file
log="${log:-"$HOME"/.cache/btw.log}"
mkdir -p "$HOME"/.cache
if [ -n "$watch" ]; then
if [ -n "$syslog" ]; then
journalctl -t btw -f
else
tail -f "$log"
fi
exit "$?"
fi
printf 'crit: %s%%; period: %ss; log: %s\n' "$critical" "$period" "$log" >&2
while true; do
battery="$(acpi -b | awk '{print $3 " " $4}' |
sed -E 's/,|%//g;' | tr '[:upper:]' '[:lower:]')"
level="${battery##* }" # e.g. "49" (in percents)
state="${battery%% *}" # e.g. "charging"
if [ "$level" -le "$critical" ]; then
if [ ! -f "$lock" ]; then
send_notify "$summary" "$body"
touch "$lock"
fi
# Warn in every percent less
if [ "$level" -le "$clevel" ]; then
send_notify "$summary" "$body"
touch "$lock"
clevel="$level"
fi
else
[ -f "$lock" ] && rm "$lock"
fi
log_message="$(printf '%s %s %s%%' \
"$(date +'%Y-%m-%d %H:%M:%S')" "$state" "$level")"
if [ -n "$syslog" ]; then
echo "$log_message"
logger -i "$$" -t btw -- "$log_message"
else
echo "$log_message" | tee -a "$log"
fi
sleep "$period"
done

146
btw.1 Normal file
View File

@ -0,0 +1,146 @@
.\" btw (c) ge <https://nixhacks.net>
.\" License: The Unlicense <https://unlicense.org/>
.\" vim: set filetype=groff:
.TH BTW 1 "2022-01-10" "btw 1.0" "User Commands"
.SH NAME
btw \- battery watchdog
.SH SYNOPSIS
.SY btw
.OP \-c|\-\-crit value
.OP \-p|\-\-preriod seconds
.OP \-l|\-\-log file
.OP \-j|\-\-syslog
.OP \-s|\-\-summary text
.OP \-b|\-\-body text
.OP \-w|\-\-watch
.SY btw
.B \-\-help
.SY btw
.B \-\-version
.YS
.SH DESCRIPTION
Send notification when critical battery level reached.
.SH OPTIONS
.TP
\fB\-v\fR, \fB\-\-version\fR
Print version and exit.
.TP
\fB\-h\fR, \fB\-\-help\fR
Print this help message and exit.
.TP
\fB\-c\fR, \fB\-\-crit\fR \fIvalue\fR
Battery critical value in percents [default: 10]
.TP
\fB\-p\fR, \fB\-\-preriod\fR \fIseconds\fR
Battery check out period in seconds [default: 30]
.TP
\fB\-l\fR, \fB\-\-log\fR \fIfile\fR
Log file [default: ~/.cache/btw.log]
\fB\-j\fR, \fB\-\-syslog\fR
Use logger instead of log file.
.TP
\fB\-s\fR, \fB\-\-summary\fR \fItext\fR
Custom notification title text.
.TP
\fB\-b\fR, \fB\-\-body\fR \fItext\fR
Custom notification body text.
.TP
\fB\-w\fR, \fB\-\-watch\fR
Follow to the log file (tail -f).
.SH INVOKING
Run watchdog in background. See application autostart options for your
desktop environment or init system. For example add in your ~/.xinitrc:
.PP
.in +4m
.EX
btw &
.EE
.in
.PP
or create ~/.config/autostart/btw.desktop if you have GNOME Desktop:
.PP
.in +4m
.EX
[Desktop Entry]
Name=Laptop battery watchdog (btw)
Exec=btw
Type=Application
.EE
.in
.PP
.SH LOGGING
btw writes battery status log in log file. Set file by --log option.
.PP
Log format:
.PP
.in +4m
.EX
[date time] [state] [level]%
.EE
.in
.PP
There is:
.TP
[date time]
`date +'%Y-%m-%d %H:%M:%S'` command output.
.TP
[state]
Battery status, can be 'Charging' or 'Discharging'.
.TP
[level]
Battery current level in percents.
.PP
If --syslog option is passed use following commands to watch log.
.PP
.in +4m
.EX
btw -jw
# or
journalctl -t btw -f
.EE
.in
.PP
.SH EXAMPLES
.B btw
will send notification at every battery checkout while current battery
level is lower than critical value. For example, with following command:
.PP
.in +4m
.EX
btw -c 15 -p 30
.EE
.in
.PP
you will recieve notification every 30 seconds until battery is under 10%.
You can set up custom notification text via --summary and --body options.
.PP
Variables can be used in notification:
.TP
.B level
Current battery level in percents.
.TP
.B state
Battery status, can be
.IR full ,
.IR charging
or
.IR discharging .
.PP
For example:
.PP
.in +4m
.EX
btw -s 'Battery is very low!' -b 'Status: $state, $level%'
.EE
.in
.PP
.SH FILES
.TP
~/.cache/btw.log
Log file.
.TP
/tmp/btw.lock
Lock file. Prevents unwanted notifications.
.SH SEE ALSO
.BR acpi (1),
.BR notify-send (1)