diff --git a/bin/digd.js b/bin/digd.js index 4143653..8c90a2d 100644 --- a/bin/digd.js +++ b/bin/digd.js @@ -169,6 +169,106 @@ cli.main(function (args, cli) { }); } + function recurse() { + if (!query.header.rd) { + console.log("[Could not answer. Sent empty response.]"); + sendEmptyResponse(query); + return; + } + + if (cli.norecurse) { + console.log("[Could not answer. Sent empty response.]"); + sendEmptyResponse(query); + return; + } + + // ANY, A, AAAA, CNAME, MX, NAPTR, NS, PTR, SOA, SRV, TXT + newQuery = { + header: { + id: query.header.id // require('crypto').randomBytes(2).readUInt16BE(0) + , qr: 0 + , opcode: 0 + , aa: query.header.aa ? 1 : 0 // NA? not sure what this would do + , tc: 0 // NA + , rd: 1 + , ra: 0 // NA + , rcode: 0 // NA + } + , question: [] + , answer: [] + , authority: [] + , additional: [] + }; + query.question.forEach(function (q) { + newQuery.question.push({ + name: q.name + , type: q.type + , typeName: q.typeName + , class: q.class + , className: q.className + }); + + function updateCount() { + count -= 1; + if (!count) { + server.send(dnsjs.DNSPacket.write(newQuery), rinfo.port, rinfo.address, function () { + console.log('[DEV] response sent'); + }); + } + } + + var opts = { + onError: function () { + updateCount(); + } + , onMessage: function (packet) { + + (packet.answer||[]).forEach(function (a) { + // TODO copy each relevant property + console.log('ans', a); + newQuery.answer.push(a); + }); + (packet.authority||[]).forEach(function (a) { + // TODO copy each relevant property + console.log('auth', a); + newQuery.authority.push(a); + }); + (packet.additional||[]).forEach(function (a) { + // TODO copy each relevant property + console.log('add', a); + newQuery.additional.push(a); + }); + + updateCount(); + + } + , onListening: function () {} + , onSent: function (res) { + if (cli.debug) { + console.log(''); + console.log('request sent to', res.nameserver); + } + } + , onTimeout: function (res) { + console.log(";; [" + q.name + "] connection timed out; no servers could be reached"); + console.log(";; [timed out after " + res.timeout + "ms and 1 tries]"); + } + , onClose: function () { + console.log(''); + } + , mdns: cli.mdns + , nameserver: cli.nameserver + , port: cli.port + , timeout: cli.timeout + }; + + //dig.resolve(queryAb, opts); + dig.resolveJson(query, opts); + + console.log(';' + q.name + '.', ' ', q.className, q.typeName); + }); + } + count = query.question.length; if (!count) { sendEmptyResponse(query); @@ -176,107 +276,8 @@ cli.main(function (args, cli) { } // TODO get local answer first, if available + recurse(); - if (query.header.rd) { - if (cli.norecurse) { - console.log("[Could not answer. Sent empty response.]"); - sendEmptyResponse(query); - return; - } else { - // ANY, A, AAAA, CNAME, MX, NAPTR, NS, PTR, SOA, SRV, TXT - newQuery = { - header: { - id: query.header.id // require('crypto').randomBytes(2).readUInt16BE(0) - , qr: 0 - , opcode: 0 - , aa: query.header.aa ? 1 : 0 // NA? not sure what this would do - , tc: 0 // NA - , rd: 1 - , ra: 0 // NA - , rcode: 0 // NA - } - , question: [ - /* - { name: cli.query - , typeName: cli.type - , className: cli.class - } - */ - ] - , answer: [] - , authority: [] - , additional: [] - }; - query.question.forEach(function (q) { - newQuery.question.push({ - name: q.name - , type: q.type - , typeName: q.typeName - , class: q.class - , className: q.className - }); - - function updateCount() { - count -= 1; - if (!count) { - server.send(dnsjs.DNSPacket.write(newQuery), rinfo.port, rinfo.address, function () { - console.log('[DEV] response sent'); - }); - } - } - - var opts = { - onError: function () { - updateCount(); - } - , onMessage: function (packet) { - - (packet.answer||[]).forEach(function (a) { - // TODO copy each relevant property - console.log('ans', a); - newQuery.answer.push(a); - }); - (packet.authority||[]).forEach(function (a) { - // TODO copy each relevant property - console.log('auth', a); - newQuery.authority.push(a); - }); - (packet.additional||[]).forEach(function (a) { - // TODO copy each relevant property - console.log('add', a); - newQuery.additional.push(a); - }); - - updateCount(); - - } - , onListening: function () {} - , onSent: function (res) { - if (cli.debug) { - console.log(''); - console.log('request sent to', res.nameserver); - } - } - , onTimeout: function (res) { - console.log(";; [" + q.name + "] connection timed out; no servers could be reached"); - console.log(";; [timed out after " + res.timeout + "ms and 1 tries]"); - } - , onClose: function () { - console.log(''); - } - , mdns: cli.mdns - , nameserver: cli.nameserver - , port: cli.port - , timeout: cli.timeout - }; - - //dig.resolve(queryAb, opts); - dig.resolveJson(query, opts); - - console.log(';' + q.name + '.', ' ', q.className, q.typeName); - }); - } - } }; handlers.onListening = function () { @@ -305,7 +306,7 @@ cli.main(function (args, cli) { console.log(''); if (!cli.nocmd) { - console.log('; <<>> dig.js ' + 'v0.0.0' + ' <<>> ' + process.argv.slice(2)); + console.log('; <<>> digd.js ' + 'v0.0.0' + ' <<>> ' + process.argv.slice(2)); console.log(';; global options: +cmd'); }