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

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

Copyt trusty code

File size: 4.0 KB
Line 
1package Ocsinventory::Agent::Backend::OS::Linux::Drives;
2
3use strict;
4sub check {
5  return unless can_run ("df");
6  my $df = `df -TP`;
7  return 1 if $df =~ /\w+/;
8  0
9}
10
11sub run {
12  my $params = shift;
13  my $common = $params->{common};
14
15  my %months = (
16    Jan => 1,
17    Fev => 2,
18    Mar => 3,
19    Apr => 4,
20    May => 5,
21    Jun => 6,
22    Jul => 7,
23    Aug => 8,
24    Sep => 9,
25    Oct => 10,
26    Nov => 11,
27    Dec => 12,
28  );
29
30  my %listVolume = ();
31   
32  # Get complementary information in hash tab
33  if (can_run ("lshal")) {
34    my %temp;
35    my $in = 0;
36    my $value;
37    foreach my $line (`lshal`) {
38      chomp $line;
39      if ( $line =~ s{^udi = '/org/freedesktop/Hal/devices/volume.*}{}) {
40        $in = 1;
41        %temp = ();
42      } elsif ($in == 1 and $line =~ s{^\s+(\S+) = (.*) \s*\((int|string|bool|string list|uint64)\)}{} ) {
43        if ($3 ne 'int' and $3 ne 'uint64') {
44          chomp($value = $2);
45          if ($3 eq 'string') { 
46            chop($value); 
47            #$value =~ s/^'?(.*)'?$/$1/g;
48            $value=substr($value,1,length($value));
49            $value=substr($value,0,length($value)-1);
50          }
51         
52          $temp{$1} = $value;
53        } else {
54          $temp{$1} = (split(/\W/,$2))[0];
55        }
56      }elsif ($in== 1 and $line eq '') {
57        $in = 0 ;
58        $listVolume{$temp{'block.device'}} = {%temp};
59      }
60    }
61  }
62 
63  foreach(`df -TP`) { # TODO retrive error
64    my $createdate;
65    my $free;
66    my $filesystem;
67    my $label;
68    my $total;
69    my $type;
70    my $volumn;
71    my $serial;
72
73    if(/^(\S+)\s+(\S+)\s+(\S+)\s+(?:\S+)\s+(\S+)\s+(?:\S+)\s+(\S+)\n/){
74      $free = sprintf("%i",($4/1024));
75      $filesystem = $2;
76      $total = sprintf("%i",($3/1024));
77      $type = $5;
78      $volumn = $1;
79
80# no virtual FS
81      next if ($filesystem =~ /^(tmpfs|usbfs|proc|devpts|devshm|udev)$/);
82      next if ($type =~ /^(tmpfs)$/);
83
84      if ($filesystem =~ /^ext(2|3|4|4dev)/ && can_run('dumpe2fs')) {
85        foreach (`dumpe2fs -h $volumn 2> /dev/null`) {
86          if (/Filesystem UUID:\s+(\S+)/) {
87            $serial = $1;
88          } elsif (/Filesystem created:\s+\w+ (\w+) (\d+) ([\d:]+) (\d{4})$/) {
89            $createdate = $4.'/'.$months{$1}.'/'.$2.' '.$3;
90          } elsif (/Filesystem volume name:\s*(\S.*)/) {
91            $label = $1 unless $1 eq '<none>';
92          }
93        }
94      } elsif ($filesystem =~ /^xfs$/ && can_run('xfs_db')) {
95        foreach (`xfs_db -r -c uuid $volumn`) {
96          $serial = $1 if /^UUID =\s+(\S+)/;
97            ;
98          }
99        foreach (`xfs_db -r -c label $volumn`) {
100          $label = $1 if /^label =\s+"(\S+)"/;
101        }
102      } elsif ($filesystem =~ /^vfat$/ && can_run('dosfslabel')) {
103          chomp ($label = `dosfslabel $volumn`);
104      }
105
106      $label =~ s/\s+$//;
107      $serial =~ s/\s+$//;
108
109     
110      # Check information and improve it
111      if (keys %listVolume) {
112        if ( defined $listVolume{$volumn} ) {
113          if ($filesystem eq '')  { $filesystem = $listVolume{$volumn}->{'volume.fstype'};}
114          if ($label eq '')       { $label = $listVolume{$volumn}->{'volume.label'};}
115          if ($total eq '')       { $total = int($listVolume{$volumn}->{'volume.size'}/(1024*1024) + 0.5);}
116          if ($type eq '')        { $type = $listVolume{$volumn}->{'storage.model'};}
117          if ($serial eq '')      { $serial = $listVolume{$volumn}->{'volume.uuid'};}
118          delete ($listVolume{$volumn});
119        }
120      }
121
122      $common->addDrive({
123          CREATEDATE => $createdate,
124          FREE => $free,
125          FILESYSTEM => $filesystem,
126          LABEL => $label,
127          TOTAL => $total,
128          TYPE => $type,
129          VOLUMN => $volumn,
130          SERIAL => $serial
131        });
132    }
133  }
134
135  if (can_run ("lshal")) {
136    while (my ($k,$v) = each %listVolume ) {
137      $common->addDrive({
138        FILESYSTEM => $v->{'volume.fstype'},
139        LABEL => $v->{'volume.label'},
140        TOTAL => int ($v->{'volume.size'}/(1024*1024) + 0.5),
141        TYPE => $v->{'storage.model'},
142        VOLUMN => $k,
143        SERIAL => $v->{'volume.uuid'}
144      });
145    }
146  } 
147}
148
1491;
Note: See TracBrowser for help on using the repository browser.