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

  • [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.

  • #2
    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/

    Kommentar


    • #3
      Hab es mitlerweile hinbekommen, über $argv[]

      Kommentar


      • #4
        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.

        Kommentar


        • #5
          Deine Lösung
          PHP-Code:
          $_array explode' '$string ); 

          Kommentar


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

            Kommentar


            • #7
              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"
              }
              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

              Kommentar


              • #8
                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.

                Kommentar


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

                  Im Code des Ausgangspost waren ja gleich mehrere Fehler enthalten...
                  Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                  Kommentar


                  • #10
                    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.

                    Kommentar


                    • #11
                      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']; 
                      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                      Kommentar

                      Lädt...
                      X