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 )