forked from zk1132/node-ddns
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
126 lines (108 loc) · 4.05 KB
/
index.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
115
116
117
118
119
120
121
122
123
124
125
126
'use strict';
var PromiseA = require('bluebird');
var path = require('path');
var app = require('express')();
var RSA = PromiseA.promisifyAll(require('rsa-compat').RSA);
var ndns = require('native-dns');
var serveStatic = require('serve-static');
var jsonParser = require('body-parser').json;
var defaults = {
dnsPort: 53
, dnsTcpPort: 53
, httpPort: 80
, httpsPort: 443
, filepath: path.join(require('os').homedir(), '.ddnsd.sqlite3')
, prefix: '/api/com.daplie.ddns'
, primaryNameserver: 'ns1.example.com'
, nameservers: [
{ name: 'ns1.example.com', ipv4: '192.168.1.101' }
//, { name: 'ns2.example.com', ipv4: '192.168.1.102' }
]
//, quikPort: 443
};
module.exports.create = function (opts) {
var privkeyPath = path.join(__dirname, 'privkey.pem');
RSA.getKeypairAsync = function (filepath, bitlen, exp, options) {
var PromiseA = require('bluebird');
var fs = PromiseA.promisifyAll(require('fs'));
return fs.readFileAsync(filepath, 'ascii').then(function (pem) {
return RSA.import({ privateKeyPem: pem }, options);
}, function (/*err*/) {
return RSA.generateKeypairAsync(bitlen, exp, options, function (err, keypair) {
return fs.writeFileAsync(filepath, keypair.privateKeyPem, 'ascii').then(function () {
return keypair;
});
});
});
};
var bitlen = 2048;
var exp = 65537;
var options = { public: true, pem: true, internal: true };
var port = opts.dnsPort;
var address4 = '0.0.0.0';
return {
listen: function () {
var checkip = require('check-ip-address');
var service = 'https://api.ipify.org'; // default
//var service = 'https://coolaj86.com/services/whatsmyip'; // another option
//
return checkip.getExternalIp(service).then(function (ip) {
if (!ip) {
console.warn('');
console.warn('');
console.warn(require('os').networkInterfaces());
console.warn('');
throw new Error('no public ip address is available to listen on');
}
defaults.nameservers[0].name = opts.primaryNameserver;
defaults.nameservers[0].ipv4 = ip;
return RSA.getKeypairAsync(privkeyPath, bitlen, exp, options).then(function (keypair) {
require('ddns-rest/store').create({
filepath: opts.filepath
}).then(function (store) {
app.use('/api', jsonParser());
require('ddns-rest').create({
keypair: { publicKeyPem: RSA.exportPublicPem(keypair) }
, store: store
, prefix: opts.prefix
, app: app
});
app.use('/', serveStatic(require('ddns-webapp').path));
var plainPort = opts.httpPort;
require('http').createServer(app).listen(plainPort, function () {
console.info('Daplie DDNS RESTful API listening on port', plainPort);
});
var getAnswerList = require('ddns-nameserver/query').create({
store: store
}).getAnswerList;
var ns = require('ddns-nameserver').create({
store: store
, primaryNameserver: opts.primaryNameserver
, nameservers: opts.nameservers
, getAnswerList: getAnswerList
});
var udpDns = ndns.createServer();
var tcpDns = ndns.createTCPServer();
udpDns.on('error', ns.onError);
udpDns.on('socketError', ns.onSocketError);
udpDns.on('request', ns.onRequest);
udpDns.on('listening', function () {
console.info('DNS Server running on udp port', port);
});
udpDns.serve(port, address4);
tcpDns.on('error', ns.onError);
tcpDns.on('socketError', ns.onSocketError);
tcpDns.on('request', ns.onRequest);
tcpDns.on('listening', function () {
console.info('DNS Server running on tcp port', port);
});
tcpDns.serve(port, address4);
});
});
});
}
};
};
if (require.main === module) {
module.exports.create(defaults).listen();
}