Compare commits

...

27 Commits

Author SHA1 Message Date
jacky1100002
8a4815187f Merge branch 'main' into jumbo_frames 2024-08-12 17:32:34 +08:00
jacky_chang
5da5b090be generate corresponding json files 2024-08-12 10:32:10 +08:00
Mike Hansen
4235960ab8 Merge pull request #22 from Telecominfraproject/OLS-229-generate-json-file-for-capabilities-connect.capabilities.yml
[OLS-229] generate json file for capabilities/connect.capabilities.yml
2024-08-08 13:31:31 -04:00
Mike Hansen
7e839b0681 Merge pull request #21 from Telecominfraproject/OLS-228-delta_counters
[OLS-228] Schema -- adding delta_counters
2024-08-08 13:30:53 -04:00
Mike Hansen
b98f8a2b46 [OLS-229] generate json file for capabilities/connect.capabilities.yml
Signed-off-by: Mike Hansen <mike.hansen@netexperience.com>
2024-08-06 14:03:43 -04:00
Mike Hansen
1de6cad7e8 [OLS-228] Schema
Add delta_counters to

state/interface.yml

state/link-state.yml

Signed-off-by: Mike Hansen <mike.hansen@netexperience.com>
2024-08-06 13:58:37 -04:00
Olexandr, Mazur
0f9f4489d2 Merge pull request #17 from Telecominfraproject/secure_http_server
add whether enabled & port number support for https
2024-08-06 12:49:01 +03:00
jacky_chang
4d03a432c1 support jumbo frmaes 2024-08-06 11:08:10 +08:00
jacky_chang
4336be981b Use generate.sh to generate related json files to make settings consistent. 2024-08-05 10:38:57 +08:00
Olexandr, Mazur
747ccb4993 Merge pull request #16 from Telecominfraproject/fix/capabilities_add_missing_field
Schema: capabilities: add missed <compatible> field
2024-06-05 17:25:31 +03:00
Oleksandr Mazur
a0fac0b3d7 Schema: capabilities: add missed <compatible> field
Connect message is required to have compatible field,
as it defines device's <family> of devices and compatible
counterparts.

Add this - originally missed - field to the schema, to make
sure cloud infrastructure has enough information to deduce
device type / compatible devices (for cfg generation etc).

Signed-off-by: Oleksandr Mazur <oleksandr.mazur@plvision.eu>
2024-06-05 11:30:47 +03:00
jacky_chang
1e33d3fa0a add whether enabled & port number support for https 2024-05-10 16:27:03 +08:00
Olexandr, Mazur
dc754dc519 Merge pull request #15 from Telecominfraproject/feat/connect_capabilities
Schema: formalize connect.capabilities message format
2024-04-12 12:21:15 +03:00
Oleksandr Mazur
b3374bb60b Schema: formalize connect.capabilities message format
Capabilities message is unregulated as of now;
Formalize the layout by introducing yml file.

Signed-off-by: Oleksandr Mazur <oleksandr.mazur@plvision.eu>
2024-04-11 10:18:27 +03:00
Olexandr, Mazur
0ef7362930 Merge pull request #14 from Telecominfraproject/feat/global_igmp_querier_floodcontrol
Add flood-control and querier-enable fields to unit.yml
2024-04-02 15:30:51 +03:00
Serhiy Boiko
b9762df2cf Add flood-control and querier-enable fields to unit.yml
These fields are used to specify the global fc and querier
configuration.

Signed-off-by: Serhiy Boiko <serhiy.boiko@plvision.eu>
2024-04-02 12:58:10 +03:00
Olexandr, Mazur
0983abe2bf Merge pull request #13 from Telecominfraproject/revert_public_ip_lookup
Revert public ip lookup
2024-03-27 11:09:20 +02:00
Oleksandr Mazur
719fd97705 Fixup generated schema after fdeb2b8 revert
Signed-off-by: Oleksandr Mazur <oleksandr.mazur@plvision.eu>
2024-03-26 11:25:07 +02:00
Oleksandr Mazur
777e2b26a8 Revert "revert "public_ip_lookup" patch"
This reverts commit fdeb2b8b85.
2024-03-26 11:24:35 +02:00
Olexandr, Mazur
ab43179a83 Merge pull request #12 from Telecominfraproject/fix_port_isolation
Move port-isolation schema from ethernet.yml to switch.yml
2024-03-19 20:08:28 +02:00
Serhiy Boiko
3a41591f85 Move port-isolation schema from ethernet.yml to switch.yml
port-isolation is a global configuration and should be described in
switch.yml, not in ethernet.yml
No changes were made to any of the fields.

Signed-off-by: Serhiy Boiko <serhiy.boiko@plvision.eu>
2024-03-19 12:44:31 +02:00
tip-admin
7fa4d15f5e Create LICENSE 2024-02-29 08:53:54 -08:00
Olexandr, Mazur
d105fe165e Merge pull request #11 from Telecominfraproject/fix_loop_detection_schema_instances_indentation
Correct indentation of instances block in switch.yml
2024-02-27 10:50:30 +02:00
Mike Hansen
d3f610d9ef Correct indentation of instances block in switch.yml
The property 'instance' is not indented correctly and therefore doesn't end up under the loop-detection properties in the switch configuration.

Signed-off-by: Mike Hansen <mike.hansen@netexperience.com>
2024-02-26 11:35:09 -05:00
Olexandr, Mazur
711d7d9066 Merge pull request #10 from Telecominfraproject/change_vrf_id_to_integer
Change VRF id type from number to integer
2024-02-21 18:16:16 +02:00
Mike Hansen
89a78c61be Change VRF id type from number to integer
Signed-off-by: Mike Hansen <mike.hansen@netexperience.com>
2024-02-21 05:28:01 -05:00
Olexandr, Mazur
f5608bd42c Merge pull request #9 from Telecominfraproject/schema_fixes_and_updates
Align dhcp-relay with ols-ucentral-client, STP object typo #7 Fix spelling, make power limit an integer
2024-02-15 12:17:22 +02:00
21 changed files with 1330 additions and 477 deletions

28
LICENSE Normal file
View File

@@ -0,0 +1,28 @@
BSD 3-Clause License
Copyright (c) 2024, Telecom Infra Project
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@@ -0,0 +1,197 @@
description:
uCentral protocol (OpenLan) device and features capabilities schema
type: object
properties:
serial:
type: string
examples:
- aabbccddeeff
firmware:
type: string
description:
Platform revision
examples:
- Rel 1.6 build 5
platform:
type: string
enum:
- Switch
- AP
model:
type: string
description:
Device model
hw-sku:
type: string
description:
Stock keeping unit
compatible:
type: string
description:
Compatibility string, that defines the family of the device
base-mac:
type: string
description:
Switch MAC address
format: uc-mac
examples:
- aa:bb:cc:dd:ee:ff
port-list:
type: array
description:
The list of physical network devices
items:
type: object
properties:
name:
type: string
description:
The logical name of the port that is used by the OS
examples:
- Ethernet0
- Ethernet1
- Ethernet76
front-panel-number:
type: integer
description:
The identification number of the port as can be seen on the front-panel of the device
port-capabilities:
type: object
description:
Description of physical ports and their form-factors
properties:
form-factors:
type: array
items:
type: string
enum:
- RJ45
- SFP
- SFP+
- SFP28
- SFP-DD
- QSFP
- QSFP+
- QSFP28
- QSFP-DD
ports-list:
type: array
items:
type: object
properties:
type:
type: string
examples:
- RJ45
ports:
type: array
items:
type: string
examples:
- Ethernet1
poe-capabilities:
type: object
description:
Description of physical ports and their PoE capabilities
properties:
supported-standards:
type: array
items:
type: string
enum:
- .3AF-POE
- .3AT-POE+
- .3BT-PoE++
- PreStandard-Passive
power-budget:
type: integer
examples:
- 2000
poe-ports:
type: array
items:
type: object
properties:
type:
type: string
examples:
- .3AF-POE
budget-capacity:
type: integer
ports:
type: array
items:
type: string
examples:
- Ethernet1
supported-features:
type: array
description:
List of all features supported by the device
items:
type: string
enum:
# L2
- VLAN
- Port-Isolation
- Spanning-Tree
- Spanning-Tree-Rapid
- Spanning-Tree-Per-VLAN
- Spanning-Tree-Per-VLAN-Rapid
- Spanning-Tree-MSTP
# L3
- SVI-StaticIPv4
- SVI-StaticIPv6
- Interface-StaticIPv4
- Interface-StaticIPv6
- Routing-VRF
- Routing-IPv4-Route-Blackhole
- Routing-IPv4-Route-Unreachable
- Routing-IPv4-Nexthop
- Routing-IPv4-Broadcast
- Routing-IPv4-Multicast-IGMP-Snooping
- Routing-IPv4-Multicast-IGMP-Querier
- Routing-IPv4-Multicast-IGMP-Static
- Routing-IPv4-DHCP-Server
- Routing-IPv4-DHCP-Relay
- Routing-IPv4-DHCP-Snooping
- Routing-IPv4-Port-Forward
- Routing-IPv6-DHCP-Relay
- Routing-IPv6-DHCP-Stateful
- Routing-IPv6-DHCP-Stateless
- Routing-IPv6-Port-Forward
# PoE
- PoE-Reset
# .1X
- Port-Access-Control
- PAC-Dynamic-Auth
# System
- System-PasswordChange
- System-SwUpdate
- System-SwUpdate-Partial
- Port-Mirroring
# Services
- Service-SSH
- Service-RSSH
- Service-Telnet
- Service-LLDP
- Service-HTTP
- Service-HTTPS
- Service-GPS
- Service-IGMP
- Service-NTP
- Service-MDNS
- Service-QoS
- Service-Syslog
- Service-PAC
- Service-Wireguard-Overlay
- Service-Radius-Proxy
- Service-Online-Check
- Service-CaptivePortal
- Service-PublicIpCheck
# Tunneling
- Tunneling-VxLAN
- Tunneling-GRE
- Tunneling-GRE6
- Tunneling-L2TP
- Tunneling-Mesh

View File

@@ -7,7 +7,8 @@ set -x
./merge-schema.py schema schema ucentral.yml ucentral.schema.pretty.json 0 1
./merge-schema.py schema schema ucentral.yml ucentral.schema.full.json 0 0
./merge-schema.py state state state.yml ucentral.state.pretty.json 0 1
./generate-reader.uc > schemareader.uc
./merge-schema.py capabilities capabilities connect.capabilities.yml ucentral.capabilities.pretty.json 0 1
#./generate-reader.uc > schemareader.uc
#./generate-example.uc > input.json
mkdir -p docs
which generate-schema-doc > /dev/null

View File

@@ -161,42 +161,3 @@ properties:
type: integer
minimum: 1
maximum: 4094
port-isolation:
description:
This section describes the per-port specific port-isolation matrix (to which ports selected port can forward traffic to) configuration.
Omitting this configuration completely fully disables any port-isolation configuration on this given port.
type: object
properties:
sessions:
description:
Allow selected port to forward traffic in the provided session-based format.
type: array
items:
type: object
properties:
id:
description:
Session id to configure.
type: integer
uplink:
description:
Configuration object for uplink interface(s)
type: object
properties:
interface-list:
description:
List of interfaces (either physical or trunk ports)
type: array
items:
type: string
downlink:
description:
Configuration object for downlink interface(s)
type: object
properties:
interface-list:
description:
List of interfaces (either physical or trunk ports)
type: array
items:
type: string

View File

@@ -40,7 +40,7 @@ properties:
vrf:
description:
VRF id.
type: number
type: integer
ipv4-unreachable:
description:
Define a list of non-interface specific UNREACHABLE routes.
@@ -58,4 +58,4 @@ properties:
vrf:
description:
VRF id.
type: number
type: integer

View File

@@ -30,7 +30,7 @@ properties:
vrf:
description:
VRF id.
type: number
type: integer
gateway:
description:
This option defines the static IPv4 gateway of the logical interface.
@@ -55,7 +55,7 @@ properties:
vrf:
description:
VRF id.
type: number
type: integer
metric:
description:
Optional metric value (define a NH route's weight / metric).
@@ -77,7 +77,7 @@ properties:
vrf:
description:
VRF id.
type: number
type: integer
multicast:
type: object
properties:

15
schema/service.https.yml Normal file
View File

@@ -0,0 +1,15 @@
description:
Enable the webserver with the on-boarding webui
type: object
properties:
https-port:
description:
The port that the secure HTTP server should run on.
type: integer
maximum: 65535
minimum: 1
default: 443
enable:
description:
This option whether secure http server should be enabled or disabled.
type: boolean

View File

@@ -49,3 +49,5 @@ properties:
$ref: 'https://ucentral.io/schema/v1/service/rrm/'
telnet:
$ref: "https://ucentral.io/schema/v1/service/telnet/"
https:
$ref: "https://ucentral.io/schema/v1/service/https/"

View File

@@ -43,50 +43,50 @@ properties:
enum:
- upstream
- downstream
instances:
description:
Define a list of configuration for each STP instance.
Meaning of this field depends on current
STP protocol (switch.loop-detection.protocol)
type: array
items:
type: object
properties:
id:
description:
Indicates instance to configure.
Depends on current STP protocol
If RPVSTP/PVSTP - vlan id
If MSTP - instance id
type: integer
enabled:
description:
Enable STP on this instance.
type: boolean
default: true
priority:
description:
Bridge priority.
type: integer
default: 32768
forward_delay:
description:
Defines the amount of time a switch port stays in the Listening
and Learning states before transitioning to the Forwarding state.
type: integer
default: 15
hello_time:
description:
Determines how often switches send BPDU.
type: integer
default: 2
max_age:
description:
Specifies the maximum time that a switch port should wait to
receive a BPDU from its neighbor before
considering the link as failed or disconnected.
type: integer
default: 20
instances:
description:
Define a list of configuration for each STP instance.
Meaning of this field depends on current
STP protocol (switch.loop-detection.protocol)
type: array
items:
type: object
properties:
id:
description:
Indicates instance to configure.
Depends on current STP protocol
If RPVSTP/PVSTP - vlan id
If MSTP - instance id
type: integer
enabled:
description:
Enable STP on this instance.
type: boolean
default: true
priority:
description:
Bridge priority.
type: integer
default: 32768
forward_delay:
description:
Defines the amount of time a switch port stays in the Listening
and Learning states before transitioning to the Forwarding state.
type: integer
default: 15
hello_time:
description:
Determines how often switches send BPDU.
type: integer
default: 2
max_age:
description:
Specifies the maximum time that a switch port should wait to
receive a BPDU from its neighbor before
considering the link as failed or disconnected.
type: integer
default: 20
ieee8021x:
description:
This section describes the global 802.1X (port access control) configuration.
@@ -184,3 +184,47 @@ properties:
description:
Sets the shared secret to verify client COA requests for this server.
type: string
port-isolation:
description:
This section describes the per-port specific port-isolation matrix (to which ports selected port can forward traffic to) configuration.
Omitting this configuration completely fully disables any port-isolation configuration on this given port.
type: object
properties:
sessions:
description:
Allow selected port to forward traffic in the provided session-based format.
type: array
items:
type: object
properties:
id:
description:
Session id to configure.
type: integer
uplink:
description:
Configuration object for uplink interface(s)
type: object
properties:
interface-list:
description:
List of interfaces (either physical or trunk ports)
type: array
items:
type: string
downlink:
description:
Configuration object for downlink interface(s)
type: object
properties:
interface-list:
description:
List of interfaces (either physical or trunk ports)
type: array
items:
type: string
jumbo-frames:
description:
Enables Jumbo frames
type: boolean
default: false

View File

@@ -12,6 +12,11 @@ properties:
description:
The unique ID of the configuration. This is the unix timestamp of when the config was created.
type: integer
public_ip_lookup:
description:
The fqdn to retrieve public ip of internet connection.
type: string
format: uc-fqdn
unit:
$ref: "https://ucentral.io/schema/v1/unit/"
globals:

View File

@@ -100,3 +100,13 @@ properties:
Global config for controlling whether MLD snooping is enabled. If this global setting is disabled, all VLANs are treated as disabled, whether they are enabled or not.
type: boolean
default: true
unknown-multicast-flood-control:
description:
Global config for the unknown multicast flood control feature. This enables the system to forward unknown multicast packets only to a multicast router (mrouter).
type: boolean
default: false
querier-enable:
description:
Global IGMP querier config. This enables all Vlan interfaces to act as a querier.
type: boolean
default: false

View File

@@ -295,6 +295,34 @@ function instantiateUnit(location, value, errors) {
obj.mld_snooping_enable = true;
}
function parseUnknownMulticastFloodControl(location, value, errors) {
if (type(value) != "bool")
push(errors, [ location, "must be of type boolean" ]);
return value;
}
if (exists(value, "unknown-multicast-flood-control")) {
obj.unknown_multicast_flood_control = parseUnknownMulticastFloodControl(location + "/unknown-multicast-flood-control", value["unknown-multicast-flood-control"], errors);
}
else {
obj.unknown_multicast_flood_control = false;
}
function parseQuerierEnable(location, value, errors) {
if (type(value) != "bool")
push(errors, [ location, "must be of type boolean" ]);
return value;
}
if (exists(value, "querier-enable")) {
obj.querier_enable = parseQuerierEnable(location + "/querier-enable", value["querier-enable"], errors);
}
else {
obj.querier_enable = false;
}
return obj;
}
@@ -532,8 +560,8 @@ function instantiateGlobals(location, value, errors) {
}
function parseVrf(location, value, errors) {
if (!(type(value) in [ "int", "double" ]))
push(errors, [ location, "must be of type number" ]);
if (type(value) != "int")
push(errors, [ location, "must be of type integer" ]);
return value;
}
@@ -588,8 +616,8 @@ function instantiateGlobals(location, value, errors) {
}
function parseVrf(location, value, errors) {
if (!(type(value) in [ "int", "double" ]))
push(errors, [ location, "must be of type number" ]);
if (type(value) != "int")
push(errors, [ location, "must be of type integer" ]);
return value;
}
@@ -1016,140 +1044,6 @@ function instantiateEthernet(location, value, errors) {
obj.ieee8021x = parseIeee8021x(location + "/ieee8021x", value["ieee8021x"], errors);
}
function parsePortIsolation(location, value, errors) {
if (type(value) == "object") {
let obj = {};
function parseSessions(location, value, errors) {
if (type(value) == "array") {
function parseItem(location, value, errors) {
if (type(value) == "object") {
let obj = {};
function parseId(location, value, errors) {
if (type(value) != "int")
push(errors, [ location, "must be of type integer" ]);
return value;
}
if (exists(value, "id")) {
obj.id = parseId(location + "/id", value["id"], errors);
}
function parseUplink(location, value, errors) {
if (type(value) == "object") {
let obj = {};
function parseInterfaceList(location, value, errors) {
if (type(value) == "array") {
function parseItem(location, value, errors) {
if (type(value) != "string")
push(errors, [ location, "must be of type string" ]);
return value;
}
return map(value, (item, i) => parseItem(location + "/" + i, item, errors));
}
if (type(value) != "array")
push(errors, [ location, "must be of type array" ]);
return value;
}
if (exists(value, "interface-list")) {
obj.interface_list = parseInterfaceList(location + "/interface-list", value["interface-list"], errors);
}
return obj;
}
if (type(value) != "object")
push(errors, [ location, "must be of type object" ]);
return value;
}
if (exists(value, "uplink")) {
obj.uplink = parseUplink(location + "/uplink", value["uplink"], errors);
}
function parseDownlink(location, value, errors) {
if (type(value) == "object") {
let obj = {};
function parseInterfaceList(location, value, errors) {
if (type(value) == "array") {
function parseItem(location, value, errors) {
if (type(value) != "string")
push(errors, [ location, "must be of type string" ]);
return value;
}
return map(value, (item, i) => parseItem(location + "/" + i, item, errors));
}
if (type(value) != "array")
push(errors, [ location, "must be of type array" ]);
return value;
}
if (exists(value, "interface-list")) {
obj.interface_list = parseInterfaceList(location + "/interface-list", value["interface-list"], errors);
}
return obj;
}
if (type(value) != "object")
push(errors, [ location, "must be of type object" ]);
return value;
}
if (exists(value, "downlink")) {
obj.downlink = parseDownlink(location + "/downlink", value["downlink"], errors);
}
return obj;
}
if (type(value) != "object")
push(errors, [ location, "must be of type object" ]);
return value;
}
return map(value, (item, i) => parseItem(location + "/" + i, item, errors));
}
if (type(value) != "array")
push(errors, [ location, "must be of type array" ]);
return value;
}
if (exists(value, "sessions")) {
obj.sessions = parseSessions(location + "/sessions", value["sessions"], errors);
}
return obj;
}
if (type(value) != "object")
push(errors, [ location, "must be of type object" ]);
return value;
}
if (exists(value, "port-isolation")) {
obj.port_isolation = parsePortIsolation(location + "/port-isolation", value["port-isolation"], errors);
}
return obj;
}
@@ -1259,6 +1153,115 @@ function instantiateSwitch(location, value, errors) {
obj.roles = parseRoles(location + "/roles", value["roles"], errors);
}
function parseInstances(location, value, errors) {
if (type(value) == "array") {
function parseItem(location, value, errors) {
if (type(value) == "object") {
let obj = {};
function parseId(location, value, errors) {
if (type(value) != "int")
push(errors, [ location, "must be of type integer" ]);
return value;
}
if (exists(value, "id")) {
obj.id = parseId(location + "/id", value["id"], errors);
}
function parseEnabled(location, value, errors) {
if (type(value) != "bool")
push(errors, [ location, "must be of type boolean" ]);
return value;
}
if (exists(value, "enabled")) {
obj.enabled = parseEnabled(location + "/enabled", value["enabled"], errors);
}
else {
obj.enabled = true;
}
function parsePriority(location, value, errors) {
if (type(value) != "int")
push(errors, [ location, "must be of type integer" ]);
return value;
}
if (exists(value, "priority")) {
obj.priority = parsePriority(location + "/priority", value["priority"], errors);
}
else {
obj.priority = 32768;
}
function parseForward_delay(location, value, errors) {
if (type(value) != "int")
push(errors, [ location, "must be of type integer" ]);
return value;
}
if (exists(value, "forward_delay")) {
obj.forward_delay = parseForward_delay(location + "/forward_delay", value["forward_delay"], errors);
}
else {
obj.forward_delay = 15;
}
function parseHello_time(location, value, errors) {
if (type(value) != "int")
push(errors, [ location, "must be of type integer" ]);
return value;
}
if (exists(value, "hello_time")) {
obj.hello_time = parseHello_time(location + "/hello_time", value["hello_time"], errors);
}
else {
obj.hello_time = 2;
}
function parseMax_age(location, value, errors) {
if (type(value) != "int")
push(errors, [ location, "must be of type integer" ]);
return value;
}
if (exists(value, "max_age")) {
obj.max_age = parseMax_age(location + "/max_age", value["max_age"], errors);
}
else {
obj.max_age = 20;
}
return obj;
}
if (type(value) != "object")
push(errors, [ location, "must be of type object" ]);
return value;
}
return map(value, (item, i) => parseItem(location + "/" + i, item, errors));
}
if (type(value) != "array")
push(errors, [ location, "must be of type array" ]);
return value;
}
if (exists(value, "instances")) {
obj.instances = parseInstances(location + "/instances", value["instances"], errors);
}
return obj;
}
@@ -1541,6 +1544,154 @@ function instantiateSwitch(location, value, errors) {
obj.ieee8021x = parseIeee8021x(location + "/ieee8021x", value["ieee8021x"], errors);
}
function parsePortIsolation(location, value, errors) {
if (type(value) == "object") {
let obj = {};
function parseSessions(location, value, errors) {
if (type(value) == "array") {
function parseItem(location, value, errors) {
if (type(value) == "object") {
let obj = {};
function parseId(location, value, errors) {
if (type(value) != "int")
push(errors, [ location, "must be of type integer" ]);
return value;
}
if (exists(value, "id")) {
obj.id = parseId(location + "/id", value["id"], errors);
}
function parseUplink(location, value, errors) {
if (type(value) == "object") {
let obj = {};
function parseInterfaceList(location, value, errors) {
if (type(value) == "array") {
function parseItem(location, value, errors) {
if (type(value) != "string")
push(errors, [ location, "must be of type string" ]);
return value;
}
return map(value, (item, i) => parseItem(location + "/" + i, item, errors));
}
if (type(value) != "array")
push(errors, [ location, "must be of type array" ]);
return value;
}
if (exists(value, "interface-list")) {
obj.interface_list = parseInterfaceList(location + "/interface-list", value["interface-list"], errors);
}
return obj;
}
if (type(value) != "object")
push(errors, [ location, "must be of type object" ]);
return value;
}
if (exists(value, "uplink")) {
obj.uplink = parseUplink(location + "/uplink", value["uplink"], errors);
}
function parseDownlink(location, value, errors) {
if (type(value) == "object") {
let obj = {};
function parseInterfaceList(location, value, errors) {
if (type(value) == "array") {
function parseItem(location, value, errors) {
if (type(value) != "string")
push(errors, [ location, "must be of type string" ]);
return value;
}
return map(value, (item, i) => parseItem(location + "/" + i, item, errors));
}
if (type(value) != "array")
push(errors, [ location, "must be of type array" ]);
return value;
}
if (exists(value, "interface-list")) {
obj.interface_list = parseInterfaceList(location + "/interface-list", value["interface-list"], errors);
}
return obj;
}
if (type(value) != "object")
push(errors, [ location, "must be of type object" ]);
return value;
}
if (exists(value, "downlink")) {
obj.downlink = parseDownlink(location + "/downlink", value["downlink"], errors);
}
return obj;
}
if (type(value) != "object")
push(errors, [ location, "must be of type object" ]);
return value;
}
return map(value, (item, i) => parseItem(location + "/" + i, item, errors));
}
if (type(value) != "array")
push(errors, [ location, "must be of type array" ]);
return value;
}
if (exists(value, "sessions")) {
obj.sessions = parseSessions(location + "/sessions", value["sessions"], errors);
}
return obj;
}
if (type(value) != "object")
push(errors, [ location, "must be of type object" ]);
return value;
}
if (exists(value, "port-isolation")) {
obj.port_isolation = parsePortIsolation(location + "/port-isolation", value["port-isolation"], errors);
}
function parseJumboFrames(location, value, errors) {
if (type(value) != "bool")
push(errors, [ location, "must be of type boolean" ]);
return value;
}
if (exists(value, "jumbo-frames")) {
obj.jumbo_frames = parseJumboFrames(location + "/jumbo-frames", value["jumbo-frames"], errors);
}
else {
obj.jumbo_frames = false;
}
return obj;
}
@@ -2549,8 +2700,8 @@ function instantiateInterfaceIpv4(location, value, errors) {
}
function parseVrf(location, value, errors) {
if (!(type(value) in [ "int", "double" ]))
push(errors, [ location, "must be of type number" ]);
if (type(value) != "int")
push(errors, [ location, "must be of type integer" ]);
return value;
}
@@ -2622,8 +2773,8 @@ function instantiateInterfaceIpv4(location, value, errors) {
}
function parseVrf(location, value, errors) {
if (!(type(value) in [ "int", "double" ]))
push(errors, [ location, "must be of type number" ]);
if (type(value) != "int")
push(errors, [ location, "must be of type integer" ]);
return value;
}
@@ -2689,8 +2840,8 @@ function instantiateInterfaceIpv4(location, value, errors) {
}
function parseVrf(location, value, errors) {
if (!(type(value) in [ "int", "double" ]))
push(errors, [ location, "must be of type number" ]);
if (type(value) != "int")
push(errors, [ location, "must be of type integer" ]);
return value;
}
@@ -10132,6 +10283,53 @@ function instantiateServiceTelnet(location, value, errors) {
return value;
}
function instantiateServiceHttps(location, value, errors) {
if (type(value) == "object") {
let obj = {};
function parseHttpsPort(location, value, errors) {
if (type(value) in [ "int", "double" ]) {
if (value > 65535)
push(errors, [ location, "must be lower than or equal to 65535" ]);
if (value < 1)
push(errors, [ location, "must be bigger than or equal to 1" ]);
}
if (type(value) != "int")
push(errors, [ location, "must be of type integer" ]);
return value;
}
if (exists(value, "https-port")) {
obj.https_port = parseHttpsPort(location + "/https-port", value["https-port"], errors);
}
else {
obj.https_port = 443;
}
function parseEnable(location, value, errors) {
if (type(value) != "bool")
push(errors, [ location, "must be of type boolean" ]);
return value;
}
if (exists(value, "enable")) {
obj.enable = parseEnable(location + "/enable", value["enable"], errors);
}
return obj;
}
if (type(value) != "object")
push(errors, [ location, "must be of type object" ]);
return value;
}
function instantiateService(location, value, errors) {
if (type(value) == "object") {
let obj = {};
@@ -10228,6 +10426,10 @@ function instantiateService(location, value, errors) {
obj.telnet = instantiateServiceTelnet(location + "/telnet", value["telnet"], errors);
}
if (exists(value, "https")) {
obj.https = instantiateServiceHttps(location + "/https", value["https"], errors);
}
return obj;
}
@@ -10700,6 +10902,23 @@ function newUCentralState(location, value, errors) {
obj.uuid = parseUuid(location + "/uuid", value["uuid"], errors);
}
function parsePublic_ip_lookup(location, value, errors) {
if (type(value) == "string") {
if (!matchUcFqdn(value))
push(errors, [ location, "must be a valid fully qualified domain name" ]);
}
if (type(value) != "string")
push(errors, [ location, "must be of type string" ]);
return value;
}
if (exists(value, "public_ip_lookup")) {
obj.public_ip_lookup = parsePublic_ip_lookup(location + "/public_ip_lookup", value["public_ip_lookup"], errors);
}
if (exists(value, "unit")) {
obj.unit = instantiateUnit(location + "/unit", value["unit"], errors);
}

View File

@@ -8,6 +8,10 @@ properties:
type: string
description:
An IPv4 addreess.
public_ip:
type: string
description:
The public IP address of internet connection.
leasetime:
type: number
description:

View File

@@ -38,6 +38,8 @@ items:
$ref: "https://ucentral.io/state/v1/interface/clients/"
counters:
$ref: "https://ucentral.io/state/v1/interface/counter/"
delta_counters:
$ref: "https://ucentral.io/state/v1/interface/counter/"
mesh-path:
$ref: "https://ucentral.io/state/v1/interface/mesh-path/"
ssids:

View File

@@ -19,6 +19,8 @@ properties:
- half
counters:
$ref: "https://ucentral.io/state/v1/interface/counter/"
delta_counters:
$ref: "https://ucentral.io/state/v1/interface/counter/"
poe:
description:
This section describes the ethernet poe-port link-state object (statistics + PD info).

View File

@@ -79,6 +79,16 @@ let delta = 1;
if (telemetry)
delta = 0;
let public_ip_file = "/tmp/public_ip";
let public_ip = "";
if (cfg.public_ip_lookup) {
if (!fs.access(public_ip_file))
system(sprintf("/usr/bin/curl -m 3 %s -o %s", cfg.public_ip_lookup, public_ip_file));
let online_file = fs.open(public_ip_file);
public_ip = online_file.read("all") || '';
online_file.close();
}
global.tid_stats = (index(stats.types, 'tid-stats') > 0);
/* load state data */
@@ -412,6 +422,8 @@ cursor.foreach("network", "interface", function(d) {
push(ipv4, sprintf("%s/%d", a.address, a.mask));
iface.ipv4.addresses = ipv4;
if( cfg.public_ip_lookup && length(public_ip))
iface.ipv4.public_ip = public_ip;
}
if (length(status["ipv6-address"])) {

View File

@@ -0,0 +1,231 @@
{
"description": "uCentral protocol (OpenLan) device and features capabilities schema",
"type": "object",
"properties": {
"serial": {
"type": "string",
"examples": [
"aabbccddeeff"
]
},
"firmware": {
"type": "string",
"description": "Platform revision",
"examples": [
"Rel 1.6 build 5"
]
},
"platform": {
"type": "string",
"enum": [
"Switch",
"AP"
]
},
"model": {
"type": "string",
"description": "Device model"
},
"hw-sku": {
"type": "string",
"description": "Stock keeping unit"
},
"compatible": {
"type": "string",
"description": "Compatibility string, that defines the family of the device"
},
"base-mac": {
"type": "string",
"description": "Switch MAC address",
"format": "uc-mac",
"examples": [
"aa:bb:cc:dd:ee:ff"
]
},
"port-list": {
"type": "array",
"description": "The list of physical network devices",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The logical name of the port that is used by the OS",
"examples": [
"Ethernet0",
"Ethernet1",
"Ethernet76"
]
},
"front-panel-number": {
"type": "integer",
"description": "The identification number of the port as can be seen on the front-panel of the device"
}
}
}
},
"port-capabilities": {
"type": "object",
"description": "Description of physical ports and their form-factors",
"properties": {
"form-factors": {
"type": "array",
"items": {
"type": "string",
"enum": [
"RJ45",
"SFP",
"SFP+",
"SFP28",
"SFP-DD",
"QSFP",
"QSFP+",
"QSFP28",
"QSFP-DD"
]
}
},
"ports-list": {
"type": "array",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"examples": [
"RJ45"
]
},
"ports": {
"type": "array",
"items": {
"type": "string",
"examples": [
"Ethernet1"
]
}
}
}
}
}
}
},
"poe-capabilities": {
"type": "object",
"description": "Description of physical ports and their PoE capabilities",
"properties": {
"supported-standards": {
"type": "array",
"items": {
"type": "string",
"enum": [
".3AF-POE",
".3AT-POE+",
".3BT-PoE++",
"PreStandard-Passive"
]
}
},
"power-budget": {
"type": "integer",
"examples": [
2000
]
},
"poe-ports": {
"type": "array",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"examples": [
".3AF-POE"
]
},
"budget-capacity": {
"type": "integer"
},
"ports": {
"type": "array",
"items": {
"type": "string",
"examples": [
"Ethernet1"
]
}
}
}
}
}
}
},
"supported-features": {
"type": "array",
"description": "List of all features supported by the device",
"items": {
"type": "string",
"enum": [
"VLAN",
"Port-Isolation",
"Spanning-Tree",
"Spanning-Tree-Rapid",
"Spanning-Tree-Per-VLAN",
"Spanning-Tree-Per-VLAN-Rapid",
"Spanning-Tree-MSTP",
"SVI-StaticIPv4",
"SVI-StaticIPv6",
"Interface-StaticIPv4",
"Interface-StaticIPv6",
"Routing-VRF",
"Routing-IPv4-Route-Blackhole",
"Routing-IPv4-Route-Unreachable",
"Routing-IPv4-Nexthop",
"Routing-IPv4-Broadcast",
"Routing-IPv4-Multicast-IGMP-Snooping",
"Routing-IPv4-Multicast-IGMP-Querier",
"Routing-IPv4-Multicast-IGMP-Static",
"Routing-IPv4-DHCP-Server",
"Routing-IPv4-DHCP-Relay",
"Routing-IPv4-DHCP-Snooping",
"Routing-IPv4-Port-Forward",
"Routing-IPv6-DHCP-Relay",
"Routing-IPv6-DHCP-Stateful",
"Routing-IPv6-DHCP-Stateless",
"Routing-IPv6-Port-Forward",
"PoE-Reset",
"Port-Access-Control",
"PAC-Dynamic-Auth",
"System-PasswordChange",
"System-SwUpdate",
"System-SwUpdate-Partial",
"Port-Mirroring",
"Service-SSH",
"Service-RSSH",
"Service-Telnet",
"Service-LLDP",
"Service-HTTP",
"Service-HTTPS",
"Service-GPS",
"Service-IGMP",
"Service-NTP",
"Service-MDNS",
"Service-QoS",
"Service-Syslog",
"Service-PAC",
"Service-Wireguard-Overlay",
"Service-Radius-Proxy",
"Service-Online-Check",
"Service-CaptivePortal",
"Service-PublicIpCheck",
"Tunneling-VxLAN",
"Tunneling-GRE",
"Tunneling-GRE6",
"Tunneling-L2TP",
"Tunneling-Mesh"
]
}
}
},
"$defs": {}
}

View File

@@ -13,6 +13,11 @@
"description": "The unique ID of the configuration. This is the unix timestamp of when the config was created.",
"type": "integer"
},
"public_ip_lookup": {
"description": "The fqdn to retrieve public ip of internet connection.",
"type": "string",
"format": "uc-fqdn"
},
"unit": {
"description": "A device has certain properties that describe its identity and location. These properties are described inside this object.",
"type": "object",
@@ -106,6 +111,16 @@
"description": "Global config for controlling whether MLD snooping is enabled. If this global setting is disabled, all VLANs are treated as disabled, whether they are enabled or not.",
"type": "boolean",
"default": true
},
"unknown-multicast-flood-control": {
"description": "Global config for the unknown multicast flood control feature. This enables the system to forward unknown multicast packets only to a multicast router (mrouter).",
"type": "boolean",
"default": false
},
"querier-enable": {
"description": "Global IGMP querier config. This enables all Vlan interfaces to act as a querier.",
"type": "boolean",
"default": false
}
}
}
@@ -429,7 +444,7 @@
},
"vrf": {
"description": "VRF id.",
"type": "number"
"type": "integer"
}
}
}
@@ -450,7 +465,7 @@
},
"vrf": {
"description": "VRF id.",
"type": "number"
"type": "integer"
}
}
}
@@ -670,51 +685,6 @@
"maximum": 4094
}
}
},
"port-isolation": {
"description": "This section describes the per-port specific port-isolation matrix (to which ports selected port can forward traffic to) configuration. Omitting this configuration completely fully disables any port-isolation configuration on this given port.",
"type": "object",
"properties": {
"sessions": {
"description": "Allow selected port to forward traffic in the provided session-based format.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "Session id to configure.",
"type": "integer"
},
"uplink": {
"description": "Configuration object for uplink interface(s)",
"type": "object",
"properties": {
"interface-list": {
"description": "List of interfaces (either physical or trunk ports)",
"type": "array",
"items": {
"type": "string"
}
}
}
},
"downlink": {
"description": "Configuration object for downlink interface(s)",
"type": "object",
"properties": {
"interface-list": {
"description": "List of interfaces (either physical or trunk ports)",
"type": "array",
"items": {
"type": "string"
}
}
}
}
}
}
}
}
}
}
}
@@ -767,42 +737,42 @@
"downstream"
]
}
}
},
"instances": {
"description": "Define a list of configuration for each STP instance. Meaning of this field depends on current STP protocol (switch.loop-detection.protocol)",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "Indicates instance to configure. Depends on current STP protocol If RPVSTP/PVSTP - vlan id If MSTP - instance id",
"type": "integer"
},
"enabled": {
"description": "Enable STP on this instance.",
"type": "boolean",
"default": true
},
"priority": {
"description": "Bridge priority.",
"type": "integer",
"default": 32768
},
"forward_delay": {
"description": "Defines the amount of time a switch port stays in the Listening and Learning states before transitioning to the Forwarding state.",
"type": "integer",
"default": 15
},
"hello_time": {
"description": "Determines how often switches send BPDU.",
"type": "integer",
"default": 2
},
"max_age": {
"description": "Specifies the maximum time that a switch port should wait to receive a BPDU from its neighbor before considering the link as failed or disconnected.",
"type": "integer",
"default": 20
},
"instances": {
"description": "Define a list of configuration for each STP instance. Meaning of this field depends on current STP protocol (switch.loop-detection.protocol)",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "Indicates instance to configure. Depends on current STP protocol If RPVSTP/PVSTP - vlan id If MSTP - instance id",
"type": "integer"
},
"enabled": {
"description": "Enable STP on this instance.",
"type": "boolean",
"default": true
},
"priority": {
"description": "Bridge priority.",
"type": "integer",
"default": 32768
},
"forward_delay": {
"description": "Defines the amount of time a switch port stays in the Listening and Learning states before transitioning to the Forwarding state.",
"type": "integer",
"default": 15
},
"hello_time": {
"description": "Determines how often switches send BPDU.",
"type": "integer",
"default": 2
},
"max_age": {
"description": "Specifies the maximum time that a switch port should wait to receive a BPDU from its neighbor before considering the link as failed or disconnected.",
"type": "integer",
"default": 20
}
}
}
}
@@ -910,6 +880,56 @@
}
}
}
},
"port-isolation": {
"description": "This section describes the per-port specific port-isolation matrix (to which ports selected port can forward traffic to) configuration. Omitting this configuration completely fully disables any port-isolation configuration on this given port.",
"type": "object",
"properties": {
"sessions": {
"description": "Allow selected port to forward traffic in the provided session-based format.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "Session id to configure.",
"type": "integer"
},
"uplink": {
"description": "Configuration object for uplink interface(s)",
"type": "object",
"properties": {
"interface-list": {
"description": "List of interfaces (either physical or trunk ports)",
"type": "array",
"items": {
"type": "string"
}
}
}
},
"downlink": {
"description": "Configuration object for downlink interface(s)",
"type": "object",
"properties": {
"interface-list": {
"description": "List of interfaces (either physical or trunk ports)",
"type": "array",
"items": {
"type": "string"
}
}
}
}
}
}
}
}
},
"jumbo-frames": {
"description": "Enables Jumbo frames",
"type": "boolean",
"default": false
}
}
},
@@ -1340,7 +1360,7 @@
},
"vrf": {
"description": "VRF id.",
"type": "number"
"type": "integer"
}
}
}
@@ -1369,7 +1389,7 @@
},
"vrf": {
"description": "VRF id.",
"type": "number"
"type": "integer"
},
"metric": {
"description": "Optional metric value (define a NH route's weight / metric).",
@@ -1394,7 +1414,7 @@
},
"vrf": {
"description": "VRF id.",
"type": "number"
"type": "integer"
}
}
}
@@ -4728,6 +4748,23 @@
"type": "boolean"
}
}
},
"https": {
"description": "Enable the webserver with the on-boarding webui",
"type": "object",
"properties": {
"https-port": {
"description": "The port that the secure HTTP server should run on.",
"type": "integer",
"maximum": 65535,
"minimum": 1,
"default": 443
},
"enable": {
"description": "This option whether secure http server should be enabled or disabled.",
"type": "boolean"
}
}
}
}
},

View File

@@ -10,6 +10,10 @@
"uuid": {
"type": "integer"
},
"public_ip_lookup": {
"type": "string",
"format": "uc-fqdn"
},
"unit": {
"$ref": "#/$defs/unit"
},
@@ -130,6 +134,14 @@
"mld-snooping-enable": {
"type": "boolean",
"default": true
},
"unknown-multicast-flood-control": {
"type": "boolean",
"default": false
},
"querier-enable": {
"type": "boolean",
"default": false
}
}
}
@@ -251,7 +263,7 @@
]
},
"vrf": {
"type": "number"
"type": "integer"
}
}
}
@@ -269,7 +281,7 @@
]
},
"vrf": {
"type": "number"
"type": "integer"
}
}
}
@@ -465,44 +477,6 @@
"maximum": 4094
}
}
},
"port-isolation": {
"type": "object",
"properties": {
"sessions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"uplink": {
"type": "object",
"properties": {
"interface-list": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"downlink": {
"type": "object",
"properties": {
"interface-list": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
}
}
}
}
}
}
},
@@ -547,35 +521,35 @@
"downstream"
]
}
}
},
"instances": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"enabled": {
"type": "boolean",
"default": true
},
"priority": {
"type": "integer",
"default": 32768
},
"forward_delay": {
"type": "integer",
"default": 15
},
"hello_time": {
"type": "integer",
"default": 2
},
"max_age": {
"type": "integer",
"default": 20
},
"instances": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"enabled": {
"type": "boolean",
"default": true
},
"priority": {
"type": "integer",
"default": 32768
},
"forward_delay": {
"type": "integer",
"default": 15
},
"hello_time": {
"type": "integer",
"default": 2
},
"max_age": {
"type": "integer",
"default": 20
}
}
}
}
@@ -666,6 +640,48 @@
}
}
}
},
"port-isolation": {
"type": "object",
"properties": {
"sessions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"uplink": {
"type": "object",
"properties": {
"interface-list": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"downlink": {
"type": "object",
"properties": {
"interface-list": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
}
}
}
}
},
"jumbo-frames": {
"type": "boolean",
"default": false
}
}
},
@@ -1094,7 +1110,7 @@
]
},
"vrf": {
"type": "number"
"type": "integer"
}
}
}
@@ -1119,7 +1135,7 @@
]
},
"vrf": {
"type": "number"
"type": "integer"
},
"metric": {
"type": "number"
@@ -1140,7 +1156,7 @@
]
},
"vrf": {
"type": "number"
"type": "integer"
}
}
}
@@ -3622,6 +3638,20 @@
}
}
},
"service.https": {
"type": "object",
"properties": {
"https-port": {
"type": "integer",
"maximum": 65535,
"minimum": 1,
"default": 443
},
"enable": {
"type": "boolean"
}
}
},
"service": {
"type": "object",
"properties": {
@@ -3693,6 +3723,9 @@
},
"telnet": {
"$ref": "#/$defs/service.telnet"
},
"https": {
"$ref": "#/$defs/service.https"
}
}
},

View File

@@ -13,6 +13,11 @@
"description": "The unique ID of the configuration. This is the unix timestamp of when the config was created.",
"type": "integer"
},
"public_ip_lookup": {
"description": "The fqdn to retrieve public ip of internet connection.",
"type": "string",
"format": "uc-fqdn"
},
"unit": {
"$ref": "#/$defs/unit"
},
@@ -151,6 +156,16 @@
"description": "Global config for controlling whether MLD snooping is enabled. If this global setting is disabled, all VLANs are treated as disabled, whether they are enabled or not.",
"type": "boolean",
"default": true
},
"unknown-multicast-flood-control": {
"description": "Global config for the unknown multicast flood control feature. This enables the system to forward unknown multicast packets only to a multicast router (mrouter).",
"type": "boolean",
"default": false
},
"querier-enable": {
"description": "Global IGMP querier config. This enables all Vlan interfaces to act as a querier.",
"type": "boolean",
"default": false
}
}
}
@@ -280,7 +295,7 @@
},
"vrf": {
"description": "VRF id.",
"type": "number"
"type": "integer"
}
}
}
@@ -301,7 +316,7 @@
},
"vrf": {
"description": "VRF id.",
"type": "number"
"type": "integer"
}
}
}
@@ -522,51 +537,6 @@
"maximum": 4094
}
}
},
"port-isolation": {
"description": "This section describes the per-port specific port-isolation matrix (to which ports selected port can forward traffic to) configuration. Omitting this configuration completely fully disables any port-isolation configuration on this given port.",
"type": "object",
"properties": {
"sessions": {
"description": "Allow selected port to forward traffic in the provided session-based format.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "Session id to configure.",
"type": "integer"
},
"uplink": {
"description": "Configuration object for uplink interface(s)",
"type": "object",
"properties": {
"interface-list": {
"description": "List of interfaces (either physical or trunk ports)",
"type": "array",
"items": {
"type": "string"
}
}
}
},
"downlink": {
"description": "Configuration object for downlink interface(s)",
"type": "object",
"properties": {
"interface-list": {
"description": "List of interfaces (either physical or trunk ports)",
"type": "array",
"items": {
"type": "string"
}
}
}
}
}
}
}
}
}
}
},
@@ -618,42 +588,42 @@
"downstream"
]
}
}
},
"instances": {
"description": "Define a list of configuration for each STP instance. Meaning of this field depends on current STP protocol (switch.loop-detection.protocol)",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "Indicates instance to configure. Depends on current STP protocol If RPVSTP/PVSTP - vlan id If MSTP - instance id",
"type": "integer"
},
"enabled": {
"description": "Enable STP on this instance.",
"type": "boolean",
"default": true
},
"priority": {
"description": "Bridge priority.",
"type": "integer",
"default": 32768
},
"forward_delay": {
"description": "Defines the amount of time a switch port stays in the Listening and Learning states before transitioning to the Forwarding state.",
"type": "integer",
"default": 15
},
"hello_time": {
"description": "Determines how often switches send BPDU.",
"type": "integer",
"default": 2
},
"max_age": {
"description": "Specifies the maximum time that a switch port should wait to receive a BPDU from its neighbor before considering the link as failed or disconnected.",
"type": "integer",
"default": 20
},
"instances": {
"description": "Define a list of configuration for each STP instance. Meaning of this field depends on current STP protocol (switch.loop-detection.protocol)",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "Indicates instance to configure. Depends on current STP protocol If RPVSTP/PVSTP - vlan id If MSTP - instance id",
"type": "integer"
},
"enabled": {
"description": "Enable STP on this instance.",
"type": "boolean",
"default": true
},
"priority": {
"description": "Bridge priority.",
"type": "integer",
"default": 32768
},
"forward_delay": {
"description": "Defines the amount of time a switch port stays in the Listening and Learning states before transitioning to the Forwarding state.",
"type": "integer",
"default": 15
},
"hello_time": {
"description": "Determines how often switches send BPDU.",
"type": "integer",
"default": 2
},
"max_age": {
"description": "Specifies the maximum time that a switch port should wait to receive a BPDU from its neighbor before considering the link as failed or disconnected.",
"type": "integer",
"default": 20
}
}
}
}
@@ -761,6 +731,56 @@
}
}
}
},
"port-isolation": {
"description": "This section describes the per-port specific port-isolation matrix (to which ports selected port can forward traffic to) configuration. Omitting this configuration completely fully disables any port-isolation configuration on this given port.",
"type": "object",
"properties": {
"sessions": {
"description": "Allow selected port to forward traffic in the provided session-based format.",
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"description": "Session id to configure.",
"type": "integer"
},
"uplink": {
"description": "Configuration object for uplink interface(s)",
"type": "object",
"properties": {
"interface-list": {
"description": "List of interfaces (either physical or trunk ports)",
"type": "array",
"items": {
"type": "string"
}
}
}
},
"downlink": {
"description": "Configuration object for downlink interface(s)",
"type": "object",
"properties": {
"interface-list": {
"description": "List of interfaces (either physical or trunk ports)",
"type": "array",
"items": {
"type": "string"
}
}
}
}
}
}
}
}
},
"jumbo-frames": {
"description": "Enables Jumbo frames",
"type": "boolean",
"default": false
}
}
},
@@ -1248,7 +1268,7 @@
},
"vrf": {
"description": "VRF id.",
"type": "number"
"type": "integer"
}
}
}
@@ -1277,7 +1297,7 @@
},
"vrf": {
"description": "VRF id.",
"type": "number"
"type": "integer"
},
"metric": {
"description": "Optional metric value (define a NH route's weight / metric).",
@@ -1302,7 +1322,7 @@
},
"vrf": {
"description": "VRF id.",
"type": "number"
"type": "integer"
}
}
}
@@ -4172,6 +4192,23 @@
}
}
},
"service.https": {
"description": "Enable the webserver with the on-boarding webui",
"type": "object",
"properties": {
"https-port": {
"description": "The port that the secure HTTP server should run on.",
"type": "integer",
"maximum": 65535,
"minimum": 1,
"default": 443
},
"enable": {
"description": "This option whether secure http server should be enabled or disabled.",
"type": "boolean"
}
}
},
"service": {
"description": "This section describes all of the services that may be present on the AP. Each service is then referenced via its name inside an interface, ssid, ...",
"type": "object",
@@ -4244,6 +4281,9 @@
},
"telnet": {
"$ref": "#/$defs/service.telnet"
},
"https": {
"$ref": "#/$defs/service.https"
}
}
},

View File

@@ -325,6 +325,10 @@
"description": "An IPv4 addreess."
}
},
"public_ip": {
"type": "string",
"description": "The public IP address of internet connection."
},
"leasetime": {
"type": "number",
"description": "This is the leasetime if the IPv4 address of this logical interface was acquired via DHCPv4."
@@ -755,6 +759,9 @@
"counters": {
"$ref": "#/$defs/interface.counter"
},
"delta_counters": {
"$ref": "#/$defs/interface.counter"
},
"mesh-path": {
"$ref": "#/$defs/interface.mesh-path"
},
@@ -883,6 +890,9 @@
"counters": {
"$ref": "#/$defs/interface.counter"
},
"delta_counters": {
"$ref": "#/$defs/interface.counter"
},
"poe": {
"description": "This section describes the ethernet poe-port link-state object (statistics + PD info). Present only in case if port has any Power sourcing capabilities.",
"type": "object",