icecast improvements
[distro-setup] / system-status
index 28b302441684782b49f838b50512b6c13912eca9..745e33515fa5c0cc47996b7bc0a7b2d402ebab67 100755 (executable)
@@ -1,6 +1,22 @@
 #!/bin/bash
 #!/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
 
 # 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
@@ -13,7 +29,7 @@ if [[ $EUID != 1000 ]]; then
   exit 1
 fi
 
   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
 status_file=/dev/shm/iank-status
 
 shopt -s nullglob
@@ -293,6 +309,20 @@ write-status() {
     # check email.
     $MAIL_HOST)
       p $qmsg | loday -120 qlen
     # check email.
     $MAIL_HOST)
       p $qmsg | loday -120 qlen
+
+
+      f=/var/spool/exim4/gw/no-delay-eximids
+      if (( loop_count % 10 == 0 )) && \
+           [[ -s $f ]] && [[ $(cat $f) == all ]]; then
+        # I've left this on longer than I intended, so just auto-delete
+        # it after some time.
+        find $f -mmin +180 -delete
+        if [[ -s $f ]]; then
+          chars+=("NO_DELAY")
+        fi
+      fi
+
+
       ;;
     *)
       rmg /home/iank/cron-errors/qlen*
       ;;
     *)
       rmg /home/iank/cron-errors/qlen*
@@ -342,8 +372,10 @@ write-status() {
           if grep -qxF $HOSTNAME $x; then all_dirs+=( ${x%.hosts} ); fi
         done
 
           if grep -qxF $HOSTNAME $x; then all_dirs+=( ${x%.hosts} ); fi
         done
 
+        script_files=("${my_service_scripts[@]}" "${my_bin_files[@]}" $my_lib_files)
+
         # Just because i forget a lot, -mmin -NUM means files modified <= NUM minutes ago
         # Just because i forget a lot, -mmin -NUM means files modified <= NUM minutes ago
-        if (( fmin < 0 )) && [[ $(find ${all_my_scripts[@]} ${all_dirs[@]} -mmin $fmin -type f -print -quit 2>/dev/null) ]]; then
+        if (( fmin < 0 )) && [[ $(find "${script_files[@]}" ${all_dirs[@]} -mmin $fmin -type f -print -quit 2>/dev/null) ]]; then
           v conflink newer filesystem files
           chars+=(CONFLINK)
           break
           v conflink newer filesystem files
           chars+=(CONFLINK)
           break
@@ -389,6 +421,23 @@ write-status() {
     # leave it up to epanic-clean to send email notification
   fi
 
     # 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
   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
@@ -398,39 +447,42 @@ write-status() {
       echo "ps_char=\"${chars[*]} \$ps_char\"" >>$status_file
     fi
   fi
       echo "ps_char=\"${chars[*]} \$ps_char\"" >>$status_file
     fi
   fi
-}
+
+  if [[ -e $HOME/.iank-stream-on ]] && ! pgrep -fc '^ffmpeg.*icecast://source.*/fsf-sysops' >/dev/null; then
+    rm -f $HOME/.iank-stream-on
+  fi
+
+} # end write-status
 
 # This prevents me having to mute notifications when I'm going to bed.
 mute() {
   local locked
   export DISPLAY=:0
   locked=false
 
 # 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=$(xscreensaver-command -time 2>/dev/null); then
     if [[ $lock_info != *non-blanked* ]]; then
       locked=true
     fi
     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 *60*60 || mdiff > 21 *60*60 )); then
-    case $(pactl get-sink-mute @DEFAULT_SINK@ | awk '{print $2}') in
-      no)
-        # for log purposes
-        echo muted
-        pactl set-sink-mute @DEFAULT_SINK@ true
-        ;;
-    esac
-  fi
-  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 unmuted
-        pactl set-sink-mute @DEFAULT_SINK@ false
-        ;;
-    esac
+    midnight=$(date -d 00:00 +%s)
+    mdiff=$(( EPOCHSECONDS - midnight ))
+    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 muted
+          pactl set-sink-mute @DEFAULT_SINK@ true
+          ;;
+      esac
+    fi
+    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 unmuted
+          pactl set-sink-mute @DEFAULT_SINK@ false
+          ;;
+      esac
+    fi
   fi
 }
 
   fi
 }
 
@@ -443,23 +495,24 @@ if [[ $1 ]]; then
   exit 0
 fi
 
   exit 0
 fi
 
+loop_count=0
 main-loop() {
   while true; do
     power=true
     if [[ -e /sys/class/power_supply/AC/online && $(</sys/class/power_supply/AC/online) == 0 ]]; then
       power=false
     fi
 main-loop() {
   while true; do
     power=true
     if [[ -e /sys/class/power_supply/AC/online && $(</sys/class/power_supply/AC/online) == 0 ]]; then
       power=false
     fi
-    wait=15
-    if ! $power; then
-      if systemctl -q is-active bitcoind; then
-        bitcoinoff
-      fi
+
+    if $power; then
+      wait=15
+    else
       wait=60
     fi
 
     sleep $wait
     write-status
     mute
       wait=60
     fi
 
     sleep $wait
     write-status
     mute
+    loop_count=$(( loop_count + 1 ))
   done
 }
 
   done
 }