Leben, Essen, Schlafen

Schnipsel, Anregungen, Haltbares

Projekte, Aufgaben, Einfaches

Serverstatus in WordPress ausgeben

Serverstatus in WordPress ausgeben

Um ein paar Informationen über meine lokalen Server auszuspucken habe ich folgendes Idee: Ein bash-Skript fragt die Informationen lokal ab und macht einen Upload zum Blog. Abzufragen sind erstmal grundsätzlich

ping
uname -a
cat /sys/class/thermal/thermal_zone0/temp
cat /proc/uptime

um Onlinestatus, Hostnamen, Kernel, Release, Architektur der CPU, CPU Temperatur und Laufzeit zu erfahren.

Als erstes ist es ganz hilfreich überhaupt zu prüfen, ob der abzufragende Server vorhanden ist.

ping -q -c1 $ip > /dev/null
if [ $? -eq 0 ]
then
    status1="✓"
else
    status1="✘"
fi

Anschließend kann auch ein möglicher Fernzugriff erfolgen, um mit ‘uname‘ grundlegende Informationen abzugreifen.

host1=$(uname -a)
kernelname1="$(cut -d' ' -f1 <<<$host1)"
release1="$(cut -d' ' -f3 <<<$host1)"
machine1="$(cut -d' ' -f11 <<<$host1)"
host1="$(cut -d' ' -f2 <<<$host1)"

Die Ausgabe des Temperaturwertes ist in Tausendstel °C, also ist eine kurze Rechnung zur Anpassung nötig.

temp1=$(cat /sys/class/thermal/thermal_zone0/temp)
temp1="$(($temp1/1000))°C"

Die Ausgabe der Laufzeit gibt zunächst zwei Werte aus, einmal die eigentliche Laufzeit in Sekunden und der Anteil daran im Idle. Also ist nur der erste Wert zur Berechnung notwendig. Jetzt muss nur noch das Sekundenwirrwarr in eine sinnvolle Darstellung umgerechnet werden (Tage, Stunden, Minuten, Sekunden). Die Sekunden berechnen sich aus der Gesamtzahl der Sekunden mit dem Modulo 60. Für die Minuten wird die Gesamtzahl der Sekunden mit ‘/60‘ in Minuten umgerechnet (Ganzzahl!!, der “Überschuss” fällt weg und ist ja auch schon zuvor in den Sekunden berechnet worden) und anschließend mit ‘%60‘ der Rest ausgegeben, der keine ganze Stunde mehr ergibt. Ähnliches erfolgt bei der Stunden- und Tagesberechnung. In der Ausgabe gibt es noch eine kleinere Spielerei, um Tage auszublenden, wenn keine vorhanden sind.

uptime1=$(cat /proc/uptime)
uptime1=${uptime1%%.*};
secs=$((${uptime1}%60))
mins=$((${uptime1}/60%60))
hours=$((${uptime1}/3600%24))
days=$((${uptime1}/86400))
if [ "${days}" -eq "0" ]
then
    uptime="${hours}h${mins}m${secs}s"
else
    uptime="${days}d${hours}h${mins}m${secs}s"
fi

Die bereitgestellten Informationen speichere ich im aktuellen Verzeichnis (Dateiname besteht aus dem Hostanteil der IP Adresse, eventuell vorehandene Leerzeichen werden noch entfernt) und lade diese hoch.

workdir=$(pwd);
workname=$(hostname -I)
worknameshort=$(cut -d'.' -f4 <<<$workname)
worknameshort=`echo "$worknameshort" | sed "s/ //g"`
echo $host > $workdir/$worknameshort.js
echo $status >> $workdir/$worknameshort.js
echo $kernelname >> $workdir/$worknameshort.js
echo $release >> $workdir/$worknameshort.js
echo $machine >> $workdir/$worknameshort.js
echo $temp >> $workdir/$worknameshort.js
echo $uptime >> $workdir/$worknameshort.js
# upload $data.js to webspace
curl -T $worknameshort.js -u user:pass ftp://serveradress.net/
# clean up the mess
rm $workdir/$worknameshort.js

Jetzt tummeln sich etliche Geräte im Netzwerk, das Skript kann alle nach einander abarbeiten. Dazu ist ein kleines Array mit IP Adressen notwendig.

ip[1]=192.168.178.5  #raspberry
ip[2]=192.168.178.17 #berrycam
ip[3]=192.168.178.28 #plexberry
ip[4]=192.168.178.39 #kitchentable
ip[5]=192.168.178.74 #openhab
ip[6]=192.186.178.80 #pihole
ip[7]=192.168.178.99 #automotiverocketlauncher

Daraus kann dann mittels ‘ ${ip[@]} ‘ innerhalb einer Schleife die jeweilige IP genutzt werden. Natürlich muss zunächst mal der ECDSA Key akzeptiert werden (Alternativ kann auch nach ‘sshpass -p ${passwd} ssh‘ mit ‘-o StrictHostKeyChecking=no‘ dieses umgangen werden). Um eine Anmeldung am Remote ohne Passworteingabe zu bewerkstelligen installiert man das Paket sshpass. Die bash ruft ein Subskript ‘remote.sh‘ auf in der alles aufbereitet wird. Falls kein Zugriff erfolgen kann (ping erfolglos) schreibt das Skript trotzdem einen Eintrag. Daten dazu auf Git.

for adress in ${ip[@]} ; do
    ping -q -c1 ${adress} > /dev/null
    if [ $? -eq 0 ]
    then
        sshpass -p ${passwd} ssh -o StrictHostKeyChecking=no ${user}@${adress} 'bash -s' < /home/pi/statuspi/remote.sh
    status="✘";
    workdir=$(pwd);
    workname=${adress};
    worknameshort=$(cut -d'.' -f4<<<$workname)
    worknameshort=`echo "$worknameshort" | sed "s/ //g"`
    echo $adress > $workdir/$worknameshort.js
    echo $status >> $workdir/$worknameshort.js
    # upload $data.js to webspace
    curl -T $worknameshort.js -u user:pass ftp://serveradress.net/
    # clean up the mess
    rm $workdir/$worknameshort.js
    fi
done

Das Skript selbst muss alle x Minuten ausgeführt werden, um einen ständigen Upload zu garantieren. Für mich reicht da ein Abstand von 60 Minuten. Also muss folgendes mit crontab /e als cronjob eingetragen werden.

1 * * * * /home/pi/statuspi/statuspi.sh

Um das ganze in WordPress anzuzeigen ist folgender Code nötig. Ich habe die Dateinamen einfach in einem Array übernommen, das geht natürlich anders. Mit dem Plugin WP H-PHP Widget lässt sich das ganze problemlos einfügen.

<?php
$name = array("5.js","17.js","28.js","39.js","74.js","80.js","9.js");
$dir = "http://serveradress.net/";
$text = array("Name","Status","System","Release","Architektur","Temperatur","Laufzeit");

for($k=0;$k < count($name); $k++){
    $data = file($dir . $name[$k]);
    echo substr($data[0], 0, -1);
    echo " ist ";
    echo $data[1];
    echo "<br />";
    for($i=2;$i < count($data); $i++){
        echo $text[$i];
        echo ": ";
        echo $data[$i];
        echo "<br />";
    }
    echo "<hr>";
}
?>

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.