diff --git a/multi_report.sh b/multi_report.sh new file mode 100644 index 0000000..3c28b46 --- /dev/null +++ b/multi_report.sh @@ -0,0 +1,417 @@ +#!/bin/bash + +###### ZPool & SMART status report with FreeNAS config backup +### Original script by joeschmuck, modified by Bidelu0hm, then by melp (me) + +### At a minimum, enter email address in user-definable parameter section. Feel free to edit other user parameters as needed. +### If you find any errors, feel free to contact me on the FreeNAS forums (username melp) or email me at jason at jro dot io. + +### Version: v1.3 TrueNAS Scale (Jeff Alperin 12-6-21) + +### Version: v1.3 +### Changelog: +# v1.3: +# - Added scrub duration column +# - Fixed for FreeNAS 11.1 (thanks reven!) +# - Fixed fields parsed out of zpool status +# - Buffered zpool status to reduce calls to script +# v1.2: +# - Added switch for power-on time format +# - Slimmed down table columns +# - Fixed some shellcheck errors & other misc stuff +# - Added .tar.gz to backup file attached to email +# - (Still coming) Better SSD SMART support +# v1.1: +# - Config backup now attached to report email +# - Added option to turn off config backup +# - Added option to save backup configs in a specified directory +# - Power-on hours in SMART summary table now listed as YY-MM-DD-HH +# - Changed filename of config backup to exclude timestamp (just uses datestamp now) +# - Config backup and checksum files now zipped (was just .tar before; now .tar.gz) +# - Fixed degrees symbol in SMART table (rendered weird for a lot of people); replaced with a * +# - Added switch to enable or disable SSDs in SMART table (SSD reporting still needs work) +# - Added most recent Extended & Short SMART tests in drive details section (only listed one before, whichever was more recent) +# - Reformatted user-definable parameters section +# - Added more general comments to code +# v1.0: +# - Initial release + +### TODO: +# - Fix SSD SMART reporting +# - Add support for conveyance test + + +###### User-definable Parameters +### Email Address +email="email@address.com" +from="from@@address.com" + +### Global table colors +okColor="#c9ffcc" # Hex code for color to use in SMART Status column if drives pass (default is light green, #c9ffcc) +warnColor="#ffd6d6" # Hex code for WARN color (default is light red, #ffd6d6) +critColor="#ff0000" # Hex code for CRITICAL color (default is bright red, #ff0000) +altColor="#f4f4f4" # Table background alternates row colors between white and this color (default is light gray, #f4f4f4) + +### zpool status summary table settings +usedWarn=90 # Pool used percentage for CRITICAL color to be used +scrubAgeWarn=30 # Maximum age (in days) of last pool scrub before CRITICAL color will be used + +### SMART status summary table settings +includeSSD="false" # [NOTE: Currently this is pretty much useless] Change to "true" to include SSDs in SMART status summary table; "false" to disable +tempWarn=40 # Drive temp (in C) at which WARNING color will be used +tempCrit=45 # Drive temp (in C) at which CRITICAL color will be used +sectorsCrit=10 # Number of sectors per drive with errors before CRITICAL color will be used +testAgeWarn=5 # Maximum age (in days) of last SMART test before CRITICAL color will be used +powerTimeFormat="ymdh" # Format for power-on hours string, valid options are "ymdh", "ymd", "ym", or "y" (year month day hour) + +### FreeNAS config backup settings +#configBackup="true" # Change to "false" to skip config backup (which renders next two options meaningless); "true" to keep config backups enabled +configBackup="false" +saveBackup="true" # Change to "false" to delete FreeNAS config backup after mail is sent; "true" to keep it in dir below +backupLocation="/path/to/config/backup" # Directory in which to save FreeNAS config backups + + +###### Auto-generated Parameters +host=$(hostname -s) +logfile="/tmp/smart_report.tmp" +subject="Status Report and Configuration Backup for ${host}" +boundary="gc0p4Jq0M2Yt08jU534c0p" +if [ "$includeSSD" == "true" ]; then +# drives=$(for drive in $(sysctl -n kern.disks); do + drives=$(for drive in $(fdisk -l | grep "Disk /dev/sd" | cut -c 11-13 | tr '\n' ' '); do + if [ "$(smartctl -i /dev/"${drive}" | grep "SMART support is: Enabled")" ]; then + printf "%s " "${drive}" + fi + done | awk '{for (i=NF; i!=0 ; i--) print $i }') +else +# drives=$(for drive in $(sysctl -n kern.disks); do + drives=$(for drive in $(fdisk -l | grep "Disk /dev/sd" | cut -c 11-13 | tr '\n' ' '); do + if [ "$(smartctl -i /dev/"${drive}" | grep "SMART support is: Enabled")" ] && ! [ "$(smartctl -i /dev/"${drive}" | grep "Solid State Device")" ]; then + printf "%s " "${drive}" + fi + done | awk '{for (i=NF; i!=0 ; i--) print $i }') +fi +pools=$(zpool list -H -o name) + + +###### Email pre-formatting +### Set email headers +( + echo "From: ${from}" + echo "To: ${email}" + echo "Subject: ${subject}" + echo "MIME-Version: 1.0" + echo "Content-Type: multipart/mixed; boundary=${boundary}" +) > "$logfile" +#) > $logfile + +###### Config backup (if enabled) +if [ "$configBackup" == "true" ]; then + # Set up file names, etc for later + tarfile="/tmp/config_backup.tar.gz" + filename="$(date "+FreeNAS_Config_%Y-%m-%d")" + ### Test config integrity + if ! [ "$(sqlite3 /data/freenas-v1.db "pragma integrity_check;")" == "ok" ]; then + # Config integrity check failed, set MIME content type to html and print warning + ( + echo "--${boundary}" + echo "Content-Type: text/html" + echo "Automatic backup of FreeNAS configuration has failed! The configuration file is corrupted!" + echo "You should correct this problem as soon as possible!" + echo "
" + ) >> "$logfile" + else + # Config integrity check passed; copy config db, generate checksums, make .tar.gz archive + cp /data/freenas-v1.db "/tmp/${filename}.db" + md5 "/tmp/${filename}.db" > /tmp/config_backup.md5 + sha256 "/tmp/${filename}.db" > /tmp/config_backup.sha256 + ( + cd "/tmp/" || exit; + tar -czf "${tarfile}" "./${filename}.db" ./config_backup.md5 ./config_backup.sha256; + ) + ( + # Write MIME section header for file attachment (encoded with base64) + echo "--${boundary}" + echo "Content-Type: application/tar+gzip" + echo "Content-Transfer-Encoding: base64" + echo "Content-Disposition: attachment; filename=${filename}.tar.gz" + base64 "$tarfile" + # Write MIME section header for html content to come below + echo "--${boundary}" + echo "Content-Type: text/html" + ) >> "$logfile" + # If logfile saving is enabled, copy .tar.gz file to specified location before it (and everything else) is removed below + if [ "$saveBackup" == "true" ]; then + cp "${tarfile}" "${backupLocation}/${filename}.tar.gz" + fi + rm "/tmp/${filename}.db" + rm /tmp/config_backup.md5 + rm /tmp/config_backup.sha256 + rm "${tarfile}" + fi +else + # Config backup enabled; set up for html-type content + ( + echo "--${boundary}" + echo "Content-Type: text/html" + ) >> "$logfile" +fi + + +###### Report Summary Section (html tables) +### zpool status summary table +( + # Write HTML table headers to log file; HTML in an email requires 100% in-line styling (no CSS or