Добрый день.
Прошу помочь с скриптом.
суть такая: имеется шаблон и скрипт к нему, который представлен ниже. с программированием у меня не оч. знаю только основы perl. помогите разобраться в скрипте, что где как он делает, как работает??
буду благодарен
Прошу помочь с скриптом.
суть такая: имеется шаблон и скрипт к нему, который представлен ниже. с программированием у меня не оч. знаю только основы perl. помогите разобраться в скрипте, что где как он делает, как работает??
буду благодарен
Code:
#!/usr/bin/speedy
use warnings;
use strict;
use LWP::UserAgent;
use LWP::Protocol::http;
use Digest::MD5 qw(md5_hex);
use XML::Simple;
use Data::Dumper;
use JSON;
use File::Slurp;
$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0; # No SSL cert verification
sub getHPP200Objects {
my $ua = shift;
my $sessionKey = shift;
my $url = shift;
my $objectName = shift;
my $idName = shift;
my $type = shift;
my $zbxArray = shift;
my $skfile = shift;
my $cacheminutes = 3;
my $cachecontent = "";
my $cachefile = "/tmp/hp-msa.obj.".$objectName.".tmp";
my $cachestat = 0;
if (-e $cachefile) {
$cachecontent = read_file($cachefile);
$cachestat = (stat $cachefile)[9];
}
if ((time - $cachestat > $cacheminutes * 60) || ($cachecontent eq ""))
{
#cachefile age is more than $cacheminute
# print "requesting ...";
my $req = HTTP::Request->new(GET => $url);
my $cookie = "wbiusername=monitor; wbisessionkey=" . $sessionKey;
$req->header('Cookie' => $cookie);
$req->header('sessionKey' => $sessionKey );
$req->header('dataType' => 'api' );
my $res = $ua->request($req);
$cachecontent = $res->content;
write_file($cachefile, $cachecontent);
} else
{
# print "from cache";
}
my $ref = XMLin($cachecontent);
if (exists $ref->{OBJECT}->{PROPERTY}->{"response-type"}) {
if ( $ref->{OBJECT}->{PROPERTY}->{"response-type"}->{content} eq "error") {
unlink glob $cachefile;
unlink glob $skfile;
return;
}
}
$ref = XMLin($cachecontent, KeyAttr => "oid");
foreach my $oid (values %{$ref->{OBJECT}}) {
if ($oid->{name} eq $objectName) {
my $reference;
foreach my $entry (@{$oid->{PROPERTY}}) {
if ($entry->{name} =~ /^($idName)$/) {
$reference = {'{#KEY}' => $entry->{content}, '{#CLASS}' => $type};
last;
}
}
push @{$zbxArray}, {%{$reference}};
}
}
}
sub getHPP2000StatObj {
#print "Funktion";
my $ua = shift;
my $sessionKey = shift;
my $url = shift;
my $objectName = shift;
my $idName = shift;
my $id = shift;
my $key = shift;
my $skfile = shift;
my $cacheminutes = 3;
my $cachecontent = "";
my $cachefile = "/tmp/hp-msa.obj.".$objectName.".tmp";
my $cachestat = 0;
if (-e $cachefile) {
$cachecontent = read_file($cachefile);
$cachestat = (stat $cachefile)[9];
}
if ((time - $cachestat > $cacheminutes * 60) || ($cachecontent eq ""))
{
#cachefile age is more than $cacheminute
# print "requesting ...";
my $req = HTTP::Request->new(GET => $url);
my $cookie = "wbiusername=monitor; wbisessionkey=" . $sessionKey;
$req->header('Cookie' => $cookie);
$req->header('sessionKey' => $sessionKey );
$req->header('dataType' => 'api' );
my $res = $ua->request($req);
$cachecontent = $res->content;
write_file($cachefile, $cachecontent);
} else
{
# print "from cache";
}
my $ref = XMLin($cachecontent);
if (exists $ref->{OBJECT}->{PROPERTY}->{"response-type"}) {
if ( $ref->{OBJECT}->{PROPERTY}->{"response-type"}->{content} eq "error") {
unlink glob $cachefile;
unlink glob $skfile;
return;
}
}
$ref = XMLin($cachecontent, KeyAttr => "oid");
# print Dumper ($ref);
foreach my $oid (values %{$ref->{OBJECT}}) {
if ($oid->{name} eq $objectName) {
#print Dumper(\$oid);
my $reference;
my $hashKey = {};
#print $oid->{'PROPERTY'}[0]->{'content'};
foreach my $entry (@{$oid->{PROPERTY}}) {
if($entry->{name} eq $idName && $entry->{content} eq $id){
foreach my $entry2 (@{$oid->{PROPERTY}}) {
if($entry2->{name} eq $key){
print $entry2->{content};
return;
}
}
last;
}
}
}
}
}
sub logOut {
my $ua = shift;
my $sessionKey = shift;
my $hostname = shift;
my $url = "http://$hostname/api/exit";
my $req = HTTP::Request->new(GET => $url);
$req->header('sessionKey' => $sessionKey );
$req->header('dataType' => 'api' );
my $cookie = "wbiusername=monitor; wbisessionkey=" . $sessionKey;
$req->header('Cookie' => $cookie);
$ua->request($req);
}
sub LogIn {
my $ua = shift;
my $sessionKey = shift;
my $skfile = shift;
my $hostname = shift;
my $USERNAME = shift;
my $PASSWORD = shift;
my $md5_data = "${USERNAME}_${PASSWORD}";
my $md5_hash = md5_hex( $md5_data );
# print Dumper( $md5_hash );
my $url = "http://$hostname/api/login/" . $md5_hash;
my $req = HTTP::Request->new(GET => $url);
# my $cookie = "wbiusername=monitor";
# $req->header('Cookie' => $cookie);
my $res = $ua->request($req);
# print Dumper ($USERNAME, $PASSWORD);
my $ref = XMLin($res->content);
if (exists $ref->{OBJECT}->{PROPERTY}->{"return-code"} && $ref->{OBJECT}->{PROPERTY}->{"return-code"}->{content} == 1) {
$sessionKey = $ref->{OBJECT}->{PROPERTY}->{"response"}->{content};
write_file($skfile, $sessionKey);
} else {
die($ref->{OBJECT}->{PROPERTY}->{"response"}->{content});
}
}
my $sessionKey = "";
my $skfile = "/tmp/hp-msa.sk.tmp";
if (-e $skfile) { $sessionKey = read_file($skfile); }
# print Dumper ($sessionKey);
my $hostname = $ARGV[0] or die("Usage: hp-msa.pl <HOSTNAME> <USERNAME> <PASSWORD> [lld|stats]");
my $USERNAME = $ARGV[1] or die("Usage: hp-msa.pl <HOSTNAME> <USERNAME> <PASSWORD> [lld|stats]");
my $PASSWORD = $ARGV[2] or die("Usage: hp-msa.pl <HOSTNAME> <USERNAME> <PASSWORD> [lld|stats]");
my $function = $ARGV[3] || 'lld';
die("Usage: hp-msa.pl <HOSTNAME> <USERNAME> <PASSWORD> [lld|stats]") unless ($function =~ /^(lld|stats|data)$/);
# sleep (int(rand(2)) + 1); #Random delay 1-5 seconds
my $ua = LWP::UserAgent->new;
if ($sessionKey eq "")
{
# print "auth!";
LogIn ($ua, $sessionKey, $skfile, $hostname, $USERNAME, $PASSWORD );
}
# print Dumper ( $res );
if ($function eq 'lld') {
my $zbxArray = [];
if($ARGV[4] eq "disk"){
getHPP200Objects ( $ua, $sessionKey, "http://$hostname/api/show/disks", "drive", "durable-id", "Disk", $zbxArray, $skfile);
}
elsif($ARGV[4] eq "controller"){
getHPP200Objects ( $ua, $sessionKey, "http://$hostname/api/show/controllers", "controllers", "controller-id", "Controller", $zbxArray, $skfile);
}
elsif($ARGV[4] eq "volume"){
getHPP200Objects ( $ua, $sessionKey, "http://$hostname/api/show/volumes", "volume", "volume-name", "Volume", $zbxArray, $skfile);
}
elsif($ARGV[4] eq "vdisk"){
getHPP200Objects ( $ua, $sessionKey, "http://$hostname/api/show/vdisks", "virtual-disk", "name", "Vdisk", $zbxArray, $skfile);
}
elsif($ARGV[4] eq "enclosure"){
getHPP200Objects ( $ua, $sessionKey, "http://$hostname/api/show/enclosures", "enclosures", "enclosure-id", "Enclosure", $zbxArray, $skfile);
}
print to_json({data => $zbxArray} , { ascii => 1, pretty => 1 }) . "\n";
# logOut($ua, $sessionKey, $hostname);
}
elsif($function eq "data") {
if($ARGV[4] eq "disk"){
getHPP2000StatObj ( $ua, $sessionKey, "http://$hostname/api/show/disks", "drive", "durable-id", $ARGV[5], $ARGV[6], $skfile);
}
elsif($ARGV[4] eq "controller"){
getHPP2000StatObj ( $ua, $sessionKey, "http://$hostname/api/show/controllers", "controllers", "controller-id", $ARGV[5], $ARGV[6], $skfile);
}
elsif($ARGV[4] eq "volume"){
getHPP2000StatObj ( $ua, $sessionKey, "http://$hostname/api/show/volumes", "volume", "volume-name", $ARGV[5], $ARGV[6], $skfile);
}
elsif($ARGV[4] eq "vdisk"){
getHPP2000StatObj ( $ua, $sessionKey, "http://$hostname/api/show/vdisks", "virtual-disk", "name", $ARGV[5], $ARGV[6], $skfile);
}
elsif($ARGV[4] eq "enclosure"){
getHPP2000StatObj ( $ua, $sessionKey, "http://$hostname/api/show/enclosures", "enclosures", "enclosure-id", $ARGV[5], $ARGV[6], $skfile);
}
# logOut($ua, $sessionKey, $hostname);
}