Scripts für pihole update und backup
This commit is contained in:
Gerd Zelo 2020-04-23 09:21:56 +02:00
parent f7661e196f
commit a061f1f3b1
2 changed files with 406 additions and 0 deletions

View File

@ -0,0 +1,111 @@
#!/bin/bash
# Script: backupPiholeSettings.sh - https://github.com/RPiList/specials (/dev/)
#
# Beschreibung: Das Script sichert mittels pihole -a teleporter die relevanten Pihole Konfigurationsdateien in einem
# Teleporter tar.gz Archiv. Dieses Archiv lässt sich in der Weboberfläche des Pihole's unter
# Settings > Teleporter wieder importieren womit die Pihole-Konfiguration wiederhergestellt wird.
#
# Das Teleporterarchiv beinhaltet:
# - dnsmasq Konfiguration
# - Pihole Konfiguration setupVars.conf
# - Pihole-listen: adlists.list, auditlog.list, blacklist.txt, regex.list, whitelist.txt
#
# Aufrufparameter: 1. Backupverzeichnis --> Pfad an dem das Archiv abgelegt werden soll
# 2. Bereinigungsintervall in Tagen --> (optional) Logs und Archive älter als
# X Tage löschen.
# Standartwert ist: 90 Tage
#
# Aufruf: sudo ./backupPiholeSettings.sh /mnt/nas/rpi/
# optional: sudo ./backupPiholeSettings.sh /mnt/nas/rpi/ 180
#
# Ausgabedateien: /var/log/svpihole/Ym_backupPiholeSettings.sh.log --> monatliches Logfile
# /var/log/svpihole/backupPiholeSettings.cron.log --> Logifile des Cron-Jobs
# /.../pi-hole-teleporter_Y-m-d_H-M-S.tar.gz --> Teleporter Sicherungsarchiv
#
# Installation: 1. Script downloaden:
# wget https://raw.githubusercontent.com/RPiList/specials/master/dev/backupPiholeSettings.sh
# 2. Script mittels sudo chmod +x backupPiholeSettings.sh ausführbar machen.
#
# Installation: 1. Script mittels sudo cp backupPiholeSettings.sh /root nach /root kopieren.
# (als Cron-Job) 2. Script mittels sudo chmod +x /root/backupPiholeSettings.sh ausführbar machen.
# 3. Cron-Job mit sudo crontab -e erstellen
# Am Ende der Datei z.B. folgendes einfügen um das Script 2 x monatlich am 15. und 30. um 00:00 Uhr
# auszuführen:
#
# 0 0 */15 * * /root/backupPiholeSettings.sh /mnt/nas/rpi/ > /var/log/svpihole/backupPiholeSettings.cron.log
#
# 4. Datei speichern und schliessen (im nano Editor: Strg+o/Enter/Strg+x).
#
# Versionshistorie:
# Version 1.0.0 - [Zelo72] - initiale Version
# 1.0.1 - [Zelo72/AleksCee] - Bereinigung von Minuten auf Tage umgestellt und Unterscheidung zwischen
# Startpunkt und Suchmuster.
# - Aufrufparameter für Bereinigungsintervall in Tagen hinzugefügt,
# Standardwert ist 90 Tage
# Prüfen ob das Script als root ausgeführt wird
if [ "$(id -u)" != "0" ]; then
echo "Das Script muss mit Rootrechten ausgeführt werden!"
exit 1
fi
# Prüfen ob ein Backupverzeichnis angegeben wurde
if [ -z "$1" ]; then
echo "Es wurde kein Backupverzeichnis angegeben!"
exit 1
fi
# Prüfen ob das Backupverzeichnis existiert
if [ ! -d "$1" ]; then
echo "Backupverzeichnis $1 existiert nicht!"
exit 1
fi
# Bereiniung nach x Tagen, Default: 90 Tage
cleaningInterval=90
# Prüfen ob ein Bereinigungsintervall in Tagen als 2. Aufrufparameter mitgegeben wurde.
if [ -n "$2" ]; then
cleaningInterval=$2
fi
# *** Initialisierung ***
# Logging initialisieren
logDir=/var/log/svpihole
log=$logDir/$(date +'%Y%m')_backupPiholeSettings.sh.log
mkdir -p $logDir
# Hilfsfunktion zum loggen
writeLog() {
echo -e "[$(date +'%Y.%m.%d-%H:%M:%S')]" "$*" | tee -a "$log"
}
writeLog "[I] Start | Logfile: $log"
# Logverzeichnis bereinigen, Logs älter als 90 Tage werden gelöscht.
writeLog "[I] Bereinige Logverzeichnis $logDir ..."
find $logDir -daystart -type f -mtime +"$cleaningInterval" -name \*backupPiholeSettings\*.log -exec rm -v {} \;
writeLog "[I] Logverzeichnis $logDir bereinigt."
# Variablen
piholeBinDir=/usr/local/bin
backupDir=$1
# *** Pihole Backup ***
writeLog "[I] Führe Pihole Backup durch ..."
cd "$backupDir" || exit
$piholeBinDir/pihole -a teleporter
if [ ! $? ]; then
writeLog "[E] Fehler beim Backup, Exitcode: $?"
else
writeLog "[I] Backup erfolgreich durchgeführt."
fi
# Alte Teleporter Archive bereinigen, Archive älter als 90 Tage werden gelöscht.
writeLog "[I] Bereinige Backupverzeichnis $backupDir älter als $cleaningInterval Tage ..."
find "$backupDir" -daystart -type f -mtime +"$cleaningInterval" -name pi-hole-teleporter\*.\* -exec rm -v {} \;
writeLog "[I] Alte Backuparchive unter $backupDir wurden bereinigt."
writeLog "[I] Ende | Logfile: $log"

295
pihole/updatePihole.sh Normal file
View File

@ -0,0 +1,295 @@
#!/bin/bash
# Script: updatePihole.sh - https://github.com/RPiList/specials (/dev/)
#
# Beschreibung: Das Script aktualisiert bei jedem Lauf die Pi-hole Gravity (gravity.list) auf Basis der in Pi-hole
# konfigurierten Blocklisten (adlists.list). Zusaetzlich werden, wenn das Script an einem Sonntag ausgefuehrt
# wird, die Raspberry Pakete und die Pi-hole Software selbst aktualisiert sofern ein Update vorliegt.
# Bei Bedarf wird ein Gravity-Update Bericht als Mail versendet. Dieser beinhaltet neben einem Pi-Hole
# Gesundheitstatus auch die Statistik für das Pi-Hole und Gravity Update.
#
# Aufruf: sudo ./updatePihole.sh rootoma@senioren.xy <-- mit Mailversand
# sudo ./updatePihole.sh <-- ohne Mailversand
#
# Ausgabedateien: /var/log/svpihole/Ymd_updatePihole.sh.log --> taegliches Logfile
# /var/log/svpihole/updatePihole.stats.log --> Pi-hole Gravity Update Bericht/Statistik
# /var/var/log/svpihole/updatePihole.cron.log --> Logifile des Cron-Jobs
#
# Installation: 1. Script downloaden:
# wget https://raw.githubusercontent.com/RPiList/specials/master/dev/updatePihole.sh
# 2. Script mittels sudo chmod +x updatePihole.sh ausführbar machen.
#
# Installation: 1. Script mittels sudo cp updatePihole.sh /root nach /root kopieren.
# (als Cron-Job) 2. Script mittels sudo chmod +x /root/updatePihole.sh ausfuehrbar machen.
# 3. Cron-Job mit sudo crontab -e erstellen
# Am Ende der Datei z.B. folgendes einfuegen um das Script taeglich um 03:00 Uhr zu starten
# und eine Mail mit dem Gravity Update Bericht an "rootoma" zu schicken:
#
# 0 3 * * * /root/updatePihole.sh rootoma@senioren.xy > /var/log/svpihole/updatePihole.cron.log
#
# 4. Datei speichern und schliessen. (im nano Editor: Strg+o/Enter/Strg+x).
#
# -------
# :HINWEIS: Damit der Mailversand funktioniert, muss msmtp und mailutils installiert und konfiguriert
# ------- sein. Eine Anleitung dazu ist hier zu finden:
# https://github.com/RPiList/specials/blob/master/dev/EinrichtungMailversand.md
#
# Versionshistorie:
# Version 1.0.0 - [Zelo72] - initiale Version
# 1.0.1 - [Zelo72/AleksCee] - Umstellung von wc -l auf grep -Evc '^#|^$' um auskommentierte und leere Zeilen
# beim Zählen herauszufiltern.
# - Damit die Mail mit dem Abschlussbericht nicht vom Mailserver des Empfaengers
# als Spam eingestuft wird, wurde die Ausgabe der Top 50 hinzugefuegten und
# geloeschten Domains auskommentiert.
# - Gesundheitsstatus von JA/NEIN/UNDEFINIERT auf OK/FEHLER/NICHT DURCHGEFUEHRT
# umgestellt.
# - Von Gesamtlogfile auf taegliche Logs umgestellt
# - Delimiter in der Ausgabe entfernt
# 1.0.2 - [Zelo72/AleksCee] - n Sekunden warten bevor der DNS Check nach dem Pi-hole Update durchgefuehrt
# wird. Der Pi-Hole DNS Service braucht manchmal etwas bis er verfuegbar ist.
# - Versuch von RestartDNS wenn der DNS Service nach dem Pi-hole Update nicht
# mehr reagiert.
# - Möglicher Fehler Exitcode 127 bei Aufruf des pihole binaries aus einem Cron
# Job heraus behoben: von pihole -u/-g auf /usr/local/bin/pihole ... umgestellt.
# 1.0.3 - [Zelo72] - Beschreibung, Aufruf, Ausgabedateien und Installation beschrieben.
# 1.0.4 - [Zelo72] - Logverzeichnis bereinigen, Logs aelter als 7 Tage werden geloescht.
# 1.0.5 - [Zelo72/AleksCee] - Logbereinigung von Minuten auf Tage umgestellt und Unterscheidung zwischen
# Startpunkt und Suchmuster
# 1.0.6 - [Zelo72] - Gravity Update Bericht erweitert: Hostname, CPU Temperatur, RAM Nutzung,
# HDD Nutzung, Pi-hole Status (aktiv/offline)
# - Fehler behoben: Nach waitfordns und anschliessend fehlgeschlagenem DNS-Test
# wurde der Code im If-Zweig zum erneuten DNS-Test nicht
# ausgefuehrt.
# Prüfen ob das Script als root ausgefuehrt wird
if [ "$(id -u)" != "0" ]; then
echo "Das Script muss mit Rootrechten ausgeführt werden!"
exit 1
fi
# *** Initialisierung ***
# Logging initialisieren
logDir=/var/log/svpihole
log=$logDir/$(date +'%Y%m%d')_updatePihole.sh.log
mkdir -p $logDir
# Hilfsfunktion zum loggen
writeLog() {
echo -e "[$(date +'%Y.%m.%d-%H:%M:%S')]" "$*" | tee -a "$log"
}
writeLog "[I] Start | Logfile: $log"
# Tempverzeichnis initialisieren
tmp=/tmp/svpihole
writeLog "[I] Initialisiere Tempverzeichnis $tmp ..."
mkdir -p $tmp
cd $tmp || exit
# Logverzeichnis bereinigen, Logs aelter als 7 Tage werden geloescht.
writeLog "[I] Bereinige Logverzeichnis $logDir ..."
find $logDir -daystart -type f -mtime +7 -name \*updatePihole\*.log -exec rm -v {} \;
writeLog "[I] Logverzeichnis $logDir bereinigt."
# Variablen fuer Dateien
piholeDir=/etc/pihole
piholeBinDir=/usr/local/bin
gravListPihole=$piholeDir/gravity.list
gravListBeforeUpdate=$tmp/gravity_before_update.list
gravListDiff=$tmp/gravity_diff.list
logStats=$logDir/updatePihole.stats.log
# Variablen fuer "Gesundheitsstatus": -1: Undefiniert / 0: true / >0: false
piholeUpdateStatus=-1
piholeGravUpdateStatus=-1
dnsTestStatus=-1
inetTestStatus=-1
rebootRequired="NEIN"
# *** Hilfsfunktionen ***
status() {
case "$*" in
-1)
echo "NICHT DURCHGEFUEHRT"
;;
0)
echo "OK"
;;
1 | *)
echo "FEHLER #Exitcode:$*"
;;
esac
}
# Internetverbindung testen
checkinet() {
writeLog "[I] Teste Internetverbindung ..."
if ! (ping -c1 8.8.8.8 >/dev/null); then
writeLog "[E] Keine Internetverbindung! Das Script wird beendet!"
inetTestStatus=1
exit 1
fi
writeLog "[I] Internetverbindungstest erfolgreich."
inetTestStatus=0
return 0
}
# DNS-Namensaufloesung testen
checkdns() {
writeLog "[I] Teste DNS Namensaufloesung ..."
if ! (ping -c1 google.de >/dev/null); then
writeLog "[E] Keine DNS Namensaufloesung moeglich!"
dnsTestStatus=1
return 1
fi
writeLog "[I] DNS Namensaufloesung erfolgreich."
dnsTestStatus=0
return 0
}
# Auf DNS Service warten
waitfordns() {
writeLog "[I] Warte $1 Sek. auf DNS Service ..."
sleep "$1"
}
# *** Pi-hole Update ***
# Internetverbindung / DNS testen
checkinet # besteht keine Internetverbindung wird das Script mit exitcode 1 beendet
checkdns
# Nur wenn dieses Script Sonntags am Wochentag 0 ausgeführt wird:
# die Raspberry Pakete und die Pi-hole Software selbst updaten.
if test "$(date "+%w")" -eq 0; then # Sonntags = Wochentag 0
# Raspberry Pakete updaten
writeLog "[I] Raspberry Pakete updaten ..."
apt-get update
apt-get -y upgrade
# Raspberry Pakete bereinigen
writeLog "[I] Raspberry Pakete bereinigen ..."
apt-get -y autoremove
apt-get -y clean
# Pi-hole updaten
writeLog "[I] Pi-hole updaten ..."
$piholeBinDir/pihole -up
piholeUpdateStatus=$?
writeLog "[I] Pi-hole Update exitcode: $piholeUpdateStatus"
# Pruefen ob durch die Updates ein Reboot erforderlich ist
writeLog "[I] Pruefe ob ein Reboot erforderlich ist ..."
if [ -f /var/run/reboot-required ]; then
writeLog "[W] REBOOT nach Update erforderlich!"
echo "*************************"
echo "R E B O O T erforderlich!"
echo "*************************"
rebootRequired="JA"
fi
fi
# *** Pi-hole Gravity Update ***
# AKtuelle Gravity Liste vom Pi-hole zwischenspeichern und
# Pi-hole Gravity aktualisieren
writeLog "[I] Aktualisiere Pi-hole Gravity $gravListPihole ..."
cp $gravListPihole $gravListBeforeUpdate
$piholeBinDir/pihole -g # Pi-hole Gravity aktualisieren
piholeGravUpdateStatus=$?
writeLog "[I] Pi-hole Gravity Update exitcode: $piholeGravUpdateStatus"
# DNS nach Gravity Update testen
waitfordns 15
if ! checkdns; then
waitfordns 30
if ! checkdns; then
writeLog "[E] Pi-hole DNS Service reagiert nicht, versuche RestartDNS ..."
$piholeBinDir/pihole restartdns
waitfordns 90
checkdns
fi
fi
# Aktualisierte Pi-hole Gravityliste mit Gravityliste vor der Aktualisierung
# vergleichen und Aenderungen (hinzugefuegte/geloeschte Eintraege) in
# $gravListDiff Datei zur weiteren Auswertung speichern
writeLog "[I] Erstelle Aenderungs-Gravityliste $gravListDiff ..."
diff $gravListPihole $gravListBeforeUpdate | grep '[><]' >$gravListDiff
writeLog "[I] Aenderungs-Gravityliste mit $(grep -Evc '^#|^$' $gravListDiff) Eintraegen erstellt."
# *** Pi-hole Gravity Update Bericht/Statistik ***
# Id für Pi-hole Gravity Update Bericht erzeugen
id=$(date +"%Y.%m.%d-%H%M%S")
# Ermittle Pi-hole Status
if [[ "$($piholeBinDir/pihole status web 2>/dev/null)" == "1" ]]; then
phStatus="AKTIV"
else
phStatus="OFFLINE!"
fi
# Gravity Update Bericht erzeugen und in die unter $logStats angegebene Datei schreiben.
writeLog "[I] Erstelle Pi-hole Gravity Update Bericht/Statistik $id ..."
(
echo "# Raspberry Info #"
echo ""
echo "Hostname: $(hostname)"
echo "CPU Temperatur: $(($(cat /sys/class/thermal/thermal_zone0/temp) / 1000)) Grad"
echo "RAM Nutzung: $(awk '/^Mem/ {printf("%.2f%%", 100*($2-$4-$6)/$2);}' <(free -m))"
echo "HDD Nutzung: $(df -B1 / 2>/dev/null | awk 'END{ print $5 }')"
echo "Reboot erforderlich?: $rebootRequired"
echo ""
echo "# Pi-hole Info #"
echo ""
echo "Pi-hole Status: $phStatus"
echo "Internet: $(status $inetTestStatus)"
echo "DNS-Test: $(status $dnsTestStatus)"
echo "Update: $(status $piholeUpdateStatus)"
echo "Gravity Update: $(status $piholeGravUpdateStatus)"
echo ""
echo "# Pi-hole Statistik #"
echo ""
echo "Domains Gravitylist: $(grep -Evc '^#|^$' $gravListPihole)"
echo "Domains Blacklist: $(grep -Evc '^#|^$' $piholeDir/blacklist.txt)"
echo "RegEx Blacklist: $(grep -Evc '^#|^$' $piholeDir/regex.list)"
echo "Domains Whitelist: $(grep -Evc '^#|^$' $piholeDir/whitelist.txt)"
echo "Aktive Blocklisten: $(grep -Evc '^#|^$' $piholeDir/adlists.list)"
echo ""
echo "# Pi-hole Gravity Updatestatistik #"
echo ""
echo "(+): $(grep -c '<' $gravListDiff) Domains hinzugefuegt"
echo "(-): $(grep -c '>' $gravListDiff) Domains geloescht"
echo "(S): $(grep -Evc '^#|^$' $gravListDiff) Domains geaendert"
# Auskommentiert, damit der Spamfilter des Mailservers wegen den Domains nicht "glueht"!
#echo ""
#echo "(+) Hinzugefuegte Domains (Top 50):"
#grep -m50 '<' $gravListDiff
#echo ""
#echo "(-) Geloeschte Domains (Top 50):"
#grep -m50 '>' $gravListDiff
) | tee $logStats #Ausgaben innerhalb von () in die $logStats Datei schreiben
writeLog "[I] Pi-hole Gravity Update Bericht/Statistik $logStats erstellt."
# *** E-Mail Versand des Update Berichtes ***
# Aufrufparameter 1: sudo ./updatePihole.sh rootoma@seniorenstift.xy
email="$1"
# Mail mit Gravity Update Bericht wird nur versendet wenn beim Aufruf des Scriptes eine
# Mailadresse mit uebergeben wurde!
if [ -n "$email" ]; then
writeLog "[I] E-Mail Pi-hole Gravity Update Bericht $id wird an $email versendet ..."
mail <$logStats -s "Pi-hole Gravity Update Bericht $id" "$email"
# Pruefen ob der E-Mailversand fehlgeschlagen ist
if [ $? -ne 0 ]; then
writeLog "[E] E-Mailversand an $email fehlgeschlagen!"
else
writeLog "[I] E-Mailversand an $email erfolgreich."
fi
fi
writeLog "[I] Ende | Logfile: $log"