X-Git-Url: https://iankelling.org/git/?p=distro-setup;a=blobdiff_plain;f=system-status;h=b3c22e4ea8126f1a24330b039aceef3803ed1d03;hp=460d63be5c33385e03f580d03ecb41e5e9687132;hb=79b274fcd8bfa556133ab13270e84b40aebe8468;hpb=390af9a88d32306b789a0e8858d375bf8ca054b0 diff --git a/system-status b/system-status index 460d63b..b3c22e4 100755 --- a/system-status +++ b/system-status @@ -2,7 +2,8 @@ # Copyright (C) 2019 Ian Kelling # SPDX-License-Identifier: AGPL-3.0-or-later -# usage: runs 4 times every 15 seconds unless any args are passed, then just runs once +# usage: runs 4 times every 15 seconds unless any args are passed, or we +# are on battery power, then just runs once. if [ -z "$BASH_VERSION" ]; then echo "error: shell is not bash" >&2; exit 1; fi @@ -12,10 +13,19 @@ status_file=/dev/shm/iank-status shopt -s nullglob shopt -s dotglob +verbose=false +if [[ $1 ]]; then + verbose=true +fi +v() { + if $verbose; then + printf "%s\n" "$*" + fi +} lo() { /usr/local/bin/log-once "$@"; } write-status() { - chars=() + chars=("${first_chars[@]}") glob=(/nocow/btrfs-stale/*) if [[ -e ${glob[0]} ]]; then @@ -35,37 +45,83 @@ write-status() { chars+=("MAILPING!") fi + if ! qlen=$(/usr/sbin/exiqgrep -o 60 -c -b | awk '{print $1}'); then + # early in install process, we dont have permission yet for exiqgrep + qlen=$(sudo /usr/sbin/exiqgrep -o 60 -c -b | awk '{print $1}') + fi + if ((qlen)); then + chars+=("q $qlen") + fi + begin=false + cd /b/ds if ! make -q ~/.local/distro-begin || [[ $(<~/.local/distro-begin) != 0 ]]; then - chars+=("DISTRO-BEGIN!") + begin=true fi + end=false if ! make -q ~/.local/distro-end || [[ $(<~/.local/distro-end) != 0 ]]; then + end=true + fi + + if $begin && $end; then + chars+=("DISTRO!") + elif $begin; then + chars+=("DISTRO-BEGIN!") + elif $end; then chars+=("DISTRO-END!") fi f=~/.local/conflink - if [[ -e $f ]]; then - cd /b/ds - now=$(date +%s) - fsec=$(stat -c%Y $f) - fmin=$(( (fsec - now ) / 60 + 1 )) - fminplus=$(( fmin + 60*24 )) - # Filesystem files get copied, so find any newer than the last run. - # The rest are hueristics: - # Given the last time we added a file in git, is that newer than the last conflink run. - # Given new files not added to git, were they modified more recently than the last conflink? but, - # push their modification time back by a day so we can develop them before needing to add them to git. - if (( $(date -d "$(git log --diff-filter=ACR --format=%aD -1)" +%s) > fsec )) || \ - [[ $(find {/a/bin/ds,/p/c}{/filesystem,/machine_specific/$HOSTNAME/filesystem} -mmin $fmin -type f -print -quit 2>/dev/null) ]] \ - || [[ $(find $(git ls-files -o --exclude-standard) -mmin $fminplus -type f -print -quit) ]]; then + for _ in 1; do + if [[ -e $f ]]; then + now=$(date +%s) + fsec=$(stat -c%Y $f) + # the / 60 makes it 0-59 seconds less strict, +1 makes sure we + # dont have any false positives. + fmin=$(( (fsec - now ) / 60 + 1 )) + fminplus=$(( fmin + 60*24 )) + # Filesystem files get copied, so find any newer than the last run. + # The rest are hueristics: + # Given the last time we added a file in git, is that newer than the last conflink run. + # Given new files not added to git, were they modified more recently than the last conflink? but, + # push their modification time back by a day so we can develop them before needing to add them to git. + + all_dirs=({/a/bin/ds,/p/c}{/filesystem,/machine_specific/$HOSTNAME/filesystem}) + # This part is copied from conflink + for x in /p/c/machine_specific/*.hosts /a/bin/ds/machine_specific/*.hosts; do + if grep -qxF $HOSTNAME $x; then all_dirs+=( ${x%.hosts} ); fi + done + + # just because i forget a lot, -mmin -NUM means files modified <= NUM minutes ago + if (( $(date -d "$(git log --diff-filter=ACR --format=%aD -1)" +%s) > fsec )) || \ + [[ $(find ${all_dirs[@]} -mmin $fmin -type f -print -quit 2>/dev/null) ]]; then + v conflink newer git or newer filesystem files + chars+=("CONFLINK!") + break + fi + + for d in /a/bin/distro-setup /p/c; do + cd $d + if [[ ! -e .git ]]; then + # some hosts i dont push all of /p/c + continue + fi + untracked=$(git ls-files -o --exclude-standard) + if [[ $untracked && $(find $untracked -mmin $fminplus -type f -print -quit) ]]; then + v conflink: untracked in $d + chars+=("CONFLINK!") + break + fi + done + + fi + if [[ ! -e $f || $(<$f) != 0 ]]; then + v conflink: last run not found or failed chars+=("CONFLINK!") + break fi - fi - - if [[ ! -e $f || $(<$f) != 0 ]]; then - chars+=("CONFLINK!") - fi + done ## Clean the paniclog, but only up to 4 times per day, or else we @@ -77,7 +133,7 @@ write-status() { spamcount=0 fi if (( spamcount <= 4 )); then - if grep -q 'spam acl condition' /var/log/exim4/paniclog; then + if grep -q 'spam acl condition' /var/log/exim4/paniclog &>/dev/null; then printf . >>$loglog fi /a/bin/distro-setup/epanic-clean @@ -92,6 +148,7 @@ write-status() { source /a/bin/bash_unpublished/source-state if [[ $MAIL_HOST == "$HOSTNAME" ]]; then + bbkmsg= if [[ $(systemctl is-active btrbk.timer) != active ]]; then chars+=("BTRBK.TIMER!") bbkmsg="btrbk.timer not enabled" @@ -117,7 +174,7 @@ write-status() { fi done if (( maxtime < now - 60*60 )); then - chars+=("OLD-SNAPSHOT!") + chars+=("OLD-SNAP!") snapshotmsg="/o snapshot older than 1 hour" fi lo -1 old-snapshot $snapshotmsg @@ -130,11 +187,23 @@ write-status() { fi } +# use this if we want to do something just once per minute +first_chars=() + +power=true +if [[ -e /sys/class/power_supply/AC/online && $(