Systeminformationen auf einer Webseite bereitstellen

feissmaik
Entwickler Team
Beiträge: 2576
Registriert: So 17. Apr 2011, 11:39
Been thanked: 1 time
Kontaktdaten:

Systeminformationen auf einer Webseite bereitstellen

Beitrag von feissmaik »

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.

Code: Alles auswählen

apt-get update
apt-get install xinetd bc
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.

Code: Alles auswählen

nano /usr/bin/systemdata.sh
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.

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
Nachdem Sie das Shell-Skript erstellt haben, müssen Sie die Zugriffsrechte anpassen.

Code: Alles auswählen

chmod 0755 /usr/bin/systemdata.sh
Zum Überprüfen ob das Shell-Skript auch alle Daten ermittelt rufen Sie dieses einfach auf.

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%)
xinetd konfigurieren

Erstellen Sie jetzt eine neue Konfigurationsdatei für den xinetd.

Code: Alles auswählen

nano /etc/xinetd.d/systemdata
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.

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
}
Jetzt müssen Sie in der /etc/services den TCP-Port 5180 noch mit dem Servicenamen systemdata verknüpfen.

Code: Alles auswählen

nano /etc/services
Fügen Sie am Ende der Datei die folgende Zeile ein.

Code: Alles auswählen

systemdata      5180/tcp
Da jetzt alle Änderungen an der Konfiguration durchgeführt wurden, starten Sie mit folgendem Befehl den xinetd neu.

Code: Alles auswählen

/etc/init.d/xinetd restart
Funktionstest

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.
Alternativ können Sie dies auch lokal mit Netcat überprüfen.

Code: Alles auswählen

nc localhost 5180
Uptime: 15279
CPU Temperature: 46.5
GPU Temperature: 46.5
Firmware: 367974
CPU Usage: 3.9%
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.

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
Du musst nicht kämpfen um zu siegen
feissmaik
Entwickler Team
Beiträge: 2576
Registriert: So 17. Apr 2011, 11:39
Been thanked: 1 time
Kontaktdaten:

Re: Systeminformationen auf einer Webseite bereitstellen

Beitrag von feissmaik »

Ein ähnliches Project, wss aber auf xinetd usw verzichten kann, aber dadurch auch nicht über einen eigenen Port abrufbar ist (ein extra Port worüber ausschlieslich diese Informationen anzeigt werden) - hatte ich bereits Anfang des Jahres in Form der cpu.php erstellt

Meine cpu.php ist in unserem Wiki zu finden: http://ipc.pebkac.at/wiki/index.php/Sof ... PI/cpu.php
Du musst nicht kämpfen um zu siegen
feissmaik
Entwickler Team
Beiträge: 2576
Registriert: So 17. Apr 2011, 11:39
Been thanked: 1 time
Kontaktdaten:

Re: Systeminformationen auf einer Webseite bereitstellen

Beitrag von feissmaik »

...habe beim systemdata.sh Script festgestellt das es ständig einen CPU Load von 100% angezeigt hat... hab das Script übearbeitet und nun passt es :)
Du musst nicht kämpfen um zu siegen
Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast