can delete zone
This commit is contained in:
parent
92ad26d18e
commit
16bceb8a8a
|
@ -187,7 +187,7 @@ function getNs(engine, zs, results, cb) {
|
||||||
return -1 !== engine.primaryNameservers.indexOf(ns.data.toLowerCase());
|
return -1 !== engine.primaryNameservers.indexOf(ns.data.toLowerCase());
|
||||||
})) {
|
})) {
|
||||||
results.authority.length = 0;
|
results.authority.length = 0;
|
||||||
results.authority.push(engine.zoneToSoa(z));
|
results.authority.push(engine.zones._toSoa(z));
|
||||||
results.header.rcode = NXDOMAIN;
|
results.header.rcode = NXDOMAIN;
|
||||||
}
|
}
|
||||||
cb(null, results);
|
cb(null, results);
|
||||||
|
@ -199,9 +199,9 @@ function getSoa(engine, domain, results, cb, answerSoa) {
|
||||||
console.log('[DEV] getSoa entered');
|
console.log('[DEV] getSoa entered');
|
||||||
|
|
||||||
if (!answerSoa) {
|
if (!answerSoa) {
|
||||||
results.authority.push(engine.zoneToSoa(domain));
|
results.authority.push(engine.zones._toSoa(domain));
|
||||||
} else {
|
} else {
|
||||||
results.answer.push(engine.zoneToSoa(domain));
|
results.answer.push(engine.zones._toSoa(domain));
|
||||||
}
|
}
|
||||||
|
|
||||||
cb(null, results);
|
cb(null, results);
|
||||||
|
|
11
lib/httpd.js
11
lib/httpd.js
|
@ -189,6 +189,14 @@ module.exports.create = function (cli, engine/*, dnsd*/) {
|
||||||
res.send(zone);
|
res.send(zone);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
app.delete('/api/zones/:id', hasClaim('+rw@adns.org'), function (req, res) {
|
||||||
|
var zoneId = req.params.id;
|
||||||
|
engine.zones.destroy(zoneId, function (err, zone) {
|
||||||
|
if (err) { res.send({ error: { message: err.message } }); return; }
|
||||||
|
// zone + records
|
||||||
|
res.send(zone);
|
||||||
|
});
|
||||||
|
});
|
||||||
function mapRecord(r) {
|
function mapRecord(r) {
|
||||||
return {
|
return {
|
||||||
id: r.id
|
id: r.id
|
||||||
|
@ -217,8 +225,7 @@ module.exports.create = function (cli, engine/*, dnsd*/) {
|
||||||
engine.zones.get({ names: [ zonename ] }, function (err, zones) {
|
engine.zones.get({ names: [ zonename ] }, function (err, zones) {
|
||||||
console.log('zone:');
|
console.log('zone:');
|
||||||
console.log(zones[0]);
|
console.log(zones[0]);
|
||||||
var zone = engine.zoneToSoa(zones[0]);
|
var zone = engine.zones._toSoa(zones[0]);
|
||||||
console.log(zone);
|
|
||||||
zone.class = zone.className;
|
zone.class = zone.className;
|
||||||
zone.type = zone.typeName;
|
zone.type = zone.typeName;
|
||||||
engine.records.all(function (err, records) {
|
engine.records.all(function (err, records) {
|
||||||
|
|
|
@ -225,7 +225,48 @@
|
||||||
$qs('a.js-name').href =
|
$qs('a.js-name').href =
|
||||||
$qs('a.js-name').dataset.href.replace(/:name/, ev.target.value || ':name');
|
$qs('a.js-name').dataset.href.replace(/:name/, ev.target.value || ':name');
|
||||||
});
|
});
|
||||||
|
$on('button.js-zone-destroy', 'click', function (ev) {
|
||||||
|
var zoneId = ev.target.parentElement.dataset.id;
|
||||||
|
var zoneName = ev.target.parentElement.dataset.name;
|
||||||
|
|
||||||
|
if (!window.confirm("Remove zone '" + zoneName + "' and all associated records?")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return window.fetch(
|
||||||
|
'/api/zones/' + zoneId
|
||||||
|
, { method: 'DELETE'
|
||||||
|
, headers: new window.Headers({
|
||||||
|
'Authorization': 'Bearer ' + auth
|
||||||
|
, 'Content-Type': 'application/json;charset=UTF-8'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
).then(function (resp) {
|
||||||
|
return resp.json().then(function (data) {
|
||||||
|
var zone;
|
||||||
|
if (data.error) {
|
||||||
|
console.error(data);
|
||||||
|
window.alert(data.error.message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.log('zone undo data:');
|
||||||
|
console.log(data);
|
||||||
|
zone = cache.recordsMap[zoneId];
|
||||||
|
delete cache.recordsMap[zoneId];
|
||||||
|
function removeRecord(r, i) {
|
||||||
|
if (r.zone === zone.name) {
|
||||||
|
cache.records.splice(i, 1);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (cache.records.some(removeRecord)) { continue; }
|
||||||
|
|
||||||
|
renderZones();
|
||||||
|
renderRecords();
|
||||||
|
console.log('result:', data);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
$on('button.js-zone-view', 'click', function (ev) {
|
$on('button.js-zone-view', 'click', function (ev) {
|
||||||
var zone = ev.target.parentElement.dataset.name;
|
var zone = ev.target.parentElement.dataset.name;
|
||||||
myZone = zone;
|
myZone = zone;
|
||||||
|
|
|
@ -73,47 +73,6 @@ module.exports.create = function (opts) {
|
||||||
db.save._pending = [];
|
db.save._pending = [];
|
||||||
|
|
||||||
engine.primaryNameservers = db.primaryNameservers;
|
engine.primaryNameservers = db.primaryNameservers;
|
||||||
engine.zoneToSoa = function (domain) {
|
|
||||||
var nameservers = domain.vanityNs || engine.primaryNameservers.map(function (n) { return n.name; });
|
|
||||||
|
|
||||||
var index = Math.floor(Math.random() * nameservers.length) % nameservers.length;
|
|
||||||
var nameserver = nameservers[index];
|
|
||||||
return {
|
|
||||||
id: domain.id
|
|
||||||
, name: domain.name
|
|
||||||
, typeName: 'SOA'
|
|
||||||
, className: 'IN'
|
|
||||||
, ttl: domain.ttl || 60
|
|
||||||
|
|
||||||
// nameserver -- select an NS at random if they're all in sync
|
|
||||||
, primary: nameserver
|
|
||||||
, name_server: nameserver
|
|
||||||
|
|
||||||
// admin -- email address or domain for admin
|
|
||||||
, admin: domain.admin || ('admin.' + domain.name)
|
|
||||||
, email_addr: domain.admin || ('admin.' + domain.name)
|
|
||||||
|
|
||||||
// serial -- the version, for cache-busting of secondary nameservers. suggested format: YYYYMMDDnn
|
|
||||||
, serial: domain.serial || engine.zones._dateToSerial(domain.updatedAt || domain.createdAt || Date.now())
|
|
||||||
, sn: domain.serial || engine.zones._dateToSerial(domain.updatedAt || domain.createdAt || Date.now())
|
|
||||||
|
|
||||||
// refresh -- only used when nameservers following the DNS NOTIFY spec talk
|
|
||||||
, refresh: domain.refresh || 1800
|
|
||||||
, ref: domain.refresh || 1800
|
|
||||||
|
|
||||||
// retry -- only used when nameservers following the DNS NOTIFY spec talk
|
|
||||||
, retry: domain.retry || 600
|
|
||||||
, ret: domain.retry || 600
|
|
||||||
|
|
||||||
// expiration -- how long other nameservers should continue when the primary goes down
|
|
||||||
, expiration: domain.expiration || 2419200 // 4 weeks
|
|
||||||
, ex: domain.expiration || 2419200 // 4 weeks
|
|
||||||
|
|
||||||
// minimum -- how long to cache a non-existent domain (also the default ttl for BIND)
|
|
||||||
, minimum: domain.minimum || 5
|
|
||||||
, nx: domain.minimum || 5
|
|
||||||
};
|
|
||||||
};
|
|
||||||
engine.peers = {
|
engine.peers = {
|
||||||
all: function (cb) {
|
all: function (cb) {
|
||||||
var dns = require('dns');
|
var dns = require('dns');
|
||||||
|
@ -146,6 +105,47 @@ module.exports.create = function (opts) {
|
||||||
// epoch in seconds will do
|
// epoch in seconds will do
|
||||||
return parseInt(Math.round(date/1000).toString().slice(-10), 10);
|
return parseInt(Math.round(date/1000).toString().slice(-10), 10);
|
||||||
}
|
}
|
||||||
|
, _toSoa: function (domain) {
|
||||||
|
var nameservers = domain.vanityNs || engine.primaryNameservers.map(function (n) { return n.name; });
|
||||||
|
|
||||||
|
var index = Math.floor(Math.random() * nameservers.length) % nameservers.length;
|
||||||
|
var nameserver = nameservers[index];
|
||||||
|
return {
|
||||||
|
id: domain.id
|
||||||
|
, name: domain.name
|
||||||
|
, typeName: 'SOA'
|
||||||
|
, className: 'IN'
|
||||||
|
, ttl: domain.ttl || 60
|
||||||
|
|
||||||
|
// nameserver -- select an NS at random if they're all in sync
|
||||||
|
, primary: nameserver
|
||||||
|
, name_server: nameserver
|
||||||
|
|
||||||
|
// admin -- email address or domain for admin
|
||||||
|
, admin: domain.admin || ('admin.' + domain.name)
|
||||||
|
, email_addr: domain.admin || ('admin.' + domain.name)
|
||||||
|
|
||||||
|
// serial -- the version, for cache-busting of secondary nameservers. suggested format: YYYYMMDDnn
|
||||||
|
, serial: domain.serial || engine.zones._dateToSerial(domain.updatedAt || domain.createdAt || Date.now())
|
||||||
|
, sn: domain.serial || engine.zones._dateToSerial(domain.updatedAt || domain.createdAt || Date.now())
|
||||||
|
|
||||||
|
// refresh -- only used when nameservers following the DNS NOTIFY spec talk
|
||||||
|
, refresh: domain.refresh || 1800
|
||||||
|
, ref: domain.refresh || 1800
|
||||||
|
|
||||||
|
// retry -- only used when nameservers following the DNS NOTIFY spec talk
|
||||||
|
, retry: domain.retry || 600
|
||||||
|
, ret: domain.retry || 600
|
||||||
|
|
||||||
|
// expiration -- how long other nameservers should continue when the primary goes down
|
||||||
|
, expiration: domain.expiration || 2419200 // 4 weeks
|
||||||
|
, ex: domain.expiration || 2419200 // 4 weeks
|
||||||
|
|
||||||
|
// minimum -- how long to cache a non-existent domain (also the default ttl for BIND)
|
||||||
|
, minimum: domain.minimum || 5
|
||||||
|
, nx: domain.minimum || 5
|
||||||
|
};
|
||||||
|
}
|
||||||
, all: function (cb) {
|
, all: function (cb) {
|
||||||
process.nextTick(function () {
|
process.nextTick(function () {
|
||||||
cb(null, db.zones.slice(0).filter(notDeleted));
|
cb(null, db.zones.slice(0).filter(notDeleted));
|
||||||
|
@ -307,11 +307,41 @@ module.exports.create = function (opts) {
|
||||||
db.records.push(ns);
|
db.records.push(ns);
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log('saving...');
|
console.log('[zone] [create] saving...');
|
||||||
db.save(function (err) {
|
db.save(function (err) {
|
||||||
cb(err, !err && newZone || null);
|
cb(err, !err && newZone || null);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
, destroy: function (zoneId, cb) {
|
||||||
|
var zone;
|
||||||
|
var records;
|
||||||
|
db.zones.filter(notDeleted).some(function (z) {
|
||||||
|
if (zoneId === z.id) {
|
||||||
|
zone = z;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!zone) {
|
||||||
|
process.nextTick(function () {
|
||||||
|
cb(null, null);
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
records = [];
|
||||||
|
db.records.filter(notDeleted).forEach(function (r) {
|
||||||
|
if (zone.name === r.zone) {
|
||||||
|
records.push(r);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('[zone] [destroy] saving...');
|
||||||
|
db.save(function (err) {
|
||||||
|
zone.records = records;
|
||||||
|
cb(err, !err && zone || null);
|
||||||
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
engine.records = {
|
engine.records = {
|
||||||
all: function (cb) {
|
all: function (cb) {
|
||||||
|
|
Loading…
Reference in New Issue