Дописаны дополнительные возможности, которых нет в оригинальном API:
1) Параметр selectPasswds в методе user.get позволяет получить пароли из базы данных в том виде, в котором они в ней хранятся (хэши)
2) Пароли, полученные с помощью selectPasswds при использовании метода user.get будут особым образом обработаны методом user.create:
непосредственно API будут переданы "фейковые" пароли (сформированные из первых 10-ти символов хэша), а "настоящие" - будут записаны напрямую в базу данных.
Таким образом, вы теперь можете взять учётную запись пользователя с одного сервера Zabbix и скопировать её на другой сервер или даже на этот же самый, но уже под другим именем.
Пример (выкладываю полный текст тестовой программы) :
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