====== My own Monitoringtool ====== I really dont know where to begin with. I had this project... There was this company with these old printers which printed on really loooooong papers...\\ These papers contained important info about the current state of the buildings, like "everything is fine" or "RUN! THE BUILDING IS ON FIRE!!!". \\ Basically this kind of information... Anyway, I had to find a solution to alert people if that info is printed. So, the first step was to collect the analog info and make it digital. It wasnt my part of the project to realise it, someone had this piece of hardware which transformed the print to a textfile. I had access to these files via sftp. But how do you track alerts? These days I would create a script for Icinga2 but back in the day, I was a noob... So I wrote my own Monitoringtool. Sourcecode below... Sorry for the german comments... autoftp.sh is the startscript for ftpgetter.sh, it can be placed in /etc/init.d, execute via "service autoftp.sh %%<%%command%%>%%" #!/bin/bash ############################### #############Usage############# ###Startscript for FTPGetter### ############################### #############Date############## ###########15-04-2014########## ############################### #############Autor############# ###########Lunetikk############ ############################### #var DIENST startet das Script mit nohup und & im Hintergrund, sodass die Shell, wo der Befehl ausgeführt wurde, weiterhin verwendet werden kann. DIENST=nohup /home/pi/script/ftpgetter.sh & #var DIENSTNAME wird vergeben ohne nohup und &, da dieses nicht im Prozessnamen angezeigt wird. DIENSTNAME=/home/pi/script/ftpgetter.sh #Wenn autoftp mit start ausgeführt wurde, wird das Programm gestartet mit Ausgabe "wurde gestartet", stop = stop, restart = stop,start, sonstiges ist Ausgabe, was moeglich ist. case "$1" in start) $DIENST [ $? -eq 0 ] && echo "$DIENSTNAME wurde gestartet" ;; stop) pkill -f $DIENSTNAME [ $? -eq 0 ] && echo "$DIENSTNAME wurde gestoppt" ;; restart) $0 stop $0 start ;; *) echo "Usage: $0 (start|stop|restart)" ;; esac ftpgetter.sh copies all .txt files via sftp to a local directory. #!/bin/bash ############################### #############Usage############# ##.txt file from FTP to local## ############################### #############Date############## ###########15-04-2014########## ############################### #############Autor############# ###########Lunetikk############ ############################### #Endlosschleife while true do #Hostnamen vergeben HOST='localhost' #Usernamen vergeben USER='root' #Pfad zur FTPLogdatei LOGPFAD=/home/pi/script/meldunglogs/ftprsync.log #Pfad zu Textdateien auf dem FTP FTPPFAD=/var/www/meldungftp/ #Pfad zu den lokalen Textdateien PFAD=/var/www/meldung/meldungen/ #Prüfen, ob .txt Dateien auf FTP vorhanden sind if ssh $USER@$HOST "ls $FTPPFAD*.txt" >/dev/null 2>&1 then #Wenn Dateien vorhanden, synchronisiere die Dateien auf dem FTP mit den Dateien in einem lokalen Verzeichnis. Danach loesche die Quelldateien (auf FTP), #schreibe diverse Statistiken (Uebertragungsmenge, Geschwindigkeit, welche Dateien) in ein Logfile. -q (quiet) gibt in der Shell nur Fehler aus, sonst keine Ausgaben rsync --remove-source-files --stats --progress --log-file=$LOGPFAD -q ${USER}@${HOST}:$FTPPFAD*.txt $PFAD fi #kurze Pause -> weniger CPU-Auslastung sleep 5 done autowrite.sh is the startscript for mysqlwriter.sh, it can be placed in /etc/init.d, execute via "service autosql.sh %%<%%command%%>%%" #!/bin/bash ############################### #############Usage############# ##Startscript for MySQLWriter## ############################### #############Date############## ###########15-04-2014########## ############################### #############Autor############# ###########Lunetikk############ ############################### #var DIENST startet das Script mit nohup und & im Hintergrund, sodass die Shell, wo der Befehl ausgeführt wurde, weiterhin verwendet werden kann. DIENST=nohup /home/pi/script/mysqlwriter.sh & #var DIENSTNAME wird vergeben ohne nohup und &, da dieses nicht im Prozessnamen angezeigt wird. DIENSTNAME=/home/pi/script/mysqlwriter.sh #Wenn autowrite mit start ausgeführt wurde, wird Programm gestartet mit Ausgabe "wurde gestartet", stop = stop, restart = stop,start, sonstiges ist Ausgabe, was moeglich ist. case "$1" in start) $DIENST [ $? -eq 0 ] && echo "$DIENSTNAME wurde gestartet" ;; stop) pkill -f $DIENSTNAME [ $? -eq 0 ] && echo "$DIENSTNAME wurde gestoppt" ;; restart) $0 stop $0 start ;; *) echo "Usage: $0 (start|stop|restart)" ;; esac mysqlwriter.sh write the .txt files to a database #!/bin/bash ############################### #############Usage############# ######.txt file to MySQL####### ############################### #############Datum############# ###########15-04-2014########## ############################### #############Autor############# ###########Lunetikk############ ############################### #Endlosschleife while true do #Pfad zu Logdatei LOGPFAD=/home/pi/script/meldunglogs/mysqlinsert.log #Pfad zu den lokalen Textdateien PFAD=/var/www/meldung/meldungen/ #Pfad zu den lokalen Textdateien nach einlesen USEDPFAD=/var/www/meldung/used/ #Username von MYSQL MYSQLUSER= #Passwort von MYSQL MYSQLPW= #Datenbank mit Tabelle DBTABLE=mysql.Meldungen #Datenbank - Spalten der Tabelle SSTATUS=Status SDATUM=Datum SUHRZEIT=Uhrzeit SSTANDORT=Standort SMELDUNG=Meldung SALARMFENSTER=Alarmfenster #Name der lokalen Textdateien. Alle Dateien mit Endung .txt werden gelesen, durch head -1 jedoch nur eine genommen und in var DATA geschrieben DATA=`ls $PFAD. | grep .txt | head -1` #Wenn es eine Datei mit Endung .txt gibt, dann if [ -n "$DATA" ] then #i wird initialisiert i=1 #wird für Leerzeichen benötigt, da diese sonst in der DB nicht richtig erscheinen (alle Zeilen sind in eine Tabellenzeile) IFS=$'\012' #fuer jede Zeile in der Datei DATA, mache for i in $(cat $PFAD$DATA); do #Spalte f1 beinhaltet den Status und wird deshalb in var STATUS geschrieben. cut trennt die Spalte mit -d "|" ("|" ist Trennzeichen auf. IFS ist wie erwaehnt für die Leerzeichen notwendig. STATUS=$(echo $i | cut -d "|" -f1 | tr "$IFS" '\n') DATUM=$(echo $i | cut -d "|" -f2 | tr "$IFS" '\n') UHRZEIT=$(echo $i | cut -d "|" -f3 | tr "$IFS" '\n') STANDORT=$(echo $i |cut -d "|" -f4 | tr "$IFS" '\n') MELDUNG=$(echo $i | cut -d "|" -f5 | tr "$IFS" '\n') #Hier wird für eine Popup Warnmeldung im Fall eines Alarms eine 1 in der Tabellenspalte Alarmfenster gesetzt. Wenn es kein Alarm ist, eine 0 if [ $STATUS==Alarm ] then #Stellt Verbindung zu mysql her mit -u USERNAME und --password PASSWORT. fuer anderen Hostnamen ist -h HOSTNAME zu verwenden #Danach wird mit INSERT die DATENBANK.TABELLE gewählt und die Tabellen Spalten mit den variablen $VARIABLEN beschrieben mysql -u $MYSQLUSER --password=$MYSQLPW << EOFMYSQL INSERT INTO $DBTABLE ($SSTATUS, $SDATUM, $SUHRZEIT, $SSTANDORT, $SMELDUNG, $SALARMFENSTER) VALUES ('$STATUS', '$DATUM', '$UHRZEIT', '$STANDORT', '$MELDUNG', 1); EOFMYSQL else #Stellt Verbindung zu mysql her mit -u USERNAME und --password PASSWORT. fuer anderen Hostnamen ist -h HOSTNAME zu verwenden #Danach wird mit INSERT die DATENBANK.TABELLE gewählt und die Tabellen Spalten mit den variablen $VARIABLEN beschrieben mysql -u $MYSQLUSER --password=$MYSQLPW << EOFMYSQL INSERT INTO $DBTABLE ($SSTATUS, $SDATUM, $SUHRZEIT, $SSTANDORT, $SMELDUNG, $SALARMFENSTER) VALUES ('$STATUS', '$DATUM', '$UHRZEIT', '$STANDORT', '$MELDUNG', 0); EOFMYSQL fi done #Die vergebenen Variablen werden mit ihrem Inhalt in eine Logdatei geschrieben echo "----------------------------------------------" >> $LOGPFAD; #Trennlinie zwischen Datensaetzen echo "Data" $PFAD$DATA >> $LOGPFAD; echo "Status" $STATUS >> $LOGPFAD; echo "Datum" $DATUM >> $LOGPFAD; echo "Uhrzeit" $UHRZEIT >> $LOGPFAD; echo "Standort" $STANDORT >> $LOGPFAD; echo "Meldung" $MELDUNG >> $LOGPFAD; #Die lokale Datei wird in den Ordner "used" verschoben, damit diese nicht erneut eingelesen wird. mv $PFAD$DATA $USEDPFAD$DATA fi #kurze Pause -> weniger CPU-Auslastung (Auswirkung = 1 Datei/sek, sonst 2-3 Dateien/sek) sleep 1 done Coming up is the webGUI, dont expect anything LOL index.php is the mainsite which displays all incoming info via iframe Meldungen
Meldungen














Meldungssuche
meldungen.php checks the database every 5 seconds for new messages. Messages could be ok, warning, crit, basically like icinga. They are colored differently. If an alert is found, there will be a popup window //Hier wurde vorher über meta refresh die Seite nach 5 Sekunden neu geladen. Dies funktioniert nun jedoch über das Javascript. //echo ""; echo "";//styles.css einbinden echo "
";//Beginn:meld //connection_data.inc.php beinhaltet die Verbindungsdaten zum MySQL Server, include fügt diese in diese Seite ein include("includes/connection_data.inc.php"); //Hier wird der Countdown angezeigt echo "Noch "; echo " "; //Es werden die letzten 10 Einträge, egal welchen Inhalt diese haben aus der Datenbank gelesen. //Sortiert wird nach IdMeldungen (alternativ: Datum AND Uhrzeit) durch DESC (alternativ: ASC) in der Auflistung neuster Eintrag oben, durch LIMIT 0,10 limitiert auf 10 Stück (dieser Wert kann angepasst werden) $abfrage = "SELECT * FROM Meldungen ORDER BY IdMeldungen DESC LIMIT 0,10"; $ergebnis = mysql_query($abfrage); $ergebnisse = mysql_num_rows($ergebnis); if ($ergebnisse != 0){ //Tabelle für Ausgabe wird erzeugt echo ''; //Solange es Ergebnisse gibt, werden diese ausgegeben while ($row = mysql_fetch_object($ergebnis)){ //Wenn der Status des Ergebnisses Alarm ist, wird diese Zeile rot ausgegeben if($row->Status == Alarm){ //Falls die Spalte Alarmfenster eine 1 enthält, wird ein Warnungspopup angezeigt, ansonsten kommt die normale Ausgabe. //Anschließend wird die 1 auf 0 gesetzt, damit das Fenster nach schließen nicht erneut angezeigt wird if ($row->Alarmfenster == 1) { // Session starten und Infos in Sessionvariable schreiben session_start (); $_SESSION["Status"] = $row->Status; $_SESSION["Datum"] = $row->Datum; $_SESSION["Uhrzeit"] = $row->Uhrzeit; $_SESSION["Standort"] = $row->Standort; $_SESSION["Meldung"] = $row->Meldung; //Öffne Popup und ändere danach in der Tabelle den Wert von Alarmfenster von 1 auf 0 echo ''; $eintrag = "UPDATE `mysql`.`Meldungen` SET `Alarmfenster` = '0' WHERE `Meldungen`.`Alarmfenster`='1'"; $eintragen = mysql_query($eintrag); } else {/*Nicht notwendig*/} echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; } //Wenn der Status des Ergebnisses nicht Alarm ist, jedoch Warnung, wird diese Zeile orange ausgegeben elseif($row->Status == Warnung) { echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; } //Wenn der Status des Ergebnisses nicht Alarm und nicht Warnung ist, jedoch Information, wird diese Zeile grün ausgegeben elseif($row->Status == Information) { echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; } //Wenn keines der vorherigen Ergebnisse zutrifft, gib es den folgenden Text aus else {echo'

Hier ist etwas schief gelaufen! Bitte kontaktieren Sie den Helpdesk';} }//Ende:While echo '
StatusDatumUhrzeitStandortMeldung
'; echo ''.utf8_encode($row->Status).''; echo ''; echo ''.utf8_encode($row->Datum).''; echo ''; echo ''.utf8_encode($row->Uhrzeit).''; echo ''; echo ''.utf8_encode($row->Standort).''; echo ''; echo ''.utf8_encode($row->Meldung).''; echo '
'; echo ''.utf8_encode($row->Status).''; echo ''; echo ''.utf8_encode($row->Datum).''; echo ''; echo ''.utf8_encode($row->Uhrzeit).''; echo ''; echo ''.utf8_encode($row->Standort).''; echo ''; echo ''.utf8_encode($row->Meldung).''; echo '
'; echo ''.utf8_encode($row->Status).''; echo ''; echo ''.utf8_encode($row->Datum).''; echo ''; echo ''.utf8_encode($row->Uhrzeit).''; echo ''; echo ''.utf8_encode($row->Standort).''; echo ''; echo ''.utf8_encode($row->Meldung).''; echo '
';//Ende:AusgabeTabelle } else{ echo '

Hier ist etwas schief gelaufen! Bitte kontaktieren Sie den Helpdesk
'; echo 'Meldungen hat keine Ergebnisse in der Datenbank gefunden.'; } echo "
";//Ende:meld ?>
meldungena.php displays the last 10 alerts and reloads every 30 seconds "; echo "";//styles.css einbinden echo "
";//Beginn:meld //connection_data.inc.php beinhaltet die Verbindungsdaten zum MySQL Server, include fügt diese in diese Seite ein include("includes/connection_data.inc.php"); //Hier wird der Countdown angezeigt echo "Noch "; echo " "; //Es werden die letzten 10 Einträge, welche den Status Alarm haben aus der Datenbank gelesen. //Sortiert wird nach IdMeldungen (alternativ: Datum AND Uhrzeit) durch DESC (alternativ: ASC) in der Auflistung neuster Eintrag oben, durch LIMIT 0,10 limitiert auf 10 Stück (dieser Wert kann angepasst werden) $abfrage = "SELECT * FROM Meldungen WHERE Status LIKE 'Alarm' ORDER BY IdMeldungen DESC LIMIT 0,10"; $ergebnis = mysql_query($abfrage); $ergebnisse = mysql_num_rows($ergebnis); if ($ergebnisse != 0){ //Tabelle für Ausgabe wird erzeugt echo ''; //Solange es Ergebnisse gibt, werden diese ausgegeben while ($row = mysql_fetch_object($ergebnis)){ //Hier wird alles in rot ausgegeben, da lediglich die Alarmmeldungen gesucht wurden. Die if-Abfrage ist nur zur Sicherheit, damit Fehler erkannt werden können if($row->Status == Alarm){ echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; } //Wenn Status nicht Alarm ist, gib es den folgenden Text aus else { echo '

Hier ist etwas schief gelaufen! Bitte kontaktieren Sie den Helpdesk'; } }//Ende:While echo '
StatusDatumUhrzeitStandortMeldung
'; echo ''.utf8_encode($row->Status).''; echo ''; echo ''.utf8_encode($row->Datum).''; echo ''; echo ''.utf8_encode($row->Uhrzeit).''; echo ''; echo ''.utf8_encode($row->Standort).''; echo ''; echo ''.utf8_encode($row->Meldung).''; echo '
';//Ende:AusgabeTabelle } else{ echo '

Hier ist etwas schief gelaufen! Bitte kontaktieren Sie den Helpdesk (2119)
'; echo 'Meldungen-Alarm hat keine Ergebnisse in der Datenbank gefunden.'; } echo "
";//Ende:meld ?>
suche.php is a search for alerts Meldungssuche
Meldungssuche


"; //Solange es Ergebnisse gibt, werden diese ausgegeben while ($row = mysql_fetch_object($ergebnis)){ //Wenn der Status des Ergebnisses Alarm ist, wird diese Zeile rot ausgegeben if ($row->Status == "Alarm") { echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; } //Wenn der Status des Ergebnisses nicht Alarm ist, jedoch Warnung, wird diese Zeile orange ausgegeben elseif ($row->Status == "Warnung") { echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; } //Wenn der Status des Ergebnisses nicht Alarm und nicht Warnung ist, jedoch Information, wird diese Zeile grün ausgegeben elseif ($row->Status == "Information"){ echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; } //Wenn keines der vorherigen Ergebnisse zutrifft, gib es den folgenden Text aus else { echo '

Hier ist etwas schief gelaufen! Bitte kontaktieren Sie den Helpdesk
'; } }//Ende:While echo "
Status:


Datum(YYYY-MM-DD):


Uhrzeit(HH:MM:SS):


Standort(B.0000 R.000):


Meldung:






StatusDatumUhrzeitStandortMeldung
'; echo ''.utf8_encode($row->Status).''; echo ''; echo ''.utf8_encode($row->Datum).''; echo ''; echo ''.utf8_encode($row->Uhrzeit).''; echo ''; echo ''.utf8_encode($row->Standort).''; echo ''; echo ''.utf8_encode($row->Meldung).''; echo '
'; echo ''.utf8_encode($row->Status).''; echo ''; echo ''.utf8_encode($row->Datum).''; echo ''; echo ''.utf8_encode($row->Uhrzeit).''; echo ''; echo ''.utf8_encode($row->Standort).''; echo ''; echo ''.utf8_encode($row->Meldung).''; echo '
'; echo ''.utf8_encode($row->Status).''; echo ''; echo ''.utf8_encode($row->Datum).''; echo ''; echo ''.utf8_encode($row->Uhrzeit).''; echo ''; echo ''.utf8_encode($row->Standort).''; echo ''; echo ''.utf8_encode($row->Meldung).''; echo '
";//Ende:AusgabeTabelle } else{ echo '

Die Suche lieferte keine Ergebnisse.
'; echo 'Falls dies ein Fehler ist, kontaktieren Sie bitte den Helpdesk.'; } ?>

alarm.php this file is the popup window WARNUNG
WARNUNG


Es wurde ein Alarm gemeldet!
'; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo '
StatusDatumUhrzeitStandortMeldung
'; echo ''.utf8_encode($status).''; echo ''; echo ''.utf8_encode($datum).''; echo ''; echo ''.utf8_encode($uhrzeit).''; echo ''; echo ''.utf8_encode($standort).''; echo ''; echo ''.utf8_encode($meldung).''; echo '
'; ?>
connection_data.inc.php contains all the connection info for the mysql db " , "") or die("Verbindung zur Datenbank konnte nicht hergestellt werden"); // Auswahl der Datenbank "mysql" - ggf. anpassen mysql_select_db("mysql") or die ("Datenbank konnte nicht ausgewählt werden"); ?> styles.css contains the styles to design the site /*############################### #############Usage############# #############Styles############ ############################### #############Datum############# ###########15-04-2014########## ############################### #############Autor############# ###########Lunetikk############ ###############################*/ /*Linkfarben werden hier vergeben*/ a:link {color:#93BC3A;} /* unvisited link */ a:visited {color:#93BC3A;} /* visited link */ a:hover {color:#5DA93D;} /* mouse over link */ a:active {color:#93BC3A;} /* selected link */ body { margin-left: auto; /*Verschub nach links wird hier vergeben*/ margin-right: auto; /*Verschub nach rechts wird hier vergeben*/ margin-top: 15px; /*Verschub nach oben wird hier vergeben*/ margin-bottom: 10px; /*Verschub nach unten wird hier vergeben*/ font-size: 15px; /*Schriftgröße wird hier vergeben*/ color: #fff; /*Schriftfarbe wird hier vergeben*/ background: #323232; /*Hintergrundfarbe wird hier vergeben*/ } table{ margin-left: auto; /*Verschub nach links wird hier vergeben*/ margin-right: auto; /*Verschub nach rechts wird hier vergeben*/ font-weight:bold; /*Schrift ist Dick (html -> bzw. )*/ /*font-family: Verdana,sans-serif;*/ /*Schriftart - ähnlich wie Tahoma*/ /*font-family: Arial, Helvetica, sans-serif;*/ /*Schriftart - etwas kleiner als Tahoma*/ font-family: Tahoma, Geneva, sans-serif; /*Schriftart aktuell gesetzt*/ } /*Überschrift*/ #uberg { text-align:center; /*Text ist in der Mitte*/ font-size: 30px; /*Schriftgröße wird hier vergeben*/ font-weight:bold; /*Schrift ist Dick (html -> bzw. )*/ } /*Alles in der Mitte*/ #centered { text-align:center; } The database CREATE TABLE IF NOT EXISTS `Meldungen` ( `IdMeldungen` int(11) NOT NULL AUTO_INCREMENT, `Status` varchar(32) NOT NULL, `Datum` date NOT NULL, `Uhrzeit` varchar(8) NOT NULL, `Standort` varchar(20) NOT NULL, `Meldung` varchar(64) NOT NULL, `Alarmfenster` tinyint(1) NOT NULL, PRIMARY KEY (`IdMeldungen`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; index.php/ the site itself\\ {{:linux:scripts:pasted:20190717-154101.png}} the search\\ {{:linux:scripts:pasted:20190717-173938.png}} the alarm popup\\ {{:linux:scripts:pasted:20190717-173943.png}} I had to move on and never saw the final solution of the project. :-\ If anybody want to use this because of whatever reason, you could send mails when alarm is executed.