Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Parameter von Icinga übernehmen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • harrier
    hat ein Thema erstellt [Erledigt] Parameter von Icinga übernehmen.

    [Erledigt] Parameter von Icinga übernehmen

    Hallo Community,

    ich bin PHP-Einsteiger und möchte gerne ein kleines Plugin für die Monitoringsoftware Icinga schreiben.

    Das Plugin soll von Icinga übergebene Parameter übernehmen und daraufhin eine Datenbankabfrage durchführen. Leider scheitere ich bereits bei der Übernahme der Parameter in mein Programm.

    Die übergebene Ausgabe von Icinga würde wie folgt aussehen:
    Code:
    ./check_mysql -H $HOSTADDRESS$ -u $ARG1$ -p $ARG2$ -db $ARG3$ -q $ARG4$ -w $ARG5$ -c $ARG6$
    Im Plugin habe ich dies wie folgt realisiert:
    PHP-Code:
    #!/usr/bin/php -q
    <?PHP
        
        define
    (0,"OK");
        
    define(1,"WARNING");
        
    define(2,"CRITICAL");
        
    define(3,"UNKNOWN");
                
        
    $argument getopt("H:u:p:d:q:w:c:"); 
        
        
    $hostname $argument(0);
        
    $user $argument(1);
        
    $passwort $argument(2);
        
    $database $argument(3);
        
    $query argument(4);
        
    $warning argument(5);
        
    $critical=argument(6);
        
        echo(
    $hostname);
        echo(
    $user);
        echo(
    $passwort);
        echo(
    $database);
        echo(
    $query);
        echo(
    $warning);
        echo(
    $critical);
        
    ?>
    Doch bereits der erste Test, ob die Variablen korrekt eingelesen wurden schlug fehl.

    Ich wäre dankbar wenn mir jemand weiterhelfen könnte, da ich meinen Fehler momentan nicht entdecken kann.

  • lstegelitz
    antwortet
    Lerne Grundlagen

    Da sind einige Klöpse in deinem Code (die aus dem Eingangsposting hatte ich dir ja schon aufgezählt)..

    Hier z.B.
    PHP-Code:
    echo"Parameter: $parameter['H']"
    Du möchtest einen Wert aus einem Array direkt im String stehen haben (anstatt Stringkonkatenation zu verwenden, was die Helfer in diesem Forum gebetsmühlenartig wiederholen) und machst es falsch.

    PHP-Code:
    echo "Parameter: {$parameter['H']}"

    // Besser noch:
    echo "Parameter: ".$parameter['H']; 

    Einen Kommentar schreiben:


  • harrier21a
    antwortet
    Ich möchte mich dafür entschuldigen, dass ich mich teilweise nicht klar genug ausgedruckt habe und Fehlermeldungen nur teilweise gepostet habe.

    Bei meinem
    ersten Versuch vom 13.06. 13.06.
    mittels getopt() bekam ich die folgende Medlung:

    Code:
     ./test.php -H 127.0.0.1 -u user -p password -db db1 -q "select * from commands where id 722" -r [0-9] -w 10 -c 5
    PHP Fatal error:  Function name must be a string in /opt/omd/versions/1.00/lib/nagios/plugins/test.php on line 11
    -----------
    Bei meinem zweiten Versuch
    kam folgende Meldung:

    Code:
    ./test.php -w 10 -H 127.0.0.1 -u user -p passwort -db db1 -q "select * from commands where id 722" -r [0-9] -w10 -c 5
    
    PHP Notice:  Undefined variable: parameter in /lib/nagios/plugins/test.php on line 12
    PHP Warning:  array_merge(): Argument #1 is not an array in /lib/nagios/plugins/test.php on line 12
    PHP Warning:  array_merge(): Argument #1 is not an array in /lib/nagios/plugins/test.php on line 12
    PHP Warning:  array_merge(): Argument #1 is not an array in /lib/nagios/plugins/test.php on line 12
    PHP Warning:  array_merge(): Argument #1 is not an array in /lib/nagios/plugins/test.php on line 12
    PHP Warning:  array_merge(): Argument #1 is not an array in /lib/nagios/plugins/test.php on line 12
    PHP Warning:  array_merge(): Argument #1 is not an array in /lib/nagios/plugins/test.php on line 12
    PHP Warning:  array_merge(): Argument #1 is not an array in /lib/nagios/plugins/test.php on line 12
    PHP Warning:  array_merge(): Argument #1 is not an array in /lib/nagios/plugins/test.php on line 12
    PHP Warning:  array_merge(): Argument #1 is not an array in /lib/nagios/plugins/test.php on line 12
    PHP Warning:  array_merge(): Argument #1 is not an array in /lib/nagios/plugins/test.php on line 12
    PHP Warning:  array_merge(): Argument #1 is not an array in /lib/nagios/plugins/test.php on line 12
    PHP Warning:  array_merge(): Argument #1 is not an array in /lib/nagios/plugins/test.php on line 12
    PHP Warning:  array_merge(): Argument #1 is not an array in /lib/nagios/plugins/test.php on line 12
    PHP Warning:  array_merge(): Argument #1 is not an array in /lib/nagios/plugins/test.php on line 12
    PHP Warning:  array_merge(): Argument #1 is not an array in /lib/nagios/plugins/test.php on line 12
    PHP Warning:  array_merge(): Argument #1 is not an array in /lib/nagios/plugins/test.php on line 12
    PHP Notice:  Undefined variable: paramter in /lib/nagios/plugins/test.php on line 18
    Die ausgegebenen Variablen $host, $user, $passwort, $database, $query, $regexpr, $warningvalue und $criticalvalue enthalten keine Werte.

    Eines meiner Probleme ist, dass es im Netz diverse unterschiedliche Anleitungen im Bezug auf die Verwendung von "getopt" gibt.

    Ich habe nochmals versucht mir die Variablen der einzelnen Arrayelemente ausgeben zu lassen um zu kontrollieren ob die korrekten Werte enthalten sind.

    Commandline:
    Code:
    #>./mysql.php -w 10 -H 127.0.0.1 -c 5 -r [0-9] -u testuser -p test -d testdb -q "select * from commands where id 722"

    PHP-Code:
    #!/usr/bin/php
    <?PHP
        
        define
    ('0','OK');
        
    define('1','WARNING');
        
    define('2','CRITICAL');
        
    define('3','UNKNOWN');

        
    $parameter getopt("H:u:p:d:q:r:w:c:");
        
    $hostname $parameter['H'];
    $user $parameter['u'];
    $passwort $paramter['p'];
    $database $parameter['d'];
    $query $parameter['q'];
    $regexpr $parameter['r'];
    $warningvalue $parameter['w'];
    $criticalvalue $parameter['c'];
    ##############
    echo"Parameter: $parameter['H']";
    echo
    "Parameter: $parameter['u']";
    echo
    "Parameter: $parameter['p']";
    echo
    "Parameter: $parameter['d']";
    echo
    "Parameter: $parameter['q']";
    echo
    "Parameter: $parameter['r']";
    echo
    "Parameter: $parameter['w']";
    echo
    "Parameter: $parameter['c']";

    ?>
    Die Parameterübergabe per getopt funktioniert mittlerweile.

    Danke an alle für die Hilfe.

    Einen Kommentar schreiben:


  • lstegelitz
    antwortet
    Ich stimme zu, ergänze aber ".. wenn man es richtig macht"

    Im Code des Ausgangspost waren ja gleich mehrere Fehler enthalten...

    Einen Kommentar schreiben:


  • Tropi
    antwortet
    Zitat von lstegelitz Beitrag anzeigen
    Wie im Eingangspost bereits geschehen?
    Okay, da habe ich jetzt drübergelesen, dachte das wäre bereits erledigt. Nichtsdestotrotz sind die Argumente ja schon geparsed, d.h. man kann sie einfach mit $host = getopt("H:...")['H'] ansprechen. Ich seh die Problematik nicht. parse_str() würde ich vermeiden, weil man dann mit den (nichtssagenden) 1-Zeichen-Variablen arbeiten muss.

    Einen Kommentar schreiben:


  • lstegelitz
    antwortet
    Wie im Eingangspost bereits geschehen?

    Doch bereits der erste Test, ob die Variablen korrekt eingelesen wurden schlug fehl.
    Damit kann niemand etwas anfangen. WAS schlug fehl? Gibt es Fehlermeldungen oder eine Analyse deinerseits, woran es liegen könnte?

    Beim aufruf bekomme ich folgendenFehler "Parameter PHP Notice: Undefined index"
    Auch hier hast du nur eine unvollständige Fehlermeldung angegeben.

    PHP-Code:
    $argument getopt("H:u:p:d:q:w:c:");
    $hostname $argument(0); 
    getopt() liefert ein Array zurück, das du allerdings falsch ansprichst... runde Klammern => Funktionsaufruf ; eckige Klammern => Arrayzugriff

    PHP-Code:
    $argument getopt("H:u:p:d:q:w:c:");
    $hostname $argument[0]; 
    PHP-Code:
      $query argument(4); 
    Und hier lässt du auch noch das Dollar-Zeichen weg...

    Überhaupt benutzt du das resultierende Array falsch:
    PHP-Code:
    $argument getopt("H:u:p:d:q:w:c:");     
    var_dump($argument); 
    Aufruf z.B. mit den Argumenten "-c 123 -u test" ergibt:
    Code:
    array(2) {
      ["c"]=>
      string(3) "123"
      ["u"]=>
      string(4) "test"
    }

    Einen Kommentar schreiben:


  • Tropi
    antwortet
    Sinnvoller wäre es, nicht die Argumente selbst parsen zu wollen, sondern getopt() zu verwenden.

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Deine Lösung
    PHP-Code:
    $_array explode' '$string ); 

    Einen Kommentar schreiben:


  • harrier21a
    antwortet
    Hallo Community,

    bei meiner vorherigen Lösung mittel argv[] sind die übergebenen Parameter leider nicht possitionsunabhängig.


    Gibt es eine Möglichkeit mit welcher ich aus folgendem String:

    Code:
    ./mysql.php -H 127.0.0.1 -u testuser -p test -db test-db -q "select * from test-db where test-id=722" -r [0-9] -w 10 -c
    Ein Array mit den Bezeichnern als Schlüssel und den entsprechenden Werten erzeugen kann.

    Bsp.:
    wert[-H] -> 127.0.0.1
    wert[-u] -> testuser
    wert[-p] -> test

    Bin im Netz auf die Funktion "parse_str" aufmerksam geworden.
    Habe folgendes versucht:

    PHP-Code:
            if ($argc 0) {
                    for (
    $i=$i $argc $i++) {
                            
    parse_str($argv[$i], $tmp);
                            
    $parameter array_merge($parameter$tmp);
                    }
            }

    $host            =$parameter["-H"];
    $user            =$parameter["-u"];
    $passwort        =$paramter["-p"];
    $database        =$parameter["-db"];
    $query        =$parameter["-q"];
    $regexpr        =$parameter["-r"];
    $warningvalue    =$parameter["-w"];
    $criticalvalue       =$parameter["-c"];

    echo 
    " | $host ";
    echo 
    " | $user ";
    echo 
    " | $passwort ";
    echo 
    " | $database ";
    echo 
    " | $query ";
    echo 
    " | $regexpr ";
    echo 
    " | $warningvalue ";
    echo 
    " | $criticalvalue "
    Beim aufruf bekomme ich folgendenFehler "Parameter PHP Notice: Undefined index"


    Ist mein Vorhaben mit meinem Ansatz durchführbar?
    Wenn ja, wäre ich dankbar für Tipps oder mögliche Alternativen.

    Einen Kommentar schreiben:


  • harrier21a
    antwortet
    Hab es mitlerweile hinbekommen, über $argv[]

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    http://www.php.net/manual/de/language.types.array.php

    sonst glaub ich auch nicht, dass das so mit den leerzeichen klappt.

    fehlersuche immer gut mit:

    http://php-de.github.io/

    Einen Kommentar schreiben:

Lädt...
X