File Coverage

blib/lib/FusionInventory/Agent/Task/Inventory/Generic/USB.pm
Criterion Covered Total %
statement 41 49 83.6
branch 23 32 71.8
condition 5 6 83.3
subroutine 6 8 75.0
pod 0 2 0.0
total 75 97 77.3


line stmt bran cond sub pod time code
1             package FusionInventory::Agent::Task::Inventory::Generic::USB;
2              
3 2     2   122180378 use strict;
  2         15  
  2         141  
4 2     2   36 use warnings;
  2         18  
  2         149  
5              
6 2     2   1160 use FusionInventory::Agent::Tools;
  2         4  
  2         394  
7 2     2   1308 use FusionInventory::Agent::Tools::Generic;
  2         6  
  2         1441  
8              
9             sub isEnabled {
10 0     0 0 0 my (%params) = @_;
11 0 0       0 return 0 if $params{no_category}->{usb};
12 0         0 return canRun('lsusb');
13             }
14              
15             sub doInventory {
16 0     0 0 0 my (%params) = @_;
17              
18 0         0 my $inventory = $params{inventory};
19              
20 0         0 foreach my $device (_getDevices(
21             logger => $params{logger},
22             datadir => $params{datadir})
23             ) {
24 0         0 $inventory->addEntry(
25             section => 'USBDEVICES',
26             entry => $device,
27             );
28             }
29             }
30              
31             sub _getDevices {
32 1     1   27441 my @devices;
33              
34 1         5 foreach my $device (_getDevicesFromLsusb(@_)) {
35 15 50       38 next unless $device->{PRODUCTID};
36 15 50       38 next unless $device->{VENDORID};
37              
38             # ignore the USB Hub
39             next if
40             $device->{PRODUCTID} eq "0001" ||
41 15 100 100     76 $device->{PRODUCTID} eq "0002" ;
42              
43 6 50 66     26 if (defined($device->{SERIAL}) && length($device->{SERIAL}) < 5) {
44 0         0 $device->{SERIAL} = undef;
45             }
46              
47 6         26 my $vendor = getUSBDeviceVendor(id => $device->{VENDORID}, @_);
48 6 50       15 if ($vendor) {
49 6         14 $device->{MANUFACTURER} = $vendor->{name};
50              
51 6         15 my $entry = $vendor->{devices}->{$device->{PRODUCTID}};
52 6 50       14 if ($entry) {
53 6         16 $device->{CAPTION} = $entry->{name};
54             }
55             }
56              
57 6         10 push @devices, $device;
58             }
59              
60 1         20 return @devices;
61             }
62              
63             sub _getDevicesFromLsusb {
64 2     2   21 my $handle = getFileHandle(
65             @_,
66             command => 'lsusb -v',
67             );
68              
69 2 50       6 return unless $handle;
70              
71 2         4 my @devices;
72             my $device;
73              
74 2         134 while (my $line = <$handle>) {
75 2698 100       21411 if ($line =~ /^$/) {
    100          
    100          
    100          
    100          
    100          
76 30 100       71 push @devices, $device if $device;
77 30         119 undef $device;
78             } elsif ($line =~ /^\s*idVendor\s*0x(\w+)/i) {
79 30         144 $device->{VENDORID} = $1;
80             } elsif ($line =~ /^\s*idProduct\s*0x(\w+)/i) {
81 30         120 $device->{PRODUCTID} = $1;
82             } elsif ($line =~ /^\s*iSerial\s*\d+\s(\w+)/i) {
83 18         104 $device->{SERIAL} = $1;
84             } elsif ($line =~ /^\s*bInterfaceClass\s*(\d+)/i) {
85 50         189 $device->{CLASS} = $1;
86             } elsif ($line =~ /^\s*bInterfaceSubClass\s*(\d+)/i) {
87 50         192 $device->{SUBCLASS} = $1;
88             }
89             }
90 2         77 close $handle;
91 2 50       8 push @devices, $device if $device;
92              
93 2         15 return @devices;
94             }
95              
96             1;