if ($_SESSION["is_admin"]) { $xtpl->title(_("VPS details") . ' ' . _("[Admin mode]")); } else { $xtpl->title(_("VPS details") . ' ' . _("[User mode]")); } if (!$vps->exists) { $vps = vps_load($veid); } $vps->info(); $xtpl->table_add_category(' '); $xtpl->table_add_category(' '); $xtpl->table_td('ID:'); $xtpl->table_td($vps->veid); $xtpl->table_tr(); $xtpl->table_td(_("Server") . ':'); $s = new cluster_node($vps->ve["vps_server"]); $xtpl->table_td($s->s["server_name"]); $xtpl->table_tr(); $xtpl->table_td(_("Location") . ':'); $xtpl->table_td($s->get_location_label()); $xtpl->table_tr(); $xtpl->table_td(_("Owner") . ':'); $xtpl->table_td('<a href="?page=adminm§ion=members&action=edit&id=' . $vps->ve['m_id'] . '">' . (isset($vps->ve["m_nick"]) ? $vps->ve["m_nick"] : false) . '</a>'); $xtpl->table_tr(); if ($vps->ve["vps_expiration"]) { $xtpl->table_td(_("Expiration") . ':'); $xtpl->table_td(strftime("%Y-%m-%d %H:%M", $vps->ve["vps_expiration"])); $xtpl->table_tr(); } if ($vps->deleted) { $xtpl->table_td(_("Deleted") . ':');
$xtpl->table_td(_("Quota") . ':'); $xtpl->form_add_input_pure('text', '30', 'quota_val', $q[0]); $xtpl->form_add_select_pure('quota_unit', $NAS_QUOTA_UNITS, $q[1]); $xtpl->table_tr(); $xtpl->form_add_input(_("Share options") . ':', 'text', '30', 'share_options', $root["share_options"], _("Passed directly to zfs sharenfs")); $xtpl->form_out(_("Save")); } $xtpl->sbar_add(_("Add export root"), '?page=cluster&action=node_storage_root_add&node_id=' . $node->s["server_id"]); break; default: break; } } break; case "node_edit_save": $node = new cluster_node($_GET["node_id"]); if ($node->exists) { $node->update_settings($_POST); $xtpl->perex(_("Settings updated"), _("Settings succesfully updated.")); } $list_nodes = true; break; case "node_storage_root_add": $node = new cluster_node($_GET["node_id"]); if ($node->exists) { $xtpl->title2(_("Add export root")); $xtpl->table_add_category(''); $xtpl->table_add_category(''); $xtpl->form_create('?page=cluster&action=node_storage_root_save&node_id=' . $node->s["server_id"], 'post'); $xtpl->form_add_input(_("Label") . ':', 'text', '30', 'storage_label'); $xtpl->form_add_input(_("Root dataset") . ':', 'text', '30', 'storage_root_dataset');
} if ($list_nodes) { $xtpl->sbar_add(_("Register new node"), '?page=cluster&action=newnode'); $xtpl->sbar_add(_("Manage VPS templates"), '?page=cluster&action=templates'); $xtpl->sbar_add(_("Manage RAM limits"), '?page=cluster&action=ramlimits'); $xtpl->sbar_add(_("Manage HDD limits"), '?page=cluster&action=hddlimits'); $xtpl->sbar_add(_("Manage IPv4 address list"), '?page=cluster&action=ipv4addr'); $xtpl->sbar_add(_("Manage IPv6 address list"), '?page=cluster&action=ipv6addr'); $xtpl->sbar_add(_("Manage DNS servers"), '?page=cluster&action=dns'); $xtpl->sbar_add(_("Manage locations"), '?page=cluster&action=locations'); $xtpl->sbar_add(_("Edit vpsAdmin textfields"), '?page=cluster&action=fields'); $sql = 'SELECT * FROM servers'; $list_result = $db->query($sql); while ($srv = $db->fetch_array($list_result)) { $xtpl->table_add_category($srv["server_name"]); $node = new cluster_node($srv["server_id"]); $xtpl->table_add_category(""); $xtpl->table_add_category(""); $xtpl->table_add_category('<a href="?page=cluster&action=restart_node&id=' . $srv["server_id"] . '"><img src="template/icons/vps_restart.png" title="' . _("Reboot node") . '"/></a>'); $sql = 'SELECT * FROM servers_status WHERE server_id ="' . $srv["server_id"] . '" ORDER BY id DESC LIMIT 1'; if ($result = $db->query($sql)) { $status = $db->fetch_array($result); } $xtpl->table_td(_("CPU load:")); $xtpl->table_td($status["cpu_load"], false, true, 3); $xtpl->table_tr(); $xtpl->table_td(_("Free RAM:")); $xtpl->table_td($status["ram_free_mb"] . ' MB', false, true, 3); $xtpl->table_tr(); $xtpl->table_td(_("Free OpenVZ diskspace:")); $xtpl->table_td($status["disk_vz_free_gb"] . ' GB', false, true, 3);
$xtpl->table_out(); $xtpl->table_td('', '#5EAFFF; color:#FFF; font-weight:bold;'); $xtpl->table_td(_("Node"), '#5EAFFF; color:#FFF; font-weight:bold;'); $xtpl->table_td(_("VPS"), '#5EAFFF; color:#FFF; font-weight:bold;'); $xtpl->table_td(_("Free"), '#5EAFFF; color:#FFF; font-weight:bold;'); $xtpl->table_td('', '#5EAFFF; color:#FFF; font-weight:bold;'); $xtpl->table_td(_("Node"), '#5EAFFF; color:#FFF; font-weight:bold;'); $xtpl->table_td(_("VPS"), '#5EAFFF; color:#FFF; font-weight:bold;'); $xtpl->table_td(_("Free"), '#5EAFFF; color:#FFF; font-weight:bold;'); $xtpl->table_tr(); $sql = 'SELECT * FROM servers ORDER BY server_location,server_id'; $rslt = $db->query($sql); $position = 1; $last_location = 0; while ($srv = $db->fetch_array($rslt)) { $node = new cluster_node($srv["server_id"]); if ($last_location != 0 && $last_location != $srv["server_location"]) { if ($position == 2) { $xtpl->table_td('', false, false, 5); } $xtpl->table_tr(true); $xtpl->table_td('', '#5EAFFF; color:#FFF; font-weight:bold;'); $xtpl->table_td(_("Node"), '#5EAFFF; color:#FFF; font-weight:bold;'); $xtpl->table_td(_("VPS"), '#5EAFFF; color:#FFF; font-weight:bold;'); $xtpl->table_td(_("Free"), '#5EAFFF; color:#FFF; font-weight:bold;'); $xtpl->table_td('', '#5EAFFF; color:#FFF; font-weight:bold;'); $xtpl->table_td(_("Node"), '#5EAFFF; color:#FFF; font-weight:bold;'); $xtpl->table_td(_("VPS"), '#5EAFFF; color:#FFF; font-weight:bold;'); $xtpl->table_td(_("Free"), '#5EAFFF; color:#FFF; font-weight:bold;'); $xtpl->table_tr(true); $position = 1;
function do_transaction($t) { // debug print_r($t); global $db, $firewall, $cluster_cfg, $cluster; $ret = false; $output[0] = 'SUCCESS'; if ($t['t_server'] == SERVER_ID && !DEMO_MODE) { switch ($t['t_type']) { case T_START_VE: if ($vps = vps_load($t['t_vps'])) { exec_wrapper(BIN_VZCTL . ' start ' . $db->check($vps->veid), $output, $retval); $ret = $retval == 0; } break; case T_STOP_VE: if ($vps = vps_load($t['t_vps'])) { exec_wrapper(BIN_VZCTL . ' stop ' . $db->check($vps->veid), $output, $retval); $ret = $retval == 0; } break; case T_RESTART_VE: if ($vps = vps_load($t['t_vps'])) { exec_wrapper(BIN_VZCTL . ' stop ' . $db->check($vps->veid), $output, $retval); if ($retval != 0) { $ret = false; } else { exec_wrapper(BIN_VZCTL . ' start ' . $db->check($vps->veid), $output, $retval); $ret = $retval == 0; } } break; case T_EXEC_LIMITS: case T_EXEC_PASSWD: case T_EXEC_HOSTNAME: case T_EXEC_DNS: case T_EXEC_IPADD: case T_EXEC_IPDEL: if ($vps = vps_load($t['t_vps'])) { exec_wrapper(BIN_VZCTL . ' set ' . $db->check($vps->veid) . ' --save ' . $db->check(unserialize($t['t_param'])), $output, $retval); $ret = $retval == 0; } break; case T_EXEC_OTHER: break; case T_CREATE_VE: $params = unserialize($t['t_param']); // download template $get_template = get_template($db->check($params['template'])); if ($get_template == false) { $ret = false; $sql = "delete from vps where vpsid=" . $db->check($t['t_vps']); $db->query($sql); break; } exec_wrapper(BIN_VZCTL . ' create ' . $db->check($t['t_vps']) . ' --ostemplate ' . $db->check($params['template']) . ' --hostname ' . $db->check($params['hostname']), $output, $retval); if ($retval != 0) { $ret = false; $sql = "delete from vps where vpsid=" . $db->check($t['t_vps']); $db->query($sql); } else { exec_wrapper(BIN_VZCTL . ' set ' . $db->check($t['t_vps']) . ' --save --nameserver ' . $db->check($params['nameserver']) . ' --onboot yes', $output, $retval); $ret = $retval == 0; // delete template unlink('/vz/template/cache/' . $db->check($params['template']) . '.tar.gz'); } break; case T_DESTROY_VE: // check if runnig ?? $run = exec(BIN_VZLIST . ' ' . $db->check($t['t_vps'])); if (strstr($run, 'running')) { // stop exec_wrapper(BIN_VZCTL . ' stop ' . $t['t_vps'], $output, $retval); } exec_wrapper(BIN_VZCTL . ' destroy ' . $db->check($t['t_vps']), $output, $retval); $ret = $retval == 0; break; case T_REINSTALL_VE: $retval = $retvala = $retvalb = $retvalc = $retvald = 1; $params = unserialize($t['t_param']); exec_wrapper(BIN_VZCTL . ' stop ' . $t['t_vps'], $output, $retval); if ($retval == 0) { exec_wrapper(BIN_VZCTL . ' destroy ' . $db->check($t['t_vps']), $output, $retvala); } if ($retvala == 0) { exec_wrapper(BIN_VZCTL . ' create ' . $db->check($t['t_vps']) . ' --ostemplate ' . $db->check($params['template']) . ' --hostname ' . $db->check($params['hostname']), $output, $retvalb); } if ($retvalb == 0) { exec_wrapper(BIN_VZCTL . ' set ' . $db->check($t['t_vps']) . ' --save --nameserver ' . $db->check($params['nameserver']) . ' --onboot yes', $output, $retvalc); } if ($retvalc == 0) { exec_wrapper(BIN_VZCTL . ' start ' . $db->check($t['t_vps']), $output, $retvald); } $ret = $retvald == 0; break; case T_MIGRATE_OFFLINE: $params = unserialize($t['t_param']); exec_wrapper('vzmigrate ' . $db->check($params['target']) . ' ' . $db->check($t['t_vps']), $output, $retval); $ret = $retval == 0; break; case T_MIGRATE_ONLINE: $params = unserialize($t['t_param']); exec_wrapper('vzmigrate --online ' . $db->check($params['target']) . ' ' . $db->check($t['t_vps']), $output, $retval); // If we were not successful using online migration, fall back to offline one if ($retval != 0 && $params) { $sql = 'UPDATE transactions SET t_type=' . T_MIGRATE_OFFLINE . ' WHERE t_id=' . $db->check($t['t_id']); $db->query($sql); exec_wrapper('vzmigrate ' . $db->check($params['target']) . ' ' . $db->check($t['t_vps']), $output, $retval); } $ret = $retval == 0; break; case T_SNAPSHOT: $params = unserialize($t['t_param']); exec_wrapper('vzdump --suspend ' . $db->check($t['t_vps']), $output, $retval); $ret = $retval == 0; break; case T_FIREWALL_RELOAD: $rules_to_apply = unserialize($t['t_param']); $fault = false; if ($rules_to_apply) { if ($rules_to_apply['ip_v'] == 4) { $firewall->commit_rule('-F OUTPUT_' . $rules_to_apply['ip_id']); $firewall->commit_rule('-F INPUT_' . $rules_to_apply['ip_id']); } else { $firewall->commit_rule6('-F OUTPUT_' . $rules_to_apply['ip_id']); $firewall->commit_rule6('-F INPUT_' . $rules_to_apply['ip_id']); } foreach ($rules_to_apply['rules'] as $rule) { if (!$fault) { if ($rules_to_apply['ip_v'] == 4) { $res = $firewall->commit_rule($rule); } else { $res = $firewall->commit_rule6($rule); } $fault = !$res; } } } else { $fault = true; } if ($fault) { /* TODO Apocalypse scheme */ } $ret = !$fault; break; case T_FIREWALL_FLUSH: $ip_id = unserialize($t['t_param']); $ip = get_ip_by_id($ip_id); if ($ip['ip_v'] == 4) { $res1 = $firewall->commit_rule('-F OUTPUT_' . $ip['ip_id']); $res2 = $firewall->commit_rule('-F INPUT_' . $ip['ip_id']); } else { $res1 = $firewall->commit_rule6('-F OUTPUT_' . $ip['ip_id']); $res2 = $firewall->commit_rule6('-F INPUT_' . $ip['ip_id']); } $ret = $res1 && $res2; break; case T_CLUSTER_TEMPLATE_COPY: $params = unserialize($t["t_param"]); $this_node = new cluster_node(SERVER_ID); $ret = $this_node->fetch_remote_template($params["templ_id"], $params["remote_server_id"]); break; case T_CLUSTER_TEMPLATE_DELETE: $params = unserialize($t["t_param"]); $this_node = new cluster_node(SERVER_ID); $ret = $this_node->delete_template($params["templ_id"]); break; case T_CLUSTER_IP_REGISTER: $params = unserialize($t["t_param"]); $ret = true; if ($params["ip_v"] == 6) { $ret &= $firewall->commit_rule6("-N INPUT_" . $params["ip_id"]); $ret &= $firewall->commit_rule6("-N OUTPUT_" . $params["ip_id"]); $ret &= $firewall->commit_rule6("-A FORWARD -s {$params["ip_addr"]} -g OUTPUT_{$params["ip_id"]}"); $ret &= $firewall->commit_rule6("-A FORWARD -d {$params["ip_addr"]} -g INPUT_{$params["ip_id"]}"); $ret &= $firewall->commit_rule6("-A aztotal -s {$params["ip_addr"]}"); $ret &= $firewall->commit_rule6("-A aztotal -d {$params["ip_addr"]}"); } else { $ret &= $firewall->commit_rule("-N INPUT_" . $params["ip_id"]); $ret &= $firewall->commit_rule("-N OUTPUT_" . $params["ip_id"]); $ret &= $firewall->commit_rule("-A FORWARD -s {$params["ip_addr"]} -g OUTPUT_{$params["ip_id"]}"); $ret &= $firewall->commit_rule("-A FORWARD -d {$params["ip_addr"]} -g INPUT_{$params["ip_id"]}"); $ret &= $firewall->commit_rule("-A anix -s {$params["ip_addr"]}"); $ret &= $firewall->commit_rule("-A anix -d {$params["ip_addr"]}"); $ret &= $firewall->commit_rule("-A atranzit -s {$params["ip_addr"]}"); $ret &= $firewall->commit_rule("-A atranzit -d {$params["ip_addr"]}"); $ret &= $firewall->commit_rule("-A aztotal -s {$params["ip_addr"]}"); $ret &= $firewall->commit_rule("-A aztotal -d {$params["ip_addr"]}"); } break; case T_ENABLE_DEVICES: $params = unserialize($t["t_param"]); $devices_cmd = ''; if ($params[0]) { foreach ($params as $device) { $devices_cmd .= ' --devices ' . $device; } exec_wrapper(BIN_VZCTL . ' set ' . $db->check($t['t_vps']) . ' ' . $devices_cmd . ' --save', $output, $retval); } $ret = $retval == 0; break; case T_ENABLE_TUNTAP: exec_wrapper(BIN_VZCTL . ' stop ' . $db->check($t['t_vps']), $trash, $trash2); exec_wrapper(BIN_VZCTL . ' set ' . $db->check($t['t_vps']) . ' --capability net_admin:on --save', $output, $retval); exec_wrapper(BIN_VZCTL . ' start ' . $db->check($t['t_vps']), $trash, $trash2); if ($retval == 0) { exec_wrapper(BIN_VZCTL . ' exec ' . $db->check($t['t_vps']) . ' mkdir -p /dev/net', $output, $retval); } if ($retval == 0) { exec_wrapper(BIN_VZCTL . ' exec ' . $db->check($t['t_vps']) . ' mknod /dev/net/tun c 10 200', $output, $retval); } if ($retval == 0) { exec_wrapper(BIN_VZCTL . ' exec ' . $db->check($t['t_vps']) . ' chmod 600 /dev/net/tun', $output, $retval); } $ret = $retval == 0; break; case T_ENABLE_FUSE: exec_wrapper(BIN_VZCTL . ' exec ' . $db->check($t['t_vps']) . ' mknod /dev/fuse c 10 229', $output, $retval); $ret = $retval == 0; break; case T_ENABLE_IPTABLES: exec_wrapper(BIN_VZCTL . ' stop ' . $db->check($t['t_vps']), $trash, $trash2); $modules = array('ip_conntrack', 'ip_conntrack_ftp', 'ip_conntrack_irc', 'ip_nat_ftp', 'ip_nat_irc', 'ip_tables', 'ipt_LOG', 'ipt_REDIRECT', 'ipt_REJECT', 'ipt_TCPMSS', 'ipt_TOS', 'ipt_conntrack', 'ipt_helper', 'ipt_length', 'ipt_limit', 'ipt_multiport', 'ipt_state', 'ipt_tcpmss', 'ipt_tos', 'ipt_ttl', 'iptable_filter', 'iptable_mangle', 'iptable_nat'); $iptables_cmd = ''; foreach ($modules as $module) { $iptables_cmd .= ' --iptables ' . $module; } exec_wrapper(BIN_VZCTL . ' set ' . $db->check($t['t_vps']) . ' ' . $iptables_cmd . ' --save', $output, $retval); if ($retval == 0) { exec_wrapper(BIN_VZCTL . ' set ' . $db->check($t['t_vps']) . ' --numiptent 200 --save', $output, $retval); } exec_wrapper(BIN_VZCTL . ' start ' . $db->check($t['t_vps']), $trash, $trash2); $ret = $retval == 0; break; case T_RESTART_NODE: $sql = 'UPDATE transactions SET t_done=1, t_success=1, t_output="' . serialize($ret) . '" WHERE t_id=' . $db->check($t['t_id']); $db->query($sql); exec_wrapper('reboot', $output, $retval); $ret = true; break; default: return false; } } else { $ret = false; } if (DEMO_MODE) { $ret = true; } // if success if ($ret != false) { $sql = 'UPDATE transactions SET t_done=1, t_success=1, t_output="' . serialize($ret) . '" WHERE t_id=' . $db->check($t['t_id']); } else { $sql = 'UPDATE transactions SET t_done=1, t_success=0 WHERE t_id=' . $db->check($t['t_id']); } $db->query($sql); return $ret; }