pmcf 1.35.2 → 1.35.4

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.
@@ -19,6 +19,10 @@ console.log("depends", "mf-named");
19
19
  console.log("replaces", "mf-named-zones");
20
20
  console.log("description", `named defintions for ${owner.name}`);
21
21
 
22
+ function fullName(name) {
23
+ return name.endsWith(".") ? name : name + ".";
24
+ }
25
+
22
26
  async function generateNamedDefs(owner, targetDir) {
23
27
  const dns = owner.dns;
24
28
  const ttl = dns.recordTTL;
@@ -33,20 +37,24 @@ async function generateNamedDefs(owner, targetDir) {
33
37
 
34
38
  let maxKeyLength;
35
39
 
36
- const createRecord = (key, type, value) => {
40
+ const createRecord = (key, type, ...values) => {
41
+ values = values.map(v =>
42
+ typeof v === "number" ? String(v).padStart(3) : v
43
+ );
44
+
37
45
  return {
38
46
  key,
39
47
  toString: () =>
40
48
  `${key.padEnd(maxKeyLength, " ")} ${ttl} IN ${type.padEnd(
41
49
  5,
42
50
  " "
43
- )} ${value}`
51
+ )} ${values.join(" ")}`
44
52
  };
45
53
  };
46
54
 
47
55
  for await (const mail of owner.services({ type: "smtp" })) {
48
56
  records.add(
49
- createRecord("@", "MX", `${mail.priority} ${mail.owner.domainName}.`)
57
+ createRecord("@", "MX", mail.priority, fullName(mail.owner.domainName))
50
58
  );
51
59
  }
52
60
 
@@ -55,10 +63,12 @@ async function generateNamedDefs(owner, targetDir) {
55
63
  const SOARecord = createRecord(
56
64
  "@",
57
65
  "SOA",
58
- `${nameserver?.domainName}. ${rname}. (${updates})`
66
+ fullName(nameserver?.domainName),
67
+ fullName(rname),
68
+ `(${updates})`
59
69
  );
60
70
 
61
- const NSRecord = createRecord("@", "NS", `${nameserver?.ipAddress}.`);
71
+ const NSRecord = createRecord("@", "NS", fullName(nameserver?.ipAddress));
62
72
 
63
73
  const catalogZone = {
64
74
  id: `catalog.${domain}`,
@@ -66,7 +76,7 @@ async function generateNamedDefs(owner, targetDir) {
66
76
  records: new Set([
67
77
  SOARecord,
68
78
  NSRecord,
69
- createRecord(`version.${domain}.`, "TXT", '"2"')
79
+ createRecord(fullName(`version.${domain}`), "TXT", '"2"')
70
80
  ])
71
81
  };
72
82
 
@@ -78,7 +88,7 @@ async function generateNamedDefs(owner, targetDir) {
78
88
  zones.push(zone);
79
89
 
80
90
  for (const subnet of owner.subnets()) {
81
- if (subnet.prefix) {
91
+ if (!subnet.isLinkLocal && subnet.prefix) {
82
92
  const reverseArpa = reverseArpaAddress(subnet.prefix);
83
93
  const reverseZone = {
84
94
  id: reverseArpa,
@@ -101,30 +111,28 @@ async function generateNamedDefs(owner, targetDir) {
101
111
  if (!hosts.has(host)) {
102
112
  zone.records.add(
103
113
  createRecord(
104
- host.domainName + ".",
105
- isIPv4Address(address) ? "A " : "AAAA",
114
+ fullName(host.domainName),
115
+ isIPv4Address(address) ? "A" : "AAAA",
106
116
  normalizeIPAddress(address)
107
117
  )
108
118
  );
109
119
  hosts.add(host);
110
120
  for (const service of host.services()) {
111
- //console.log(service.name);
112
121
  if (service.master && service.alias) {
113
122
  zone.records.add(
114
- createRecord(service.alias, "CNAME", `${host.domainName}.`)
123
+ createRecord(service.alias, "CNAME", fullName(host.domainName))
115
124
  );
116
125
  }
117
126
 
118
127
  if (dns.hasSVRRecords && service.srvPrefix) {
119
128
  zone.records.add(
120
129
  createRecord(
121
- `${service.srvPrefix}.${host.domainName}.`,
130
+ fullName(`${service.srvPrefix}.${host.domainName}`),
122
131
  "SRV",
123
- `${String(service.priority).padStart(4)} ${String(
124
- service.weight
125
- ).padStart(3)} ${String(service.port).padStart(5)} ${
126
- host.domainName
127
- }.`
132
+ service.priority,
133
+ service.weight,
134
+ service.port,
135
+ fullName(host.domainName)
128
136
  )
129
137
  );
130
138
  }
@@ -133,12 +141,12 @@ async function generateNamedDefs(owner, targetDir) {
133
141
 
134
142
  const reverseZone = networkInterface.network.subnet?.reverseZone;
135
143
 
136
- if (reverseZone && isIPv4Address(address)) {
144
+ if (reverseZone) {
137
145
  reverseZone.records.add(
138
146
  createRecord(
139
- reverseArpaAddress(address) + ".",
147
+ fullName(reverseArpaAddress(address)),
140
148
  "PTR",
141
- `${networkInterface.host.domainName}.`
149
+ fullName(networkInterface.host.domainName)
142
150
  )
143
151
  );
144
152
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pmcf",
3
- "version": "1.35.2",
3
+ "version": "1.35.4",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
package/src/owner.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { asArray, normalizeCIDR } from "./utils.mjs";
1
+ import { asArray, normalizeCIDR, isLinkLocal } from "./utils.mjs";
2
2
  import { Base } from "./base.mjs";
3
3
  import { DNSService } from "./dns.mjs";
4
4
 
@@ -368,6 +368,11 @@ export class Subnet extends Base {
368
368
  return address.startsWith(this.prefix);
369
369
  }
370
370
 
371
+ get isLinkLocal()
372
+ {
373
+ return isLinkLocal(this.address);
374
+ }
375
+
371
376
  get prefix() {
372
377
  const [prefix] = this.name.split("/");
373
378
  return prefix;
package/types/owner.d.mts CHANGED
@@ -43,6 +43,7 @@ export class Network extends Owner {
43
43
  export class Subnet extends Base {
44
44
  networks: Set<any>;
45
45
  matchesAddress(address: any): any;
46
+ get isLinkLocal(): any;
46
47
  get prefix(): any;
47
48
  get prefixLength(): number;
48
49
  get address(): any;