UPDATE 17.06.2015
Neuere Version 1.0.2 mit folgenden Änderungen:
- Handling von leeren Feldern deutlich verbessert bzw, Fehler korrigiert
- Neuer Operator %: Mit dem Aufruf z.B. hibiscusumberwar.sh % 10 werden alle Umsätze (positiv u. negativ) der letzten 10 Tage ausgegeben
-----------------------------------------------
...und wieder mal war Scripting-Time. Dieses mal hat sie einen einfachen Umsatz-Berichterstatter, bzw. Umsatzwarner für Hibiscus beschert.
Daher auch der Name: Hibiscus UmBerWar
Das Script wurde auf CentOS 6 entwickelt, sollte aber grundsätzlich auf jedem Linux laufen. Die Red Hat nahen Distris wie RHEL Oracle Linux oder Fedora sollten alle out-of-the-box funktionieren.
Das Script prüft Umsätze des vergangenen Tages, oder einen Zeitraum vergangener Tage und generiert daraus einen Bericht, der per Email versendet wird.
Möchte man z.B. einen (Negativ-)Umsatzwarner einrichten, der bei Zahlungsabgängen von mehr als EUR 15000 alarmiert, so richtet man einfach einen Cron
Job um Mitternacht ein und gibt dort
hibiscusumberwar.sh -15000
ein. Und schon bekommt man eine Email, falls am Tage ein Betrag von 15000 oder höher (oder mehrere) abgegangen ist.
Will man sich jeden Freitag eine Email mit allen Zahlungseingängen der Woche schicken lassen, so stellt man für Samstag 0 Uhr einen Cron Job ein, der
wie folgt aufgerufen wird
hibiscusumberwar.sh 1 5
Hier nun das Script (auch als Anhang dieses Beitrags zum direkt herunterladen)
Voraussetzung: Hibiscus-Server (https://willuhn.de/products/hibiscus-server/) oder Jameica/Hibiscus, jeweils mit MySQL Datenbank. Hibiscus UmBerWar kann auch
auf einem Remote-Host ausgeführt werden. Es muss nicht auf der selben Maschine laufen wie Hibiscus selbst. Lediglich der Zugriff auf die MySQL Datenbank ist nötig.
#!/bin/bash
#
# Hibiscus UmBerWar - Umsatzbericht / Umsatzwarner
#
# Autor: Christian B. Caldarone <caldarone@gmx.net>
#
# (C) 2015, Freie Software, GPLv3
#
# Umsätze größer bzw kleiner EUR X abfragen und ggf. Email mit
# den entspr. Umsatzdetails als Anhang senden
#
# In der Grundeinstellung werden alle Kontobewegungen vom vorgerigen
# Tag bis heute überprüft. Daher empfiehlt es sich, Hibiscus UmBerWar
# per Cron Eintrag jeweils um Mitternacht auszuführen.
#
# Die Anzahl der Tage für den Rückblick kann bei Aufruf des Hibiscus
# Umsatzwarner mit übergeben werden, um z.B. immer am Montag um 0 Uhr
# einen Rückblick auf die letzte Woche zu generieren.
#
#
# Voraussetzung: Hibiscus-Server oder Jameica/Hibiscus mit MySQL
# Konfiguration und aktiver, automatischer Bank-Synchronisation
#
# Aufruf: hibiscusumberwar.sh <Betrag> <Tage>
#
# Wird kein Betrag und keine Tage angegeben, werden alle Negativ-
# Umstätze, d.h. Zahlungsausgänge des vorgerigen Tages ausgegeben.
#
# Beispiel: hibiscusumberwar.sh -1000 gibt alle Zahlungsausgänge mit
# mindestens EUR 1000 oder höher für den Zeitraum gestern
# bis heute aus.
#
# hibiscusumberwar.sh 500 5 gibt alle Zahlungseingänge mit
# min EUR 500 oder höher der vergangenen 5 Tage aus.
#
# hibiscusumberwar.sh % 10 gibt alle Zahlungseingänge und alle
# Zahlungsausgänge der vergangenen 10 Tage aus.
#
version="Hibiscus UmBerWar v1.0.2"
# Überprüfen ob ein Betrag an dieses Script übergeben wurde, wenn nicht, dann Betrag auf null
# setzten um alle Negativumsätze abzufragen
if [ "$1" = "" ]; then
Betrag_warn="0"
else
Betrag_warn=$1
fi
# Anhand des Betrages, ermitteln ob negative, positive oder alle Umsätze abgefragt werden sollen
# und entsprechend den Operator für die MySQL Abfrage anpassen
if [ ! "$Betrag_warn" = "%" ]; then
if [ $Betrag_warn -gt 0 ]; then
mySQL_op=">="
else
mySQL_op="<="
fi
else
Betrag_warn="0"
mySQL_op="<>"
fi
# Überprüfen ob die Anzahl der Tage an dieses Script übergeben wurde, wenn nicht, dann Tage auf eins
# setzten um nur den vorherigen Tag bis heute abzufragen
if [ "$2" = "" ]; then
Tage_warn=1
else
Tage_warn=$2
fi
# Parameter für den Email-Versand festlegen.
#
# Bitte entsprechend der eigenen Gegebenheiten anpassen!
email_sender="$USER@$HOSTNAME" # oder z.B email_sender="absender@gmx.de"
email_recipient="" # z.B. email_recipient="empfaenger@web.de"
email_subject="**HIBISCUS** Umsatzbericht für Betraege $mySQL_op EUR $Betrag_warn der letzten $Tage_warn Tage"
# Parameter für die Verbindung zum MySQL Server und die SQL-Abfrage festlegen.
#
# Bitte entsprechend der eigenen Gegebenheiten anpassen!
mySQL_user="hibiscus" # MySQL Datenbank-Benutzer für Datenbank hibiscus
mySQL_pass="hibiscus" # MySQL Datenbank-Benutzer Password für Datenbank hibiscus
mySQL_host="127.0.0.1" # Hier kann auch ein Remote-Host angegeben werden
mySQL_db="hibiscus" # Datenbankname, von Hibiscus vorgegeben
mySQL_query="SELECT empfaenger_konto , empfaenger_blz , empfaenger_name , betrag , datum, zweck, zweck2, zweck3 FROM umsatz WHERE betrag $mySQL_op $Betrag_warn AND datum > SUBDATE(CURDATE(),$Tage_warn) ORDER BY datum DESC;"
# Temoräre Datei erstellen, in der das Resultat der SQL Abfrage gespeichert wird
out=$(mktemp --tmpdir hibiscusalert.XXXXXXXXXX) || { echo "Fehler beim anlegen einer Temp-Datei."; exit 1; }
# Zur MySQL Datenbank verbinden, SQL Abfrage absetzen und Ausgabe abspeichern
echo $mySQL_query | mysql -N -h $mySQL_host -u $mySQL_user -p$mySQL_pass $mySQL_db | tr $'\t\2' $'\2\t' > $out 2>&1
# Ist bei der MySQL Abfrage ein Fehler aufgetreten? Wenn ja, dann mit Fehlermeldung beenden
[ $? -eq 0 ] || { echo "Fehler bei MySQL Abfrage" ; exit 1 ; }
# Ist die Abfrage negativ verlaufen? D.h. es gibt keine Umstätze, die dem Muster entsprechen, dann beenden.
[ $(stat -c %s $out) -gt 0 ] || exit 0
# Wurden entsprechende Umsätze gefunden, dann diese nun weiterverarbeiten und für den Email-Bericht aufbereiten...
# Festlegen, dass die Felder der Abfrage durch TAB getrennt wurden
OLDIFS=$IFS
IFS=$'\2\t'
# Trennlinie für Vervendung im Bericht festlegen
separator="--------------------------------------------------------------------------------------------------------------" ;
# Temoräre Dateien für den Email Text und den Anhang festlegen. Sollte es hierbei zu einem Fehler kommen,
# dann direkt mit Fehlermeldung beenden
email_body=$(mktemp --tmpdir hibiscusalert.XXXXXXXXXX) && \
attachement=$(mktemp --tmpdir hibiscusalert.XXXXXXXXXX) \
|| { echo "Fehler beim anlegen einer Temp-Datei."; exit 1; }
# Text für die Email verfassen
{
echo "Automatisch generierte System-Email. Bitte nicht antworten." ;
echo ;
echo "Die im Anhang befindliche(n) Kontobewegung(en) der letzten $Tage_warn Tage haben den Betrag von $mySQL_op EUR $Betrag_warn ueberschritten" ;
echo ;
echo "Mit freundlichem Gruss"
echo ;
echo "Hibiscus UmBerWar";
} > $email_body
# Kopfzeile für den Bericht/Email-Anhang generieren
{
echo ;
echo "*** $version ***" ;
echo ;
echo $separator ;
} > $attachement
# Umsatzdetails aus SQL-Ausgabe einlesen und Daten für den Bericht generieren
while read -r -a hibiscus
do
{
echo "Datum :" ${hibiscus[4]} ;
echo "Empfänger Name :" ${hibiscus[2]} ;
echo "Empfänger Konto :" ${hibiscus[0]} ;
echo "Empfänger BIC :" ${hibiscus[1]} ;
echo "Betrag (EUR) :" ${hibiscus[3]} ;
echo -n "Verwendungszweck : " ;
echo -e ${hibiscus[7]} | tr -d '\n' | sed 's/.CRED/\n CRED/' \
| sed 's/.PURP/\n PURP/' | sed 's/.SVWZ/\n SVWZ/' ;
echo ;
echo $separator ;
} >> $attachement
done < $out
IFS=$OLDIFS
# Bericht mit Fußzeile abschließen
{
echo "Bericht generiert :" $(date) ;
echo "Host: $HOSTNAME Benutzer: $USER" ;
echo $separator ;
} >> $attachement
# Die Temporäre Datei für den Bericht im Email-Anhang entsprechend umbenennen
dir=$(dirname "$attachement")
mv $attachement $dir"/Umsatzdetails.txt"
attachement="$dir/Umsatzdetails.txt"
# Nun alles direkt per Email versenden. Ist kein Empfänger angegeben, dann Bericht auf der Konsole ausgeben
if [ ! "$email_recipient" = "" ]; then
cat $email_body | mail -r $email_sender -s "$email_subject" -a $attachement $email_recipient 2>&1
else
cat $attachement
echo
echo "!!! Keine Email-Adresse im Script angegeben, daher Ausgabe im Terminal !!!"
echo
echo "Bitte entsprechend im Script Variable 'email_recipient=' konfigurieren"
echo
fi
retval=$? # Rückgabewert des mail bzw. incov Befehls zur Auswertung zwischenspeichern
# Alle temporären Dateien löschen
rm -f $email_body
rm -f $out
rm -f $attachement
# Hat es einen Fehler beim Mail-Versand gegeben, dann diesen Anzeigen und beenden
[ $retval -eq 0 ] || { echo "Fehler beim Mail-Versand oder Ausgabe des Berichts" ; exit 1 ; }
# Ansonsten normal beenden
exit 0
Viel Spaß damit!
Gruß
Christian
PS: Nicht vergessen, die MySQL Zugangsdaten und die Email Adresse im Script anzupassen
Neuere Version 1.0.2 mit folgenden Änderungen:
- Handling von leeren Feldern deutlich verbessert bzw, Fehler korrigiert
- Neuer Operator %: Mit dem Aufruf z.B. hibiscusumberwar.sh % 10 werden alle Umsätze (positiv u. negativ) der letzten 10 Tage ausgegeben
-----------------------------------------------
...und wieder mal war Scripting-Time. Dieses mal hat sie einen einfachen Umsatz-Berichterstatter, bzw. Umsatzwarner für Hibiscus beschert.
Daher auch der Name: Hibiscus UmBerWar
Das Script wurde auf CentOS 6 entwickelt, sollte aber grundsätzlich auf jedem Linux laufen. Die Red Hat nahen Distris wie RHEL Oracle Linux oder Fedora sollten alle out-of-the-box funktionieren.
Das Script prüft Umsätze des vergangenen Tages, oder einen Zeitraum vergangener Tage und generiert daraus einen Bericht, der per Email versendet wird.
Möchte man z.B. einen (Negativ-)Umsatzwarner einrichten, der bei Zahlungsabgängen von mehr als EUR 15000 alarmiert, so richtet man einfach einen Cron
Job um Mitternacht ein und gibt dort
hibiscusumberwar.sh -15000
ein. Und schon bekommt man eine Email, falls am Tage ein Betrag von 15000 oder höher (oder mehrere) abgegangen ist.
Will man sich jeden Freitag eine Email mit allen Zahlungseingängen der Woche schicken lassen, so stellt man für Samstag 0 Uhr einen Cron Job ein, der
wie folgt aufgerufen wird
hibiscusumberwar.sh 1 5
Hier nun das Script (auch als Anhang dieses Beitrags zum direkt herunterladen)
Voraussetzung: Hibiscus-Server (https://willuhn.de/products/hibiscus-server/) oder Jameica/Hibiscus, jeweils mit MySQL Datenbank. Hibiscus UmBerWar kann auch
auf einem Remote-Host ausgeführt werden. Es muss nicht auf der selben Maschine laufen wie Hibiscus selbst. Lediglich der Zugriff auf die MySQL Datenbank ist nötig.
Code
#!/bin/bash
#
# Hibiscus UmBerWar - Umsatzbericht / Umsatzwarner
#
# Autor: Christian B. Caldarone <caldarone@gmx.net>
#
# (C) 2015, Freie Software, GPLv3
#
# Umsätze größer bzw kleiner EUR X abfragen und ggf. Email mit
# den entspr. Umsatzdetails als Anhang senden
#
# In der Grundeinstellung werden alle Kontobewegungen vom vorgerigen
# Tag bis heute überprüft. Daher empfiehlt es sich, Hibiscus UmBerWar
# per Cron Eintrag jeweils um Mitternacht auszuführen.
#
# Die Anzahl der Tage für den Rückblick kann bei Aufruf des Hibiscus
# Umsatzwarner mit übergeben werden, um z.B. immer am Montag um 0 Uhr
# einen Rückblick auf die letzte Woche zu generieren.
#
#
# Voraussetzung: Hibiscus-Server oder Jameica/Hibiscus mit MySQL
# Konfiguration und aktiver, automatischer Bank-Synchronisation
#
# Aufruf: hibiscusumberwar.sh <Betrag> <Tage>
#
# Wird kein Betrag und keine Tage angegeben, werden alle Negativ-
# Umstätze, d.h. Zahlungsausgänge des vorgerigen Tages ausgegeben.
#
# Beispiel: hibiscusumberwar.sh -1000 gibt alle Zahlungsausgänge mit
# mindestens EUR 1000 oder höher für den Zeitraum gestern
# bis heute aus.
#
# hibiscusumberwar.sh 500 5 gibt alle Zahlungseingänge mit
# min EUR 500 oder höher der vergangenen 5 Tage aus.
#
# hibiscusumberwar.sh % 10 gibt alle Zahlungseingänge und alle
# Zahlungsausgänge der vergangenen 10 Tage aus.
#
version="Hibiscus UmBerWar v1.0.2"
# Überprüfen ob ein Betrag an dieses Script übergeben wurde, wenn nicht, dann Betrag auf null
# setzten um alle Negativumsätze abzufragen
if [ "$1" = "" ]; then
Betrag_warn="0"
else
Betrag_warn=$1
fi
# Anhand des Betrages, ermitteln ob negative, positive oder alle Umsätze abgefragt werden sollen
# und entsprechend den Operator für die MySQL Abfrage anpassen
if [ ! "$Betrag_warn" = "%" ]; then
if [ $Betrag_warn -gt 0 ]; then
mySQL_op=">="
else
mySQL_op="<="
fi
else
Betrag_warn="0"
mySQL_op="<>"
fi
# Überprüfen ob die Anzahl der Tage an dieses Script übergeben wurde, wenn nicht, dann Tage auf eins
# setzten um nur den vorherigen Tag bis heute abzufragen
if [ "$2" = "" ]; then
Tage_warn=1
else
Tage_warn=$2
fi
# Parameter für den Email-Versand festlegen.
#
# Bitte entsprechend der eigenen Gegebenheiten anpassen!
email_sender="$USER@$HOSTNAME" # oder z.B email_sender="absender@gmx.de"
email_recipient="" # z.B. email_recipient="empfaenger@web.de"
email_subject="**HIBISCUS** Umsatzbericht für Betraege $mySQL_op EUR $Betrag_warn der letzten $Tage_warn Tage"
# Parameter für die Verbindung zum MySQL Server und die SQL-Abfrage festlegen.
#
# Bitte entsprechend der eigenen Gegebenheiten anpassen!
mySQL_user="hibiscus" # MySQL Datenbank-Benutzer für Datenbank hibiscus
mySQL_pass="hibiscus" # MySQL Datenbank-Benutzer Password für Datenbank hibiscus
mySQL_host="127.0.0.1" # Hier kann auch ein Remote-Host angegeben werden
mySQL_db="hibiscus" # Datenbankname, von Hibiscus vorgegeben
mySQL_query="SELECT empfaenger_konto , empfaenger_blz , empfaenger_name , betrag , datum, zweck, zweck2, zweck3 FROM umsatz WHERE betrag $mySQL_op $Betrag_warn AND datum > SUBDATE(CURDATE(),$Tage_warn) ORDER BY datum DESC;"
# Temoräre Datei erstellen, in der das Resultat der SQL Abfrage gespeichert wird
out=$(mktemp --tmpdir hibiscusalert.XXXXXXXXXX) || { echo "Fehler beim anlegen einer Temp-Datei."; exit 1; }
# Zur MySQL Datenbank verbinden, SQL Abfrage absetzen und Ausgabe abspeichern
echo $mySQL_query | mysql -N -h $mySQL_host -u $mySQL_user -p$mySQL_pass $mySQL_db | tr $'\t\2' $'\2\t' > $out 2>&1
# Ist bei der MySQL Abfrage ein Fehler aufgetreten? Wenn ja, dann mit Fehlermeldung beenden
[ $? -eq 0 ] || { echo "Fehler bei MySQL Abfrage" ; exit 1 ; }
# Ist die Abfrage negativ verlaufen? D.h. es gibt keine Umstätze, die dem Muster entsprechen, dann beenden.
[ $(stat -c %s $out) -gt 0 ] || exit 0
# Wurden entsprechende Umsätze gefunden, dann diese nun weiterverarbeiten und für den Email-Bericht aufbereiten...
# Festlegen, dass die Felder der Abfrage durch TAB getrennt wurden
OLDIFS=$IFS
IFS=$'\2\t'
# Trennlinie für Vervendung im Bericht festlegen
separator="--------------------------------------------------------------------------------------------------------------" ;
# Temoräre Dateien für den Email Text und den Anhang festlegen. Sollte es hierbei zu einem Fehler kommen,
# dann direkt mit Fehlermeldung beenden
email_body=$(mktemp --tmpdir hibiscusalert.XXXXXXXXXX) && \
attachement=$(mktemp --tmpdir hibiscusalert.XXXXXXXXXX) \
|| { echo "Fehler beim anlegen einer Temp-Datei."; exit 1; }
# Text für die Email verfassen
{
echo "Automatisch generierte System-Email. Bitte nicht antworten." ;
echo ;
echo "Die im Anhang befindliche(n) Kontobewegung(en) der letzten $Tage_warn Tage haben den Betrag von $mySQL_op EUR $Betrag_warn ueberschritten" ;
echo ;
echo "Mit freundlichem Gruss"
echo ;
echo "Hibiscus UmBerWar";
} > $email_body
# Kopfzeile für den Bericht/Email-Anhang generieren
{
echo ;
echo "*** $version ***" ;
echo ;
echo $separator ;
} > $attachement
# Umsatzdetails aus SQL-Ausgabe einlesen und Daten für den Bericht generieren
while read -r -a hibiscus
do
{
echo "Datum :" ${hibiscus[4]} ;
echo "Empfänger Name :" ${hibiscus[2]} ;
echo "Empfänger Konto :" ${hibiscus[0]} ;
echo "Empfänger BIC :" ${hibiscus[1]} ;
echo "Betrag (EUR) :" ${hibiscus[3]} ;
echo -n "Verwendungszweck : " ;
echo -e ${hibiscus[7]} | tr -d '\n' | sed 's/.CRED/\n CRED/' \
| sed 's/.PURP/\n PURP/' | sed 's/.SVWZ/\n SVWZ/' ;
echo ;
echo $separator ;
} >> $attachement
done < $out
IFS=$OLDIFS
# Bericht mit Fußzeile abschließen
{
echo "Bericht generiert :" $(date) ;
echo "Host: $HOSTNAME Benutzer: $USER" ;
echo $separator ;
} >> $attachement
# Die Temporäre Datei für den Bericht im Email-Anhang entsprechend umbenennen
dir=$(dirname "$attachement")
mv $attachement $dir"/Umsatzdetails.txt"
attachement="$dir/Umsatzdetails.txt"
# Nun alles direkt per Email versenden. Ist kein Empfänger angegeben, dann Bericht auf der Konsole ausgeben
if [ ! "$email_recipient" = "" ]; then
cat $email_body | mail -r $email_sender -s "$email_subject" -a $attachement $email_recipient 2>&1
else
cat $attachement
echo
echo "!!! Keine Email-Adresse im Script angegeben, daher Ausgabe im Terminal !!!"
echo
echo "Bitte entsprechend im Script Variable 'email_recipient=' konfigurieren"
echo
fi
retval=$? # Rückgabewert des mail bzw. incov Befehls zur Auswertung zwischenspeichern
# Alle temporären Dateien löschen
rm -f $email_body
rm -f $out
rm -f $attachement
# Hat es einen Fehler beim Mail-Versand gegeben, dann diesen Anzeigen und beenden
[ $retval -eq 0 ] || { echo "Fehler beim Mail-Versand oder Ausgabe des Berichts" ; exit 1 ; }
# Ansonsten normal beenden
exit 0
Viel Spaß damit!
Gruß
Christian
PS: Nicht vergessen, die MySQL Zugangsdaten und die Email Adresse im Script anzupassen
Der an diesem Beitrag angefügte Anhang ist entweder nur im eingeloggten Zustand sichtbar oder die Berechtigung Deiner Benutzergruppe ist nicht ausreichend.