#!/usr/bin/perl use warnings; use strict; use LWP::UserAgent; use Digest::MD5 qw(md5_hex); use XML::Simple; use JSON; my $zabbixSender="/usr/bin/zabbix_sender"; my $zabbixConfd="/etc/zabbix/zabbix_agentd.conf"; my $sendFile="/var/tmp/zabbixSenderHPP2000"; my $zabbixSendCommand="$zabbixSender -c $zabbixConfd -i "; my $USERNAME = "XXXXX"; my $PASSWORD = "XXXXX"; sub getHPP200Objects { my $ua = shift; my $sessionKey = shift; my $url = shift; my $objectName = shift; my $idName = shift; my $type = shift; my $zbxArray = shift; my $req = HTTP::Request->new(GET => $url); $req->header('sessionKey' => $sessionKey ); $req->header('dataType' => 'api' ); my $res = $ua->request($req); my $ref = XMLin($res->content, KeyAttr => "oid"); foreach my $oid (values %{$ref->{OBJECT}}) { #### my $reference; foreach my $entry (@{$oid->{PROPERTY}}) { if ($entry->{name} =~ /^($idName)$/) { $reference = {'{#HP_P2000_ID}' => $entry->{content}, '{#HP_P2000_TYPE}' => $type}; last; } } push @{$zbxArray}, {%{$reference}}; } } } sub getHPP200Stats { my $ua = shift; my $sessionKey = shift; my $url = shift; my $objectName = shift; my $idName = shift; my $colHash = shift; my $req = HTTP::Request->new(GET => $url); $req->header('sessionKey' => $sessionKey ); $req->header('dataType' => 'api' ); my $res = $ua->request($req); my $ref = XMLin($res->content, KeyAttr => "oid"); foreach my $oid (values %{$ref->{OBJECT}}) { if ($oid->{name} eq $objectName) { my $reference; my $hashKey; foreach my $entry (@{$oid->{PROPERTY}}) { if ($entry->{name} =~ /^($idName|bytes-per-second-numeric|iops|number-of-reads|number-of-writes|data-read-numeric|data-written-numeric)$/) { my $key = $1; if ($key =~ /durable-id/) { $hashKey = lc($entry->{content}); } elsif ($key eq $idName) { $hashKey = $entry->{content}; } else { $reference->{$key} = $entry->{content}; } } } $colHash->{$hashKey} = {%{$reference}}; } } } sub getZabbixValues { my $hostname = shift; my $colHash = shift; my $type = shift; my $outputString = ""; foreach my $key (keys %{$colHash}) { foreach my $itemKey (keys %{$colHash->{$key}}) { $outputString .= "$hostname hp.p2000.stats[$type,$key,$itemKey] $colHash->{$key}->{$itemKey}\n"; } } $outputString; } sub logOut { my $ua = shift; my $sessionKey = shift; my $hostname = shift; my $url = "https://$hostname/api/exit"; my $req = HTTP::Request->new(GET => $url); $req->header('sessionKey' => $sessionKey ); $req->header('dataType' => 'api' ); $ua->request($req); } my $hostname = $ARGV[0] or die("Usage: hp-msa-lld.pl [lld|stats]"); my $function = $ARGV[1] || 'lld'; die("Usage: hp-msa-lld.pl [lld|stats]") unless ($function =~ /^(lld|stats)$/); my $md5_data = "${USERNAME}_${PASSWORD}"; my $md5_hash = md5_hex( $md5_data ); my $ua = LWP::UserAgent->new; my $url = "https://$hostname/api/login/" . $md5_hash; my $req = HTTP::Request->new(GET => $url); my $res = $ua->request($req); my $ref = XMLin($res->content); my $sessionKey; if (exists $ref->{OBJECT}->{PROPERTY}->{"return-code"} && $ref->{OBJECT}->{PROPERTY}->{"return-code"}->{content} == 1) { $sessionKey = $ref->{OBJECT}->{PROPERTY}->{"response"}->{content}; } else { die($ref->{OBJECT}->{PROPERTY}->{"response"}->{content}); } if ($function eq 'lld') { my $zbxArray = []; getHPP200Objects ( $ua, $sessionKey, "https://$hostname/api/show/controllers", "controllers", "durable-id", "Controller", $zbxArray); getHPP200Objects ( $ua, $sessionKey, "https://$hostname/api/show/vdisks", "virtual-disk", "name", "Vdisk", $zbxArray); getHPP200Objects ( $ua, $sessionKey, "https://$hostname/api/show/volumes", "volume", "volume-name", "Volume", $zbxArray); print to_json({data => $zbxArray} , { ascii => 1, pretty => 1 }) . "\n"; logOut($ua, $sessionKey, $hostname); } else { my $ctrls = {}; my $vdisks = {}; my $volumes = {}; my $outputString = ""; getHPP200Stats ( $ua, $sessionKey, "https://$hostname/api/show/controller-statistics", "controller-statistics", "durable-id", $ctrls); getHPP200Stats ( $ua, $sessionKey, "https://$hostname/api/show/vdisk-statistics", "vdisk-statistics", "name", $vdisks); getHPP200Stats ( $ua, $sessionKey, "https://$hostname/api/show/volume-statistics", "volume-statistics", "volume-name", $volumes); logOut($ua, $sessionKey, $hostname); $outputString .= getZabbixValues($hostname, $ctrls, "Controller"); $outputString .= getZabbixValues($hostname, $vdisks, "Vdisk"); $outputString .= getZabbixValues($hostname, $volumes, "Volume"); $sendFile .= "_${hostname}_$$"; die "Could not open file $sendFile!" unless (open(FH, ">", $sendFile)); print FH $outputString; die "Could not close file $sendFile!" unless (close(FH)); $zabbixSendCommand .= $sendFile; if ( qx($zabbixSendCommand) =~ /Failed 0/ ) { $res = 1; } else { $res = 0; } die "Can not remove file $sendFile!" unless(unlink ($sendFile)); print "$res\n"; exit ($res - 1); } #### $VAR1 = { 'OBJECT' => { 'PROPERTY' => [ { 'content' => 'error', 'name' => 'response-type' }, { 'content' => '1', 'name' => 'response-type-numeric' }, { 'content' => 'Unauthorized access requested', 'name' => 'response' }, { 'content' => '6', 'name' => 'return-code' } ], 'oid' => '1', 'name' => 'status', 'basetype' => 'status' } }; Not a HASH reference at ./hp-msa.pl line 19.