From 0b2c499f94cd643c46c560cca4dc5decf573dd72 Mon Sep 17 00:00:00 2001
From: Bob Mottram <bob@freedombone.net>
Date: Thu, 5 Jul 2018 12:28:55 +0100
Subject: [PATCH] Separate command for notifications

---
 src/freedombone-app-keyserver        |  6 +--
 src/freedombone-backup-remote        | 10 ++--
 src/freedombone-notification         | 81 ++++++++++++++++++++++++++++
 src/freedombone-repair-database      |  2 +-
 src/freedombone-restore-remote       |  2 +-
 src/freedombone-usb-canary           |  2 +-
 src/freedombone-utils-backup         |  4 +-
 src/freedombone-utils-cron           |  2 +-
 src/freedombone-utils-database       |  4 +-
 src/freedombone-utils-gnusocialtools |  4 +-
 src/freedombone-utils-onion          |  6 +--
 src/freedombone-utils-web            |  6 +--
 12 files changed, 102 insertions(+), 27 deletions(-)
 create mode 100755 src/freedombone-notification

diff --git a/src/freedombone-app-keyserver b/src/freedombone-app-keyserver
index 59792f044..0a1aca39d 100755
--- a/src/freedombone-app-keyserver
+++ b/src/freedombone-app-keyserver
@@ -68,14 +68,12 @@ function keyserver_watchdog {
     { echo '#!/bin/bash';
       echo "dirsize=\$(du /var/lib/sks/DB | awk -F ' ' '{print \$1}')";
       echo "if [ \$dirsize -gt 450000 ]; then";
-
-      echo "  echo \"$keyserver_size_warning\" | mail -s \"$keyserver_mail_subject_line\" $ADMIN_EMAIL_ADDRESS";
-
+      echo "  ${PROJECT_NAME}-notification -m \"$keyserver_size_warning\" -s \"$keyserver_mail_subject_line\"";
       echo "  if [ \$dirsize -gt 500000 ]; then";
       echo "    nginx_dissite $KEYSERVER_DOMAIN_NAME";
       echo '    systemctl stop sks';
       echo '    systemctl disable sks';
-      echo "    echo \"$keyserver_disabled_warning\" | mail -s \"$keyserver_mail_subject_line_disabled\" $ADMIN_EMAIL_ADDRESS";
+      echo "    ${PROJECT_NAME}-notification -m \"$keyserver_disabled_warning\" -s \"$keyserver_mail_subject_line_disabled\"";
       echo '  fi';
       echo 'fi'; } > $keyserver_watchdog_script
     chmod +x $keyserver_watchdog_script
diff --git a/src/freedombone-backup-remote b/src/freedombone-backup-remote
index 7997990cb..ea94b455e 100755
--- a/src/freedombone-backup-remote
+++ b/src/freedombone-backup-remote
@@ -333,7 +333,7 @@ function backup_mariadb {
             echo $"Unable to backup MariaDB settings"
             rm -rf $temp_backup_dir
             # Send a warning email
-            echo $"Unable to export database settings" | mail -s "${PROJECT_NAME} backup to friends" "$ADMIN_EMAIL_ADDRESS"
+            ${PROJECT_NAME}-notification -m $"Unable to export database settings" -s $"${PROJECT_NAME} backup to friends"
             exit 653
         fi
         echo "$DATABASE_PASSWORD" > $temp_backup_dir/db
@@ -410,12 +410,10 @@ function disperse_key_shares {
                 # shellcheck disable=SC2181
                 if [ ! "$?" = "0" ]; then
                     # Send a warning email
-                    echo "Key share to $REMOTE_SERVER failed" | \
-                        mail -s "${PROJECT_NAME} social key management" "$MY_EMAIL_ADDRESS"
+                    ${PROJECT_NAME}-notification -m $"Key share to $REMOTE_SERVER failed" -s $"${PROJECT_NAME} social key management"
                 else
                     # Send a confirmation email
-                    echo "Key ${share_filename} shared to $REMOTE_SERVER" | \
-                        mail -s "${PROJECT_NAME} social key management" "$MY_EMAIL_ADDRESS"
+                    ${PROJECT_NAME}-notification -m $"Key ${share_filename} shared to $REMOTE_SERVER" -s $"${PROJECT_NAME} social key management"
                 fi
 
                 # remove the temp file/directory
@@ -480,7 +478,7 @@ do
         if ! rsync -ratlzv --rsh="/usr/bin/sshpass -p \"$REMOTE_PASSWORD\" ssh -p $REMOTE_SSH_PORT -o StrictHostKeyChecking=no" "$SERVER_DIRECTORY/backup" "$REMOTE_SERVER"; then
             echo "$NOW Backup to $REMOTE_SERVER failed" >> /var/log/remotebackups.log
             # Send a warning email
-            echo "Backup to $REMOTE_SERVER failed" | mail -s "${PROJECT_NAME} backup to friends" "$ADMIN_EMAIL_ADDRESS"
+            ${PROJECT_NAME}-notification -m $"Backup to $REMOTE_SERVER failed" -s $"${PROJECT_NAME} backup to friends"
         else
             echo "$NOW Backed up to $REMOTE_SERVER" >> /var/log/remotebackups.log
         fi
diff --git a/src/freedombone-notification b/src/freedombone-notification
new file mode 100755
index 000000000..e30b27948
--- /dev/null
+++ b/src/freedombone-notification
@@ -0,0 +1,81 @@
+#!/bin/bash
+#  _____               _           _
+# |   __|___ ___ ___ _| |___ _____| |_ ___ ___ ___
+# |   __|  _| -_| -_| . | . |     | . | . |   | -_|
+# |__|  |_| |___|___|___|___|_|_|_|___|___|_|_|___|
+#
+#                              Freedom in the Cloud
+#
+# Sends a notification to the administrator user
+#
+# License
+# =======
+#
+# Copyright (C) 2018 Bob Mottram <bob@freedombone.net>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+PROJECT_NAME='freedombone'
+
+ADMIN_USERNAME=
+SUBJECT=
+MESSAGE=
+
+while [ $# -gt 1 ]
+do
+    key="$1"
+
+    case $key in
+        -e|--email)
+            shift
+            ADMIN_EMAIL_ADDRESS="$1"
+            ;;
+        -u|--user|--username)
+            shift
+            ADMIN_USERNAME="$1"
+            ;;
+        -s|--subject|--header)
+            shift
+            SUBJECT="$1"
+            ;;
+        -m|--message|--msg)
+            shift
+            MESSAGE="$1"
+            ;;
+        *)
+            # unknown option
+            ;;
+    esac
+    shift
+done
+
+if [ ! "$MESSAGE" ]; then
+    exit 0
+fi
+
+if [ ! "$COMPLETION_FILE" ]; then
+    COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt
+fi
+
+if [ ! "$ADMIN_USERNAME" ]; then
+    ADMIN_USERNAME=$(grep "Admin user" "$COMPLETION_FILE" | awk -F ':' '{print $2}')
+fi
+ADMIN_EMAIL_ADDRESS=${ADMIN_USERNAME}@${HOSTNAME}
+
+# send email to administrator
+if [ "$SUBJECT" ]; then
+    echo "$MESSAGE" | mail -s "$SUBJECT" "$ADMIN_EMAIL_ADDRESS"
+fi
+
+exit 0
diff --git a/src/freedombone-repair-database b/src/freedombone-repair-database
index 615d3341d..e4a918800 100755
--- a/src/freedombone-repair-database
+++ b/src/freedombone-repair-database
@@ -85,7 +85,7 @@ if grep -q "Error" "$TEMPFILE"; then
     mysql -u root --password="$MYSQL_ROOT_PASSWORD" "$DATABASE" -o < "/var/backups/${DATABASE}_${BACKUP_TYPE}.sql"
 
     # Send a warning email
-    echo $"$DATABASE database corruption could not be repaired. Restored from backup." | mail -s $"${PROJECT_NAME} database maintenance" "$ADMIN_EMAIL_ADDRESS"
+    ${PROJECT_NAME}-notification -m $"$DATABASE database corruption could not be repaired. Restored from backup." -s $"${PROJECT_NAME} database maintenance"
     rm -f "$TEMPFILE"
 
     exit 1
diff --git a/src/freedombone-restore-remote b/src/freedombone-restore-remote
index 492b8e3b4..6bf994bc6 100755
--- a/src/freedombone-restore-remote
+++ b/src/freedombone-restore-remote
@@ -85,7 +85,7 @@ echo "$NOW Starting restore from $REMOTE_SERVER" >> /var/log/remotebackups.log
 if ! rsync -ratlzv --rsh="/usr/bin/sshpass -p $REMOTE_PASSWORD ssh -p $REMOTE_SSH_PORT -o StrictHostKeyChecking=no" "$REMOTE_SERVER/backup" "$SERVER_DIRECTORY"; then
     echo "$NOW Restore from $REMOTE_SERVER failed" >> /var/log/remotebackups.log
     # Send a warning email
-    echo "Restore from $REMOTE_SERVER failed" | mail -s "${PROJECT_NAME} restore from friend" "$ADMIN_EMAIL_ADDRESS"
+    ${PROJECT_NAME}-notification -m $"Restore from $REMOTE_SERVER failed" -s $"${PROJECT_NAME} restore from friend"
     exit 790
 else
     echo "$NOW Restored encrypted data from $REMOTE_SERVER" >> /var/log/remotebackups.log
diff --git a/src/freedombone-usb-canary b/src/freedombone-usb-canary
index 88cdd9dbd..ba82e2495 100755
--- a/src/freedombone-usb-canary
+++ b/src/freedombone-usb-canary
@@ -42,7 +42,7 @@ if [ ! -f /tmp/.upgrading ]; then
             rm /tmp/.curr_usb_devices
         fi
 
-        echo -e "USB device connected on ${DEVPATH}\\n\\n${devices_changed}" | mail -s "${PROJECT_NAME} USB canary" "${MY_EMAIL_ADDRESS}"
+        ${PROJECT_NAME}-notification -m $"USB device connected on ${DEVPATH}\\n\\n${devices_changed}" -s $"${PROJECT_NAME} USB canary"
         echo "${ACTION}" > /tmp/usb-canary
         echo "${MY_EMAIL_ADDRESS}" >> /tmp/usb-canary
         date >> /tmp/usb-canary
diff --git a/src/freedombone-utils-backup b/src/freedombone-utils-backup
index ed5c7ddb1..9754f41b8 100755
--- a/src/freedombone-utils-backup
+++ b/src/freedombone-utils-backup
@@ -503,7 +503,7 @@ function backup_database_remote {
             echo $"${1} database could not be saved"
             rm -rf "${local_database_dir}"
             # Send a warning email
-            echo $"Unable to export ${1} database" | mail -s $"${PROJECT_NAME} backup to friends" "$ADMIN_EMAIL_ADDRESS"
+            ${PROJECT_NAME}-notification -m $"Unable to export ${1} database" -s $"${PROJECT_NAME} backup to friends"
             function_check restart_site
             restart_site
             exit 57386728
@@ -512,7 +512,7 @@ function backup_database_remote {
         echo $"${1} database could not be dumped"
         rm -rf "${local_database_dir}"
         # Send a warning email
-        echo $"Unable to dump ${1} database" | mail -s $"${PROJECT_NAME} backup to friends" "$ADMIN_EMAIL_ADDRESS"
+        "${PROJECT_NAME}-notification" -m $"Unable to dump ${1} database" -s $"${PROJECT_NAME} backup to friends"
         function_check restart_site
         restart_site
         exit 36874289
diff --git a/src/freedombone-utils-cron b/src/freedombone-utils-cron
index b1247c938..a588354b2 100755
--- a/src/freedombone-utils-cron
+++ b/src/freedombone-utils-cron
@@ -83,7 +83,7 @@ function schedule_stig_tests {
       echo 'rm -rf /tmp/*';
       echo "${PROJECT_NAME}-tests --stig yes > /tmp/daily-stig-tests";
       echo 'if [ ! "$?" = "0" ]; then';
-      echo "    echo \"\$(cat /tmp/daily-stig-tests)\" | mail -s \"${PROJECT_NAME} STIG test failures\" \$ADMIN_EMAIL_ADDRESS";
+      echo "    ${PROJECT_NAME}-notification -m \"\$(cat /tmp/daily-stig-tests)\" -s \"${PROJECT_NAME} STIG test failures\"";
       echo 'fi';
       echo 'if [ -f /tmp/daily-stig-tests ]; then';
       echo '  rm /tmp/daily-stig-tests';
diff --git a/src/freedombone-utils-database b/src/freedombone-utils-database
index 1f0df97f3..7610d82be 100755
--- a/src/freedombone-utils-database
+++ b/src/freedombone-utils-database
@@ -85,10 +85,10 @@ function backup_database_local {
           echo "        mysql -u root --password=\"\$MYSQL_PASSWORD\" ${database_name} -o < \$DAILYFILE";
           echo '';
           echo '        # Send a warning email';
-          echo "        echo \"Unable to create a backup of the ${database_name} database. Attempted to restore from yesterdays backup\" | mail -s \"${database_name} backup\" \$EMAIL";
+          echo "        ${PROJECT_NAME}-notification -m \"Unable to create a backup of the ${database_name} database. Attempted to restore from yesterdays backup\" -s \"${database_name} backup\"";
           echo '    else';
           echo '        # Send a warning email';
-          echo "        echo \"Unable to create a backup of the ${database_name} database.\" | mail -s \"${database_name} backup\" \$EMAIL";
+          echo "        ${PROJECT_NAME}-notification -m \"Unable to create a backup of the ${database_name} database.\" -s \"${database_name} backup\"";
           echo '    fi';
           echo 'else';
           echo "    chmod 600 \$TEMPFILE";
diff --git a/src/freedombone-utils-gnusocialtools b/src/freedombone-utils-gnusocialtools
index 4ff1af200..288b0cfa3 100755
--- a/src/freedombone-utils-gnusocialtools
+++ b/src/freedombone-utils-gnusocialtools
@@ -468,8 +468,8 @@ function gnusocial_hourly_script {
       echo "    if [ \"\$UPTIME\" -gt 500 ]; then";
       echo "        ADMIN_USER=\$(cat $COMPLETION_FILE | grep 'Admin user' | awk -F ':' '{print \$2}')";
       echo "        MY_EMAIL_ADDRESS=\$ADMIN_USER@$HOSTNAME";
-      echo -n "        echo \"Restarting ${gnusocial_type} daemons\" | mail -s \"${gnusocial_type} ";
-      echo "daemons not found\" \$MY_EMAIL_ADDRESS";
+      echo -n "        ${PROJECT_NAME}-notification -m \"Restarting ${gnusocial_type} daemons\" -s \"${gnusocial_type} ";
+      echo "daemons not found\"";
       echo '    fi';
       echo '    su -c "sh scripts/startdaemons.sh" -s /bin/sh www-data';
       echo 'fi';
diff --git a/src/freedombone-utils-onion b/src/freedombone-utils-onion
index c56d0238e..95d228b80 100755
--- a/src/freedombone-utils-onion
+++ b/src/freedombone-utils-onion
@@ -316,17 +316,17 @@ function check_tor_health {
       echo "if [[ \"\$status\" == 'G'* ]]; then";
       echo '    if [ -f /tmp/.torfailed ]; then';
       echo '        rm /tmp/.torfailed';
-      echo "        tail -n 3 /var/log/tor/notices.log | mail -s \"[${PROJECT_NAME}] Tor status is now \$status\" \$ADMIN_USER@\$HOSTNAME";
+      echo "        ${PROJECT_NAME}-notification -m \"\$(tail -n 3 /var/log/tor/notices.log)\" -s \"[${PROJECT_NAME}] Tor status is now \$status\"";
       echo '    fi';
       echo '    exit 0';
       echo 'fi';
       echo 'if [ ! -f /tmp/.torfailed ]; then';
-      echo "    tail -n 3 /var/log/tor/notices.log | mail -s \"[${PROJECT_NAME}] Tor status is \$status\" \$ADMIN_USER@\$HOSTNAME";
+      echo "    ${PROJECT_NAME}-notification -m \"\$(tail -n 3 /var/log/tor/notices.log)\" -s \"[${PROJECT_NAME}] Tor status is \$status\"";
       echo "    echo \"\$status\" > /tmp/.torfailed";
       echo 'else';
       echo "    prev_status=\$(cat /tmp/.torfailed)";
       echo "    if [[ \"\$prev_status\" != \"\$status\" ]]; then";
-      echo "        tail -n 3 /var/log/tor/notices.log | mail -s \"[${PROJECT_NAME}] Tor status is \$status\" \$ADMIN_USER@\$HOSTNAME";
+      echo "        ${PROJECT_NAME}-notification -m \"\$(tail -n 3 /var/log/tor/notices.log)\" -s \"[${PROJECT_NAME}] Tor status is \$status\"";
       echo "        echo \"\$status\" > /tmp/.torfailed";
       echo '    fi';
       echo 'fi'; } > /usr/bin/check_tor_health
diff --git a/src/freedombone-utils-web b/src/freedombone-utils-web
index b18829655..cc7188a2d 100755
--- a/src/freedombone-utils-web
+++ b/src/freedombone-utils-web
@@ -360,8 +360,7 @@ function letsencrypt_renewals {
       echo "                echo \"${renewal_failure_msg}\" > ~/temp_renewletsencrypt.txt";
       echo '                echo "" >> ~/temp_renewletsencrypt.txt';
       echo "                \${PROJECT_NAME}-renew-cert -h \$LETSENCRYPT_DOMAIN -p letsencrypt 2>> ~/temp_renewletsencrypt.txt";
-      echo -n "                cat ~/temp_renewletsencrypt.txt | mail -s \"${renewal_email_title}\" ";
-      echo "\$ADMIN_EMAIL_ADDRESS";
+      echo "                \${PROJECT_NAME}-notification -m \"\$(cat ~/temp_renewletsencrypt.txt)\" -s \"${renewal_email_title}\"";
       echo '                rm ~/temp_renewletsencrypt.txt';
       echo '                if [ ! -f ~/letsencrypt_failed ]; then';
       echo '                    touch ~/letsencrypt_failed';
@@ -427,8 +426,7 @@ function letsencrypt_renewals {
       echo "                    echo \"${renewal_failure_msg}\" > ~/temp_renewletsencrypt.txt";
       echo '                    echo "" >> ~/temp_renewletsencrypt.txt';
       echo "                    \${PROJECT_NAME}-renew-cert -h \$LETSENCRYPT_DOMAIN -p letsencrypt 2>> ~/temp_renewletsencrypt.txt";
-      echo -n "                    cat ~/temp_renewletsencrypt.txt | mail -s \"${renewal_email_title}\" ";
-      echo "\$ADMIN_EMAIL_ADDRESS";
+      echo "                    \${PROJECT_NAME}-notification -m \"\$(cat ~/temp_renewletsencrypt.txt)\" -s \"${renewal_email_title}\"";
       echo '                    rm ~/temp_renewletsencrypt.txt';
       echo '                    if [ ! -f ~/letsencrypt_failed ]; then';
       echo '                        touch ~/letsencrypt_failed';
-- 
GitLab