| 
									
										
										
										
											2017-09-27 17:29:27 -06:00
										 |  |  | #!/usr/bin/env node
 | 
					
						
							| 
									
										
										
										
											2017-09-26 18:26:20 -06:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // EXAMPLE:
 | 
					
						
							|  |  |  | // node bin/dns-parse.js samples/a-0.mdns.bin
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var path = require('path'); | 
					
						
							|  |  |  | // pass a terminal arg
 | 
					
						
							|  |  |  | var filename = process.argv[2]; | 
					
						
							|  |  |  | var outname = process.argv[3]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (!filename || /(-h)|(--help)/.test(process.argv.join(' '))) { | 
					
						
							|  |  |  |   console.error(""); | 
					
						
							|  |  |  |   console.error("Accepts a DNS packet (binary or json), converts it, and then converts it back to verify the function of the parser and packer"); | 
					
						
							|  |  |  |   console.error(""); | 
					
						
							| 
									
										
										
										
											2017-09-27 17:29:27 -06:00
										 |  |  |   console.error("Usage: node bin/dns-test.js <path/to/sample.json|.bin> <path/to/sample.bin|.json>"); | 
					
						
							|  |  |  |   console.error("Example: node bin/dns-test.js ./samples/services-0.mdns.json ./samples/services-0.mdns.bin"); | 
					
						
							| 
									
										
										
										
											2017-09-26 18:26:20 -06:00
										 |  |  |   process.exit(1); | 
					
						
							|  |  |  |   return; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var PromiseA = require('bluebird'); | 
					
						
							|  |  |  | var fs = PromiseA.promisifyAll(require('fs')); | 
					
						
							|  |  |  | var dnsjs = require('../').DNSPacket; | 
					
						
							|  |  |  | var extname = path.extname(filename).substr(1).toLowerCase(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if ('json' !== extname && 'bin' !== extname) { | 
					
						
							|  |  |  |   console.error("The file extension must end in .json or .bin (raw DNS packet)"); | 
					
						
							|  |  |  |   process.exit(3); | 
					
						
							|  |  |  |   return; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var hexdump = require('hexdump.js').hexdump; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function testJsonAsync(nb) { | 
					
						
							|  |  |  |   var packet = dnsjs.write(JSON.parse(nb.toString('ascii'))); | 
					
						
							|  |  |  |   var str = hexdump(packet); | 
					
						
							| 
									
										
										
										
											2017-09-28 13:13:18 -06:00
										 |  |  |   console.info(str); | 
					
						
							| 
									
										
										
										
											2017-09-26 18:26:20 -06:00
										 |  |  |   var json = dnsjs.parse(packet); | 
					
						
							|  |  |  |   if (json.error) { | 
					
						
							|  |  |  |     console.error(json); | 
					
						
							|  |  |  |     process.exit(37); | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-28 13:13:18 -06:00
										 |  |  |   console.info("[OK] JSON -> binary -> JSON"); | 
					
						
							| 
									
										
										
										
											2017-09-27 17:29:27 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (!outname) { | 
					
						
							|  |  |  |     console.warn(''); | 
					
						
							|  |  |  |     console.warn( | 
					
						
							|  |  |  |       "Usage: node bin/dns-test.js '" + filename + "' './" + path.basename(filename).replace(path.extname(filename), '.bin') + "'" | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |     console.warn(''); | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-28 13:13:18 -06:00
										 |  |  |   fs.writeFileSync(outname, packet, null); | 
					
						
							| 
									
										
										
										
											2017-09-26 18:26:20 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function testBinAsync(nb) { | 
					
						
							|  |  |  |   var bin = nb.buffer.slice(nb.byteOffset, nb.byteOffset + nb.byteLength); | 
					
						
							|  |  |  |   var json = dnsjs.parse(bin); | 
					
						
							|  |  |  |   if (json.error) { | 
					
						
							|  |  |  |     console.error(json); | 
					
						
							|  |  |  |     process.exit(38); | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-09-27 14:40:51 -06:00
										 |  |  |   var bin2 = dnsjs.write(json); | 
					
						
							| 
									
										
										
										
											2017-09-28 13:13:18 -06:00
										 |  |  |   //var debugname = outname || path.basename(filename);
 | 
					
						
							|  |  |  |   //fs.writeFileSync(debugname.replace(path.extname(debugname), '.bin'), bin2, null);
 | 
					
						
							| 
									
										
										
										
											2017-09-27 14:40:51 -06:00
										 |  |  |   var json2 = dnsjs.parse(bin2); | 
					
						
							| 
									
										
										
										
											2017-09-26 18:26:20 -06:00
										 |  |  |   if (json2.error) { | 
					
						
							|  |  |  |     console.error(json2); | 
					
						
							|  |  |  |     process.exit(37); | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var assert = require('assert'); | 
					
						
							| 
									
										
										
										
											2017-09-27 14:40:51 -06:00
										 |  |  |   // EXPLANATION:
 | 
					
						
							|  |  |  |   // The strategy used for compression pointers has not yet been proven
 | 
					
						
							|  |  |  |   // as deterministic... and we don't implement them anyway, so this may not be the same
 | 
					
						
							|  |  |  |   json = JSON.parse(JSON.stringify(json) | 
					
						
							|  |  |  |     .replace(/,"labels":.*?\]/, '') | 
					
						
							|  |  |  |     .replace(/,"cpcount":\d+/, '') | 
					
						
							|  |  |  |   ); | 
					
						
							|  |  |  |   json2 = JSON.parse(JSON.stringify(json2) | 
					
						
							|  |  |  |     .replace(/,"labels":.*?\]/, '') | 
					
						
							|  |  |  |     .replace(/,"cpcount":\d+/, '') | 
					
						
							|  |  |  |   ); | 
					
						
							|  |  |  |   //json2 = JSON.parse(JSON.stringify(json2));
 | 
					
						
							| 
									
										
										
										
											2017-09-28 13:13:18 -06:00
										 |  |  |   try { | 
					
						
							|  |  |  |     assert.deepEqual(json, json2); | 
					
						
							|  |  |  |   } catch(e) { | 
					
						
							|  |  |  |     console.error(''); | 
					
						
							|  |  |  |     console.error('Original'); | 
					
						
							|  |  |  |     console.error(JSON.stringify(json, null, 2)); | 
					
						
							|  |  |  |     console.error(''); | 
					
						
							|  |  |  |     console.error('Converted'); | 
					
						
							|  |  |  |     console.error(JSON.stringify(json2, null, 2)); | 
					
						
							|  |  |  |     console.error(''); | 
					
						
							|  |  |  |     process.exit(422); | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-09-26 18:26:20 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-28 13:13:18 -06:00
										 |  |  |   console.info("[OK] binary -> JSON -> binary -> JSON"); | 
					
						
							|  |  |  |   console.warn("(compression pointer support needs to be improved in order to support direct bin -> JSON -> bin testing)"); | 
					
						
							| 
									
										
										
										
											2017-09-27 17:29:27 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (!outname) { | 
					
						
							|  |  |  |     console.warn(''); | 
					
						
							|  |  |  |     console.warn( | 
					
						
							|  |  |  |       "Usage: node bin/dns-test.js '" + filename + "' './" + path.basename(filename).replace(path.extname(filename), '.json') + "'" | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |     console.warn(''); | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-28 13:13:18 -06:00
										 |  |  |   fs.writeFileSync(outname, JSON.stringify(json, null, 2), null); | 
					
						
							| 
									
										
										
										
											2017-09-26 18:26:20 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if ('json' === extname) { | 
					
						
							|  |  |  |   return fs.readFileAsync(filename, null).then(testJsonAsync); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if ('bin' === extname) { | 
					
						
							|  |  |  |   return fs.readFileAsync(filename, null).then(testBinAsync); | 
					
						
							|  |  |  | } |