Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/2.2.x' into 2.2.x
Browse files Browse the repository at this point in the history
  • Loading branch information
Gonéri Le Bouder committed May 11, 2012
2 parents b0b6fe1 + d70e396 commit 86e390b
Show file tree
Hide file tree
Showing 18 changed files with 394 additions and 105 deletions.
Expand Up @@ -11,6 +11,7 @@ use FusionInventory::Agent::Tools::Unix;
sub isEnabled {
return
$OSNAME ne 'MSWin32' &&
!$params{no_category}->{process} &&
canRun('ps');
}

Expand Down
Expand Up @@ -8,12 +8,6 @@ use English qw(-no_match_vars);
use FusionInventory::Agent::Tools;
use FusionInventory::Agent::Tools::Linux;

# Tested on 2.6.* kernels
#
# Cards tested :
#
# Adaptec AAC-RAID

sub isEnabled {
return -r '/proc/scsi/scsi';
}
Expand All @@ -28,14 +22,21 @@ sub doInventory {

foreach my $device (@devices) {
next unless $device->{MANUFACTURER};
next unless $device->{MANUFACTURER} eq 'Adaptec';
next unless
$device->{MANUFACTURER} eq 'Adaptec' ||
$device->{MANUFACTURER} eq 'ServeRA';

foreach my $disk (_getDisksFromProc(
controller => 'scsi' . $device->{SCSI_COID},
name => $device->{NAME},
logger => $logger
)) {
$disk->{SERIALNUMBER} = getSerialnumber($disk->{device});
)) {
# merge with smartctl info
my $info = getInfoFromSmartctl(device => $disk->{device});
foreach my $key (qw/SERIALNUMBER DESCRIPTION TYPE/) {
$disk->{$key} = $info->{$key};
}
delete $disk->{device};
$inventory->addEntry(section => 'STORAGES', entry => $disk);
}
}
Expand Down Expand Up @@ -63,27 +64,25 @@ sub _getDisksFromProc {
# that's the controller we're looking for
$disk = {
NAME => $params{name},
DESCRIPTION => 'SATA',
TYPE => 'disk',
};
} else {
# that's another controller
undef $disk;
}
}

if ($line =~ /Model:\s(\S+).*Rev:\s(\S+)/) {
if ($line =~ /Model: \s (\S.+\S) \s+ Rev: \s (\S+)/x) {
next unless $disk;
$disk->{MODEL} = $1;
$disk->{FIRMWARE} = $2;

# that's the controller itself, not a disk
next if $disk->{MODEL} =~ 'raid';
next if $disk->{MODEL} =~ /(raid|RAID)/;

$disk->{MANUFACTURER} = getCanonicalManufacturer(
$disk->{MODEL}
);
$disk->{DEVICE} = "/dev/sg$count";
$disk->{device} = "/dev/sg$count";

push @disks, $disk;
}
Expand Down
Expand Up @@ -6,14 +6,6 @@ use warnings;
use FusionInventory::Agent::Tools;
use FusionInventory::Agent::Tools::Linux;

# Tested on 2.6.* kernels
#
# Cards tested :
#
# LSI Logic / Symbios Logic SAS1064E PCI-Express Fusion-MPT SAS
#
# mpt-status version : 1.2.0

sub isEnabled {
return canRun('mpt-status');
}
Expand All @@ -26,37 +18,55 @@ sub doInventory {

my @devices = getDevicesFromUdev(logger => $logger);

foreach my $hd (@devices) {
my $handle = getFileHandle(
logger => $logger,
command => "mpt-status -n -i $hd->{SCSI_UNID}"
);
next unless $handle;
while (my $line = <$handle>) {
next unless /phys_id:(\d+).*product_id:\s*(\S*)\s+revision:(\S+).*size\(GB\):(\d+)/;
my $id = $1;

my $storage = {
NAME => $hd->{NAME},
DESCRIPTION => 'SATA',
TYPE => 'disk',
MODEL => $2,
FIRMWARE => $3,
SIZE => $4 * 1024
};

$storage->{SERIALNUMBER} = getSerialnumber(
device => "/dev/sg$id"
);
$storage->{MANUFACTURER} = getCanonicalManufacturer(
$storage->{MODEL}
);

$inventory->addEntry(section => 'STORAGES', entry => $storage);
foreach my $device (@devices) {
foreach my $disk (_getDiskFromMptStatus(
name => $device->{NAME},
logger => $logger,
command => "mpt-status -n -i $device->{SCSI_UNID}"
)) {
# merge with smartctl info
my $info = getInfoFromSmartctl(device => $disk->{device});
foreach my $key (qw/SERIALNUMBER DESCRIPTION TYPE/) {
$disk->{$key} = $info->{$key};
}
delete $disk->{device};
$inventory->addEntry(section => 'STORAGES', entry => $disk);
}
close $handle;
}

}

sub _getDiskFromMptStatus {
my (%params) = @_;

my $handle = getFileHandle(%params);
next unless $handle;

my @disks;
while (my $line = <$handle>) {
next unless $line =~ /
phys_id:(\d+) \s
scsi_id:\d+ \s
vendor:\S+ \s+
product_id:(\S.+\S) \s+
revision:(\S+) \s+
size\(GB\):(\d+)
/x;

my $disk = {
NAME => $params{name},
device => "/dev/sg$1",
MODEL => $2,
MANUFACTURER => getCanonicalManufacturer($2),
FIRMWARE => $3,
SIZE => $4 * 1024
};

push @disks, $disk;
}
close $handle;

return @disks;
}

1;
Expand Up @@ -27,17 +27,18 @@ sub doInventory {
logger => $logger, command => 'ps -ef'
)) {
# match only if an qemu instance
next unless $process->{CMD} =~ /(qemu|kvm|(qemu-kvm)).*\-([fh]d[a-d]|cdrom).*/;
next unless
$process->{CMD} =~ /(qemu|kvm|qemu-kvm) .* -([fhsv]d[a-d]|cdrom)/x;

my $name;
my $mem = 0;
my $uuid;
my $vmtype = $1;

my @options = split (/\-/, $process->{CMD});
my @options = split (/-/, $process->{CMD});
foreach my $option (@options) {
if ($option =~ m/^([fh]d[a-d]|cdrom) (\S+)/) {
$name = $2 if !$name;
if ($option =~ m/^(?:[fhsv]d[a-d]|cdrom) (\S+)/) {
$name = $1 if !$name;
} elsif ($option =~ m/^name (\S+)/) {
$name = $1;
} elsif ($option =~ m/^m (\S+)/) {
Expand Down
47 changes: 36 additions & 11 deletions lib/FusionInventory/Agent/Tools/Linux.pm
Expand Up @@ -16,7 +16,7 @@ our @EXPORT = qw(
getDevicesFromHal
getDevicesFromProc
getCPUsFromProc
getSerialnumber
getInfoFromSmartctl
getInterfacesFromIfconfig
getInterfacesFromIp
);
Expand All @@ -29,8 +29,11 @@ sub getDevicesFromUdev {
my @devices;

foreach my $file (glob ("/dev/.udev/db/*")) {
next unless $file =~ /([sh]d[a-z])$/;
my $device = $1;
my $device = getFirstMatch(
file => $file,
pattern => qr/^N:(\S+)/
);
next unless $device =~ /([hsv]d[a-z]|sr\d+)$/;
push (@devices, _parseUdevEntry(
logger => $params{logger}, file => $file, device => $device
));
Expand Down Expand Up @@ -240,17 +243,39 @@ sub _getValueFromSysProc {
return $value;
}

sub getSerialnumber {
sub getInfoFromSmartctl {
my (%params) = @_;

my ($serial) = getFirstMatch(
my $handle = getFileHandle(
%params,
command => $params{device} ? "smartctl -i $params{device}" : undef,
file => $params{file},
logger => $params{logger},
pattern => qr/^Serial Number:\s+(\S*)/
);
return unless $handle;

my $info = {
TYPE => 'disk',
DESCRIPTION => 'SATA',
};

while (my $line = <$handle>) {
if ($line =~ /^Transport protocol: +(\S+)/i) {
$info->{DESCRIPTION} = $1;
next;
}

if ($line =~ /^Device type: +(\S+)/i) {
$info->{TYPE} = $1;
next;
}

if ($line =~ /^Serial number: +(\S+)/i) {
$info->{SERIALNUMBER} = $1;
next;
}
}
close $handle;

return $serial;
return $info;
}

sub getInterfacesFromIfconfig {
Expand Down Expand Up @@ -437,9 +462,9 @@ Availables parameters:
=back
=head2 getSerialnumber(%params)
=head2 getInfoFromSmartctl(%params)
Returns the serial number of a drive, using smartctl.
Returns some informations about a drive, using smartctl.
Availables parameters:
Expand Down
2 changes: 2 additions & 0 deletions lib/FusionInventory/Agent/Tools/Network.pm
Expand Up @@ -71,13 +71,15 @@ sub getSubnetAddressIPv6 {

sub hex2canonical {
my ($address) = @_;
return unless $address;

my @bytes = $address =~ /^(?:0x)?(..)(..)(..)(..)$/;
return join('.', map { hex($_) } @bytes);
}

sub alt2canonical {
my ($address) = @_;
return unless $address;

my @bytes = $address =~ /^(?:0x)?(..)(..)(..)(..)(..)(..)$/;
return join(':', @bytes);
Expand Down
20 changes: 7 additions & 13 deletions lib/FusionInventory/Agent/Tools/Win32.pm
Expand Up @@ -41,7 +41,6 @@ our @EXPORT = qw(
);

sub is64bit {

return
any { $_->{AddressWidth} eq 64 }
getWmiObjects(
Expand All @@ -51,19 +50,14 @@ sub is64bit {

sub getLocalCodepage {
if (!$localCodepage) {
my $lmachine = $Registry->Open('LMachine', {
Access => KEY_READ
}) or die "Can't open HKEY_LOCAL_MACHINE key: $EXTENDED_OS_ERROR";

my $codepage =
$lmachine->{"SYSTEM\\CurrentControlSet\\Control\\Nls\\CodePage"}
or warn;

$localCodepage = "cp".$codepage->{ACP};
$localCodepage =
"cp" .
getRegistryValue(
path => "SYSTEM\CurrentControlSet\Control\Nls\CodePage\ACP"
);
}

return $localCodepage;

}

sub encodeFromRegistry {
Expand Down Expand Up @@ -102,7 +96,7 @@ sub getRegistryValue {
my (%params) = @_;

my ($root, $keyName, $valueName);
if ($params{path} =~ /^(HKEY_[^\/\\]+)[\/\\](.+)[\/\\]([^\/]+)/ ) {
if ($params{path} =~ m{^(HKEY_\S+)/(.+)/([^/]+)} ) {
$root = $1;
$keyName = $2;
$valueName = $3;
Expand All @@ -125,7 +119,7 @@ sub getRegistryKey {
my (%params) = @_;

my ($root, $keyName);
if ($params{path} =~ /^(HKEY_\S+)\/(.+)/ ) {
if ($params{path} =~ m{^(HKEY_\S+)/(.+)} ) {
$root = $1;
$keyName = $2;
} else {
Expand Down
5 changes: 5 additions & 0 deletions resources/linux/mpt-status/sample1
@@ -0,0 +1,5 @@
ioc:0 vol_id:0 type:IM raidlevel:RAID-1 num_disks:2 size(GB):148 state: OPTIMAL flags: ENABLED
ioc:0 phys_id:1 scsi_id:2 vendor:ATA product_id:ST3160815AS revision:D size(GB):149 state: ONLINE flags: NONE sync_state: 100 ASC/ASCQ:0xff/0xff SMART ASC/ASCQ:0xff/0xff
ioc:0 phys_id:0 scsi_id:1 vendor:ATA product_id:ST3160815AS revision:D size(GB):149 state: ONLINE flags: NONE sync_state: 100 ASC/ASCQ:0xff/0xff SMART ASC/ASCQ:0xff/0xff
scsi_id:1 100%
scsi_id:0 100%
13 changes: 13 additions & 0 deletions resources/linux/mpt-status/sample2
@@ -0,0 +1,13 @@
ioc:0 vol_id:1 type:IME raidlevel:RAID-1E num_disks:6 size(GB):407 state: OPTIMAL flags: ENABLED
ioc:0 phys_id:5 scsi_id:7 vendor:IBM-ESXS product_id:CBRCA146C3ETS0 N revision:C610 size(GB):136 state: ONLINE flags: NONE sync_state: 100 ASC/ASCQ:0xff/0xff SMART ASC/ASCQ:0xff/0xff
ioc:0 phys_id:4 scsi_id:2 vendor:IBM-ESXS product_id:CBRCA146C3ETS0 N revision:C610 size(GB):136 state: ONLINE flags: NONE sync_state: 100 ASC/ASCQ:0xff/0xff SMART ASC/ASCQ:0xff/0xff
ioc:0 phys_id:3 scsi_id:3 vendor:IBM-ESXS product_id:ST9146803SS revision:B53C size(GB):136 state: ONLINE flags: NONE sync_state: 100 ASC/ASCQ:0xff/0xff SMART ASC/ASCQ:0xff/0xff
ioc:0 phys_id:2 scsi_id:4 vendor:IBM-ESXS product_id:CBRCA146C3ETS0 N revision:C610 size(GB):136 state: ONLINE flags: NONE sync_state: 100 ASC/ASCQ:0xff/0xff SMART ASC/ASCQ:0xff/0xff
ioc:0 phys_id:1 scsi_id:5 vendor:IBM-ESXS product_id:CBRCA146C3ETS0 N revision:C610 size(GB):136 state: ONLINE flags: NONE sync_state: 100 ASC/ASCQ:0xff/0xff SMART ASC/ASCQ:0xff/0xff
ioc:0 phys_id:0 scsi_id:6 vendor:IBM-ESXS product_id:CBRCA146C3ETS0 N revision:C610 size(GB):136 state: ONLINE flags: NONE sync_state: 100 ASC/ASCQ:0xff/0xff SMART ASC/ASCQ:0xff/0xff
scsi_id:5 100%
scsi_id:4 100%
scsi_id:3 100%
scsi_id:2 100%
scsi_id:1 100%
scsi_id:0 100%
25 changes: 25 additions & 0 deletions resources/linux/proc/scsi/linux3
@@ -0,0 +1,25 @@
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
Vendor: MATSHITA Model: UJDA782 DVD/CDRW Rev: VA13
Type: CD-ROM ANSI SCSI revision: 05
Host: scsi4 Channel: 00 Id: 00 Lun: 00
Vendor: IBM-ESXS Model: CBRCA146C3ETS0 N Rev: C610
Type: Direct-Access ANSI SCSI revision: 06
Host: scsi4 Channel: 00 Id: 01 Lun: 00
Vendor: IBM-ESXS Model: CBRCA146C3ETS0 N Rev: C610
Type: Direct-Access ANSI SCSI revision: 06
Host: scsi4 Channel: 00 Id: 02 Lun: 00
Vendor: IBM-ESXS Model: ST9146803SS Rev: B53C
Type: Direct-Access ANSI SCSI revision: 05
Host: scsi4 Channel: 00 Id: 03 Lun: 00
Vendor: IBM-ESXS Model: CBRCA146C3ETS0 N Rev: C610
Type: Direct-Access ANSI SCSI revision: 06
Host: scsi4 Channel: 00 Id: 04 Lun: 00
Vendor: IBM-ESXS Model: CBRCA146C3ETS0 N Rev: C610
Type: Direct-Access ANSI SCSI revision: 06
Host: scsi4 Channel: 00 Id: 05 Lun: 00
Vendor: IBM-ESXS Model: CBRCA146C3ETS0 N Rev: C610
Type: Direct-Access ANSI SCSI revision: 06
Host: scsi4 Channel: 01 Id: 01 Lun: 00
Vendor: LSILOGIC Model: Logical Volume Rev: 3000
Type: Direct-Access ANSI SCSI revision: 02

0 comments on commit 86e390b

Please sign in to comment.