diff --git a/database-update.sql b/database-update.sql
index a37fbe52f0..07dda27113 100644
--- a/database-update.sql
+++ b/database-update.sql
@@ -30,3 +30,5 @@ ALTER TABLE `vrfs` MODIFY `vrf_name` VARCHAR(128);
ALTER TABLE `ports` MODIFY `ifDescr` VARCHAR(255);
CREATE TABLE IF NOT EXISTS `vmware_vminfo` (`id` int(11) NOT NULL AUTO_INCREMENT, `device_id` int(11) NOT NULL, `vmwVmVMID` int(11) NOT NULL, `vmwVmDisplayName` varchar(128) NOT NULL, `vmwVmGuestOS` varchar(128) NOT NULL, `vmwVmMemSize` int(11) NOT NULL, `vmwVmCpus` int(11) NOT NULL, `vmwVmState` varchar(128) NOT NULL, PRIMARY KEY (`id`), KEY `device_id` (`device_id`), KEY `vmwVmVMID` (`vmwVmVMID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `ports` MODIFY `port_descr_type` VARCHAR(255);
+RENAME TABLE `vmware_vminfo` TO `vminfo` ;
+ALTER TABLE `vminfo` ADD `vm_type` VARCHAR(16) NOT NULL DEFAULT 'vmware' AFTER `device_id`;
diff --git a/discovery.php b/discovery.php
index 83968c5cdb..3fc8d57631 100755
--- a/discovery.php
+++ b/discovery.php
@@ -194,6 +194,7 @@ while ($device = mysql_fetch_assoc($device_query))
include("includes/discovery/cisco-pw.inc.php");
include("includes/discovery/cisco-vrf.inc.php");
include("includes/discovery/vmware-vminfo.inc.php");
+ include("includes/discovery/libvirt-vminfo.inc.php");
include("includes/discovery/toner.inc.php");
include("includes/discovery/ucd-diskio.inc.php");
include("includes/discovery/services.inc.php");
diff --git a/html/includes/print-vm.inc.php b/html/includes/print-vm.inc.php
index 15ca83e378..559e6d5e4f 100644
--- a/html/includes/print-vm.inc.php
+++ b/html/includes/print-vm.inc.php
@@ -2,23 +2,29 @@
if (!is_integer($i/2)) { $bg_colour = $list_colour_a; } else { $bg_colour = $list_colour_b; }
-echo("
");
+echo('
');
-echo("" . $vm['vmwVmDisplayName'] . " | ");
-echo("" . $vm['vmwVmState'] . " | ");
+echo('' . $vm['vmwVmDisplayName'] . " | ");
+echo('' . $vm['vmwVmState'] . " | ");
-if ($vm['vmwVmGuestOS'] == "E: tools not installed") {
- echo("Unknown (VMware Tools not installed) | ");
+if ($vm['vmwVmGuestOS'] == "E: tools not installed")
+{
+ echo('Unknown (VMware Tools not installed) | ');
+}
+else if ($vm['vmwVmGuestOS'] == "")
+{
+ echo('(Unknown) | ');
} else {
- echo("" . $config['vmware_guestid'][$vm['vmwVmGuestOS']] . " | ");
+ echo('' . $config['vmware_guestid'][$vm['vmwVmGuestOS']] . " | ");
}
-if ($vm['vmwVmMemSize'] >= 1024) {
- echo("" . $vm['vmwVmMemSize']/1024 . " GB | ");
+if ($vm['vmwVmMemSize'] >= 1024)
+{
+ echo("" . $vm['vmwVmMemSize']/1024 . " GB | ");
} else {
- echo("" . $vm['vmwVmMemSize'] . " MB | ");
+ echo("" . $vm['vmwVmMemSize'] . " MB | ");
}
-echo("" . $vm['vmwVmCpus'] . " CPU | ");
+echo('' . $vm['vmwVmCpus'] . " CPU | ");
?>
diff --git a/html/pages/device.inc.php b/html/pages/device.inc.php
index ad82b771dc..1f00f834b5 100644
--- a/html/pages/device.inc.php
+++ b/html/pages/device.inc.php
@@ -104,7 +104,7 @@ if (device_permitted($_GET['id']) || $check_device == $_GET['id'])
');
}
- if (@mysql_result(mysql_query("SELECT COUNT(id) FROM vmware_vminfo WHERE device_id = '" . $device["device_id"] . "'"), 0) > '0')
+ if (@mysql_result(mysql_query("SELECT COUNT(id) FROM vminfo WHERE device_id = '" . $device["device_id"] . "'"), 0) > '0')
{
echo('
diff --git a/html/pages/device/vm.inc.php b/html/pages/device/vm.inc.php
index d0ff8fd668..262c623abc 100644
--- a/html/pages/device/vm.inc.php
+++ b/html/pages/device/vm.inc.php
@@ -3,7 +3,7 @@
echo('Server Name | Power Status | Operating System | Memory | CPU |
');
$i = "1";
-$vm_query = mysql_query("SELECT id, vmwVmVMID, vmwVmDisplayName, vmwVmGuestOS, vmwVmMemSize, vmwVmCpus, vmwVmState FROM vmware_vminfo WHERE device_id = '".$device['device_id']."' ORDER BY vmwVmDisplayName");
+$vm_query = mysql_query("SELECT id, vmwVmVMID, vmwVmDisplayName, vmwVmGuestOS, vmwVmMemSize, vmwVmCpus, vmwVmState FROM vminfo WHERE device_id = '".$device['device_id']."' ORDER BY vmwVmDisplayName");
while ($vm = mysql_fetch_assoc($vm_query))
{
diff --git a/includes/defaults.inc.php b/includes/defaults.inc.php
index 0abd953f7a..8d4b3158d2 100644
--- a/includes/defaults.inc.php
+++ b/includes/defaults.inc.php
@@ -22,6 +22,7 @@ $config['mtr'] = "/usr/bin/mtr";
$config['nmap'] = "/usr/bin/nmap";
$config['nagios_plugins'] = "/usr/lib/nagios/plugins";
$config['ipmitool'] = "/usr/bin/ipmitool";
+$config['virsh'] = "/usr/bin/virsh";
### RRDCacheD - Make sure it can write to your RRD dir!
@@ -127,7 +128,8 @@ $config['enable_bgp'] = 1; # Enable BGP session collection and displa
$config['enable_syslog'] = 0; # Enable Syslog
$config['enable_inventory'] = 1; # Enable Inventory
$config['enable_pseudowires'] = 1; # Enable Pseudowires
-$config['enable_printers'] = 0; # Enable Printer support
+$config['enable_printers'] = 0; # Enable Printer support
+$config['enable_libvirt'] = 0; # Enable Libvirt VM support
### Ports extension modules
diff --git a/includes/discovery/libvirt-vminfo.inc.php b/includes/discovery/libvirt-vminfo.inc.php
new file mode 100755
index 0000000000..681756d0da
--- /dev/null
+++ b/includes/discovery/libvirt-vminfo.inc.php
@@ -0,0 +1,108 @@
+
+ # moo.example.com
+ # 48cf6378-6fd5-4610-0611-63dd4b31cfd6
+ # 1048576
+ # 1048576
+ # 8
+ #
+ # hvm
+ #
+ #
+ #
+ #
+ # (...)
+
+ # Convert array to string
+ unset($vm_info_xml);
+ foreach ($vm_info_array as $line) { $vm_info_xml .= $line; }
+
+ $xml = simplexml_load_string(' ' . $vm_info_xml);
+ if ($debug) { print_r($xml); }
+
+ $vmwVmDisplayName = $xml->name;
+ $vmwVmGuestOS = ''; # libvirt does not supply this
+ $vmwVmMemSize = $xml->currentMemory / 1024;
+ exec($config['virsh'] . ' -c '.$method.'://' . $device['hostname'] . '/system domstate ' . $dom_id,$vm_state);
+ $vmwVmState = ucfirst($vm_state[0]);
+ $vmwVmCpus = $xml->vcpu;
+
+ # Check whether the Virtual Machine is already known for this host.
+ $result = mysql_query("SELECT * FROM vminfo WHERE device_id = '" . $device["device_id"] . "' AND vmwVmVMID = '" . $dom_id . "' AND vm_type='libvirt'");
+ if (mysql_num_rows($result) == 0)
+ {
+ mysql_query("INSERT INTO vminfo (device_id, vm_type, vmwVmVMID, vmwVmDisplayName, vmwVmGuestOS, vmwVmMemSize, vmwVmCpus, vmwVmState) VALUES (" . $device["device_id"] . ", 'libvirt',
+ '" . $dom_id . "', '" . mres($vmwVmDisplayName) . "', '" . mres($vmwVmGuestOS) . "', '" . $vmwVmMemSize . "', '" . $vmwVmCpus . "', '" . mres($vmwVmState) . "')");
+ echo("+");
+ # FIXME eventlog
+ } else {
+ $row = mysql_fetch_assoc($result);
+ if ($row['vmwVmState'] != $vmwVmState
+ || $row['vmwVmDisplayName'] != $vmwVmDisplayName
+ || $row['vmwVmCpus'] != $vmwVmCpus
+ || $row['vmwVmGuestOS'] != $vmwVmGuestOS
+ || $row['vmwVmMemSize'] != $vmwVmMemSize)
+ {
+ mysql_query("UPDATE vminfo SET vmwVmState='" . mres($vmwVmState) . "', vmwVmGuestOS='" . mres($vmwVmGuestOS) . "', vmwVmDisplayName='". mres($vmwVmDisplayName) . "',
+ vmwVmMemSize='" . mres($vmwVmMemSize) . "', vmwVmCpus='" . mres($vmwVmCpus) . "' WHERE device_id='" . $device["device_id"] . "' AND vm_type='libvirt' AND vmwVmVMID='" . $dom_id . "'");
+ echo("U");
+ # FIXME eventlog
+ }
+ else
+ {
+ echo(".");
+ }
+ }
+
+ # Save the discovered Virtual Machine.
+ $libvirt_vmlist[] = $dom_id;
+ }
+ }
+
+ # Get a list of all the known Virtual Machines for this host.
+ $db_vm_list = mysql_query("SELECT id, vmwVmVMID FROM vminfo WHERE device_id = '" . $device["device_id"] . "' AND vm_type='libvirt'");
+
+ while ($db_vm = mysql_fetch_assoc($db_vm_list))
+ {
+ # Delete the Virtual Machines that are removed from the host.
+
+ if (!in_array($db_vm["vmwVmVMID"], $libvirt_vmlist))
+ {
+ mysql_query("DELETE FROM vminfo WHERE id = '" . $db_vm["id"] . "'");
+ echo("-");
+ # FIXME eventlog
+ }
+ }
+
+ echo("\n");
+}
+
+?>
\ No newline at end of file
diff --git a/includes/discovery/vmware-vminfo.inc.php b/includes/discovery/vmware-vminfo.inc.php
index 9d372c0fc3..6834934d89 100755
--- a/includes/discovery/vmware-vminfo.inc.php
+++ b/includes/discovery/vmware-vminfo.inc.php
@@ -1,5 +1,7 @@
" . $vm_info[$property], $device);
}
}