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

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

Copyt trusty code

File size: 6.4 KB
Line 
1package Ocsinventory::Agent::Backend::Virtualization::VirtualBox;
2
3# This module detects only all VMs create by the user who launch this module (root VMs).
4
5use strict;
6
7use XML::Simple;
8use File::Glob ':glob';
9
10sub check { return can_run('VirtualBox') and can_run('VBoxManage') }
11
12sub run {
13    my $params = shift;
14    my $common = $params->{common};
15    my $scanhomedirs = $params->{accountinfo}{config}{scanhomedirs};
16 
17    my $cmd_list_vms = "VBoxManage -nologo list vms";
18
19    my ( $version ) = ( `VBoxManage --version` =~ m/^(\d\.\d).*$/ ) ;
20    if ( $version > 2.1 ) {         # detect VirtualBox version 2.2 or higher
21            $cmd_list_vms = "VBoxManage -nologo list --long vms";
22    }
23   
24    my $in = 0;
25    my $uuid;
26    my $mem;
27    my $status;
28    my $name;
29       
30    foreach my $line (`$cmd_list_vms`){                 # read only the information on the first paragraph of each vm
31        chomp ($line);
32        if ($in == 0 and $line =~ m/^Name:\s+(.*)$/) {      # begin
33            $name = $1;
34            $in = 1; 
35        } elsif ($in == 1 ) {
36            if ($line =~ m/^UUID:\s+(.*)/) {
37                $uuid = $1;
38            } elsif ($line =~ m/^Memory size:\s+(.*)/ ) {
39                $mem = $1;
40            } elsif ($line =~ m/^State:\s+(.*)\(.*/) {
41                $status = ( $1 =~ m/off/ ? "off" : $1 );
42            }
43            elsif ($line =~ m/^\s*$/) {                        # finish
44                $in = 0 ;
45
46                next if $uuid =~ /^N\\A$/ ;   #If no UUID found, it is not a virtualmachine
47
48                $common->addVirtualMachine ({
49                    NAME      => $name,
50                    VCPU      => 1,
51                    UUID      => $uuid,
52                    MEMORY    => $mem,
53                    STATUS    => $status,
54                    SUBSYSTEM => "Sun xVM VirtualBox",
55                    VMTYPE    => "VirtualBox",
56                });
57
58                $name = $status = $mem = $uuid = 'N\A';     # useless but need it for security (new version, ...)
59            }
60
61        }
62    }
63   
64    if ($in == 1) {     # Anormal situation ! save the current vm information ...
65        $common->addVirtualMachine ({
66            NAME      => $name,
67            VCPU      => 1,
68            UUID      => $uuid,
69            MEMORY    => $mem,
70            STATUS    => $status,
71            SUBSYSTEM => "Sun xVM VirtualBox",
72            VMTYPE    => "VirtualBox",
73        });
74    }
75   
76    # try to found another VMs, not exectute by root
77    my @vmRunnings = ();
78    my $index = 0 ;
79    foreach my $line ( `ps -ef` ) {
80        chomp($line);
81        if ( $line !~ m/^root/) {
82            if ($line =~ m/^.*VirtualBox (.*)$/) {
83                my @process = split (/\s*\-\-/, $1);     #separate options
84               
85                $name = $uuid = "N/A";
86               
87                foreach my $option ( @process ) {
88                    print $option."\n";
89                    if ($option =~ m/^comment (.*)/) {
90                        $name = $1;
91                    } elsif ($option =~ m/^startvm (\S+)/) {
92                        $uuid = $1;
93                    }
94                }
95               
96                if ($scanhomedirs == 1 ) {    # If I will scan Home directories,
97                  $vmRunnings [$index] = $uuid;   # save the no-root running machine
98                  $index += 1;
99                } else {
100                  $common->addVirtualMachine ({  # add in inventory
101                    NAME      => $name,
102                    VCPU      => 1,
103                    UUID      => $uuid,
104                    STATUS    => "running",
105                    SUBSYSTEM => "Sun xVM VirtualBox",
106                    VMTYPE    => "VirtualBox",
107                  });
108                }
109            }
110        }
111    }
112       
113    # If home directories scan is authorized
114    if ($scanhomedirs == 1 ) {
115      # Read every Machines Xml File of every user
116      foreach my $xmlMachine (bsd_glob("/home/*/.VirtualBox/Machines/*/*.xml")) {
117        chomp($xmlMachine);
118        # Open config file ...
119        my $configFile = new XML::Simple;
120        my $data = $configFile->XMLin($xmlMachine);
121         
122        # ... and read it
123        if ($data->{Machine}->{uuid}) {
124          my $uuid = $data->{Machine}->{uuid};
125          $uuid =~ s/^{?(.{36})}?$/$1/;
126          my $status = "off";
127          foreach my $vmRun (@vmRunnings) {
128            if ($uuid eq $vmRun) {
129              $status = "running";
130            }
131          }
132         
133          $common->addVirtualMachine ({
134              NAME      => $data->{Machine}->{name},
135              VCPU      => $data->{Machine}->{Hardware}->{CPU}->{count},
136              UUID      => $uuid,
137              MEMORY    => $data->{Machine}->{Hardware}->{Memory}->{RAMSize},
138              STATUS    => $status,
139              SUBSYSTEM => "Sun xVM VirtualBox",
140              VMTYPE    => "VirtualBox",
141          });
142        }
143      }
144     
145      foreach my $xmlVirtualBox (bsd_glob("/home/*/.VirtualBox/VirtualBox.xml")) {
146        chomp($xmlVirtualBox);
147        # Open config file ...
148        my $configFile = new XML::Simple;
149        my $data = $configFile->XMLin($xmlVirtualBox);
150       
151        # ... and read it
152        my $defaultMachineFolder = $data->{Global}->{SystemProperties}->{defaultMachineFolder};
153        if ( $defaultMachineFolder != 0 and $defaultMachineFolder != "Machines" 
154            and $defaultMachineFolder =~ /^\/home\/S+\/.VirtualBox\/Machines$/ ) {
155         
156          foreach my $xmlMachine (bsd_glob($defaultMachineFolder."/*/*.xml")) {
157            my $configFile = new XML::Simple;
158            my $data = $configFile->XMLin($xmlVirtualBox);
159           
160            if ( $data->{Machine} != 0 and $data->{Machine}->{uuid} != 0 ) {
161              my $uuid = $data->{Machine}->{uuid};
162              $uuid =~ s/^{?(.{36})}?$/$1/;
163              my $status = "off";
164              foreach my $vmRun (@vmRunnings) {
165                if ($uuid eq $vmRun) {
166                  $status = "running";
167                }
168              }
169             
170              $common->addVirtualMachine ({
171                  NAME      => $data->{Machine}->{name},
172                  VCPU      => $data->{Machine}->{Hardware}->{CPU}->{count},
173                  UUID      => $uuid,
174                  MEMORY    => $data->{Machine}->{Hardware}->{Memory}->{RAMSize},
175                  STATUS    => $status,
176                  SUBSYSTEM => "Sun xVM VirtualBox",
177                  VMTYPE    => "VirtualBox",
178              });
179            }
180          }
181        }
182      }
183    }
184}
185
1861;
Note: See TracBrowser for help on using the repository browser.