n8n-nodes-dns 0.1.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/LICENSE +21 -0
- package/README.md +186 -0
- package/dist/coverage/lcov-report/favicon.png +0 -0
- package/dist/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/dist/package.json +97 -0
- package/dist/src/credentials/DnsServerApi.credentials.d.ts +7 -0
- package/dist/src/credentials/DnsServerApi.credentials.js +30 -0
- package/dist/src/credentials/DnsServerApi.credentials.js.map +1 -0
- package/dist/src/credentials/dnsServerApi.svg +4 -0
- package/dist/src/nodes/DnsLookup/DnsLookup.node.d.ts +16 -0
- package/dist/src/nodes/DnsLookup/DnsLookup.node.js +222 -0
- package/dist/src/nodes/DnsLookup/DnsLookup.node.js.map +1 -0
- package/dist/src/nodes/DnsLookup/DnsLookup.node.json +33 -0
- package/dist/src/nodes/DnsLookup/dnsLookup.svg +4 -0
- package/dist/src/nodes/DnsWatch/DnsWatch.node.d.ts +15 -0
- package/dist/src/nodes/DnsWatch/DnsWatch.node.js +247 -0
- package/dist/src/nodes/DnsWatch/DnsWatch.node.js.map +1 -0
- package/dist/src/nodes/DnsWatch/DnsWatch.node.json +26 -0
- package/dist/src/nodes/DnsWatch/dnsWatch.svg +4 -0
- package/dist/src/nodes/shared/dns-node-helpers.d.ts +43 -0
- package/dist/src/nodes/shared/dns-node-helpers.js +133 -0
- package/dist/src/nodes/shared/dns-node-helpers.js.map +1 -0
- package/dist/src/nodes/shared/dns-node-properties.d.ts +6 -0
- package/dist/src/nodes/shared/dns-node-properties.js +139 -0
- package/dist/src/nodes/shared/dns-node-properties.js.map +1 -0
- package/dist/src/transport/dns-client.d.ts +22 -0
- package/dist/src/transport/dns-client.js +168 -0
- package/dist/src/transport/dns-client.js.map +1 -0
- package/dist/src/transport/dns-packet.d.ts +49 -0
- package/dist/src/transport/dns-packet.js +178 -0
- package/dist/src/transport/dns-packet.js.map +1 -0
- package/dist/src/transport/dns-resolvers.d.ts +18 -0
- package/dist/src/transport/dns-resolvers.js +132 -0
- package/dist/src/transport/dns-resolvers.js.map +1 -0
- package/dist/src/transport/index.d.ts +6 -0
- package/dist/src/transport/index.js +21 -0
- package/dist/src/transport/index.js.map +1 -0
- package/dist/src/utils/authoritative-discovery.d.ts +9 -0
- package/dist/src/utils/authoritative-discovery.js +77 -0
- package/dist/src/utils/authoritative-discovery.js.map +1 -0
- package/dist/src/utils/index.d.ts +8 -0
- package/dist/src/utils/index.js +13 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/name-compression.d.ts +5 -0
- package/dist/src/utils/name-compression.js +63 -0
- package/dist/src/utils/name-compression.js.map +1 -0
- package/dist/src/utils/record-parsers.d.ts +53 -0
- package/dist/src/utils/record-parsers.js +232 -0
- package/dist/src/utils/record-parsers.js.map +1 -0
- package/dist/src/utils/txt-parsers.d.ts +40 -0
- package/dist/src/utils/txt-parsers.js +204 -0
- package/dist/src/utils/txt-parsers.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +97 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Claas Busemann
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# n8n-nodes-dns
|
|
2
|
+
|
|
3
|
+
An [n8n](https://n8n.io/) community node for raw DNS queries using the [DNS wire protocol](https://datatracker.ietf.org/doc/html/rfc1035) (RFC 1035). Query any record type against well-known public resolvers, custom servers, or auto-discovered authoritative nameservers — with built-in propagation checking and TXT record parsing for SPF, DMARC, and DKIM.
|
|
4
|
+
|
|
5
|
+
[n8n](https://n8n.io/) is a [fair-code licensed](https://docs.n8n.io/sustainable-use-license/) workflow automation platform.
|
|
6
|
+
|
|
7
|
+
[Installation](#installation) | [Operations](#operations) | [Credentials](#credentials) | [Compatibility](#compatibility) | [Resources](#resources)
|
|
8
|
+
|
|
9
|
+
## Why this node?
|
|
10
|
+
|
|
11
|
+
There is no built-in n8n node for raw DNS queries. The Node.js `dns` module (accessible via the Code node) delegates to the system resolver and hides critical information — you can't choose which nameserver to query, don't get TTL values, can't see authority sections, and can't query multiple resolvers in parallel.
|
|
12
|
+
|
|
13
|
+
Common workarounds have significant drawbacks:
|
|
14
|
+
|
|
15
|
+
- **Execute Command + `dig`** — fragile text parsing, unavailable on n8n Cloud
|
|
16
|
+
- **HTTP Request + Google DoH** — requires 7+ nodes for what should be one operation, locked to a single resolver, no propagation checking
|
|
17
|
+
- **Third-party APIs** — paid services with no control over which resolver is queried
|
|
18
|
+
|
|
19
|
+
This node replaces all of that with a single node that speaks the DNS wire protocol directly, returning structured JSON with full control over which servers to query.
|
|
20
|
+
|
|
21
|
+
## Features
|
|
22
|
+
|
|
23
|
+
- **13 record types** — A, AAAA, MX, TXT, SRV, PTR, CAA, SOA, NS, CNAME, NAPTR, DNSKEY, TLSA
|
|
24
|
+
- **Four resolver modes** — well-known public resolvers, custom servers, authoritative (auto-discover via NS delegation), system (`/etc/resolv.conf`)
|
|
25
|
+
- **9 well-known resolvers** — Cloudflare, Google, Quad9, Quad9 Unfiltered, OpenDNS, Cloudflare Malware, Cloudflare Family, AdGuard, Control D
|
|
26
|
+
- **Multi-server parallel dispatch** — query multiple resolvers concurrently using `Promise.allSettled`, one slow server never blocks others
|
|
27
|
+
- **Propagation monitoring** — compare answers across resolvers with `consistent` and `propagatedToAll` flags, designed for downstream IF nodes
|
|
28
|
+
- **TXT record parsing** — automatic structured parsing of SPF, DMARC, DKIM, and verification tokens (Google, Microsoft, Facebook, Stripe, Atlassian, Apple, GitHub Pages, Postmark)
|
|
29
|
+
- **DNS Watch trigger** — poll for DNS record changes with configurable fire conditions: any change, record appears, record disappears, value matches
|
|
30
|
+
- **Authoritative discovery** — auto-discover authoritative nameservers by walking the NS delegation chain, with glue record optimization
|
|
31
|
+
- **DNS response codes as data** — NXDOMAIN, SERVFAIL, REFUSED are returned as structured output (not exceptions), enabling domain-existence monitoring
|
|
32
|
+
- **Configurable timeout and retry** — per-query timeout (default 5000ms) and retry count (default 1)
|
|
33
|
+
- **Truncated response handling** — responses with the TC flag include a `truncated: true` field
|
|
34
|
+
- **Item linking** — correct `pairedItem` on every output for n8n expression support in downstream nodes
|
|
35
|
+
- **Pure wire protocol** — zero external runtime dependencies, implements RFC 1035 from scratch using only Node.js built-ins (`dgram`, `crypto`, `Buffer`)
|
|
36
|
+
- **AI agent integration** — `usableAsTool` enabled on both nodes for use in n8n AI workflows
|
|
37
|
+
- **Continue on fail** — standard n8n error handling support
|
|
38
|
+
|
|
39
|
+
## Installation
|
|
40
|
+
|
|
41
|
+
Follow the [installation guide](https://docs.n8n.io/integrations/community-nodes/installation/) in the n8n community nodes documentation.
|
|
42
|
+
|
|
43
|
+
## Operations
|
|
44
|
+
|
|
45
|
+
### DNS Lookup
|
|
46
|
+
|
|
47
|
+
Perform raw DNS queries using the DNS wire protocol.
|
|
48
|
+
|
|
49
|
+
| Parameter | Description |
|
|
50
|
+
|-----------|-------------|
|
|
51
|
+
| **Domain** | The domain name to query (expression-enabled for per-item resolution) |
|
|
52
|
+
| **Record Type** | A, AAAA, MX, TXT, SRV, PTR, CAA, SOA, NS, CNAME, NAPTR, DNSKEY, TLSA |
|
|
53
|
+
| **Resolver Mode** | Well-Known, Custom, Authoritative (auto-discover), System |
|
|
54
|
+
| **Resolvers** | Select one or more: Cloudflare, Cloudflare Malware, Cloudflare Family, Google, Quad9, Quad9 Unfiltered, OpenDNS, AdGuard, Control D |
|
|
55
|
+
| **Custom Servers** | Repeatable IP/port pairs (visible when Resolver Mode = Custom) |
|
|
56
|
+
| **Options** | Output consistency check, timeout, retry count, recursion desired |
|
|
57
|
+
|
|
58
|
+
### DNS Watch
|
|
59
|
+
|
|
60
|
+
Watch for DNS record changes by polling. Supports all the same parameters as DNS Lookup, plus:
|
|
61
|
+
|
|
62
|
+
| Parameter | Description |
|
|
63
|
+
|-----------|-------------|
|
|
64
|
+
| **Fire On** | Any Change, Record Appears, Record Disappears, Value Matches |
|
|
65
|
+
| **Expected Value** | Value to match when using "Value Matches" mode (supports JSON for complex records like MX/SRV) |
|
|
66
|
+
|
|
67
|
+
## Credentials
|
|
68
|
+
|
|
69
|
+
### DNS Server (optional)
|
|
70
|
+
|
|
71
|
+
Store a reusable DNS server configuration. This credential is optional — if not configured, the node uses the selected resolver mode. DNS has no authentication mechanism, so no token or password is needed.
|
|
72
|
+
|
|
73
|
+
| Field | Required | Description |
|
|
74
|
+
|-------|----------|-------------|
|
|
75
|
+
| Server | Yes | IP address or hostname of the DNS server |
|
|
76
|
+
| Port | No | UDP port of the DNS server (default: 53) |
|
|
77
|
+
|
|
78
|
+
## Output Format
|
|
79
|
+
|
|
80
|
+
### Single Server
|
|
81
|
+
|
|
82
|
+
When querying a single server, each input item produces one output item:
|
|
83
|
+
|
|
84
|
+
```json
|
|
85
|
+
{
|
|
86
|
+
"domain": "example.com",
|
|
87
|
+
"type": "A",
|
|
88
|
+
"server": "1.1.1.1",
|
|
89
|
+
"serverName": "Cloudflare",
|
|
90
|
+
"authoritative": false,
|
|
91
|
+
"responseCode": "NOERROR",
|
|
92
|
+
"responseTimeMs": 12,
|
|
93
|
+
"answers": [
|
|
94
|
+
{ "name": "example.com", "type": "A", "ttl": 3542, "value": "93.184.216.34" }
|
|
95
|
+
],
|
|
96
|
+
"authority": [],
|
|
97
|
+
"additional": []
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Multiple Servers
|
|
102
|
+
|
|
103
|
+
When querying multiple servers, the output is one combined item per input with consistency flags:
|
|
104
|
+
|
|
105
|
+
```json
|
|
106
|
+
{
|
|
107
|
+
"domain": "example.com",
|
|
108
|
+
"type": "A",
|
|
109
|
+
"results": [
|
|
110
|
+
{ "server": "1.1.1.1", "serverName": "Cloudflare", "answers": [...], "responseTimeMs": 12 },
|
|
111
|
+
{ "server": "8.8.8.8", "serverName": "Google", "answers": [...], "responseTimeMs": 18 }
|
|
112
|
+
],
|
|
113
|
+
"consistent": true,
|
|
114
|
+
"propagatedToAll": true,
|
|
115
|
+
"serverCount": 2,
|
|
116
|
+
"uniqueAnswers": 1
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Record Type Values
|
|
121
|
+
|
|
122
|
+
| Type | Value Format |
|
|
123
|
+
|------|-------------|
|
|
124
|
+
| A / AAAA | Plain IP string |
|
|
125
|
+
| MX | `{ "priority": 10, "exchange": "mail.example.com" }` |
|
|
126
|
+
| TXT | `{ "raw": "v=spf1 ...", "parsed": { ... } }` — parsed when SPF, DMARC, DKIM, or verification token detected |
|
|
127
|
+
| SRV | `{ "priority": 10, "weight": 60, "port": 5060, "target": "sip.example.com" }` |
|
|
128
|
+
| SOA | `{ "mname": "...", "rname": "...", "serial": 2024010101, ... }` |
|
|
129
|
+
| NS / CNAME / PTR | Plain hostname string |
|
|
130
|
+
| CAA | `{ "flags": 0, "tag": "issue", "value": "letsencrypt.org" }` |
|
|
131
|
+
| NAPTR | `{ "order": 10, "preference": 100, "flags": "s", "service": "SIP+D2U", ... }` |
|
|
132
|
+
| DNSKEY | `{ "flags": 256, "protocol": 3, "algorithm": 13, "publicKey": "base64..." }` |
|
|
133
|
+
| TLSA | `{ "usage": 3, "selector": 1, "matchingType": 1, "certificateData": "hex..." }` |
|
|
134
|
+
|
|
135
|
+
## Compatibility
|
|
136
|
+
|
|
137
|
+
- **Minimum n8n version:** 1.71.0 (`n8nNodesApiVersion` 1)
|
|
138
|
+
|
|
139
|
+
## Development
|
|
140
|
+
|
|
141
|
+
### Prerequisites
|
|
142
|
+
|
|
143
|
+
- Node.js 22+
|
|
144
|
+
- [just](https://github.com/casey/just) command runner
|
|
145
|
+
|
|
146
|
+
### Commands
|
|
147
|
+
|
|
148
|
+
| Recipe | Description |
|
|
149
|
+
|--------|-------------|
|
|
150
|
+
| `just build` | Compile TypeScript to `dist/` |
|
|
151
|
+
| `just dev` | Watch mode — starts local n8n with the node loaded |
|
|
152
|
+
| `just lint` | Run the n8n node linter |
|
|
153
|
+
| `just lint-fix` | Lint and auto-fix |
|
|
154
|
+
| `just format` | Run Prettier |
|
|
155
|
+
| `just format-check` | Check formatting without writing |
|
|
156
|
+
| `just test` | Run unit + integration tests |
|
|
157
|
+
| `just test-unit` | Run unit tests only |
|
|
158
|
+
| `just test-int` | Run integration tests (uses in-process DNS server) |
|
|
159
|
+
| `just test-e2e` | Run e2e tests (uses in-process DNS server) |
|
|
160
|
+
| `just test-all` | Run all test suites |
|
|
161
|
+
| `just test-coverage` | Unit + integration with coverage enforcement |
|
|
162
|
+
| `just check` | Full pre-publish check: lint + format + tests + build + verify |
|
|
163
|
+
| `just verify` | Run the n8n community package scanner |
|
|
164
|
+
|
|
165
|
+
### Test Suites
|
|
166
|
+
|
|
167
|
+
- **Unit tests** (`test/unit/`) — transport layer, record parsers, name compression, TXT parsers
|
|
168
|
+
- **Integration tests** (`test/integration/`) — DNS client and resolver queries with in-process DNS server
|
|
169
|
+
- **E2E tests** (`test/e2e/`) — full node execution for Lookup and Watch nodes
|
|
170
|
+
|
|
171
|
+
## Design & Planning
|
|
172
|
+
|
|
173
|
+
See [DESIGN.md](DESIGN.md) for architecture docs, epics, and stories.
|
|
174
|
+
|
|
175
|
+
## Resources
|
|
176
|
+
|
|
177
|
+
- [n8n community nodes documentation](https://docs.n8n.io/integrations/#community-nodes)
|
|
178
|
+
- [DNS wire protocol — RFC 1035](https://datatracker.ietf.org/doc/html/rfc1035)
|
|
179
|
+
|
|
180
|
+
## Version History
|
|
181
|
+
|
|
182
|
+
See [CHANGELOG.md](CHANGELOG.md).
|
|
183
|
+
|
|
184
|
+
## License
|
|
185
|
+
|
|
186
|
+
[MIT](LICENSE)
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "n8n-nodes-dns",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "n8n community node for raw DNS queries using the DNS wire protocol (RFC 1035)",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"homepage": "https://github.com/ClaasBusemann/n8n-nodes-dns",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"n8n-community-node-package",
|
|
9
|
+
"n8n-nodes-dns",
|
|
10
|
+
"n8n",
|
|
11
|
+
"dns",
|
|
12
|
+
"dns-lookup",
|
|
13
|
+
"dns-query",
|
|
14
|
+
"dns-records",
|
|
15
|
+
"dns-wire-protocol",
|
|
16
|
+
"rfc1035",
|
|
17
|
+
"nameserver",
|
|
18
|
+
"domain",
|
|
19
|
+
"propagation",
|
|
20
|
+
"dnsbl",
|
|
21
|
+
"spf",
|
|
22
|
+
"dmarc",
|
|
23
|
+
"dkim",
|
|
24
|
+
"email-security",
|
|
25
|
+
"a-record",
|
|
26
|
+
"aaaa-record",
|
|
27
|
+
"mx-record",
|
|
28
|
+
"cname-record",
|
|
29
|
+
"txt-record",
|
|
30
|
+
"srv-record",
|
|
31
|
+
"ptr-record",
|
|
32
|
+
"soa-record",
|
|
33
|
+
"ns-record",
|
|
34
|
+
"network",
|
|
35
|
+
"monitoring"
|
|
36
|
+
],
|
|
37
|
+
"author": {
|
|
38
|
+
"name": "Claas Busemann",
|
|
39
|
+
"email": "claas.busemann@maibornwolff.de"
|
|
40
|
+
},
|
|
41
|
+
"repository": {
|
|
42
|
+
"type": "git",
|
|
43
|
+
"url": "https://github.com/ClaasBusemann/n8n-nodes-dns.git"
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "n8n-node build",
|
|
47
|
+
"build:watch": "tsc --watch",
|
|
48
|
+
"dev": "n8n-node dev",
|
|
49
|
+
"lint": "rm -rf coverage && n8n-node lint",
|
|
50
|
+
"lint:fix": "n8n-node lint --fix",
|
|
51
|
+
"prepare": "husky",
|
|
52
|
+
"release": "n8n-node release",
|
|
53
|
+
"prepublishOnly": "n8n-node prerelease",
|
|
54
|
+
"test": "jest",
|
|
55
|
+
"test:unit": "jest --testPathPatterns=test/unit",
|
|
56
|
+
"test:integration": "jest --testPathPatterns=test/integration",
|
|
57
|
+
"test:coverage": "jest --coverage"
|
|
58
|
+
},
|
|
59
|
+
"files": [
|
|
60
|
+
"dist"
|
|
61
|
+
],
|
|
62
|
+
"n8n": {
|
|
63
|
+
"n8nNodesApiVersion": 1,
|
|
64
|
+
"strict": true,
|
|
65
|
+
"credentials": [
|
|
66
|
+
"dist/src/credentials/DnsServerApi.credentials.js"
|
|
67
|
+
],
|
|
68
|
+
"nodes": [
|
|
69
|
+
"dist/src/nodes/DnsLookup/DnsLookup.node.js",
|
|
70
|
+
"dist/src/nodes/DnsWatch/DnsWatch.node.js"
|
|
71
|
+
]
|
|
72
|
+
},
|
|
73
|
+
"devDependencies": {
|
|
74
|
+
"@n8n/node-cli": "*",
|
|
75
|
+
"@types/jest": "^30.0.0",
|
|
76
|
+
"eslint": "9.32.0",
|
|
77
|
+
"husky": "^9.1.7",
|
|
78
|
+
"jest": "^30.3.0",
|
|
79
|
+
"lint-staged": "^16.4.0",
|
|
80
|
+
"prettier": "3.6.2",
|
|
81
|
+
"release-it": "^19.0.4",
|
|
82
|
+
"ts-jest": "^29.4.6",
|
|
83
|
+
"typescript": "5.9.2"
|
|
84
|
+
},
|
|
85
|
+
"peerDependencies": {
|
|
86
|
+
"n8n-workflow": "*"
|
|
87
|
+
},
|
|
88
|
+
"lint-staged": {
|
|
89
|
+
"*.ts": [
|
|
90
|
+
"eslint --fix",
|
|
91
|
+
"prettier --write"
|
|
92
|
+
],
|
|
93
|
+
"package.json": [
|
|
94
|
+
"eslint --fix"
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DnsServerApi = void 0;
|
|
4
|
+
class DnsServerApi {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.name = 'dnsServerApi';
|
|
7
|
+
this.displayName = 'DNS Server';
|
|
8
|
+
this.icon = 'file:dnsServerApi.svg';
|
|
9
|
+
this.properties = [
|
|
10
|
+
{
|
|
11
|
+
displayName: 'Server',
|
|
12
|
+
name: 'server',
|
|
13
|
+
type: 'string',
|
|
14
|
+
required: true,
|
|
15
|
+
default: '',
|
|
16
|
+
placeholder: '1.1.1.1',
|
|
17
|
+
description: 'IP address or hostname of the DNS server',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
displayName: 'Port',
|
|
21
|
+
name: 'port',
|
|
22
|
+
type: 'number',
|
|
23
|
+
default: 53,
|
|
24
|
+
description: 'UDP port of the DNS server',
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.DnsServerApi = DnsServerApi;
|
|
30
|
+
//# sourceMappingURL=DnsServerApi.credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DnsServerApi.credentials.js","sourceRoot":"","sources":["../../../src/credentials/DnsServerApi.credentials.ts"],"names":[],"mappings":";;;AAGA,MAAa,YAAY;IAAzB;QACC,SAAI,GAAG,cAAc,CAAC;QACtB,gBAAW,GAAG,YAAY,CAAC;QAC3B,SAAI,GAAG,uBAAgC,CAAC;QACxC,eAAU,GAAsB;YAC/B;gBACC,WAAW,EAAE,QAAQ;gBACrB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,SAAS;gBACtB,WAAW,EAAE,0CAA0C;aACvD;YACD;gBACC,WAAW,EAAE,MAAM;gBACnB,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE;gBACX,WAAW,EAAE,4BAA4B;aACzC;SACD,CAAC;IACH,CAAC;CAAA;AAtBD,oCAsBC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none">
|
|
2
|
+
<circle cx="12" cy="12" r="10" stroke="#4DA6FF" stroke-width="2" fill="#4DA6FF" fill-opacity="0.15"/>
|
|
3
|
+
<text x="12" y="16" text-anchor="middle" font-size="10" font-weight="bold" font-family="sans-serif" fill="#4DA6FF" stroke="none">D</text>
|
|
4
|
+
</svg>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
|
|
2
|
+
import type { DnsServerResult } from '../../transport';
|
|
3
|
+
import type { FormattedRecord, ServerResultEntry } from '../shared/dns-node-helpers';
|
|
4
|
+
import { buildClientOptions, buildSingleServerOutput, extractCustomServers, formatServerResult, serializeAnswerValues } from '../shared/dns-node-helpers';
|
|
5
|
+
export type { FormattedRecord, ServerResultEntry };
|
|
6
|
+
export { buildClientOptions, buildSingleServerOutput, extractCustomServers, formatServerResult, serializeAnswerValues, };
|
|
7
|
+
export declare function computeConsistencyFlags(entries: ServerResultEntry[]): {
|
|
8
|
+
consistent: boolean;
|
|
9
|
+
propagatedToAll: boolean;
|
|
10
|
+
uniqueAnswers: number;
|
|
11
|
+
};
|
|
12
|
+
export declare function buildMultiServerOutput(domain: string, recordType: string, results: DnsServerResult[], consistencyCheck: boolean): Record<string, unknown>;
|
|
13
|
+
export declare class DnsLookup implements INodeType {
|
|
14
|
+
description: INodeTypeDescription;
|
|
15
|
+
execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DnsLookup = exports.serializeAnswerValues = exports.formatServerResult = exports.extractCustomServers = exports.buildSingleServerOutput = exports.buildClientOptions = void 0;
|
|
4
|
+
exports.computeConsistencyFlags = computeConsistencyFlags;
|
|
5
|
+
exports.buildMultiServerOutput = buildMultiServerOutput;
|
|
6
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
7
|
+
const transport_1 = require("../../transport");
|
|
8
|
+
const dns_node_helpers_1 = require("../shared/dns-node-helpers");
|
|
9
|
+
Object.defineProperty(exports, "buildClientOptions", { enumerable: true, get: function () { return dns_node_helpers_1.buildClientOptions; } });
|
|
10
|
+
Object.defineProperty(exports, "buildSingleServerOutput", { enumerable: true, get: function () { return dns_node_helpers_1.buildSingleServerOutput; } });
|
|
11
|
+
Object.defineProperty(exports, "extractCustomServers", { enumerable: true, get: function () { return dns_node_helpers_1.extractCustomServers; } });
|
|
12
|
+
Object.defineProperty(exports, "formatServerResult", { enumerable: true, get: function () { return dns_node_helpers_1.formatServerResult; } });
|
|
13
|
+
Object.defineProperty(exports, "serializeAnswerValues", { enumerable: true, get: function () { return dns_node_helpers_1.serializeAnswerValues; } });
|
|
14
|
+
const dns_node_properties_1 = require("../shared/dns-node-properties");
|
|
15
|
+
function computeConsistencyFlags(entries) {
|
|
16
|
+
const answerSets = entries.map((entry) => (0, dns_node_helpers_1.serializeAnswerValues)(entry.answers));
|
|
17
|
+
const uniqueSet = new Set(answerSets);
|
|
18
|
+
const consistent = uniqueSet.size <= 1;
|
|
19
|
+
const authoritativeEntries = entries.filter((entry) => entry.authoritative);
|
|
20
|
+
let propagatedToAll = consistent;
|
|
21
|
+
if (authoritativeEntries.length > 0) {
|
|
22
|
+
const authAnswerSet = (0, dns_node_helpers_1.serializeAnswerValues)(authoritativeEntries[0].answers);
|
|
23
|
+
const nonAuthEntries = entries.filter((entry) => !entry.authoritative);
|
|
24
|
+
propagatedToAll = nonAuthEntries.every((entry) => (0, dns_node_helpers_1.serializeAnswerValues)(entry.answers) === authAnswerSet);
|
|
25
|
+
}
|
|
26
|
+
return { consistent, propagatedToAll, uniqueAnswers: uniqueSet.size };
|
|
27
|
+
}
|
|
28
|
+
function buildMultiServerOutput(domain, recordType, results, consistencyCheck) {
|
|
29
|
+
const entries = results.map(dns_node_helpers_1.formatServerResult);
|
|
30
|
+
const output = {
|
|
31
|
+
domain,
|
|
32
|
+
type: recordType,
|
|
33
|
+
results: entries,
|
|
34
|
+
};
|
|
35
|
+
if (consistencyCheck) {
|
|
36
|
+
const flags = computeConsistencyFlags(entries);
|
|
37
|
+
output.consistent = flags.consistent;
|
|
38
|
+
output.propagatedToAll = flags.propagatedToAll;
|
|
39
|
+
output.serverCount = results.length;
|
|
40
|
+
output.uniqueAnswers = flags.uniqueAnswers;
|
|
41
|
+
}
|
|
42
|
+
return output;
|
|
43
|
+
}
|
|
44
|
+
class DnsLookup {
|
|
45
|
+
constructor() {
|
|
46
|
+
this.description = {
|
|
47
|
+
displayName: 'DNS Lookup',
|
|
48
|
+
name: 'dnsLookup',
|
|
49
|
+
icon: 'file:dnsLookup.svg',
|
|
50
|
+
group: ['input'],
|
|
51
|
+
version: [1],
|
|
52
|
+
subtitle: '={{$parameter["recordType"] + " lookup"}}',
|
|
53
|
+
description: 'Perform raw DNS queries using the DNS wire protocol',
|
|
54
|
+
defaults: {
|
|
55
|
+
name: 'DNS Lookup',
|
|
56
|
+
},
|
|
57
|
+
inputs: [n8n_workflow_1.NodeConnectionTypes.Main],
|
|
58
|
+
outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
|
|
59
|
+
usableAsTool: true,
|
|
60
|
+
credentials: [
|
|
61
|
+
{
|
|
62
|
+
name: 'dnsServerApi',
|
|
63
|
+
required: false,
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
properties: [
|
|
67
|
+
{
|
|
68
|
+
displayName: 'Domain',
|
|
69
|
+
name: 'domain',
|
|
70
|
+
type: 'string',
|
|
71
|
+
required: true,
|
|
72
|
+
default: '',
|
|
73
|
+
placeholder: 'example.com',
|
|
74
|
+
description: 'The domain name to query',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
displayName: 'Record Type',
|
|
78
|
+
name: 'recordType',
|
|
79
|
+
type: 'options',
|
|
80
|
+
noDataExpression: true,
|
|
81
|
+
options: dns_node_properties_1.RECORD_TYPE_OPTIONS,
|
|
82
|
+
default: 'A',
|
|
83
|
+
description: 'The DNS record type to query',
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
displayName: 'Resolver Mode',
|
|
87
|
+
name: 'resolverMode',
|
|
88
|
+
type: 'options',
|
|
89
|
+
noDataExpression: true,
|
|
90
|
+
options: dns_node_properties_1.RESOLVER_MODE_OPTIONS,
|
|
91
|
+
default: 'wellKnown',
|
|
92
|
+
description: 'How to select the DNS servers to query',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
displayName: 'Resolvers',
|
|
96
|
+
name: 'resolvers',
|
|
97
|
+
type: 'multiOptions',
|
|
98
|
+
displayOptions: {
|
|
99
|
+
show: {
|
|
100
|
+
resolverMode: ['wellKnown'],
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
options: dns_node_properties_1.WELL_KNOWN_RESOLVER_OPTIONS,
|
|
104
|
+
default: ['Cloudflare'],
|
|
105
|
+
description: 'Public DNS resolvers to query (each resolver uses both primary and secondary servers)',
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
displayName: 'Custom Servers',
|
|
109
|
+
name: 'customServers',
|
|
110
|
+
type: 'fixedCollection',
|
|
111
|
+
typeOptions: {
|
|
112
|
+
multipleValues: true,
|
|
113
|
+
},
|
|
114
|
+
displayOptions: {
|
|
115
|
+
show: {
|
|
116
|
+
resolverMode: ['custom'],
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
default: {},
|
|
120
|
+
placeholder: 'Add Server',
|
|
121
|
+
options: [
|
|
122
|
+
{
|
|
123
|
+
name: 'serverValues',
|
|
124
|
+
displayName: 'Server',
|
|
125
|
+
values: dns_node_properties_1.CUSTOM_SERVER_FIELD_VALUES,
|
|
126
|
+
},
|
|
127
|
+
],
|
|
128
|
+
description: 'Custom DNS servers to query',
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
displayName: 'Options',
|
|
132
|
+
name: 'options',
|
|
133
|
+
type: 'collection',
|
|
134
|
+
placeholder: 'Add Option',
|
|
135
|
+
default: {},
|
|
136
|
+
options: [
|
|
137
|
+
{
|
|
138
|
+
displayName: 'Output Consistency Check',
|
|
139
|
+
name: 'outputConsistencyCheck',
|
|
140
|
+
type: 'boolean',
|
|
141
|
+
default: true,
|
|
142
|
+
description: 'Whether to add consistency and propagation flags when querying multiple servers',
|
|
143
|
+
},
|
|
144
|
+
...dns_node_properties_1.COMMON_DNS_OPTIONS,
|
|
145
|
+
],
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
async execute() {
|
|
151
|
+
const items = this.getInputData();
|
|
152
|
+
const returnData = [];
|
|
153
|
+
for (let itemIndex = 0; itemIndex < items.length; itemIndex++) {
|
|
154
|
+
try {
|
|
155
|
+
const domain = this.getNodeParameter('domain', itemIndex);
|
|
156
|
+
const recordType = this.getNodeParameter('recordType', itemIndex);
|
|
157
|
+
const resolverMode = this.getNodeParameter('resolverMode', itemIndex);
|
|
158
|
+
const options = this.getNodeParameter('options', itemIndex, {});
|
|
159
|
+
const clientOptions = (0, dns_node_helpers_1.buildClientOptions)(options);
|
|
160
|
+
const wellKnownNames = resolverMode === 'wellKnown'
|
|
161
|
+
? this.getNodeParameter('resolvers', itemIndex)
|
|
162
|
+
: [];
|
|
163
|
+
const customServers = resolverMode === 'custom'
|
|
164
|
+
? (0, dns_node_helpers_1.extractCustomServers)(this.getNodeParameter('customServers', itemIndex, {}))
|
|
165
|
+
: [];
|
|
166
|
+
const servers = await (0, dns_node_helpers_1.resolveTargetDnsServers)({
|
|
167
|
+
mode: resolverMode,
|
|
168
|
+
wellKnownNames,
|
|
169
|
+
customServers,
|
|
170
|
+
domain,
|
|
171
|
+
clientOptions,
|
|
172
|
+
});
|
|
173
|
+
if (servers.length === 0) {
|
|
174
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), `No DNS servers resolved for mode "${resolverMode}"`, { itemIndex });
|
|
175
|
+
}
|
|
176
|
+
const isSingleServer = servers.length === 1;
|
|
177
|
+
let outputJson;
|
|
178
|
+
if (isSingleServer) {
|
|
179
|
+
const result = await (0, transport_1.querySingleServer)(domain, recordType, servers[0], clientOptions);
|
|
180
|
+
(0, dns_node_helpers_1.assertNotFormerr)(result, domain, this.getNode(), itemIndex);
|
|
181
|
+
if ((0, dns_node_helpers_1.isWarnableResponseCode)(result.responseCode)) {
|
|
182
|
+
this.addExecutionHints({
|
|
183
|
+
message: (0, dns_node_helpers_1.buildWarningMessage)(domain, result.server.address, result.responseCode),
|
|
184
|
+
type: 'warning',
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
outputJson = (0, dns_node_helpers_1.buildSingleServerOutput)(domain, recordType, result);
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
const queryResult = await (0, transport_1.queryMultipleServers)(domain, recordType, servers, clientOptions);
|
|
191
|
+
for (const result of queryResult.results) {
|
|
192
|
+
(0, dns_node_helpers_1.assertNotFormerr)(result, domain, this.getNode(), itemIndex);
|
|
193
|
+
}
|
|
194
|
+
const warnings = (0, dns_node_helpers_1.collectResponseWarnings)(queryResult.results, domain);
|
|
195
|
+
for (const warning of warnings) {
|
|
196
|
+
this.addExecutionHints({ message: warning, type: 'warning' });
|
|
197
|
+
}
|
|
198
|
+
const consistencyCheck = options.outputConsistencyCheck !== false;
|
|
199
|
+
outputJson = buildMultiServerOutput(domain, recordType, queryResult.results, consistencyCheck);
|
|
200
|
+
}
|
|
201
|
+
const wrappedItems = this.helpers.constructExecutionMetaData([{ json: outputJson }], {
|
|
202
|
+
itemData: { item: itemIndex },
|
|
203
|
+
});
|
|
204
|
+
returnData.push(...wrappedItems);
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
if (this.continueOnFail()) {
|
|
208
|
+
const errorItems = this.helpers.constructExecutionMetaData([{ json: { error: error.message } }], { itemData: { item: itemIndex } });
|
|
209
|
+
returnData.push(...errorItems);
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
if (error instanceof n8n_workflow_1.NodeOperationError) {
|
|
213
|
+
throw error;
|
|
214
|
+
}
|
|
215
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), error, { itemIndex });
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return [returnData];
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
exports.DnsLookup = DnsLookup;
|
|
222
|
+
//# sourceMappingURL=DnsLookup.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DnsLookup.node.js","sourceRoot":"","sources":["../../../../src/nodes/DnsLookup/DnsLookup.node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"node": "n8n-nodes-dns.dnsLookup",
|
|
3
|
+
"nodeVersion": "1.0",
|
|
4
|
+
"codexVersion": "1.0",
|
|
5
|
+
"categories": ["Utility"],
|
|
6
|
+
"alias": [
|
|
7
|
+
"dns",
|
|
8
|
+
"domain",
|
|
9
|
+
"nameserver",
|
|
10
|
+
"nslookup",
|
|
11
|
+
"dig",
|
|
12
|
+
"whois",
|
|
13
|
+
"propagation",
|
|
14
|
+
"dnsbl",
|
|
15
|
+
"spf",
|
|
16
|
+
"dmarc",
|
|
17
|
+
"dkim",
|
|
18
|
+
"mx",
|
|
19
|
+
"txt",
|
|
20
|
+
"cname",
|
|
21
|
+
"srv"
|
|
22
|
+
],
|
|
23
|
+
"resources": {
|
|
24
|
+
"primaryDocumentation": [
|
|
25
|
+
{
|
|
26
|
+
"url": "https://github.com/ClaasBusemann/n8n-nodes-dns?tab=readme-ov-file"
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
"subcategories": {
|
|
31
|
+
"Utility": ["DNS"]
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="none">
|
|
2
|
+
<circle cx="12" cy="12" r="10" stroke="#4DA6FF" stroke-width="2" fill="#4DA6FF" fill-opacity="0.15"/>
|
|
3
|
+
<text x="12" y="16" text-anchor="middle" font-size="10" font-weight="bold" font-family="sans-serif" fill="#4DA6FF" stroke="none">D</text>
|
|
4
|
+
</svg>
|