My project this weekend was to get server notifications from the Smartd daemon to send as encrypted messages. This effectively completes my aim of having all email notifications from my main server moved off Gmail and sent encrypted.
Smartd is a pretty essential bit of server software. It monitors the reported S.M.A.R.T values of Hard Drives installed and reports when it detects a change. Changes in certain values indicate that a disk is potentially going to fail. In theory, and often with a bit of luck, a disk exhibiting potential symptoms of failure can be replaced with a new one before it fails and the disk RAID array can rebuild itself. I had a pretty catastrophic failure of several disks at once a few years ago, but was effectively saved by notifications of changes in S.M.A.R.T values. Given I did not have a backup at the time (which I now realise was completely stupid…), the notifications gave me enough time to start copying data off the array.
The method by which I encrypted messages is much the same as with encrypting logwatch notifications and how I scripted my automated backup solution. Essentially a log file is created, that file is then encrypted with the public GPG key of my main email account and that file is then send as the message body of an email to said account. This works much the same, but a script is triggered by Smartd.
First I added the -M exec
option to /etc/smartd.conf
to trigger a script. To do this;
$ sudo nano /etc/smartd.conf
and edit your command to this (make sure you don’t have another uncommented line with DEVICESCAN
on it!);
DEVICESCAN -a -m <email address> -M exec /usr/local/bin/smartdnotify
It’s worth noting that, according to the Ubuntu manpage, the -M
option will not function if the -m
option hasn’t also been called first. The /usr/local/bin/smartdnotify
file will be our script. Create that with;
$ sudo nano /usr/local/bin/smartdnotify
Paste the following in;
#!/bin/sh
## Create log file
echo "$SMARTD_FAILTYPE" >> /path/to/notification/file/smartd.txt
echo "" >> /path/to/notification/file/smartd.txt
echo "$SMARTD_TFIRST" >> /path/to/notification/file/smartd.txt
echo ""
echo "$SMARTD_FULLMESSAGE" >> /path/to/notification/file/smartd.txt
## Encrypt and send log file
gpg --encrypt --armor -r <email address> /path/to/notification/file/smartd.txt
cat /path/to/notification/file/smartd.txt.asc | mutt -s "Smartd has found a problem!" <email address>
## Clean up files
rm /path/to/notification/file/smartd.txt
rm /path/to/notification/file/smartd.txt.asc
Type Ctrl X
to exit and make sure the file is saved. Then restart the smartd service with;
$ sudo systemctl restart smartd.service
You can check it is running with;
$ sudo systemctl status smartd.service
And that should be it! You can add -M test
to your DEVICESCAN
line in the smartd config file and test your configuration works too. This is probably a good idea given the potential importance of these notifications.
I found the following links particularly helpful. The Arch Wiki resource is always amazing, but in this case it detailed how to trigger a script. The Ubuntu manpage entry was particularly good at explaining the variables created by smartd that enabled a script to be written (things like $SMARTD_FULLMESSAGE in the script above).