diff --git a/dashboard/src/js/client.js b/dashboard/src/js/client.js index a45b61846..b5b976a1c 100644 --- a/dashboard/src/js/client.js +++ b/dashboard/src/js/client.js @@ -3030,7 +3030,7 @@ angular.module('Application').service('Client', ['$http', '$interval', '$timeout }; Client.prototype.setDnsRecords = function (options, callback) { - post('/api/v1/cloudron/sync_dns', options, null, function (error, data, status) { + post('/api/v1/domains/sync_dns', options, null, function (error, data, status) { if (error) return callback(error); if (status !== 201) return callback(new ClientError(status, data)); diff --git a/src/cloudron.js b/src/cloudron.js index 975f64b20..3da217b27 100644 --- a/src/cloudron.js +++ b/src/cloudron.js @@ -17,7 +17,6 @@ exports = module.exports = { setDashboardDomain, updateDashboardDomain, renewCerts, - syncDnsRecords, updateDiskUsage, @@ -331,14 +330,6 @@ async function setupDnsAndCert(subdomain, domain, auditSource, progressCallback) await reverseProxy.ensureCertificate(location, {}, auditSource); } -async function syncDnsRecords(options) { - assert.strictEqual(typeof options, 'object'); - - const taskId = await tasks.add(tasks.TASK_SYNC_DNS_RECORDS, [ options ]); - tasks.startTask(taskId, {}); - return taskId; -} - async function updateDiskUsage() { const taskId = await tasks.add(tasks.TASK_UPDATE_DISK_USAGE, []); tasks.startTask(taskId, {}); diff --git a/src/dns.js b/src/dns.js index 8da202196..5456cda4c 100644 --- a/src/dns.js +++ b/src/dns.js @@ -19,6 +19,7 @@ module.exports = exports = { checkDnsRecords, syncDnsRecords, + startSyncDnsRecords }; const apps = require('./apps.js'), @@ -33,6 +34,7 @@ const apps = require('./apps.js'), promiseRetry = require('./promise-retry.js'), safe = require('safetydance'), settings = require('./settings.js'), + tasks = require('./tasks.js'), tld = require('tldjs'); // choose which subdomain backend we use for test purpose we use route53 @@ -311,3 +313,12 @@ async function syncDnsRecords(options, progressCallback) { return { errors }; } + + +async function startSyncDnsRecords(options) { + assert.strictEqual(typeof options, 'object'); + + const taskId = await tasks.add(tasks.TASK_SYNC_DNS_RECORDS, [ options ]); + tasks.startTask(taskId, {}); + return taskId; +} diff --git a/src/routes/cloudron.js b/src/routes/cloudron.js index 9fc97f97f..222fd347b 100644 --- a/src/routes/cloudron.js +++ b/src/routes/cloudron.js @@ -19,7 +19,6 @@ exports = module.exports = { prepareDashboardDomain, renewCerts, getLanguages, - syncDnsRecords, getSystemGraphs, getPlatformStatus, getBlockDevices, @@ -289,19 +288,6 @@ async function getLanguages(req, res, next) { next(new HttpSuccess(200, { languages })); } -async function syncDnsRecords(req, res, next) { - assert.strictEqual(typeof req.body, 'object'); - - if ('domain' in req.body && typeof req.body.domain !== 'string') return next(new HttpError(400, 'domain must be a string')); - if ('type' in req.body && typeof req.body.type !== 'string') return next(new HttpError(400, 'type must be a string')); - - const [error, taskId] = await safe(cloudron.syncDnsRecords(req.body)); - if (error && error.reason === BoxError.ACCESS_DENIED) return next(new HttpSuccess(200, { error: { reason: error.reason, message: error.message }})); - if (error) return next(BoxError.toHttpError(error)); - - next(new HttpSuccess(201, { taskId })); -} - async function getSystemGraphs(req, res, next) { if (!req.query.fromMinutes || !parseInt(req.query.fromMinutes)) return next(new HttpError(400, 'fromMinutes must be a number')); diff --git a/src/routes/domains.js b/src/routes/domains.js index 978d696ee..b88672a73 100644 --- a/src/routes/domains.js +++ b/src/routes/domains.js @@ -9,6 +9,7 @@ exports = module.exports = { del, checkDnsRecords, + syncDnsRecords, }; const assert = require('assert'), @@ -154,3 +155,16 @@ async function checkDnsRecords(req, res, next) { next(new HttpSuccess(200, { needsOverwrite: result.needsOverwrite })); } + +async function syncDnsRecords(req, res, next) { + assert.strictEqual(typeof req.body, 'object'); + + if ('domain' in req.body && typeof req.body.domain !== 'string') return next(new HttpError(400, 'domain must be a string')); + if ('type' in req.body && typeof req.body.type !== 'string') return next(new HttpError(400, 'type must be a string')); + + const [error, taskId] = await safe(dns.startSyncDnsRecords(req.body)); + if (error && error.reason === BoxError.ACCESS_DENIED) return next(new HttpSuccess(200, { error: { reason: error.reason, message: error.message }})); + if (error) return next(BoxError.toHttpError(error)); + + next(new HttpSuccess(201, { taskId })); +} diff --git a/src/server.js b/src/server.js index b4d30d837..9c80202b9 100644 --- a/src/server.js +++ b/src/server.js @@ -116,7 +116,6 @@ async function initializeExpressSync() { router.post('/api/v1/cloudron/prepare_dashboard_domain', json, token, authorizeAdmin, routes.cloudron.prepareDashboardDomain); router.post('/api/v1/cloudron/set_dashboard_domain', json, token, authorizeAdmin, routes.cloudron.updateDashboardDomain); router.post('/api/v1/cloudron/renew_certs', json, token, authorizeAdmin, routes.cloudron.renewCerts); - router.post('/api/v1/cloudron/sync_dns', json, token, authorizeAdmin, routes.cloudron.syncDnsRecords); router.get ('/api/v1/cloudron/reboot', token, authorizeAdmin, routes.cloudron.isRebootRequired); router.post('/api/v1/cloudron/reboot', json, token, authorizeAdmin, routes.cloudron.reboot); router.get ('/api/v1/cloudron/graphs', token, authorizeAdmin, routes.cloudron.getSystemGraphs); @@ -380,6 +379,7 @@ async function initializeExpressSync() { // domain routes router.post('/api/v1/domains', json, token, authorizeAdmin, routes.domains.add); + router.post('/api/v1/domains/sync_dns', json, token, authorizeAdmin, routes.domains.syncDnsRecords); router.get ('/api/v1/domains', token, authorizeUser, routes.domains.list); router.get ('/api/v1/domains/:domain', token, authorizeAdmin, routes.domains.get); // this is manage scope because it returns non-restricted fields router.post('/api/v1/domains/:domain/config', json, token, authorizeAdmin, routes.domains.setConfig);