/* * This file is part of Linode Manager Classic. * * Linode Manager Classic is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Linode Manager Classic is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Linode Manager Classic. If not, see . */ import { settings, elements, apiGet, apiPost, parseParams, setupHeader } from "/global.js"; (function() { // Element names specific to this page elements.addMaster = "add-master"; elements.addSlave = "add-slave"; elements.email = "email"; elements.linode = "linode"; elements.masterDomain = "master-domain"; elements.masters = "masters"; elements.masterSection = "master-section"; elements.no = "no"; elements.slaveDomain = "slave-domain"; elements.slaveSection = "slave-section"; elements.yes = "yes"; // Data recieved from API calls var data = {}; data.linodes = []; // Static references to UI elements var ui = {}; ui.addMaster = {}; ui.addSlave = {}; ui.email = {}; ui.linode = {}; ui.masterDomain = {}; ui.masters = {}; ui.masterSection = []; ui.no = {}; ui.slaveDomain = {}; ui.slaveSection = []; ui.yes = {}; // Temporary state var state = {}; state.did = 0; state.returned = 0; state.total = 0; // Add initial records to new domain var addRecords = function(response) { // Find the selected linode var linode = null; for (var i = 0; i < data.linodes.length; i++) { if (data.linodes[i].id == parseInt(ui.linode.value)) { linode = data.linodes[i]; break; } } if (!linode) { location.href = "/dns/domain?did=" + response.id; return; } // Create record requests state.did = response.id; var callback = function(response) { state.returned++; if (state.returned >= state.total) location.href = "/dns/domain?did=" + state.did; } var reqs = [ { "type": "A", "name": "", "target": linode.ipv4[0] }, { "type": "A", "name": "mail", "target": linode.ipv4[0] }, { "type": "A", "name": "www", "target": linode.ipv4[0] }, { "type": "AAAA", "name": "", "target": linode.ipv6.split("/")[0] }, { "type": "AAAA", "name": "mail", "target": linode.ipv6.split("/")[0] }, { "type": "AAAA", "name": "www", "target": linode.ipv6.split("/")[0] }, { "type": "MX", "target": "mail.meredithlaboon.com", "priority": 10, "name": "" } ]; state.total = reqs.length; for (var i = 0; i < reqs.length; i++) apiPost("/domains/" + response.id + "/records", reqs[i], callback); }; // Callback for Linodes API call var displayLinodes = function(response) { // Add linodes to array data.linodes = data.linodes.concat(response.data); // Request the next page if there are more pages if (response.page != response.pages) { apiGet("/linode/instances?page=" + (response.page + 1), displayLinodes, null); return; } // Add linodes to selector for (var i = 0; i < data.linodes.length; i++) { var option = document.createElement("option"); option.value = data.linodes[i].id; option.innerHTML = data.linodes[i].label; ui.linode.appendChild(option); } ui.addMaster.disabled = false; }; // Click handler for add master button var handleAddMaster = function(event) { if (event.currentTarget.disabled) return; // This request takes a few seconds ui.addMaster.disabled = true; var req = { "domain": ui.masterDomain.value, "type": "master", "soa_email": ui.email.value }; var callback = function(response) { location.href = "/dns/domain?did=" + response.id; }; if (ui.yes.checked) callback = addRecords; apiPost("/domains", req, callback); }; // Click handler for add slave button var handleAddSlave = function(event) { if (event.currentTarget.disabled) return; // This request takes a few seconds ui.addSlave.disabled = true; var ips = []; var masterLines = ui.masters.value.split("\n"); for (var i = 0; i < masterLines.length; i++) ips = ips.concat(masterLines[i].split(";")); var req = { "domain": ui.slaveDomain.value, "type": "slave", "master_ips": ips }; apiPost("/domains", req, function(response) { location.href = "/dns/domain?did=" + response.id; }); }; // Initial setup var setup = function() { // Parse URL parameters data.params = parseParams(); setupHeader(); // Get element references ui.addMaster = document.getElementById(elements.addMaster); ui.addSlave = document.getElementById(elements.addSlave); ui.email = document.getElementById(elements.email); ui.linode = document.getElementById(elements.linode); ui.masterDomain = document.getElementById(elements.masterDomain); ui.masters = document.getElementById(elements.masters); ui.masterSection = document.getElementsByClassName(elements.masterSection); ui.no = document.getElementById(elements.no); ui.slaveDomain = document.getElementById(elements.slaveDomain); ui.slaveSection = document.getElementsByClassName(elements.slaveSection); ui.yes = document.getElementById(elements.yes); // Display desired section var section = null; if (data.params.type && data.params.type == "slave") section = ui.slaveSection; else section = ui.masterSection; for (var i = 0; i < section.length; i++) section[i].style.display = "table-row-group"; // Attach event handlers ui.addMaster.addEventListener("click", handleAddMaster); ui.addSlave.addEventListener("click", handleAddSlave); // Get data from API if (!data.params.type || data.params.type != "slave") apiGet("/linode/instances", displayLinodes, null); }; // Attach onload handler window.addEventListener("load", setup); })();