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(''); $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); } }
    Server NamePower StatusOperating SystemMemoryCPU