Regelmäßigen HDD-Statusbericht per Mail bekommen

Protonetboxen richtig überwachen

Markus Badberg IT-Spezialist, Markus Badberg

02.09.2019 11:52:29

Viele nutzen die Protonetbox als Dateiablage und loggen sich selten in SOUL über die Weboberfläche ein. So werden defekte Festplatten schnell übersehen und man merkt es erst, wenn mehr als eine Festplatte ausgefallen ist und die Box dadurch nicht mehr lauffähig ist. Zudem sind die Daten auf den Festplatten dann nicht mehr ohne einen Spezialisten wiederherstellbar. 

Hier lässt sich aber relativ einfach ein regelmäßiger Statusreport einrichten.

Odoo • Image and Text

ZFS Pool Status

So sieht zum Beispiel der Statusreport eines intakten ZFS Pools aus.

Und so, wenn eine Festplatte im Raid 1 ausgefallen ist.

Odoo • Text and Image

Was wir dazu benötigen, ist ein sogenannter Local Patch, damit dies bei jedem Neustart der Box wieder konfiguriert wird.

Kommen wir nun  zur Einrichtung.

1. Falls noch nicht vorhanden, benötigen wir den local Patches Ordner. Sollte dieser bereits vorhanden sein, weiter bei Schritt 2.

sudo mkidir -p /protonet/firmware/local_patches

2. Nun legen wir einen weiteren Ordner in dem vorher Erstellten an und wechseln auch direkt in diesen.

sudo mkdir -p /protonet/firmware/local_patches/checkhdd && cd /protonet/firmware/local_patches/checkhdd/

3. Jetzt legen wir das eigentliche Script an. Ich nutze VIM. Ihr könnt aber auch den Editor eurer Wahl nutzen.

sudo vim check.py

4. Im Editor fügen wir jetzt folgenden Code ein und editieren den gelben Bereich mit unseren Daten von unserem Mailprovider um Mails senden zu können.

#!/usr/bin/python

import os
import sys
import smtplib
import mimetypes
import re
import json
from email.Encoders import encode_base64 from email.MIMEBase import MIMEBase from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText # ===================================== # CONFIG --BITTE NUR DIESEN BEREICH KONFIGURIEREN!! DAILY = True NO_DAILY_REPORT='False' MAIL_FROM = 'Absender-Mail-Adresse' MAIL_TO = "Empfänger-Mail-Adresse" MAIL_HOST = 'Mail-Server' MAIL_PORT = 587 # 465 SSL/TLS MAIL_USER = 'Benutzername für Absender Mailkonto' MAIL_PASS = 'Passwort für Absender Mailkonto' # CONFIG ENDE ------------------------------------- # MAIL_ALL_OK = config['DAILY_OK'] # Even send an EMail if everything is OK MAIL_ALL_OK = False # Even send an EMail if everything is OK CMD_ZPOOL = 'sudo /sbin/zpool'

# ===================================== # LIB def nodename(): return os.popen('cat /etc/protonet/nodename').read().split(os.linesep)[0] # open a connection to the SMTP-Server def initSMTP(): try: # USE SSL/TLS INSTEAD # s = smtplib.SMTP_SSL(MAIL_HOST, MAIL_PORT) s = smtplib.SMTP(MAIL_HOST, MAIL_PORT) # DETAILED TRACE #s.set_debuglevel(1) s.ehlo() s.login(MAIL_USER, MAIL_PASS) return s except Exception, e: print e sys.exit(1) # close the SMTP-connection def closeSMTP(s): s.quit() s.close() # send an E-Mail using specified SMTP-Connection def sendMail(subj, body): try: # connect to SMTP s = initSMTP() msg = MIMEMultipart() msg['From'] = MAIL_FROM msg['To'] = MAIL_TO msg['Subject'] = subj msg.attach(MIMEText(body)) s.sendmail(MAIL_FROM, MAIL_TO.split(";"), msg.as_string()) closeSMTP(s) except Exception, e: print e sys.exit(1)

# execute a command and return its output def cmd(c): try: proc = os.popen(c) out = proc.read().strip() return out except Exception, e: print e sys.exit(1) # create a summary-text of failed-command's output and additional details def summary(failed, details): s = failed s += "\n----------\n\n" s += details return s # ===================================== # MAIN() alert = False # ZFS Pool checking zpoolStatusX = cmd(CMD_ZPOOL + ' status -x') # IF pools are not healthy or debug TEST flag is set, send out email alert if DAILY or zpoolStatusX.find("all pools are healthy") == -1: alert = True zpoolStatus = cmd(CMD_ZPOOL + ' status') txt = zpoolStatusX # txt = summary(zpoolStatusX, zpoolStatus) sendMail(nodename() + " - ZFS Pool Status !!!WARNING!!!", txt) # IF pools are healthy and mail flag is set send out email if alert == False and MAIL_ALL_OK == True: sendMail(nodename() + " - ZFS is O.K.", "Everything is fine") sys.exit(0)

5. Die Änderungen an der neuen Datei speichern und wir legen die nächste benötigte Datei an.

sudo vim startcheck.sh

Diese Datei soll folgenden Inhalt bekommen:

#!/bin/bash
python /protonet/firmware/local_patches/checkhdd/check.py

6. Nachdem wir auch diese Datei gespeichert haben, richten wir noch ein Script ein, damit die Cronjobs bei einem Neustart eingerichtet werden.
Hierbei stellen wir auch ein, wann das Check-Script ausgeführt werden soll.

sudo vim addcronjob.sh

mit folgendem Inhalt:

echo '0 6 * * *   root    /protonet/firmware/local_patches/checkhdd/check' >> /etc/crontab

In diesem Beispiel wird das Script täglich um 06:00Uhr ausgeführt.

7. Jetzt müssen nur noch die Dateirechte gesetzt werden und damit sind wir auch schon fertig.

sudo chmod +x startcheck.sh
sudo chmod +x addcronjob.sh

8. Noch ein kurzer Test, ob das Script funktioniert.

./startcheck.sh

Nachfolgend noch ein paar Erläuterungen zur Cron Syntax

Crontab Syntax

Jeder Cronjob hat folgendes Format:

* * * * * auszuführender Befehl
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ └──── Wochentag (0-7, Sonntag ist 0 oder 7)
│ │ │ └────── Monat (1-12)
│ │ └──────── Tag (1-31)
│ └────────── Stunde (0-23)
└──────────── Minute (0-59)

Ein Stern * bedeutet Ausführung wird immer erfolgen, also zu jeder Minute, jeder Stunde, jedem Tag, jedem Monat oder jedem Wochentag. Um die einzelnen Stellen auseinander zu halten, hilft folgendes Diagram:

1 2 3 4 5 Befehl

1 = Minute (0-59)
2 = Stunde (0-23)
3 = Tag (0-31)
4 = Monat (1-12)
5 = Wochentag (0-7, Sonntag ist 0 oder 7)
Befehl = Der auszuführende Befehl.

Für die ersten fünf Stellen, also die Zeitwerte sind folgende Optionen zusätzlich möglich:

* = Ausführung immer (zu jeder…)
*/n = Ausführung aller n
n,x,y = Ausführung um/am n, x und y

Quelle: https://www.stetic.com/developer/cronjob-linux-tutorial-und-crontab-syntax/