pmcf 1.70.0 → 1.72.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pmcf",
3
- "version": "1.70.0",
3
+ "version": "1.72.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
package/src/dns.mjs CHANGED
@@ -9,7 +9,7 @@ import {
9
9
  } from "./utils.mjs";
10
10
  import { Base } from "./base.mjs";
11
11
  import { addType } from "./types.mjs";
12
- import { sortByPriority } from "./service.mjs";
12
+ import { serviceAddresses } from "./service.mjs";
13
13
  import { subnets } from "./subnet.mjs";
14
14
 
15
15
  const DNSServiceTypeDefinition = {
@@ -91,15 +91,6 @@ export class DNSService extends Base {
91
91
  return this.#forwardsTo;
92
92
  }
93
93
 
94
- get forwardsToAdresses() {
95
- return this.forwardsTo
96
- .map(ft => Array.from(ft.findServices(DNS_SERVICE_FILTER)))
97
- .flat()
98
- .sort(sortByPriority)
99
- .map(s => s.rawAddresses)
100
- .flat();
101
- }
102
-
103
94
  *findServices(filter) {
104
95
  yield* this.owner.findServices(filter);
105
96
 
@@ -113,22 +104,15 @@ export class DNSService extends Base {
113
104
  }
114
105
 
115
106
  async resolvedConfig() {
116
- const dnsServices = Array.from(this.findServices(DNS_SERVICE_FILTER)).sort(
117
- sortByPriority
118
- );
119
-
120
- const master = dnsServices
121
- .filter(s => s.priority < 10)
122
- .map(s => s.rawAddresses)
123
- .flat();
124
- const fallback = dnsServices
125
- .filter(s => s.priority >= 10)
126
- .map(s => s.rawAddresses)
127
- .flat();
128
-
129
107
  return {
130
- DNS: master.join(" "),
131
- FallbackDNS: fallback.join(" "),
108
+ DNS: serviceAddresses(this, {
109
+ ...DNS_SERVICE_FILTER,
110
+ priority: "<10"
111
+ }).join(" "),
112
+ FallbackDNS: serviceAddresses(this, {
113
+ ...DNS_SERVICE_FILTER,
114
+ priority: ">=10"
115
+ }).join(" "),
132
116
  Domains: this.domains.join(" "),
133
117
  DNSSEC: "no",
134
118
  MulticastDNS: "yes",
@@ -152,7 +136,9 @@ export class DNSService extends Base {
152
136
 
153
137
  const options = [
154
138
  "forwarders {",
155
- ...this.forwardsToAdresses.map(a => ` ${a};`),
139
+ ...serviceAddresses(this.forwardsTo, DNS_SERVICE_FILTER).map(
140
+ a => ` ${a};`
141
+ ),
156
142
  "};"
157
143
  ];
158
144
  await writeLines(join(p1, "etc/named.d/options"), `${name}.conf`, options);
package/src/filter.mjs ADDED
@@ -0,0 +1,79 @@
1
+ export function* objectFilter(type, objects, filter) {
2
+ if (filter) {
3
+ advance: for (const object of objects) {
4
+ const filterString = key => {
5
+ if (filter[key] === undefined) {
6
+ return true;
7
+ }
8
+ if (filter[key] === object[key]) {
9
+ return true;
10
+ }
11
+
12
+ for (const value of filter[key].split("|")) {
13
+ if (object[key] === value) {
14
+ return true;
15
+ }
16
+ }
17
+
18
+ return false;
19
+ };
20
+
21
+ const filterNumber = key => {
22
+ switch (typeof filter[key]) {
23
+ case "undefined":
24
+ return true;
25
+ case "number":
26
+ return filter[key] === object[key];
27
+ case "string":
28
+ const m = filter[key].match(/^([=><!]+)(\d+)/);
29
+ if (m) {
30
+ const value = parseInt(m[2]);
31
+ switch (m[1]) {
32
+ case "=":
33
+ return object[key] === value;
34
+ case "!=":
35
+ return object[key] !== value;
36
+ case "<":
37
+ return object[key] < value;
38
+ case "<=":
39
+ return object[key] <= value;
40
+ case ">":
41
+ return object[key] > value;
42
+ case ">=":
43
+ return object[key] >= value;
44
+ }
45
+ }
46
+ }
47
+ return false;
48
+ };
49
+ for (let t = type; t; t = t.extends) {
50
+ for (const property of Object.values(t.properties)) {
51
+ switch (property.type) {
52
+ case "boolean":
53
+ if (
54
+ filter[property.name] !== undefined &&
55
+ filter[property.name] != object[property.name]
56
+ ) {
57
+ continue advance;
58
+ }
59
+ break;
60
+
61
+ case "number":
62
+ if (!filterNumber(property.name)) {
63
+ continue advance;
64
+ }
65
+ break;
66
+ case "string":
67
+ if (!filterString(property.name)) {
68
+ continue advance;
69
+ }
70
+ break;
71
+ }
72
+ }
73
+ }
74
+ yield object;
75
+ }
76
+ } else {
77
+ yield* objects;
78
+ }
79
+ }
package/src/host.mjs CHANGED
@@ -11,8 +11,8 @@ import {
11
11
  formatCIDR,
12
12
  hasWellKnownSubnet
13
13
  } from "./utils.mjs";
14
- import { serviceFilter } from "./service.mjs";
15
- import { addType } from "./types.mjs";
14
+ import { objectFilter } from "./filter.mjs";
15
+ import { addType, types } from "./types.mjs";
16
16
  import {
17
17
  generateNetworkDefs,
18
18
  generateMachineInfo,
@@ -264,7 +264,7 @@ export class Host extends Base {
264
264
  }
265
265
 
266
266
  *findServices(filter) {
267
- yield* serviceFilter(this.#services, filter);
267
+ yield* objectFilter(types.service, this.#services, filter);
268
268
  }
269
269
 
270
270
  typeNamed(typeName, name) {
package/src/service.mjs CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Base } from "./base.mjs";
2
2
  import { addType } from "./types.mjs";
3
+ import { asArray } from "./utils.mjs";
3
4
 
4
5
  const ServiceTypes = {
5
6
  dns: { protocol: "udp", port: 53 },
@@ -27,7 +28,8 @@ const ServiceTypeDefinition = {
27
28
  type: { type: "string", collection: false, writeable: true },
28
29
  master: { type: "boolean", collection: false, writeable: true },
29
30
  priority: { type: "number", collection: false, writeable: true },
30
- weight: { type: "number", collection: false, writeable: true }
31
+ weight: { type: "number", collection: false, writeable: true },
32
+ srvPrefix: { type: "string", collection: false, writeable: false }
31
33
  }
32
34
  };
33
35
 
@@ -166,66 +168,15 @@ export class Service extends Base {
166
168
 
167
169
  export const sortByPriority = (a, b) => a.priority - b.priority;
168
170
 
169
- export function* serviceFilter(services, filter) {
170
- if (filter) {
171
- for (const service of services) {
172
- const filterString = key => {
173
- if (filter[key] === undefined) {
174
- return true;
175
- }
176
- if (filter[key] === service[key]) {
177
- return true;
178
- }
179
-
180
- for(const value of filter[key].split('|')) {
181
- if(service[key] === value) { return true; }
182
- }
183
-
184
- return false;
185
- };
186
-
187
- const filterNumber = key => {
188
- switch (typeof filter[key]) {
189
- case "undefined":
190
- return true;
191
- case "number":
192
- return filter[key] === service[key];
193
- case "string":
194
- const m = filter[key].match(/^([=><!]+)(\d+)/);
195
- if (m) {
196
- const value = parseInt(m[2]);
197
- switch (m[1]) {
198
- case "=":
199
- return service[key] === value;
200
- case "!=":
201
- return service[key] !== value;
202
- case "<":
203
- return service[key] < value;
204
- case "<=":
205
- return service[key] <= value;
206
- case ">":
207
- return service[key] > value;
208
- case ">=":
209
- return service[key] >= value;
210
- }
211
- }
212
- }
213
- return false;
214
- };
215
-
216
- if (
217
- filterString("type") &&
218
- filterString("name") &&
219
- filterString("protocol") &&
220
- filterString("alias") &&
221
- filterNumber("priority") &&
222
- filterNumber("weight") &&
223
- filterNumber("port")
224
- ) {
225
- yield service;
226
- }
227
- }
228
- } else {
229
- yield* services;
230
- }
171
+ export function serviceAddresses(
172
+ sources,
173
+ filter,
174
+ addressType = "rawAddresses"
175
+ ) {
176
+ return asArray(sources)
177
+ .map(ft => Array.from(ft.findServices(filter)))
178
+ .flat()
179
+ .sort(sortByPriority)
180
+ .map(s => s[addressType])
181
+ .flat();
231
182
  }
package/types/dns.d.mts CHANGED
@@ -83,7 +83,6 @@ export class DNSService extends Base {
83
83
  get trusted(): any[];
84
84
  set forwardsTo(value: any[]);
85
85
  get forwardsTo(): any[];
86
- get forwardsToAdresses(): any[];
87
86
  get domains(): any[];
88
87
  resolvedConfig(): Promise<{
89
88
  DNS: string;
@@ -0,0 +1 @@
1
+ export function objectFilter(type: any, objects: any, filter: any): Generator<any, void, any>;
@@ -1,4 +1,4 @@
1
- export function serviceFilter(services: any, filter: any): Generator<any, void, any>;
1
+ export function serviceAddresses(sources: any, filter: any, addressType?: string): any[];
2
2
  export class Service extends Base {
3
3
  static get typeDefinition(): {
4
4
  name: string;
@@ -82,6 +82,11 @@ export class Service extends Base {
82
82
  collection: boolean;
83
83
  writeable: boolean;
84
84
  };
85
+ srvPrefix: {
86
+ type: string;
87
+ collection: boolean;
88
+ writeable: boolean;
89
+ };
85
90
  };
86
91
  };
87
92
  alias: any;