pmcf 1.82.0 → 1.84.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 +2 -2
- package/src/base.mjs +1 -23
- package/src/dns.mjs +24 -17
- package/src/hooks.mjs +21 -0
- package/src/host-utils.mjs +10 -8
- package/src/host.mjs +44 -28
- package/src/location.mjs +45 -44
- package/src/owner.mjs +25 -11
- package/types/base.d.mts +0 -3
- package/types/cluster.d.mts +16 -1
- package/types/dns.d.mts +9 -2
- package/types/hooks.d.mts +2 -0
- package/types/host-utils.d.mts +3 -3
- package/types/host.d.mts +22 -0
- package/types/location.d.mts +36 -0
- package/types/network.d.mts +10 -0
- package/types/owner.d.mts +12 -0
- package/types/root.d.mts +20 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pmcf",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.84.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"lint:typescript": "tsc --allowJs --checkJs --noEmit --resolveJsonModule --target es2024 --lib esnext -m esnext --module nodenext --moduleResolution nodenext ./src**/*.mjs"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"npm-pkgbuild": "^17.
|
|
41
|
+
"npm-pkgbuild": "^17.5.1",
|
|
42
42
|
"pacc": "^3.3.0",
|
|
43
43
|
"pkg-dir": "^8.0.0"
|
|
44
44
|
},
|
package/src/base.mjs
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { join } from "node:path";
|
|
2
|
-
import {
|
|
3
|
-
import { allOutputs, extractFunctions } from "npm-pkgbuild";
|
|
2
|
+
import { allOutputs } from "npm-pkgbuild";
|
|
4
3
|
import { getAttribute } from "pacc";
|
|
5
4
|
import { addType, primitives } from "./types.mjs";
|
|
6
5
|
|
|
@@ -354,27 +353,6 @@ export class Base {
|
|
|
354
353
|
return this.#packaging;
|
|
355
354
|
}
|
|
356
355
|
|
|
357
|
-
#packageHooks = {};
|
|
358
|
-
|
|
359
|
-
get packageHooks() {
|
|
360
|
-
return this.#packageHooks;
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
async loadPackageHooks(file) {
|
|
364
|
-
for await (const f of extractFunctions(createReadStream(file, "utf8"))) {
|
|
365
|
-
this.addPackageHook(f.name, f.body);
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
addPackageHook(name, content) {
|
|
370
|
-
const hook = this.#packageHooks[name];
|
|
371
|
-
if (hook) {
|
|
372
|
-
content = hook + "\n" + content;
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
this.#packageHooks[name] = content;
|
|
376
|
-
}
|
|
377
|
-
|
|
378
356
|
get outputs() {
|
|
379
357
|
return new Set(allOutputs.filter(o => this.packaging.has(o.name)));
|
|
380
358
|
}
|
package/src/dns.mjs
CHANGED
|
@@ -29,6 +29,7 @@ const DNSServiceTypeDefinition = {
|
|
|
29
29
|
},
|
|
30
30
|
notify: { type: "boolean", collection: false, writeable: true },
|
|
31
31
|
recordTTL: { type: "string", collection: false, writeable: true },
|
|
32
|
+
serial: { type: "number", collection: false, writeable: true },
|
|
32
33
|
refresh: { type: "string", collection: false, writeable: true },
|
|
33
34
|
retry: { type: "string", collection: false, writeable: true },
|
|
34
35
|
expire: { type: "string", collection: false, writeable: true },
|
|
@@ -49,6 +50,7 @@ export class DNSService extends Base {
|
|
|
49
50
|
#source = [];
|
|
50
51
|
#trusted = [];
|
|
51
52
|
|
|
53
|
+
serial = Math.ceil(Date.now() / 1000);
|
|
52
54
|
refresh = 36000;
|
|
53
55
|
retry = 72000;
|
|
54
56
|
expire = 600000;
|
|
@@ -73,7 +75,7 @@ export class DNSService extends Base {
|
|
|
73
75
|
}
|
|
74
76
|
|
|
75
77
|
get soaUpdates() {
|
|
76
|
-
return [this.refresh, this.retry, this.expire, this.minimum];
|
|
78
|
+
return [this.serial, this.refresh, this.retry, this.expire, this.minimum];
|
|
77
79
|
}
|
|
78
80
|
|
|
79
81
|
set trusted(value) {
|
|
@@ -120,11 +122,11 @@ export class DNSService extends Base {
|
|
|
120
122
|
];
|
|
121
123
|
}
|
|
122
124
|
|
|
123
|
-
async *preparePackages(
|
|
125
|
+
async *preparePackages(dir) {
|
|
124
126
|
const name = this.owner.name;
|
|
125
|
-
const p1 = join(
|
|
126
|
-
|
|
127
|
-
|
|
127
|
+
const p1 = join(dir, "p1");
|
|
128
|
+
const packageData = {
|
|
129
|
+
dir: p1,
|
|
128
130
|
sources: [new FileContentProvider(p1 + "/")[Symbol.asyncIterator]()],
|
|
129
131
|
outputs: this.outputs,
|
|
130
132
|
properties: {
|
|
@@ -154,12 +156,12 @@ export class DNSService extends Base {
|
|
|
154
156
|
);
|
|
155
157
|
|
|
156
158
|
if (options.length > 2 || category.length > 2) {
|
|
157
|
-
yield
|
|
159
|
+
yield packageData;
|
|
158
160
|
}
|
|
159
161
|
|
|
160
|
-
const p2 = join(
|
|
162
|
+
const p2 = (packageData.dir = join(dir, "p2"));
|
|
161
163
|
|
|
162
|
-
|
|
164
|
+
packageData.properties = {
|
|
163
165
|
name: `named-zones-${name}`,
|
|
164
166
|
description: `zone definitions for ${this.fullName}`,
|
|
165
167
|
dependencies: ["mf-named"],
|
|
@@ -167,23 +169,28 @@ export class DNSService extends Base {
|
|
|
167
169
|
access: "private"
|
|
168
170
|
};
|
|
169
171
|
|
|
170
|
-
|
|
172
|
+
packageData.sources = [
|
|
171
173
|
new FileContentProvider(p2 + "/", {
|
|
172
174
|
mode: 0o644,
|
|
173
175
|
owner: "named",
|
|
174
176
|
group: "named"
|
|
175
|
-
}
|
|
177
|
+
}, {
|
|
178
|
+
mode: 0o755,
|
|
179
|
+
owner: "named",
|
|
180
|
+
group: "named"
|
|
181
|
+
})[
|
|
182
|
+
Symbol.asyncIterator
|
|
183
|
+
]()
|
|
176
184
|
];
|
|
177
185
|
|
|
178
|
-
await generateZoneDefs(this,
|
|
186
|
+
await generateZoneDefs(this, packageData);
|
|
179
187
|
|
|
180
|
-
yield
|
|
188
|
+
yield packageData;
|
|
181
189
|
}
|
|
182
190
|
}
|
|
183
191
|
|
|
184
|
-
async function generateZoneDefs(dns,
|
|
192
|
+
async function generateZoneDefs(dns, packageData) {
|
|
185
193
|
const ttl = dns.recordTTL;
|
|
186
|
-
const updates = [Math.ceil(Date.now() / 1000), ...dns.soaUpdates].join(" ");
|
|
187
194
|
const nameService = dns.findService(DNS_SERVICE_FILTER);
|
|
188
195
|
const rname = dns.administratorEmail.replace(/@/, ".");
|
|
189
196
|
|
|
@@ -192,7 +199,7 @@ async function generateZoneDefs(dns, targetDir) {
|
|
|
192
199
|
"SOA",
|
|
193
200
|
dnsFullName(nameService.domainName),
|
|
194
201
|
dnsFullName(rname),
|
|
195
|
-
`(${
|
|
202
|
+
`(${[...dns.soaUpdates].join(" ")})`
|
|
196
203
|
);
|
|
197
204
|
|
|
198
205
|
const NSRecord = DNSRecord(
|
|
@@ -372,14 +379,14 @@ async function generateZoneDefs(dns, targetDir) {
|
|
|
372
379
|
}
|
|
373
380
|
|
|
374
381
|
await writeLines(
|
|
375
|
-
join(
|
|
382
|
+
join(packageData.dir, "var/lib/named"),
|
|
376
383
|
zone.file,
|
|
377
384
|
[...zone.records].map(r => r.toString(maxKeyLength, ttl))
|
|
378
385
|
);
|
|
379
386
|
}
|
|
380
387
|
|
|
381
388
|
await writeLines(
|
|
382
|
-
join(
|
|
389
|
+
join(packageData.dir, "etc/named.d/zones"),
|
|
383
390
|
config.name,
|
|
384
391
|
content
|
|
385
392
|
);
|
package/src/hooks.mjs
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createReadStream } from "node:fs";
|
|
2
|
+
import { extractFunctions } from "npm-pkgbuild";
|
|
3
|
+
|
|
4
|
+
export async function loadHooks(hooks, file) {
|
|
5
|
+
for await (const f of extractFunctions(createReadStream(file, "utf8"))) {
|
|
6
|
+
addHook(hooks, f.name, f.body);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
return hooks;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function addHook(hooks, name, content) {
|
|
13
|
+
const hook = hooks[name];
|
|
14
|
+
if (hook) {
|
|
15
|
+
content = hook + "\n" + content;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
hooks[name] = content;
|
|
19
|
+
|
|
20
|
+
return hooks;
|
|
21
|
+
}
|
package/src/host-utils.mjs
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { writeFile, mkdir, copyFile, glob, chmod } from "node:fs/promises";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { writeLines, sectionLines } from "../src/utils.mjs";
|
|
4
|
+
import { addHook } from "./hooks.mjs";
|
|
4
5
|
|
|
5
|
-
export async function generateMachineInfo(host,
|
|
6
|
-
const etcDir = join(dir, "etc");
|
|
6
|
+
export async function generateMachineInfo(host, packageData) {
|
|
7
|
+
const etcDir = join(packageData.dir, "etc");
|
|
7
8
|
await writeLines(
|
|
8
9
|
etcDir,
|
|
9
10
|
"machine-info",
|
|
@@ -20,8 +21,8 @@ export async function generateMachineInfo(host, dir) {
|
|
|
20
21
|
await writeLines(etcDir, "hostname", host.hostName);
|
|
21
22
|
}
|
|
22
23
|
|
|
23
|
-
export async function generateNetworkDefs(host,
|
|
24
|
-
const networkDir = join(dir, "etc/systemd/network");
|
|
24
|
+
export async function generateNetworkDefs(host, packageData) {
|
|
25
|
+
const networkDir = join(packageData.dir, "etc/systemd/network");
|
|
25
26
|
|
|
26
27
|
for (const ni of host.networkInterfaces.values()) {
|
|
27
28
|
if (ni.name !== "eth0" && ni.hwaddr) {
|
|
@@ -100,7 +101,7 @@ export async function generateNetworkDefs(host, dir) {
|
|
|
100
101
|
}
|
|
101
102
|
break;
|
|
102
103
|
case "wifi": {
|
|
103
|
-
const d = join(dir, "etc/wpa_supplicant");
|
|
104
|
+
const d = join(packageData.dir, "etc/wpa_supplicant");
|
|
104
105
|
await mkdir(d, { recursive: true });
|
|
105
106
|
writeFile(
|
|
106
107
|
join(d, `wpa_supplicant-${ni.name}.conf`),
|
|
@@ -116,7 +117,8 @@ network={
|
|
|
116
117
|
"utf8"
|
|
117
118
|
);
|
|
118
119
|
|
|
119
|
-
|
|
120
|
+
addHook(
|
|
121
|
+
packageData.properties.hooks,
|
|
120
122
|
"post_install",
|
|
121
123
|
`systemctl enable wpa_supplicant@${ni.name}.service`
|
|
122
124
|
);
|
|
@@ -125,8 +127,8 @@ network={
|
|
|
125
127
|
}
|
|
126
128
|
}
|
|
127
129
|
|
|
128
|
-
export async function copySshKeys(host,
|
|
129
|
-
const sshDir = join(dir, "etc", "ssh");
|
|
130
|
+
export async function copySshKeys(host, packageData) {
|
|
131
|
+
const sshDir = join(packageData.dir, "etc", "ssh");
|
|
130
132
|
|
|
131
133
|
await mkdir(sshDir, { recursive: true });
|
|
132
134
|
|
package/src/host.mjs
CHANGED
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
} from "./utils.mjs";
|
|
19
19
|
import { objectFilter } from "./filter.mjs";
|
|
20
20
|
import { addType, types } from "./types.mjs";
|
|
21
|
+
import { loadHooks } from "./hooks.mjs";
|
|
21
22
|
import {
|
|
22
23
|
generateNetworkDefs,
|
|
23
24
|
generateMachineInfo,
|
|
@@ -47,6 +48,7 @@ const HostTypeDefinition = {
|
|
|
47
48
|
serial: { type: "string", collection: false, writeable: true },
|
|
48
49
|
vendor: { type: "string", collection: false, writeable: true },
|
|
49
50
|
chassis: { type: "string", collection: false, writeable: true },
|
|
51
|
+
architecture: { type: "string", collection: false, writeable: true },
|
|
50
52
|
priority: { type: "number", collection: false, writeable: true },
|
|
51
53
|
replaces: { type: "string", collection: true, writeable: true },
|
|
52
54
|
depends: { type: "string", collection: true, writeable: true },
|
|
@@ -73,6 +75,7 @@ export class Host extends Base {
|
|
|
73
75
|
#deployment;
|
|
74
76
|
#chassis;
|
|
75
77
|
#vendor;
|
|
78
|
+
#architecture;
|
|
76
79
|
|
|
77
80
|
static {
|
|
78
81
|
addType(this);
|
|
@@ -149,6 +152,16 @@ export class Host extends Base {
|
|
|
149
152
|
return this.#vendor || this.extends.find(e => e.vendor)?.vendor;
|
|
150
153
|
}
|
|
151
154
|
|
|
155
|
+
set architecture(value) {
|
|
156
|
+
this.#architecture = value;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
get architecture() {
|
|
160
|
+
return (
|
|
161
|
+
this.#architecture || this.extends.find(e => e.architecture)?.architecture
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
|
|
152
165
|
get derivedPackaging() {
|
|
153
166
|
return this.extends.reduce((a, c) => a.union(c.packaging), new Set());
|
|
154
167
|
}
|
|
@@ -380,36 +393,39 @@ export class Host extends Base {
|
|
|
380
393
|
return readFile(join(this.directory, `ssh_host_${type}_key.pub`), "utf8");
|
|
381
394
|
}
|
|
382
395
|
|
|
383
|
-
async *preparePackages(
|
|
384
|
-
|
|
385
|
-
|
|
396
|
+
async *preparePackages(dir) {
|
|
397
|
+
const packageData = {
|
|
398
|
+
dir,
|
|
399
|
+
sources: [
|
|
400
|
+
new FileContentProvider(dir + "/")[Symbol.asyncIterator]()
|
|
401
|
+
],
|
|
402
|
+
outputs: this.outputs,
|
|
403
|
+
properties: {
|
|
404
|
+
name: `${this.typeName}-${this.owner.name}-${this.name}`,
|
|
405
|
+
description: `${this.typeName} definitions for ${this.fullName}`,
|
|
406
|
+
access: "private",
|
|
407
|
+
dependencies: [
|
|
408
|
+
`${this.location.typeName}-${this.location.name}`,
|
|
409
|
+
...this.depends
|
|
410
|
+
],
|
|
411
|
+
provides: [...this.provides],
|
|
412
|
+
replaces: [`mf-${this.hostName}`, ...this.replaces],
|
|
413
|
+
backup: "root/.ssh/known_hosts",
|
|
414
|
+
hooks: await loadHooks({},
|
|
415
|
+
new URL("host.install", import.meta.url).pathname
|
|
416
|
+
)
|
|
417
|
+
}
|
|
418
|
+
};
|
|
419
|
+
|
|
420
|
+
await generateNetworkDefs(this, packageData);
|
|
421
|
+
await generateMachineInfo(this, packageData);
|
|
422
|
+
await copySshKeys(this, packageData);
|
|
423
|
+
await generateKnownHosts(
|
|
424
|
+
this.owner.hosts(),
|
|
425
|
+
join(dir, "root", ".ssh")
|
|
386
426
|
);
|
|
387
427
|
|
|
388
|
-
|
|
389
|
-
await generateNetworkDefs(this, stagingDir);
|
|
390
|
-
await generateMachineInfo(this, stagingDir);
|
|
391
|
-
await copySshKeys(this, stagingDir);
|
|
392
|
-
await generateKnownHosts(
|
|
393
|
-
this.owner.hosts(),
|
|
394
|
-
join(stagingDir, "root", ".ssh")
|
|
395
|
-
);
|
|
396
|
-
|
|
397
|
-
result.properties.name = `${this.typeName}-${this.owner.name}-${this.name}`;
|
|
398
|
-
result.properties.dependencies = [
|
|
399
|
-
`${this.location.typeName}-${this.location.name}`,
|
|
400
|
-
...this.depends
|
|
401
|
-
];
|
|
402
|
-
result.properties.provides = [...this.provides];
|
|
403
|
-
result.properties.replaces = [`mf-${this.hostName}`, ...this.replaces];
|
|
404
|
-
result.properties.backup = "root/.ssh/known_hosts";
|
|
405
|
-
result.properties.hooks = this.packageHooks;
|
|
406
|
-
|
|
407
|
-
result.sources.push(
|
|
408
|
-
new FileContentProvider(stagingDir + "/")[Symbol.asyncIterator]()
|
|
409
|
-
);
|
|
410
|
-
|
|
411
|
-
yield result;
|
|
412
|
-
}
|
|
428
|
+
yield packageData;
|
|
413
429
|
}
|
|
414
430
|
}
|
|
415
431
|
|
package/src/location.mjs
CHANGED
|
@@ -4,6 +4,7 @@ import { FileContentProvider } from "npm-pkgbuild";
|
|
|
4
4
|
import { Owner } from "./owner.mjs";
|
|
5
5
|
import { addType } from "./types.mjs";
|
|
6
6
|
import { writeLines, sectionLines } from "./utils.mjs";
|
|
7
|
+
import { loadHooks } from "./hooks.mjs";
|
|
7
8
|
|
|
8
9
|
const LocationTypeDefinition = {
|
|
9
10
|
name: "location",
|
|
@@ -45,56 +46,56 @@ export class Location extends Owner {
|
|
|
45
46
|
return [...this.typeList("network")][0] || super.network;
|
|
46
47
|
}
|
|
47
48
|
|
|
48
|
-
async *preparePackages(
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
async *preparePackages(dir) {
|
|
50
|
+
const packageData = {
|
|
51
|
+
dir,
|
|
52
|
+
sources: [new FileContentProvider(dir + "/")[Symbol.asyncIterator]()],
|
|
53
|
+
outputs: this.outputs,
|
|
54
|
+
properties: {
|
|
55
|
+
name: `${this.typeName}-${this.name}`,
|
|
56
|
+
description: `${this.typeName} definitions for ${this.fullName}`,
|
|
57
|
+
access: "private",
|
|
58
|
+
dependencies: { jq: ">=1.6" },
|
|
59
|
+
provides: ["location", "mf-location"],
|
|
60
|
+
replaces: [`mf-location-${this.name}`],
|
|
61
|
+
hooks: await loadHooks(
|
|
62
|
+
{},
|
|
63
|
+
new URL("location.install", import.meta.url).pathname
|
|
64
|
+
)
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
await writeLines(
|
|
69
|
+
join(dir, "etc/systemd/resolved.conf.d"),
|
|
70
|
+
`${this.name}.conf`,
|
|
71
|
+
sectionLines(...this.dns.systemdConfig)
|
|
51
72
|
);
|
|
52
73
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
`${this.name}.conf`,
|
|
63
|
-
sectionLines("Journal", {
|
|
64
|
-
Compress: "yes",
|
|
65
|
-
SystemMaxUse: "500M",
|
|
66
|
-
SyncIntervalSec: "15m"
|
|
67
|
-
})
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
await writeLines(
|
|
71
|
-
join(stagingDir, "etc/systemd/timesyncd.conf.d"),
|
|
72
|
-
`${this.name}.conf`,
|
|
73
|
-
sectionLines(...this.ntp.systemdConfig)
|
|
74
|
-
);
|
|
75
|
-
|
|
76
|
-
const locationDir = join(stagingDir, "etc", "location");
|
|
77
|
-
|
|
78
|
-
await mkdir(locationDir, { recursive: true });
|
|
79
|
-
|
|
80
|
-
await copyFile(
|
|
81
|
-
join(this.directory, "location.json"),
|
|
82
|
-
join(locationDir, "location.json")
|
|
83
|
-
);
|
|
74
|
+
await writeLines(
|
|
75
|
+
join(dir, "etc/systemd/journald.conf.d"),
|
|
76
|
+
`${this.name}.conf`,
|
|
77
|
+
sectionLines("Journal", {
|
|
78
|
+
Compress: "yes",
|
|
79
|
+
SystemMaxUse: "500M",
|
|
80
|
+
SyncIntervalSec: "15m"
|
|
81
|
+
})
|
|
82
|
+
);
|
|
84
83
|
|
|
85
|
-
|
|
84
|
+
await writeLines(
|
|
85
|
+
join(dir, "etc/systemd/timesyncd.conf.d"),
|
|
86
|
+
`${this.name}.conf`,
|
|
87
|
+
sectionLines(...this.ntp.systemdConfig)
|
|
88
|
+
);
|
|
86
89
|
|
|
87
|
-
|
|
88
|
-
result.properties.depends = { jq: ">=1.6" };
|
|
89
|
-
result.properties.replaces = [`mf-location-${this.name}`];
|
|
90
|
+
const locationDir = join(dir, "etc", "location");
|
|
90
91
|
|
|
91
|
-
|
|
92
|
-
new FileContentProvider(stagingDir + "/")[Symbol.asyncIterator]()
|
|
93
|
-
);
|
|
92
|
+
await mkdir(locationDir, { recursive: true });
|
|
94
93
|
|
|
95
|
-
|
|
94
|
+
await copyFile(
|
|
95
|
+
join(this.directory, "location.json"),
|
|
96
|
+
join(locationDir, "location.json")
|
|
97
|
+
);
|
|
96
98
|
|
|
97
|
-
|
|
98
|
-
}
|
|
99
|
+
yield packageData;
|
|
99
100
|
}
|
|
100
101
|
}
|
package/src/owner.mjs
CHANGED
|
@@ -30,6 +30,7 @@ const OwnerTypeDefinition = {
|
|
|
30
30
|
domain: { type: "string", collection: false, writeable: true },
|
|
31
31
|
domains: { type: "string", collection: true, writeable: true },
|
|
32
32
|
timezone: { type: "string", collection: false, writeable: true },
|
|
33
|
+
architectures: { type: "string", collection: true, writeable: true },
|
|
33
34
|
locales: { type: "string", collection: true, writeable: true },
|
|
34
35
|
administratorEmail: { type: "string", collection: false, writeable: true }
|
|
35
36
|
}
|
|
@@ -396,25 +397,38 @@ export class Owner extends Base {
|
|
|
396
397
|
return this.domain ? new Set([this.domain]) : new Set();
|
|
397
398
|
}
|
|
398
399
|
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
let domains = new Set();
|
|
400
|
+
get domainNames() {
|
|
401
|
+
let names = new Set();
|
|
402
402
|
|
|
403
|
-
for (const
|
|
404
|
-
|
|
403
|
+
for (const host of this.hosts()) {
|
|
404
|
+
names = names.union(new Set(host.domainNames));
|
|
405
405
|
}
|
|
406
406
|
|
|
407
|
-
return
|
|
407
|
+
return names;
|
|
408
408
|
}
|
|
409
|
-
*/
|
|
410
409
|
|
|
411
|
-
|
|
412
|
-
|
|
410
|
+
#architectures;
|
|
411
|
+
|
|
412
|
+
set architectures(value)
|
|
413
|
+
{
|
|
414
|
+
if (value instanceof Set) {
|
|
415
|
+
this.#architectures = this.#architectures ? this.#architectures.union(value) : value;
|
|
416
|
+
} else {
|
|
417
|
+
this.#architectures = new Set(value);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
get architectures() {
|
|
422
|
+
if(this.#architectures) {
|
|
423
|
+
return this.#architectures;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
const architectures = new Set();
|
|
413
427
|
|
|
414
428
|
for (const host of this.hosts()) {
|
|
415
|
-
|
|
429
|
+
architectures.add(host.architecture);
|
|
416
430
|
}
|
|
417
431
|
|
|
418
|
-
return
|
|
432
|
+
return architectures;
|
|
419
433
|
}
|
|
420
434
|
}
|
package/types/base.d.mts
CHANGED
|
@@ -73,9 +73,6 @@ export class Base {
|
|
|
73
73
|
set packaging(value: Set<any>);
|
|
74
74
|
get packaging(): Set<any>;
|
|
75
75
|
get derivedPackaging(): any;
|
|
76
|
-
get packageHooks(): {};
|
|
77
|
-
loadPackageHooks(file: any): Promise<void>;
|
|
78
|
-
addPackageHook(name: any, content: any): void;
|
|
79
76
|
get outputs(): Set<typeof import("npm-pkgbuild").ARCH | typeof import("npm-pkgbuild").DOCKER>;
|
|
80
77
|
preparePackages(stagingDir: any): AsyncGenerator<{
|
|
81
78
|
sources: any[];
|
package/types/cluster.d.mts
CHANGED
|
@@ -127,6 +127,11 @@ export class Cluster extends Host {
|
|
|
127
127
|
collection: boolean;
|
|
128
128
|
writeable: boolean;
|
|
129
129
|
};
|
|
130
|
+
serial: {
|
|
131
|
+
type: string;
|
|
132
|
+
collection: boolean;
|
|
133
|
+
writeable: boolean;
|
|
134
|
+
};
|
|
130
135
|
refresh: {
|
|
131
136
|
type: string;
|
|
132
137
|
collection: boolean;
|
|
@@ -193,6 +198,11 @@ export class Cluster extends Host {
|
|
|
193
198
|
collection: boolean;
|
|
194
199
|
writeable: boolean;
|
|
195
200
|
};
|
|
201
|
+
architectures: {
|
|
202
|
+
type: string;
|
|
203
|
+
collection: boolean;
|
|
204
|
+
writeable: boolean;
|
|
205
|
+
};
|
|
196
206
|
locales: {
|
|
197
207
|
type: string;
|
|
198
208
|
collection: boolean;
|
|
@@ -303,6 +313,11 @@ export class Cluster extends Host {
|
|
|
303
313
|
collection: boolean;
|
|
304
314
|
writeable: boolean;
|
|
305
315
|
};
|
|
316
|
+
architecture: {
|
|
317
|
+
type: string;
|
|
318
|
+
collection: boolean;
|
|
319
|
+
writeable: boolean;
|
|
320
|
+
};
|
|
306
321
|
priority: {
|
|
307
322
|
type: string;
|
|
308
323
|
collection: boolean;
|
|
@@ -390,7 +405,7 @@ export class Cluster extends Host {
|
|
|
390
405
|
get backups(): Set<any>;
|
|
391
406
|
get members(): Set<any>;
|
|
392
407
|
preparePackages(stagingDir: any): AsyncGenerator<{
|
|
393
|
-
sources:
|
|
408
|
+
sources: AsyncIterable<import("content-entry").ContentEntry>[];
|
|
394
409
|
outputs: any;
|
|
395
410
|
properties: {
|
|
396
411
|
name: string;
|
package/types/dns.d.mts
CHANGED
|
@@ -41,6 +41,11 @@ export class DNSService extends Base {
|
|
|
41
41
|
collection: boolean;
|
|
42
42
|
writeable: boolean;
|
|
43
43
|
};
|
|
44
|
+
serial: {
|
|
45
|
+
type: string;
|
|
46
|
+
collection: boolean;
|
|
47
|
+
writeable: boolean;
|
|
48
|
+
};
|
|
44
49
|
refresh: {
|
|
45
50
|
type: string;
|
|
46
51
|
collection: boolean;
|
|
@@ -74,6 +79,7 @@ export class DNSService extends Base {
|
|
|
74
79
|
hasCatalog: boolean;
|
|
75
80
|
hasLinkLocalAdresses: boolean;
|
|
76
81
|
notify: boolean;
|
|
82
|
+
serial: number;
|
|
77
83
|
refresh: number;
|
|
78
84
|
retry: number;
|
|
79
85
|
expire: number;
|
|
@@ -91,8 +97,9 @@ export class DNSService extends Base {
|
|
|
91
97
|
MulticastDNS: string;
|
|
92
98
|
LLMNR: string;
|
|
93
99
|
})[];
|
|
94
|
-
preparePackages(
|
|
95
|
-
|
|
100
|
+
preparePackages(dir: any): AsyncGenerator<{
|
|
101
|
+
dir: string;
|
|
102
|
+
sources: AsyncIterable<import("content-entry").ContentEntry>[];
|
|
96
103
|
outputs: Set<typeof import("npm-pkgbuild").ARCH | typeof import("npm-pkgbuild").DOCKER>;
|
|
97
104
|
properties: {
|
|
98
105
|
name: string;
|
package/types/host-utils.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export function generateMachineInfo(host: any,
|
|
2
|
-
export function generateNetworkDefs(host: any,
|
|
3
|
-
export function copySshKeys(host: any,
|
|
1
|
+
export function generateMachineInfo(host: any, packageData: any): Promise<void>;
|
|
2
|
+
export function generateNetworkDefs(host: any, packageData: any): Promise<void>;
|
|
3
|
+
export function copySshKeys(host: any, packageData: any): Promise<void>;
|
|
4
4
|
export function generateKnownHosts(hosts: any, dir: any): Promise<void>;
|
package/types/host.d.mts
CHANGED
|
@@ -96,6 +96,11 @@ export class Host extends Base {
|
|
|
96
96
|
collection: boolean;
|
|
97
97
|
writeable: boolean;
|
|
98
98
|
};
|
|
99
|
+
architecture: {
|
|
100
|
+
type: string;
|
|
101
|
+
collection: boolean;
|
|
102
|
+
writeable: boolean;
|
|
103
|
+
};
|
|
99
104
|
priority: {
|
|
100
105
|
type: string;
|
|
101
106
|
collection: boolean;
|
|
@@ -170,6 +175,8 @@ export class Host extends Base {
|
|
|
170
175
|
get chassis(): any;
|
|
171
176
|
set vendor(value: any);
|
|
172
177
|
get vendor(): any;
|
|
178
|
+
set architecture(value: any);
|
|
179
|
+
get architecture(): any;
|
|
173
180
|
get isTemplate(): true | RegExpMatchArray;
|
|
174
181
|
get isModel(): boolean;
|
|
175
182
|
get model(): any;
|
|
@@ -205,6 +212,21 @@ export class Host extends Base {
|
|
|
205
212
|
get cidrAddress(): any;
|
|
206
213
|
get cidrAddresses(): any[];
|
|
207
214
|
publicKey(type?: string): Promise<string>;
|
|
215
|
+
preparePackages(dir: any): AsyncGenerator<{
|
|
216
|
+
dir: any;
|
|
217
|
+
sources: AsyncIterable<import("content-entry").ContentEntry>[];
|
|
218
|
+
outputs: Set<typeof import("npm-pkgbuild").ARCH | typeof import("npm-pkgbuild").DOCKER>;
|
|
219
|
+
properties: {
|
|
220
|
+
name: string;
|
|
221
|
+
description: string;
|
|
222
|
+
access: string;
|
|
223
|
+
dependencies: any[];
|
|
224
|
+
provides: any[];
|
|
225
|
+
replaces: any[];
|
|
226
|
+
backup: string;
|
|
227
|
+
hooks: any;
|
|
228
|
+
};
|
|
229
|
+
}, void, unknown>;
|
|
208
230
|
#private;
|
|
209
231
|
}
|
|
210
232
|
export class NetworkInterface extends Base {
|
package/types/location.d.mts
CHANGED
|
@@ -127,6 +127,11 @@ export class Location extends Owner {
|
|
|
127
127
|
collection: boolean;
|
|
128
128
|
writeable: boolean;
|
|
129
129
|
};
|
|
130
|
+
serial: {
|
|
131
|
+
type: string;
|
|
132
|
+
collection: boolean;
|
|
133
|
+
writeable: boolean;
|
|
134
|
+
};
|
|
130
135
|
refresh: {
|
|
131
136
|
type: string;
|
|
132
137
|
collection: boolean;
|
|
@@ -193,6 +198,11 @@ export class Location extends Owner {
|
|
|
193
198
|
collection: boolean;
|
|
194
199
|
writeable: boolean;
|
|
195
200
|
};
|
|
201
|
+
architectures: {
|
|
202
|
+
type: string;
|
|
203
|
+
collection: boolean;
|
|
204
|
+
writeable: boolean;
|
|
205
|
+
};
|
|
196
206
|
locales: {
|
|
197
207
|
type: string;
|
|
198
208
|
collection: boolean;
|
|
@@ -332,6 +342,11 @@ export class Location extends Owner {
|
|
|
332
342
|
collection: boolean;
|
|
333
343
|
writeable: boolean;
|
|
334
344
|
};
|
|
345
|
+
serial: {
|
|
346
|
+
type: string;
|
|
347
|
+
collection: boolean;
|
|
348
|
+
writeable: boolean;
|
|
349
|
+
};
|
|
335
350
|
refresh: {
|
|
336
351
|
type: string;
|
|
337
352
|
collection: boolean;
|
|
@@ -398,6 +413,11 @@ export class Location extends Owner {
|
|
|
398
413
|
collection: boolean;
|
|
399
414
|
writeable: boolean;
|
|
400
415
|
};
|
|
416
|
+
architectures: {
|
|
417
|
+
type: string;
|
|
418
|
+
collection: boolean;
|
|
419
|
+
writeable: boolean;
|
|
420
|
+
};
|
|
401
421
|
locales: {
|
|
402
422
|
type: string;
|
|
403
423
|
collection: boolean;
|
|
@@ -419,5 +439,21 @@ export class Location extends Owner {
|
|
|
419
439
|
};
|
|
420
440
|
};
|
|
421
441
|
get location(): this;
|
|
442
|
+
preparePackages(dir: any): AsyncGenerator<{
|
|
443
|
+
dir: any;
|
|
444
|
+
sources: AsyncIterable<import("content-entry").ContentEntry>[];
|
|
445
|
+
outputs: Set<typeof import("npm-pkgbuild").ARCH | typeof import("npm-pkgbuild").DOCKER>;
|
|
446
|
+
properties: {
|
|
447
|
+
name: string;
|
|
448
|
+
description: string;
|
|
449
|
+
access: string;
|
|
450
|
+
dependencies: {
|
|
451
|
+
jq: string;
|
|
452
|
+
};
|
|
453
|
+
provides: string[];
|
|
454
|
+
replaces: string[];
|
|
455
|
+
hooks: any;
|
|
456
|
+
};
|
|
457
|
+
}, void, unknown>;
|
|
422
458
|
}
|
|
423
459
|
import { Owner } from "./owner.mjs";
|
package/types/network.d.mts
CHANGED
|
@@ -129,6 +129,11 @@ export class Network extends Owner {
|
|
|
129
129
|
collection: boolean;
|
|
130
130
|
writeable: boolean;
|
|
131
131
|
};
|
|
132
|
+
serial: {
|
|
133
|
+
type: string;
|
|
134
|
+
collection: boolean;
|
|
135
|
+
writeable: boolean;
|
|
136
|
+
};
|
|
132
137
|
refresh: {
|
|
133
138
|
type: string;
|
|
134
139
|
collection: boolean;
|
|
@@ -195,6 +200,11 @@ export class Network extends Owner {
|
|
|
195
200
|
collection: boolean;
|
|
196
201
|
writeable: boolean;
|
|
197
202
|
};
|
|
203
|
+
architectures: {
|
|
204
|
+
type: string;
|
|
205
|
+
collection: boolean;
|
|
206
|
+
writeable: boolean;
|
|
207
|
+
};
|
|
198
208
|
locales: {
|
|
199
209
|
type: string;
|
|
200
210
|
collection: boolean;
|
package/types/owner.d.mts
CHANGED
|
@@ -125,6 +125,11 @@ export class Owner extends Base {
|
|
|
125
125
|
collection: boolean;
|
|
126
126
|
writeable: boolean;
|
|
127
127
|
};
|
|
128
|
+
serial: {
|
|
129
|
+
type: string;
|
|
130
|
+
collection: boolean;
|
|
131
|
+
writeable: boolean;
|
|
132
|
+
};
|
|
128
133
|
refresh: {
|
|
129
134
|
type: string;
|
|
130
135
|
collection: boolean;
|
|
@@ -191,6 +196,11 @@ export class Owner extends Base {
|
|
|
191
196
|
collection: boolean;
|
|
192
197
|
writeable: boolean;
|
|
193
198
|
};
|
|
199
|
+
architectures: {
|
|
200
|
+
type: string;
|
|
201
|
+
collection: boolean;
|
|
202
|
+
writeable: boolean;
|
|
203
|
+
};
|
|
194
204
|
locales: {
|
|
195
205
|
type: string;
|
|
196
206
|
collection: boolean;
|
|
@@ -238,6 +248,8 @@ export class Owner extends Base {
|
|
|
238
248
|
get domains(): Set<any>;
|
|
239
249
|
get localDomains(): Set<any>;
|
|
240
250
|
get domainNames(): Set<any>;
|
|
251
|
+
set architectures(value: any);
|
|
252
|
+
get architectures(): any;
|
|
241
253
|
#private;
|
|
242
254
|
}
|
|
243
255
|
import { Base } from "./base.mjs";
|
package/types/root.d.mts
CHANGED
|
@@ -131,6 +131,11 @@ export class Root extends Location {
|
|
|
131
131
|
collection: boolean;
|
|
132
132
|
writeable: boolean;
|
|
133
133
|
};
|
|
134
|
+
serial: {
|
|
135
|
+
type: string;
|
|
136
|
+
collection: boolean;
|
|
137
|
+
writeable: boolean;
|
|
138
|
+
};
|
|
134
139
|
refresh: {
|
|
135
140
|
type: string;
|
|
136
141
|
collection: boolean;
|
|
@@ -197,6 +202,11 @@ export class Root extends Location {
|
|
|
197
202
|
collection: boolean;
|
|
198
203
|
writeable: boolean;
|
|
199
204
|
};
|
|
205
|
+
architectures: {
|
|
206
|
+
type: string;
|
|
207
|
+
collection: boolean;
|
|
208
|
+
writeable: boolean;
|
|
209
|
+
};
|
|
200
210
|
locales: {
|
|
201
211
|
type: string;
|
|
202
212
|
collection: boolean;
|
|
@@ -336,6 +346,11 @@ export class Root extends Location {
|
|
|
336
346
|
collection: boolean;
|
|
337
347
|
writeable: boolean;
|
|
338
348
|
};
|
|
349
|
+
serial: {
|
|
350
|
+
type: string;
|
|
351
|
+
collection: boolean;
|
|
352
|
+
writeable: boolean;
|
|
353
|
+
};
|
|
339
354
|
refresh: {
|
|
340
355
|
type: string;
|
|
341
356
|
collection: boolean;
|
|
@@ -402,6 +417,11 @@ export class Root extends Location {
|
|
|
402
417
|
collection: boolean;
|
|
403
418
|
writeable: boolean;
|
|
404
419
|
};
|
|
420
|
+
architectures: {
|
|
421
|
+
type: string;
|
|
422
|
+
collection: boolean;
|
|
423
|
+
writeable: boolean;
|
|
424
|
+
};
|
|
405
425
|
locales: {
|
|
406
426
|
type: string;
|
|
407
427
|
collection: boolean;
|