diff --git a/src/index.html b/src/index.html index 8e3b7f833..b0da0c655 100644 --- a/src/index.html +++ b/src/index.html @@ -158,6 +158,7 @@
  • Email
  • Event Log
  • Graphs
  • +
  • Network
  • Notifications {{ notifications.length }}
  • Settings
  • diff --git a/src/js/index.js b/src/js/index.js index 61c568428..8e43603fe 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -132,6 +132,9 @@ app.config(['$routeProvider', function ($routeProvider) { }).when('/graphs', { controller: 'GraphsController', templateUrl: 'views/graphs.html?<%= revision %>' + }).when('/network', { + controller: 'NetworkController', + templateUrl: 'views/network.html?<%= revision %>' }).when('/domains', { controller: 'DomainsController', templateUrl: 'views/domains.html?<%= revision %>' diff --git a/src/views/domains.html b/src/views/domains.html index 8b522dfd7..463a5b1d7 100644 --- a/src/views/domains.html +++ b/src/views/domains.html @@ -201,48 +201,6 @@ - - -

    Domains

    @@ -361,70 +319,4 @@
    - -
    -

    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

    -
    - -
    -
    -
    -

    - Enable this option to keep all your DNS records in sync with a changing IP address. - This is useful when Cloudron runs in a network with a frequently changing public IP address like a home connection. -

    -


    {{ dyndnsConfigure.error }}

    -
    - -
    -
    -
    - -
    -
    - Saved -
    - -
    - -
    -
    -
    diff --git a/src/views/domains.js b/src/views/domains.js index f978a3054..b13bf91fe 100644 --- a/src/views/domains.js +++ b/src/views/domains.js @@ -10,6 +10,7 @@ angular.module('Application').controller('DomainsController', ['$scope', '$locat $scope.config = Client.getConfig(); $scope.domains = []; $scope.ready = false; + // currently, validation of wildcard with various provider is done server side $scope.tlsProvider = [ { name: 'Let\'s Encrypt Prod', value: 'letsencrypt-prod' }, @@ -34,36 +35,20 @@ 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'; - } - }; - - // 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'; + $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'; } }; @@ -516,127 +501,20 @@ angular.module('Application').controller('DomainsController', ['$scope', '$locat } }; - $scope.dyndnsConfigure = { - busy: false, - success: false, - error: '', - currentState: false, - enabled: false, - - refresh: function () { - Client.getDynamicDnsConfig(function (error, enabled) { - if (error) return console.error(error); - - $scope.dyndnsConfigure.currentState = enabled; - $scope.dyndnsConfigure.enabled = enabled; - }); - }, - - submit: function () { - $scope.dyndnsConfigure.busy = true; - $scope.dyndnsConfigure.success = false; - $scope.dyndnsConfigure.error = ''; - - Client.setDynamicDnsConfig($scope.dyndnsConfigure.enabled, function (error) { - if (error) $scope.dyndnsConfigure.error = error.message; - else $scope.dyndnsConfigure.currentState = $scope.dyndnsConfigure.enabled; - - $scope.dyndnsConfigure.busy = false; - $scope.dyndnsConfigure.success = true; - }); - } - }; - - $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); $scope.ready = true; - - if ($scope.config.uiSpec.domains.dynamicDns) { - $scope.dyndnsConfigure.refresh(); - } }); $scope.renewCerts.checkStatus(); - $scope.sysinfo.refresh(); }); document.getElementById('gcdnsKeyFileInput').onchange = readFileLocally($scope.domainConfigure.gcdnsKey, 'content', 'keyFileName'); document.getElementById('fallbackCertFileInput').onchange = readFileLocally($scope.domainConfigure.fallbackCert, 'certificateFile', 'certificateFileName'); document.getElementById('fallbackKeyFileInput').onchange = readFileLocally($scope.domainConfigure.fallbackCert, 'keyFile', 'keyFileName'); - // setup all the dialog focus handling ['domainConfigureModal', 'domainRemoveModal'].forEach(function (id) { $('#' + id).on('shown.bs.modal', function () { diff --git a/src/views/network.html b/src/views/network.html new file mode 100644 index 000000000..caeff4a4f --- /dev/null +++ b/src/views/network.html @@ -0,0 +1,113 @@ + + + +
    +
    +

    Network

    +
    + +
    +

    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

    +
    + +
    +
    +
    +

    + Enable this option to keep all your DNS records in sync with a changing IP address. + This is useful when Cloudron runs in a network with a frequently changing public IP address like a home connection. +

    +


    {{ dyndnsConfigure.error }}

    +
    + +
    +
    +
    + +
    +
    + Saved +
    + +
    + +
    +
    +
    +
    diff --git a/src/views/network.js b/src/views/network.js new file mode 100644 index 000000000..13c87eaff --- /dev/null +++ b/src/views/network.js @@ -0,0 +1,137 @@ +'use strict'; + +/* global angular */ +/* global $ */ + +angular.module('Application').controller('NetworkController', ['$scope', '$location', 'Client', function ($scope, $location, Client) { + Client.onReady(function () { if (!Client.getUserInfo().admin) $location.path('/'); }); + + $scope.config = Client.getConfig(); + + // 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'; + } + }; + + $scope.dyndnsConfigure = { + busy: false, + success: false, + error: '', + currentState: false, + enabled: false, + + refresh: function () { + Client.getDynamicDnsConfig(function (error, enabled) { + if (error) return console.error(error); + + $scope.dyndnsConfigure.currentState = enabled; + $scope.dyndnsConfigure.enabled = enabled; + }); + }, + + submit: function () { + $scope.dyndnsConfigure.busy = true; + $scope.dyndnsConfigure.success = false; + $scope.dyndnsConfigure.error = ''; + + Client.setDynamicDnsConfig($scope.dyndnsConfigure.enabled, function (error) { + if (error) $scope.dyndnsConfigure.error = error.message; + else $scope.dyndnsConfigure.currentState = $scope.dyndnsConfigure.enabled; + + $scope.dyndnsConfigure.busy = false; + $scope.dyndnsConfigure.success = true; + }); + } + }; + + $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 () { + $scope.sysinfo.refresh(); + + if ($scope.config.uiSpec.domains.dynamicDns) { + $scope.dyndnsConfigure.refresh(); + } + }); + + $('.modal-backdrop').remove(); +}]);