function clone_vps($m_id, $server_id, $hostname, $configs, $features, $backuper) { global $db; $sql = 'INSERT INTO vps SET m_id = "' . $db->check($m_id) . '", vps_created = "' . $db->check(time()) . '", vps_template = "' . $db->check($this->ve["vps_template"]) . '", vps_info ="' . $db->check("Cloned from {$this->veid}") . '", vps_hostname ="' . $db->check($hostname) . '", dns_resolver_id ="' . $db->check($this->ve["dns_resolver_id"]) . '", vps_server ="' . $db->check($server_id) . '", vps_onboot ="' . $db->check($this->ve["vps_onboot"]) . '", vps_onstartall = ' . $db->check($this->ve["vps_onstartall"]) . ', vps_features_enabled = ' . $db->check($features ? $this->ve["vps_features_enabled"] : 0) . ', vps_backup_enabled = ' . $db->check($backuper ? $this->ve["vps_backup_enabled"] : 1) . ', vps_backup_exclude = "' . $db->check($backuper ? $this->ve["vps_backup_exclude"] : '') . '", vps_config = "' . $db->check($configs ? $this->ve["vps_config"] : '') . '"'; $db->query($sql); $clone = vps_load($db->insert_id()); $src_node = new cluster_node($this->ve["vps_server"]); $dst_node = new cluster_node($server_id); $params = array("src_veid" => $this->veid, "src_addr" => $this->ve["server_ip4"], "src_node_type" => $src_node->role["fstype"], "dst_node_type" => $dst_node->role["fstype"]); add_transaction($_SESSION["member"]["m_id"], $server_id, $clone->veid, $server_id == $this->ve["vps_server"] ? T_CLONE_VE_LOCAL : T_CLONE_VE_REMOTE, $params); switch ($configs) { case 0: $clone->add_default_configs("default_config_chain"); break; case 1: $db->query("INSERT INTO vps_has_config (vps_id, config_id, `order`) SELECT '" . $db->check($clone->veid) . "' AS vps_id, config_id, `order` FROM vps_has_config WHERE vps_id = '" . $db->check($this->veid) . "'"); if ($clone->ve["vps_config"]) { $clone->update_custom_config($clone->ve["vps_config"]); } else { $clone->applyconfigs(); } break; case 2: $clone->add_default_configs("playground_default_config_chain"); break; } // Clone mounts - exports are the same, except backup, that must be created $db->query("INSERT INTO vps_mount (vps_id, src, dst, mount_opts, umount_opts, type, server_id, storage_export_id, mode, cmd_premount, cmd_postmount, cmd_preumount, cmd_postumount)\n\t SELECT " . $clone->veid . " AS vps_id, src, dst, mount_opts, umount_opts, type, server_id, storage_export_id, mode, cmd_premount, cmd_postmount, cmd_preumount, cmd_postumount\n\t FROM vps_mount\n\t WHERE vps_id = " . $db->check($this->veid)); $def_exports = nas_list_default_exports("vps"); $cloned_backup_export = 0; foreach ($def_exports as $e) { if ($e["export_type"] == "backup") { $cloned_backup_export = nas_export_add($clone->ve["m_id"], $e["root_id"], nas_resolve_vars($e["dataset"], $clone->ve), nas_resolve_vars($e["path"], $clone->ve), $e["export_quota"], $e["user_editable"], $e["export_type"]); break; } } if ($cloned_backup_export) { $db->query("UPDATE vps_mount SET storage_export_id = " . $db->check($cloned_backup_export) . "\n\t\t WHERE vps_id = " . $db->check($clone->veid) . " AND storage_export_id = " . $db->check($this->ve["vps_backup_export"])); $clone->set_backuper(NULL, $cloned_backup_export, false, true); } $clone->mount_regen(); $clone->set_hostname($hostname); if ($features && $this->ve["vps_features_enabled"]) { add_transaction($_SESSION["member"]["m_id"], $server_id, $clone->veid, T_ENABLE_FEATURES); } $this->info(); if ($this->ve["vps_up"]) { $clone->start(); } return $clone; }
function nas_create_default_exports($type, $obj) { $exports = nas_list_default_exports($type); $mapping = array(); foreach ($exports as $e) { $new_id = nas_export_add($e["member_id"] ? $e["member_id"] : $obj["m_id"], $e["root_id"], nas_resolve_vars($e["dataset"], $obj), nas_resolve_vars($e["path"], $obj), $e["export_quota"], $e["user_editable"], $e["export_type"], "no", false); $mapping[$e["export_id"]] = $new_id; if ($type == "vps" && $e["export_type"] == "backup") { $vps = new vps_load($obj["vps_id"]); $vps->set_backuper(NULL, $new_id, false, true); } } return $mapping; }
$xtpl->table_td($e["export_type"]); $xtpl->table_td('<a href="?page=cluster&action=nas_def_export_edit&id=' . $e["export_id"] . '"><img src="template/icons/edit.png" title="' . _("Edit") . '"></a>'); $xtpl->table_td('<a href="?page=cluster&action=nas_def_export_del&id=' . $e["export_id"] . '"><img src="template/icons/delete.png" title="' . _("Delete") . '"></a>'); $xtpl->table_tr(); } $xtpl->table_out(); $xtpl->table_title(_("Default exports created for new VPS")); $xtpl->table_add_category(_("Member")); $xtpl->table_add_category(_("Pool")); $xtpl->table_add_category(_("Dataset")); $xtpl->table_add_category(_("Path")); $xtpl->table_add_category(_("Quota")); $xtpl->table_add_category(_("Type")); $xtpl->table_add_category(''); $xtpl->table_add_category(''); $exports_m = nas_list_default_exports("vps"); foreach ($exports_m as $e) { $xtpl->table_td($e["member_id"] ? $e["m_nick"] : _("VPS owner")); $xtpl->table_td($e["label"]); if ($_SESSION["is_admin"]) { $xtpl->table_td($e["dataset"]); } $xtpl->table_td($e["path"]); $xtpl->table_td(nas_size_to_humanreadable($e["export_quota"])); $xtpl->table_td($e["export_type"]); $xtpl->table_td('<a href="?page=cluster&action=nas_def_export_edit&id=' . $e["export_id"] . '"><img src="template/icons/edit.png" title="' . _("Edit") . '"></a>'); $xtpl->table_td('<a href="?page=cluster&action=nas_def_export_del&id=' . $e["export_id"] . '"><img src="template/icons/delete.png" title="' . _("Delete") . '"></a>'); $xtpl->table_tr(); } $xtpl->table_out(); $xtpl->table_title(_("Default mounts created for new VPS"));