Switch über SNMP auslesen und saubere Verarbeitung - Wie?

Hallo Community,

so, jetzt hab ich mich nach über einem Jahr reinem Skriptkopieren und rumbasteln mal an meinen ersten eigenen Gehversuch gewagt und hänge gleich an einem Problem:

Ich lese über die includete „php_snmp.dll“ diverse Werte von meinem HP Procurve 1800 Switch aus. Das klappt auch so weit. :smiley: :smiley:

Nun möchte ich für jeden Port den Status auslesen und „schön“ im Webfront darstellen. Im Prinzip funktioniert das auch schon, ich hab das mit den ersten 4 Ports mal händisch copy & paste umgesetzt. Nur gibt das vieeeel Quelltext für 24Ports. Das geht doch sicher auch irgend wie deutlich schöner, oder?

Mein erster Gedanke war natürlich eine Schleife… gleich in Tonis kleinem Programmierhandbuch nachgelesen. Aber irgend wie hat es an einer sinnvollen Umsetzung gehapert.

Wie bekomm ich die Ports 1-24 (MIB mit Endung .101 - .124) inklusive Status sauber ausgelesen und verarbeitet??? :confused:

Und wie könnte man das ganze noch besser / schöner darstellen? Ich habe es über Boolen und das Switch-Profil einmal getestet in der Hoffnung, das die Schaltflächen rot/grün farbig werden. Hat aber auch nicht geklappt? Hab dann wieder auf String und Text zurück gestellt. Jemand gute Vorschläge? :confused:


<?

$host = "192.168.254.5";  //Host des Switch
$community = "public";   //Read-Community String für SNMP

// Uptime Auslesen
$uptime = snmpget("$host","$community",".1.3.6.1.2.1.1.3.0");	 //Uptime des Switch per SNMP-Abfrage
$pos = strpos($uptime, ")");	 //Suche nach Position von ")"
$pos = $pos + "2";		 // +2 um ) und das Leerzeichen zu überspringen
$uptime = substr($uptime, $pos, -3);  	// Schmeiss alles vor Position oben und die letzten 3 Zeichen ".00" raus.
SetValueString(53745 /*[Netzwerk\Uptime von Switch]*/, $uptime." - HH:MM:SS");  	//Schreibe Uptime in Variable


//Ports auslesen.
$port1 = snmpget("$host","$community",".1.3.6.1.2.1.2.2.1.8.101");  // 1 = Online, 2 = Offline
$port1 = str_replace("INTEGER: ", "", $port1);

switch($port1)
{
    case "1":
        SetValueString(43573 /*[Netzwerk\Port 1]*/, "Up");
    break;
    case "2":
        SetValueString(43573 /*[Netzwerk\Port 1]*/, "Down");
    break;
}


$port2 = snmpget("$host","$community",".1.3.6.1.2.1.2.2.1.8.102");  // 1 = Online, 2 = Offline
$port2 = str_replace("INTEGER: ", "", $port1);

switch($port2)
{
    case "1":
        SetValueString(57591 /*[Netzwerk\Port 2]*/, "Up");
    break;
    case "2":
        SetValueString(57591 /*[Netzwerk\Port 2]*/, "Down");
    break;
}

$port3 = snmpget("$host","$community",".1.3.6.1.2.1.2.2.1.8.103");  // 1 = Online, 2 = Offline
$port3 = str_replace("INTEGER: ", "", $port3);

switch($port3)
{
    case "1":
        SetValueString(10977 /*[Netzwerk\Port 3]*/, "Up");
    break;
    case "2":
        SetValueString(10977 /*[Netzwerk\Port 3]*/, "Down");
    break;
}


$port4 = snmpget("$host","$community",".1.3.6.1.2.1.2.2.1.8.104");  // 1 = Online, 2 = Offline
$port4 = str_replace("INTEGER: ", "", $port4);

switch($port4)
{
    case "1":
        SetValueString(52837 /*[Netzwerk\Port 4]*/, "Up");
     break;
    case "2":
        SetValueString(52837 /*[Netzwerk\Port 4]*/, "Down");
    break;
}

?>

Sodele, teilweise konnte ich mir jetzt nach langem rumprobieren selbst helfen. Und habe zum ersten mal seit Schulzeiten ein Array verwendet :smiley: Ich hab die Dinger früher nie verstanden…

Es ist zwar sicherlich bei weitem noch lange, lange nicht perfekt und vermutlich auch nicht schön, aber wenigstens funktioniert es einmal.


//Ports auslesen.
//Array mit Zuordnung "Portnummer" (101-1024) zu IPS-Variable
$portnr = array (
"101"=>"43573",
"102"=>"57591",
"103"=>"10977",
"104"=>"52837");

//Schleife mit Durchlaufe 101-1xx
for ($i=101; $i<105; $i++)
{
	$portstat = snmpget("$host","$community",".1.3.6.1.2.1.2.2.1.8.$i");  //Abfrage Status: 1 = Online, 2 = Offline
	$portstat = str_replace("INTEGER: ", "", $portstat);  //Bereinigen der Antwort auf Wert 1 oder 2

		switch($portstat) //Verarbeiten der Statusabfrage
			{
   		case "1":
      		SetValueString($portnr[$i], "Up");  //Setzen des Wertes, Variable anhand Array
   		break;
   		case "2":
       		SetValueString($portnr[$i], "Down");   //Setzen des Wertes, Variable anhand Array
   		break;
			}
}

Bis her nur Ports 1-4, für die restlichen 20 muss ich noch die Variablen erstellen und das Array erweitern.

Die Darstellung im Webfront ist leider auch noch lange nicht so schön, wie ich mir das vorstelle. Hier bin ich weiterhin für jeden Tip SEHR dankbar! :wink:

Wenn Du das Profil der Variable dem Script zuordnest wird es auch rot/grün bei boolean. Allerdings wird es dann auch schaltbar und das soll es ja nicht. Hiermit kannst Du die Meldung unterbinden.

if($IPS_SENDER == "WebFront") return;

oder aber eine Stringvariable mit Profil HTML_BOX nehmen und entsprechend Code reinpacken, dann kannst Du gestalten wie Du willst.
Das Script kannst Du verstecken, es läuft ja ein Timer.

Hallo Artaios,

kannst Du mal bitte Deinen kompletten Code zeigen und welche dll Du installiert hast und wie Du sie eingebunden hast?

Ich habe den HP ProCurve 2524 und wollte Dein Beispiel nachvollziehen. Ich habe die „php_snmp.dll“ in „ext“ gelegt, es kommt aber eine Fehlermeldung im Log „Erweiterung php_snmp.dll nicht geladen. Fehlende Abhängigkeit: php4ts.dll“. Hast Du diese auch installiert?
Im Code erkennt er daher den Befehl „snmpget“ leider nicht…

Joachim

Hallo Joachim,

es muss schon die dll für php5.3.1 sein. Deiner Meldung nach hast Du die für 4…

Hallo Rainer,

vielen Dank für den Tipp - das wars diesbezüglich! Die Fehlermeldung im Log ist verschwunden und „snmpget“ wird ausgeführt. Die Uptime wird ausgeführt.:slight_smile:
Die Abfrage der Ports führt jedoch zu einer Fehlermeldung. Wo finde ich Informationen, welche „Befehle“ ausgeführt werden können (bzw. welche Suchbegriffe bei Google wären hilfreich?)?:confused:

Joachim

PHP: SNMP-Funktionen - Manual

Hallo Rainer,

ich glaube ich habe mich mißverständlich ausgedrückt… Ich meinte nicht Infos zum Befehl „snmpget“, sondern zu diesen „.1.3.6.1.2.1.2.2.1.8.101“ Nummerkombinationen. Wo finde ich dazu Input? (Surfe hier nebenbei bei HP auf der Homepage…)

Joachim

Vielleicht hier.

snmp:start [Nagios-Wiki]

So, Dank der Tipps hier aus dem Forum habe ich für den HP ProCurve 2524 folgendes Versuchsskript in die Tasten gehauen:

$host = "192.168.178.66";  //Host des Switch
$community = "public";   //Read-Community String für SNMP

// Uptime Auslesen
$uptime = snmpget("$host","$community",".1.3.6.1.2.1.1.3.0");     //Uptime des Switch per SNMP-Abfrage
$pos = strpos($uptime, ")");     //Suche nach Position von ")"
$pos = $pos + "2";         // +2 um ) und das Leerzeichen zu überspringen
$uptime = substr($uptime, $pos, -3);      // Schmeiss alles vor Position oben und die letzten 3 Zeichen ".00" raus.
//Schreibe Uptime in Variable
Echo $uptime." ";

$Luefterstatus = snmpget("$host","$community",".1.3.6.1.4.1.11.2.14.11.1.2.6.1.4.1");
$Luefterstatus = (int)substr($Luefterstatus, 8, 3);
$Status[1]= "Unbekannt";
$Status[2]= "Schlecht";
$Status[3]= "Warnung";
$Status[4]= "Gut";
$Status[5]= "nicht vorhanden";
Echo "Lüfterstatus: ".$Status[$Luefterstatus]." ";

$CPU = snmpget("$host","$community",".1.3.6.1.4.1.11.2.14.11.5.1.9.6.1.0");
$CPU = (int)substr($CPU, 8, 3);
Echo $CPU."% ";

//Schleife mit Durchlauf 1-24
for ($i=1; $i<25; $i++)
{
    $portstat = snmpget("$host","$community",".1.3.6.1.2.1.2.2.1.8.$i");  //Abfrage Status: 1 = Online, 2 = Offline
    $portstat = str_replace("INTEGER: ", "", $portstat);  //Bereinigen der Antwort auf Wert 1 oder 2

        switch($portstat) //Verarbeiten der Statusabfrage
            {
           case "1":
              //SetValueString($portnr[$i], "Up");  //Setzen des Wertes, Variable anhand Array
              echo "Port ".$i.":"."Up ";
           break;
           case "2":
               //SetValueString($portnr[$i], "Down");   //Setzen des Wertes, Variable anhand Array
               echo "Port ".$i.":"."Down ";
           break;
            }
}

?>

Ist sicherlich noch erweiterbar… :slight_smile:

Nachtrag: Hier noch ein hilfreicher Link für HP-Geräte:
https://support.ipmonitor.com/mibs_byoidtree.aspx?oid=.1.3.6.1.2.1.2.2.1.8

Joachim

Hallo Leute,

mit dem Update auf die neue (wirklich sehr sehr schnelle Version!) , läuft leider auch das Auslesen per snmp nicht mehr (offensichtlich „das alte Spiel“…).
Welche Version der dll sollte man nun installieren?

Joachim

Ich denke eher, Du hast dir die Libs überschrieben.

Sollte im Log stehen.

10.09.2012 19:21:24.310 |     0 | MESSAGE | ScriptEngine         | Benutze PHP 5.4.4
10.09.2012 19:21:24.321 |     0 | MESSAGE | ScriptEngine         | >OpenSSL #1: 0.9.8
10.09.2012 19:21:24.321 |     0 | MESSAGE | ScriptEngine         | >OpenSSL #1: 0.9.8

Hallo Rainer,

vielen Dank für Deine schnelle Antwort!
So sieht es bei mir aus:

10.09.2012 21:11:00.303 |     0 | MESSAGE | ScriptEngine         | Benutze PHP 5.4.4
10.09.2012 21:11:00.646 |     0 | MESSAGE | ScriptEngine         | >OpenSSL #1: 1.0.0
10.09.2012 21:11:00.974 |     0 | MESSAGE | ScriptEngine         | >OpenSSL #1: 1.0.0
10.09.2012 21:11:01.053 |     0 | MESSAGE | ScriptEngine         | >Erweiterung: msql.dll
10.09.2012 21:11:01.209 |     0 | MESSAGE | ScriptEngine         | >Erweiterung: php_curl.dll
10.09.2012 21:11:01.568 |     0 | MESSAGE | ScriptEngine         | >Erweiterung: php_gd2.dll
10.09.2012 21:11:01.615 |     0 | MESSAGE | ScriptEngine         | >Erweiterung: php_gettext.dll
10.09.2012 21:11:01.943 |     0 | MESSAGE | ScriptEngine         | >Erweiterung: php_mbstring.dll
10.09.2012 21:11:02.053 |     0 | MESSAGE | ScriptEngine         | >Erweiterung php_snmp.dll nicht geladen. Nicht nutzbar in Verbindung mit OpenSSL 1.0.0

Muss ich da wieder eine ältere Version nutzen?

Joachim

austauschen. http://www.ip-symcon.de/files/service/OpenSSL-0.9.8.zip und beim nächsten Update im Liveupdate abwählen.

Funktioniert wieder! :wink:

Vielen Dank Rainer!

Hallo Leute,

ich habe meinen HP ProCurve gegen einen TP-Link TL-SG3424 getauscht. Einige von den SNMP-HP-„Codierung“ funktionieren auch hier - andere leider nicht. Ich habe im Internet bisher keine hilfreichen Tipps finden können…

Nutzt jemanden einen TP-Link-Switch und kann mir diesbezüglich mal ein paar gute Links posten?

Joachim

Hiho,

ich benutze zum Auslesen von SNMP einen SNMPWalk. Ich benutze dafür eine OpenSource Lösung names „The Dude“.

Einfach ein neues gerät hinzufügen, SNMP konfigurieren, Rechtsklick, Tools SNMPwalk.

Die meisten Werte kann man eigentlich recht gut durch Vergleichen im Webinterface oder an der OID Bezeichnung rausfinden. Dann die OID kopieren und rein ins IPS.

… hmm merk grade man könnte da mal einen Guide schreiben :slight_smile:

Hallo zusammen,

ich habe mir das Script von JPaeper kopiert und auf meine bedürfnisse soweit angepasst. Leider komme ich aber mit dem Array und String nich klar. Bin aber auch überhaupt nicht der PHP Guru muss ich dazu sagen… :slight_smile:

Ich bekomme die Fehlermeldung „Warning: Wrong parameter type for SetValueString() in C:\IP-Symcon\scripts\19472.ips.php on line

Wo liegt der Fehler?

Anbei das Skript:


<?
$host = "192.168.12.250";  //Host des Switch
$community = "public";   //Read-Community String für SNMP

// Uptime Auslesen
$uptime = snmpget("$host","$community",".1.3.6.1.2.1.1.3.0");     //Uptime des Switch per SNMP-Abfrage
$pos = strpos($uptime, ")");     //Suche nach Position von ")"
$pos = $pos + "2";         // +2 um ) und das Leerzeichen zu überspringen
$uptime = substr($uptime, $pos, -3);      // Schmeiss alles vor Position oben und die letzten 3 Zeichen ".00" raus.
SetValueString(24890 , $uptime." - HH:MM:SS");      //Schreibe Uptime in Variable

Echo $uptime." ";
echo("
");

$Luefterstatus = snmpget("$host","$community",".1.3.6.1.4.1.11.2.14.11.1.2.6.1.4.1");
$Luefterstatus = (int)substr($Luefterstatus, 8, 3);
$Status[1]= "Unbekannt";
$Status[2]= "Schlecht";
$Status[3]= "Warnung";
$Status[4]= "OK";
$Status[5]= "nicht vorhanden";
SetValueString(39816, $Status[$Luefterstatus]);
Echo "Lüfterstatus: ".$Status[$Luefterstatus]." ";
echo("
");

$CPU = snmpget("$host","$community",".1.3.6.1.4.1.11.2.14.11.5.1.9.6.1.0");
$CPU = (int)substr($CPU, 8, 3);
SetValueString(32147, $CPU." %");
Echo $CPU."% ";
echo("
");

$portnr = array (
"1"=>"44120",
"2"=>"16092",
"3"=>"44637",
"4"=>"26710"
);

for ($i=1; $i<5; $i++)
{
    $portstat = snmpget("$host","$community",".1.3.6.1.2.1.2.2.1.8.$i");  //Abfrage Status: 1 = Online, 2 = Offline
    $portstat = str_replace("INTEGER: ", "", $portstat);  //Bereinigen der Antwort auf Wert 1 oder 2

        switch($portstat) //Verarbeiten der Statusabfrage
            {
           case "1":
              SetValueString($portnr[$i], "Up");
              echo "Port ".$i.":"."Up ";
              echo("
");
           break;
           case "2":
               SetValueString($portnr[$i], "Down");   //Setzen des Wertes, Variable anhand Array
              echo "Port ".$i.":"."Down ";
              echo("
");
           break;
            }
}


?>


Gruß Kirus22

Hallo Kirus22,

das was in Deiner Fehlermeldung nach „…on line“ kommen würde wären zur Fehlerklärung vielleicht ganz interessant…:wink:
Was steht in dieser Zeile?

Joachim

Ups, es wir die Zeile 47 und 52 angemekert …

47 SetValueString($portnr[$i], „Up“);

52 SetValueString($portnr[$i], „Down“);

Gruß Kirus22