Ad Widget

Collapse

hp-msa. Perl. HEEElp СКРИПТ

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • inikulin
    Junior Member
    • Jun 2017
    • 8

    #1

    hp-msa. Perl. HEEElp СКРИПТ

    Добрый день.
    Прошу помочь с скриптом.
    суть такая: имеется шаблон и скрипт к нему, который представлен ниже. с программированием у меня не оч. знаю только основы 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);
    }
Working...