megacarsit
Goto Top

PHP Effektiver Stringvergleich snmp

Hallo Leute!

Es geht um folgendes:

Ich bekomme per snmpget über PHP, von einem Switch folgenden Zeichenfolge zurück:
" STRING: Herstellername (Typname) ",
im Falle des Herstellers HP/ProCurve sieht er so aus:

STRING: ProCurve J4900B Switch 2626, revision H.10.50, ROM H.08.05 (/sw/code/build/fish(mkfs))

Diese würde ich gern am Herstellernamen unterscheiden, da es drei Switch-Hersteller gibt ...

Dies dient dann dazu den richtigen SNMP-Einstiegspunkt zu setzen,
um danach über snmpwalk zu nutzen, um Infos abzufragen.

Habe den Stringvergleich u.a. mit strpos, strscpn versucht?

Gibt es da etwas effektiveres??
Mir würde reichen zu sagen:
STRING:
und danach die ersten beiden Buchstaben vergleichen, dies mit einem Wahrheitswert zurück zu geben.


Das Script ist zwar lauffähig, aber es trifft keine eindeutige Unterscheidung.


Anbei der Codeschnipsel:
        //Abfrage des Herstellers
    $devicename = snmpget($host, $communitystring, "sysName.0");              
    
    $hersteller1 = "Cisco";  
    $hersteller2 = "Procurve";  
    $hersteller3 = "3com";  
            
                if(strpos($devicename, $hersteller2 === TRUE))
                {
                    $snmp_adress = "enterprises.11.2.14.11.5.1.9.4.2.1";  
                }
                elseif(strpos($devicename, $hersteller1 === TRUE))
                {
                    $snmp_adress = "Beispiel1.11.2.14.11.5.1.9.4.2.1";  
                }
                else
                {
                    $snmp_adress = "beispiel2.11.2.14.11.5.1.9.4.2.1";  
                
                }
                        
            //Host, Communitystring und  SNMP_Einstiegspunkt (Adress)
            $host = $argv[1];
            $communitystring = $argv[2];
            //$snmp_adress = 'enterprises.11.2.14.11.5.1.9.4.2.1'; 

            
            $datenarray = snmpwalk("$host","$communitystring","$snmp_adress");  
            $arraycount = count($datenarray);


Besten Dank!

Content-ID: 96084

Url: https://administrator.de/contentid/96084

Ausgedruckt am: 24.11.2024 um 03:11 Uhr

Arano
Arano 04.09.2008 um 11:28:37 Uhr
Goto Top
Moin,

schau dir mal den Rückgabewert der funktion "strpos()" an: PHP-Manual - strpos()
Deine Bedingungen werden nur erfüllt wenn "strpos()" TRUE zurückgibt, was aber nie der Fall sein wird ;)

~Arano
megacarsIT
megacarsIT 04.09.2008 um 11:35:26 Uhr
Goto Top
Besten Dank für Dein Link!
Achsoo also kann es garkein Zustand in TRUE annehmen? Oder wie muss ich das verstehen?

Habs nun mit strspn versucht.... bin total verwirrt face-sad
Arano
Arano 04.09.2008 um 12:36:20 Uhr
Goto Top
Ja, das ist richtig !
strpos ist gar nicht falsch gewesen. strpos liefert dir im Erfolgsfall die Position der Stelle an der die Zeichenkette gefunden wurde zurück, oder FALSE wenn sie nicht gefunden wurde. Um die Prüfung damit nun durchzuführen, kannst du folgendes verwenden:
<?php
  if(strpos($devicename, $hersteller1)!==FALSE)
     $snmp_adress = 'enterprises.11.2.14.11.5.1.9.4.2.1';  
  elseif(strpos($devicename, $hersteller1)!==FALSE)
     $snmp_adress = 'Beispiel1.11.2.14.11.5.1.9.4.2.1';   
  else
     $snmp_adress = 'beispiel2.11.2.14.11.5.1.9.4.2.1';  
?>
Zusätzlich könntest du noch prüfen lassen ob die Position an der die Zeichenkette gefunden wurde korrekt ist - für den Fall das die gesuchten Zeichenketten auch in den anderen Devicenamen an einen späteren Stelle vorkommen dann sähe es ungefähr so aus:
<?php
  // rueckgabe von strpos in $pos speichern,
  // pruefen ob es NICHT gleich FALSE ist und
  // noch mal pruefen ob die Stelle an der sie gefunden wurde die richtige ist
  if(($pos=strpos($devicename, $hersteller1))!==FALSE && $pos==8)
     $snmp_adress = 'enterprises.11.2.14.11.5.1.9.4.2.1';  
  elseif(($pos=strpos($devicename, $hersteller1))!==FALSE && $pos==8)
     $snmp_adress = 'Beispiel1.11.2.14.11.5.1.9.4.2.1';   
  else
     $snmp_adress = 'beispiel2.11.2.14.11.5.1.9.4.2.1';  
?>
Mir ist eben noch aufgefallen das du auch einen Fehler in deinen Bedingungen hattest:
<?php
  // du hattest:
  if(strpos($devicename, $hersteller2 === TRUE))
  // sollte aber so sein:
  if(strpos($devicename, $hersteller2) === TRUE)
?>
Das hätte eigentlich eine Fehlermeldung werfen sollen !?

Gruß Arano
megacarsIT
megacarsIT 05.09.2008 um 10:56:22 Uhr
Goto Top
Hallo Arano!

Besten Dank für Deine Hilfe! Beitrag ist auf gelöst!
Code 2 hatte bei mir keine Fehlermeldung geworfen.
Vielleicht liegt das an SHELL-PHP ?
Wobei ich keine Error@unterdrückung on hab.

Möchte diesen Beitrag nicht zu spammen, ich hab da noch Fragen zu einem andere Thema ;)


Gruss,
megacarsIT