1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Talk Projekt: Uptimes und System Infos online erfassen

Dieses Thema im Forum "CS Root & Vserver" wurde erstellt von 0800555333, 4. August 2013.

  1. 0800555333
    Offline

    0800555333 Hacker

    Registriert:
    9. Juli 2013
    Beiträge:
    327
    Zustimmungen:
    367
    Punkte für Erfolge:
    0
    Ich bastel zur Zeit an einer Webseite um allgemeine System Informationen zu sammeln und über einen Internet Webserver anzuzeigen:

    Dieser Link ist nur für Mitglieder!!! Jetzt kostenlos Registrieren ?



    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..

    [HR][/HR]
    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)

    [HR][/HR]

    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


    [HR][/HR]
    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)

    [HR][/HR]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
    [HR][/HR]


    Falls ihr Fragen habt dann würde ich mich freuen euch diese zu beantworten :)
     
    Zuletzt bearbeitet: 4. August 2013
    #1
    UncleC, al-x83 und Osprey gefällt das.
  2. phantom

    Nervigen User Advertisement

  3. Osprey
    Online

    Osprey Moderator Digital Eliteboard Team

    Registriert:
    30. Dezember 2011
    Beiträge:
    8.803
    Zustimmungen:
    6.494
    Punkte für Erfolge:
    113
    Beruf:
    KFZ-Techniker
    Ort:
    Im wilden Süden
    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
     
    #2

Diese Seite empfehlen