#!/bin/bash
-# Copyright (C) 2019 Ian Kelling
-# SPDX-License-Identifier: AGPL-3.0-or-later
+
+# Basic system status on on Ian's computers
+# Copyright (C) 2024 Ian Kelling
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# SPDX-License-Identifier: GPL-3.0-or-later
# usage: runs once every 15 seconds unless any args are passed, or we
# then just runs once and have verbose output. On battery power, run
exit 1
fi
-source /a/bin/errhandle/err
+source /a/bin/bash-bear-trap/bash-bear
status_file=/dev/shm/iank-status
shopt -s nullglob
# set -x
# PS4='+ $(date "+%2N") '
# allow failure in case there are no snapshots yet.
- # shellcheck disable=SC2012
shopt -s nullglob
files=($btrbk_root/$vol.20*)
shopt -u nullglob
- if (( ! ${#files[@]} )); then
- continue
- fi
- snaps=($(ls -1avdr "${files[@]}" 2>/dev/null |head -n1 || : ))
- now=$EPOCHSECONDS
- maxtime=0
- for s in ${snaps[@]}; do
- file=${s##*/}
- t=$(date -d $(sed -r 's/(.{4})(..)(.{5})(..)(.*)/\1-\2-\3:\4:\5/' <<<${file#$vol.}) +%s)
- if (( t > maxtime )); then
- maxtime=$t
- fi
- done
- snapshotmsg=
- last_snap_age=$(( now - maxtime ))
- last_snap_hours=$(( last_snap_age / 60 / 60 ))
- if (( last_snap_age > old_snap_limit )); then
- chars+=(OLD-SNAP-${last_snap_hours}h)
- snapshotmsg="/$vol snapshot older than 4 hours"
- if [[ $MAIL_HOST == "$HOSTNAME" ]]; then
- p "$snapshotmsg" | lo -1 old-snapshot
+ if (( ${#files[@]} )); then
+ # shellcheck disable=SC2012 # using ls version sort. not sure this is needed.
+ snaps=("$(ls -1avdr "${files[@]}" 2>/dev/null |head -n1 || : )")
+ now=$EPOCHSECONDS
+ maxtime=0
+ for s in ${snaps[@]}; do
+ file=${s##*/}
+ t=$(date -d "$(sed -r 's/(.{4})(..)(.{5})(..)(.*)/\1-\2-\3:\4:\5/' <<<${file#"$vol."})" +%s)
+ if (( t > maxtime )); then
+ maxtime=$t
+ fi
+ done
+ snapshotmsg=
+ last_snap_age=$(( now - maxtime ))
+ last_snap_hours=$(( last_snap_age / 60 / 60 ))
+ if (( last_snap_age > old_snap_limit )); then
+ chars+=(OLD-SNAP-${last_snap_hours}h)
+ snapshotmsg="/$vol snapshot older than 4 hours"
+ if [[ $MAIL_HOST == "$HOSTNAME" ]]; then
+ p "$snapshotmsg" | lo -1 old-snapshot
+ fi
+ # not bothering to get info on all volumes if we find an old one.
fi
- # not bothering to get info on all volumes if we find an old one.
fi
for mid in $(exiqgrep -o 2400 -zi); do
if exim -Mvh $mid | awk 'tolower($2) == "fdate:"' | grep -q .; then
qlen=$(( qlen - 1 ))
+ # shellcheck disable=SC2016 # exim var, not a bash bar
if (( $(date -d "$(exim -Mset $mid -be <<<'$h_date:' | sed -n 's/^> *//;/./p')" +%s) < EPOCHSECONDS )); then
if ip a show veth0-mail &>/dev/null; then
pid=$(pgrep -f "/usr/sbin/exim4 -bd -q30m -C /etc/exim4/my.conf"|head -n1);
# leave it up to epanic-clean to send email notification
fi
+ mprom=/var/lib/prometheus/node-exporter/mailtest-check.prom
+ if [[ -s $mprom ]]; then
+ if grep -qE 'mailtest_check_(unexpected|missing).*[^ ][^0]$' $mprom; then
+ chars+=("MTEST_SPAM")
+ fi
+ mtest_found=false
+ # shellcheck disable=SC2013 # these are words
+ for t in $(grep -E ^mailtest_check_last_usec $mprom | awk '{print $NF}'); do
+ if (( t + 60 * 20 < EPOCHSECONDS )); then
+ mtest_found=true
+ fi
+ done
+ if $mtest_found; then
+ chars+=("MTEST_AGE")
+ fi
+ fi
+
if [[ ! -e $status_file || -w $status_file ]]; then
if [[ -e /a/bin/bash_unpublished/source-state ]]; then
cat /a/bin/bash_unpublished/source-state >$status_file
fi
midnight=$(date -d 00:00 +%s)
mdiff=$(( EPOCHSECONDS - midnight ))
- if $locked && (( mdiff < 6 || mdiff > 21 )); then
+ if $locked && (( mdiff < 6 *60*60 || mdiff > 21 *60*60 )); then
case $(pactl get-sink-mute @DEFAULT_SINK@ | awk '{print $2}') in
no)
# for log purposes
- echo unmuted
+ echo muted
pactl set-sink-mute @DEFAULT_SINK@ true
;;
esac
fi
- if ! $locked && (( mdiff > 6 || mdiff < 12 )) && [[ ! -e /tmp/ianknap ]]; then
+ if ! $locked && (( mdiff > 6 *60*60 || mdiff < 12 *60*60 )) && [[ ! -e /tmp/ianknap ]]; then
case $(pactl get-sink-mute @DEFAULT_SINK@ | awk '{print $2}') in
yes)
# for log purposes
- echo muted
+ echo unmuted
pactl set-sink-mute @DEFAULT_SINK@ false
;;
esac
exit 0
fi
+loop_count=0
main-loop() {
while true; do
power=true
power=false
fi
wait=15
- if ! $power; then
- if systemctl -q is-active bitcoind; then
- bitcoinoff
+
+ if $power; then
+ if (( loop_count % 10 == 0 )); then
+ if [[ -r /sys/class/power_supply/BAT0/capacity ]]; then
+ bat=$(cat /sys/class/power_supply/BAT0/capacity)
+ else
+ bat=100
+ fi
+ case $bat in
+ 100|9?)
+ :
+ bitcoinon &
+ ;;
+ esac
fi
+ else
+ bitcoinoff
wait=60
fi
sleep $wait
write-status
mute
+ loop_count=$(( loop_count + 1 ))
done
}