From b520b6dc133c30f7dba2616fe013fd80526eb1f3 Mon Sep 17 00:00:00 2001 From: Johannes Zellner Date: Tue, 5 Nov 2019 13:45:24 +0100 Subject: [PATCH] Add sysinfo configuration --- src/views/domains.html | 77 +++++++++++++++++++++++++++ src/views/domains.js | 117 +++++++++++++++++++++++++++++++++++------ 2 files changed, 179 insertions(+), 15 deletions(-) diff --git a/src/views/domains.html b/src/views/domains.html index 99bef96eb..8b522dfd7 100644 --- a/src/views/domains.html +++ b/src/views/domains.html @@ -201,6 +201,48 @@ + + +

Domains

@@ -320,6 +362,41 @@
+
+

SysInfo / IP Address

+
+ +
+
+
+

+ To automatically setup DNS records, Cloudron needs to know which IP address should be used. +

+ + + + + + + + + + + + + +
Current Backend{{ prettySysinfoProviderName(sysinfo.provider) }}
IP Address{{ sysinfo.ip }}
Network Interface Name{{ sysinfo.ifname }}
+

+
+
+ +
+
+ +
+
+
+

Dynamic DNS

diff --git a/src/views/domains.js b/src/views/domains.js index 1c9af4bc0..f978a3054 100644 --- a/src/views/domains.js +++ b/src/views/domains.js @@ -34,21 +34,37 @@ angular.module('Application').controller('DomainsController', ['$scope', '$locat { name: 'No-op (only for development)', value: 'noop' } ]; - $scope.prettyProviderName = function (domain) { - switch (domain.provider) { - case 'caas': return 'Managed Cloudron'; - case 'route53': return 'AWS Route53'; - case 'cloudflare': return 'Cloudflare'; - case 'digitalocean': return 'DigitalOcean'; - case 'gandi': return 'Gandi LiveDNS'; - case 'namecom': return 'Name.com'; - case 'namecheap': return 'Namecheap'; - case 'gcdns': return 'Google Cloud'; - case 'godaddy': return 'GoDaddy'; - case 'manual': return 'Manual'; - case 'wildcard': return 'Wildcard'; - case 'noop': return 'No-op'; - default: return 'Unknown'; + $scope.prettyProviderName = function (domain) { + switch (domain.provider) { + case 'caas': return 'Managed Cloudron'; + case 'route53': return 'AWS Route53'; + case 'cloudflare': return 'Cloudflare'; + case 'digitalocean': return 'DigitalOcean'; + case 'gandi': return 'Gandi LiveDNS'; + case 'namecom': return 'Name.com'; + case 'namecheap': return 'Namecheap'; + case 'gcdns': return 'Google Cloud'; + case 'godaddy': return 'GoDaddy'; + case 'manual': return 'Manual'; + case 'wildcard': return 'Wildcard'; + case 'noop': return 'No-op'; + default: return 'Unknown'; + } + }; + + // keep in sync with sysinfo.js + $scope.sysinfoProvider = [ + { name: 'Automatic (default)', value: 'generic' }, + { name: 'Static IP Address', value: 'fixed' }, + { name: 'Network Interface', value: 'network-interface' } + ]; + + $scope.prettySysinfoProviderName = function (provider) { + switch (provider) { + case 'generic': return 'Automatic'; + case 'fixed': return 'Static IP Address'; + case 'network-interface': return 'Network Interface'; + default: return 'Unknown'; } }; @@ -531,6 +547,76 @@ angular.module('Application').controller('DomainsController', ['$scope', '$locat } }; + $scope.sysinfo = { + busy: false, + error: {}, + + provider: '', + ip: '', + ifname: '', + + // configure dialog + newProvider: '', + newIp: '', + newIfname: '', + + refresh: function () { + Client.getSysinfoConfig(function (error, result) { + if (error) return console.error(error); + + $scope.sysinfo.provider = result.provider; + $scope.sysinfo.ip = result.ip || ''; + $scope.sysinfo.ifname = result.ifname || ''; + }); + }, + + show: function () { + $scope.sysinfo.error = {}; + $scope.sysinfo.newProvider = $scope.sysinfo.provider; + $scope.sysinfo.newIp = $scope.sysinfo.ip; + $scope.sysinfo.newIfname = $scope.sysinfo.ifname; + + $('#sysinfoModal').modal('show'); + }, + + submit: function () { + $scope.sysinfo.error = {}; + $scope.sysinfo.busy = true; + + var config = { + provider: $scope.sysinfo.newProvider + }; + + if (config.provider === 'fixed') { + config.ip = $scope.sysinfo.newIp; + } else if (config.provider === 'network-interface') { + config.ifname = $scope.sysinfo.newIfname; + } + + Client.setSysinfoConfig(config, function (error) { + $scope.sysinfo.busy = false; + if (error && error.message.indexOf('ip') !== -1) { + $scope.sysinfo.error.ip = error.message; + $scope.sysinfoForm.$setPristine(); + $scope.sysinfoForm.$setUntouched(); + return; + } else if (error && (error.message.indexOf('interface') !== -1 || error.message.indexOf('IPv4') !== -1)) { + $scope.sysinfo.error.ifname = error.message; + $scope.sysinfoForm.$setPristine(); + $scope.sysinfoForm.$setUntouched(); + return; + } else if (error) { + console.error(error); + return; + } + + $scope.sysinfo.refresh(); + + $('#sysinfoModal').modal('hide'); + }); + } + }; + Client.onReady(function () { refreshDomains(function (error) { if (error) return console.error(error); @@ -543,6 +629,7 @@ angular.module('Application').controller('DomainsController', ['$scope', '$locat }); $scope.renewCerts.checkStatus(); + $scope.sysinfo.refresh(); }); document.getElementById('gcdnsKeyFileInput').onchange = readFileLocally($scope.domainConfigure.gcdnsKey, 'content', 'keyFileName');