File Coverage

lib/Rex/Hardware/VirtInfo.pm
Criterion Covered Total %
statement 41 81 50.6
branch 5 44 11.3
condition 1 3 33.3
subroutine 9 9 100.0
pod 0 1 0.0
total 56 138 40.5


line stmt bran cond sub pod time code
1             package Rex::Hardware::VirtInfo;
2              
3 3     3   102 use v5.12.5;
  3         32  
4 3     3   37 use warnings;
  3         21  
  3         267  
5              
6             our $VERSION = '1.14.2.3'; # TRIAL VERSION
7              
8 3     3   48 use Rex;
  3         8  
  3         68  
9 3     3   44 use Rex::Helper::Run;
  3         26  
  3         450  
10 3     3   38 use Rex::Commands::Fs;
  3         19  
  3         98  
11 3     3   42 use Rex::Commands::File;
  3         26  
  3         86  
12 3     3   26 use Rex::Logger;
  3         17  
  3         58  
13              
14 3     3   160 use Rex::Inventory::Bios;
  3         15  
  3         64  
15              
16             require Rex::Hardware;
17              
18             sub get {
19              
20 9     9 0 111 my $cache = Rex::get_cache();
21 9         175 my $cache_key_name = $cache->gen_key_name("hardware.virt_info");
22              
23 9 50       132 if ( $cache->valid($cache_key_name) ) {
24 0         0 return $cache->get($cache_key_name);
25             }
26              
27 9 50 33     73 if ( Rex::is_ssh || $^O !~ m/^MSWin/i ) {
28              
29             my (
30 9         206 $product_name, $bios_vendor, $sys_vendor,
31             $self_status, $cpuinfo, $modules
32             ) = ( '', '', '', '', '', '' );
33              
34 9         117 $product_name =
35             i_run "cat /sys/devices/virtual/dmi/id/product_name 2>/dev/null",
36             fail_ok => 1;
37 9         199 $bios_vendor =
38             i_run "cat /sys/devices/virtual/dmi/id/bios_vendor 2>/dev/null",
39             fail_ok => 1;
40 9         162 $sys_vendor =
41             i_run "cat /sys/devices/virtual/dmi/id/sys_vendor 2>/dev/null",
42             fail_ok => 1;
43              
44 9         241 $self_status = i_run "cat /proc/self/status 2>/dev/null", fail_ok => 1;
45 9         163 $cpuinfo = i_run "cat /proc/cpuinfo 2>/dev/null", fail_ok => 1;
46 9         194 $modules = i_run "cat /proc/modules 2>/dev/null", fail_ok => 1;
47              
48 9         178 my ( $virtualization_type, $virtualization_role ) = ( '', '' );
49              
50 9 50       275 if ( is_dir("/proc/xen") ) {
    50          
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
51 0         0 $virtualization_type = "xen";
52 0         0 $virtualization_role = "guest";
53              
54 0         0 my $string = i_run "cat /proc/xen/capabilities 2>/dev/null", fail_ok => 1;
55 0 0       0 if ( $string =~ /control_d/ ) {
56 0         0 $virtualization_role = "host";
57             }
58             }
59              
60             elsif ( is_dir("/proc/vz") ) {
61 0         0 $virtualization_type = "openvz";
62 0         0 $virtualization_role = "guest";
63              
64 0 0       0 if ( is_dir("/proc/bc") ) {
65 0         0 $virtualization_role = "host";
66             }
67             }
68              
69             elsif ( $product_name =~ /KVM|Bochs/ ) {
70 9         103 $virtualization_type = "kvm";
71 9         65 $virtualization_role = "guest";
72             }
73              
74             elsif ( $product_name =~ /VMware Virtual Platform/ ) {
75 0         0 $virtualization_type = "vmware";
76 0         0 $virtualization_role = "guest";
77             }
78              
79             elsif ( $bios_vendor =~ /Xen/ ) {
80 0         0 $virtualization_type = "xen";
81 0         0 $virtualization_role = "guest";
82             }
83              
84             elsif ( $bios_vendor =~ /innotek GmbH/ ) {
85 0         0 $virtualization_type = "virtualbox";
86 0         0 $virtualization_role = "guest";
87             }
88              
89             elsif ( $sys_vendor =~ /Microsoft Corporation/ ) {
90 0         0 $virtualization_type = "VirtualPC";
91 0         0 $virtualization_role = "guest";
92             }
93              
94             elsif ( $sys_vendor =~ /Parallels Software International Inc/ ) {
95 0         0 $virtualization_type = "parallels";
96 0         0 $virtualization_role = "guest";
97             }
98              
99             elsif ( $sys_vendor =~ /QEMU/ ) {
100 0         0 $virtualization_type = "kvm";
101 0         0 $virtualization_role = "guest";
102             }
103              
104             elsif ( $sys_vendor =~ /DigitalOcean/ ) {
105 0         0 $virtualization_type = "kvm";
106 0         0 $virtualization_role = "guest";
107             }
108              
109             elsif ( $self_status =~ /VxID: \d+/ ) {
110 0         0 $virtualization_type = "linux_vserver";
111 0         0 $virtualization_role = "guest";
112              
113 0 0       0 if ( $self_status =~ /VxID: 0/ ) {
114 0         0 $virtualization_role = "host";
115             }
116             }
117              
118             elsif ( $cpuinfo =~ /model name.*QEMU Virtual CPU/ ) {
119 0         0 $virtualization_type = "kvm";
120 0         0 $virtualization_role = "guest";
121             }
122              
123             elsif ( $cpuinfo =~ /vendor_id.*User Mode Linux|model name.*UML/ ) {
124 0         0 $virtualization_type = "uml";
125 0         0 $virtualization_role = "guest";
126             }
127              
128             elsif ( $cpuinfo =~ /vendor_id.*PowerVM Lx86/ ) {
129 0         0 $virtualization_type = "powervm_lx86";
130 0         0 $virtualization_role = "guest";
131             }
132              
133             elsif ( $cpuinfo =~ /vendor_id.*IBM\/S390/ ) {
134 0         0 $virtualization_type = "ibm_systemz";
135 0         0 $virtualization_role = "guest";
136             }
137              
138             elsif ( $modules =~ /kvm/ ) {
139 0         0 $virtualization_type = "kvm";
140 0         0 $virtualization_role = "host";
141             }
142              
143             elsif ( $modules =~ /vboxdrv/ ) {
144 0         0 $virtualization_type = "virtualbox";
145 0         0 $virtualization_role = "host";
146             }
147              
148 9         167 my $data = {
149             virtualization_type => $virtualization_type,
150             virtualization_role => $virtualization_role,
151             };
152              
153 9         189 $cache->set( $cache_key_name, $data );
154              
155 9         258 return $data;
156              
157             }
158             }