Files
cloudron-box/src/dns/caas.js
T

129 lines
4.8 KiB
JavaScript
Raw Normal View History

2015-09-13 16:50:32 +02:00
/* jslint node:true */
'use strict';
exports = module.exports = {
addSubdomain: addSubdomain,
delSubdomain: delSubdomain,
2015-10-29 14:15:54 -07:00
updateSubdomain: updateSubdomain,
2015-09-13 16:50:32 +02:00
getChangeStatus: getChangeStatus
};
var assert = require('assert'),
2015-10-28 16:02:06 -07:00
config = require('../config.js'),
debug = require('debug')('box:dns/caas'),
SubdomainError = require('../subdomainerror.js'),
2015-09-13 16:50:32 +02:00
superagent = require('superagent'),
util = require('util');
function addSubdomain(zoneName, subdomain, type, value, callback) {
assert.strictEqual(typeof zoneName, 'string');
assert.strictEqual(typeof subdomain, 'string');
assert.strictEqual(typeof type, 'string');
assert.strictEqual(typeof value, 'string');
assert.strictEqual(typeof callback, 'function');
var fqdn = subdomain !== '' && type === 'TXT' ? subdomain + '.' + config.fqdn() : config.appFqdn(subdomain);
debug('addSubdomain: zoneName: %s subdomain: %s type: %s value: %s fqdn: %s', zoneName, subdomain, type, value, fqdn);
2015-09-13 16:50:32 +02:00
2015-09-13 17:00:04 +02:00
var data = {
type: type,
value: value
};
2015-09-13 16:50:32 +02:00
superagent
.post(config.apiServerOrigin() + '/api/v1/domains/' + fqdn)
2015-09-13 16:50:32 +02:00
.query({ token: config.token() })
2015-09-13 17:00:04 +02:00
.send(data)
2015-09-13 16:50:32 +02:00
.end(function (error, result) {
if (error) return callback(error);
2015-09-15 18:27:09 -07:00
if (result.status === 420) return callback(new SubdomainError(SubdomainError.STILL_BUSY));
2015-09-13 16:50:32 +02:00
if (result.status !== 201) return callback(new SubdomainError(SubdomainError.EXTERNAL_ERROR, util.format('%s %j', result.status, result.body)));
return callback(null, result.body.changeId);
});
}
2015-10-29 14:15:54 -07:00
function getSubdomain(zoneName, subdomain, type, callback) {
assert.strictEqual(typeof zoneName, 'string');
assert.strictEqual(typeof subdomain, 'string');
assert.strictEqual(typeof type, 'string');
assert.strictEqual(typeof callback, 'function');
var fqdn = subdomain !== '' && type === 'TXT' ? subdomain + '.' + config.fqdn() : config.appFqdn(subdomain);
debug('getSubdomain: zoneName: %s subdomain: %s type: %s fqdn: %s', zoneName, subdomain, type, fqdn);
superagent
.get(config.apiServerOrigin() + '/api/v1/domains/' + fqdn)
.query({ token: config.token(), type: type })
.end(function (error, result) {
if (error) return callback(error);
if (result.status !== 200) return callback(new SubdomainError(SubdomainError.EXTERNAL_ERROR, util.format('%s %j', result.status, result.body)));
return callback(null, result.body.values);
});
}
function updateSubdomain(zoneName, subdomain, type, value, callback) {
assert.strictEqual(typeof zoneName, 'string');
assert.strictEqual(typeof subdomain, 'string');
assert.strictEqual(typeof type, 'string');
assert.strictEqual(typeof value, 'string');
assert.strictEqual(typeof callback, 'function');
getSubdomain(zoneName, subdomain, type, function (error, values) {
if (values[0] === value) return callback();
addSubdomain(zoneName, subdomain, type, value, callback);
});
}
2015-09-13 16:50:32 +02:00
function delSubdomain(zoneName, subdomain, type, value, callback) {
assert.strictEqual(typeof zoneName, 'string');
assert.strictEqual(typeof subdomain, 'string');
assert.strictEqual(typeof type, 'string');
assert.strictEqual(typeof value, 'string');
assert.strictEqual(typeof callback, 'function');
debug('delSubdomain: %s for domain %s.', subdomain, zoneName);
2015-09-13 18:10:45 +02:00
var data = {
type: type,
value: value
};
2015-09-13 16:50:32 +02:00
superagent
.del(config.apiServerOrigin() + '/api/v1/domains/' + config.appFqdn(subdomain))
.query({ token: config.token() })
2015-09-13 18:10:45 +02:00
.send(data)
2015-09-13 16:50:32 +02:00
.end(function (error, result) {
if (error) return callback(error);
2015-09-15 18:27:09 -07:00
if (result.status === 420) return callback(new SubdomainError(SubdomainError.STILL_BUSY));
if (result.status === 404) return callback(new SubdomainError(SubdomainError.NOT_FOUND));
2015-09-13 16:50:32 +02:00
if (result.status !== 204) return callback(new SubdomainError(SubdomainError.EXTERNAL_ERROR, util.format('%s %j', result.status, result.body)));
return callback(null);
});
}
function getChangeStatus(changeId, callback) {
assert.strictEqual(typeof changeId, 'string');
assert.strictEqual(typeof callback, 'function');
if (changeId === '') return callback(null, 'INSYNC');
superagent
.get(config.apiServerOrigin() + '/api/v1/domains/' + config.fqdn() + '/status/' + changeId)
.query({ token: config.token() })
.end(function (error, result) {
if (error) return callback(error);
if (result.status !== 200) return callback(new SubdomainError(SubdomainError.EXTERNAL_ERROR, util.format('%s %j', result.status, result.body)));
return callback(null, result.body.status);
});
}