Ad Widget

Collapse

Perl Zabbix API: всё одной командой и море документаци

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • DRVTiny
    Senior Member
    • Sep 2011
    • 162

    #16
    Дописаны дополнительные возможности, которых нет в оригинальном API:
    1) Параметр selectPasswds в методе user.get позволяет получить пароли из базы данных в том виде, в котором они в ней хранятся (хэши)
    2) Пароли, полученные с помощью selectPasswds при использовании метода user.get будут особым образом обработаны методом user.create:
    непосредственно API будут переданы "фейковые" пароли (сформированные из первых 10-ти символов хэша), а "настоящие" - будут записаны напрямую в базу данных.

    Таким образом, вы теперь можете взять учётную запись пользователя с одного сервера Zabbix и скопировать её на другой сервер или даже на этот же самый, но уже под другим именем.

    Пример (выкладываю полный текст тестовой программы) :
    Code:
    #!/usr/bin/perl -CDA
    use strict;
    use utf8;
    use constant {
         SETENV_FILE=>'setenv_test.conf',
         TIMEZONE=>'MSK',
    };
    my %SETENV;
    
    BEGIN {
     open (FH,'<',substr($0,0,rindex($0,'/')).'/'.SETENV_FILE) || die 'Cant set environment: '.SETENV_FILE.' not found!';
     %SETENV=map { chomp; $_=~m/^\s*(?<KEY>[A-Za-z0-9_-]+)\s*=\s*(?:(?<QUO>['"])(?<VAL>[^\g{QUO}]+?)\g{QUO}|(?<VAL>[^'"[:space:]]+?))\s*$/?($+{'KEY'},$+{'VAL'}):('NOTHING','NOWHERE') } grep { $_ !~ m/^\s*(?:#.*)?$/ } <FH>;
     push @INC,split(/\;/,$SETENV{'PERL_LIBS'}) if $SETENV{'PERL_LIBS'};
     close(FH);
    }
    
    use Monitoring::Zabipi qw(zbx zbx_last_err);
    no warnings;
    
    sub doRDKFH {
     my ($hr,$k)=@_;
     if (ref($hr) eq 'ARRAY') {
      map {doRDKFH($_,$k)} grep {ref($_) eq 'HASH' or ref($_) eq 'ARRAY'} @{$hr}
     } else {
      delete @{$hr}{ref($k)?@$k:($k)};
      map {doRDKFH($_,$k)} grep {ref($_) eq 'HASH' or ref($_) eq 'ARRAY'} values $hr
     }
    }
    
    my %FE;
    @FE{('login','server','pass')}=@SETENV{('ZBX_LOGIN','ZBX_HOST','ZBX_PASS')};
    
    my $firstarg=shift;
    my $apiPars={'wildcards'=>'true',
                 'pretty'=>'true',
                 'dbDSN'=>join('','dbi:mysql:database=',$SETENV{'MYSQL_DB'},';host=',$SETENV{'MYSQL_HOST'}),
                 'dbLogin'=>$SETENV{'MYSQL_USER'},
                 'dbPass'=>$SETENV{'MYSQL_PASS'},
    };
    if ($firstarg eq '-x') {
     $apiPars->{'debug'}=1;
    } else {
     unshift @ARGV,$firstarg;
    }
    
    Monitoring::Zabipi->new($FE{'server'},$apiPars);
    zbx('auth',$FE{'login'},$FE{'pass'}) || die 'Oh, shit, i cant authorize you on '.$FE{'server'}."\!\n";
    
    my $usr=zbx('user.get',{'search'=>{'alias'=>'akonovalov'},'selectPasswd'=>1,'selectMedias'=>'extend','selectUsrgrps'=>['usrgrpid']})->[0];
    
    $usr->{'alias'}='AndreyKonovalovAmazing';
    doRDKFH($usr,['mediaid','userid']);
    $usr->{'user_medias'}=delete $usr->{'medias'};
    
    zbx('user.create',$usr);
    
    END {
     zbx('logout');
    }

    Comment

    • molody
      Junior Member
      • Aug 2015
      • 22

      #17
      Zabbix 2.4 Поменялся синтаксис Host.delete
      {
      "jsonrpc": "2.0",
      "method": "host.delete",
      "params": [
      "13",
      "32"
      ],
      "auth": "038e1d7b1735c6a5436ee9eae095879e",
      "id": 1
      }

      Через API выдает ошибку
      Not an ARRAY reference at /usr/local/lib/perl5/5.14.2/Monitoring/Zabipi.pm line 400.

      Так-же на мой взгляд не совсем правильно к ссылке Хоста добавлять /zabbix/
      так как не всегда он хранится там ....
      Все остально работает хорошо и быстрее других аналогов, большое спасибо

      Comment

      • natalia
        Senior Member
        • Apr 2013
        • 159

        #18
        Originally posted by Jimson
        мне хватает маленького класса у которого есть конструктор (создает LWP::au и логинится) и метода аля query выполняющего запрос, вся логика остается в приложении.
        Мне нужно только Administration -> Queue "Overview by proxy"
        Можете написать как это получить ?
        Заранее спасибо за помощь!

        Comment

        • natalia
          Senior Member
          • Apr 2013
          • 159

          #19
          Originally posted by DRVTiny
          Добавил веб-метод queue.get, позволяющий получить содержимое очереди ожидающих итемов.

          В качестве примера использования этого метода добавил detect_problem_hosts.pl в examples/

          Думаю над тем, чтобы добавить получение png-картинок графиков, хотя не факт, что это кому-нибудь нужно.
          Здравствуйте,

          Я пытаюсь запустить detect_problem_hosts.pl , но получаю следующую ошибку:

          Type of arg 1 to each must be hash (not hash element) at /usr/share/perl5/Monitoring/Zabipi.pm line 350, near "}) "
          Compilation failed in require at ./detect_problem_hosts.pl line 19.
          BEGIN failed--compilation aborted at ./detect_problem_hosts.pl line 19.

          line 19 это "use Monitoring::Zabipi qw(zbx);"

          Что здесь не так?
          Не могли бы вы поделиться, что должно быть в setenv.conf ?

          Спасибо за помощь!

          Comment

          • Jimson
            Senior Member
            • Jan 2008
            • 1327

            #20
            Судя по 348 и 350 строке модуля это какая то "упущенная мысль", т.е. проверка идет на HASH или ARRAY, а затем делается each, который может работать только с хэшем. Придется ждать DRVTiny.

            P.S. DRVTiny: autoref/deref нынче отменили, надо возвращаться к %{$hashref}, это так же касается pop/push/shift/unshift и прочего.

            Comment

            • natalia
              Senior Member
              • Apr 2013
              • 159

              #21
              Originally posted by Jimson
              Придется ждать DRVTiny.
              можете пока написать как вы делаете ? очень нужно Administration -> Queue "Overview by proxy" :
              Originally posted by Jimson
              мне хватает маленького класса у которого есть конструктор (создает LWP::au и логинится) и метода аля query выполняющего запрос, вся логика остается в приложении.
              спасибо за помощь!

              Comment

              • Jimson
                Senior Member
                • Jan 2008
                • 1327

                #22
                И чем именно я могу помочь? API описано в документации. Что же касается работы с API из перла, то мне хватает IO::Socket::INET, JSON и pack/unpack.

                Comment

                • natalia
                  Senior Member
                  • Apr 2013
                  • 159

                  #23
                  Originally posted by Jimson
                  И чем именно я могу помочь? API описано в документации. Что же касается работы с API из перла, то мне хватает IO::Socket::INET, JSON и pack/unpack.
                  как вытащить : Queue "Overview by proxy" ?
                  такого API нет ...

                  Comment

                  • Jimson
                    Senior Member
                    • Jan 2008
                    • 1327

                    #24
                    Найти код, генерящий эту страницу, в фронтэнде (php) и посмотреть как там это сделано. Вполне возможно что для этой задачи нет API.

                    Comment

                    • natalia
                      Senior Member
                      • Apr 2013
                      • 159

                      #25
                      Originally posted by jimson
                      Найти код, генерящий эту страницу, в фронтэнде (php) и посмотреть как там это сделано. Вполне возможно что для этой задачи нет api.
                      это не так-то просто, пока у меня не получается ... иначе я бы тут не писала

                      Comment

                      • DRVTiny
                        Senior Member
                        • Sep 2011
                        • 162

                        #26
                        Originally posted by natalia
                        Здравствуйте,

                        Я пытаюсь запустить detect_problem_hosts.pl , но получаю следующую ошибку:

                        Type of arg 1 to each must be hash (not hash element) at /usr/share/perl5/Monitoring/Zabipi.pm line 350, near "}) "
                        Compilation failed in require at ./detect_problem_hosts.pl line 19.
                        BEGIN failed--compilation aborted at ./detect_problem_hosts.pl line 19.

                        line 19 это "use Monitoring::Zabipi qw(zbx);"

                        Что здесь не так?
                        Не могли бы вы поделиться, что должно быть в setenv.conf ?

                        Спасибо за помощь!
                        Наталия!

                        Я исправил "баг", который, видимо, появляется на более свежих версиях Perl, чем у меня. Попробуйте обновить модуль.

                        UPD;
                        Переписал detect_problem_hosts.pl на базе prolgue.pl
                        Last edited by DRVTiny; 02-01-2016, 17:13.

                        Comment

                        • DRVTiny
                          Senior Member
                          • Sep 2011
                          • 162

                          #27
                          Originally posted by Jimson
                          Найти код, генерящий эту страницу, в фронтэнде (php) и посмотреть как там это сделано. Вполне возможно что для этой задачи нет API.
                          Идея API - в создании слоя абстракции, позволяющего оперировать высокоуровневыми сущностями наподобие "объектов Zabbix API". В этом плане залезание в чужой код мало что даст.

                          На мой взгляд, подход при котором отсутствующая функциональность JSON RPC на стороне фронтэнда компенсируется функционалом API, подключаемого на стороне приложения, запрашивающего данные - принципиально верна.

                          В противном случае легче пользоваться базой zabbix напрямую.

                          Comment

                          • alex5678
                            Junior Member
                            • Dec 2015
                            • 6

                            #28
                            Originally posted by drvtiny
                            В противном случае легче пользоваться базой zabbix напрямую.
                            Осталось разобраться как именно искать нужную информацию в базе данных. Информации по структуре базы данных в открытом доступе нет, а самому разобраться с лету не получилось.

                            Comment

                            • yukra
                              Senior Member
                              • Apr 2013
                              • 1359

                              #29
                              Originally posted by alex5678
                              Информации по структуре базы данных в открытом доступе нет, а самому разобраться с лету не получилось.
                              Исходники открыты, а именно они и есть "информация о структуке БД" ибо всегда актуальны.
                              А что ищете то?

                              Comment

                              • alex5678
                                Junior Member
                                • Dec 2015
                                • 6

                                #30
                                Например, есть сенсор процесса IP SLA с известным serviceid.

                                Пытаюсь получить данные (список событий, сформированный тригером) по доступности объекта с этим сенсором по API. Не получается, хотя эти данные в вебинтерфейсе забикса видны.

                                Как получить их из базы данных или по API?

                                Comment

                                Working...