fcdns 0.5.9 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +267 -0
- package/README.md +8 -8
- package/lib/cli.js +113 -0
- package/lib/cli.js.map +1 -0
- package/lib/dao/clear.js +8 -0
- package/lib/dao/clear.js.map +1 -0
- package/lib/dao/get-poison-test-result.js +18 -0
- package/lib/dao/get-poison-test-result.js.map +1 -0
- package/lib/dao/get-route-result.js +19 -0
- package/lib/dao/get-route-result.js.map +1 -0
- package/lib/dao/upsert-poison-test-result.js +14 -0
- package/lib/dao/upsert-poison-test-result.js.map +1 -0
- package/lib/dao/upsert-route-result.js +14 -0
- package/lib/dao/upsert-route-result.js.map +1 -0
- package/lib/database.js +44 -0
- package/lib/database.js.map +1 -0
- package/lib/hostnames.js +25 -0
- package/lib/hostnames.js.map +1 -0
- package/lib/ip-ranges.js +77 -0
- package/lib/ip-ranges.js.map +1 -0
- package/lib/poison-tester.js +55 -0
- package/lib/poison-tester.js.map +1 -0
- package/lib/record-types.js +77 -0
- package/lib/record-types.js.map +1 -0
- package/lib/router.js +63 -0
- package/lib/router.js.map +1 -0
- package/lib/server.js +84 -0
- package/lib/server.js.map +1 -0
- package/lib/utils/create-dns-resolver.js +7 -0
- package/lib/utils/create-dns-resolver.js.map +1 -0
- package/lib/utils/hostname-pattern.js +11 -0
- package/lib/utils/hostname-pattern.js.map +1 -0
- package/lib/utils/is-ipv4-address.js +4 -0
- package/lib/utils/is-ipv4-address.js.map +1 -0
- package/lib/utils/is-ipv6-address.js +4 -0
- package/lib/utils/is-ipv6-address.js.map +1 -0
- package/lib/utils/is-server-online.js +21 -0
- package/lib/utils/is-server-online.js.map +1 -0
- package/lib/utils/package.js +16 -0
- package/lib/utils/package.js.map +1 -0
- package/lib/utils/parse-server-info.js +8 -0
- package/lib/utils/parse-server-info.js.map +1 -0
- package/lib/utils/resolve-a.js +14 -0
- package/lib/utils/resolve-a.js.map +1 -0
- package/package.json +52 -45
- package/dist/cli.cjs +0 -48308
package/lib/ip-ranges.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { IPv4AddressRange, IPv6AddressRange } from 'address-range';
|
|
2
|
+
import { isIPv4Address } from "./utils/is-ipv4-address.js";
|
|
3
|
+
import { isIPv6Address } from "./utils/is-ipv6-address.js";
|
|
4
|
+
import { promises as fs } from 'fs';
|
|
5
|
+
import { groupBy } from 'iterable-operator';
|
|
6
|
+
export class IPRanges {
|
|
7
|
+
constructor(...args) {
|
|
8
|
+
if (args.length === 1) {
|
|
9
|
+
const [ranges] = args;
|
|
10
|
+
const groups = groupBy(ranges, element => {
|
|
11
|
+
if (element instanceof IPv4AddressRange) {
|
|
12
|
+
return 'ipv4';
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
return 'ipv6';
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
this.ipv4 = groups.get('ipv4');
|
|
19
|
+
this.ipv6 = groups.get('ipv6');
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
const [ipv4, ipv6] = args;
|
|
23
|
+
this.ipv4 = ipv4;
|
|
24
|
+
this.ipv6 = ipv6;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
static async fromFile(filename) {
|
|
28
|
+
const ipv4 = [];
|
|
29
|
+
const ipv6 = [];
|
|
30
|
+
const text = await fs.readFile(filename, 'utf-8');
|
|
31
|
+
text.split('\n')
|
|
32
|
+
.filter(x => x.trim())
|
|
33
|
+
.filter(x => x !== '')
|
|
34
|
+
.forEach(x => {
|
|
35
|
+
if (isIPv4Address(x)) {
|
|
36
|
+
ipv4.push(IPv4AddressRange.from(x, x));
|
|
37
|
+
}
|
|
38
|
+
if (isIPv6Address(x)) {
|
|
39
|
+
ipv6.push(IPv6AddressRange.from(x, x));
|
|
40
|
+
}
|
|
41
|
+
if (isIPv4AddressRange(x)) {
|
|
42
|
+
const [startAddress, endAddress] = x.split('-');
|
|
43
|
+
ipv4.push(IPv4AddressRange.from(startAddress, endAddress));
|
|
44
|
+
}
|
|
45
|
+
if (isIPv6AddressRange(x)) {
|
|
46
|
+
const [startAddress, endAddress] = x.split('-');
|
|
47
|
+
ipv6.push(IPv6AddressRange.from(startAddress, endAddress));
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
return new IPRanges(ipv4, ipv6);
|
|
51
|
+
}
|
|
52
|
+
async toFile(filename) {
|
|
53
|
+
const ipv4 = this.ipv4
|
|
54
|
+
.map(range => range.toString())
|
|
55
|
+
.join('\n');
|
|
56
|
+
const ipv6 = this.ipv6
|
|
57
|
+
.map(range => range.toString())
|
|
58
|
+
.join('\n');
|
|
59
|
+
await fs.writeFile(filename, [ipv4, ipv6].join('\n'));
|
|
60
|
+
}
|
|
61
|
+
includes(address) {
|
|
62
|
+
if (isIPv4Address(address)) {
|
|
63
|
+
return this.ipv4.some(x => x.includes(address));
|
|
64
|
+
}
|
|
65
|
+
if (isIPv6Address(address)) {
|
|
66
|
+
return this.ipv6.some(x => x.includes(address));
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function isIPv4AddressRange(text) {
|
|
72
|
+
return /^[\d\.]+-[\d\.]+$/.test(text);
|
|
73
|
+
}
|
|
74
|
+
function isIPv6AddressRange(text) {
|
|
75
|
+
return /^[\da-f:]+-[\da-f:]+$/.test(text);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=ip-ranges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ip-ranges.js","sourceRoot":"","sources":["../src/ip-ranges.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { isServerOnline } from "./utils/is-server-online.js";
|
|
2
|
+
import { createDNSResolver } from "./utils/create-dns-resolver.js";
|
|
3
|
+
import { resolveA } from "./utils/resolve-a.js";
|
|
4
|
+
import { CustomError } from '@blackglory/errors';
|
|
5
|
+
import { isSuccessPromise } from 'return-style';
|
|
6
|
+
import { isntNull } from '@blackglory/prelude';
|
|
7
|
+
import { getPoisonResult } from "./dao/get-poison-test-result.js";
|
|
8
|
+
import { upsertPoisonTestResult } from "./dao/upsert-poison-test-result.js";
|
|
9
|
+
export var PoisonTestResult;
|
|
10
|
+
(function (PoisonTestResult) {
|
|
11
|
+
PoisonTestResult[PoisonTestResult["NotPoisoned"] = 0] = "NotPoisoned";
|
|
12
|
+
PoisonTestResult[PoisonTestResult["Poisoned"] = 1] = "Poisoned";
|
|
13
|
+
})(PoisonTestResult = PoisonTestResult || (PoisonTestResult = {}));
|
|
14
|
+
export class ServerUnreachable extends CustomError {
|
|
15
|
+
constructor() {
|
|
16
|
+
super('The test server is unreachable or not sending a echo reply in time');
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class PoisonTester {
|
|
20
|
+
constructor(options) {
|
|
21
|
+
this.server = options.server;
|
|
22
|
+
this.timeout = options.timeout;
|
|
23
|
+
this.testResolver = createDNSResolver(this.server);
|
|
24
|
+
}
|
|
25
|
+
async isHostnamePoisoned(hostname) {
|
|
26
|
+
const result = getPoisonResult(hostname);
|
|
27
|
+
if (isntNull(result)) {
|
|
28
|
+
return poisonTestResultToIsPoisoned(result);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
const [alive, poisoned] = await Promise.all([
|
|
32
|
+
isServerOnline(this.server, this.timeout),
|
|
33
|
+
isSuccessPromise(resolveA(this.testResolver, hostname, this.timeout))
|
|
34
|
+
]);
|
|
35
|
+
if (alive) {
|
|
36
|
+
const result = poisoned
|
|
37
|
+
? PoisonTestResult.Poisoned
|
|
38
|
+
: PoisonTestResult.NotPoisoned;
|
|
39
|
+
upsertPoisonTestResult(hostname, result);
|
|
40
|
+
return poisonTestResultToIsPoisoned(result);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
throw new ServerUnreachable();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function poisonTestResultToIsPoisoned(result) {
|
|
49
|
+
switch (result) {
|
|
50
|
+
case PoisonTestResult.Poisoned: return true;
|
|
51
|
+
case PoisonTestResult.NotPoisoned: return false;
|
|
52
|
+
default: throw new Error('Unknown poision test result');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=poison-tester.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poison-tester.js","sourceRoot":"","sources":["../src/poison-tester.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,oCAAkC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,uCAAqC;AACjE,OAAO,EAAE,QAAQ,EAAE,6BAA2B;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE9C,OAAO,EAAE,eAAe,EAAE,wCAAsC;AAChE,OAAO,EAAE,sBAAsB,EAAE,2CAAyC;AAE1E,MAAM,CAAN,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IAC1B,qEAAe,CAAA;IACf,+DAAY,CAAA;AACd,CAAC,EAHW,gBAAgB,GAAhB,gBAAgB,KAAhB,gBAAgB,QAG3B;AAED,MAAM,OAAO,iBAAkB,SAAQ,WAAW;IAChD;QACE,KAAK,CAAC,oEAAoE,CAAC,CAAA;IAC7E,CAAC;CACF;AAED,MAAM,OAAO,YAAY;IAKvB,YAAY,OAGX;QACC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;QAC5B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;QAC9B,IAAI,CAAC,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACpD,CAAC;IAKD,KAAK,CAAC,kBAAkB,CAAC,QAAgB;QACvC,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;QACxC,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE;YACpB,OAAO,4BAA4B,CAAC,MAAM,CAAC,CAAA;SAC5C;aAAM;YACL,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC1C,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC;gBACzC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;aACtE,CAAC,CAAA;YACF,IAAI,KAAK,EAAE;gBACT,MAAM,MAAM,GAAG,QAAQ;oBACrB,CAAC,CAAC,gBAAgB,CAAC,QAAQ;oBAC3B,CAAC,CAAC,gBAAgB,CAAC,WAAW,CAAA;gBAChC,sBAAsB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;gBACxC,OAAO,4BAA4B,CAAC,MAAM,CAAC,CAAA;aAC5C;iBAAM;gBACL,MAAM,IAAI,iBAAiB,EAAE,CAAA;aAC9B;SACF;IACH,CAAC;CACF;AAED,SAAS,4BAA4B,CAAC,MAAwB;IAC5D,QAAQ,MAAM,EAAE;QACd,KAAK,gBAAgB,CAAC,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAA;QAC3C,KAAK,gBAAgB,CAAC,WAAW,CAAC,CAAC,OAAO,KAAK,CAAA;QAC/C,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;KACxD;AACH,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export var RecordType;
|
|
2
|
+
(function (RecordType) {
|
|
3
|
+
RecordType[RecordType["A"] = 1] = "A";
|
|
4
|
+
RecordType[RecordType["NS"] = 2] = "NS";
|
|
5
|
+
RecordType[RecordType["MD"] = 3] = "MD";
|
|
6
|
+
RecordType[RecordType["MF"] = 4] = "MF";
|
|
7
|
+
RecordType[RecordType["CNAME"] = 5] = "CNAME";
|
|
8
|
+
RecordType[RecordType["SOA"] = 6] = "SOA";
|
|
9
|
+
RecordType[RecordType["MB"] = 7] = "MB";
|
|
10
|
+
RecordType[RecordType["MG"] = 8] = "MG";
|
|
11
|
+
RecordType[RecordType["MR"] = 9] = "MR";
|
|
12
|
+
RecordType[RecordType["NULL"] = 10] = "NULL";
|
|
13
|
+
RecordType[RecordType["WKS"] = 11] = "WKS";
|
|
14
|
+
RecordType[RecordType["PTR"] = 12] = "PTR";
|
|
15
|
+
RecordType[RecordType["HINFO"] = 13] = "HINFO";
|
|
16
|
+
RecordType[RecordType["MINFO"] = 14] = "MINFO";
|
|
17
|
+
RecordType[RecordType["MX"] = 15] = "MX";
|
|
18
|
+
RecordType[RecordType["TXT"] = 16] = "TXT";
|
|
19
|
+
RecordType[RecordType["RP"] = 17] = "RP";
|
|
20
|
+
RecordType[RecordType["AFSDB"] = 18] = "AFSDB";
|
|
21
|
+
RecordType[RecordType["X25"] = 19] = "X25";
|
|
22
|
+
RecordType[RecordType["ISDN"] = 20] = "ISDN";
|
|
23
|
+
RecordType[RecordType["RT"] = 21] = "RT";
|
|
24
|
+
RecordType[RecordType["NSAP"] = 22] = "NSAP";
|
|
25
|
+
RecordType[RecordType["NSAP-PTR"] = 23] = "NSAP-PTR";
|
|
26
|
+
RecordType[RecordType["SIG"] = 24] = "SIG";
|
|
27
|
+
RecordType[RecordType["KEY"] = 25] = "KEY";
|
|
28
|
+
RecordType[RecordType["PX"] = 26] = "PX";
|
|
29
|
+
RecordType[RecordType["GPOS"] = 27] = "GPOS";
|
|
30
|
+
RecordType[RecordType["AAAA"] = 28] = "AAAA";
|
|
31
|
+
RecordType[RecordType["LOC"] = 29] = "LOC";
|
|
32
|
+
RecordType[RecordType["NXT"] = 30] = "NXT";
|
|
33
|
+
RecordType[RecordType["EID"] = 31] = "EID";
|
|
34
|
+
RecordType[RecordType["NIMLOC"] = 32] = "NIMLOC";
|
|
35
|
+
RecordType[RecordType["SRV"] = 33] = "SRV";
|
|
36
|
+
RecordType[RecordType["ATMA"] = 34] = "ATMA";
|
|
37
|
+
RecordType[RecordType["NAPTR"] = 35] = "NAPTR";
|
|
38
|
+
RecordType[RecordType["KX"] = 36] = "KX";
|
|
39
|
+
RecordType[RecordType["CERT"] = 37] = "CERT";
|
|
40
|
+
RecordType[RecordType["A6"] = 38] = "A6";
|
|
41
|
+
RecordType[RecordType["DNAME"] = 39] = "DNAME";
|
|
42
|
+
RecordType[RecordType["SINK"] = 40] = "SINK";
|
|
43
|
+
RecordType[RecordType["OPT"] = 41] = "OPT";
|
|
44
|
+
RecordType[RecordType["APL"] = 42] = "APL";
|
|
45
|
+
RecordType[RecordType["DS"] = 43] = "DS";
|
|
46
|
+
RecordType[RecordType["SSHFP"] = 44] = "SSHFP";
|
|
47
|
+
RecordType[RecordType["IPSECKEY"] = 45] = "IPSECKEY";
|
|
48
|
+
RecordType[RecordType["RRSIG"] = 46] = "RRSIG";
|
|
49
|
+
RecordType[RecordType["NSEC"] = 47] = "NSEC";
|
|
50
|
+
RecordType[RecordType["DNSKEY"] = 48] = "DNSKEY";
|
|
51
|
+
RecordType[RecordType["DHCID"] = 49] = "DHCID";
|
|
52
|
+
RecordType[RecordType["NSEC3"] = 50] = "NSEC3";
|
|
53
|
+
RecordType[RecordType["NSEC3PARAM"] = 51] = "NSEC3PARAM";
|
|
54
|
+
RecordType[RecordType["TLSA"] = 52] = "TLSA";
|
|
55
|
+
RecordType[RecordType["HIP"] = 55] = "HIP";
|
|
56
|
+
RecordType[RecordType["NINFO"] = 56] = "NINFO";
|
|
57
|
+
RecordType[RecordType["RKEY"] = 57] = "RKEY";
|
|
58
|
+
RecordType[RecordType["TALINK"] = 58] = "TALINK";
|
|
59
|
+
RecordType[RecordType["CDS"] = 59] = "CDS";
|
|
60
|
+
RecordType[RecordType["SPF"] = 99] = "SPF";
|
|
61
|
+
RecordType[RecordType["UINFO"] = 100] = "UINFO";
|
|
62
|
+
RecordType[RecordType["UID"] = 101] = "UID";
|
|
63
|
+
RecordType[RecordType["GID"] = 102] = "GID";
|
|
64
|
+
RecordType[RecordType["UNSPEC"] = 103] = "UNSPEC";
|
|
65
|
+
RecordType[RecordType["TKEY"] = 249] = "TKEY";
|
|
66
|
+
RecordType[RecordType["TSIG"] = 250] = "TSIG";
|
|
67
|
+
RecordType[RecordType["IXFR"] = 251] = "IXFR";
|
|
68
|
+
RecordType[RecordType["AXFR"] = 252] = "AXFR";
|
|
69
|
+
RecordType[RecordType["MAILB"] = 253] = "MAILB";
|
|
70
|
+
RecordType[RecordType["MAILA"] = 254] = "MAILA";
|
|
71
|
+
RecordType[RecordType["ANY"] = 255] = "ANY";
|
|
72
|
+
RecordType[RecordType["URI"] = 256] = "URI";
|
|
73
|
+
RecordType[RecordType["CAA"] = 257] = "CAA";
|
|
74
|
+
RecordType[RecordType["TA"] = 32768] = "TA";
|
|
75
|
+
RecordType[RecordType["DLV"] = 32769] = "DLV";
|
|
76
|
+
})(RecordType = RecordType || (RecordType = {}));
|
|
77
|
+
//# sourceMappingURL=record-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-types.js","sourceRoot":"","sources":["../src/record-types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,UA0EX;AA1ED,WAAY,UAAU;IACpB,qCAAK,CAAA;IACL,uCAAM,CAAA;IACN,uCAAM,CAAA;IACN,uCAAM,CAAA;IACN,6CAAS,CAAA;IACT,yCAAO,CAAA;IACP,uCAAM,CAAA;IACN,uCAAM,CAAA;IACN,uCAAM,CAAA;IACN,4CAAS,CAAA;IACT,0CAAQ,CAAA;IACR,0CAAQ,CAAA;IACR,8CAAU,CAAA;IACV,8CAAU,CAAA;IACV,wCAAO,CAAA;IACP,0CAAQ,CAAA;IACR,wCAAO,CAAA;IACP,8CAAU,CAAA;IACV,0CAAQ,CAAA;IACR,4CAAS,CAAA;IACT,wCAAO,CAAA;IACP,4CAAS,CAAA;IACT,oDAAe,CAAA;IACf,0CAAQ,CAAA;IACR,0CAAQ,CAAA;IACR,wCAAO,CAAA;IACP,4CAAS,CAAA;IACT,4CAAS,CAAA;IACT,0CAAQ,CAAA;IACR,0CAAQ,CAAA;IACR,0CAAQ,CAAA;IACR,gDAAW,CAAA;IACX,0CAAQ,CAAA;IACR,4CAAS,CAAA;IACT,8CAAU,CAAA;IACV,wCAAO,CAAA;IACP,4CAAS,CAAA;IACT,wCAAO,CAAA;IACP,8CAAU,CAAA;IACV,4CAAS,CAAA;IACT,0CAAQ,CAAA;IACR,0CAAQ,CAAA;IACR,wCAAO,CAAA;IACP,8CAAU,CAAA;IACV,oDAAa,CAAA;IACb,8CAAU,CAAA;IACV,4CAAS,CAAA;IACT,gDAAW,CAAA;IACX,8CAAU,CAAA;IACV,8CAAU,CAAA;IACV,wDAAe,CAAA;IACf,4CAAS,CAAA;IACT,0CAAQ,CAAA;IACR,8CAAU,CAAA;IACV,4CAAS,CAAA;IACT,gDAAW,CAAA;IACX,0CAAQ,CAAA;IACR,0CAAQ,CAAA;IACR,+CAAW,CAAA;IACX,2CAAS,CAAA;IACT,2CAAS,CAAA;IACT,iDAAY,CAAA;IACZ,6CAAU,CAAA;IACV,6CAAU,CAAA;IACV,6CAAU,CAAA;IACV,6CAAU,CAAA;IACV,+CAAW,CAAA;IACX,+CAAW,CAAA;IACX,2CAAS,CAAA;IACT,2CAAS,CAAA;IACT,2CAAS,CAAA;IACT,2CAAU,CAAA;IACV,6CAAW,CAAA;AACb,CAAC,EA1EW,UAAU,GAAV,UAAU,KAAV,UAAU,QA0ErB"}
|
package/lib/router.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { resolveA } from "./utils/resolve-a.js";
|
|
2
|
+
import { isntNull } from '@blackglory/prelude';
|
|
3
|
+
import { getRouteResult } from "./dao/get-route-result.js";
|
|
4
|
+
import { upsertRouteResult } from "./dao/upsert-route-result.js";
|
|
5
|
+
export var RouteResult;
|
|
6
|
+
(function (RouteResult) {
|
|
7
|
+
RouteResult[RouteResult["UntrustedServer"] = 0] = "UntrustedServer";
|
|
8
|
+
RouteResult[RouteResult["TrustedServer"] = 1] = "TrustedServer";
|
|
9
|
+
RouteResult[RouteResult["Unresolved"] = 2] = "Unresolved";
|
|
10
|
+
})(RouteResult = RouteResult || (RouteResult = {}));
|
|
11
|
+
export class Router {
|
|
12
|
+
constructor(options) {
|
|
13
|
+
this.poisonTester = options.poisonTester;
|
|
14
|
+
this.untrustedResolver = options.untrustedResolver;
|
|
15
|
+
this.ipWhitelist = options.ipWhitelist;
|
|
16
|
+
this.hostnameWhitelist = options.hostnameWhitelist;
|
|
17
|
+
this.hostnameBlacklist = options.hostnameBlacklist;
|
|
18
|
+
}
|
|
19
|
+
async route(hostname) {
|
|
20
|
+
if (this.inHostnameWhitelist(hostname))
|
|
21
|
+
return RouteResult.UntrustedServer;
|
|
22
|
+
if (this.inHostnameBlacklist(hostname))
|
|
23
|
+
return RouteResult.TrustedServer;
|
|
24
|
+
const result = getRouteResult(hostname);
|
|
25
|
+
if (isntNull(result)) {
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
const result = await this.resolveRoute(hostname);
|
|
30
|
+
upsertRouteResult(hostname, result);
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async resolveRoute(hostname) {
|
|
35
|
+
if (await this.poisonTester.isHostnamePoisoned(hostname)) {
|
|
36
|
+
return RouteResult.TrustedServer;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
const addresses = await resolveA(this.untrustedResolver, hostname);
|
|
40
|
+
if (addresses.length > 0) {
|
|
41
|
+
if (this.inIPWhitelist(addresses)) {
|
|
42
|
+
return RouteResult.UntrustedServer;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
return RouteResult.TrustedServer;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
return RouteResult.Unresolved;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
inIPWhitelist(addresses) {
|
|
54
|
+
return addresses.some(x => this.ipWhitelist.includes(x));
|
|
55
|
+
}
|
|
56
|
+
inHostnameWhitelist(hostname) {
|
|
57
|
+
return this.hostnameWhitelist.includes(hostname);
|
|
58
|
+
}
|
|
59
|
+
inHostnameBlacklist(hostname) {
|
|
60
|
+
return this.hostnameBlacklist.includes(hostname);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,6BAA2B;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,kCAAgC;AACzD,OAAO,EAAE,iBAAiB,EAAE,qCAAmC;AAE/D,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,mEAAmB,CAAA;IACnB,+DAAiB,CAAA;IACjB,yDAAc,CAAA;AAChB,CAAC,EAJW,WAAW,GAAX,WAAW,KAAX,WAAW,QAItB;AAED,MAAM,OAAO,MAAM;IAOjB,YAAY,OAMX;QACC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAA;QACxC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAA;QAClD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAA;QACtC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAA;QAClD,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAA;IACpD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAAgB;QAC1B,IAAI,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC;YAAE,OAAO,WAAW,CAAC,eAAe,CAAA;QAC1E,IAAI,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC;YAAE,OAAO,WAAW,CAAC,aAAa,CAAA;QAExE,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAA;QACvC,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE;YACpB,OAAO,MAAM,CAAA;SACd;aAAM;YACL,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;YAChD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;YACnC,OAAO,MAAM,CAAA;SACd;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,QAAgB;QACzC,IAAI,MAAM,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAAE;YACxD,OAAO,WAAW,CAAC,aAAa,CAAA;SACjC;aAAM;YACL,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAA;YAClE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;gBACxB,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE;oBACjC,OAAO,WAAW,CAAC,eAAe,CAAA;iBACnC;qBAAM;oBACL,OAAO,WAAW,CAAC,aAAa,CAAA;iBACjC;aACF;iBAAM;gBAEL,OAAO,WAAW,CAAC,UAAU,CAAA;aAC9B;SACF;IACH,CAAC;IAEO,aAAa,CAAC,SAAmB;QACvC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1D,CAAC;IAEO,mBAAmB,CAAC,QAAgB;QAC1C,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAClD,CAAC;IAEO,mBAAmB,CAAC,QAAgB;QAC1C,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAClD,CAAC;CACF"}
|
package/lib/server.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { RouteResult } from './router.js';
|
|
2
|
+
import * as dns from 'native-node-dns';
|
|
3
|
+
import { getErrorResultAsync } from 'return-style';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { RecordType } from './record-types.js';
|
|
6
|
+
import { go } from '@blackglory/prelude';
|
|
7
|
+
export function startServer({ logger, port, timeout, router, trustedServer, untrustedServer }) {
|
|
8
|
+
const server = dns.createServer();
|
|
9
|
+
server.on('error', console.error);
|
|
10
|
+
server.on('socketError', console.error);
|
|
11
|
+
server.on('request', async (req, res) => {
|
|
12
|
+
logger.trace(`request: ${JSON.stringify(req)}`);
|
|
13
|
+
res.header.rcode = dns.consts.NAME_TO_RCODE.SERVFAIL;
|
|
14
|
+
const question = req.question[0];
|
|
15
|
+
const startTime = Date.now();
|
|
16
|
+
const [err, result] = await getErrorResultAsync(() => router.route(question.name));
|
|
17
|
+
if (err) {
|
|
18
|
+
logger.error(`${formatHostname(question.name)} ${err}`, getElapsed(startTime));
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
logger.debug(`${formatHostname(question.name)} ${RouteResult[result]}`, getElapsed(startTime));
|
|
22
|
+
const server = go(() => {
|
|
23
|
+
switch (result) {
|
|
24
|
+
case RouteResult.TrustedServer: return trustedServer;
|
|
25
|
+
case RouteResult.UntrustedServer: return untrustedServer;
|
|
26
|
+
case RouteResult.Unresolved: return untrustedServer;
|
|
27
|
+
default: throw new Error('Unknown route result');
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
const [err, response] = await getErrorResultAsync(() => resolve(server, question, timeout));
|
|
31
|
+
if (err) {
|
|
32
|
+
logger.error(`${formatHostname(question.name)} ${err}`, getElapsed(startTime));
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
logger.info(`${formatHostname(question.name)} ${RecordType[question.type]}`, getElapsed(startTime));
|
|
36
|
+
res.header.rcode = response.header.rcode;
|
|
37
|
+
res.answer = response.answer;
|
|
38
|
+
res.authority = response.authority;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
logger.trace(`response: ${JSON.stringify(res)}`);
|
|
42
|
+
res.send();
|
|
43
|
+
});
|
|
44
|
+
server.serve(port);
|
|
45
|
+
}
|
|
46
|
+
function resolve(server, question, timeout) {
|
|
47
|
+
return new Promise((resolve, reject) => {
|
|
48
|
+
let response;
|
|
49
|
+
const request = dns.Request({
|
|
50
|
+
question,
|
|
51
|
+
server: {
|
|
52
|
+
address: server.host,
|
|
53
|
+
port: server.port,
|
|
54
|
+
type: 'udp'
|
|
55
|
+
},
|
|
56
|
+
timeout,
|
|
57
|
+
cache: false,
|
|
58
|
+
try_edns: true
|
|
59
|
+
});
|
|
60
|
+
request.on('timeout', () => reject(new Error('timeout')));
|
|
61
|
+
request.on('cancelled', () => reject(new Error('cancelled')));
|
|
62
|
+
request.on('end', () => {
|
|
63
|
+
if (response) {
|
|
64
|
+
resolve(response);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
reject(new Error('No response'));
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
request.on('message', (err, msg) => {
|
|
71
|
+
if (err)
|
|
72
|
+
return reject(err);
|
|
73
|
+
response = msg;
|
|
74
|
+
});
|
|
75
|
+
request.send();
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
function formatHostname(hostname) {
|
|
79
|
+
return chalk.cyan(hostname);
|
|
80
|
+
}
|
|
81
|
+
function getElapsed(startTime) {
|
|
82
|
+
return Date.now() - startTime;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-dns-resolver.js","sourceRoot":"","sources":["../../src/utils/create-dns-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,GAAG,EAAE,MAAM,KAAK,CAAA;AAErC,MAAM,UAAU,iBAAiB,CAAC,GAAG,OAAiB;IACpD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAA;IACnC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;IAC5B,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export class HostnamePattern {
|
|
2
|
+
constructor(pattern) {
|
|
3
|
+
const re = pattern.replace(/\./g, '\\.')
|
|
4
|
+
.replace(/\*/g, '.*');
|
|
5
|
+
this.re = new RegExp(`^${re}$`, 'i');
|
|
6
|
+
}
|
|
7
|
+
match(hostname) {
|
|
8
|
+
return this.re.test(hostname);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=hostname-pattern.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostname-pattern.js","sourceRoot":"","sources":["../../src/utils/hostname-pattern.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAe;IAG1B,YAAY,OAAe;QACzB,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;aACrB,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACvC,IAAI,CAAC,EAAE,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,QAAgB;QACpB,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-ipv4-address.js","sourceRoot":"","sources":["../../src/utils/is-ipv4-address.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-ipv6-address.js","sourceRoot":"","sources":["../../src/utils/is-ipv6-address.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACjC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { timeout, TimeoutError } from 'extra-promise';
|
|
2
|
+
import ping from 'ping';
|
|
3
|
+
import { go } from '@blackglory/prelude';
|
|
4
|
+
export async function isServerOnline(address, timeoutMsecs) {
|
|
5
|
+
try {
|
|
6
|
+
const result = await Promise.race([
|
|
7
|
+
go(async () => {
|
|
8
|
+
const res = await ping.promise.probe(address);
|
|
9
|
+
return res.alive;
|
|
10
|
+
}),
|
|
11
|
+
timeout(timeoutMsecs)
|
|
12
|
+
]);
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
catch (e) {
|
|
16
|
+
if (e instanceof TimeoutError)
|
|
17
|
+
return false;
|
|
18
|
+
throw e;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=is-server-online.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-server-online.js","sourceRoot":"","sources":["../../src/utils/is-server-online.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACrD,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAA;AAExC,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAe,EACf,YAAoB;IAEpB,IAAI;QACF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAChC,EAAE,CAAC,KAAK,IAAI,EAAE;gBACZ,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;gBAC7C,OAAO,GAAG,CAAC,KAAK,CAAA;YAClB,CAAC,CAAC;YACF,OAAO,CAAC,YAAY,CAAC;SACtB,CAAC,CAAA;QACF,OAAO,MAAM,CAAA;KACd;IAAC,OAAO,CAAC,EAAE;QACV,IAAI,CAAC,YAAY,YAAY;YAAE,OAAO,KAAK,CAAA;QAE3C,MAAM,CAAC,CAAA;KACR;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { fileURLToPath } from 'node:url';
|
|
2
|
+
import { readJSONFileSync, findUpPackageFilenameSync } from 'extra-filesystem';
|
|
3
|
+
import { assert, isString } from '@blackglory/prelude';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
const pkgFilename = findUpPackageFilenameSync(fileURLToPath(new URL(import.meta.url)));
|
|
6
|
+
assert(pkgFilename, 'The package.json is not found');
|
|
7
|
+
export const pkgDirname = path.dirname(pkgFilename);
|
|
8
|
+
const pkg = readJSONFileSync(pkgFilename);
|
|
9
|
+
export const name = pkg.name;
|
|
10
|
+
assert(isString(name), 'The name is not found in package.json');
|
|
11
|
+
export const description = pkg.description;
|
|
12
|
+
assert(isString(description), 'The description is not found in package.json');
|
|
13
|
+
export const version = pkg.version;
|
|
14
|
+
assert(isString(version), 'The version is not found in package.json');
|
|
15
|
+
assert(/^\d+\.\d+\.\d+$/.test(version), 'The version is invalid');
|
|
16
|
+
//# sourceMappingURL=package.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package.js","sourceRoot":"","sources":["../../src/utils/package.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAA;AAC9E,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,MAAM,WAAW,GAAG,yBAAyB,CAC3C,aAAa,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CACxC,CAAA;AACD,MAAM,CAAC,WAAW,EAAE,+BAA+B,CAAC,CAAA;AAEpD,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;AAEnD,MAAM,GAAG,GAAG,gBAAgB,CAAyB,WAAW,CAAC,CAAA;AAEjE,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAA;AAC5B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,uCAAuC,CAAC,CAAA;AAE/D,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,CAAA;AAC1C,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,8CAA8C,CAAC,CAAA;AAE7E,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,OAA0C,CAAA;AACrE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,0CAA0C,CAAC,CAAA;AACrE,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,wBAAwB,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-server-info.js","sourceRoot":"","sources":["../../src/utils/parse-server-info.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAiC,CAAA;IACtE,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;KACnD,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { timeout } from 'extra-promise';
|
|
2
|
+
export { TimeoutError } from 'extra-promise';
|
|
3
|
+
export async function resolveA(resolver, hostname, timeoutMsecs) {
|
|
4
|
+
if (timeoutMsecs) {
|
|
5
|
+
return await Promise.race([
|
|
6
|
+
resolver.resolve4(hostname),
|
|
7
|
+
timeout(timeoutMsecs)
|
|
8
|
+
]);
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
return await resolver.resolve4(hostname);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=resolve-a.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-a.js","sourceRoot":"","sources":["../../src/utils/resolve-a.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAM5C,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAAsB,EACtB,QAAgB,EAChB,YAAqB;IAErB,IAAI,YAAY,EAAE;QAChB,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACxB,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC3B,OAAO,CAAC,YAAY,CAAC;SACtB,CAAC,CAAA;KACH;SAAM;QACL,OAAO,MAAM,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;KACzC;AACH,CAAC"}
|