mainly new feature to intentionally delay sending email
[distro-setup] / system-status
index cd603ca57e4f982e149107d2aef856ccffb46451..fdf4758b5028a9f33ff03b91dfc0e9dedb22c77c 100755 (executable)
@@ -68,7 +68,7 @@ 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)
@@ -88,7 +88,7 @@ write-status() {
         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)
@@ -140,13 +140,13 @@ write-status() {
     # PS4='+ $(date "+%2N") '
     # allow failure in case there are no snapshots yet.
     # shellcheck disable=SC2012
-    shopt -u nullglob
-    files=($btrbk_root/$vol.20*)
     shopt -s nullglob
-    snaps=()
-    if (( ${#files[@]} )); then
-      snaps=($(ls -1avdr "${files[@]}" 2>/dev/null |head -n1 || : ))
+    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
@@ -228,7 +228,7 @@ write-status() {
     # 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) : ;;
       *)
@@ -263,13 +263,35 @@ write-status() {
   fi
   p $var_mail_msg | loday -1 var_mail
 
-  # early in install process, we dont have permission yet for exiqgrep.
-  # 1100 helps allow for system restarts
-  qlen=$(/usr/sbin/exiqgrep -o 1100 -c -b | awk '{print $1}') ||:
+  # Note, early in install process, we dont have permission yet for exiqgrep.
+  #
+  # todo: don't do this every 15 seconds, more like once every 2 minutes to
+  # save cpu cycles.
+  #
+  # 2400 = 40 mins. This should allow for system restarts, and
+  # 30 minute message delay plus 10 minute queu runs.
+  qlen=$(/usr/sbin/exiqgrep -o 2400 -c -b | awk '{print $1}') ||:
   qmsg=
   if ((qlen)); then
-    qmsg="queue length $qlen"
-    chars+=("q $qlen")
+    # Do sending of long delayed messages, and dont count them in our queue warnings.
+    for mid in $(exiqgrep -o 2400 -zi); do
+      if exim -Mvh $mid | awk 'tolower($2) == "fdate:"' | grep -q .; then
+        qlen=$(( qlen - 1 ))
+        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);
+            nsenter -t $pid -n -m /usr/sbin/exim4 -C /etc/exim4/my.conf -M $mid
+          else
+            /usr/sbin/exim4 -M $mid
+          fi
+        fi
+      fi
+    done
+
+    if ((qlen)); then
+      qmsg="queue length $qlen"
+      chars+=("q $qlen")
+    fi
   fi
   case $HOSTNAME in
     # No point in emailing about the mailq on a host where we don't
@@ -382,10 +404,44 @@ write-status() {
     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
@@ -408,6 +464,7 @@ main-loop() {
 
     sleep $wait
     write-status
+    mute
   done
 }