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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pmcf",
3
- "version": "1.27.0",
3
+ "version": "1.27.2",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
package/src/base.mjs CHANGED
@@ -122,10 +122,7 @@ export class Base {
122
122
  }
123
123
 
124
124
  execFinalize() {
125
- this.traverse(object => {
126
- //console.log(object.toString());
127
- object._finalize();
128
- });
125
+ this.traverse(object => object._finalize());
129
126
  }
130
127
 
131
128
  _finalize() {
@@ -0,0 +1,7 @@
1
+ import { Owner } from "./owner.mjs";
2
+
3
+ export class Cluster extends Owner {
4
+ static get typeName() {
5
+ return "cluster";
6
+ }
7
+ }
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
@@ -1,4 +1,6 @@
1
1
  export * from "./base.mjs";
2
2
  export * from "./service.mjs";
3
3
  export * from "./dns.mjs";
4
+ export * from "./cluster.mjs";
5
+ export * from "./owner.mjs";
4
6
  export * from "./model.mjs";
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
+ }
@@ -0,0 +1,3 @@
1
+ export class Cluster extends Owner {
2
+ }
3
+ import { Owner } from "./owner.mjs";
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 Service | typeof DNSService | typeof Network | typeof Host | typeof Location | typeof Subnet;
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 { Base } from "./base.mjs";
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";
@@ -1,4 +1,6 @@
1
1
  export * from "./base.mjs";
2
2
  export * from "./service.mjs";
3
3
  export * from "./dns.mjs";
4
+ export * from "./cluster.mjs";
5
+ export * from "./owner.mjs";
4
6
  export * from "./model.mjs";
@@ -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";