├── .gitignore ├── README.md ├── package.json └── server.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Install 2 | 3 | DNS Server that translates requests from english to estonian (mountain -> mägi) 4 | 5 | npm install dnsdict 6 | 7 | ### Run 8 | 9 | sudo npm start dnsdict 10 | 11 | Dig a word 12 | 13 | dig mountain @localhost 14 | 15 | Response 16 | 17 | mountain 60 IN TXT m"agi -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dnsdict", 3 | "description": "DNS English to Estonian service", 4 | "version": "0.1.0", 5 | "author" : "Andris Reinman", 6 | "scripts":{ 7 | "start": "node server.js" 8 | }, 9 | "dependencies": { 10 | "ndns": "https://github.com/andris9/ndns/tarball/master", 11 | "iconv": "*" 12 | } 13 | } -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | var fs = require("fs"), 2 | ndns = require('ndns'), 3 | server = ndns.createServer('udp4'), 4 | punycode = require("punycode"), 5 | Iconv = require('iconv').Iconv, 6 | iconv = new Iconv('UTF-8', 'ASCII//IGNORE//TRANSLIT'); 7 | 8 | /* 9 | * Funktsioon laeb tekstifailist sõnaraamatu ja salvestab selle 10 | * muutujasse kujul {"word(en)": "translation(et)"}. 11 | * 12 | * Sisendiks failinimi ja callback funktsioon 13 | */ 14 | function loadDictionary(file, callback){ 15 | var dict = {}; 16 | 17 | fs.readFile(file, "utf-8", function(error, text){ 18 | 19 | if(error){ 20 | return callback(error); 21 | } 22 | 23 | // lõika fail ridadeks ja käivita forEach kõikide ridade kohta 24 | text.split(/\r?\n/).forEach(function(line){ 25 | 26 | // lõika rida \t kohalt pooleks - esimene pool on en, ülejäänud et 27 | var parts = line.split("\t"), 28 | en = parts.shift().toLowerCase().trim(), 29 | et = parts.join(" ").trim(); 30 | 31 | // juhul kui nii en kui et osa olemas, salvesta muutujasse 32 | if(en && et){ 33 | dict[en] = et; 34 | } 35 | }); 36 | 37 | // järgmisel vabal hetkel käivita callback 38 | process.nextTick(callback.bind(this, null, dict)); 39 | }); 40 | } 41 | 42 | /* 43 | * Funktsioon vastab DNS päringutele 44 | * 45 | * Sisendiks sõnaraamatu objekt, DNS päringu küsimus- ja vastusobjektid 46 | */ 47 | function DNSServerResponse(dict, req, res){ 48 | 49 | // Seab DNS vastuse päise 50 | res.setHeader(req.header); 51 | res.header.qr = 1; // Question/Response 52 | res.header.aa = 1; // Authorative Answer 53 | res.header.rd = 0; // Recursion Desired 54 | 55 | var question, 56 | translation; 57 | 58 | // töötle ükshaaval saabunud küsimused (peaks küll olema vaid 1) 59 | for (var i = 0; i < req.q.length; i++){ 60 | res.addQuestion(req.q[i]); // Lisa kirje küsimuste sektsiooni 61 | 62 | // vorminda küsimus (punycode->unicode jne) 63 | question = punycode.toUnicode(req.q[i].name.toLowerCase().trim()); 64 | 65 | // lae sõnaraamatu objektist tõlge 66 | translation = dict[question] || ""; 67 | 68 | // väljasta tulemus konsoolile 69 | console.log(question+" -> "+translation); 70 | 71 | // kui tõlge on olemas, lisa vastuskirje 72 | if(translation){ 73 | res.addRR( 74 | punycode.toASCII(question), // name 75 | 60, // TTL 76 | "IN", // CLASS 77 | "TXT", // TYPE 78 | iconv.convert(translation).toString("ASCII") // response 79 | ); 80 | res.header.ancount++; // Vastuse sektsiooni kaunter 81 | } 82 | } 83 | 84 | // saada päringu vastus 85 | res.send(); 86 | } 87 | 88 | /* 89 | * Käivitab DNS serveri 90 | * 91 | * Sisendiks sõnaraamatu objekt 92 | */ 93 | function startDNSServer(dict){ 94 | // DNS päringu puhul käivitab DNSServerResponse funktsiooni 95 | // ja seab selle esimeseks parameetriks dict objekti 96 | server.on("request", DNSServerResponse.bind(this, dict)); 97 | // server hakkab kuulama UDP porti 53 98 | server.bind(53); 99 | console.log("Listening on UDP port 53") 100 | } 101 | 102 | // Skript loeb sisse sõnaraamatu ja käivitab DNS serveri 103 | loadDictionary(__dirname + "/en_et.txt", function(error, dict){ 104 | if(error){ 105 | throw error; 106 | } 107 | startDNSServer(dict); 108 | }); 109 | --------------------------------------------------------------------------------