pmcf 1.44.1 → 1.45.1
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/bin/pmcf-host-defs +1 -1
- package/bin/pmcf-named-defs +24 -25
- package/package.json +1 -1
- package/src/host.mjs +40 -33
- package/src/location.mjs +2 -1
- package/src/owner.mjs +7 -1
- package/src/service.mjs +1 -1
- package/src/utils.mjs +5 -0
- package/types/host.d.mts +14 -11
- package/types/location.d.mts +3 -0
- package/types/utils.d.mts +1 -0
package/bin/pmcf-host-defs
CHANGED
|
@@ -55,7 +55,7 @@ async function generateNetworkDefs(host, dir) {
|
|
|
55
55
|
|
|
56
56
|
const networkSections = [sectionLines("Match", { Name: ni.name })];
|
|
57
57
|
|
|
58
|
-
for (const Address of ni.
|
|
58
|
+
for (const Address of ni.cidrAddresses) {
|
|
59
59
|
networkSections.push(
|
|
60
60
|
"",
|
|
61
61
|
sectionLines("Address", {
|
package/bin/pmcf-named-defs
CHANGED
|
@@ -69,6 +69,7 @@ async function generateNamedDefs(owner, targetDir) {
|
|
|
69
69
|
rname,
|
|
70
70
|
subnets.map(s => `${s.owner.name}/${s.name}`)
|
|
71
71
|
);
|
|
72
|
+
const reverseZones = new Map();
|
|
72
73
|
|
|
73
74
|
const SOARecord = createRecord(
|
|
74
75
|
"@",
|
|
@@ -78,7 +79,7 @@ async function generateNamedDefs(owner, targetDir) {
|
|
|
78
79
|
`(${updates})`
|
|
79
80
|
);
|
|
80
81
|
|
|
81
|
-
const NSRecord = createRecord("@", "NS", fullName(nameserver?.
|
|
82
|
+
const NSRecord = createRecord("@", "NS", fullName(nameserver?.rawAddress));
|
|
82
83
|
|
|
83
84
|
const catalogZone = {
|
|
84
85
|
id: `catalog.${domain}`,
|
|
@@ -97,23 +98,11 @@ async function generateNamedDefs(owner, targetDir) {
|
|
|
97
98
|
};
|
|
98
99
|
zones.push(zone);
|
|
99
100
|
|
|
100
|
-
for (const subnet of subnets) {
|
|
101
|
-
if (!subnet.isLinkLocal && subnet.prefix) {
|
|
102
|
-
const reverseArpa = reverseArpaAddress(subnet.prefix);
|
|
103
|
-
const reverseZone = {
|
|
104
|
-
id: reverseArpa,
|
|
105
|
-
file: `${reverseArpa}.zone`,
|
|
106
|
-
records: new Set([SOARecord, NSRecord])
|
|
107
|
-
};
|
|
108
|
-
zones.push(reverseZone);
|
|
109
|
-
subnet.reverseZone = reverseZone;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
101
|
const hosts = new Set();
|
|
114
102
|
|
|
115
103
|
for await (const {
|
|
116
104
|
address,
|
|
105
|
+
subnet,
|
|
117
106
|
networkInterface
|
|
118
107
|
} of owner.networkAddresses()) {
|
|
119
108
|
const host = networkInterface.host;
|
|
@@ -147,18 +136,28 @@ async function generateNamedDefs(owner, targetDir) {
|
|
|
147
136
|
);
|
|
148
137
|
}
|
|
149
138
|
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
const reverseZone = networkInterface.network.subnet?.reverseZone;
|
|
153
139
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
140
|
+
if (subnet) {
|
|
141
|
+
let reverseZone = reverseZones.get(subnet.address);
|
|
142
|
+
|
|
143
|
+
if (!reverseZone) {
|
|
144
|
+
const reverseArpa = reverseArpaAddress(subnet.prefix);
|
|
145
|
+
reverseZone = {
|
|
146
|
+
id: reverseArpa,
|
|
147
|
+
file: `${reverseArpa}.zone`,
|
|
148
|
+
records: new Set([SOARecord, NSRecord])
|
|
149
|
+
};
|
|
150
|
+
zones.push(reverseZone);
|
|
151
|
+
reverseZones.set(subnet.address, reverseZone);
|
|
152
|
+
}
|
|
153
|
+
reverseZone.records.add(
|
|
154
|
+
createRecord(
|
|
155
|
+
fullName(reverseArpaAddress(address)),
|
|
156
|
+
"PTR",
|
|
157
|
+
fullName(host.domainName)
|
|
158
|
+
)
|
|
159
|
+
);
|
|
160
|
+
}
|
|
162
161
|
}
|
|
163
162
|
}
|
|
164
163
|
|
package/package.json
CHANGED
package/src/host.mjs
CHANGED
|
@@ -4,7 +4,8 @@ import {
|
|
|
4
4
|
asArray,
|
|
5
5
|
isIPv4Address,
|
|
6
6
|
isIPv6Address,
|
|
7
|
-
normalizeIPAddress
|
|
7
|
+
normalizeIPAddress,
|
|
8
|
+
formatCIDR
|
|
8
9
|
} from "./utils.mjs";
|
|
9
10
|
import { addType } from "./types.mjs";
|
|
10
11
|
|
|
@@ -246,27 +247,28 @@ export class Host extends Base {
|
|
|
246
247
|
|
|
247
248
|
*networkAddresses() {
|
|
248
249
|
for (const networkInterface of this.networkInterfaces.values()) {
|
|
249
|
-
for (const address of networkInterface.ipAddresses) {
|
|
250
|
+
for (const [address, subnet] of networkInterface.ipAddresses) {
|
|
250
251
|
yield {
|
|
251
252
|
networkInterface,
|
|
252
253
|
address,
|
|
253
|
-
|
|
254
|
-
networkInterface.addressWithPrefixLength(address)
|
|
254
|
+
subnet
|
|
255
255
|
};
|
|
256
256
|
}
|
|
257
257
|
}
|
|
258
258
|
}
|
|
259
259
|
|
|
260
|
-
get
|
|
261
|
-
return
|
|
260
|
+
get rawAddress() {
|
|
261
|
+
return this.rawAddresses[0];
|
|
262
262
|
}
|
|
263
263
|
|
|
264
|
-
get
|
|
265
|
-
return [...this.networkAddresses()].map(na => na.
|
|
264
|
+
get rawAddresses() {
|
|
265
|
+
return [...this.networkAddresses()].map(na => na.address);
|
|
266
266
|
}
|
|
267
267
|
|
|
268
|
-
get
|
|
269
|
-
return this.
|
|
268
|
+
get cidrAddresses() {
|
|
269
|
+
return [...this.networkAddresses()].map(({ address, subnet }) =>
|
|
270
|
+
formatCIDR(address, subnet)
|
|
271
|
+
);
|
|
270
272
|
}
|
|
271
273
|
|
|
272
274
|
async publicKey(type = "ed25519") {
|
|
@@ -303,7 +305,8 @@ export class NetworkInterface extends Base {
|
|
|
303
305
|
ssid: { type: "string" },
|
|
304
306
|
psk: { type: "string" },
|
|
305
307
|
metric: { type: "number" },
|
|
306
|
-
|
|
308
|
+
cidrAddresses: { type: "string", collection: true },
|
|
309
|
+
rawAddress: { type: "string"},
|
|
307
310
|
network: {},
|
|
308
311
|
gateway: {},
|
|
309
312
|
arpbridge: {}
|
|
@@ -375,6 +378,10 @@ export class NetworkInterface extends Base {
|
|
|
375
378
|
}
|
|
376
379
|
}
|
|
377
380
|
|
|
381
|
+
get ipAddresses() {
|
|
382
|
+
return this.#ipAddresses;
|
|
383
|
+
}
|
|
384
|
+
|
|
378
385
|
set ipAddresses(value) {
|
|
379
386
|
for (const address of asArray(value)) {
|
|
380
387
|
this.#ipAddresses.set(
|
|
@@ -384,6 +391,28 @@ export class NetworkInterface extends Base {
|
|
|
384
391
|
}
|
|
385
392
|
}
|
|
386
393
|
|
|
394
|
+
get rawAddresses() {
|
|
395
|
+
return [...this.#ipAddresses].map(([address, subnet]) => address);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
get cidrAddresses() {
|
|
399
|
+
return [...this.#ipAddresses].map(([address, subnet]) =>
|
|
400
|
+
formatCIDR(address, subnet)
|
|
401
|
+
);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
get rawIPv4Addresses() {
|
|
405
|
+
return [...this.ipAddresses]
|
|
406
|
+
.filter(([address, subnet]) => isIPv4Address(address))
|
|
407
|
+
.map(([address, subnet]) => address);
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
get rawIPv6Addresses() {
|
|
411
|
+
return [...this.ipAddresses]
|
|
412
|
+
.filter(([address, subnet]) => isIPv6Address(address))
|
|
413
|
+
.map(([address, subnet]) => address);
|
|
414
|
+
}
|
|
415
|
+
|
|
387
416
|
subnetForAddress(address) {
|
|
388
417
|
return (
|
|
389
418
|
this.network?.subnetForAddress(address) ||
|
|
@@ -391,10 +420,6 @@ export class NetworkInterface extends Base {
|
|
|
391
420
|
);
|
|
392
421
|
}
|
|
393
422
|
|
|
394
|
-
addressWithPrefixLength(address) {
|
|
395
|
-
return `${address}/${this.subnetForAddress(address)?.prefixLength}`;
|
|
396
|
-
}
|
|
397
|
-
|
|
398
423
|
get gateway() {
|
|
399
424
|
return this.network?.gateway;
|
|
400
425
|
}
|
|
@@ -407,24 +432,6 @@ export class NetworkInterface extends Base {
|
|
|
407
432
|
}
|
|
408
433
|
}
|
|
409
434
|
|
|
410
|
-
get ipAddresses() {
|
|
411
|
-
return [...this.#ipAddresses.keys()];
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
get ipAddressesWithPrefixLength() {
|
|
415
|
-
return [...this.#ipAddresses].map(
|
|
416
|
-
([address, subnet]) => `${address}/${subnet?.prefixLength}`
|
|
417
|
-
);
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
get ipv4Addresses() {
|
|
421
|
-
return [...this.ipAddresses].filter(a => isIPv4Address(a));
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
get ipv6Addresses() {
|
|
425
|
-
return [...this.ipAddresses].filter(a => isIPv6Address(a));
|
|
426
|
-
}
|
|
427
|
-
|
|
428
435
|
get host() {
|
|
429
436
|
return this.owner;
|
|
430
437
|
}
|
package/src/location.mjs
CHANGED
|
@@ -15,7 +15,8 @@ export class Location extends Owner {
|
|
|
15
15
|
hosts: { type: "host", collection: true },
|
|
16
16
|
clusters: { type: "cluster", collection: true },
|
|
17
17
|
subnets: { type: "subnet", collection: true },
|
|
18
|
-
dns: { type: "dns", collection: false }
|
|
18
|
+
dns: { type: "dns", collection: false },
|
|
19
|
+
country: { type: "string" }
|
|
19
20
|
}
|
|
20
21
|
};
|
|
21
22
|
}
|
package/src/owner.mjs
CHANGED
|
@@ -169,9 +169,15 @@ export class Owner extends Base {
|
|
|
169
169
|
}
|
|
170
170
|
|
|
171
171
|
const subnets = [...this.subnets()];
|
|
172
|
+
|
|
173
|
+
const subnet = subnets.find(s =>s.matchesAddress(address));
|
|
174
|
+
if(subnet) {
|
|
175
|
+
return subnet;
|
|
176
|
+
}
|
|
177
|
+
/*
|
|
172
178
|
if (subnets.length === 1) {
|
|
173
179
|
return subnets[0];
|
|
174
|
-
}
|
|
180
|
+
}*/
|
|
175
181
|
|
|
176
182
|
this.error(
|
|
177
183
|
`Address without subnet ${address}`,
|
package/src/service.mjs
CHANGED
package/src/utils.mjs
CHANGED
|
@@ -130,6 +130,11 @@ export function encodeIP(address) {
|
|
|
130
130
|
return _encode(isIPv4Address(address) ? ipv4 : ipv6, address);
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
+
export function formatCIDR(address,subnet)
|
|
134
|
+
{
|
|
135
|
+
return subnet ? `${address}/${subnet.prefixLength}`: address;
|
|
136
|
+
}
|
|
137
|
+
|
|
133
138
|
export function normalizeCIDR(address) {
|
|
134
139
|
let [prefix, prefixLength] = address.split(/\//);
|
|
135
140
|
|
package/types/host.d.mts
CHANGED
|
@@ -63,11 +63,11 @@ export class Host extends Base {
|
|
|
63
63
|
networkAddresses(): Generator<{
|
|
64
64
|
networkInterface: any;
|
|
65
65
|
address: any;
|
|
66
|
-
|
|
66
|
+
subnet: any;
|
|
67
67
|
}, void, unknown>;
|
|
68
|
-
get
|
|
69
|
-
get
|
|
70
|
-
get
|
|
68
|
+
get rawAddress(): any;
|
|
69
|
+
get rawAddresses(): any[];
|
|
70
|
+
get cidrAddresses(): any[];
|
|
71
71
|
publicKey(type?: string): Promise<any>;
|
|
72
72
|
#private;
|
|
73
73
|
}
|
|
@@ -94,10 +94,13 @@ export class NetworkInterface extends Base {
|
|
|
94
94
|
metric: {
|
|
95
95
|
type: string;
|
|
96
96
|
};
|
|
97
|
-
|
|
97
|
+
cidrAddresses: {
|
|
98
98
|
type: string;
|
|
99
99
|
collection: boolean;
|
|
100
100
|
};
|
|
101
|
+
rawAddress: {
|
|
102
|
+
type: string;
|
|
103
|
+
};
|
|
101
104
|
network: {};
|
|
102
105
|
gateway: {};
|
|
103
106
|
arpbridge: {};
|
|
@@ -108,15 +111,15 @@ export class NetworkInterface extends Base {
|
|
|
108
111
|
set network(networkOrName: any);
|
|
109
112
|
get network(): any;
|
|
110
113
|
addSubnet(address: any): any;
|
|
111
|
-
set ipAddresses(value: any
|
|
112
|
-
get ipAddresses(): any
|
|
114
|
+
set ipAddresses(value: Map<any, any>);
|
|
115
|
+
get ipAddresses(): Map<any, any>;
|
|
116
|
+
get rawAddresses(): any[];
|
|
117
|
+
get cidrAddresses(): any[];
|
|
118
|
+
get rawIPv4Addresses(): any[];
|
|
119
|
+
get rawIPv6Addresses(): any[];
|
|
113
120
|
subnetForAddress(address: any): any;
|
|
114
|
-
addressWithPrefixLength(address: any): string;
|
|
115
121
|
get gateway(): any;
|
|
116
122
|
get gatewayAddress(): any;
|
|
117
|
-
get ipAddressesWithPrefixLength(): string[];
|
|
118
|
-
get ipv4Addresses(): any[];
|
|
119
|
-
get ipv6Addresses(): any[];
|
|
120
123
|
get scope(): any;
|
|
121
124
|
get metric(): any;
|
|
122
125
|
get ssid(): any;
|
package/types/location.d.mts
CHANGED
package/types/utils.d.mts
CHANGED
|
@@ -13,6 +13,7 @@ export function decodeIPv4(address: any, length: any): string;
|
|
|
13
13
|
export function encodeIPv4(address: any): bigint;
|
|
14
14
|
export function decodeIP(address: any, length: any): string;
|
|
15
15
|
export function encodeIP(address: any): bigint;
|
|
16
|
+
export function formatCIDR(address: any, subnet: any): any;
|
|
16
17
|
export function normalizeCIDR(address: any): {
|
|
17
18
|
prefix?: undefined;
|
|
18
19
|
prefixLength?: undefined;
|