-
Notifications
You must be signed in to change notification settings - Fork 0
/
updns.js
114 lines (101 loc) · 3.76 KB
/
updns.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
var dnsd = require('dnsd');
var named = require('node-named');
var server = dnsd.createServer(requestHandler);
var records = require('./records.json');
server.listen(records.listenPort, records.listenAddress);
console.log('Server running at '+records.listenAddress+':'+records.listenPort);
var CheckedRecord = require('./recordchecker.js');
var Ping = require('./checkers/ping.js');
var OpenPort = require('./checkers/openport.js');
var URLRequest = require('./checkers/urlrequest.js');
function requestHandler(req, res) {
var question = res.question[0]
, hostname = question.name
, length = hostname.length
, ttl = Math.floor(Math.random() * 3600);
console.log('DNS Query: %s', req)
var target = getRecord(req);
try {
//server.send(query);
console.log("Responding with: " + target.target);
res.end(target.target);
} catch (ex) {
console.log(ex);
}
}
function setupRecordCheckers() {
for (var domainName in records.domains) {
var domain = records.domains[domainName];
for (var recordTypeName in domain.records) {
if (recordTypeName == "A") {
var recordType = domain.records[recordTypeName];
var checkerType = recordType.checker.type;
var checkerFrequency = recordType.checker.frequency;
recordType.checkedRecords = [];
for (var recordIndex in recordType.values) {
var record = recordType.values[recordIndex];
switch (checkerType) {
case 'ping':
var checkedRecord = new CheckedRecord(getRecordType(recordTypeName, record), new Ping(record, recordType.checker));
recordType.checkedRecords.push(checkedRecord);
break;
case 'openport':
var checkedRecord = new CheckedRecord(getRecordType(recordTypeName, record), new OpenPort(record, recordType.checker));
recordType.checkedRecords.push(checkedRecord);
break;
case 'urlrequest':
var checkedRecord = new CheckedRecord(getRecordType(recordTypeName, record), new URLRequest(record, recordType.checker));
recordType.checkedRecords.push(checkedRecord);
break;
}
}
}
}
}
}
function getRecordType(recordType, record) {
switch (recordType) {
case 'A':
return new named.ARecord(record);
}
}
function getRecord(query) {
var domain = query.question[0].name;
var type = query.question[0].type;
console.log("Finding: " + type + " records for domain: " + domain);
var allRecordsForDomainAndType = records.domains[domain].records[type].checkedRecords;
var checkedRecordsForFomain = allRecordsForDomainAndType.filter(function(item) {
var checkResult = item.checkRecord();
return checkResult;
});
var sortedCheckedRecordsForDomain = checkedRecordsForFomain.sort(function(rec1, rec2) {
if (rec1.getLoad() < rec2.getLoad()) {
return -1;
}
if (rec1.getLoad() == rec2.getLoad()) {
return 0;
}
return 1;
});
if (sortedCheckedRecordsForDomain.length > 0) {
var target = sortedCheckedRecordsForDomain[0];
target.incrementLoad();
for (var i = 0; i < sortedCheckedRecordsForDomain.length; i++) {
if (sortedCheckedRecordsForDomain[i] != target) {
sortedCheckedRecordsForDomain[i].decrementLoad();
}
}
var record = target.getRecord();
return record;
}
return null;
}
setupRecordCheckers();
/*
if (!records['example.com']) {
records['example.com'] = [];
}
records['example.com'].push(new CheckedRecord(new named.ARecord('192.168.0.1'), new Ping('192.168.0.1')));
records['example.com'].push(new CheckedRecord(new named.ARecord('192.168.0.2'), new Ping('192.168.0.2')));
records['example.com'].push(new CheckedRecord(new named.ARecord('192.168.0.197'), new Ping('192.168.0.197')));
*/