function remove() { $response = $this->get_response(); $vms = $response->html->request()->get($this->identifier_name); $form = $response->form; if ($vms !== '') { $submit = $form->get_elements('submit'); $submit->handler = 'onclick="wait();"'; $form->add($submit, 'submit'); $submit = $form->get_elements('cancel'); $submit->handler = 'onclick="cancel();"'; $form->add($submit, 'cancel'); $i = 0; foreach ($vms as $ex) { $d['param_f' . $i]['label'] = $ex; $d['param_f' . $i]['object']['type'] = 'htmlobject_input'; $d['param_f' . $i]['object']['attrib']['type'] = 'checkbox'; $d['param_f' . $i]['object']['attrib']['name'] = $this->identifier_name . '[' . $i . ']'; $d['param_f' . $i]['object']['attrib']['value'] = $ex; $d['param_f' . $i]['object']['attrib']['checked'] = true; $i++; } $form->add($d); if (!$form->get_errors() && $response->submit()) { $appliance_id = $this->response->html->request()->get('appliance_id'); $appliance = new appliance(); $resource = new resource(); $errors = array(); $message = array(); foreach ($vms as $key => $vm) { $appliance->get_instance_by_id($appliance_id); $resource->get_instance_by_id($appliance->resources); $file = $this->openqrm->get('basedir') . '/plugins/kvm/web/kvm-stat/' . $resource->id . '.vm_list'; if ($this->file->exists($file)) { $lines = explode("\n", $this->file->get_contents($file)); if (count($lines) >= 1) { foreach ($lines as $line) { if ($line !== '') { $line = explode('@', $line); if ($vm === $line[1]) { $kvm = new resource(); $kvm->get_instance_by_mac($line[2]); // check if it is still in use $appliances_using_resource = $appliance->get_ids_per_resource($kvm->id); if (count($appliances_using_resource) > 0) { $appliances_using_resource_str = implode(",", $appliances_using_resource[0]); $errors[] = sprintf($this->lang['msg_vm_resource_still_in_use'], $vm, $kvm->id, $appliances_using_resource_str); } else { $kvm->remove($kvm->id, $line[2]); $command = $this->openqrm->get('basedir') . '/plugins/kvm/bin/openqrm-kvm-vm delete -n ' . $vm; $command .= ' -u ' . $this->openqrm->admin()->name . ' -p ' . $this->openqrm->admin()->password; $command .= ' --openqrm-ui-user ' . $this->user->name; $command .= ' --openqrm-cmd-mode background'; $resource->send_command($resource->ip, $command); $form->remove($this->identifier_name . '[' . $key . ']'); $message[] = sprintf($this->lang['msg_removed'], $vm); // stop remote console $tmp = explode(':', $line[5]); $server = $tmp[0]; $port = $tmp[1]; $mac = $line[2]; $rid = $kvm->id; $event = new event(); $plugin = new plugin(); $enabled = $plugin->enabled(); foreach ($enabled as $index => $name) { $running = $this->openqrm->get('webdir') . '/plugins/' . $name . '/.running'; $hook = $this->openqrm->get('webdir') . '/plugins/' . $name . '/openqrm-' . $name . '-remote-console-hook.php'; if (file_exists($hook)) { if (file_exists($running)) { $event->log("console", $_SERVER['REQUEST_TIME'], 5, "kvm-storge-vm.remove.class.php", 'Stopping ' . $name . ' remote console.', "", "", 0, 0, $kvm->id); require_once $hook; $console_function = 'openqrm_' . $name . '_disable_remote_console'; $console_function = str_replace("-", "_", $console_function); $console_function($server, $port, $rid, $mac, $vm); } } } } } } } } } } if (count($errors) === 0) { $response->msg = join('<br>', $message); } else { $msg = array_merge($errors, $message); $response->error = join('<br>', $msg); } } } else { $response->msg = ''; } return $response; }
function remove() { $response = $this->get_response(); $instance_name = $response->html->request()->get('instance_name'); $form = $response->form; $submit = $form->get_elements('submit'); $submit->handler = 'onclick="wait();"'; $form->add($submit, 'submit'); $submit = $form->get_elements('cancel'); $submit->handler = 'onclick="cancel();"'; $form->add($submit, 'cancel'); $d['param_f']['label'] = $instance_name; $d['param_f']['object']['type'] = 'htmlobject_input'; $d['param_f']['object']['attrib']['type'] = 'checkbox'; $d['param_f']['object']['attrib']['name'] = 'instance_name'; $d['param_f']['object']['attrib']['value'] = $instance_name; $d['param_f']['object']['attrib']['checked'] = true; $form->add($d); if (!$form->get_errors() && $response->submit()) { $errors = array(); $message = array(); $resource = new resource(); $resource->get_instance_by_mac($this->instance_mac); $appliance = new appliance(); $appliances_using_resource = $appliance->get_ids_per_resource($resource->id); if (count($appliances_using_resource) > 0) { $appliances_using_resource_str = implode(",", $appliances_using_resource[0]); $errors[] = sprintf($this->lang['msg_vm_resource_still_in_use'], $instance_name, $resource->id, $appliances_using_resource_str); } else { $resource->remove($resource->id, $this->instance_mac); $hc_authentication = ''; if ($this->hc->account_type == 'aws' || $this->hc->account_type == 'euca') { $hc_authentication .= ' -O ' . $this->hc->access_key; $hc_authentication .= ' -W ' . $this->hc->secret_key; $hc_authentication .= ' -ir ' . $this->region; } if ($this->hc->account_type == 'lc-openstack') { $hc_authentication .= ' -u ' . $this->hc->username; $hc_authentication .= ' -p ' . $this->hc->password; $hc_authentication .= ' -q ' . $this->hc->host; $hc_authentication .= ' -x ' . $this->hc->port; $hc_authentication .= ' -g ' . $this->hc->tenant; $hc_authentication .= ' -e ' . $this->hc->endpoint; } $command = $this->openqrm->get('basedir') . '/plugins/hybrid-cloud/bin/openqrm-hybrid-cloud-vm remove'; $command .= ' -i ' . $this->hc->id; $command .= ' -n ' . $this->hc->account_name; $command .= ' -t ' . $this->hc->account_type; $command .= ' -in ' . $instance_name; $command .= $hc_authentication; $command .= ' --openqrm-ui-user ' . $this->user->name; $command .= ' --openqrm-cmd-mode background'; $openqrm = new openqrm_server(); $openqrm->send_command($command, NULL, true); $message[] = sprintf($this->lang['msg_removed'], $instance_name); } if (count($errors) === 0) { $response->msg = join('<br>', $message); } else { $msg = array_merge($errors, $message); $response->error = join('<br>', $msg); } } return $response; }
function select() { $d = array(); $h = array(); $h['appliance_state']['title'] = $this->lang['table_state']; $h['appliance_id']['title'] = $this->lang['table_id']; $h['appliance_id']['hidden'] = true; $h['appliance_name']['title'] = $this->lang['table_name']; $h['appliance_name']['hidden'] = true; $h['appliance_values']['title'] = ' '; $h['appliance_values']['sortable'] = false; $h['appliance_comment']['title'] = ' '; $h['appliance_comment']['sortable'] = false; $h['appliance_virtualization']['title'] = 'Type'; $h['appliance_virtualization']['sortable'] = true; $h['appliance_virtualization']['hidden'] = true; $h['appliance_edit']['sortable'] = false; $appliance = new appliance(); $params = $this->response->get_array($this->actions_name, 'select'); $b = array(); // unset unnecessary params unset($params['resource_type_filter']); unset($params['resource_filter']); unset($params['appliance[sort]']); unset($params['appliance[order]']); unset($params['appliance[limit]']); unset($params['appliance[offset]']); $table = $this->response->html->tablebuilder('appliance', $params); $table->offset = 0; $table->sort = 'appliance_id'; $table->limit = 20; $table->order = 'ASC'; $table->max = $appliance->get_count(); $table->init(); // handle table params #$tps = $table->get_params(); $tp = ''; #foreach($tps['appliance'] as $k => $v) { # $tp .= '&appliance['.$k.']='.$v; #} $resource_filter = null; if ($this->response->html->request()->get('resource_filter') !== '') { $resource = $this->openqrm->resource(); $resource_filter = array(); $ar = $resource->find_resource($this->response->html->request()->get('resource_filter')); if (count($ar) > 0) { foreach ($ar as $k => $v) { $resource_filter[] = $v['resource_id']; } } } $disabled = array(); $appliances = $appliance->display_overview(0, 10000, $table->sort, $table->order); foreach ($appliances as $index => $appliance_db) { $appliance = new appliance(); $appliance->get_instance_by_id($appliance_db["appliance_id"]); $resource = new resource(); $resource->get_instance_by_id($appliance->resources); $appliance_resources = $appliance_db["appliance_resources"]; $kernel = new kernel(); $kernel->get_instance_by_id($appliance_db["appliance_kernelid"]); $image = new image(); $image->get_instance_by_id($appliance_db["appliance_imageid"]); $virtualization = new virtualization(); $virtualization->get_instance_by_id($appliance_db["appliance_virtualization"]); $appliance_virtualization_name = $virtualization->name; $virtualization_plugin_name = $virtualization->get_plugin_name(); $resource_is_local_server = false; if ($this->response->html->request()->get('resource_type_filter') === '' || $this->response->html->request()->get('resource_type_filter') == $resource->vtype) { // Skip all resources not in $resource_filter if (isset($resource_filter)) { if (!in_array($resource->id, $resource_filter)) { continue; } } if ($appliance_resources >= 0) { // an appliance with a pre-selected resource $resource->get_instance_by_id($appliance_resources); $resource_state_icon = '<span class="pill ' . $resource->state . '">' . $resource->state . '</span>'; // idle ? if ("{$resource->imageid}" == "1" && "{$resource->state}" == "active") { $resource_state_icon = '<span class="pill idle">idle</span>'; } // link to resource list $virtualization_vm_action_name = $virtualization->name; if (strstr($resource->capabilities, "TYPE=local-server")) { $resource_is_local_server = true; } $appliance_resources_str = ''; if (strpos($virtualization->type, "-vm")) { $host_resource = new resource(); $host_resource->get_instance_by_id($resource->vhostid); $host_virtualization = new virtualization(); $host_virtualization_name = $virtualization->get_plugin_name(); $host_virtualization->get_instance_by_type($host_virtualization_name); $host_appliance = new appliance(); $host_appliance->get_instance_by_virtualization_and_resource($host_virtualization->id, $resource->vhostid); $link = '?base=appliance&appliance_action=load_select'; $link .= '&aplugin=' . $virtualization_plugin_name; $link .= '&acontroller=' . $virtualization_plugin_name . '-vm'; $link .= '&' . $virtualization_plugin_name . '_vm_action=update'; $link .= '&appliance_id=' . $host_appliance->id; $link .= '&vm=' . $resource->hostname; $appliance_resources_str = '<a href="' . $this->response->html->thisfile . $link . '" onclick="wait();">' . $resource->hostname . '</a> ' . $resource_state_icon; } else { $appliance_resources_str = $resource->hostname . ' ' . $resource_state_icon; } } else { // an appliance with resource auto-select enabled $appliance_resources_str = "auto-select"; } // active or inactive $resource_icon_default = "/openqrm/base/img/appliance.png"; $active_state_icon = '<span class="pill active">active</span>'; $inactive_state_icon = '<span class="pill inactive">incative</span>'; if ($appliance->stoptime == 0 || $appliance_resources == 0) { $state_icon = $active_state_icon; } else { $state_icon = $inactive_state_icon; } // link to image edit if ($image->id > 0) { $link = '?base=image'; $link .= '&image_action=edit'; $link .= '&image_id=' . $image->id; $image_edit_link = '<a href="' . $this->response->html->thisfile . $link . '" onclick="wait();">' . $image->name . '</a>'; } else { $image_edit_link = $image->name; } // release resource $release_resource = ''; if ($appliance->stoptime == 0 || $appliance_resources == 0) { $release_resource = ''; } else { if ($appliance->resources != -1) { $a = $this->response->html->a(); $a->label = $this->lang['action_release']; $a->title = $this->lang['resource_release']; $a->css = 'enable'; $a->href = $this->response->get_url($this->actions_name, 'release') . '&appliance_id=' . $appliance->id . '' . $tp; $release_resource = $a->get_string(); } } $str = '<strong>' . $this->lang['table_id'] . ':</strong> ' . $appliance_db["appliance_id"] . '<br> <strong>' . $this->lang['table_name'] . ':</strong> ' . $appliance_db["appliance_name"] . '<br> <strong>Type:</strong> ' . $appliance_virtualization_name . '<br> <strong>Kernel:</strong> ' . $kernel->name . '<br> <strong>Image:</strong> ' . $image_edit_link . '<br> <strong>Resource:</strong> ' . $appliance_resources_str . '<br> <strong>IP:</strong> ' . $resource->ip; if (strpos($virtualization->type, "-vm") && isset($resource->vhostid) && $resource->vhostid != '') { $happliance = new appliance(); $hresource = $happliance->get_ids_per_resource($resource->vhostid); if (isset($hresource[0]['appliance_id'])) { $happliance->get_instance_by_id($hresource[0]['appliance_id']); $link = '?base=appliance'; $link .= '&appliance_action=edit'; $link .= '&appliance_id=' . $happliance->id; $href = '<a href="' . $this->response->html->thisfile . $link . '" onclick="wait();">' . $happliance->name . '</a>'; $str .= '<br><strong>Host:</strong> ' . $href; } } // appliance edit $a = $this->response->html->a(); $a->title = $this->lang['action_edit']; $a->label = $this->lang['action_edit']; $a->handler = 'onclick="wait();"'; $a->css = 'edit'; $a->href = $this->response->get_url($this->actions_name, 'edit') . '&appliance_id=' . $appliance->id . '' . $tp; $strEdit = $a->get_string(); // appliance start $strStart = ''; if ($appliance_resources !== '0') { $a = $this->response->html->a(); $a->handler = 'onclick="wait();"'; if ($appliance->stoptime == 0) { $a->title = $this->lang['action_stop']; $a->label = $this->lang['action_stop']; $a->css = 'disable'; $a->href = $this->response->get_url($this->actions_name, 'stop') . '&' . $this->identifier_name . '[]=' . $appliance->id . '' . $tp; } else { $a->title = $this->lang['action_start']; $a->label = $this->lang['action_start']; $a->css = 'enable'; $a->href = $this->response->get_url($this->actions_name, 'start') . '&' . $this->identifier_name . '[]=' . $appliance->id . '' . $tp; } $strStart = $a->get_string(); } // build the plugin link section $appliance_link_section = ''; // add link to continue if appliance has unfinished wizard $disabled = array(); if (isset($appliance->wizard) && strpos($appliance->wizard, 'wizard') !== false) { $params = explode(',', $appliance->wizard); $wizard_step = explode('=', $params[0]); $wizard_user = explode('=', $params[1]); if ($wizard_user[1] === $this->user->name) { // continue button $a = $this->response->html->a(); $a->title = $this->lang['action_continue']; $a->label = $this->lang['action_continue']; $a->handler = 'onclick="wait();"'; $a->css = 'badge continue'; $a->href = $this->response->get_url($this->actions_name, $wizard_step[1]) . '&appliance_wizard_id=' . $appliance->id . '' . $tp; $appliance_comment = $a->get_string(); } else { $appliance_comment = sprintf($this->lang['appliance_create_in_progress'], $wizard_user[1]); } // disable all buttons $disabled[] = $appliance->id; $strEdit = ''; $strStart = ''; $strStop = ''; $release_resource = ''; } else { $plugin = new plugin(); $enabled_plugins = $plugin->enabled(); foreach ($enabled_plugins as $index => $plugin_name) { $plugin_appliance_link_section_hook = $this->openqrm->get('webdir') . "/plugins/" . $plugin_name . "/openqrm-" . $plugin_name . "-appliance-link-hook.php"; if (file_exists($plugin_appliance_link_section_hook)) { require_once "{$plugin_appliance_link_section_hook}"; $appliance_get_link_function = str_replace("-", "_", "get_" . "{$plugin_name}" . "_appliance_link"); if (function_exists($appliance_get_link_function)) { $p = $plugin->get_config($plugin_name); $alink = $appliance_get_link_function($appliance->id); if (is_object($alink)) { // $alink->handler = $alink->handler.' onclick="wait();"'; $alink->css = 'enable'; $alink->title = preg_replace('~(.*?)<a.*>(.*?)</a>(.*?)~i', '$1$2$3', $p['description']); $alink = $alink->get_string(); } $appliance_link_section .= $alink; } } } if ($appliance_db["appliance_comment"] !== '') { $appliance_comment = $appliance_db["appliance_comment"]; $appliance_comment .= "<hr>"; $appliance_comment .= $appliance_link_section; } else { $appliance_comment = $appliance_link_section; } } $b[] = array('appliance_state' => $state_icon, 'appliance_id' => $appliance_db["appliance_id"], 'appliance_name' => $appliance_db["appliance_name"], 'appliance_values' => $str, 'appliance_comment' => $appliance_comment, 'appliance_virtualization' => $appliance_db["appliance_virtualization"], 'appliance_edit' => $strEdit . '' . $strStart . '' . $release_resource); } } // Filter $virtulization_types = new virtualization(); $list = $virtulization_types->get_list(); $filter = array(); $filter[] = array('', ''); foreach ($list as $l) { $filter[] = array($l['label'], $l['value']); } asort($filter); $select = $this->response->html->select(); $select->add($filter, array(1, 0)); $select->name = 'resource_type_filter'; $select->handler = 'onchange="wait();this.form.submit();return false;"'; $select->selected = array($this->response->html->request()->get('resource_type_filter')); $box1 = $this->response->html->box(); $box1->add($select); $box1->id = 'resource_type_filter'; $box1->css = 'htmlobject_box'; $box1->label = $this->lang['lang_type_filter']; // Resource Filter $input = $this->response->html->input(); $input->name = 'resource_filter'; $input->value = $this->response->html->request()->get('resource_filter'); $input->title = $this->lang['lang_filter_title']; $box2 = $this->response->html->box(); $box2->add($input); $box2->id = 'resource_filter'; $box2->css = 'htmlobject_box'; $box2->label = $this->lang['lang_filter']; $add = $this->response->html->a(); $add->title = $this->lang['action_add']; $add->label = $this->lang['action_add']; $add->handler = 'onclick="wait();"'; $add->css = 'add'; $add->href = $this->response->get_url($this->actions_name, "step1") . '' . $tp; $table->id = 'Tabelle'; $table->css = 'htmlobject_table'; $table->border = 1; $table->cellspacing = 0; $table->cellpadding = 3; $table->autosort = true; $table->sort_link = false; $table->max = count($b); $table->head = $h; $table->body = $b; #$table->form_action = $this->response->html->thisfile; $table->actions_name = $this->actions_name; $table->actions = array(array('start' => $this->lang['action_start']), array('stop' => $this->lang['action_stop']), array('remove' => $this->lang['action_remove'])); $table->identifier = 'appliance_id'; $table->identifier_name = $this->identifier_name; $table->identifier_disabled = $disabled; #$table->limit_select = array( # array("value" => 10, "text" => 10), # array("value" => 20, "text" => 20), # array("value" => 30, "text" => 30), # array("value" => 50, "text" => 50), # array("value" => 100, "text" => 100), #); $d['form'] = $this->response->get_form($this->actions_name, 'select', false)->get_elements(); $d['add'] = $add->get_string(); $d['table'] = $table; $d['resource_type_filter'] = $box1->get_string(); $d['resource_filter'] = $box2->get_string(); return $d; }