Net-ILO
view release on metacpan or search on metacpan
lib/Net/ILO.pm view on Meta::CPAN
if (@_) {
$self->{_debug} = shift;
}
return $self->{_debug};
}
sub _detect_version {
my $self = shift;
# iLO 3 has a slightly different interface; it requires that
# you preface commands with an HTTP header
my $ilo_command = qq(
POST /ribcl HTTP/1.1
HOST: localhost
Content-length: 30
Connection: Close
<RIBCL VERSION="2.0"></RIBCL>
);
my $response = $self->_send($ilo_command) or return;
if ($response =~ /^HTTP\/1.1 200 OK/) {
return 3;
}
else {
return 2;
}
}
sub _disconnect {
my $self = shift;
my $client = $self->{_client} or return;
$client->close;
delete $self->{_client};
return 1;
}
sub _generate_cmd {
my ($self, $command) = @_;
my %commands = (
'get_embedded_health' => qq( <SERVER_INFO MODE="read">
<GET_EMBEDDED_HEALTH/>
</SERVER_INFO> ),
'get_fw_version' => qq( <RIB_INFO MODE="read">
<GET_FW_VERSION/>
</RIB_INFO> ),
'get_global_settings' => qq( <RIB_INFO MODE="read">
<GET_GLOBAL_SETTINGS/>
</RIB_INFO> ),
'get_host_data' => qq( <SERVER_INFO MODE="read">
<GET_HOST_DATA/>
</SERVER_INFO> ),
'get_network_settings' => qq( <RIB_INFO MODE="read">
<GET_NETWORK_SETTINGS/>
</RIB_INFO> ),
'power_consumption' => qq( <SERVER_INFO MODE="read">
<GET_POWER_READINGS/>
</SERVER_INFO> ),
'power_off' => qq( <SERVER_INFO MODE="write">
<SET_HOST_POWER HOST_POWER="No"/>
</SERVER_INFO> ),
'power_on' => qq( <SERVER_INFO MODE="write">
<SET_HOST_POWER HOST_POWER="Yes"/>
</SERVER_INFO> ),
'power_reset' => qq( <SERVER_INFO MODE="write">
<RESET_SERVER/>
</SERVER_INFO> ),
'power_status' => qq( <SERVER_INFO MODE="read">
<GET_HOST_POWER_STATUS/>
</SERVER_INFO> ),
'reset' => qq( <RIB_INFO MODE="write">
<RESET_RIB/>
</RIB_INFO> ),
'uid_off' => qq( <SERVER_INFO MODE="write">
<UID_CONTROL UID="No"/>
</SERVER_INFO> ),
'uid_on' => qq( <SERVER_INFO MODE="write">
<UID_CONTROL UID="Yes"/>
</SERVER_INFO> ),
'uid_status' => qq( <SERVER_INFO MODE="read">
<GET_UID_STATUS/>
</SERVER_INFO> ),
);
my $ilo_command = $commands{$command} or die "Internal error: command '$command' doesn't exist";
$ilo_command = $self->_wrap($ilo_command);
return $ilo_command;
}
sub _length {
# for iLO 3 we need to know the length of the XML for the
# Content-length field in the http header
my ($self, $ilo_command) = @_;
my $length = 0;
foreach my $line (split(/\n/, $ilo_command)) {
$line =~ s/^\s+//;
$line =~ s/\s+$//;
# each line has \r\n appended when sending, so + 2
$length += length($line) + 2;
}
return $length;
}
sub _populate_embedded_health {
my $self = shift;
my $ilo_command = $self->_generate_cmd('get_embedded_health');
my $response = $self->_send($ilo_command) or return;
my $xml = $self->_serialize($response) or return;
if ( my $errmsg = _check_errors($xml) ) {
$self->error($errmsg);
return;
}
my $fans = $xml->{GET_EMBEDDED_HEALTH_DATA}->{FANS}->{FAN};
my $power_supplies = $xml->{GET_EMBEDDED_HEALTH_DATA}->{POWER_SUPPLIES}->{SUPPLY};
my $temperatures = $xml->{GET_EMBEDDED_HEALTH_DATA}->{TEMPERATURE}->{TEMP};
foreach my $fan (@$fans) {
my $location = $fan->{ZONE}->{VALUE};
my $name = $fan->{LABEL}->{VALUE};
my $speed = $fan->{SPEED}->{VALUE};
my $status = $fan->{STATUS}->{VALUE};
my $unit = $fan->{SPEED}->{UNIT};
next unless $speed && $speed =~ /^\d+$/;
push( @{$self->{fans}}, {
'location' => $location,
'name' => $name,
'speed' => $speed,
'status' => $status,
'unit' => $unit,
});
}
foreach my $power_supply (@$power_supplies) {
my $name = $power_supply->{LABEL}->{VALUE};
my $status = $power_supply->{STATUS}->{VALUE};
next if $status eq 'Not Installed';
push( @{$self->{power_supplies}}, {
'name' => $name,
'status' => $status,
});
}
foreach my $temperature (@$temperatures) {
my $name = $temperature->{LABEL}->{VALUE};
my $location = $temperature->{LOCATION}->{VALUE};
my $value = $temperature->{CURRENTREADING}->{VALUE};
my $unit = $temperature->{CURRENTREADING}->{UNIT};
my $caution = $temperature->{CAUTION}->{VALUE};
my $critical = $temperature->{CRITICAL}->{VALUE};
my $status = $temperature->{STATUS}->{VALUE};
next unless $value && $value =~ /^\d+$/;
push( @{$self->{temperatures}}, {
'name' => $name,
'location' => $location,
'value' => $value,
'unit' => $unit,
'caution' => $caution,
'critical' => $critical,
'status' => $status,
});
}
return 1;
( run in 3.319 seconds using v1.01-cache-2.11-cpan-71847e10f99 )