Skip to content

Commit

Permalink
node: rpc dumpzone
Browse files Browse the repository at this point in the history
Co-authored-by: James Stevens <github@jrcs.net>
Co-authored-by: Mark Tyneway <mark.tyneway@gmail.com>
  • Loading branch information
3 people committed Jan 8, 2021
1 parent a1409dc commit 77f314e
Showing 1 changed file with 67 additions and 0 deletions.
67 changes: 67 additions & 0 deletions lib/node/rpc.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@

'use strict';

const constants = require('bns/lib/constants');
const {types} = constants;
const fs = require('fs');
const bns = require('bns');
const assert = require('bsert');
const bweb = require('bweb');
const {Lock} = require('bmutex');
Expand Down Expand Up @@ -246,6 +250,7 @@ class RPC extends RPCBase {
this.add('validateresource', this.validateResource);

this.add('resetrootcache', this.resetRootCache);
this.add('dumpzone', this.dumpzone);

// Compat
// this.add('getnameinfo', this.getNameInfo);
Expand Down Expand Up @@ -2533,6 +2538,68 @@ class RPC extends RPCBase {
return null;
}

async dumpzone(args, help) {
if (help || args.length !== 1)
throw new RPCError(errs.MISC_ERROR, 'dumpzone <filename>');

const valid = new Validator(args);
const filename = valid.str(0, null);
if (filename == null)
throw new RPCError(errs.MISC_ERROR, 'dumpzone <filename>');

const tmp = filename + '~';
this.logger.debug(`dumping root zone to file: ${filename}`);

let fd = null;
let fileErr = null;
fd = fs.createWriteStream(tmp, { flags: 'a+' });
fd.on('error', (err) => {
fd.end();
fd = null;
fileErr = err;
});

const tree = this.chain.db.tree;
const iter = tree.iterator(true);

let count = 0;
while ((await iter.next()) && (fd != null)) {
count++;
if (count % 10000 === 0)
this.logger.debug('dumpzone names processed: %d', count);

if (fd == null)
break;

const {value} = iter;
const ns = NameState.decode(value);

if (ns.data.length <= 0)
continue;

const fqdn = bns.util.fqdn(ns.name.toString('ascii'));
const resource = Resource.decode(ns.data);
const zone = resource.toZone(fqdn);
for (const record of zone) {
if (fd == null)
break;

if (record.type !== types.RRSIG)
fd.write(record.toString() + '\n');
}
}

if (fd == null)
return fileErr;

fd.end();
fs.renameSync(tmp, filename);

this.logger.debug('root zone dump complete. Total names: %d', count);

return filename;
}

/*
* Helpers
*/
Expand Down

0 comments on commit 77f314e

Please sign in to comment.