Switch über SNMP auslesen und saubere Verarbeitung - Wie?

Mach hier mal die ” weg bei den VariablenIDs.
Der Fehler sagt das du einen falschen Typ (hier String) übergibst.
Erwartet wird ein Integer.
Michael

Mach hier mal die ” weg bei den VariablenIDs.
Der Fehler sagt das du einen falschen Typ (hier String) übergibst.
Erwartet wird ein Integer.
Michael

Perfekt! Danke!

Wie könnte ich eine Warnmeldung per SMS bzw. E-Mail verschicken wenn zum Beispiel ein Port bzw. Lüfter nicht mehr in Ordnung ist?

Gruß Kirus22

Am einfachsten ein Webgateway nutzen (z.B. Handywelt.at oder sms77.de - gibt hier einen Thread dazu).

Die haben eine Webapi - damit kann man ganz einfach SMS versenden ;).

Ich haba das ganze mal vor einiger Zeit angepaßt.
Ziele:

[ul]
[li]‚Auto-Install‘ - Variblen, Timer und Profile werden automatisch angelegt[/li][li]Fürs WF optimierte Darstellung nach Ports sortiert[/li][li]Wech mit String; Bool für Up/Down und Integer für PortSpeed[/li][li]PortSpeed ausblenden wenn Port down ist[/li][li]Arbeiten mit IDENT damit Instanzen und Variablen jederzeit umbenannt werden können.[/li][/ul]

Da mein Switch z.B. keine CPU-Last oder Lüfter-Stati bereitstellt; sind diese Bereich auskommentriert.
Aber auch nicht weiter eingepflegt. Hier müßte dann z.b. mit

SetValueSelf('CPU',$CPU,1);

Der Code ergänzt werden.


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

if ($_IPS['SENDER']=='Execute')
{
	IPS_SetHidden($_IPS['SELF'],true);
	IPS_SetScriptTimer($_IPS['SELF'],60);
	if (!IPS_VariableProfileExists('ETH.LinkState'))
	{
	   IPS_CreateVariableProfile('ETH.LinkState',0);
	   IPS_SetVariableProfileAssociation('ETH.LinkState',0,'Down','',0xff0000);
	   IPS_SetVariableProfileAssociation('ETH.LinkState',1,'Up','',0x00ff00);
	}
	if (!IPS_VariableProfileExists('ETH.LinkSpeed'))
	{
		IPS_CreateVariableProfile('ETH.LinkSpeed',1);
	   IPS_SetVariableProfileAssociation('ETH.LinkSpeed',10,'10 MBit','',0xff0000);
	   IPS_SetVariableProfileAssociation('ETH.LinkSpeed',100,'100 Mbit','',0xff8000);
	   IPS_SetVariableProfileAssociation('ETH.LinkSpeed',1000,'1 Gbit','',0x00ff00);
	}

}

// 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.
SetValueSelf('Laufzeit',$uptime,3);

/*
$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."% ";
*/

//1.3.6.1.2.1.2.2.1.10.5001 // in octet
//1.3.6.1.2.1.2.2.1.11.5002 // in ucast ocetets
//1.3.6.1.2.1.2.2.1.12.5002 // in NUcast ocetets
//1.3.6.1.2.1.2.2.1.14.5002 // in Errors
//1.3.6.1.2.1.2.2.1.16.5005 // out octets
//1.3.6.1.2.1.2.2.1.17.5007 // out Ucast ocetet
//1.3.6.1.2.1.2.2.1.18.5001 // out NUcast ocetet
//1.3.6.1.2.1.16.1.1.1.4.5001 // etherstatsOctets
//1.3.6.1.2.1.16.1.1.1.5.5001 // etherstatsPkts

//Schleife mit Durchlauf 50011-5025
for ($i=5001; $i<5025; $i++)
{
   $portname = snmpget("$host","$community",".1.3.6.1.2.1.2.2.1.2.$i");  //Name
   $portname = substr ($portname,9,-1);  //Bereinigen der Antwort
   $port = GetOrCreateDummy($i,$portname);
	$portstat = snmpget("$host","$community",".1.3.6.1.2.1.2.2.1.8.$i");  //Abfrage Status: 1 = Online, 2 = Offline
	$portstat = !(bool)(str_replace("INTEGER: ", "", $portstat)-1);  //Bereinigen der Antwort auf Wert 1 oder 2
	SetValueSelf('Link',$portstat,0,'ETH.LinkState',$port);
	if ($portstat)
	{
		$portspeed = snmpget("$host","$community",".1.3.6.1.2.1.31.1.1.1.15.$i");  //Abfrage Status: 1 = Online, 2 = Offline
	   $portspeed = str_replace("Gauge32: ", "", $portspeed);  //Bereinigen der Antwort
		SetValueSelf('Speed',(int)$portspeed,1,'ETH.LinkSpeed',$port);
		@IPS_SetHidden(@IPS_GetObjectIDByIdent('Speed',$port),false);
	 } else {
		@IPS_SetHidden(@IPS_GetObjectIDByIdent('Speed',$port),true);
	 }
}

function SetValueSelf($ident,$value,$type,$profile='',$parent=0)
{
	if ($parent==0) $parent = IPS_GetParent($_IPS['SELF']);
	$id=@IPS_GetObjectIDByIdent($ident,$parent);
	if ($id===false)
	{
		$id = IPS_CreateVariable($type);
		IPS_SetParent($id,$parent);
		IPS_SetIdent($id,$ident);
		IPS_SetName($id,$ident);
		if ($profile <> '') IPS_SetVariableCustomProfile($id,$profile);
	}

	switch ($type)
	{
	   case 0:
		   if (GetValueBoolean($id) <> $value) SetValueBoolean($id,$value);
	   break;
	   case 1:
        	   if (GetValueInteger($id) <> $value) SetValueInteger($id,$value);
	   break;
	   case 3:
		   if (GetValueString($id) <> $value) SetValueString($id,$value);
	   break;
	}
}

function GetOrCreateDummy($ident,$portname)
{
	$parent = IPS_GetParent($_IPS['SELF']);
	$id=@IPS_GetObjectIDByIdent($ident,$parent);
	if ($id===false)
	{
	   $id = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
		IPS_SetParent($id,$parent);
		IPS_SetIdent($id,$ident);
		IPS_SetName($id,$portname);
		IPS_SetPosition($id,$ident);
	}
	return $id;
}
?>

Danke dafür

Ich habe gerade mal meinen erste Mikrotik-Router eingebunden und bis auf wenige Ungereimheiten werden die Daten auch ausgelesen, inkl. CPU-Load. Einzig der Interface-Speed der WLan-Schnittstelle stimmt nicht, ich denke, der fragt aber den Speed der Bridge ab, das würde passen.

Werde mal schauen, ob ich die Speicherauslastung noch mit reinpacke und die RouterOS-Version, sowie den Durchsatz der einzelnen Interface um die dann später als Graphen anzuzeigen. Gerade CPU ist für mich wichtig, da auf meinem grossen Router CAPsMan läuft um das Wlan zu verwalten.

Als nächstes kommen jetzt die beiden kleinen Router dazu, die bei mir hauptsächlich als WLan-AP laufen.

EDIT: hab doch noch ein kleine Problem gefunden:
Ich frage dem operativen Port-Status ab und wenn der Port „Down“ ist, wird die Geschwindikeit ausgelesen, ist der Port „UP“ passiert das nicht mehr. Da muss ich die Abfragen ändern

Da scheint sich irgendwo ein Dreher eingeschlichen zu haben. Schaue ich mir morgen mal an.
Michael

Hallo,

die Abfrage, ob der Port up/down ist, schein mir etwas unglücklich, aber mit meinen bescheidenen PHP-Kenntnissen kommen ich auch auch nur durch raten weiter.

Mein Switch meldet ganz normal über die OID 1.3.6.1.2.1.2.2.1.8.x ( operativer Port-Status ) 2 = Down oder 1 =Up, das sieht doch schon passend zu deinem Script aus.

Port-Spedd kommt aus OID .1.3.6.1.2.1.2.2.1.5.x als Dezimalwert, eben 1000000 bei 1GBit, bei Ports, die down sind, eben 0

Welchen Switch nutzt du ?
Vielleicht macht der das anders.

Habe den ‚Fehler‘.
War nicht wirklich einer, das Profil war nur leider noch aus der ersten Version und somit wurde im Profil Up/Down vertauscht. :o
Einfach das Profil (ETH.LinkState) von Hand drehen, oder das Script durch das jetzt oben geänderte Script ersetzen und dann das Profil löschen. Es wird dann korrekt neu erstellt.

Der ‚Rest‘ waren Folgefehler. Wer dann die Werte im Script invertiert hat, hatte dadurch auch nur bei Port-Down einen LinkSpeed und bei Port-Up keinen. :smiley:

LinkSpeed blende ich einfach deswegen aus, weil mein Switch bei einem Port welcher Down ist hier 1Gbit rauswirft.
Darum wird der Wert dann gar nicht erst abgefragt, was die Script-Laufzeit minimiert.
Meinem HP ProCurve 1800-24G gibt bei Speed 10,100,1000 raus. Wenn hier Unterschiede sind, müsst Ihr das Profil natürlich auch anpassen.

Michael

Hallo,

ich denke, du meinst das geänderte Script in #24 , oder ?

Damit funktioniert es bei meinen Switchen noch schlechter, ich denke, da muss ich einige grössere Anpassungen speziell für meine Modelle machen.

Werde mal heute abend rumprobieren.

Wie schlechter ?
Ich habe nur das Profil korrigiert.
Rest ist gleich.
Michael

Hallo,

es passiert genau das umgekehrte, was gewünscht ist:

  • Port ist up, wird als Down ausgelesen und der Speed ebenfalls ausgelesen
  • Port ist down, wird als UP ausgelesen und kein Speed ausgelesen

nehme ich aus der Zeitl

   $portstat = !(bool)(str_replace("INTEGER: ", "", $portstat)-1);  //Bereinigen der Antwort auf Wert 1 oder 2

die Negierung raus, passiert wir zu erwarten das umgekehrt, Port-Status stimmt, aber der Speed wird nicht gelesen.

Ich spiele mal etwas mit den Werten rum…

Hast du das Profil gelöscht, bevor das geänderte Script ausgeführt wurde?
Weil nur die Anzeige Up/Down ist doch vertauscht.
Michael

Hab das komplette Script getauscht, meine OIDs eingetragen und meine Variable für die Switch-IP wieder reingepackt.

Ich habe eine weitere Negierung reingepackt, jetzt funktioniert die Abfrage wie gewüscht, nur die Speed-Abfrage muss ich noch anpassen, die Werte stimmen nicht mit dem Abfragen überein.

EDIT: könntest du mir noch sagen, wie sich die HEX-Zahlen am Ende der 5 Zeilen mit „IPS_SetVariableProfileAssociation“ am Anfang zusammensetzen, das verstehe ich nicht so ganz - Danke