Quantcast
Aktuelles
Digital Eliteboard - Das Digitale Technik Forum

Registriere dich noch heute kostenlos, um Mitglied zu werden! Sobald du angemeldet bist, kannst du auf unserer Seite aktiv teilnehmen, indem du deine eigenen Themen und Beiträge erstellst und dich über deinen eigenen Posteingang mit anderen Mitgliedern unterhalten kannst! Zudem bekommst du Zutritt zu Bereichen, welche für Gäste verwehrt bleiben

Registriere dich noch heute kostenlos, um Mitglied zu werden! Sobald du angemeldet bist, kannst du auf unserer Seite aktiv teilnehmen, indem du deine eigenen Themen und Beiträge erstellst und dich über deinen eigenen Posteingang mit anderen Mitgliedern unterhalten kannst! Zudem bekommst du Zutritt zu Bereichen, welche für Gäste verwehrt bleiben

Projekt: Uptimes und System Infos online erfassen

0800555333

Hacker
Registriert
9. Juli 2013
Beiträge
329
Reaktionspunkte
364
Punkte
123
Ich bastel zur Zeit an einer Webseite um allgemeine System Informationen zu sammeln und über einen Internet Webserver anzuzeigen:

Fand es interessant eine einfache und zentrale Übersicht, mit Daten wie die aktuelle Uptime, was für ein Rechner genutzt wird oder was für eine Auslastung das System hat, über all meine kleinen Rechner (Futro S400, Igel 564LX, RaspberryPi und ein miniITX) zu haben

Dazu nutze ich ein bash Script welches ein mal täglich die Daten sammelt und an einen Webserver schickt (input.php) und auf dem Webserver wiederum kann man eine output.php aufrufen die diese Daten dann anzeigt..


Wichtig für mich ist das Projekt möglichst transparent zu gestalten - alle Dateien sind für jeden einsehbar, sowohl die SQLite Datenbank als auch die beiden php Dateien.

Dafür hab ich für die PHP Dateien Verknüpfungen (symlinks) angelegt, da sonst der apache2 Webserver die *.php Dateien verarbeiten würde. Das funktioniert für die input.php auch sehr gut, nur für die output.php nicht so super da dort auch html Code enthalten ist wo sich leider nicht verhindern lässt dass apache2 diesen verarbeitet..

Aber um sicherzustellen das ich keine IPs oder derartiges speicher sollte es für euch eigentlich reichen in sowohl input.php (die Datei, die die Informationen vom sysinfos.sh entgegen nimmt) und der SQLite Datenbank (db.sqlite.sysinfos) rein gucken zu können - falls euch das doch nicht reicht könnt ihr mir auch gerne eine PN schicken und ich geb euch kurzfristig Zugriff auf den Server

Aber letzlich sind das nur irgendwelche Rechner, ob damit CS gemacht wird oder nicht ist (und soll) nicht von Bedeutung (sein)
(von meinen 4 Systemen ist nur eines dabei)

Selbst ihr könnt euer eigenes System nur dann erkennen wenn ihr zB eure UUID kennt (oder zumindest die ersten 4 Stellen :emoticon-0122-itwas)



Folgende Daten werden zZt gesammelt:
- system uptime
- cpu model name
- cpu frequence
- cpu cores
- cpu load
- cpu load avg
- kernel
- distribution
- uuid of first harddisc

Die UUID benötige ich um ein System eindeutig zu identifizieren, damit ein Datenbank Eintrag auch aktualisiert werden kann


Das Projekt befindet sich derzeit noch in der Entwicklung, funktioniert bereits aber schon sehr gut..

Würde an dieser Stelle gern Feedback sammeln um ggf noch was zu verbessern und vielleicht steht ja eurerseits auch soviel Interesse daran das man das Projekt hier im Forum oben Anpinnt und als Referenz für Fragen wie zB:

Wie stabil ist ein ThinClient o.ä.?

Dabei spielt aber eben nicht nur die Uptime eine rolle sondern auch wie sehr er genutzt wird (load), um was für ein Modell es sich handelt (cpu) und welcher Kernel genutzt wird.
Eigentlich sogar auch sowas wie Temperatur usw aber leider haben nicht alle Systeme Sensoren die man abfragen könnte



Ihr benötigt nur ein bash Script (sysinfos.sh), was ihr irgendwo speichern könnt (zB im /root/ Verzeichnis)
Ich empfehle aber einen extra Benutzer anzulegen der das Script dann ausführt (es sollten generell keine Prozesse oder Scripte als root laufen!)

Zum anlegen eines Benutzers gebt ihr als root folgenden Befehl ein: useradd -m -s/bin/bash sysinfo

-m bewirkt dass das Homedir für den Benutzer angelegt wird
-s/bin/bash legt die standard shell fest, also bash
sysinfo ist der Benutzer der angelegt wird und folglich wäre sein Homedir: /home/sysinfo

Dann wechselt ihr zu diesem Benutzer mit dem Befehl: su - sysinfo
Dann öffnet ihr am besten einen Linux Editor wie zB nano oder joe oder vi und copy&pastet das folgende Script dort direkt rein:
nano sysinfos.sh

Code:
#!/bin/bash
#
# Track System Informations to a Website. version: 0.02
#
# Collected Informations:
# - system uptime
# - cpu model name
# - cpu frequence
# - cpu cores
# - cpu loadavg
# - kernel
# - distribution
# - uuid of first harddisc
#


# -------------------------------------------------------------- #
# >>> >> >  DO NOT MESS WiTH ANYTHiNG BELOW THiS LiNE!  < << <<< #
# -------------------------------------------------------------- #


# required system cmd's:
# basename blkid cat cut date echo grep head ping sed stat uptime wget wc

#get writeable temp dir
if [ -w "/tmp" ]; then
    TMP="/tmp/"
elif [ -w "/usr/tmp" ]; then
    TMP="/usr/tmp/"
elif [ -w "/usr/local/tmp" ]; then
    TMP="/usr/local/tmp/"
elif [ -w "/root" ]; then
    TMP="/root/"
else
    TMP=""
fi


#- variables
ScriptFileName=$(basename $0)
PiDFILE="${TMP}.pid.$ScriptFileName"
blkid=/sbin/blkid
OnlinePing="5.231.51.22"
OnRetry="120"
Send2URL="http://$OnlinePing/sysinfos/"
ScriptUpdater=1


#- functions


_error() {
    if [ "$1" -gt 0 ]; then
        [ -z "$2" ] && message="" || message="$2"
        echo "There was an Error.. $message"
        echo "Aborting"
        rm -f $PiDFILE
        exit 1
    fi
}

# URL encoding
proc_url_encode() {
    out=${1//%/%25}; out=${out//\{/%7B}; out=${out//\}/%7D}; out=${out//|/%7C};
    out=${out//\\/%5C}; out=${out//^/%5E}; out=${out//~/%7E}; out=${out//[/%5B};
    out=${out//]/%5D}; out=${out//\`/%60}; out=${out//#/%23}; out=${out//>/%3E};
    out=${out//\$/%24}; out=${out//&/%26}; out=${out//+/%2B}; out=${out//,/%2C};
    out=${out//\//%2F}; out=${out//:/%3A}; out=${out//;/%3B}; out=${out//=/%3B};
    out=${out//\?/%3F}; out=${out// /%20}; out=${out//</%3C};
    out=${out//\!/%21}; out=${out//\"/%22}; out=${out//\@/%40}; out=${out//\'/%27};
    out=${out//\(/%28}; out=${out//\)/%29}; out=${out//\*/%2A}; out=${out//\-/%2D};
    out=${out//\_/%5F}; out=${out//\./%2E}; out=${out//\€/%80};
    echo $out
}

#convert spaces to underlines 
convert_spaces() { echo "$@" | sed 's/ /_/g'; }

#encode other chars
convert_chars() {
    out=""
    for input in "$@" ; do
        [ -z "$out" ] && out="$(proc_url_encode "$input")" || out="$out $(proc_url_encode "$input")"
    done
    echo "$out"
}

#get system uptime
get_uptime() {
    UPTIME=$(uptime | sed 's/^ *//g');
    # Read uptime in seconds
    UPTIMESECS=$(cat /proc/uptime | awk -F '.' '{print $1}')
}

#get cpu informations
get_cpuinfos() {
    CPU=$(grep "^model name" /proc/cpuinfo | cut -d: -f2 | sed 's/^ *//g' | head -1)
    [ -z "$CPU" ] && CPU=$(grep "^Processor" /proc/cpuinfo | cut -d: -f2 | sed 's/^ *//g')
    [ -z "$CPU" ] && CPU=$(grep "^cpu model" /proc/cpuinfo | cut -d: -f2 | sed 's/^ *//g')
    FREQ=$(grep "^BogoMIPS" /proc/cpuinfo | cut -d: -f2 | head -1 | sed 's/^ *//g')
    [ -z "$FREQ" ] && FREQ=$(grep -i "^cpu MHz" /proc/cpuinfo | cut -d: -f2 | head -1 | sed 's/^ *//g')
    [ -z "$FREQ" ] && FREQ=$(grep -i "^clock" /proc/cpuinfo | cut -d: -f2 | head -1 | sed 's/^ *//g')
    CORES=$(grep "^processor" /proc/cpuinfo | wc -l)
    [ -z "$CORES" ] && CORES=1
    [ "$CORES" = 0 ] && CORES=1
    # CPU Load
    read -a CPULOAD < /proc/stat
    unset CPULOAD[0]
    CPULOAD=("${CPULOAD[@]}")
    # CPU AVG Load
    CPULOADAVG=$(cat /proc/loadavg | awk {'print $1,$2,$3'})
}

#get unique user id of first harddisc device
get_uuid() {
    [ ! -x "$blkid" ] && blkid=$(whereis blkid | awk {'print $2'})
    UUID=$($blkid -o value -s UUID | head -1)
    if [ -z "$UUID" ]; then
        UUID=$(ls /dev/disk/by-uuid/)
        UUID=$(echo $UUID | cut -d' ' -f1)
    fi
}

#get kernel informations
get_kernel() { KERNEL=$(uname -a | cut -d" " -f3-); }

#get distribution informations
get_distri() {
    LSB=$(which lsb_release)
    [ -n "$LSB" ] && DISTRI=$($LSB -d | cut -d ":" -f2- | sed 's/^ *//g' | awk {'print $1,$3'})
    [ -z "$DISTRI" ] && [ -f "/etc/debian_version" ] && DISTRI="Debian $(cat /etc/debian_version)"
}

#check if theres a new script available and if replace it
check_4updated_script() {
    if [ "$ScriptUpdater" ]; then
        STAT=$(which stat)
        if [ -x "$STAT" ]; then
            wget -q -O ${TMP}$ScriptFileName "${Send2URL}sysinfos.sh"
            NewSize=$($STAT -c%s ${TMP}$ScriptFileName)
            OldSize=$($STAT -c%s $0)
            #if NewSize and OldSite not equal..
            if [ $NewSize -ne $OldSize ]; then
                echo -e "\nNEW Script available! Replacing Script..\n\n"
                mv -f ${TMP}$ScriptFileName $0
                chmod 755 $0
                rm -f $PiDFILE
                sleep 1
                $0
                exit 0
            fi
        fi
    fi
}


#- main code


# make sure script is only running once
if [ -f "$PiDFILE" ]; then
    PiDs=$(cat $PiDFILE)
    if [ -z "$PiDs" ]; then
        rm -f $PiDFILE
    else
        echo "Script seems already to run with PID(s): $PiDs"
        echo "Aborting"
        exit 0
    fi
fi
# put script pid into PiDFILE so its not running multi
PiDs="$$ $!"
echo $PiDs > $PiDFILE

# check if online...
ONLINE=0
[ "$(ping -c1 "$OnlinePing" | grep -c "seq")" -eq 1 ] && ONLINE=1
# if online, get and send data...
if [ "$ONLINE" ]; then
    check_4updated_script
    _error $?
    echo "Getting Required Informations .."
    get_uuid
    _error $?
    get_uptime
    _error $?
    get_cpuinfos
    _error $?
    get_kernel
    _error $?
    get_distri
    _error $?
    
    echo " UUID: $UUID"
    echo -e " UPTIME: $UPTIME\n UPTIMESECS: $UPTIMESECS"
    echo -e " CPU: $CPU\n FREQ: $FREQ\n CORES: $CORES\n LOAD: ${CPULOAD[@]}\n LOAD AVG: ${CPULOADAVG[@]}"
    echo " KERNEL: $KERNEL"
    echo " DISTRI: $DISTRI"

    KERNEL=$(convert_chars $KERNEL)

    DATA="UUID=${UUID}&UPTIME=${UPTIME}|${UPTIMESECS}&CPU=${CPU}|${FREQ}|${CORES}|${CPULOAD[@]}|${CPULOADAVG}&DISTRI=${DISTRI}&KERNEL=${KERNEL}"
    echo -e "\nDATASTRING: $DATA\n"

    echo "Sending Informations to ${Send2URL}input.php .."
    wget -q -O- "${Send2URL}input.php?${DATA}"

    rm -f $PiDFILE
else
    rm -f $PiDFILE
    echo "$OnlinePing seems to be offline! Retrying in $OnRetry seconds.."
    sleep $OnRetry
    $0
fi

exit 0
# EOF
Dann das Script ausführbar machen: chmod 755 sysinfos.sh

Und dann wie folgt in die Benutzer-crontab eintragen.
Dazu am besten vorher einmalig den Befehl export EDITOR=nano ausführen.
Ihr könnt auch einen anderen Editor angeben.
Der Befehl bewirkt dass der Standard Editor zum bearbeiten der crontab gesetzt wird, normalerweise wäre das nämlich " vi " aber der Umgang damit ist wie ich finde komplizierter als mit nano :)
Also, die crontab des Benutzers bearbeiten: crontab -e
Dort folgendes einfügen:
Code:
0 19 * * *     $HOME/sysinfos.sh >/dev/null 2>&1
Damit wird das Script jeden Tag um 19 Uhr ausgeführt
$HOME beinhaltet das Homedir, das ist eine standardtisierte, Systemweite Variable die ihr nicht extra setzen müsst

(zum entwickeln übermitteln meine 2 Systeme jede Stunde ihre Daten)


Changelog:
sysinfos.sh
v0.02:
- Bei jedem ausführen wird das Script vom Webserver geladen, die Grösse verglichen und das alte ggf ersetzt (kann über "ScriptUpdater" abgeschaltet werden)
- Errorhandling verbessert



Falls ihr Fragen habt dann würde ich mich freuen euch diese zu beantworten :)
 
Zuletzt bearbeitet:
AW: Projekt: Uptimes und System Infos online erfassen

Hi,
geniale Idee von dir. Vielen Dank. Bin in der Liste dabei seit jetzt :D
Gruß
Osprey
 
Zurück
Oben