source: ocsinventory-agent/trunk/fuentes/lib/Ocsinventory/Agent/Backend/Virtualization/Vmsystem.pm @ 468

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

Copyt trusty code

File size: 6.2 KB
Line 
1package Ocsinventory::Agent::Backend::Virtualization::Vmsystem;
2
3# Initial Ocsinventory::Agent::Backend::Virtualization::Vmsystem version: Nicolas EISEN
4#
5# Code include from imvirt - I'm virtualized?
6#   http://micky.ibh.net/~liske/imvirt.html
7#
8# Authors:
9#   Thomas Liske <liske@ibh.de>
10#
11# Copyright Holder:
12#   2008 (C) IBH IT-Service GmbH [http://www.ibh.de/]
13#
14# License:
15#   This program is free software; you can redistribute it and/or modify
16#   it under the terms of the GNU General Public License as published by
17#   the Free Software Foundation; either version 2 of the License, or
18#   (at your option) any later version.
19#
20#   This program is distributed in the hope that it will be useful,
21#   but WITHOUT ANY WARRANTY; without even the implied warranty of
22#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23#   GNU General Public License for more details.
24#
25#   You should have received a copy of the GNU General Public License
26#   along with this package; if not, write to the Free Software
27#   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
28#
29
30
31##
32#
33# Outputs:
34#   Xen
35#   VirtualBox
36#   Virtual Machine
37#   VMware
38#   QEMU
39#   SolarisZone
40#
41# If no virtualization has been detected:
42#   Physical
43#
44##
45
46use strict;
47
48sub check { 
49  if ( can_run("zoneadm")){ # Is a solaris zone system capable ?
50      return 1; 
51  }
52  if ( can_run ("dmidecode") ) {
53    # 2.6 and under haven't -t parameter   
54    my $dmidecode_ver = `dmidecode -V 2>/dev/null`; 
55    my @SplitVersion = split(/\./, $dmidecode_ver);
56
57    if (@SplitVersion[0] > 2) {
58      return 1;
59    } elsif (@SplitVersion[0] == 2 && @SplitVersion[1] >= 7) {
60      return 1;
61    }
62  } 
63  return 0;
64} 
65
66sub run {
67    my $params = shift;
68    my $common = $params->{common};
69
70    my $dmidecode = '/usr/sbin/dmidecode';
71    my $cmd = '$dmidecode -t system';
72
73    my $dmesg = '/bin/dmesg | head -n 750';
74
75    my $status = "Physical";
76    my $found = 0;
77    # Solaris zones
78    my @solaris_zones;
79    @solaris_zones = `/usr/sbin/zoneadm list`;
80    @solaris_zones = grep (!/global/,@solaris_zones);
81    if(@solaris_zones){
82        $status = "SolarisZone";
83        $found = 1;
84    }
85 
86    if ( -d '/proc/xen' || check_file_content('/sys/devices/system/clocksource/clocksource0/available_clocksource','xen')) {
87        $found = 1 ;
88        if (check_file_content('/proc/xen/capabilities', 'control_d')) {
89          # dom0 host
90        } else {
91          # domU PV host
92          $status = "Xen";
93
94          # those information can't be extracted from dmidecode
95          $common->setBios ({
96            SMANUFACTURER => 'Xen',
97            SMODEL => 'PVM domU'
98          });
99        }
100    }
101
102    # dmidecode needs root to work :(
103    if ($found == 0 and -r '/dev/mem' && -x $dmidecode) {
104        my $sysprod = `$dmidecode -s system-product-name`;
105        if ($sysprod =~ /^VMware/) {
106          $status = "VMware";
107          $found = 1;
108        } elsif ($sysprod =~ /^Virtual Machine/) {
109          $status = "Virtual Machine";
110          $found = 1;
111        } else {
112          my $biosvend = `$dmidecode -s bios-vendor`;
113          if ($biosvend =~ /^QEMU/) {
114            $status = "QEMU";
115            $found = 1;
116          } elsif ($biosvend =~ /^Xen/) { # virtualized Xen
117            $status = "Xen";
118            $found = 1;
119          }
120        }
121    }
122
123    # Parse loaded modules
124    my %modmap = (
125        '^vmxnet\s' => 'VMware',
126        '^xen_\w+front\s' => 'Xen',
127    );
128
129    if ($found == 0 and open(HMODS, '/proc/modules')) {
130        while(<HMODS>) {
131          foreach my $str (keys %modmap) {
132            if (/$str/) {
133              $status = "$modmap{$str}";
134              $found = 1;
135              last;
136            }
137          }
138        }
139        close(HMODS);
140    }
141
142    # Let's parse some logs & /proc files for well known strings
143    my %msgmap = (
144        'VMware vmxnet virtual NIC driver' => 'VMware',
145        'Vendor: VMware\s+Model: Virtual disk' => 'VMware',
146        'Vendor: VMware,\s+Model: VMware Virtual ' => 'VMware',
147        ': VMware Virtual IDE CDROM Drive' => 'VMware',
148
149        ' QEMUAPIC ' => 'QEMU',
150        'QEMU Virtual CPU' => 'QEMU',
151        ': QEMU HARDDISK,' => 'QEMU',
152        ': QEMU CD-ROM,' => 'QEMU',
153
154        ': Virtual HD,' => 'Virtual Machine',
155        ': Virtual CD,' => 'Virtual Machine',
156
157        ' VBOXBIOS ' => 'VirtualBox',
158        ': VBOX HARDDISK,' => 'VirtualBox',
159        ': VBOX CD-ROM,' => 'VirtualBox',
160
161        'Hypervisor signature: xen' => 'Xen',
162        'Xen virtual console successfully installed' => 'Xen',
163        'Xen reported:' => 'Xen',
164        'Xen: \d+ - \d+' => 'Xen',
165        'xen-vbd: registered block device' => 'Xen',
166        'ACPI: RSDP \(v\d+\s+Xen ' => 'Xen',
167        'ACPI: XSDT \(v\d+\s+Xen ' => 'Xen',
168        'ACPI: FADT \(v\d+\s+Xen ' => 'Xen',
169        'ACPI: MADT \(v\d+\s+Xen ' => 'Xen',
170        'ACPI: HPET \(v\d+\s+Xen ' => 'Xen',
171        'ACPI: SSDT \(v\d+\s+Xen ' => 'Xen',
172        'ACPI: DSDT \(v\d+\s+Xen ' => 'Xen',
173    );
174
175    if ($found == 0 and open(HDMSG, '/var/log/dmesg')) {
176        while(<HDMSG>) {
177          foreach my $str (keys %msgmap) {
178            if (/$str/) {
179              $status = "$msgmap{$str}";
180              $found = 1;
181              last;
182            }
183          }
184        }
185        close(HDMSG);
186    }
187
188    # Read kernel ringbuffer directly
189    if ($found == 0 and open(HDMSG, '$dmesg |')) {
190        while(<HDMSG>) {
191          foreach my $str (keys %msgmap) {
192            if (/$str/) {
193              $status = "$msgmap{$str}";
194              $found = 1;
195              last;
196            }
197          }
198        }
199        close(HDMSG);
200    }
201
202    if ($found == 0 and open(HSCSI, '/proc/scsi/scsi')) {
203        while(<HSCSI>) {
204          foreach my $str (keys %msgmap) {
205            if (/$str/) {
206              $status = "$msgmap{$str}";
207              $found = 1;
208              last;
209            }
210          }
211        }
212        close(HSCSI);
213    }
214
215    $common->setHardware ({
216      VMSYSTEM => $status,
217      });
218}
219
220sub check_file_content {
221    my ($file, $pattern) = @_;
222
223    return 0 unless -r $file;
224
225    my $found = 0;
226    open (my $fh, '<', $file) or die "Can't open file $file: $!";
227    while (my $line = <$fh>) {
228        if ($line =~ /$pattern/) {
229            $found = 1;
230            last;
231        }
232    }
233    close ($fh);
234
235    return $found;
236}
237
2381;
Note: See TracBrowser for help on using the repository browser.