Ad Widget

Collapse

json-rpc и perl

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • noname
    Senior Member
    • Jan 2008
    • 120

    #1

    json-rpc и perl

    наваял простенький скрипт:

    #!/usr/bin/perl -w
    use strict;

    use JSON::RPC::Client;
    use JSON;

    my $client = new JSON::RPC::Client;
    my $url = 'http://hostname/api_jsonrpc.php';
    my ($user, $password) = ('user', 'pass');
    my $object1 = {
    jsonrpc => '2.0',
    method => 'user.authenticate',
    id => 1,
    params => { 'user' => $user, 'password' => $password }
    };

    my $result = $client->call( $url, $object1);
    my $sessionid = $result->result unless $result->is_error;
    print "Result: ", $sessionid, "\n";

    my $object2 = {
    jsonrpc => '2.0',
    method => 'Host.getById',
    id => 2,
    auth => $sessionid,
    params => { 'hostid' => '10047' }
    };
    $result = $client->call( $url, $object2);
    print "Error: ", to_json( $result->error_message), "\n";

    Результат выглядит как-то так:
    Result: 9e085beb7e87d0910fc1d00b62c619e4
    Error: {"data":"Action does not exists","message":"Invalid params.","code":-32602}


    Вопрос: что я делаю неправильно во втором вызове? Хочу получить информацию о хосте.
  • Aly
    ZABBIX developer
    • May 2007
    • 1126

    #2
    host.getByID не существует данного метода, что в ответе и говорится. Используйте:

    my $object2 = {
    jsonrpc => '2.0',
    method => 'host.get',
    id => 2,
    auth => $sessionid,
    params => { 'hostids' => {'10047'}, 'extendoutput'=> 1 }
    };
    Zabbix | ex GUI developer

    Comment

    • noname
      Senior Member
      • Jan 2008
      • 120

      #3
      Так заработало.

      Правильно понимаю, что информация тут пока не соответствует действительности?:

      http://www.zabbix.com/documentation/...i/objects/host

      Comment

      • Aly
        ZABBIX developer
        • May 2007
        • 1126

        #4
        Да, несоответствует. АПИ еще в процессе изменений и улучшений. Я бы порекомендовал взять фронтенд от пре 1.8.1 и заглянуть в api/classes/, там не сложно найти вызовы нужных методов, да и это более свежий апи, который уже не будет сильно меняться.
        Zabbix | ex GUI developer

        Comment

        • noname
          Senior Member
          • Jan 2008
          • 120

          #5
          А почему, если вызов к json-rpc оформить так (код все тот же);
          my $object2 = {
          jsonrpc => '2.0',
          method => 'Host.add',
          id => 2,
          auth => $sessionid,
          params => { host => 'Test Server',
          groups => [6]
          }
          };

          То результат получается:
          Error: {"data":"Action does not exists","message":"Invalid params.","code":-32602}

          Группа с таким id существует:
          mysql> select name from groups where groupid = 6;
          +------------+
          | name |
          +------------+
          | Some Hosts |
          +------------+

          Все не опциональные параметры я указал:
          * Add Host
          *
          * {@source}
          * @access public
          * @static
          * @since 1.8
          * @version 1

          * @param _array $hosts multidimensional array with Hosts data
          * @param string $hosts['host'] Host name.
          * @param array $hosts['groups'] array of HostGroup objects with IDs add Host to.
          * @param int $hosts['port'] Port. OPTIONAL
          * @param int $hosts['status'] Host Status. OPTIONAL
          * @param int $hosts['useip'] Use IP. OPTIONAL
          * @param string $hosts['dns'] DNS. OPTIONAL
          * @param string $hosts['ip'] IP. OPTIONAL
          * @param int $hosts['proxy_hostid'] Proxy Host ID. OPTIONAL
          * @param int $hosts['useipmi'] Use IPMI. OPTIONAL
          * @param string $hosts['ipmi_ip'] IPMAI IP. OPTIONAL
          * @param int $hosts['ipmi_port'] IPMI port. OPTIONAL
          * @param int $hosts['ipmi_authtype'] IPMI authentication type. OPTIONAL
          * @param int $hosts['ipmi_privilege'] IPMI privilege. OPTIONAL
          * @param string $hosts['ipmi_username'] IPMI username. OPTIONAL
          * @param string $hosts['ipmi_password'] IPMI password. OPTIONAL
          * @return boolean

          Comment

          • noname
            Senior Member
            • Jan 2008
            • 120

            #6
            пользователем через веб-интерфейс могу создать хост, права необходимые делегированы.

            Comment

            • Aly
              ZABBIX developer
              • May 2007
              • 1126

              #7
              host.create
              Zabbix | ex GUI developer

              Comment

              • noname
                Senior Member
                • Jan 2008
                • 120

                #8
                Ээх, а вот это почему получается? (заменил на host.create):

                Error: {"data":"[ CHost::create ] You do not have enough rights for operation","message":"Application error.","code":-32500}

                Comment

                • Aly
                  ZABBIX developer
                  • May 2007
                  • 1126

                  #9
                  Парамтер groups должен содержать массив объектов типа group:
                  {
                  "host" => "hostname",
                  "groups" => { {"groupid"=>6}, ... }
                  }

                  Мы почти полностью отказались от перечисления айдишек, заменили их на массивы объектов, исключение *.get().
                  Zabbix | ex GUI developer

                  Comment

                  • noname
                    Senior Member
                    • Jan 2008
                    • 120

                    #10
                    Ясно. Спасибо огромное, работает так, как и ожидалось.

                    Comment

                    • noname
                      Senior Member
                      • Jan 2008
                      • 120

                      #11
                      А могу я по названию, а не по id искать хосты или же шаблоны, вот как-то так не получается:
                      my $object2 = {
                      jsonrpc => '2.0',
                      method => 'template.get',
                      id => 2,
                      auth => $sessionid,
                      params => { 'template' => [ 'Some Hosts' ], 'extendoutput'=> 1 }
                      };

                      Comment

                      • Aly
                        ZABBIX developer
                        • May 2007
                        • 1126

                        #12
                        template.getObjects({"template"=>"some template"})
                        Zabbix | ex GUI developer

                        Comment

                        • noname
                          Senior Member
                          • Jan 2008
                          • 120

                          #13
                          Как обновить массив итемов?:
                          Вот так работает (для одного итема):
                          ('item.update',
                          {
                          itemid => $temp[0], # массив @temp содержит список id итемов хоста
                          status => 1
                          });

                          А попытки вроде этого не проходят:
                          ('item.update',
                          {
                          items => [ { itemid => $temp[0] }, { itemid => $temp[1] } ],
                          status => 1
                          });

                          возвращает S_NO_PERMISSION.

                          Comment

                          • Aly
                            ZABBIX developer
                            • May 2007
                            • 1126

                            #14
                            Масс апдейты для айтемов еще не добавлены в апи, по этому придётся так:
                            ('item.update',
                            [ { itemid => $temp[0], status=>1 }, { itemid => $temp[1], status => 1 }]
                            );

                            Array of objects type of Item.
                            Zabbix | ex GUI developer

                            Comment

                            • noname
                              Senior Member
                              • Jan 2008
                              • 120

                              #15
                              Если я правильно понимаю Ваш пост, то вот это должно работать:
                              $object = {
                              jsonrpc => '2.0',
                              method => 'item.update',
                              id => $count++,
                              auth => $sessionid,
                              params => {
                              items => [{ itemid => $temp[0], status => 1 },
                              { itemid => $temp[1], status => 1 } ]
                              }
                              };

                              Однако это не так, ошибка та же.

                              Comment

                              Working...