@takodotid/circuit 0.33.0 → 0.34.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/dist/cli/index.js CHANGED
@@ -2450,6 +2450,9 @@ function routed(entry, device, name, settings, access) {
2450
2450
  entry.set("allowaccess", access);
2451
2451
  return;
2452
2452
  }
2453
+ const answering = device.management?.interfaces;
2454
+ if (answering && !answering.includes(name))
2455
+ access = "ping";
2453
2456
  const addresses = addressesOf2(settings);
2454
2457
  const ipv4 = addresses.filter((address) => familyOf2(host2(address)) === "ipv4");
2455
2458
  const ipv6 = addresses.filter((address) => familyOf2(host2(address)) === "ipv6");
@@ -4890,6 +4893,8 @@ function unsupported2(device) {
4890
4893
  }
4891
4894
  if (management.console)
4892
4895
  found.push("management.console, the console uses the device's users");
4896
+ if (management.interfaces)
4897
+ found.push("management.interfaces, which only FortiOS builds for now");
4893
4898
  if (management.native?.interfaces?.length)
4894
4899
  found.push("management.native.interfaces, NETCONF runs over IP only");
4895
4900
  if (management.ssh?.auth_timeout || management.ssh?.auth_retries)
@@ -5613,6 +5618,8 @@ async function read3(device, _network = [], options = {}) {
5613
5618
  }
5614
5619
  function unsupported3(device) {
5615
5620
  const found = [];
5621
+ if (device.management?.interfaces)
5622
+ found.push("management.interfaces, which only FortiOS builds for now");
5616
5623
  for (const [name, iface] of Object.entries(device.interfaces ?? {})) {
5617
5624
  if (iface.type === "bridge")
5618
5625
  found.push(`interfaces.${name}, a bridge, which only FortiOS builds for now`);
@@ -7624,6 +7631,8 @@ function unsupported4(device) {
7624
7631
  const management = device.management;
7625
7632
  if (management?.console)
7626
7633
  found.push("management.console, the console uses the device's users");
7634
+ if (management?.interfaces)
7635
+ found.push("management.interfaces, which only FortiOS builds for now");
7627
7636
  if (management?.privilege_password)
7628
7637
  found.push("management.privilege_password, the platform has no privileged mode");
7629
7638
  if (management?.snmp?.port)
@@ -8276,6 +8285,8 @@ function configurationOf(device, dump) {
8276
8285
  }
8277
8286
  function unsupported5(device) {
8278
8287
  const found = [];
8288
+ if (device.management?.interfaces)
8289
+ found.push("management.interfaces, which only FortiOS builds for now");
8279
8290
  for (const [name, iface] of Object.entries(device.interfaces ?? {})) {
8280
8291
  if (iface.type === "bridge")
8281
8292
  found.push(`interfaces.${name}, a bridge, which only FortiOS builds for now`);
@@ -84,6 +84,8 @@ export type SnmpUser = {
84
84
  export type Management<I extends string, C extends string> = {
85
85
  /** Sources allowed to every service that does not set its own. */
86
86
  allow?: readonly Prefix[];
87
+ /** The ports and interfaces the services answer on; every other one answers ping alone. Every one with an address when absent. */
88
+ interfaces?: readonly I[];
87
89
  /** Secure shell. */
88
90
  ssh?: Service & {
89
91
  /** Also offer legacy ciphers, MACs and key exchanges. Off when absent. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@takodotid/circuit",
3
- "version": "0.33.0",
3
+ "version": "0.34.0",
4
4
  "description": "Declarative, vendor-neutral network configuration: describe each device in TypeScript, and Circuit makes the device match. Alpha.",
5
5
  "keywords": [
6
6
  "network",
@@ -40,6 +40,11 @@
40
40
  "name": "Rafly Maulana",
41
41
  "email": "rafly@tako.id",
42
42
  "url": "https://raflymaulana.com"
43
+ },
44
+ {
45
+ "name": "hzmi",
46
+ "email": "hzmi@tako.id",
47
+ "url": "https://hzmi.xyz"
43
48
  }
44
49
  ],
45
50
  "type": "module",
@@ -495,6 +495,10 @@ function routed(entry: Block, device: Device, name: string, settings: RoutedSett
495
495
  return;
496
496
  }
497
497
 
498
+ // Services answer only where the config says, when it says; ping everywhere.
499
+ const answering = device.management?.interfaces;
500
+ if (answering && !answering.includes(name)) access = "ping";
501
+
498
502
  const addresses = addressesOf(settings);
499
503
  const ipv4 = addresses.filter((address) => familyOf(host(address)) === "ipv4");
500
504
  const ipv6 = addresses.filter((address) => familyOf(host(address)) === "ipv6");
@@ -595,6 +595,7 @@ export function unsupported(device: Device): string[] {
595
595
  }
596
596
 
597
597
  if (management.console) found.push("management.console, the console uses the device's users");
598
+ if (management.interfaces) found.push("management.interfaces, which only FortiOS builds for now");
598
599
  if (management.native?.interfaces?.length) found.push("management.native.interfaces, NETCONF runs over IP only");
599
600
  if (management.ssh?.auth_timeout || management.ssh?.auth_retries) found.push("management.ssh.auth_timeout and auth_retries");
600
601
 
@@ -420,6 +420,8 @@ export async function read(device: Device, _network: readonly Device[] = [], opt
420
420
  export function unsupported(device: Device): string[] {
421
421
  const found: string[] = [];
422
422
 
423
+ if (device.management?.interfaces) found.push("management.interfaces, which only FortiOS builds for now");
424
+
423
425
  for (const [name, iface] of Object.entries(device.interfaces ?? {})) {
424
426
  if (iface.type === "bridge") found.push(`interfaces.${name}, a bridge, which only FortiOS builds for now`);
425
427
  if (iface.type === "vlan" && iface.mac) found.push(`interfaces.${name}.mac, which only RouterOS sets for now`);
@@ -192,6 +192,7 @@ export function unsupported(device: Device): string[] {
192
192
  const management = device.management;
193
193
 
194
194
  if (management?.console) found.push("management.console, the console uses the device's users");
195
+ if (management?.interfaces) found.push("management.interfaces, which only FortiOS builds for now");
195
196
  if (management?.privilege_password) found.push("management.privilege_password, the platform has no privileged mode");
196
197
 
197
198
  if (management?.snmp?.port) found.push("management.snmp.port");
@@ -639,6 +639,8 @@ function configurationOf(device: Device, dump: string): string {
639
639
  export function unsupported(device: Device): string[] {
640
640
  const found: string[] = [];
641
641
 
642
+ if (device.management?.interfaces) found.push("management.interfaces, which only FortiOS builds for now");
643
+
642
644
  for (const [name, iface] of Object.entries(device.interfaces ?? {})) {
643
645
  if (iface.type === "bridge") found.push(`interfaces.${name}, a bridge, which only FortiOS builds for now`);
644
646
  if (iface.type === "vlan" && iface.mac) found.push(`interfaces.${name}.mac, which only RouterOS sets for now`);
@@ -89,6 +89,8 @@ export type SnmpUser = {
89
89
  export type Management<I extends string, C extends string> = {
90
90
  /** Sources allowed to every service that does not set its own. */
91
91
  allow?: readonly Prefix[];
92
+ /** The ports and interfaces the services answer on; every other one answers ping alone. Every one with an address when absent. */
93
+ interfaces?: readonly I[];
92
94
  /** Secure shell. */
93
95
  ssh?: Service & {
94
96
  /** Also offer legacy ciphers, MACs and key exchanges. Off when absent. */