[netcup] vServer Monitor - Cronjob Scripte
Alle Daten des Monitors werden alle paar Minuten via Cronjob erfasst. Die Scripte dieser Cronjobs müssen wie folgt angelegt und Konfiguriert werden.
Übersicht
|-- inc | |-- config.inc.sh | |-- hdinfo.inc.pl | `-- netinfo.inc.pl |-- log_loadavg.sh |-- log_memory.sh |-- log_traffic.sh `-- sysinfo.sh |
Hier eine Übersicht der Verzeichnisstruktur für die Scripte. Am besten legt man einen Ordner an, und bildet dort genau die Struktur ab. Im Ordner inc/ befindet sich die Konfigurationsdatei, sowie diverse andere Includes. Beispielsweise Perlscripte, die weitere Daten auslesen. An einigen stellen ist es einfacher, mit Perl zu arbeiten, da man damit besser und genauer an Daten wie Netzwerkgeräte und Auslastung der Festplatten herran kommt. |
config.inc.sh
| 1 2 3 4 5 6 7 8 9 10 11 12 | #!/bin/bash # MySQL Zugangsdaten MYSQL_HOST="localhost" MYSQL_DB="database" MYSQL_USER="sysmon_insert" MYSQL_PASS="***" # Zugangsdaten zum vServer Control Panel (openVCP) LOGINNAME="user" PASSWORD="pass" VSERVER="vxxxxxxxxxx" |
In der Konfigurationsdatei müssen neben den Logindaten für den MySQL Server auch die Daten für das vServer Control Panel (openVCP) angegeben werden.
In der Variable VSERVER muss dabei die Kennung des vServer. Diese besteht aus einem v und einer Nummer.
Pakete für Perl & finger installieren
Damit die Perl Scripte alle funktionieren, müssen noch einige Perl Libaries installiert werden.
Falls nötig, findet man weitere Pakete auf packages.debian.org.
Zudem brauchen wir noch die Anwendung finger. Mit Hilfe von finger wird die Anzahl der angemeldeten User ermittelt.
| 1 | apt-get install libfilesys-df-perl libio-interface-perl finger |
hdinfo.inc.pl
Dieses Perl Script erfasst alle Festplatten Paritionen und gibt die wichtigsten Infomationen aus. Das Script wird aus dem Hauptscript sysinfo.sh aufgerufen.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #!/usr/bin/perl use Filesys::Df; sub getInfo { my $ref = df($_[1]); if(defined($ref)) { print " <harddisk>\n"; print " <device>".$_[0]."</device>\n"; print " <mountpoint>".$_[1]."</mountpoint>\n"; print " <total>".($ref->{blocks}/1024)."</total>\n"; print " <free>".($ref->{bfree}/1024)."</free>\n"; print " <used>".($ref->{used}/1024)."</used>\n"; if(exists($ref->{files})) { print " <inodes>\n"; print " <total>".$ref->{files}."</total>\n"; print " <free>".$ref->{ffree}."</free>\n"; print " <used>".($ref->{files}-$ref->{ffree})."</used>\n"; print " </inodes>\n"; } print " </harddisk>\n"; } } open(IN,'</etc/mtab') || die "Can not open mtab!"; while(<IN>){ next if ($_=~ /^#/); @hdinfo = split(/ /, $_); if(!($hdinfo[0] eq "none")) { getInfo($hdinfo[0], $hdinfo[1]); } } close IN; exit; |
netinfo.inc.pl
Dieses Perlscript liest alle möglichen Informationen zu den verfügbaren Netzwerkgeräten aus. Das Script wird von dem Hauptscript sysinfo.sh aufgerufen.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #!/usr/bin/perl use IO::Interface::Simple; print " <interfaces>\n"; # Network Interfaces my @interfaces = IO::Interface::Simple->interfaces; for my $if (@interfaces) { print " <interface>\n"; print " <device>".$if."</device>\n"; print " <address>".$if->address."</address>\n"; print " <netmask>".$if->netmask."</netmask>\n"; print " <broadcast>".$if->broadcast."</broadcast>\n"; print " <mac>".$if->hwaddr."</mac>\n"; print " <destination>".$if->dstaddr."</destination>\n"; print " <mtu>".$if->mtu."</mtu>\n"; print " <metric>".$if->metric."</metric>\n"; print " <index>".$if->index."</index>\n"; print " <is_running>"; if($if->is_running) {print "true"; } else { print "false"; } print "</is_running>\n"; print " <is_broadcast>"; if($if->is_broadcast) {print "true"; } else { print "false"; } print "</is_broadcast>\n"; print " <is_peertopeer>"; if($if->is_pt2pt) {print "true"; } else { print "false"; } print "</is_peertopeer>\n"; print " <is_loopback>"; if($if->is_loopback) {print "true"; } else { print "false"; } print "</is_loopback>\n"; print " <is_promiscuous>"; if($if->is_promiscuous) {print "true"; } else { print "false"; } print "</is_promiscuous>\n"; print " <is_multicast>"; if($if->is_multicast) {print "true"; } else { print "false"; } print "</is_multicast>\n"; print " <is_notrailers>"; if($if->is_notrailers) {print "true"; } else { print "false"; } print "</is_notrailers>\n"; print " <is_noarp>"; if($if->is_noarp) {print "true"; } else { print "false"; } print "</is_noarp>\n"; print " </interface>\n"; } print " </interfaces>\n"; |
log_loadavg.sh
Das Script liest für alle CPU Kerne die Auslastung aus. Was user, nice, system und idle nun genau für Werte darstellen, kann man bei Wikipedia nachlesen.
Die ermittelten Daten werden dann in die MySQL Tabelle log_loadavg geschrieben. Dadurch kann man später aus den erfassten Daten zum Beispiel Diagramme erstellen.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #!/bin/bash . /pfad/zu/config.inc.sh # HIER PFAD ANPASSEN! I=0; DATE=$(date '+%Y-%m-%d %H:%M:%S') for LINE in $(grep -e cpu /proc/stat | grep -v "cpu " | sed -e 's/ /-/g'); do USER=$(echo $LINE | cut -d'-' -f2) NICE=$(echo $LINE | cut -d'-' -f3) SYSTEM=$(echo $LINE | cut -d'-' -f4) IDLE=$(echo $LINE | cut -d'-' -f5) echo "insert into log_loadavg set date='$DATE', cpu='$I', user='$USER', nice='$NICE', system='$SYSTEM', idle='$IDLE'" | mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASS $MYSQL_DB I=$(($I+1)) done; |
log_memory.sh
Das Script erfasst die Auslastung von RAM und Swap und speichert diese in der MySQL Tabelle log_memory. Auch die Maximalwerte werden in der Datenbank gespeichert. So kann man Änderungen im Speichervolumen nachverfolgen.
| 1 2 3 4 5 6 7 8 9 10 11 | #!/bin/bash . /pfad/zu/config.inc.sh # HIER PFAD ANPASSEN! ram=$((($(awk '/^MemTotal:/ { print $2 }' </proc/meminfo)-$(awk '/^MemFree:/ { print $2 }' </proc/meminfo)))) swap=$((($(awk '/^SwapTotal:/ { print $2 }' </proc/meminfo)-$(awk '/^SwapFree:/ { print $2 }' </proc/meminfo)))) max_ram=$((($(awk '/^MemTotal:/ { print $2 }' </proc/meminfo)))) max_swap=$((($(awk '/^SwapTotal:/ { print $2 }' </proc/meminfo)))) echo "insert into log_memory set date=NOW(), memory='$ram', swap='$swap', max_memory='$max_ram', max_swap='$max_swap'" | mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASS $MYSQL_DB |
log_traffic.sh
Beim erfassen des Traffics loggt sich das Script im vServer Control Panel (openVCP) ein, und parst dort eine HTML Datei. Der Traffic wird in der MySQL Tabelle log_traffic jeweils immer pro Tag gespeichert.
Wird das Script mehrmals am Tag aufgerufen, wird der vorhandene Datensatz aktualisiert.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #!/bin/bash # Originalscript gefunden im Netcup Kundenforum (http://forum.netcup.de/showpost.php?p=1111&postcount=9) # von David Froehlich <dfroe@gmx.de> # Angepasst fuer "sims vServer Monitor" von Christian Blechert . /pfad/zu/config.inc.sh # HIER PFAD ANPASSEN! TMPFILE=/tmp/vservertraffic DAY_OF_MONTH=$(date '+%e' | cut -d' ' -f2) # delete cookie test -f $TMPFILE.cookie && rm -f $TMPFILE.cookie # login wget -q -O /dev/null --no-check-certificate --save-cookies $TMPFILE.cookie --keep-session-cookies --post-data "loginname=$LOGINNAME&password=$PASSWORD&login=login" "https://www.vservercontrolpanel.de/index.php/auth/submit" # dump traffic wget -q -O $TMPFILE.html --no-check-certificate --load-cookies $TMPFILE.cookie "https://www.vservercontrolpanel.de/index.php/user/stats/$VSERVER/traffic/month" # logout wget -q -O /dev/null --no-check-certificate --load-cookies $TMPFILE.cookie "https://www.vservercontrolpanel.de/index.php/user/logout" # grep traffic TRAFFIC=$(grep ">$DAY_OF_MONTH</td><td align=\"left\" width=\"\*\" colspan=\"1\" id=\"" $TMPFILE.html) echo "$TRAFFIC" > $TMPFILE.csv # extract amounts set -- $TRAFFIC TRAFFIC_INCOMING_MB=$(echo ${16} | cut -d'>' -f2 | sed 's/,//g') TRAFFIC_OUTGOING_MB=$(echo ${21} | cut -d'>' -f2 | sed 's/,//g') TRAFFIC_TOTAL_MB=$(echo ${26} | cut -d'>' -f2 | sed 's/,//g') # delete all temporary files rm -f $TMPFILE.* echo "INSERT INTO log_traffic (date, incoming, outgoing, last_edit) VALUES (NOW(), '$TRAFFIC_INCOMING_MB', '$TRAFFIC_OUTGOING_MB', '0000-00-00 00:00:00') ON DUPLICATE KEY UPDATE incoming='$TRAFFIC_INCOMING_MB', outgoing='$TRAFFIC_OUTGOING_MB', last_edit=NOW()" | mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASS $MYSQL_DB |
Das Script wurde für das Default Template in englischer Sprache konzipiert. Wird ein anderes Template verwendet, kann es passieren, dass die Daten nicht korrekt erfasst werden.
Also vor dem Produktivbetrieb testen!!!
sysinfo.sh
Dieses Script erfasst die allgemeinen Informationen und speichert diese als XML Datei. Hier werden auch die Perl Scripte aufgerufen.
Das Script wird unter /tmp/sysinfo.xml für alle Systemuser lesbar gespeichert. Diese Option kann aber nach belieben angepasst werden.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | #!/bin/bash _hms() { local S=${1} ((h=S/3600)) ((d=S/3600/24)) ((h=h-$((d*24)))) ((m=S%3600/60)) ((s=S%60)) printf "%dd:%dh:%dm:%ds\n" $d $h $m $s } CFG_XML_TMP="/tmp/sysinfo_xmltemp.xml" CFG_XML_TARGET="/tmp/sysinfo.xml" KERNEL=$(uname -r) VERSION=$(cat /proc/version) DATE=$(date '+%Y-%m-%d') TIME=$(date '+%H:%M:%S') UPTIME=$(_hms $(cat /proc/uptime | cut -d' ' -f1 | cut -d'.' -f1)) IDLETIME=$(_hms $(cat /proc/uptime | cut -d' ' -f2 | cut -d'.' -f1)) LOADAVG=$(cat /proc/loadavg) USER=$(($(finger | wc -l)-1)) RAM_USED=$((($(awk '/^MemTotal:/ { print $2 }' </proc/meminfo)-$(awk '/^MemFree:/ { print $2 }' </proc/meminfo)))) RAM_MAX=$((($(awk '/^MemTotal:/ { print $2 }' </proc/meminfo)))) SWAP_USED=$((($(awk '/^SwapTotal:/ { print $2 }' </proc/meminfo)-$(awk '/^SwapFree:/ { print $2 }' </proc/meminfo)))) SWAP_MAX=$((($(awk '/^SwapTotal:/ { print $2 }' </proc/meminfo)))) if [ -f $CFG_XML_TMP ]; then rm $CFG_XML_TMP fi echo '<?xml version="1.0" encoding="UTF-8"?>' >> $CFG_XML_TMP echo '' >> $CFG_XML_TMP echo "<sysinfo>" >> $CFG_XML_TMP echo " <system>" >> $CFG_XML_TMP echo " <kernel>$KERNEL</kernel>" >> $CFG_XML_TMP echo " <version>$VERSION</version>" >> $CFG_XML_TMP echo " <date>$DATE</date>" >> $CFG_XML_TMP echo " <time>$TIME</time>" >> $CFG_XML_TMP echo " <uptime>$UPTIME</uptime>" >> $CFG_XML_TMP echo " <idletime>$IDLETIME</idletime>" >> $CFG_XML_TMP echo " <loadavg>$LOADAVG</loadavg>" >> $CFG_XML_TMP echo " </system>" >> $CFG_XML_TMP echo '' >> $CFG_XML_TMP echo " <network>" >> $CFG_XML_TMP echo " <users>$USER</users>" >> $CFG_XML_TMP echo " <userlist>$(finger)</userlist>" >> $CFG_XML_TMP /usr/bin/perl /data/scripts/sysinfo/inc/netinfo.inc.pl >> $CFG_XML_TMP echo " <connections>$(($(netstat -tu | wc -l)-2))</connections>" >> $CFG_XML_TMP echo " <connectionlist>$(netstat -tu)</connectionlist>" >> $CFG_XML_TMP echo " </network>" >> $CFG_XML_TMP echo '' >> $CFG_XML_TMP echo " <memory>" >> $CFG_XML_TMP echo " <max>$RAM_MAX</max>" >> $CFG_XML_TMP echo " <used>$RAM_USED</used>" >> $CFG_XML_TMP echo " </memory>" >> $CFG_XML_TMP echo '' >> $CFG_XML_TMP echo " <swap>" >> $CFG_XML_TMP echo " <max>$SWAP_MAX</max>" >> $CFG_XML_TMP echo " <used>$SWAP_USED</used>" >> $CFG_XML_TMP echo " </swap>" >> $CFG_XML_TMP echo '' >> $CFG_XML_TMP echo " <harddisks>" >> $CFG_XML_TMP /usr/bin/perl /data/scripts/sysinfo/inc/hdinfo.inc.pl >> $CFG_XML_TMP echo " </harddisks>" >> $CFG_XML_TMP echo "</sysinfo>" >> $CFG_XML_TMP cat $CFG_XML_TMP > $CFG_XML_TARGET chown root:root $CFG_XML_TARGET chmod u=r,g=r,o=r $CFG_XML_TARGET rm $CFG_XML_TMP |
Der Pfad zur XML File kann in der Zeile 15 angepasst werden. Dies muss dann aber auch in der Konfiguration des Frontends gemacht werden!
In den Zeilen 54 und 76 müssen dann noch die Pfade zu den Perl Scripten angepasst werden.
Der richtige Besitzer und die richtigen Rechte
Es ist vor allem bei der Konfigurationsdatei wichtig, die Rechte richtig zu setzen. Hier genügt es als Owner und Gruppe root zu setzen, und alle Rechte auf Gruppe und Andere zu entziehen.
Beispiel:
chown root:root script.sh
chmod u=rwx,go=- script.sh




