source: ocsinventory-agent/trunk/fuentes/lib/Ocsinventory/Agent/Backend/OS/Linux/Storages/3ware.pm @ 468

Last change on this file since 468 was 468, checked in by mabarracus, 4 years ago

Copyt trusty code

File size: 4.8 KB
Line 
1package Ocsinventory::Agent::Backend::OS::Linux::Storages::3ware;
2
3use Ocsinventory::Agent::Backend::OS::Linux::Storages;
4# Tested on 2.6.* kernels
5#
6# Cards tested :
7#
8# 8006-2LP
9# 9500S-4LP
10# 9550SXU-4LP
11# 9550SXU-8LP
12# 9650SE-2LP
13# 9650SE-4LPML
14# 9650SE-8LPML
15#
16# AMCC/3ware CLI (version 2.00.0X.XXX)
17
18use strict;
19
20sub check {
21
22  my ($card, $res);
23# Do we have tw_cli ?
24  if (can_run("tw_cli")) {
25    foreach (`tw_cli info`) {
26      $card = $1 if /^(c\d+).*/;
27      if ($card) {
28        $res = `tw_cli info $card numdrives`;
29        $card = undef;
30        $res =~ s/^.*=\s(\d+)/$1/;
31# Do we have drives on the card ?   
32        ($res == 0)?return 0:return 1;
33      }
34    }
35  }
36
37}
38
39sub run {
40
41
42  my $params = shift;
43  my $common = $params->{common};
44  my $logger = $params->{logger};
45
46  my ($tw_cli, $hd);
47
48  my ($card, $card_model, $unit, $unit_id, $port, $serialnumber, $serial, $model, $capacity, $firmware, $description, $media, $device, $manufacturer, $sn);
49
50  my @devices = Ocsinventory::Agent::Backend::OS::Linux::Storages::getFromUdev();
51
52# First, getting the cards : c0, c1... etc.
53  foreach (`tw_cli info`) {
54
55# Should output something like this :
56#
57# Ctl   Model        Ports   Drives   Units   NotOpt   RRate   VRate   BBU
58# ------------------------------------------------------------------------
59# c0    9650SE-2LP   2       2        1       0        1       1       -       
60
61    if (/^(c\d)+\s+([\w|-]+)/) {
62      $card = $1;
63      $card_model = $2;
64      $logger->debug("Card : $card - Model : $card_model");
65
66    }
67    if ($card) {
68
69# Second, getting the units : u0, u1... etc.
70      foreach (`tw_cli info $card`) {
71
72# Example output :
73#
74# Unit  UnitType  Status         %RCmpl  %V/I/M  Stripe  Size(GB)  Cache  AVrfy
75# ------------------------------------------------------------------------------
76# u0    RAID-1    OK             -       -       -       65.1826   ON     OFF   
77#
78# Port   Status           Unit   Size        Blocks        Serial
79# ---------------------------------------------------------------
80# p0     OK               u0     69.25 GB    145226112     WD-WMANS1648590     
81# p1     OK               u0     69.25 GB    145226112     WD-WMANS1344790     
82
83        if (/^(u)(\d+).*/) {
84          $unit = $1 . $2;
85          $unit_id = $2;
86        }
87        if ($unit) {
88
89# Try do get unit's serial in order to compare it to what was found in udev db.
90# Works only on newer cards.
91# Allow us to associate a node to a drive : sda -> WD-WMANS1648590
92          $sn = `tw_cli info $card $unit serial 2> /dev/null`;
93          $sn =~ s/^.*serial number\s=\s(\w*)\s*/$1/;
94
95# Third, getting the ports : p0, p1... etc.
96          foreach(`tw_cli info $card $unit`) {
97            $port =  $1 if /^.*(p\d+).*/;
98            if ($port) {
99
100# Finally, getting drives' values.
101              foreach (`tw_cli info $card $port model serial capacity firmware`) {
102
103# Example output :     
104#
105# /c0/p0 Model = WDC WD740ADFD-00NLR4
106# /c0/p0 Serial = WD-WMANS1648590
107# /c0/p0 Capacity = 69.25 GB (145226112 Blocks)
108# /c0/p0 Firmware Version = 21.07QR4
109
110                $model = $1 if /^.*Model\s=\s(.*)/;
111                $serialnumber = $1 if /^.*Serial\s=\s(.*)/;
112                $capacity = 1024*$1 if /^.*Capacity\s=\s(\S+)\sGB.*/;
113                $firmware = $1 if /^.*Firmware Version\s=\s(.*)/;
114              }
115              foreach $hd (@devices) {
116
117# How does this work with multiple older cards where serial for units is not implemented ?
118# Need to be tested on a system with multiple 3ware cards.
119                if (($hd->{SERIALNUMBER} eq 'AMCC_' . $sn) or ($hd->{MODEL} eq 'Logical_Disk_' . $unit_id)) {
120                  $device = $hd->{NAME};
121                }
122              }
123
124# Getting description from card model, very basic and unreliable
125# Assuming only IDE drives can be plugged in 5xxx/6xxx cards and
126# SATA drives only to 7xxx/8xxx/9xxxx cards
127              $description = undef;
128              foreach ($card_model) {
129                $description = "IDE" if /^[5-6].*/;
130                $description = "SATA" if /^[7-9].*/;
131              }
132              $media = 'disk';
133              $manufacturer = Ocsinventory::Agent::Backend::OS::Linux::Storages::getManufacturer($model);
134              $port = undef;
135              $logger->debug("3ware: $device, $manufacturer, $model, $description, $media, $capacity, $serialnumber, $firmware");
136              $common->addStorages({
137                  NAME => $device,
138                  MANUFACTURER => $manufacturer,
139                  MODEL => $model,
140                  DESCRIPTION => $description,
141                  TYPE => $media,
142                  DISKSIZE => $capacity,
143                  SERIALNUMBER => $serialnumber,
144                  FIRMWARE => $firmware,
145                  });
146            }
147            $port = undef;
148          }
149          $unit = undef;
150        }
151      }
152      $card = undef;
153      $card_model = undef;
154    }
155  }
156}
157
1581;
Note: See TracBrowser for help on using the repository browser.