This file is just one class wrapping some libvirt APIs. However, its formatting is just messy. Resolve this. Best viewed with: git show --ignore-space-change Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> --- examples/libvirt.php | 2308 +++++++++++++++++++++++++------------------------- 1 file changed, 1154 insertions(+), 1154 deletions(-) diff --git a/examples/libvirt.php b/examples/libvirt.php index cb1a0ad..89aeb9f 100644 --- a/examples/libvirt.php +++ b/examples/libvirt.php @@ -1,1177 +1,1177 @@ <?php - class Libvirt { - private $conn; - private $last_error; - private $allow_cached = true; - private $dominfos = array(); +class Libvirt { + private $conn; + private $last_error; + private $allow_cached = true; + private $dominfos = array(); - function Libvirt($uri = false, $debug=false) { - if ($debug) - $this->set_logfile($debug); - if ($uri != false) - $this->connect($uri); - } + function Libvirt($uri = false, $debug=false) { + if ($debug) + $this->set_logfile($debug); + if ($uri != false) + $this->connect($uri); + } - function _set_last_error() - { - $this->last_error = libvirt_get_last_error(); - return false; - } + function _set_last_error() + { + $this->last_error = libvirt_get_last_error(); + return false; + } - function set_logfile($filename) - { - if (!libvirt_logfile_set($filename)) - return $this->_set_last_error(); + function set_logfile($filename) + { + if (!libvirt_logfile_set($filename)) + return $this->_set_last_error(); - return true; - } + return true; + } - function print_resources() { - return libvirt_print_binding_resources(); - } + function print_resources() { + return libvirt_print_binding_resources(); + } - function connect($uri = 'null') { - $this->conn=libvirt_connect($uri, false); - if ($this->conn==false) - return $this->_set_last_error(); - } + function connect($uri = 'null') { + $this->conn=libvirt_connect($uri, false); + if ($this->conn==false) + return $this->_set_last_error(); + } - function domain_disk_add($domain, $img, $dev, $type='scsi', $driver='raw') { - $dom = $this->get_domain_object($domain); + function domain_disk_add($domain, $img, $dev, $type='scsi', $driver='raw') { + $dom = $this->get_domain_object($domain); - $tmp = libvirt_domain_disk_add($dom, $img, $dev, $type, $driver); - return ($tmp) ? $tmp : $this->_set_last_error(); + $tmp = libvirt_domain_disk_add($dom, $img, $dev, $type, $driver); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function domain_change_numVCpus($domain, $num) { + $dom = $this->get_domain_object($domain); + + $tmp = libvirt_domain_change_vcpus($dom, $num); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function domain_change_memory_allocation($domain, $memory, $maxmem) { + $dom = $this->get_domain_object($domain); + + $tmp = libvirt_domain_change_memory($dom, $memory, $maxmem); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function domain_change_boot_devices($domain, $first, $second) { + $dom = $this->get_domain_object($domain); + + $tmp = libvirt_domain_change_boot_devices($dom, $first, $second); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function domain_get_screenshot($domain) { + $dom = $this->get_domain_object($domain); + + $tmp = libvirt_domain_get_screenshot($dom, $this->get_hostname() ); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function domain_get_screenshot_thumbnail($domain, $w=120) { + $screen = $this->domain_get_screenshot($domain); + $imgFile = tempnam("/tmp", "libvirt-php-tmp-resize-XXXXXX");; + + if ($screen) { + $fp = fopen($imgFile, "wb"); + fwrite($fp, $screen); + fclose($fp); + } + + if (file_exists($imgFile) && $screen) { + list($width, $height) = getimagesize($imgFile); + $h = ($height / $width) * $w; + } else { + $w = $h = 1; + //$h = $w * (3 / 4.5); + } + + $new = imagecreatetruecolor($w, $h); + if ($screen) { + $img = imagecreatefrompng($imgFile); + imagecopyresampled($new,$img,0,0,0,0, $w,$h,$width,$height); + imagedestroy($img); + } + else { + $c = imagecolorallocate($new, 255, 255, 255); + imagefill($new, 0, 0, $c); + } + + imagepng($new, $imgFile); + imagedestroy($new); + + $fp = fopen($imgFile, "rb"); + $data = fread($fp, filesize($imgFile)); + fclose($fp); + + unlink($imgFile); + return $data; + } + + function domain_get_screen_dimensions($domain) { + $screen = $this->domain_get_screenshot($domain); + $imgFile = tempnam("/tmp", "libvirt-php-tmp-resize-XXXXXX");; + + $width = false; + $height = false; + + if ($screen) { + $fp = fopen($imgFile, "wb"); + fwrite($fp, $screen); + fclose($fp); + } + if (file_exists($imgFile) && $screen) + list($width, $height) = getimagesize($imgFile); + + unlink($imgFile); + + return array('height' => $height, 'width' => $width); + } + + function domain_send_keys($domain, $keys) { + $dom = $this->get_domain_object($domain); + + $tmp = libvirt_domain_send_keys($dom, $this->get_hostname(), $keys); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function domain_send_pointer_event($domain, $x, $y, $clicked = 1) { + $dom = $this->get_domain_object($domain); + + $tmp = libvirt_domain_send_pointer_event($dom, $this->get_hostname(), $x, $y, $clicked, true); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function domain_disk_remove($domain, $dev) { + $dom = $this->get_domain_object($domain); + + $tmp = libvirt_domain_disk_remove($dom, $dev); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function supports($name) { + return libvirt_has_feature($name); + } + + function macbyte($val) { + if ($val < 16) + return '0'.dechex($val); + + return dechex($val); + } + + function generate_random_mac_addr($seed=false) { + if (!$seed) + $seed = 1; + + if ($this->get_hypervisor_name() == 'qemu') + $prefix = '52:54:00'; + else + if ($this->get_hypervisor_name() == 'xen') + $prefix = '00:16:3e'; + else + $prefix = $this->macbyte(($seed * rand()) % 256).':'. + $this->macbyte(($seed * rand()) % 256).':'. + $this->macbyte(($seed * rand()) % 256); + + return $prefix.':'. + $this->macbyte(($seed * rand()) % 256).':'. + $this->macbyte(($seed * rand()) % 256).':'. + $this->macbyte(($seed * rand()) % 256); + } + + function domain_nic_add($domain, $mac, $network, $model=false) { + $dom = $this->get_domain_object($domain); + + if ($model == 'default') + $model = false; + + $tmp = libvirt_domain_nic_add($dom, $mac, $network, $model); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function domain_nic_remove($domain, $mac) { + $dom = $this->get_domain_object($domain); + + $tmp = libvirt_domain_nic_remove($dom, $mac); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function get_connection() { + return $this->conn; + } + + function get_hostname() { + return libvirt_connect_get_hostname($this->conn); + } + + function get_domain_object($nameRes) { + if (is_resource($nameRes)) + return $nameRes; + + $dom=libvirt_domain_lookup_by_name($this->conn, $nameRes); + if (!$dom) { + $dom=libvirt_domain_lookup_by_uuid_string($this->conn, $nameRes); + if (!$dom) + return $this->_set_last_error(); + } + + return $dom; + } + + function get_xpath($domain, $xpath, $inactive = false) { + $dom = $this->get_domain_object($domain); + $flags = 0; + if ($inactive) + $flags = VIR_DOMAIN_XML_INACTIVE; + + $tmp = libvirt_domain_xml_xpath($dom, $xpath, $flags); + if (!$tmp) + return $this->_set_last_error(); + + return $tmp; + } + + function get_cdrom_stats($domain, $sort=true) { + $dom = $this->get_domain_object($domain); + + $buses = $this->get_xpath($dom, '//domain/devices/disk[@device="cdrom"]/target/@bus', false); + $disks = $this->get_xpath($dom, '//domain/devices/disk[@device="cdrom"]/target/@dev', false); + + $ret = array(); + for ($i = 0; $i < $disks['num']; $i++) { + $tmp = libvirt_domain_get_block_info($dom, $disks[$i]); + if ($tmp) { + $tmp['bus'] = $buses[$i]; + $ret[] = $tmp; + } + else + $this->_set_last_error(); + } + + if ($sort) { + for ($i = 0; $i < sizeof($ret); $i++) { + for ($ii = 0; $ii < sizeof($ret); $ii++) { + if (strcmp($ret[$i]['device'], $ret[$ii]['device']) < 0) { + $tmp = $ret[$i]; + $ret[$i] = $ret[$ii]; + $ret[$ii] = $tmp; + } } + } + } - function domain_change_numVCpus($domain, $num) { - $dom = $this->get_domain_object($domain); + unset($buses); + unset($disks); - $tmp = libvirt_domain_change_vcpus($dom, $num); - return ($tmp) ? $tmp : $this->_set_last_error(); - } + return $ret; + } - function domain_change_memory_allocation($domain, $memory, $maxmem) { - $dom = $this->get_domain_object($domain); + function get_disk_stats($domain, $sort=true) { + $dom = $this->get_domain_object($domain); - $tmp = libvirt_domain_change_memory($dom, $memory, $maxmem); - return ($tmp) ? $tmp : $this->_set_last_error(); - } + $buses = $this->get_xpath($dom, '//domain/devices/disk[@device="disk"]/target/@bus', false); + $disks = $this->get_xpath($dom, '//domain/devices/disk[@device="disk"]/target/@dev', false); + // create image as: qemu-img create -f qcow2 -o backing_file=RAW_IMG OUT_QCOW_IMG SIZE[K,M,G suffixed] - function domain_change_boot_devices($domain, $first, $second) { - $dom = $this->get_domain_object($domain); + $ret = array(); + for ($i = 0; $i < $disks['num']; $i++) { + $tmp = libvirt_domain_get_block_info($dom, $disks[$i]); + if ($tmp) { + $tmp['bus'] = $buses[$i]; + $ret[] = $tmp; + } + else + $this->_set_last_error(); + } - $tmp = libvirt_domain_change_boot_devices($dom, $first, $second); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function domain_get_screenshot($domain) { - $dom = $this->get_domain_object($domain); - - $tmp = libvirt_domain_get_screenshot($dom, $this->get_hostname() ); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function domain_get_screenshot_thumbnail($domain, $w=120) { - $screen = $this->domain_get_screenshot($domain); - $imgFile = tempnam("/tmp", "libvirt-php-tmp-resize-XXXXXX");; - - if ($screen) { - $fp = fopen($imgFile, "wb"); - fwrite($fp, $screen); - fclose($fp); - } - - if (file_exists($imgFile) && $screen) { - list($width, $height) = getimagesize($imgFile); - $h = ($height / $width) * $w; - } else { - $w = $h = 1; - //$h = $w * (3 / 4.5); - } - - $new = imagecreatetruecolor($w, $h); - if ($screen) { - $img = imagecreatefrompng($imgFile); - imagecopyresampled($new,$img,0,0,0,0, $w,$h,$width,$height); - imagedestroy($img); - } - else { - $c = imagecolorallocate($new, 255, 255, 255); - imagefill($new, 0, 0, $c); - } - - imagepng($new, $imgFile); - imagedestroy($new); - - $fp = fopen($imgFile, "rb"); - $data = fread($fp, filesize($imgFile)); - fclose($fp); - - unlink($imgFile); - return $data; - } - - function domain_get_screen_dimensions($domain) { - $screen = $this->domain_get_screenshot($domain); - $imgFile = tempnam("/tmp", "libvirt-php-tmp-resize-XXXXXX");; - - $width = false; - $height = false; - - if ($screen) { - $fp = fopen($imgFile, "wb"); - fwrite($fp, $screen); - fclose($fp); - } - if (file_exists($imgFile) && $screen) - list($width, $height) = getimagesize($imgFile); - - unlink($imgFile); - - return array('height' => $height, 'width' => $width); - } - - function domain_send_keys($domain, $keys) { - $dom = $this->get_domain_object($domain); - - $tmp = libvirt_domain_send_keys($dom, $this->get_hostname(), $keys); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function domain_send_pointer_event($domain, $x, $y, $clicked = 1) { - $dom = $this->get_domain_object($domain); - - $tmp = libvirt_domain_send_pointer_event($dom, $this->get_hostname(), $x, $y, $clicked, true); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function domain_disk_remove($domain, $dev) { - $dom = $this->get_domain_object($domain); - - $tmp = libvirt_domain_disk_remove($dom, $dev); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function supports($name) { - return libvirt_has_feature($name); - } - - function macbyte($val) { - if ($val < 16) - return '0'.dechex($val); - - return dechex($val); - } - - function generate_random_mac_addr($seed=false) { - if (!$seed) - $seed = 1; - - if ($this->get_hypervisor_name() == 'qemu') - $prefix = '52:54:00'; - else - if ($this->get_hypervisor_name() == 'xen') - $prefix = '00:16:3e'; - else - $prefix = $this->macbyte(($seed * rand()) % 256).':'. - $this->macbyte(($seed * rand()) % 256).':'. - $this->macbyte(($seed * rand()) % 256); - - return $prefix.':'. - $this->macbyte(($seed * rand()) % 256).':'. - $this->macbyte(($seed * rand()) % 256).':'. - $this->macbyte(($seed * rand()) % 256); - } - - function domain_nic_add($domain, $mac, $network, $model=false) { - $dom = $this->get_domain_object($domain); - - if ($model == 'default') - $model = false; - - $tmp = libvirt_domain_nic_add($dom, $mac, $network, $model); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function domain_nic_remove($domain, $mac) { - $dom = $this->get_domain_object($domain); - - $tmp = libvirt_domain_nic_remove($dom, $mac); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function get_connection() { - return $this->conn; - } - - function get_hostname() { - return libvirt_connect_get_hostname($this->conn); - } - - function get_domain_object($nameRes) { - if (is_resource($nameRes)) - return $nameRes; - - $dom=libvirt_domain_lookup_by_name($this->conn, $nameRes); - if (!$dom) { - $dom=libvirt_domain_lookup_by_uuid_string($this->conn, $nameRes); - if (!$dom) - return $this->_set_last_error(); - } - - return $dom; - } - - function get_xpath($domain, $xpath, $inactive = false) { - $dom = $this->get_domain_object($domain); - $flags = 0; - if ($inactive) - $flags = VIR_DOMAIN_XML_INACTIVE; - - $tmp = libvirt_domain_xml_xpath($dom, $xpath, $flags); - if (!$tmp) - return $this->_set_last_error(); - - return $tmp; - } - - function get_cdrom_stats($domain, $sort=true) { - $dom = $this->get_domain_object($domain); - - $buses = $this->get_xpath($dom, '//domain/devices/disk[@device="cdrom"]/target/@bus', false); - $disks = $this->get_xpath($dom, '//domain/devices/disk[@device="cdrom"]/target/@dev', false); - - $ret = array(); - for ($i = 0; $i < $disks['num']; $i++) { - $tmp = libvirt_domain_get_block_info($dom, $disks[$i]); - if ($tmp) { - $tmp['bus'] = $buses[$i]; - $ret[] = $tmp; - } - else - $this->_set_last_error(); - } - - if ($sort) { - for ($i = 0; $i < sizeof($ret); $i++) { - for ($ii = 0; $ii < sizeof($ret); $ii++) { - if (strcmp($ret[$i]['device'], $ret[$ii]['device']) < 0) { - $tmp = $ret[$i]; - $ret[$i] = $ret[$ii]; - $ret[$ii] = $tmp; - } - } - } - } - - unset($buses); - unset($disks); - - return $ret; - } - - function get_disk_stats($domain, $sort=true) { - $dom = $this->get_domain_object($domain); - - $buses = $this->get_xpath($dom, '//domain/devices/disk[@device="disk"]/target/@bus', false); - $disks = $this->get_xpath($dom, '//domain/devices/disk[@device="disk"]/target/@dev', false); - // create image as: qemu-img create -f qcow2 -o backing_file=RAW_IMG OUT_QCOW_IMG SIZE[K,M,G suffixed] - - $ret = array(); - for ($i = 0; $i < $disks['num']; $i++) { - $tmp = libvirt_domain_get_block_info($dom, $disks[$i]); - if ($tmp) { - $tmp['bus'] = $buses[$i]; - $ret[] = $tmp; - } - else - $this->_set_last_error(); - } - - if ($sort) { - for ($i = 0; $i < sizeof($ret); $i++) { - for ($ii = 0; $ii < sizeof($ret); $ii++) { - if (strcmp($ret[$i]['device'], $ret[$ii]['device']) < 0) { - $tmp = $ret[$i]; - $ret[$i] = $ret[$ii]; - $ret[$ii] = $tmp; - } - } - } - } - - unset($buses); - unset($disks); - - return $ret; - } - - function get_nic_info($domain) { - $dom = $this->get_domain_object($domain); - - $macs = $this->get_xpath($dom, '//domain/devices/interface[@type="network"]/mac/@address', false); - if (!$macs) - return $this->_set_last_error(); - - $ret = array(); - for ($i = 0; $i < $macs['num']; $i++) { - $tmp = libvirt_domain_get_network_info($dom, $macs[$i]); - if ($tmp) - $ret[] = $tmp; - else - $this->_set_last_error(); - } - - return $ret; + if ($sort) { + for ($i = 0; $i < sizeof($ret); $i++) { + for ($ii = 0; $ii < sizeof($ret); $ii++) { + if (strcmp($ret[$i]['device'], $ret[$ii]['device']) < 0) { + $tmp = $ret[$i]; + $ret[$i] = $ret[$ii]; + $ret[$ii] = $tmp; + } } + } + } - function get_domain_type($domain) { - $dom = $this->get_domain_object($domain); + unset($buses); + unset($disks); - $tmp = $this->get_xpath($dom, '//domain/@type', false); - if ($tmp['num'] == 0) - return $this->_set_last_error(); + return $ret; + } - $ret = $tmp[0]; - unset($tmp); + function get_nic_info($domain) { + $dom = $this->get_domain_object($domain); - return $ret; + $macs = $this->get_xpath($dom, '//domain/devices/interface[@type="network"]/mac/@address', false); + if (!$macs) + return $this->_set_last_error(); + + $ret = array(); + for ($i = 0; $i < $macs['num']; $i++) { + $tmp = libvirt_domain_get_network_info($dom, $macs[$i]); + if ($tmp) + $ret[] = $tmp; + else + $this->_set_last_error(); + } + + return $ret; + } + + function get_domain_type($domain) { + $dom = $this->get_domain_object($domain); + + $tmp = $this->get_xpath($dom, '//domain/@type', false); + if ($tmp['num'] == 0) + return $this->_set_last_error(); + + $ret = $tmp[0]; + unset($tmp); + + return $ret; + } + + function get_domain_emulator($domain) { + $dom = $this->get_domain_object($domain); + + $tmp = $this->get_xpath($dom, '//domain/devices/emulator', false); + if ($tmp['num'] == 0) + return $this->_set_last_error(); + + $ret = $tmp[0]; + unset($tmp); + + return $ret; + } + + function get_network_cards($domain) { + $dom = $this->get_domain_object($domain); + + $nics = $this->get_xpath($dom, '//domain/devices/interface[@type="network"]', false); + if (!is_array($nics)) + return $this->_set_last_error(); + + return $nics['num']; + } + + function get_disk_capacity($domain, $physical=false, $disk='*', $unit='?') { + $dom = $this->get_domain_object($domain); + $tmp = $this->get_disk_stats($dom); + + $ret = 0; + for ($i = 0; $i < sizeof($tmp); $i++) { + if (($disk == '*') || ($tmp[$i]['device'] == $disk)) + if ($physical) + $ret += $tmp[$i]['physical']; + else + $ret += $tmp[$i]['capacity']; + } + unset($tmp); + + return $this->format_size($ret, 2, $unit); + } + + function get_disk_count($domain) { + $dom = $this->get_domain_object($domain); + $tmp = $this->get_disk_stats($dom); + $ret = sizeof($tmp); + unset($tmp); + + return $ret; + } + + function format_size($value, $decimals, $unit='?') { + /* Autodetect unit that's appropriate */ + if ($unit == '?') { + /* (1 << 40) is not working correctly on i386 systems */ + if ($value > 1099511627776) + $unit = 'T'; + else + if ($value > (1 << 30)) + $unit = 'G'; + else + if ($value > (1 << 20)) + $unit = 'M'; + else + if ($value > (1 << 10)) + $unit = 'K'; + else + $unit = 'B'; + } + + $unit = strtoupper($unit); + + switch ($unit) { + case 'T': return number_format($value / (float)1099511627776, $decimals, '.', ' ').' TB'; + case 'G': return number_format($value / (float)(1 << 30), $decimals, '.', ' ').' GB'; + case 'M': return number_format($value / (float)(1 << 20), $decimals, '.', ' ').' MB'; + case 'K': return number_format($value / (float)(1 << 10), $decimals, '.', ' ').' kB'; + case 'B': return $value.' B'; + } + + return false; + } + + function get_uri() { + $tmp = libvirt_connect_get_uri($this->conn); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function get_domain_count() { + $tmp = libvirt_domain_get_counts($this->conn); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function get_storagepools() { + $tmp = libvirt_list_storagepools($this->conn); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function get_storagepool_res($res) { + if ($res == false) + return false; + if (is_resource($res)) + return $res; + + $tmp = libvirt_storagepool_lookup_by_name($this->conn, $res); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function get_storagepool_info($name) { + if (!($res = $this->get_storagepool_res($name))) + return false; + + $path = libvirt_storagepool_get_xml_desc($res, '/pool/target/path'); + if (!$path) + return $this->_set_last_error(); + $perms = libvirt_storagepool_get_xml_desc($res, '/pool/target/permissions/mode'); + if (!$perms) + return $this->_set_last_error(); + $otmp1 = libvirt_storagepool_get_xml_desc($res, '/pool/target/permissions/owner'); + if (!is_string($otmp1)) + return $this->_set_last_error(); + $otmp2 = libvirt_storagepool_get_xml_desc($res, '/pool/target/permissions/group'); + if (!is_string($otmp2)) + return $this->_set_last_error(); + $tmp = libvirt_storagepool_get_info($res); + $tmp['volume_count'] = sizeof( libvirt_storagepool_list_volumes($res) ); + $tmp['active'] = libvirt_storagepool_is_active($res); + $tmp['path'] = $path; + $tmp['permissions'] = $perms; + $tmp['id_user'] = $otmp1; + $tmp['id_group'] = $otmp2; + + return $tmp; + } + + function storagepool_get_volume_information($pool, $name=false) { + if (!is_resource($pool)) + $pool = $this->get_storagepool_res($pool); + if (!$pool) + return false; + + $out = array(); + $tmp = libvirt_storagepool_list_volumes($pool); + for ($i = 0; $i < sizeof($tmp); $i++) { + if (($tmp[$i] == $name) || ($name == false)) { + $r = libvirt_storagevolume_lookup_by_name($pool, $tmp[$i]); + $out[$tmp[$i]] = libvirt_storagevolume_get_info($r); + $out[$tmp[$i]]['path'] = libvirt_storagevolume_get_path($r); + unset($r); + } + } + + return $out; + } + + function storagevolume_delete($path) { + $vol = libvirt_storagevolume_lookup_by_path($this->conn, $path); + if (!libvirt_storagevolume_delete($vol)) + return $this->_set_last_error(); + + return true; + } + + function translate_volume_type($type) { + if ($type == 1) + return 'Block device'; + + return 'File image'; + } + + function translate_perms($mode) { + $mode = (string)((int)$mode); + + $tmp = '---------'; + + for ($i = 0; $i < 3; $i++) { + $bits = (int)$mode[$i]; + if ($bits & 4) + $tmp[ ($i * 3) ] = 'r'; + if ($bits & 2) + $tmp[ ($i * 3) + 1 ] = 'w'; + if ($bits & 1) + $tmp[ ($i * 3) + 2 ] = 'x'; + } + + + return $tmp; + } + + function parse_size($size) { + $unit = $size[ strlen($size) - 1 ]; + + $size = (int)$size; + switch (strtoupper($unit)) { + case 'T': $size *= 1099511627776; + break; + case 'G': $size *= 1073741824; + break; + case 'M': $size *= 1048576; + break; + case 'K': $size *= 1024; + break; + } + + return $size; + } + + function storagevolume_create($pool, $name, $capacity, $allocation) { + $pool = $this->get_storagepool_res($pool); + + $capacity = $this->parse_size($capacity); + $allocation = $this->parse_size($allocation); + + $xml = "<volume>\n". + " <name>$name</name>\n". + " <capacity>$capacity</capacity>\n". + " <allocation>$allocation</allocation>\n". + "</volume>"; + + $tmp = libvirt_storagevolume_create_xml($pool, $xml); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function get_hypervisor_name() { + $tmp = libvirt_connect_get_information($this->conn); + $hv = $tmp['hypervisor']; + unset($tmp); + + switch (strtoupper($hv)) { + case 'QEMU': $type = 'qemu'; + break; + case 'XEN': $type = 'xen'; + break; + + default: + $type = $hv; + } + + return $type; + } + + function get_connect_information() { + $tmp = libvirt_connect_get_information($this->conn); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function domain_change_xml($domain, $xml) { + $dom = $this->get_domain_object($domain); + + if (!($old_xml = libvirt_domain_get_xml_desc($dom, NULL))) + return $this->_set_last_error(); + if (!libvirt_domain_undefine($dom)) + return $this->_set_last_error(); + if (!libvirt_domain_define_xml($this->conn, $xml)) { + $this->last_error = libvirt_get_last_error(); + libvirt_domain_define_xml($this->conn, $old_xml); + return false; + } + + return true; + } + + function network_change_xml($network, $xml) { + $net = $this->get_network_res($network); + + if (!($old_xml = libvirt_network_get_xml_desc($net, NULL))) { + return $this->_set_last_error(); + } + if (!libvirt_network_undefine($net)) { + return $this->_set_last_error(); + } + if (!libvirt_network_define_xml($this->conn, $xml)) { + $this->last_error = libvirt_get_last_error(); + libvirt_network_define_xml($this->conn, $old_xml); + return false; + } + + return true; + } + + function translate_storagepool_state($state) { + switch ($state) { + case 0: return 'Not running'; + break; + case 1: return 'Building pool'; + break; + case 2: return 'Running'; + break; + case 3: return 'Running degraded'; + break; + case 4: return 'Running but inaccessible'; + break; + } + + return 'Unknown'; + } + + function get_domains() { + $tmp = libvirt_list_domains($this->conn); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function get_domain_by_name($name) { + $tmp = libvirt_domain_lookup_by_name($this->conn, $name); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function get_networks($type = VIR_NETWORKS_ALL) { + $tmp = libvirt_list_networks($this->conn, $type); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function get_nic_models() { + return array('default', 'rtl8139', 'e1000', 'pcnet', 'ne2k_pci', 'virtio'); + } + + function get_network_res($network) { + if ($network == false) + return false; + if (is_resource($network)) + return $network; + + $tmp = libvirt_network_get($this->conn, $network); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function get_network_bridge($network) { + $res = $this->get_network_res($network); + if ($res == false) + return false; + + $tmp = libvirt_network_get_bridge($res); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function get_network_active($network) { + $res = $this->get_network_res($network); + if ($res == false) + return false; + + $tmp = libvirt_network_get_active($res); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function set_network_active($network, $active = true) { + $res = $this->get_network_res($network); + if ($res == false) + return false; + + if (!libvirt_network_set_active($res, $active ? 1 : 0)) + return $this->_set_last_error(); + + return true; + } + + function get_network_information($network) { + $res = $this->get_network_res($network); + if ($res == false) + return false; + + $tmp = libvirt_network_get_information($res); + if (!$tmp) + return $this->_set_last_error(); + $tmp['active'] = $this->get_network_active($res); + return $tmp; + } + + function get_network_xml($network) { + $res = $this->get_network_res($network); + if ($res == false) + return false; + + $tmp = libvirt_network_get_xml_desc($res, NULL); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function get_node_devices($dev = false) { + $tmp = ($dev == false) ? libvirt_list_nodedevs($this->conn) : libvirt_list_nodedevs($this->conn, $dev); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function get_node_device_res($res) { + if ($res == false) + return false; + if (is_resource($res)) + return $res; + + $tmp = libvirt_nodedev_get($this->conn, $res); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function get_node_device_caps($dev) { + $dev = $this->get_node_device_res($dev); + + $tmp = libvirt_nodedev_capabilities($dev); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function get_node_device_cap_options() { + $all = $this->get_node_devices(); + + $ret = array(); + for ($i = 0; $i < sizeof($all); $i++) { + $tmp = $this->get_node_device_caps($all[$i]); + + for ($ii = 0; $ii < sizeof($tmp); $ii++) + if (!in_array($tmp[$ii], $ret)) + $ret[] = $tmp[$ii]; + } + + return $ret; + } + + function get_node_device_xml($dev) { + $dev = $this->get_node_device_res($dev); + + $tmp = libvirt_nodedev_get_xml_desc($dev, NULL); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function get_node_device_information($dev) { + $dev = $this->get_node_device_res($dev); + + $tmp = libvirt_nodedev_get_information($dev); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function domain_get_name($res) { + return libvirt_domain_get_name($res); + } + + function domain_get_info($dom) { + if (!$this->allow_cached) + return libvirt_domain_get_info($dom); + + $domname = libvirt_domain_get_name($dom); + if (!array_key_exists($domname, $this->dominfos)) { + $info = libvirt_domain_get_info($dom); + $this->dominfos[$domname] = $info; + } + + return $this->dominfos[$domname]; + } + + function get_last_error() { + return $this->last_error; + } + + function domain_get_xml($domain, $get_inactive = false) { + $dom = $this->get_domain_object($domain); + if (!$dom) + return false; + + $tmp = libvirt_domain_get_xml_desc($dom, $get_inactive ? VIR_DOMAIN_XML_INACTIVE : 0); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function network_get_xml($network) { + $net = $this->get_network_res($network); + if (!$net) + return false; + + $tmp = libvirt_network_get_xml_desc($net, NULL); + return ($tmp) ? $tmp : $this->_set_last_error();; + } + + function domain_get_id($domain, $name = false) { + $dom = $this->get_domain_object($domain); + if ((!$dom) || (!$this->domain_is_running($dom, $name))) + return false; + + $tmp = libvirt_domain_get_id($dom); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function domain_get_interface_stats($nameRes, $iface) { + $dom = $this->get_domain_object($domain); + if (!$dom) + return false; + + $tmp = libvirt_domain_interface_stats($dom, $iface); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function domain_get_memory_stats($domain) { + $dom = $this->get_domain_object($domain); + if (!$dom) + return false; + + $tmp = libvirt_domain_memory_stats($dom); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function domain_start($dom) { + $dom=$this->get_domain_object($dom); + if ($dom) { + $ret = libvirt_domain_create($dom); + $this->last_error = libvirt_get_last_error(); + return $ret; + } + + $ret = libvirt_domain_create_xml($this->conn, $dom); + $this->last_error = libvirt_get_last_error(); + return $ret; + } + + function domain_define($xml) { + $tmp = libvirt_domain_define_xml($this->conn, $xml); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function domain_destroy($domain) { + $dom = $this->get_domain_object($domain); + if (!$dom) + return false; + + $tmp = libvirt_domain_destroy($dom); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function domain_reboot($domain) { + $dom = $this->get_domain_object($domain); + if (!$dom) + return false; + + $tmp = libvirt_domain_reboot($dom); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function domain_suspend($domain) { + $dom = $this->get_domain_object($domain); + if (!$dom) + return false; + + $tmp = libvirt_domain_suspend($dom); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function domain_resume($domain) { + $dom = $this->get_domain_object($domain); + if (!$dom) + return false; + + $tmp = libvirt_domain_resume($dom); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function domain_get_name_by_uuid($uuid) { + $dom = libvirt_domain_lookup_by_uuid_string($this->conn, $uuid); + if (!$dom) + return false; + $tmp = libvirt_domain_get_name($dom); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function domain_shutdown($domain) { + $dom = $this->get_domain_object($domain); + if (!$dom) + return false; + + $tmp = libvirt_domain_shutdown($dom); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function domain_undefine($domain) { + $dom = $this->get_domain_object($domain); + if (!$dom) + return false; + + $tmp = libvirt_domain_undefine($dom); + return ($tmp) ? $tmp : $this->_set_last_error(); + } + + function domain_is_running($domain, $name = false) { + $dom = $this->get_domain_object($domain); + if (!$dom) + return false; + $tmp = $this->domain_get_info($dom); + if (!$tmp) + return $this->_set_last_error(); + $ret = ( ($tmp['state'] == VIR_DOMAIN_RUNNING) || ($tmp['state'] == VIR_DOMAIN_BLOCKED) ); + unset($tmp); + return $ret; + } + + function domain_state_translate($state) { + switch ($state) { + case VIR_DOMAIN_RUNNING: return 'running'; + case VIR_DOMAIN_NOSTATE: return 'nostate'; + case VIR_DOMAIN_BLOCKED: return 'blocked'; + case VIR_DOMAIN_PAUSED: return 'paused'; + case VIR_DOMAIN_SHUTDOWN: return 'shutdown'; + case VIR_DOMAIN_SHUTOFF: return 'shutoff'; + case VIR_DOMAIN_CRASHED: return 'crashed'; + } + + return 'unknown'; + } + + function domain_get_vnc_port($domain) { + $tmp = $this->get_xpath($domain, '//domain/devices/graphics/@port', false); + $var = (int)$tmp[0]; + unset($tmp); + + return $var; + } + + function domain_get_arch($domain) { + $domain = $this->get_domain_object($domain); + + $tmp = $this->get_xpath($domain, '//domain/os/type/@arch', false); + $var = $tmp[0]; + unset($tmp); + + return $var; + } + + function domain_get_description($domain) { + $tmp = $this->get_xpath($domain, '//domain/description', false); + $var = $tmp[0]; + unset($tmp); + + return $var; + } + + function domain_get_clock_offset($domain) { + $tmp = $this->get_xpath($domain, '//domain/clock/@offset', false); + $var = $tmp[0]; + unset($tmp); + + return $var; + } + + function domain_get_feature($domain, $feature) { + $tmp = $this->get_xpath($domain, '//domain/features/'.$feature.'/..', false); + $ret = ($tmp != false); + unset($tmp); + + return $ret; + } + + function domain_get_boot_devices($domain) { + $tmp = $this->get_xpath($domain, '//domain/os/boot/@dev', false); + if (!$tmp) + return false; + + $devs = array(); + for ($i = 0; $i < $tmp['num']; $i++) + $devs[] = $tmp[$i]; + + return $devs; + } + + function _get_single_xpath_result($domain, $xpath) { + $tmp = $this->get_xpath($domain, $xpath, false); + if (!$tmp) + return false; + + if ($tmp['num'] == 0) + return false; + + return $tmp[0]; + } + + function domain_get_multimedia_device($domain, $type, $display=false) { + $domain = $this->get_domain_object($domain); + + if ($type == 'console') { + $type = $this->_get_single_xpath_result($domain, '//domain/devices/console/@type'); + $targetType = $this->_get_single_xpath_result($domain, '//domain/devices/console/target/@type'); + $targetPort = $this->_get_single_xpath_result($domain, '//domain/devices/console/target/@port'); + + if ($display) + return $type.' ('.$targetType.' on port '.$targetPort.')'; + else + return array('type' => $type, 'targetType' => $targetType, 'targetPort' => $targetPort); + } + else + if ($type == 'input') { + $type = $this->_get_single_xpath_result($domain, '//domain/devices/input/@type'); + $bus = $this->_get_single_xpath_result($domain, '//domain/devices/input/@bus'); + + if ($display) + return $type.' on '.$bus; + else + return array('type' => $type, 'bus' => $bus); + } + else + if ($type == 'graphics') { + $type = $this->_get_single_xpath_result($domain, '//domain/devices/graphics/@type'); + $port = $this->_get_single_xpath_result($domain, '//domain/devices/graphics/@port'); + $autoport = $this->_get_single_xpath_result($domain, '//domain/devices/graphics/@autoport'); + + if ($display) + return $type.' on port '.$port.' with'.($autoport ? '' : 'out').' autoport enabled'; + else + return array('type' => $type, 'port' => $port, 'autoport' => $autoport); } - - function get_domain_emulator($domain) { - $dom = $this->get_domain_object($domain); - - $tmp = $this->get_xpath($dom, '//domain/devices/emulator', false); - if ($tmp['num'] == 0) - return $this->_set_last_error(); - - $ret = $tmp[0]; - unset($tmp); - - return $ret; - } - - function get_network_cards($domain) { - $dom = $this->get_domain_object($domain); - - $nics = $this->get_xpath($dom, '//domain/devices/interface[@type="network"]', false); - if (!is_array($nics)) - return $this->_set_last_error(); - - return $nics['num']; - } - - function get_disk_capacity($domain, $physical=false, $disk='*', $unit='?') { - $dom = $this->get_domain_object($domain); - $tmp = $this->get_disk_stats($dom); - - $ret = 0; - for ($i = 0; $i < sizeof($tmp); $i++) { - if (($disk == '*') || ($tmp[$i]['device'] == $disk)) - if ($physical) - $ret += $tmp[$i]['physical']; - else - $ret += $tmp[$i]['capacity']; - } - unset($tmp); - - return $this->format_size($ret, 2, $unit); - } - - function get_disk_count($domain) { - $dom = $this->get_domain_object($domain); - $tmp = $this->get_disk_stats($dom); - $ret = sizeof($tmp); - unset($tmp); - - return $ret; - } - - function format_size($value, $decimals, $unit='?') { - /* Autodetect unit that's appropriate */ - if ($unit == '?') { - /* (1 << 40) is not working correctly on i386 systems */ - if ($value > 1099511627776) - $unit = 'T'; - else - if ($value > (1 << 30)) - $unit = 'G'; - else - if ($value > (1 << 20)) - $unit = 'M'; - else - if ($value > (1 << 10)) - $unit = 'K'; - else - $unit = 'B'; - } - - $unit = strtoupper($unit); - - switch ($unit) { - case 'T': return number_format($value / (float)1099511627776, $decimals, '.', ' ').' TB'; - case 'G': return number_format($value / (float)(1 << 30), $decimals, '.', ' ').' GB'; - case 'M': return number_format($value / (float)(1 << 20), $decimals, '.', ' ').' MB'; - case 'K': return number_format($value / (float)(1 << 10), $decimals, '.', ' ').' kB'; - case 'B': return $value.' B'; - } - - return false; - } - - function get_uri() { - $tmp = libvirt_connect_get_uri($this->conn); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function get_domain_count() { - $tmp = libvirt_domain_get_counts($this->conn); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function get_storagepools() { - $tmp = libvirt_list_storagepools($this->conn); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function get_storagepool_res($res) { - if ($res == false) - return false; - if (is_resource($res)) - return $res; - - $tmp = libvirt_storagepool_lookup_by_name($this->conn, $res); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function get_storagepool_info($name) { - if (!($res = $this->get_storagepool_res($name))) - return false; - - $path = libvirt_storagepool_get_xml_desc($res, '/pool/target/path'); - if (!$path) - return $this->_set_last_error(); - $perms = libvirt_storagepool_get_xml_desc($res, '/pool/target/permissions/mode'); - if (!$perms) - return $this->_set_last_error(); - $otmp1 = libvirt_storagepool_get_xml_desc($res, '/pool/target/permissions/owner'); - if (!is_string($otmp1)) - return $this->_set_last_error(); - $otmp2 = libvirt_storagepool_get_xml_desc($res, '/pool/target/permissions/group'); - if (!is_string($otmp2)) - return $this->_set_last_error(); - $tmp = libvirt_storagepool_get_info($res); - $tmp['volume_count'] = sizeof( libvirt_storagepool_list_volumes($res) ); - $tmp['active'] = libvirt_storagepool_is_active($res); - $tmp['path'] = $path; - $tmp['permissions'] = $perms; - $tmp['id_user'] = $otmp1; - $tmp['id_group'] = $otmp2; - - return $tmp; - } - - function storagepool_get_volume_information($pool, $name=false) { - if (!is_resource($pool)) - $pool = $this->get_storagepool_res($pool); - if (!$pool) - return false; - - $out = array(); - $tmp = libvirt_storagepool_list_volumes($pool); - for ($i = 0; $i < sizeof($tmp); $i++) { - if (($tmp[$i] == $name) || ($name == false)) { - $r = libvirt_storagevolume_lookup_by_name($pool, $tmp[$i]); - $out[$tmp[$i]] = libvirt_storagevolume_get_info($r); - $out[$tmp[$i]]['path'] = libvirt_storagevolume_get_path($r); - unset($r); - } - } - - return $out; - } - - function storagevolume_delete($path) { - $vol = libvirt_storagevolume_lookup_by_path($this->conn, $path); - if (!libvirt_storagevolume_delete($vol)) - return $this->_set_last_error(); - - return true; - } - - function translate_volume_type($type) { - if ($type == 1) - return 'Block device'; - - return 'File image'; - } - - function translate_perms($mode) { - $mode = (string)((int)$mode); - - $tmp = '---------'; - - for ($i = 0; $i < 3; $i++) { - $bits = (int)$mode[$i]; - if ($bits & 4) - $tmp[ ($i * 3) ] = 'r'; - if ($bits & 2) - $tmp[ ($i * 3) + 1 ] = 'w'; - if ($bits & 1) - $tmp[ ($i * 3) + 2 ] = 'x'; - } - - - return $tmp; - } - - function parse_size($size) { - $unit = $size[ strlen($size) - 1 ]; - - $size = (int)$size; - switch (strtoupper($unit)) { - case 'T': $size *= 1099511627776; - break; - case 'G': $size *= 1073741824; - break; - case 'M': $size *= 1048576; - break; - case 'K': $size *= 1024; - break; - } - - return $size; - } - - function storagevolume_create($pool, $name, $capacity, $allocation) { - $pool = $this->get_storagepool_res($pool); - - $capacity = $this->parse_size($capacity); - $allocation = $this->parse_size($allocation); - - $xml = "<volume>\n". - " <name>$name</name>\n". - " <capacity>$capacity</capacity>\n". - " <allocation>$allocation</allocation>\n". - "</volume>"; - - $tmp = libvirt_storagevolume_create_xml($pool, $xml); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function get_hypervisor_name() { - $tmp = libvirt_connect_get_information($this->conn); - $hv = $tmp['hypervisor']; - unset($tmp); - - switch (strtoupper($hv)) { - case 'QEMU': $type = 'qemu'; - break; - case 'XEN': $type = 'xen'; - break; - - default: - $type = $hv; - } - - return $type; - } - - function get_connect_information() { - $tmp = libvirt_connect_get_information($this->conn); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function domain_change_xml($domain, $xml) { - $dom = $this->get_domain_object($domain); - - if (!($old_xml = libvirt_domain_get_xml_desc($dom, NULL))) - return $this->_set_last_error(); - if (!libvirt_domain_undefine($dom)) - return $this->_set_last_error(); - if (!libvirt_domain_define_xml($this->conn, $xml)) { - $this->last_error = libvirt_get_last_error(); - libvirt_domain_define_xml($this->conn, $old_xml); - return false; - } - - return true; - } - - function network_change_xml($network, $xml) { - $net = $this->get_network_res($network); - - if (!($old_xml = libvirt_network_get_xml_desc($net, NULL))) { - return $this->_set_last_error(); - } - if (!libvirt_network_undefine($net)) { - return $this->_set_last_error(); - } - if (!libvirt_network_define_xml($this->conn, $xml)) { - $this->last_error = libvirt_get_last_error(); - libvirt_network_define_xml($this->conn, $old_xml); - return false; - } - - return true; - } - - function translate_storagepool_state($state) { - switch ($state) { - case 0: return 'Not running'; - break; - case 1: return 'Building pool'; - break; - case 2: return 'Running'; - break; - case 3: return 'Running degraded'; - break; - case 4: return 'Running but inaccessible'; - break; - } - - return 'Unknown'; - } - - function get_domains() { - $tmp = libvirt_list_domains($this->conn); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function get_domain_by_name($name) { - $tmp = libvirt_domain_lookup_by_name($this->conn, $name); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function get_networks($type = VIR_NETWORKS_ALL) { - $tmp = libvirt_list_networks($this->conn, $type); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function get_nic_models() { - return array('default', 'rtl8139', 'e1000', 'pcnet', 'ne2k_pci', 'virtio'); - } - - function get_network_res($network) { - if ($network == false) - return false; - if (is_resource($network)) - return $network; - - $tmp = libvirt_network_get($this->conn, $network); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function get_network_bridge($network) { - $res = $this->get_network_res($network); - if ($res == false) - return false; - - $tmp = libvirt_network_get_bridge($res); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function get_network_active($network) { - $res = $this->get_network_res($network); - if ($res == false) - return false; - - $tmp = libvirt_network_get_active($res); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function set_network_active($network, $active = true) { - $res = $this->get_network_res($network); - if ($res == false) - return false; - - if (!libvirt_network_set_active($res, $active ? 1 : 0)) - return $this->_set_last_error(); - - return true; - } - - function get_network_information($network) { - $res = $this->get_network_res($network); - if ($res == false) - return false; - - $tmp = libvirt_network_get_information($res); - if (!$tmp) - return $this->_set_last_error(); - $tmp['active'] = $this->get_network_active($res); - return $tmp; - } - - function get_network_xml($network) { - $res = $this->get_network_res($network); - if ($res == false) - return false; - - $tmp = libvirt_network_get_xml_desc($res, NULL); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function get_node_devices($dev = false) { - $tmp = ($dev == false) ? libvirt_list_nodedevs($this->conn) : libvirt_list_nodedevs($this->conn, $dev); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function get_node_device_res($res) { - if ($res == false) - return false; - if (is_resource($res)) - return $res; - - $tmp = libvirt_nodedev_get($this->conn, $res); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function get_node_device_caps($dev) { - $dev = $this->get_node_device_res($dev); - - $tmp = libvirt_nodedev_capabilities($dev); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function get_node_device_cap_options() { - $all = $this->get_node_devices(); - - $ret = array(); - for ($i = 0; $i < sizeof($all); $i++) { - $tmp = $this->get_node_device_caps($all[$i]); - - for ($ii = 0; $ii < sizeof($tmp); $ii++) - if (!in_array($tmp[$ii], $ret)) - $ret[] = $tmp[$ii]; - } - - return $ret; - } - - function get_node_device_xml($dev) { - $dev = $this->get_node_device_res($dev); - - $tmp = libvirt_nodedev_get_xml_desc($dev, NULL); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function get_node_device_information($dev) { - $dev = $this->get_node_device_res($dev); - - $tmp = libvirt_nodedev_get_information($dev); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function domain_get_name($res) { - return libvirt_domain_get_name($res); - } - - function domain_get_info($dom) { - if (!$this->allow_cached) - return libvirt_domain_get_info($dom); - - $domname = libvirt_domain_get_name($dom); - if (!array_key_exists($domname, $this->dominfos)) { - $info = libvirt_domain_get_info($dom); - $this->dominfos[$domname] = $info; - } - - return $this->dominfos[$domname]; - } - - function get_last_error() { - return $this->last_error; - } - - function domain_get_xml($domain, $get_inactive = false) { - $dom = $this->get_domain_object($domain); - if (!$dom) - return false; - - $tmp = libvirt_domain_get_xml_desc($dom, $get_inactive ? VIR_DOMAIN_XML_INACTIVE : 0); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function network_get_xml($network) { - $net = $this->get_network_res($network); - if (!$net) - return false; - - $tmp = libvirt_network_get_xml_desc($net, NULL); - return ($tmp) ? $tmp : $this->_set_last_error();; - } - - function domain_get_id($domain, $name = false) { - $dom = $this->get_domain_object($domain); - if ((!$dom) || (!$this->domain_is_running($dom, $name))) - return false; - - $tmp = libvirt_domain_get_id($dom); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function domain_get_interface_stats($nameRes, $iface) { - $dom = $this->get_domain_object($domain); - if (!$dom) - return false; - - $tmp = libvirt_domain_interface_stats($dom, $iface); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function domain_get_memory_stats($domain) { - $dom = $this->get_domain_object($domain); - if (!$dom) - return false; - - $tmp = libvirt_domain_memory_stats($dom); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function domain_start($dom) { - $dom=$this->get_domain_object($dom); - if ($dom) { - $ret = libvirt_domain_create($dom); - $this->last_error = libvirt_get_last_error(); - return $ret; - } - - $ret = libvirt_domain_create_xml($this->conn, $dom); - $this->last_error = libvirt_get_last_error(); - return $ret; - } - - function domain_define($xml) { - $tmp = libvirt_domain_define_xml($this->conn, $xml); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function domain_destroy($domain) { - $dom = $this->get_domain_object($domain); - if (!$dom) - return false; - - $tmp = libvirt_domain_destroy($dom); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function domain_reboot($domain) { - $dom = $this->get_domain_object($domain); - if (!$dom) - return false; - - $tmp = libvirt_domain_reboot($dom); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function domain_suspend($domain) { - $dom = $this->get_domain_object($domain); - if (!$dom) - return false; - - $tmp = libvirt_domain_suspend($dom); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function domain_resume($domain) { - $dom = $this->get_domain_object($domain); - if (!$dom) - return false; - - $tmp = libvirt_domain_resume($dom); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function domain_get_name_by_uuid($uuid) { - $dom = libvirt_domain_lookup_by_uuid_string($this->conn, $uuid); - if (!$dom) - return false; - $tmp = libvirt_domain_get_name($dom); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function domain_shutdown($domain) { - $dom = $this->get_domain_object($domain); - if (!$dom) - return false; - - $tmp = libvirt_domain_shutdown($dom); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function domain_undefine($domain) { - $dom = $this->get_domain_object($domain); - if (!$dom) - return false; - - $tmp = libvirt_domain_undefine($dom); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - - function domain_is_running($domain, $name = false) { - $dom = $this->get_domain_object($domain); - if (!$dom) - return false; - $tmp = $this->domain_get_info($dom); - if (!$tmp) - return $this->_set_last_error(); - $ret = ( ($tmp['state'] == VIR_DOMAIN_RUNNING) || ($tmp['state'] == VIR_DOMAIN_BLOCKED) ); - unset($tmp); - return $ret; - } - - function domain_state_translate($state) { - switch ($state) { - case VIR_DOMAIN_RUNNING: return 'running'; - case VIR_DOMAIN_NOSTATE: return 'nostate'; - case VIR_DOMAIN_BLOCKED: return 'blocked'; - case VIR_DOMAIN_PAUSED: return 'paused'; - case VIR_DOMAIN_SHUTDOWN: return 'shutdown'; - case VIR_DOMAIN_SHUTOFF: return 'shutoff'; - case VIR_DOMAIN_CRASHED: return 'crashed'; - } - - return 'unknown'; - } - - function domain_get_vnc_port($domain) { - $tmp = $this->get_xpath($domain, '//domain/devices/graphics/@port', false); - $var = (int)$tmp[0]; - unset($tmp); - - return $var; - } - - function domain_get_arch($domain) { - $domain = $this->get_domain_object($domain); - - $tmp = $this->get_xpath($domain, '//domain/os/type/@arch', false); - $var = $tmp[0]; - unset($tmp); - - return $var; - } - - function domain_get_description($domain) { - $tmp = $this->get_xpath($domain, '//domain/description', false); - $var = $tmp[0]; - unset($tmp); - - return $var; - } - - function domain_get_clock_offset($domain) { - $tmp = $this->get_xpath($domain, '//domain/clock/@offset', false); - $var = $tmp[0]; - unset($tmp); - - return $var; - } - - function domain_get_feature($domain, $feature) { - $tmp = $this->get_xpath($domain, '//domain/features/'.$feature.'/..', false); - $ret = ($tmp != false); - unset($tmp); - - return $ret; - } - - function domain_get_boot_devices($domain) { - $tmp = $this->get_xpath($domain, '//domain/os/boot/@dev', false); - if (!$tmp) - return false; - - $devs = array(); - for ($i = 0; $i < $tmp['num']; $i++) - $devs[] = $tmp[$i]; - - return $devs; - } - - function _get_single_xpath_result($domain, $xpath) { - $tmp = $this->get_xpath($domain, $xpath, false); - if (!$tmp) - return false; - - if ($tmp['num'] == 0) - return false; - - return $tmp[0]; - } - - function domain_get_multimedia_device($domain, $type, $display=false) { - $domain = $this->get_domain_object($domain); - - if ($type == 'console') { - $type = $this->_get_single_xpath_result($domain, '//domain/devices/console/@type'); - $targetType = $this->_get_single_xpath_result($domain, '//domain/devices/console/target/@type'); - $targetPort = $this->_get_single_xpath_result($domain, '//domain/devices/console/target/@port'); - - if ($display) - return $type.' ('.$targetType.' on port '.$targetPort.')'; - else - return array('type' => $type, 'targetType' => $targetType, 'targetPort' => $targetPort); - } - else - if ($type == 'input') { - $type = $this->_get_single_xpath_result($domain, '//domain/devices/input/@type'); - $bus = $this->_get_single_xpath_result($domain, '//domain/devices/input/@bus'); - - if ($display) - return $type.' on '.$bus; - else - return array('type' => $type, 'bus' => $bus); - } - else - if ($type == 'graphics') { - $type = $this->_get_single_xpath_result($domain, '//domain/devices/graphics/@type'); - $port = $this->_get_single_xpath_result($domain, '//domain/devices/graphics/@port'); - $autoport = $this->_get_single_xpath_result($domain, '//domain/devices/graphics/@autoport'); - - if ($display) - return $type.' on port '.$port.' with'.($autoport ? '' : 'out').' autoport enabled'; - else - return array('type' => $type, 'port' => $port, 'autoport' => $autoport); - } - else - if ($type == 'video') { - $type = $this->_get_single_xpath_result($domain, '//domain/devices/video/model/@type'); - $vram = $this->_get_single_xpath_result($domain, '//domain/devices/video/model/@vram'); - $heads = $this->_get_single_xpath_result($domain, '//domain/devices/video/model/@heads'); - - if ($display) - return $type.' with '.($vram / 1024).' MB VRAM, '.$heads.' head(s)'; - else - return array('type' => $type, 'vram' => $vram, 'heads' => $heads); - } - else - return false; - } - - function domain_get_host_devices_pci($domain) { - $xpath = '//domain/devices/hostdev[@type="pci"]/source/address/@'; - - $dom = $this->get_xpath($domain, $xpath.'domain', false); - $bus = $this->get_xpath($domain, $xpath.'bus', false); - $slot = $this->get_xpath($domain, $xpath.'slot', false); - $func = $this->get_xpath($domain, $xpath.'function', false); - - $devs = array(); - for ($i = 0; $i < $bus['num']; $i++) { - $d = str_replace('0x', '', $dom[$i]); - $b = str_replace('0x', '', $bus[$i]); - $s = str_replace('0x', '', $slot[$i]); - $f = str_replace('0x', '', $func[$i]); - $devid = 'pci_'.$d.'_'.$b.'_'.$s.'_'.$f; - $tmp2 = $this->get_node_device_information($devid); - $devs[] = array('domain' => $dom[$i], 'bus' => $bus[$i], - 'slot' => $slot[$i], 'func' => $func[$i], - 'vendor' => $tmp2['vendor_name'], - 'vendor_id' => $tmp2['vendor_id'], - 'product' => $tmp2['product_name'], - 'product_id' => $tmp2['product_id']); - } - - return $devs; - } - - function _lookup_device_usb($vendor_id, $product_id) { - $tmp = $this->get_node_devices(false); - for ($i = 0; $i < sizeof($tmp); $i++) { - $tmp2 = $this->get_node_device_information($tmp[$i]); - if (array_key_exists('product_id', $tmp2)) { - if (($tmp2['product_id'] == $product_id) - && ($tmp2['vendor_id'] == $vendor_id)) - return $tmp2; - } - } - - return false; - } - - function domain_get_host_devices_usb($domain) { - $xpath = '//domain/devices/hostdev[@type="usb"]/source/'; - - $vid = $this->get_xpath($domain, $xpath.'vendor/@id', false); - $pid = $this->get_xpath($domain, $xpath.'product/@id', false); - - $devs = array(); - for ($i = 0; $i < $vid['num']; $i++) { - $dev = $this->_lookup_device_usb($vid[$i], $pid[$i]); - $devs[] = array('vendor_id' => $vid[$i], 'product_id' => $pid[$i], - 'product' => $dev['product_name'], - 'vendor' => $dev['vendor_name']); - } - - return $devs; - } - - function domain_get_host_devices($domain) { - $domain = $this->get_domain_object($domain); - - $devs_pci = $this->domain_get_host_devices_pci($domain); - $devs_usb = $this->domain_get_host_devices_usb($domain); - - return array('pci' => $devs_pci, 'usb' => $devs_usb); - } - - function domain_set_feature($domain, $feature, $val) { - $domain = $this->get_domain_object($domain); - - if ($this->domain_get_feature($domain, $feature) == $val) - return true; - - $xml = $this->domain_get_xml($domain, true); - if ($val) { - if (strpos('features', $xml)) - $xml = str_replace('<features>', "<features>\n<$feature/>", $xml); - else - $xml = str_replace('</os>', "</os><features>\n<$feature/></features>", $xml); - } - else - $xml = str_replace("<$feature/>\n", '', $xml); - - return $this->domain_change_xml($domain, $xml); - } - - function domain_set_clock_offset($domain, $offset) { - $domain = $this->get_domain_object($domain); - - if (($old_offset = $this->domain_get_clock_offset($domain)) == $offset) - return true; - - $xml = $this->domain_get_xml($domain, true); - $xml = str_replace("<clock offset='$old_offset'/>", "<clock offset='$offset'/>", $xml); - - return $this->domain_change_xml($domain, $xml); - } - - function domain_set_description($domain, $desc) { - $domain = $this->get_domain_object($domain); - - $description = $this->domain_get_description($domain); - if ($description == $desc) - return true; - - $xml = $this->domain_get_xml($domain, true); - if (!$description) - $xml = str_replace("</uuid>", "</uuid><description>$desc</description>", $xml); - else { - $tmp = explode("\n", $xml); - for ($i = 0; $i < sizeof($tmp); $i++) - if (strpos('.'.$tmp[$i], '<description')) - $tmp[$i] = "<description>$desc</description>"; - - $xml = join("\n", $tmp); - } - - return $this->domain_change_xml($domain, $xml); - } - - function host_get_node_info() { - $tmp = libvirt_node_get_info($this->conn); - return ($tmp) ? $tmp : $this->_set_last_error(); - } - } + else + if ($type == 'video') { + $type = $this->_get_single_xpath_result($domain, '//domain/devices/video/model/@type'); + $vram = $this->_get_single_xpath_result($domain, '//domain/devices/video/model/@vram'); + $heads = $this->_get_single_xpath_result($domain, '//domain/devices/video/model/@heads'); + + if ($display) + return $type.' with '.($vram / 1024).' MB VRAM, '.$heads.' head(s)'; + else + return array('type' => $type, 'vram' => $vram, 'heads' => $heads); + } + else + return false; + } + + function domain_get_host_devices_pci($domain) { + $xpath = '//domain/devices/hostdev[@type="pci"]/source/address/@'; + + $dom = $this->get_xpath($domain, $xpath.'domain', false); + $bus = $this->get_xpath($domain, $xpath.'bus', false); + $slot = $this->get_xpath($domain, $xpath.'slot', false); + $func = $this->get_xpath($domain, $xpath.'function', false); + + $devs = array(); + for ($i = 0; $i < $bus['num']; $i++) { + $d = str_replace('0x', '', $dom[$i]); + $b = str_replace('0x', '', $bus[$i]); + $s = str_replace('0x', '', $slot[$i]); + $f = str_replace('0x', '', $func[$i]); + $devid = 'pci_'.$d.'_'.$b.'_'.$s.'_'.$f; + $tmp2 = $this->get_node_device_information($devid); + $devs[] = array('domain' => $dom[$i], 'bus' => $bus[$i], + 'slot' => $slot[$i], 'func' => $func[$i], + 'vendor' => $tmp2['vendor_name'], + 'vendor_id' => $tmp2['vendor_id'], + 'product' => $tmp2['product_name'], + 'product_id' => $tmp2['product_id']); + } + + return $devs; + } + + function _lookup_device_usb($vendor_id, $product_id) { + $tmp = $this->get_node_devices(false); + for ($i = 0; $i < sizeof($tmp); $i++) { + $tmp2 = $this->get_node_device_information($tmp[$i]); + if (array_key_exists('product_id', $tmp2)) { + if (($tmp2['product_id'] == $product_id) + && ($tmp2['vendor_id'] == $vendor_id)) + return $tmp2; + } + } + + return false; + } + + function domain_get_host_devices_usb($domain) { + $xpath = '//domain/devices/hostdev[@type="usb"]/source/'; + + $vid = $this->get_xpath($domain, $xpath.'vendor/@id', false); + $pid = $this->get_xpath($domain, $xpath.'product/@id', false); + + $devs = array(); + for ($i = 0; $i < $vid['num']; $i++) { + $dev = $this->_lookup_device_usb($vid[$i], $pid[$i]); + $devs[] = array('vendor_id' => $vid[$i], 'product_id' => $pid[$i], + 'product' => $dev['product_name'], + 'vendor' => $dev['vendor_name']); + } + + return $devs; + } + + function domain_get_host_devices($domain) { + $domain = $this->get_domain_object($domain); + + $devs_pci = $this->domain_get_host_devices_pci($domain); + $devs_usb = $this->domain_get_host_devices_usb($domain); + + return array('pci' => $devs_pci, 'usb' => $devs_usb); + } + + function domain_set_feature($domain, $feature, $val) { + $domain = $this->get_domain_object($domain); + + if ($this->domain_get_feature($domain, $feature) == $val) + return true; + + $xml = $this->domain_get_xml($domain, true); + if ($val) { + if (strpos('features', $xml)) + $xml = str_replace('<features>', "<features>\n<$feature/>", $xml); + else + $xml = str_replace('</os>', "</os><features>\n<$feature/></features>", $xml); + } + else + $xml = str_replace("<$feature/>\n", '', $xml); + + return $this->domain_change_xml($domain, $xml); + } + + function domain_set_clock_offset($domain, $offset) { + $domain = $this->get_domain_object($domain); + + if (($old_offset = $this->domain_get_clock_offset($domain)) == $offset) + return true; + + $xml = $this->domain_get_xml($domain, true); + $xml = str_replace("<clock offset='$old_offset'/>", "<clock offset='$offset'/>", $xml); + + return $this->domain_change_xml($domain, $xml); + } + + function domain_set_description($domain, $desc) { + $domain = $this->get_domain_object($domain); + + $description = $this->domain_get_description($domain); + if ($description == $desc) + return true; + + $xml = $this->domain_get_xml($domain, true); + if (!$description) + $xml = str_replace("</uuid>", "</uuid><description>$desc</description>", $xml); + else { + $tmp = explode("\n", $xml); + for ($i = 0; $i < sizeof($tmp); $i++) + if (strpos('.'.$tmp[$i], '<description')) + $tmp[$i] = "<description>$desc</description>"; + + $xml = join("\n", $tmp); + } + + return $this->domain_change_xml($domain, $xml); + } + + function host_get_node_info() { + $tmp = libvirt_node_get_info($this->conn); + return ($tmp) ? $tmp : $this->_set_last_error(); + } +} ?> -- 2.8.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list