Systeminformationen auf einer Webseite bereitstellen
Verfasst: Mo 29. Jul 2013, 16:08
Die folgende Anleitung soll Ihnen zeigen wie Sie mit Hilfe des xinetd Systeminformationen über einen Netzwerk-Service zur Verfügung stellen und diese auf einer Webseite mit PHP auslesen und anzeigen können. Es wird hierbei davon ausgegangen, dass Sie auf Ihrem Raspberry Pi als Betriebssystem Raspbian einsetzen.
Abhängigkeiten installieren
Sollten Sie den xinetd und den Basic Calculator bc noch nicht installiert haben, sollten Sie dies jetzt nachholen.
Shell-Skript zum Ermitteln der Informationen
Erstellen Sie anschließend ein Shell-Skript welches die gewünschten Informationen zusammensammelt und auf der Standardausgabe zurückgibt.
Das Skript könnte wie folgt aussehen. Das folgende Skript liefert die Uptime in Sekunden, die CPU und GPU Temperatur des Raspberry Pi's, die Firmware Version und die aktuelle CPU-Auslastung.
Nachdem Sie das Shell-Skript erstellt haben, müssen Sie die Zugriffsrechte anpassen.
Zum Überprüfen ob das Shell-Skript auch alle Daten ermittelt rufen Sie dieses einfach auf.
xinetd konfigurieren
Erstellen Sie jetzt eine neue Konfigurationsdatei für den xinetd.
Diese sollte wie folgt aussehen. Diese Konfigurationsdatei sorgt dafür, dass bei einer Anfrage an den TCP-Port 5180 das soeben erstellte Shell-Skript ausgeführt wird und die ermittelten Daten zurückgeschickt werden.
Jetzt müssen Sie in der /etc/services den TCP-Port 5180 noch mit dem Servicenamen systemdata verknüpfen.
Fügen Sie am Ende der Datei die folgende Zeile ein.
Da jetzt alle Änderungen an der Konfiguration durchgeführt wurden, starten Sie mit folgendem Befehl den xinetd neu.
Funktionstest
Ob soweit alles wie erwartet funktioniert können Sie mit Telnet auf einem zweiten Rechner überprüfen.
Alternativ können Sie dies auch lokal mit Netcat überprüfen.
Sollten Sie eine Firewall auf Ihrem Raspberry Pi einsetzen, müssen Sie hier den TCP-Port 5180 öffnen. Wollen Sie aus dem Internet auf den soeben erstellten Service zugreifen und befinden sich hinter einem Router, dann müssen Sie die Router-Firewall entsprechend konfigurieren und das Portforwarding für den TCP-Port 5180 einrichten.
Informationen in PHP verarbeiten
Wenn Sie die über den Service systemdata bereitgestellten Informationen in PHP einlesen und verarbeiten wollen, hilft Ihnen eventuell der folgende Beispiel-Code.
quelle: http://www.gtkdb.de/index_7_2105.html
Abhängigkeiten installieren
Sollten Sie den xinetd und den Basic Calculator bc noch nicht installiert haben, sollten Sie dies jetzt nachholen.
Code: Alles auswählen
apt-get update
apt-get install xinetd bc
Erstellen Sie anschließend ein Shell-Skript welches die gewünschten Informationen zusammensammelt und auf der Standardausgabe zurückgibt.
Code: Alles auswählen
nano /usr/bin/systemdata.sh
Code: Alles auswählen
#!/bin/bash
###########################################################################
## ##
## Collect System Data ##
## ##
## Creation: 17.02.2013 ##
## Last Update: 30.07.2013 ##
## ##
###########################################################################
round() {
[ ! -z "$2" ] && R=$2 || R=3
[ $1 == 0 ] && echo $1 || echo $(printf %.${R}f $1);
}
format_uptime() {
seconds=$1
UPTIME=""
secs=$(expr $seconds % 60)
mins=$(expr $seconds / 60 % 60)
hours=$(expr $seconds / 3600 % 20)
days=$(expr $seconds / 86400)
if [ "$days" -gt 0 ]; then
[ "$days" == 1 ] && UPTIME="$days day" || UPTIME="$days days"
fi
if [ "$hours" -gt 0 ]; then
[ "$days" -gt 0 ] && UPTIME+=", "
[ "$hours" == 1 ] && UPTIME+="$hours hour" || UPTIME+="$hours hours"
fi
if [ "$mins" -gt 0 ]; then
[[ "$hours" -gt 0 || "$days" -gt 0 ]] && UPTIME+=", "
[ "$mins" == 1 ] && UPTIME+="$mins minute" || UPTIME+="$mins minutes"
fi
if [ "$secs" -gt 0 ]; then
[[ "$mins" -gt 0 || "$hours" -gt 0 || "$days" -gt 0 ]] && UPTIME+=", "
[ "$secs" == 1 ] && UPTIME+="$secs second" || UPTIME+="$secs seconds"
fi
echo "$UPTIME"
}
# Read uptime in seconds
echo -n "Uptime: "
secs=$(cat /proc/uptime | awk -F '.' '{print $1}')
[ ! -z "$1" ] && echo $secs || echo $(format_uptime $secs)
# Read current CPU temperature
echo -n "CPU Temperature: "
echo "scale=1; $(cat /sys/class/thermal/thermal_zone0/temp | awk -F ' ' '{print $1}') / 1000" | bc -l
# Read current GPU temperature
echo -n "GPU Temperature: "
/opt/vc/bin/vcgencmd measure_temp | sed -e "s/temp=//" -e "s/'C//g"
# Read firmware version
echo -n "Firmware: "
/opt/vc/bin/vcgencmd version | grep version | awk '{print $2}'
# Read CPU usage
echo -n "CPU Usage: "
#top -b -n2 -d1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1"%"}' | tail -n1
read -a CPU < /proc/stat
unset CPU[0]
CPU=("${CPU[@]}")
IDLE=${CPU[3]}
TOTAL=0
for t in "${CPU[@]}"; do ((TOTAL+=t)); done
DIFF_TOTAL=$(echo "scale=10; $TOTAL - ${PREV_CPU_TOTAL:-0}" | bc)
DIFF_IDLE=$(echo "scale=10; $IDLE - ${PREV_CPU_IDLE:-0}" | bc)
USAGE=$(echo "scale=10; 1000 * $(($DIFF_TOTAL - $DIFF_IDLE)) / $DIFF_TOTAL + 5" | bc)
USAGE=$(echo "scale=10; $USAGE / 10" | bc)
for i in ${!CPU[*]}; do
[[ ${CPU[$i]} == 0 ]] && OUT_INT[$i]=0 && continue
OUT_INT[$i]=$(echo "scale=10; 1000 * (${CPU[$i]} - ${PREV_CPU_STAT[$i]:-0}) / $DIFF_TOTAL + 5" | bc)
OUT_INT[$i]=$(echo "scale=10; ${OUT_INT[$i]} / 10" | bc)
done
User=$(round $(echo ${OUT_INT[0]} | tr "." ","))
System=$(round $(echo ${OUT_INT[2]} | tr "." ","))
Nice=$(round $(echo ${OUT_INT[1]} | tr "." ","))
Idle=$(round $(echo ${OUT_INT[3]} | tr "." ","))
Usage=$(round $(echo $USAGE | tr "." ","))
echo "$Usage% (User: $User% System: $System% Nice: $Nice% Idle: $Idle%)"
export PREV_CPU_STAT=("${CPU[@]}")
export PREV_CPU_IDLE=$IDLE
export PREV_CPU_TOTAL=$TOTAL
exit 0
Code: Alles auswählen
chmod 0755 /usr/bin/systemdata.sh
Code: Alles auswählen
/usr/bin/systemdata.sh
Uptime: 3 hours, 21 minutes, 42 seconds
CPU Temperature: 46.5
GPU Temperature: 47.1
Firmware: 367974
CPU Usage: 6.550% (User: 3.715% System: 2.836% Nice: 0% Idle: 93.450%)
Erstellen Sie jetzt eine neue Konfigurationsdatei für den xinetd.
Code: Alles auswählen
nano /etc/xinetd.d/systemdata
Code: Alles auswählen
service systemdata
{
disable = no
socket_type = stream
port = 5180
protocol = tcp
wait = no
user = root
server = /bin/bash
server_args = /usr/bin/systemdata.sh
log_on_failure += USERID
}
Code: Alles auswählen
nano /etc/services
Code: Alles auswählen
systemdata 5180/tcp
Code: Alles auswählen
/etc/init.d/xinetd restart
Ob soweit alles wie erwartet funktioniert können Sie mit Telnet auf einem zweiten Rechner überprüfen.
Code: Alles auswählen
telnet raspberrypi.home.lan 5180
Trying 192.168.10.52...
Connected to raspberrypi.home.lan.
Escape character is '^]'.
Uptime: 15276
CPU Temperature: 46.5
GPU Temperature: 46.5
Firmware: 367974
CPU Usage: 3.7%
Connection closed by foreign host.
Code: Alles auswählen
nc localhost 5180
Uptime: 15279
CPU Temperature: 46.5
GPU Temperature: 46.5
Firmware: 367974
CPU Usage: 3.9%
Informationen in PHP verarbeiten
Wenn Sie die über den Service systemdata bereitgestellten Informationen in PHP einlesen und verarbeiten wollen, hilft Ihnen eventuell der folgende Beispiel-Code.
Code: Alles auswählen
<?php
$fp = fsockopen("raspberrypi.home.lan",5180);
while($string = fgets($fp))
{
echo $string;
}
?>
quelle: http://www.gtkdb.de/index_7_2105.html