better-hosts 0.1.21 → 0.2.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/README.md +3 -3
- package/lib/cli.js +53 -0
- package/lib/cli.js.map +1 -0
- package/lib/hosts.js +113 -0
- package/lib/hosts.js.map +1 -0
- package/lib/record-types.js +77 -0
- package/lib/record-types.js.map +1 -0
- package/lib/server.js +94 -0
- package/lib/server.js.map +1 -0
- package/lib/utils/hostname-pattern.js +18 -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/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/package.json +38 -43
- package/dist/cli.cjs +0 -47367
package/README.md
CHANGED
|
@@ -24,9 +24,9 @@ Usage: better-hosts [options] <filename>
|
|
|
24
24
|
Options:
|
|
25
25
|
-V, --version output the version number
|
|
26
26
|
--fallback-server <server>
|
|
27
|
-
--timeout
|
|
28
|
-
--port
|
|
29
|
-
--log
|
|
27
|
+
--timeout <seconds> (default: "30")
|
|
28
|
+
--port <port> (default: "53")
|
|
29
|
+
--log <level> (default: "info")
|
|
30
30
|
-h, --help display help for command
|
|
31
31
|
```
|
|
32
32
|
|
package/lib/cli.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { program } from 'commander';
|
|
3
|
+
import { startServer } from './server.js';
|
|
4
|
+
import { assert } from '@blackglory/prelude';
|
|
5
|
+
import { Level, Logger, TerminalTransport, stringToLevel } from 'extra-logger';
|
|
6
|
+
import { parseServerInfo } from "./utils/parse-server-info.js";
|
|
7
|
+
import { Hosts } from './hosts.js';
|
|
8
|
+
import { name, version, description } from "./utils/package.js";
|
|
9
|
+
process.title = name;
|
|
10
|
+
program
|
|
11
|
+
.name(name)
|
|
12
|
+
.version(version)
|
|
13
|
+
.description(description)
|
|
14
|
+
.requiredOption('--fallback-server <server>')
|
|
15
|
+
.option('--timeout <seconds>', '', '30')
|
|
16
|
+
.option('--port <port>', '', '53')
|
|
17
|
+
.option('--log <level>', '', 'info')
|
|
18
|
+
.argument('<filename>')
|
|
19
|
+
.action(async (filename) => {
|
|
20
|
+
const options = program.opts();
|
|
21
|
+
const logLevel = getLogLevel(options);
|
|
22
|
+
const timeout = getTimeout(options);
|
|
23
|
+
const port = getPort(options);
|
|
24
|
+
const fallbackServer = getFallbackServer(options);
|
|
25
|
+
const logger = new Logger({
|
|
26
|
+
level: logLevel,
|
|
27
|
+
transport: new TerminalTransport({})
|
|
28
|
+
});
|
|
29
|
+
const hosts = new Hosts({ filename, logger });
|
|
30
|
+
startServer({
|
|
31
|
+
logger,
|
|
32
|
+
hosts,
|
|
33
|
+
fallbackServer,
|
|
34
|
+
timeout,
|
|
35
|
+
port
|
|
36
|
+
});
|
|
37
|
+
})
|
|
38
|
+
.parse();
|
|
39
|
+
function getPort(options) {
|
|
40
|
+
assert(/^\d+$/.test(options.port), 'The parameter port must be integer');
|
|
41
|
+
return Number.parseInt(options.port, 10);
|
|
42
|
+
}
|
|
43
|
+
function getTimeout(options) {
|
|
44
|
+
assert(/^\d+$/.test(options.timeout), 'The parameter timeout must be integer');
|
|
45
|
+
return Number.parseInt(options.port, 10) * 1000;
|
|
46
|
+
}
|
|
47
|
+
function getFallbackServer(options) {
|
|
48
|
+
return parseServerInfo(options.fallbackServer);
|
|
49
|
+
}
|
|
50
|
+
function getLogLevel(options) {
|
|
51
|
+
return stringToLevel(options.log, Level.Info);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=cli.js.map
|
package/lib/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC9E,OAAO,EAAe,eAAe,EAAE,qCAAmC;AAC1E,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,2BAAyB;AAS9D,OAAO,CAAC,KAAK,GAAG,IAAI,CAAA;AAEpB,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,WAAW,CAAC;KACxB,cAAc,CAAC,4BAA4B,CAAC;KAC5C,MAAM,CAAC,qBAAqB,EAAE,EAAE,EAAE,IAAI,CAAC;KACvC,MAAM,CAAC,eAAe,EAAE,EAAE,EAAE,IAAI,CAAC;KACjC,MAAM,CAAC,eAAe,EAAE,EAAE,EAAE,MAAM,CAAC;KACnC,QAAQ,CAAC,YAAY,CAAC;KACtB,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAY,CAAA;IACxC,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IACrC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;IACnC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7B,MAAM,cAAc,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;IAEjD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;QACxB,KAAK,EAAE,QAAQ;QACf,SAAS,EAAE,IAAI,iBAAiB,CAAC,EAAE,CAAC;KACrC,CAAC,CAAA;IACF,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAA;IAE7C,WAAW,CAAC;QACV,MAAM;QACN,KAAK;QACL,cAAc;QACd,OAAO;QACP,IAAI;KACL,CAAC,CAAA;AACJ,CAAC,CAAC;KACD,KAAK,EAAE,CAAA;AAEV,SAAS,OAAO,CAAC,OAAiB;IAChC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,oCAAoC,CAAC,CAAA;IAExE,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;AAC1C,CAAC;AAED,SAAS,UAAU,CAAC,OAAiB;IACnC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,uCAAuC,CAAC,CAAA;IAE9E,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAA;AACjD,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAiB;IAC1C,OAAO,eAAe,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;AAChD,CAAC;AAED,SAAS,WAAW,CAAC,OAAiB;IACpC,OAAO,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;AAC/C,CAAC"}
|
package/lib/hosts.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { readFileLineByLine } from 'extra-filesystem';
|
|
2
|
+
import { toArrayAsync } from 'iterable-operator';
|
|
3
|
+
import { isIPv4Address } from "./utils/is-ipv4-address.js";
|
|
4
|
+
import { isIPv6Address } from "./utils/is-ipv6-address.js";
|
|
5
|
+
import { HostnamePattern } from "./utils/hostname-pattern.js";
|
|
6
|
+
import { pipe } from 'extra-utils';
|
|
7
|
+
import { map, filter, toArray } from 'iterable-operator';
|
|
8
|
+
import { isntNull } from '@blackglory/prelude';
|
|
9
|
+
import { FileWatcher } from 'extra-watcher/file-watcher';
|
|
10
|
+
export class Hosts {
|
|
11
|
+
constructor({ filename, logger }) {
|
|
12
|
+
this.records = [];
|
|
13
|
+
this.update(filename);
|
|
14
|
+
const watcher = new FileWatcher(filename);
|
|
15
|
+
watcher.start();
|
|
16
|
+
watcher.observe().subscribe(async (event) => {
|
|
17
|
+
switch (event.type) {
|
|
18
|
+
case 'created':
|
|
19
|
+
case 'modified':
|
|
20
|
+
await this.update(filename);
|
|
21
|
+
logger.info('The hosts file updated');
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
watcher.reset();
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
async update(filename) {
|
|
28
|
+
const lines = await toArrayAsync(readFileLineByLine(filename));
|
|
29
|
+
this.records = parseHosts(lines);
|
|
30
|
+
}
|
|
31
|
+
resolveA(hostname) {
|
|
32
|
+
return this.records.reduce((result, record) => {
|
|
33
|
+
if (record.pattern.match(hostname)) {
|
|
34
|
+
if (record.pattern.negative) {
|
|
35
|
+
return {
|
|
36
|
+
hasRecords: true,
|
|
37
|
+
address: undefined
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
if ('address' in record && isIPv4Address(record.address)) {
|
|
42
|
+
return {
|
|
43
|
+
hasRecords: true,
|
|
44
|
+
address: record.address
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
hasRecords: true,
|
|
50
|
+
address: result.address
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return result;
|
|
54
|
+
}, {
|
|
55
|
+
hasRecords: false,
|
|
56
|
+
address: undefined
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
resolveAAAA(hostname) {
|
|
60
|
+
return this.records.reduce((result, record) => {
|
|
61
|
+
if (record.pattern.match(hostname)) {
|
|
62
|
+
if (record.pattern.negative) {
|
|
63
|
+
return {
|
|
64
|
+
hasRecords: true,
|
|
65
|
+
address: undefined
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
if ('address' in record && isIPv6Address(record.address)) {
|
|
70
|
+
return {
|
|
71
|
+
hasRecords: true,
|
|
72
|
+
address: record.address
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
hasRecords: true,
|
|
78
|
+
address: result.address
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
return result;
|
|
82
|
+
}, {
|
|
83
|
+
hasRecords: false,
|
|
84
|
+
address: undefined
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export function parseHosts(lines) {
|
|
89
|
+
return pipe(lines, lines => map(lines, line => {
|
|
90
|
+
if (/^\s*$/.test(line))
|
|
91
|
+
return null;
|
|
92
|
+
if (/^\s*#/.test(line))
|
|
93
|
+
return null;
|
|
94
|
+
{
|
|
95
|
+
const result = line.match(/^\s*(?<address>\S+)\s+(?<hostname>[\S^-]\S*)\s*(?:#.*)?$/);
|
|
96
|
+
if (result) {
|
|
97
|
+
const { address, hostname } = result.groups;
|
|
98
|
+
const pattern = new HostnamePattern(hostname);
|
|
99
|
+
return { pattern, address };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
{
|
|
103
|
+
const result = line.match(/^\s*(?<hostname>-\S+)\s*(?:#.*)?$/);
|
|
104
|
+
if (result) {
|
|
105
|
+
const { hostname } = result.groups;
|
|
106
|
+
const pattern = new HostnamePattern(hostname);
|
|
107
|
+
return { pattern };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
throw new Error(`Invalid line: ${line}`);
|
|
111
|
+
}), iter => filter(iter, isntNull), toArray);
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=hosts.js.map
|
package/lib/hosts.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hosts.js","sourceRoot":"","sources":["../src/hosts.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 = {}));
|
|
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,KAAV,UAAU,QA0ErB"}
|
package/lib/server.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import * as dns from 'native-node-dns';
|
|
2
|
+
import { getErrorResultAsync } from 'return-style';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { go } from '@blackglory/prelude';
|
|
5
|
+
import { RecordType } from './record-types.js';
|
|
6
|
+
export function startServer({ logger, timeout, port, hosts, fallbackServer }) {
|
|
7
|
+
const server = dns.createServer();
|
|
8
|
+
server.on('error', console.error);
|
|
9
|
+
server.on('socketError', console.error);
|
|
10
|
+
server.on('request', async (req, res) => {
|
|
11
|
+
logger.trace(`request: ${JSON.stringify(req)}`);
|
|
12
|
+
res.header.rcode = dns.consts.NAME_TO_RCODE.SERVFAIL;
|
|
13
|
+
const question = req.question[0];
|
|
14
|
+
logger.trace(`${formatHostname(question.name)} ${RecordType[question.type]}`);
|
|
15
|
+
const result = go(() => {
|
|
16
|
+
switch (question.type) {
|
|
17
|
+
case dns.consts.NAME_TO_QTYPE.A: return hosts.resolveA(question.name);
|
|
18
|
+
case dns.consts.NAME_TO_QTYPE.AAAA: return hosts.resolveAAAA(question.name);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
if (result === null || result === void 0 ? void 0 : result.hasRecords) {
|
|
22
|
+
if (result.address) {
|
|
23
|
+
logger.info(`${formatHostname(question.name)} ${result.address}`);
|
|
24
|
+
res.header.rcode = dns.consts.NAME_TO_RCODE.NOERROR;
|
|
25
|
+
res.answer.push({
|
|
26
|
+
name: question.name,
|
|
27
|
+
type: question.type,
|
|
28
|
+
class: question.class,
|
|
29
|
+
ttl: 0,
|
|
30
|
+
address: result.address
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
logger.info(`${formatHostname(question.name)} No records for ${RecordType[question.type]}`);
|
|
35
|
+
res.header.rcode = dns.consts.NAME_TO_RCODE.NOERROR;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
const startTime = Date.now();
|
|
40
|
+
const [err, response] = await getErrorResultAsync(() => resolve(fallbackServer, question, timeout));
|
|
41
|
+
if (err) {
|
|
42
|
+
logger.error(`${formatHostname(question.name)} ${err}`, getElapsed(startTime));
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
logger.info(`${formatHostname(question.name)} ${RecordType[question.type]}`, getElapsed(startTime));
|
|
46
|
+
res.header.rcode = response.header.rcode;
|
|
47
|
+
res.answer = response.answer;
|
|
48
|
+
res.authority = response.authority;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
logger.trace(`response: ${JSON.stringify(res)}`);
|
|
52
|
+
res.send();
|
|
53
|
+
});
|
|
54
|
+
return server.serve(port);
|
|
55
|
+
}
|
|
56
|
+
function resolve(server, question, timeout) {
|
|
57
|
+
return new Promise((resolve, reject) => {
|
|
58
|
+
let response;
|
|
59
|
+
const request = dns.Request({
|
|
60
|
+
question,
|
|
61
|
+
server: {
|
|
62
|
+
address: server.host,
|
|
63
|
+
port: server.port,
|
|
64
|
+
type: 'udp'
|
|
65
|
+
},
|
|
66
|
+
timeout,
|
|
67
|
+
cache: false,
|
|
68
|
+
try_edns: true
|
|
69
|
+
});
|
|
70
|
+
request.on('timeout', () => reject(new Error('timeout')));
|
|
71
|
+
request.on('cancelled', () => reject(new Error('cancelled')));
|
|
72
|
+
request.on('end', () => {
|
|
73
|
+
if (response) {
|
|
74
|
+
resolve(response);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
reject(new Error('No response'));
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
request.on('message', (err, msg) => {
|
|
81
|
+
if (err)
|
|
82
|
+
return reject(err);
|
|
83
|
+
response = msg;
|
|
84
|
+
});
|
|
85
|
+
request.send();
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
function formatHostname(hostname) {
|
|
89
|
+
return chalk.cyan(hostname);
|
|
90
|
+
}
|
|
91
|
+
function getElapsed(startTime) {
|
|
92
|
+
return Date.now() - startTime;
|
|
93
|
+
}
|
|
94
|
+
//# 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,18 @@
|
|
|
1
|
+
export class HostnamePattern {
|
|
2
|
+
constructor(pattern) {
|
|
3
|
+
if (pattern.startsWith('-')) {
|
|
4
|
+
this.negative = true;
|
|
5
|
+
pattern = pattern.slice(1);
|
|
6
|
+
}
|
|
7
|
+
else {
|
|
8
|
+
this.negative = false;
|
|
9
|
+
}
|
|
10
|
+
const re = pattern.replace(/\./g, '\\.')
|
|
11
|
+
.replace(/\*/g, '.*');
|
|
12
|
+
this.re = new RegExp(`^${re}$`, 'i');
|
|
13
|
+
}
|
|
14
|
+
match(hostname) {
|
|
15
|
+
return this.re.test(hostname);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# 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;IAI1B,YAAY,OAAe;QACzB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;YACpB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAA;QACvB,CAAC;QAED,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,16 @@
|
|
|
1
|
+
import { fileURLToPath } from '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,KAAK,CAAA;AACnC,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"}
|
package/package.json
CHANGED
|
@@ -1,76 +1,71 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "better-hosts",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dns"
|
|
7
7
|
],
|
|
8
|
-
"bin": "
|
|
8
|
+
"bin": "lib/cli.js",
|
|
9
9
|
"files": [
|
|
10
|
-
"
|
|
10
|
+
"lib"
|
|
11
11
|
],
|
|
12
|
+
"type": "module",
|
|
13
|
+
"engines": {
|
|
14
|
+
"node": ">=18.17.0"
|
|
15
|
+
},
|
|
12
16
|
"repository": "git@github.com:BlackGlory/better-hosts.git",
|
|
13
17
|
"author": "BlackGlory <woshenmedoubuzhidao@blackglory.me>",
|
|
14
18
|
"license": "MIT",
|
|
15
19
|
"scripts": {
|
|
20
|
+
"prepare": "ts-patch install -s",
|
|
16
21
|
"deduplicate": "yarn-deduplicate",
|
|
17
|
-
"prepublishOnly": "run-s postinstall clean build
|
|
22
|
+
"prepublishOnly": "run-s postinstall prepare clean build",
|
|
18
23
|
"postinstall": "patch-package",
|
|
19
24
|
"lint": "eslint --ext .js,.jsx,.ts,.tsx --quiet src",
|
|
20
|
-
"test": "
|
|
21
|
-
"test:debug": "node --inspect-brk node_modules/.bin/jest --runInBand",
|
|
22
|
-
"test:coverage": "jest --coverage --config jest.config.js",
|
|
25
|
+
"test": "vitest --run",
|
|
23
26
|
"clean": "rimraf lib dist",
|
|
24
|
-
"build": "
|
|
25
|
-
"
|
|
26
|
-
"build:patch": "tscpaths --project tsconfig.build.json --src ./src --out ./lib",
|
|
27
|
-
"bundle": "webpack --stats-error-details",
|
|
28
|
-
"smoke": "node dist/cli.cjs --help",
|
|
27
|
+
"build": "tsc --project tsconfig.build.json",
|
|
28
|
+
"smoke": "node lib/cli.js --help",
|
|
29
29
|
"release": "standard-version"
|
|
30
30
|
},
|
|
31
31
|
"husky": {
|
|
32
32
|
"hooks": {
|
|
33
|
-
"pre-commit": "run-s postinstall clean lint build test
|
|
33
|
+
"pre-commit": "run-s postinstall prepare clean lint build test smoke",
|
|
34
34
|
"commit-msg": "commitlint --env HUSKY_GIT_PARAMS"
|
|
35
35
|
}
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"@commitlint/cli": "^
|
|
39
|
-
"@commitlint/config-conventional": "^
|
|
40
|
-
"@types/
|
|
41
|
-
"@
|
|
42
|
-
"@typescript-eslint/
|
|
43
|
-
"
|
|
44
|
-
"eslint": "^8.21.0",
|
|
38
|
+
"@commitlint/cli": "^18.4.3",
|
|
39
|
+
"@commitlint/config-conventional": "^18.4.3",
|
|
40
|
+
"@types/node": "18",
|
|
41
|
+
"@typescript-eslint/eslint-plugin": "^6.16.0",
|
|
42
|
+
"@typescript-eslint/parser": "^6.16.0",
|
|
43
|
+
"eslint": "^8.56.0",
|
|
45
44
|
"husky": "4",
|
|
46
|
-
"jest": "^28.1.3",
|
|
47
45
|
"npm-run-all": "^4.1.5",
|
|
48
|
-
"rimraf": "^
|
|
46
|
+
"rimraf": "^5.0.5",
|
|
49
47
|
"standard-version": "^9.5.0",
|
|
50
|
-
"ts-
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"yarn-deduplicate": "^5.0.0"
|
|
48
|
+
"ts-patch": "^3.1.1",
|
|
49
|
+
"typescript": "^5.3.3",
|
|
50
|
+
"typescript-transform-paths": "^3.4.6",
|
|
51
|
+
"vite": "^5.0.10",
|
|
52
|
+
"vite-tsconfig-paths": "^4.2.2",
|
|
53
|
+
"vitest": "^1.1.0",
|
|
54
|
+
"yarn-deduplicate": "^6.0.2"
|
|
58
55
|
},
|
|
59
56
|
"dependencies": {
|
|
60
|
-
"@blackglory/
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"extra-
|
|
67
|
-
"extra-
|
|
68
|
-
"
|
|
69
|
-
"extra-watcher": "^0.2.0",
|
|
70
|
-
"iterable-operator": "^1.2.0",
|
|
57
|
+
"@blackglory/prelude": "^0.3.4",
|
|
58
|
+
"chalk": "^5.3.0",
|
|
59
|
+
"commander": "^11.1.0",
|
|
60
|
+
"extra-filesystem": "^0.5.1",
|
|
61
|
+
"extra-logger": "^0.7.2",
|
|
62
|
+
"extra-promise": "^6.0.8",
|
|
63
|
+
"extra-utils": "^5.6.0",
|
|
64
|
+
"extra-watcher": "^0.2.2",
|
|
65
|
+
"iterable-operator": "^4.0.6",
|
|
71
66
|
"native-node-dns": "0.7.6",
|
|
72
67
|
"native-node-dns-packet": "0.1.5",
|
|
73
|
-
"patch-package": "^
|
|
74
|
-
"return-style": "^
|
|
68
|
+
"patch-package": "^8.0.0",
|
|
69
|
+
"return-style": "^3.0.1"
|
|
75
70
|
}
|
|
76
71
|
}
|