# SPDX-License-Identifier: AGPL-3.0-or-later
# usage: runs once every 15 seconds unless any args are passed, or we
-# then just runs once. On battery power, run once per minute.
+# then just runs once and have verbose output. On battery power, run
+# once per minute.
if [ -z "$BASH_VERSION" ]; then echo "error: shell is not bash" >&2; exit 1; fi
/usr/local/bin/log-once "$@" | ifne mail -s "$HOSTNAME: system-status $2" daylert@iankelling.org
fi
}
+# rm glob
+rmg() {
+ if (( $# )); then
+ rm -f "$@"
+ fi
+}
# todo, consider migrating some of these alerts into prometheus
write-status() {
dynamicipupdate
)
bads=()
- if systemctl show -p SubState --value ${services[@]} | egrep -v '^(running|)$' &>/dev/null; then
+ if systemctl show -p SubState --value ${services[@]} | grep -E -v '^(running|)$' &>/dev/null; then
for s in ${services[@]}; do
if [[ $(systemctl show -p SubState --value $s 2>&1) != running ]]; then
bads+=($s)
prometheus
)
bads=()
- if systemctl show -p SubState --value ${services[@]} | egrep -v '^(running|)$' &>/dev/null; then
+ if systemctl show -p SubState --value ${services[@]} | grep -E -v '^(running|)$' &>/dev/null; then
for s in ${services[@]}; do
if [[ $(systemctl show -p SubState --value $s 2>&1) != running ]]; then
bads+=($s)
esac
+ # this section copied from servicepid()
+ unit=exim4
+ pid=$(systemctl show --property MainPID --value $unit ||:)
+ case $pid in
+ [1-9]*) : ;;
+ *)
+ dir=/sys/fs/cgroup/system.slice
+ if [[ ! -d $dir ]]; then
+ dir=/sys/fs/cgroup/systemd/system.slice
+ fi;
+ pid=$(head -n1 $dir/${unit%.service}.service/cgroup.procs ||:)
+ ;;
+ esac
+ if [[ ! $pid ]]; then
+ chars+=(EXIM)
+ fi
+
+
if [[ -e /a/bin/bash_unpublished/source-state ]]; then
# /a gets remounted due to btrbk, ignore error code for file doesnt exist
source /a/bin/bash_unpublished/source-state || [[ $? == 1 ]]
fi
+
+
+ ## check if last snapshot was recent
+ old_snap_limit=$(( 3 * 60 * 60 ))
+ for vol in a o q; do
+ case $vol in
+ o) btrbk_root=/mnt/o/btrbk ;;
+ *) btrbk_root=/mnt/root/btrbk ;;
+ esac
+ # this section generally copied from btrbk scripts, but
+ # this part modified to speed things up by about half a second.
+ # I'm not sure if its quite as reliable, but it looks pretty safe.
+ # Profiled it using time and also adding to the top of the file:
+ # 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
+ fi
+ # not bothering to get info on all volumes if we find an old one.
+ break
+ fi
+ done
+
+
if [[ $MAIL_HOST == "$HOSTNAME" ]]; then
bouncemsg=
fi
p "$bbkmsg" | lo -480 btrbk.timer
- ## check if last snapshot was within an hour
- vol=o
- # this section generally copied from btrbk scripts, but
- # this part modified to speed things up by about half a second.
- # I'm not sure if its quite as reliable, but it looks pretty safe.
- # Profiled it using time and also adding to the top of the file:
- # set -x
- # PS4='+ $(date "+%2N") '
- # allow failure in case there are no snapshots yet.
- # shellcheck disable=SC2012
- shopt -u nullglob
- files=(/mnt/root/btrbk/$vol.20*)
- shopt -s nullglob
- snaps=()
- if (( ${#files[@]} )); then
- snaps=($(ls -1avdr "${files[@]}" 2>/dev/null |head -n1 || : ))
- fi
- 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=
- if (( maxtime < now - 4*60*60 )); then
- chars+=(OLD-SNAP)
- snapshotmsg="/o snapshot older than 4 hours"
- fi
- p "$snapshotmsg" | lo -1 old-snapshot
# commented out, only using timetrap retrospectively.
# fi
# fi
# fi
-
+ else # end if $MAIL_HOST
+ rmg /home/iank/cron-errors/bounce* \
+ /home/iank/cron-errors/btrbk.timer* \
+ /home/iank/cron-errors/old-snapshot*
fi
if ip l show tunfsf &>/dev/null; then
# this is for tracking dns over tls issue, which
# fixvpndns() in brc2 fixes.
stat=$(resolvectl dnsovertls tunfsf 2>/dev/null ||: )
- read _ _ _ istls <<<"$stat"
+ read -r _ _ _ istls <<<"$stat"
case $istls in
no) : ;;
*)
if [[ ! $last_emacs_check || $emacsfiles ]] || (( last_emacs_check < EPOCHSECONDS - 300 )); then
if pgrep -G iank -u iank -f 'emacs --daemon' &>/dev/null; then
# i dun care if this fails
- emacsfiles="$(timeout 1 emacsclient --eval "$elisp"| sed '/^"nil"$/d;s/^"(/E: /;s/)"$//' ||:)"
+ emacsfiles="$(timeout 1 emacsclient -a /usr/bin/true --eval "$elisp" 2>/dev/null | sed '/^"nil"$/d;s/^"(/E: /;s/)"$//' ||:)"
if [[ $emacsfiles ]]; then
chars+=("$emacsfiles")
fi
$MAIL_HOST)
p $qmsg | loday -120 qlen
;;
+ *)
+ rmg /home/iank/cron-errors/qlen*
+ ;;
esac
begin=false
+ # todo: make this robust to the case of /a not being mounted
if ! make -C /b/ds -q ~/.local/distro-begin 2>/dev/null || [[ $(<~/.local/distro-begin) != 0 ]]; then
begin=true
fi
elif $end; then
chars+=(DE)
else
+ source /a/bin/ds/script-files
f=~/.local/conflink
# shellcheck disable=SC2043
for _ in 1; do
done
# Just because i forget a lot, -mmin -NUM means files modified <= NUM minutes ago
- if (( fmin < 0 )) && [[ $(find ${all_dirs[@]} -mmin $fmin -type f -print -quit 2>/dev/null) ]]; then
+ if (( fmin < 0 )) && [[ $(find ${all_my_scripts[@]} ${all_dirs[@]} -mmin $fmin -type f -print -quit 2>/dev/null) ]]; then
v conflink newer filesystem files
chars+=(CONFLINK)
break
fi
fi
}
+
+# This prevents me having to mute notifications when I'm going to bed.
+mute() {
+ local locked
+ export DISPLAY=:0
+ locked=false
+ if lock_info=$(xscreensaver-command -time); then
+ if [[ $lock_info != *non-blanked* ]]; then
+ locked=true
+ fi
+ else
+ locked=true
+ fi
+ midnight=$(date -d 00:00 +%s)
+ mdiff=$(( EPOCHSECONDS - midnight ))
+ if $locked && (( mdiff < 6 || mdiff > 21 )); then
+ case $(pactl get-sink-mute @DEFAULT_SINK@ | awk '{print $2}') in
+ no)
+ # for log purposes
+ echo unmuted
+ pactl set-sink-mute @DEFAULT_SINK@ true
+ ;;
+ esac
+ fi
+ if ! $locked && (( mdiff > 6 || mdiff < 12 )) && [[ ! -e /tmp/ianknap ]]; then
+ case $(pactl get-sink-mute @DEFAULT_SINK@ | awk '{print $2}') in
+ yes)
+ # for log purposes
+ echo muted
+ pactl set-sink-mute @DEFAULT_SINK@ false
+ ;;
+ esac
+ fi
+}
+
# use this if we want to do something just once per minute
first_chars=()
-
write-status
if [[ $1 ]]; then
cat $status_file
fi
wait=15
if ! $power; then
+ if systemctl -q is-active bitcoind; then
+ bitcoinoff
+ fi
wait=60
fi
sleep $wait
write-status
+ mute
done
}