pmcf 1.44.0 → 1.45.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.
@@ -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.ipAddressesWithPrefixLength) {
58
+ for (const Address of ni.cidrAddresses) {
59
59
  networkSections.push(
60
60
  "",
61
61
  sectionLines("Address", {
@@ -78,7 +78,7 @@ async function generateNamedDefs(owner, targetDir) {
78
78
  `(${updates})`
79
79
  );
80
80
 
81
- const NSRecord = createRecord("@", "NS", fullName(nameserver?.ipAddress));
81
+ const NSRecord = createRecord("@", "NS", fullName(nameserver?.rawAddress));
82
82
 
83
83
  const catalogZone = {
84
84
  id: `catalog.${domain}`,
@@ -97,23 +97,11 @@ async function generateNamedDefs(owner, targetDir) {
97
97
  };
98
98
  zones.push(zone);
99
99
 
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
100
  const hosts = new Set();
114
101
 
115
102
  for await (const {
116
103
  address,
104
+ subnet,
117
105
  networkInterface
118
106
  } of owner.networkAddresses()) {
119
107
  const host = networkInterface.host;
@@ -149,8 +137,18 @@ async function generateNamedDefs(owner, targetDir) {
149
137
  }
150
138
  }
151
139
 
152
- const reverseZone = networkInterface.network.subnet?.reverseZone;
140
+ let reverseZone = subnet?.reverseZone;
153
141
 
142
+ if (subnet && !reverseZone) {
143
+ const reverseArpa = reverseArpaAddress(subnet.prefix);
144
+ reverseZone = {
145
+ id: reverseArpa,
146
+ file: `${reverseArpa}.zone`,
147
+ records: new Set([SOARecord, NSRecord])
148
+ };
149
+ zones.push(reverseZone);
150
+ subnet.reverseZone = reverseZone;
151
+ }
154
152
  if (reverseZone) {
155
153
  reverseZone.records.add(
156
154
  createRecord(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pmcf",
3
- "version": "1.44.0",
3
+ "version": "1.45.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
package/src/base.mjs CHANGED
@@ -16,9 +16,10 @@ export class Base {
16
16
  return {
17
17
  name: "base",
18
18
  properties: {
19
+ type: { type: "string", writeable: false },
19
20
  name: { type: "string" },
20
21
  description: { type: "string" },
21
- directory: { type: "string" },
22
+ directory: { type: "string", writeable: false },
22
23
  owner: {}
23
24
  }
24
25
  };
@@ -109,7 +110,7 @@ export class Base {
109
110
 
110
111
  get typeName() {
111
112
  // @ts-ignore
112
- return this.constructor.typeName;
113
+ return this.constructor.typeDefinition.name;
113
114
  }
114
115
 
115
116
  get root() {
@@ -277,7 +278,10 @@ export function extractFrom(object, typeDefinition) {
277
278
  json[name] = value;
278
279
  } else {
279
280
  json[name] = Object.fromEntries(
280
- Object.entries(value).map(([k, v]) => [k, extractFrom(v)])
281
+ Object.entries(value).map(([k, v]) => [
282
+ k,
283
+ extractFrom(v, typesByName[def.type])
284
+ ])
281
285
  );
282
286
  }
283
287
  }
package/src/dns.mjs CHANGED
@@ -8,7 +8,6 @@ export class DNSService extends Base {
8
8
  soaUpdates = [36000, 72000, 600000, 60000];
9
9
  hasSVRRecords = true;
10
10
  hasCatalog = true;
11
-
12
11
  forwardsTo = [];
13
12
 
14
13
  static {
@@ -21,10 +20,10 @@ export class DNSService extends Base {
21
20
  properties: {
22
21
  hasSVRRecords: { type: "boolean" },
23
22
  hasCatalog: { type: "boolean" },
24
- recordTTL: { type: "string" }
25
- /*soaUpdates: {},
26
- forwardsTo: {},
27
- allowedUpdates: {}*/
23
+ recordTTL: { type: "string" },
24
+ soaUpdates: { type: "number", collection: true },
25
+ forwardsTo: { type: "host", collection: true },
26
+ allowedUpdates: { type: "string", collection: true }
28
27
  }
29
28
  };
30
29
  }
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
- addressWithPrefixLength:
254
- networkInterface.addressWithPrefixLength(address)
254
+ subnet
255
255
  };
256
256
  }
257
257
  }
258
258
  }
259
259
 
260
- get ipAddresses() {
261
- return [...this.networkAddresses()].map(na => na.address);
260
+ get rawAddress() {
261
+ return this.rawAddresses[0];
262
262
  }
263
263
 
264
- get ipAddressesWithPrefixLength() {
265
- return [...this.networkAddresses()].map(na => na.addressWithPrefixLength);
264
+ get rawAddresses() {
265
+ return [...this.networkAddresses()].map(na => na.address);
266
266
  }
267
267
 
268
- get ipAddress() {
269
- return this.ipAddresses[0];
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
- ipAddresses: { type: "string", isCollection: true },
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
@@ -109,7 +109,7 @@ export class Service extends Base {
109
109
  }
110
110
 
111
111
  get ipAddresses() {
112
- return this.#ipAddresses || this.owner.ipAddresses;
112
+ return this.#ipAddresses || this.owner.rawAddresses;
113
113
  }
114
114
 
115
115
  get addresses() {
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/base.d.mts CHANGED
@@ -4,6 +4,10 @@ export class Base {
4
4
  static get typeDefinition(): {
5
5
  name: string;
6
6
  properties: {
7
+ type: {
8
+ type: string;
9
+ writeable: boolean;
10
+ };
7
11
  name: {
8
12
  type: string;
9
13
  };
@@ -12,6 +16,7 @@ export class Base {
12
16
  };
13
17
  directory: {
14
18
  type: string;
19
+ writeable: boolean;
15
20
  };
16
21
  owner: {};
17
22
  };
package/types/dns.d.mts CHANGED
@@ -11,6 +11,18 @@ export class DNSService extends Base {
11
11
  recordTTL: {
12
12
  type: string;
13
13
  };
14
+ soaUpdates: {
15
+ type: string;
16
+ collection: boolean;
17
+ };
18
+ forwardsTo: {
19
+ type: string;
20
+ collection: boolean;
21
+ };
22
+ allowedUpdates: {
23
+ type: string;
24
+ collection: boolean;
25
+ };
14
26
  };
15
27
  };
16
28
  allowedUpdates: any[];
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
- addressWithPrefixLength: any;
66
+ subnet: any;
67
67
  }, void, unknown>;
68
- get ipAddresses(): any[];
69
- get ipAddressesWithPrefixLength(): any[];
70
- get ipAddress(): any;
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,9 +94,12 @@ export class NetworkInterface extends Base {
94
94
  metric: {
95
95
  type: string;
96
96
  };
97
- ipAddresses: {
97
+ cidrAddresses: {
98
+ type: string;
99
+ collection: boolean;
100
+ };
101
+ rawAddress: {
98
102
  type: string;
99
- isCollection: boolean;
100
103
  };
101
104
  network: {};
102
105
  gateway: {};
@@ -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;
@@ -23,6 +23,9 @@ export class Location extends Owner {
23
23
  type: string;
24
24
  collection: boolean;
25
25
  };
26
+ country: {
27
+ type: string;
28
+ };
26
29
  };
27
30
  };
28
31
  get location(): this;
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;