# # (c) Jan Gehring <jan.gehring@gmail.com> # # vim: set ts=2 sw=2 tw=0: # vim: set expandtab: package Rex::Inventory::HP::ACU; use strict; use warnings; our $VERSION = '1.7.0'; # VERSION use Rex::Commands::Run; use Rex::Helper::Run; sub get { if ( can_run("hpacucli") ) { my @lines = i_run "/usr/sbin/hpacucli controller all show config detail", fail_ok => 1; my $ret = parse_config(@lines); return $ret; } else { return 0; } } # # The bellow code is from Parse::HP::ACU # # Copyright 2010 Jeremy Cole. # # This program is free software; you can redistribute it and/or modify it # under the terms of either: the GNU General Public License as published # by the Free Software Foundation; or the Artistic License. # # See http://dev.perl.org/licenses/ for more information. # sub parse_config { my (@lines) = @_; my $controller = {}; my $current_controller = 0; my $current_array = undef; my $current_logical_drive = undef; my $current_mirror_group = undef; my $current_physical_drive = undef; LINE: for my $line (@lines) { chomp $line; next if ( $line =~ /^$/ ); if ( $line !~ /^[ ]+/ ) { $current_controller = $current_controller + 1; $current_array = undef; $current_logical_drive = undef; $current_mirror_group = undef; $current_physical_drive = undef; $controller->{$current_controller} = {}; $controller->{$current_controller}->{'description'} = $line; next; } next if ( !defined($current_controller) ); $line =~ s/^\s+//g; $line =~ s/\s+$//g; $line =~ s/[ ]+/ /g; if ( $line =~ /unassigned/ ) { $current_array = "unassigned"; $current_logical_drive = undef; $current_mirror_group = undef; $current_physical_drive = undef; $controller->{$current_controller}->{'unassigned'} = {}; $controller->{$current_controller}->{'unassigned'}->{'physical_drive'} = {}; next; } if ( $line =~ /Array: ([A-Z]+)/ ) { $current_array = $1; $current_logical_drive = undef; $current_mirror_group = undef; $current_physical_drive = undef; $controller->{$current_controller}->{'array'}->{$current_array} = {}; $controller->{$current_controller}->{'array'}->{$current_array} ->{'logical_drive'} = {}; $controller->{$current_controller}->{'array'}->{$current_array} ->{'physical_drive'} = {}; next; } if ( $line =~ /Logical Drive: ([0-9]+)/ ) { $current_logical_drive = $1; $current_physical_drive = undef; $current_mirror_group = undef; $controller->{$current_controller}->{'array'}->{$current_array} ->{'logical_drive'}->{$current_logical_drive} = {}; $controller->{$current_controller}->{'array'}->{$current_array} ->{'logical_drive'}->{$current_logical_drive}->{'mirror_group'} = {}; next; } if ( $line =~ /physicaldrive ([0-9IC:]+)/ and $line !~ /port/ ) { $current_logical_drive = undef; $current_physical_drive = $1; $current_mirror_group = undef; if ( $current_array eq 'unassigned' ) { $controller->{$current_controller}->{'unassigned'}->{'physical_drive'} ->{$current_physical_drive} = {}; } else { $controller->{$current_controller}->{'array'}->{$current_array} ->{'physical_drive'}->{$current_physical_drive} = {}; } next; } if ( $line =~ /Mirror Group ([0-9]+):/ ) { $current_mirror_group = $1; $controller->{$current_controller}->{'array'}->{$current_array} ->{'logical_drive'}->{$current_logical_drive}->{'mirror_group'} ->{$current_mirror_group} = []; next; } if ( defined($current_array) and defined($current_logical_drive) and defined($current_mirror_group) ) { if ( $line =~ /physicaldrive ([0-9IC:]+) \(/ ) { my $current_mirror_group_list = $controller->{$current_controller}->{'array'}->{$current_array} ->{'logical_drive'}->{$current_logical_drive}->{'mirror_group'} ->{$current_mirror_group}; foreach my $pd ( @{$current_mirror_group_list} ) { next LINE if ( $pd eq $1 ); } push @{$current_mirror_group_list}, $1; } next; } if ( defined($current_array) and defined($current_logical_drive) ) { if ( my ( $k, $v ) = &K_V($line) ) { next unless defined($k); $controller->{$current_controller}->{'array'}->{$current_array} ->{'logical_drive'}->{$current_logical_drive}->{$k} = $v; } next; } if ( defined($current_array) and defined($current_physical_drive) ) { if ( my ( $k, $v ) = &K_V($line) ) { next unless defined($k); if ( $current_array eq 'unassigned' ) { $controller->{$current_controller}->{'unassigned'} ->{'physical_drive'}->{$current_physical_drive}->{$k} = $v; } else { $controller->{$current_controller}->{'array'}->{$current_array} ->{'physical_drive'}->{$current_physical_drive}->{$k} = $v; } } next; } if ( defined($current_array) ) { if ( my ( $k, $v ) = &K_V($line) ) { next unless defined($k); $controller->{$current_controller}->{'array'}->{$current_array}->{$k} = $v; } next; } if ( my ( $k, $v ) = &K_V($line) ) { next unless defined($k); $controller->{$current_controller}->{$k} = $v; } next; } return $controller; } sub K { my ($k) = @_; $k = lc $k; $k =~ s/[ \/\-]/_/g; $k =~ s/[\(\)]//g; return $k; } sub V { my ( $k, $v ) = @_; if ( $k eq 'accelerator_ratio' ) { if ( $v =~ /([0-9]+)% Read \/ ([0-9]+)% Write/ ) { return { 'read' => $1, 'write' => $2 }; } } return $v; } sub K_V { my ($line) = @_; if ( $line =~ /(.+):\s+(.+)/ ) { my $k = &K($1); my $v = &V( $k, $2 ); return ( $k, $v ); } return ( undef, undef ); } 1;