pmcf 1.27.0 → 1.27.2
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 +1 -1
- package/src/base.mjs +1 -4
- package/src/cluster.mjs +7 -0
- package/src/model.mjs +3 -198
- package/src/module.mjs +2 -0
- package/src/owner.mjs +199 -0
- package/types/cluster.d.mts +3 -0
- package/types/model.d.mts +4 -31
- package/types/module.d.mts +2 -0
- package/types/owner.d.mts +31 -0
package/package.json
CHANGED
package/src/base.mjs
CHANGED
package/src/cluster.mjs
ADDED
package/src/model.mjs
CHANGED
|
@@ -2,211 +2,16 @@ import { readFile, glob } from "node:fs/promises";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import {
|
|
4
4
|
asArray,
|
|
5
|
-
bridgeToJSON,
|
|
6
5
|
isIPv4Address,
|
|
7
6
|
isIPv6Address,
|
|
8
7
|
normalizeIPAddress
|
|
9
8
|
} from "./utils.mjs";
|
|
10
9
|
import { Base } from "./base.mjs";
|
|
10
|
+
import { Owner } from "./owner.mjs";
|
|
11
11
|
import { Service } from "./service.mjs";
|
|
12
|
+
import { Cluster } from "./cluster.mjs";
|
|
12
13
|
import { DNSService } from "./dns.mjs";
|
|
13
14
|
|
|
14
|
-
export class Owner extends Base {
|
|
15
|
-
#hosts = new Map();
|
|
16
|
-
#networks = new Map();
|
|
17
|
-
#subnets = new Map();
|
|
18
|
-
#bridges = new Set();
|
|
19
|
-
#dns;
|
|
20
|
-
#administratorEmail;
|
|
21
|
-
domain;
|
|
22
|
-
ntp = { servers: [] };
|
|
23
|
-
|
|
24
|
-
constructor(owner, data) {
|
|
25
|
-
super(owner, data);
|
|
26
|
-
|
|
27
|
-
let dns;
|
|
28
|
-
if (data?.dns) {
|
|
29
|
-
dns = data.dns;
|
|
30
|
-
delete data.dns;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
this.#dns = new DNSService(this, dns);
|
|
34
|
-
|
|
35
|
-
if (data?.networks) {
|
|
36
|
-
const networks = data.networks;
|
|
37
|
-
delete data.networks;
|
|
38
|
-
|
|
39
|
-
for (const [name, data] of Object.entries(networks)) {
|
|
40
|
-
data.name = name;
|
|
41
|
-
new Network(this, data);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
Object.assign(this, data);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
_traverse(...args) {
|
|
48
|
-
if (super._traverse(...args)) {
|
|
49
|
-
for (const network of this.#networks.values()) {
|
|
50
|
-
network._traverse(...args);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
for (const host of this.#hosts.values()) {
|
|
54
|
-
host._traverse(...args);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return true;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return false;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
get dns() {
|
|
64
|
-
return this.#dns;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
async *hosts() {
|
|
68
|
-
for (const host of this.#hosts.values()) {
|
|
69
|
-
yield host;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
addObject(object) {
|
|
74
|
-
this.world.addObject(object);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
addHost(host) {
|
|
78
|
-
this.#hosts.set(host.name, host);
|
|
79
|
-
this.addObject(host);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
async service(filter) {
|
|
83
|
-
let best;
|
|
84
|
-
for await (const service of this.services(filter)) {
|
|
85
|
-
if (!best || service.priority < best.priority) {
|
|
86
|
-
best = service;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return best;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
async *services(filter) {
|
|
94
|
-
for await (const host of this.hosts()) {
|
|
95
|
-
for await (const service of host.services(filter)) {
|
|
96
|
-
yield service;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
networkNamed(name) {
|
|
102
|
-
return this.#networks.get(name);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
async *networks() {
|
|
106
|
-
for (const network of this.#networks.values()) {
|
|
107
|
-
yield network;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
addNetwork(network) {
|
|
112
|
-
this.#networks.set(network.fullName, network);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
addBridge(network, destinationNetworks) {
|
|
116
|
-
if (destinationNetworks) {
|
|
117
|
-
let bridge;
|
|
118
|
-
|
|
119
|
-
for (bridge of this.#bridges) {
|
|
120
|
-
if (bridge.has(network.name)) {
|
|
121
|
-
bridge.delete(network.name);
|
|
122
|
-
bridge.add(network);
|
|
123
|
-
break;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
if (bridge.has(network)) {
|
|
127
|
-
break;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
if (!bridge) {
|
|
132
|
-
bridge = new Set([network]);
|
|
133
|
-
this.#bridges.add(bridge);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
for (const name of asArray(destinationNetworks)) {
|
|
137
|
-
const other = this.networkNamed(name);
|
|
138
|
-
if (other) {
|
|
139
|
-
bridge.add(other);
|
|
140
|
-
other.bridge = bridge;
|
|
141
|
-
} else {
|
|
142
|
-
bridge.add(name);
|
|
143
|
-
this.finalize(() => this._resolveBridges());
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
return bridge;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
_resolveBridges() {
|
|
152
|
-
for (const bridge of this.#bridges) {
|
|
153
|
-
this.info(bridgeToJSON(bridge));
|
|
154
|
-
for (const network of bridge) {
|
|
155
|
-
if (typeof network === "string") {
|
|
156
|
-
const other = this.networkNamed(network);
|
|
157
|
-
|
|
158
|
-
if (other) {
|
|
159
|
-
bridge.delete(network);
|
|
160
|
-
bridge.add(other);
|
|
161
|
-
other.bridge = bridge;
|
|
162
|
-
//this.info("RESOLVE", network, other, bridgeToJSON(bridge));
|
|
163
|
-
} else {
|
|
164
|
-
this.error(`Unresolvabale bridge network`, network);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
async *networkAddresses() {
|
|
172
|
-
for await (const host of this.hosts()) {
|
|
173
|
-
for (const networkAddresses of host.networkAddresses()) {
|
|
174
|
-
yield networkAddresses;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
addSubnet(subnet) {
|
|
180
|
-
this.#subnets.set(subnet.name, subnet);
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
subnet(name) {
|
|
184
|
-
return this.#subnets.get(name);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
subnets() {
|
|
188
|
-
return this.#subnets.values();
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
get administratorEmail() {
|
|
192
|
-
return this.#administratorEmail || "admin@" + this.domain;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
get propertyNames() {
|
|
196
|
-
return [...super.propertyNames, "domain", "administratorEmail", "dns"];
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
toJSON() {
|
|
200
|
-
return {
|
|
201
|
-
...super.toJSON(),
|
|
202
|
-
networks: [...this.#networks.keys()].sort(),
|
|
203
|
-
subnets: [...this.#subnets.keys()].sort(),
|
|
204
|
-
bridges: [...this.#bridges].map(b => bridgeToJSON(b)),
|
|
205
|
-
hosts: [...this.#hosts.keys()].sort()
|
|
206
|
-
};
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
15
|
export class World extends Owner {
|
|
211
16
|
static get types() {
|
|
212
17
|
return _typesByName;
|
|
@@ -870,5 +675,5 @@ export class Subnet extends Base {
|
|
|
870
675
|
}
|
|
871
676
|
}
|
|
872
677
|
|
|
873
|
-
const _types = [Location, Network, Subnet, Host, Service, DNSService];
|
|
678
|
+
const _types = [Location, Network, Subnet, Host, Cluster, Service, DNSService];
|
|
874
679
|
const _typesByName = Object.fromEntries(_types.map(t => [t.typeName, t]));
|
package/src/module.mjs
CHANGED
package/src/owner.mjs
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { asArray, bridgeToJSON } from "./utils.mjs";
|
|
2
|
+
|
|
3
|
+
import { Base } from "./base.mjs";
|
|
4
|
+
import { DNSService } from "./dns.mjs";
|
|
5
|
+
|
|
6
|
+
export class Owner extends Base {
|
|
7
|
+
#hosts = new Map();
|
|
8
|
+
#networks = new Map();
|
|
9
|
+
#subnets = new Map();
|
|
10
|
+
#bridges = new Set();
|
|
11
|
+
#dns;
|
|
12
|
+
#administratorEmail;
|
|
13
|
+
domain;
|
|
14
|
+
ntp = { servers: [] };
|
|
15
|
+
|
|
16
|
+
constructor(owner, data) {
|
|
17
|
+
super(owner, data);
|
|
18
|
+
|
|
19
|
+
let dns;
|
|
20
|
+
if (data?.dns) {
|
|
21
|
+
dns = data.dns;
|
|
22
|
+
delete data.dns;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
this.#dns = new DNSService(this, dns);
|
|
26
|
+
|
|
27
|
+
if (data?.networks) {
|
|
28
|
+
const networks = data.networks;
|
|
29
|
+
delete data.networks;
|
|
30
|
+
|
|
31
|
+
for (const [name, data] of Object.entries(networks)) {
|
|
32
|
+
data.name = name;
|
|
33
|
+
new Network(this, data);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
Object.assign(this, data);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
_traverse(...args) {
|
|
40
|
+
if (super._traverse(...args)) {
|
|
41
|
+
for (const network of this.#networks.values()) {
|
|
42
|
+
network._traverse(...args);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
for (const host of this.#hosts.values()) {
|
|
46
|
+
host._traverse(...args);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
get dns() {
|
|
56
|
+
return this.#dns;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async *hosts() {
|
|
60
|
+
for (const host of this.#hosts.values()) {
|
|
61
|
+
yield host;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
addObject(object) {
|
|
66
|
+
this.world.addObject(object);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
addHost(host) {
|
|
70
|
+
this.#hosts.set(host.name, host);
|
|
71
|
+
this.addObject(host);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async service(filter) {
|
|
75
|
+
let best;
|
|
76
|
+
for await (const service of this.services(filter)) {
|
|
77
|
+
if (!best || service.priority < best.priority) {
|
|
78
|
+
best = service;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return best;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async *services(filter) {
|
|
86
|
+
for await (const host of this.hosts()) {
|
|
87
|
+
for await (const service of host.services(filter)) {
|
|
88
|
+
yield service;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
networkNamed(name) {
|
|
94
|
+
return this.#networks.get(name);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async *networks() {
|
|
98
|
+
for (const network of this.#networks.values()) {
|
|
99
|
+
yield network;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
addNetwork(network) {
|
|
104
|
+
this.#networks.set(network.fullName, network);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
addBridge(network, destinationNetworks) {
|
|
108
|
+
if (destinationNetworks) {
|
|
109
|
+
let bridge;
|
|
110
|
+
|
|
111
|
+
for (bridge of this.#bridges) {
|
|
112
|
+
if (bridge.has(network.name)) {
|
|
113
|
+
bridge.delete(network.name);
|
|
114
|
+
bridge.add(network);
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (bridge.has(network)) {
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (!bridge) {
|
|
124
|
+
bridge = new Set([network]);
|
|
125
|
+
this.#bridges.add(bridge);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
for (const name of asArray(destinationNetworks)) {
|
|
129
|
+
const other = this.networkNamed(name);
|
|
130
|
+
if (other) {
|
|
131
|
+
bridge.add(other);
|
|
132
|
+
other.bridge = bridge;
|
|
133
|
+
} else {
|
|
134
|
+
bridge.add(name);
|
|
135
|
+
this.finalize(() => this._resolveBridges());
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return bridge;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
_resolveBridges() {
|
|
144
|
+
for (const bridge of this.#bridges) {
|
|
145
|
+
this.info(bridgeToJSON(bridge));
|
|
146
|
+
for (const network of bridge) {
|
|
147
|
+
if (typeof network === "string") {
|
|
148
|
+
const other = this.networkNamed(network);
|
|
149
|
+
|
|
150
|
+
if (other) {
|
|
151
|
+
bridge.delete(network);
|
|
152
|
+
bridge.add(other);
|
|
153
|
+
other.bridge = bridge;
|
|
154
|
+
} else {
|
|
155
|
+
this.error(`Unresolvabale bridge network`, network);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
async *networkAddresses() {
|
|
163
|
+
for await (const host of this.hosts()) {
|
|
164
|
+
for (const networkAddresses of host.networkAddresses()) {
|
|
165
|
+
yield networkAddresses;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
addSubnet(subnet) {
|
|
171
|
+
this.#subnets.set(subnet.name, subnet);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
subnet(name) {
|
|
175
|
+
return this.#subnets.get(name);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
subnets() {
|
|
179
|
+
return this.#subnets.values();
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
get administratorEmail() {
|
|
183
|
+
return this.#administratorEmail || "admin@" + this.domain;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
get propertyNames() {
|
|
187
|
+
return [...super.propertyNames, "domain", "administratorEmail", "dns"];
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
toJSON() {
|
|
191
|
+
return {
|
|
192
|
+
...super.toJSON(),
|
|
193
|
+
networks: [...this.#networks.keys()].sort(),
|
|
194
|
+
subnets: [...this.#subnets.keys()].sort(),
|
|
195
|
+
bridges: [...this.#bridges].map(b => bridgeToJSON(b)),
|
|
196
|
+
hosts: [...this.#hosts.keys()].sort()
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
}
|
package/types/model.d.mts
CHANGED
|
@@ -1,35 +1,6 @@
|
|
|
1
|
-
export class Owner extends Base {
|
|
2
|
-
domain: any;
|
|
3
|
-
ntp: {
|
|
4
|
-
servers: any[];
|
|
5
|
-
};
|
|
6
|
-
_traverse(...args: any[]): boolean;
|
|
7
|
-
get dns(): DNSService;
|
|
8
|
-
hosts(): AsyncGenerator<any, void, unknown>;
|
|
9
|
-
addObject(object: any): void;
|
|
10
|
-
addHost(host: any): void;
|
|
11
|
-
service(filter: any): Promise<any>;
|
|
12
|
-
services(filter: any): AsyncGenerator<any, void, unknown>;
|
|
13
|
-
networkNamed(name: any): any;
|
|
14
|
-
networks(): AsyncGenerator<any, void, unknown>;
|
|
15
|
-
addNetwork(network: any): void;
|
|
16
|
-
addBridge(network: any, destinationNetworks: any): any;
|
|
17
|
-
_resolveBridges(): void;
|
|
18
|
-
networkAddresses(): AsyncGenerator<any, void, unknown>;
|
|
19
|
-
addSubnet(subnet: any): void;
|
|
20
|
-
subnet(name: any): any;
|
|
21
|
-
subnets(): MapIterator<any>;
|
|
22
|
-
toJSON(): {
|
|
23
|
-
networks: any[];
|
|
24
|
-
subnets: any[];
|
|
25
|
-
bridges: any[][];
|
|
26
|
-
hosts: any[];
|
|
27
|
-
};
|
|
28
|
-
#private;
|
|
29
|
-
}
|
|
30
1
|
export class World extends Owner {
|
|
31
2
|
static get types(): {
|
|
32
|
-
[k: string]: typeof
|
|
3
|
+
[k: string]: typeof DNSService | typeof Cluster | typeof Service | typeof Host | typeof Network | typeof Subnet;
|
|
33
4
|
};
|
|
34
5
|
constructor(directory: any);
|
|
35
6
|
get fullName(): string;
|
|
@@ -114,6 +85,8 @@ export class Subnet extends Base {
|
|
|
114
85
|
networks: Set<any>;
|
|
115
86
|
get address(): any;
|
|
116
87
|
}
|
|
117
|
-
import {
|
|
88
|
+
import { Owner } from "./owner.mjs";
|
|
118
89
|
import { DNSService } from "./dns.mjs";
|
|
90
|
+
import { Cluster } from "./cluster.mjs";
|
|
119
91
|
import { Service } from "./service.mjs";
|
|
92
|
+
import { Base } from "./base.mjs";
|
package/types/module.d.mts
CHANGED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export class Owner extends Base {
|
|
2
|
+
domain: any;
|
|
3
|
+
ntp: {
|
|
4
|
+
servers: any[];
|
|
5
|
+
};
|
|
6
|
+
_traverse(...args: any[]): boolean;
|
|
7
|
+
get dns(): DNSService;
|
|
8
|
+
hosts(): AsyncGenerator<any, void, unknown>;
|
|
9
|
+
addObject(object: any): void;
|
|
10
|
+
addHost(host: any): void;
|
|
11
|
+
service(filter: any): Promise<any>;
|
|
12
|
+
services(filter: any): AsyncGenerator<any, void, unknown>;
|
|
13
|
+
networkNamed(name: any): any;
|
|
14
|
+
networks(): AsyncGenerator<any, void, unknown>;
|
|
15
|
+
addNetwork(network: any): void;
|
|
16
|
+
addBridge(network: any, destinationNetworks: any): any;
|
|
17
|
+
_resolveBridges(): void;
|
|
18
|
+
networkAddresses(): AsyncGenerator<any, void, unknown>;
|
|
19
|
+
addSubnet(subnet: any): void;
|
|
20
|
+
subnet(name: any): any;
|
|
21
|
+
subnets(): MapIterator<any>;
|
|
22
|
+
toJSON(): {
|
|
23
|
+
networks: any[];
|
|
24
|
+
subnets: any[];
|
|
25
|
+
bridges: any[][];
|
|
26
|
+
hosts: any[];
|
|
27
|
+
};
|
|
28
|
+
#private;
|
|
29
|
+
}
|
|
30
|
+
import { Base } from "./base.mjs";
|
|
31
|
+
import { DNSService } from "./dns.mjs";
|