diff --git a/CHANGELOG.md b/CHANGELOG.md index 62d4cc7f..6cd526a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,16 @@ # Changelog Changes to this project are documented in this file. More detail and links can be found in the Declarative Onboarding [Document Revision History](https://clouddocs.f5.com/products/extensions/f5-declarative-onboarding/latest/revision-history.html). +## 1.37.0 +### Added +- AUTOTOOL-3495: ([Github Issue 304](https://github.com/F5Networks/f5-declarative-onboarding/issues/304)): Support Security Reporting Settings + +### Fixed + +### Changed + +### Removed + ## 1.36.1 ### Added @@ -89,7 +99,7 @@ Changes to this project are documented in this file. More detail and links can b ### Fixed - AUTOTOOL-3156: Declaration can fail while waiting for unprovisioned service to run -- AUTOTOOL-2850: ([GitHub Issue 279](https://github.com/F5Networks/f5-declarative-onboarding/issues/279)): Management firewall policy does not work without AFM module for version 15.1.2.1 +- AUTOTOOL-2850: ([GitHub Issue 279](https://github.com/F5Networks/f5-declarative-onboarding/issues/279)): Management firewall policy does not work without AFM module - AUTOTOOL-3012: ([GitHub Issue 292](https://github.com/F5Networks/f5-declarative-onboarding/issues/292)): DO unable to change hostname correctly in Google Cloud ### Changed diff --git a/README.md b/README.md index 78a59928..83cdfcaa 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # F5 BIG-IP Declarative Onboarding -[![Slack Status](https://f5cloudsolutions.herokuapp.com/badge.svg)](https://f5cloudsolutions.herokuapp.com) [![Releases](https://img.shields.io/github/release/F5Networks/f5-declarative-onboarding.svg)](https://github.com/F5Networks/f5-declarative-onboarding/releases) [![Issues](https://img.shields.io/github/issues/F5Networks/f5-declarative-onboarding.svg)](https://github.com/F5Networks/f5-declarative-onboarding/issues) diff --git a/SUPPORT.md b/SUPPORT.md index ae528543..1b35c90f 100644 --- a/SUPPORT.md +++ b/SUPPORT.md @@ -13,10 +13,10 @@ Currently supported versions: | Software Version | Release Type | First Customer Ship | End of Support | |------------------|---------------|---------------------|-----------------| -| DO 1.34.0 | Feature | 15-Nov-2022 | 15-Feb-2023 | | DO 1.35.0 | Feature | 12-Jan-2023 | 12-Apr-2023 | | DO 1.36.0 | Feature | 09-Feb-2023 | 09-May-2023 | | DO 1.36.1 | LTS | 09-Mar-2023 | 09-Mar-2024 | +| DO 1.37.0 | Feature | 27-Mar-2022 | 27-Jun-2023 | \* Fix for Allowed schema version @@ -63,6 +63,7 @@ Versions no longer supported: | DO 1.32.0 | Feature | 23-Aug-2022 | 23-Nov-2022 | | DO 1.33.0 | Feature | 04-Oct-2022 | 04-Jan-2023 | | DO 1.27.1 | LTS | 08-Mar-2022 | 08-Mar-2023 | +| DO 1.34.0 | Feature | 15-Nov-2022 | 15-Feb-2023 | \* Fix for updated Docker Container packaging only diff --git a/contributing/process_release.md b/contributing/process_release.md index 2e6eacb2..18b2cc93 100644 --- a/contributing/process_release.md +++ b/contributing/process_release.md @@ -57,8 +57,8 @@ * The name of the tag should be the LTS version with a 'v' at the front (e.g. v1.36.1). * Update the `createFrom` to point at the LTS branch. * Set the message to: `LTS release v` (e.g. "LTS release v1.36.1") -* Merge the release branch (without updating the package version) into develop and create an MR for this. -* Merge the release branch (without updating the package version) into master and create an MR for this. +* Merge the LTS branch (without updating the package version) into develop and create an MR for this. +* Merge the LTS branch (only update package version if LTS is latest) into master and create an MR for this. ## Process for release ### Begin process release at the very beginning of the first sprint of a new release, by performing the following actions: diff --git a/docs/composing-a-declaration.rst b/docs/composing-a-declaration.rst index c2616624..cad9fd0a 100644 --- a/docs/composing-a-declaration.rst +++ b/docs/composing-a-declaration.rst @@ -560,7 +560,7 @@ For more information, see |ntpclass| in the Schema Reference. "external-self": { "class": "SelfIp", - "address": "1.2.3.4/24", + "address": "192.0.2.4/24", "vlan": "external", "allowService": "none", "trafficGroup": "traffic-group-local-only" @@ -649,8 +649,8 @@ For more information, see |mgmtrouteclass| in the Schema Reference. "managementRoute": { "class": "ManagementRoute", - "gw": "1.2.3.4", - "network": "4.3.2.1", + "gw": "192.0.2.4", + "network": "192.0.2.1", "mtu": 1000, "type": "interface" }, diff --git a/docs/conf.py b/docs/conf.py index d4e97b78..214788dd 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -85,7 +85,7 @@ # The short X.Y version. version = u'' # The full version, including alpha/beta/rc tags. -release = u'1.36.1' +release = u'1.37.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/declarations/trace-response.json b/docs/declarations/trace-response.json index f4708112..99cef5d0 100644 --- a/docs/declarations/trace-response.json +++ b/docs/declarations/trace-response.json @@ -143,7 +143,7 @@ "contact": "Customer Name ", "location": "Network Closet 1", "allowList": [ - "127.0.0.0/8" + "192.0.2.0/8" ] }, "SnmpTrapEvents": { @@ -448,7 +448,7 @@ "contact": "Customer Name ", "location": "Network Closet 1", "allowList": [ - "127.0.0.0/8" + "192.0.2.1/8" ] }, "SnmpUser": {}, diff --git a/docs/json-pointers.rst b/docs/json-pointers.rst index f90ed088..a9ccadc9 100644 --- a/docs/json-pointers.rst +++ b/docs/json-pointers.rst @@ -58,7 +58,7 @@ For example, you have the following lines in your declaration. "external-self": { "class": "SelfIp", - "address": "1.2.3.4/24", + "address": "192.0.2.4/24", "vlan": "external", "allowService": "default", "trafficGroup": "traffic-group-1" diff --git a/docs/prereqs.rst b/docs/prereqs.rst index 430b17b6..30ea7162 100644 --- a/docs/prereqs.rst +++ b/docs/prereqs.rst @@ -58,6 +58,10 @@ Notes and tips
+.. |p| raw:: html + + v13.1.1.5 + .. |as3| raw:: html Application Services 3 (AS3) diff --git a/docs/revision-history.rst b/docs/revision-history.rst index 43e11360..fa4b5bd8 100644 --- a/docs/revision-history.rst +++ b/docs/revision-history.rst @@ -40,11 +40,11 @@ Document Revision History - 7-15-22 * - 1.30 - - Updated the documentation for BIG-IP Declarative Onboarding v1.30.0. This release contains the following changes: |br| * Added support for validating declarations with either Device or BIG-IP DO class using do.schema.json (see :ref:`Validating a declaration`) |br| |br| Issues Resolved: |br| * Declaration can fail while waiting for unprovisioned service to run |br| * Management firewall policy does not work without AFM module for version 15.1.2.1, `GitHub Issue 279 `_ |br| * BIG-IP DO unable to change hostname correctly in Google Cloud, `GitHub Issue 292 `_ + - Updated the documentation for BIG-IP Declarative Onboarding v1.30.0. This release contains the following changes: |br| * Added support for validating declarations with either Device or BIG-IP DO class using do.schema.json (see :ref:`Validating a declaration`) |br| |br| Issues Resolved: |br| * Declaration can fail while waiting for unprovisioned service to run |br| * Management firewall policy does not work without AFM module, `GitHub Issue 279 `_ |br| * BIG-IP DO unable to change hostname correctly in Google Cloud, `GitHub Issue 292 `_ - 5-31-22 * - 1.29 - - Updated the documentation for BIG-IP Declarative Onboarding v1.29.0. This release contains the following issues resolved: |br| * SelfIp with RouteDomain cannot reach directly connected network |br| * Licensing can fail if restnoded restarts during processing |br| * SelfIp allowService property does not accept a mix of service:port and default, `GitHub Issue 276 `_ |br| * Security level is not automatically set in the SnmpUser class, `GitHub Issue 282 `_ |br| * Management firewall policy does not work without AFM module for version 15.1.2.1, `GitHub Issue 279 `_ + - Updated the documentation for BIG-IP Declarative Onboarding v1.29.0. This release contains the following issues resolved: |br| * SelfIp with RouteDomain cannot reach directly connected network |br| * Licensing can fail if restnoded restarts during processing |br| * SelfIp allowService property does not accept a mix of service:port and default, `GitHub Issue 276 `_ |br| * Security level is not automatically set in the SnmpUser class, `GitHub Issue 282 `_ |br| * Management firewall policy does not work without AFM module, `GitHub Issue 279 `_ - 4-19-22 * - 1.28 diff --git a/examples/authMethods.json b/examples/authMethods.json index 87c4a9fb..1d3ec3b3 100644 --- a/examples/authMethods.json +++ b/examples/authMethods.json @@ -18,7 +18,7 @@ "serviceType": "call-check", "servers": { "primary": { - "server": "1.2.3.4", + "server": "192.0.2.60", "port": 1811, "secret": "mySecret" }, @@ -49,7 +49,7 @@ "searchTimeout": 687, "servers": [ "my.host.com", - "1.2.3.4", + "192.0.2.60", "FE80:0000:0000:0000:0202:B3FF:FE1E:8329" ], "ssl": "enabled", @@ -76,7 +76,7 @@ "secret": "aSecret1", "servers": [ "my.host.com", - "1.2.3.4", + "192.0.2.60", "FE80:0000:0000:0000:0202:B3FF:FE1E:8329" ], "service": "ppp" diff --git a/examples/bgp.json b/examples/bgp.json index 7d814532..49ceedde 100644 --- a/examples/bgp.json +++ b/examples/bgp.json @@ -61,7 +61,7 @@ { "name": 30, "action": "deny", - "prefix": "198.51.100.0/24", + "prefix": "192.0.2.0/24", "prefixLengthRange": 25 } ] @@ -129,12 +129,12 @@ "keepAlive": 10, "neighbors": [ { - "address": "203.0.113.1", + "address": "192.0.2.1", "ebgpMultihop": 2, "peerGroup": "Neighbor" }, { - "address": "203.0.113.2", + "address": "192.0.2.2", "ebgpMultihop": 3, "peerGroup": "Neighbor" } @@ -156,7 +156,7 @@ } ], "routeDomain": "exampleRouteDomain", - "routerId": "203.0.113.4" + "routerId": "192.0.2.4" } } } diff --git a/examples/firewallPolicy.json b/examples/firewallPolicy.json index d931c374..a62aed34 100644 --- a/examples/firewallPolicy.json +++ b/examples/firewallPolicy.json @@ -24,13 +24,13 @@ }, "selfTwo": { "class": "SelfIp", - "address": "192.0.3.20/24", + "address": "192.0.2.20/24", "vlan": "/Common/newVlan", "stagedFirewallPolicy": "/Common/firewallPolicy" }, "firewallAddressList1": { "class": "FirewallAddressList", - "addresses": ["192.0.2.10", "192.1.2.0/24"] + "addresses": ["192.0.2.10", "192.0.2.0/24"] }, "firewallPortList1": { "class": "FirewallPortList", diff --git a/examples/gslbMonitor.json b/examples/gslbMonitor.json index c18a3da7..3e264969 100644 --- a/examples/gslbMonitor.json +++ b/examples/gslbMonitor.json @@ -19,7 +19,7 @@ "class": "GSLBServer", "devices": [ { - "address": "10.10.10.10", + "address": "192.0.2.10", "addressTranslation": "192.0.2.12", "remark": "GSLB server device description" } @@ -37,7 +37,7 @@ "class": "GSLBMonitor", "remark": "description", "monitorType": "http", - "target": "1.1.1.1:80", + "target": "192.0.2.1:80", "interval": 100, "timeout": 1000, "probeTimeout": 110, @@ -51,7 +51,7 @@ "class": "GSLBMonitor", "remark": "description", "monitorType": "https", - "target": "2.2.2.2:80", + "target": "192.0.2.2:80", "interval": 100, "timeout": 1000, "probeTimeout": 110, @@ -67,7 +67,7 @@ "class": "GSLBMonitor", "remark": "description", "monitorType": "gateway-icmp", - "target": "3.3.3.3:80", + "target": "192.0.2.3:80", "interval": 100, "timeout": 1000, "probeTimeout": 110, @@ -80,7 +80,7 @@ "class": "GSLBMonitor", "remark": "description", "monitorType": "tcp", - "target": "4.4.4.4:80", + "target": "192.0.2.4:80", "interval": 100, "timeout": 1000, "probeTimeout": 110, @@ -94,7 +94,7 @@ "class": "GSLBMonitor", "remark": "description", "monitorType": "udp", - "target": "5.5.5.5:80", + "target": "192.0.2.55:80", "interval": 100, "timeout": 1000, "probeTimeout": 110, diff --git a/examples/licenseViaBigIqReachableASG.json b/examples/licenseViaBigIqReachableASG.json index 8ef7060c..2ac6bbda 100644 --- a/examples/licenseViaBigIqReachableASG.json +++ b/examples/licenseViaBigIqReachableASG.json @@ -1,7 +1,7 @@ { "class": "DO", - "targetHost": "1.2.3.4", - "targetUsername": "/declaration/Credentials/1/username", + "targetHost": "192.0.2.4", + "targetUsername": "/declaration/Credentials/1/bigiqUsername", "targetPassphrase": "/declaration/Credentials/1/password", "declaration": { "schemaVersion": "1.0.0", @@ -23,15 +23,15 @@ "myLicense": { "class": "License", "licenseType": "licensePool", - "bigIqHost": "10.0.1.200", - "bigIqUsername": "/Credentials/0/username", + "bigIqHost": "192.0.2.200", + "bigIqUsername": "/Credentials/0/bigiqUsername", "bigIqPassword": "/Credentials/0/password", "licensePool": "myUtilityLicense", "skuKeyword1": "key1", "skuKeyword2": "key2", "unitOfMeasure": "hourly", "reachable": true, - "bigIpUsername": "/Credentials/1/username", + "bigIpUsername": "/Credentials/1/bigipUsername", "bigIpPassword": "/Credentials/1/password" }, "myDns": { diff --git a/examples/managementIpFirewalWithAfmProvisioned.json b/examples/managementIpFirewalWithAfmProvisioned.json index d78e8c53..855c5366 100644 --- a/examples/managementIpFirewalWithAfmProvisioned.json +++ b/examples/managementIpFirewalWithAfmProvisioned.json @@ -11,7 +11,7 @@ }, "firewallAddressList1": { "class": "FirewallAddressList", - "addresses": ["192.0.2.10", "192.1.2.0/24"] + "addresses": ["192.0.2.10", "233.252.0.0/24"] }, "firewallPortList1": { "class": "FirewallPortList", diff --git a/examples/managementIpFirewall.json b/examples/managementIpFirewall.json index e20d3c61..4984c0fa 100644 --- a/examples/managementIpFirewall.json +++ b/examples/managementIpFirewall.json @@ -6,7 +6,7 @@ "class": "Tenant", "netAddressList1": { "class": "NetAddressList", - "addresses": ["192.0.2.10", "192.1.2.0/24"] + "addresses": ["192.0.2.10", "233.252.0.0/24"] }, "netPortList1": { "class": "NetPortList", diff --git a/examples/onboard.json b/examples/onboard.json index 8e66a786..30ad02d3 100644 --- a/examples/onboard.json +++ b/examples/onboard.json @@ -121,8 +121,8 @@ }, "managementRoute": { "class": "ManagementRoute", - "gw": "1.2.3.4", - "network": "4.3.2.1", + "gw": "192.0.2.4", + "network": "192.0.2.1", "mtu": 1500 }, "myRouteDomain": { diff --git a/examples/onboardViaBigIqAws.json b/examples/onboardViaBigIqAws.json index cdabca73..0e0ed236 100644 --- a/examples/onboardViaBigIqAws.json +++ b/examples/onboardViaBigIqAws.json @@ -41,7 +41,7 @@ } } }, - "targetHost": "54.10.10.10", + "targetHost": "192.0.2.10", "targetUsername": "admin", "targetSshKey": { "path": "/var/ssh/restnoded/privatessh.key" diff --git a/examples/preserveOrigDhcpRoutes.json b/examples/preserveOrigDhcpRoutes.json index 9a04ed17..0067e55b 100644 --- a/examples/preserveOrigDhcpRoutes.json +++ b/examples/preserveOrigDhcpRoutes.json @@ -10,8 +10,8 @@ }, "newManagementRoute": { "class": "ManagementRoute", - "network": "1.2.3.4", - "gw": "4.3.2.1" + "network": "192.0.2.4", + "gw": "192.0.2.1" } } } diff --git a/examples/routeMap.json b/examples/routeMap.json index 595a3c0e..03258e50 100644 --- a/examples/routeMap.json +++ b/examples/routeMap.json @@ -74,7 +74,7 @@ { "name": 30, "action": "deny", - "prefix": "198.51.100.0/24", + "prefix": "192.0.2.1/24", "prefixLengthRange": 25 } ] diff --git a/examples/routingAccessList.json b/examples/routingAccessList.json index 6085a7be..eb6df329 100644 --- a/examples/routingAccessList.json +++ b/examples/routingAccessList.json @@ -18,9 +18,9 @@ { "name": "22", "action": "deny", - "destination": "198.51.100.10", + "destination": "192.0.2.10", "exactMatchEnabled": false, - "source": "198.51.100.11" + "source": "192.0.2.11" } ] }, diff --git a/examples/routingPrefixList.json b/examples/routingPrefixList.json index 2e619456..d6cf7410 100644 --- a/examples/routingPrefixList.json +++ b/examples/routingPrefixList.json @@ -34,7 +34,7 @@ { "name": 30, "action": "deny", - "prefix": "198.51.100.0/24", + "prefix": "192.0.2.1/24", "prefixLengthRange": "25:27" } ] diff --git a/examples/securityAnalytics.json b/examples/securityAnalytics.json new file mode 100644 index 00000000..204b1d97 --- /dev/null +++ b/examples/securityAnalytics.json @@ -0,0 +1,42 @@ +{ + "async": true, + "schemaVersion": "1.37.0", + "class": "Device", + "Common": { + "class": "Tenant", + "currentSecurityAnalytics": { + "class": "SecurityAnalytics", + "aclRules": { + "collectClientIpEnabled": true, + "collectClientPortEnabled": false, + "collectDestinationIpEnabled": true, + "collectDestinationPortEnabled": true, + "collectServerSideStatsEnabled": false + }, + "collectAllDosStatsEnabled": false, + "collectedStatsExternalLoggingEnabled": false, + "collectedStatsInternalLoggingEnabled": false, + "dns": { + "collectClientIpEnabled": true, + "collectDestinationIpEnabled": true + }, + "collectDnsStatsEnabled": true, + "dosL2L4": { + "collectClientIpEnabled": true, + "collectDestinationGeoEnabled": true + }, + "collectDosL3StatsEnabled": true, + "collectFirewallAclStatsEnabled": true, + "collectFirewallDropsStatsEnabled": true, + "collectIpReputationStatsEnabled": true, + "l3L4Errors": { + "collectClientIpEnabled": true, + "collectDestinationIpEnabled": true + }, + "collectSipStatsEnabled": true, + "collectStaleRulesEnabled": true, + "publisher": "none", + "smtpConfig": "none" + } + } +} diff --git a/examples/viaASG.json b/examples/viaASG.json index 5f5419f6..8618f8d6 100644 --- a/examples/viaASG.json +++ b/examples/viaASG.json @@ -1,6 +1,6 @@ { "class": "DO", - "targetHost": "1.2.3.4", + "targetHost": "192.0.2.4", "targetUsername": "admin", "targetPassphrase": "myAdminPassword", "declaration": { diff --git a/examples/vxlanTunnel.json b/examples/vxlanTunnel.json index a59f5d0a..64f390c3 100644 --- a/examples/vxlanTunnel.json +++ b/examples/vxlanTunnel.json @@ -13,8 +13,8 @@ "tunnelType": "vxlan", "tos": "preserve", "usePmtu": true, - "localAddress": "10.145.0.1", - "remoteAddress": "239.250.0.2", + "localAddress": "192.0.2.1", + "remoteAddress": "233.252.0.2", "secondaryAddress": "any6", "key": 0, "mode": "bidirectional", diff --git a/package-lock.json b/package-lock.json index 0e7fe2b0..76c8d00d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "f5-declarative-onboarding", - "version": "1.36.1-1", + "version": "1.37.0-3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -30,7 +30,7 @@ "version": "7.15.8", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", - "dev": true, + "devOptional": true, "requires": { "@babel/highlight": "^7.14.5" } @@ -95,7 +95,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, + "devOptional": true, "requires": { "@babel/types": "^7.18.6" }, @@ -104,13 +104,13 @@ "version": "7.19.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true + "devOptional": true }, "@babel/types": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", - "dev": true, + "devOptional": true, "requires": { "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", @@ -354,7 +354,7 @@ "version": "7.15.4", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", - "dev": true, + "devOptional": true, "requires": { "@babel/helper-get-function-arity": "^7.15.4", "@babel/template": "^7.15.4", @@ -365,7 +365,7 @@ "version": "7.15.4", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", - "dev": true, + "devOptional": true, "requires": { "@babel/types": "^7.15.4" } @@ -374,7 +374,7 @@ "version": "7.15.4", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", - "dev": true, + "devOptional": true, "requires": { "@babel/types": "^7.15.4" } @@ -392,7 +392,7 @@ "version": "7.15.4", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", - "dev": true, + "devOptional": true, "requires": { "@babel/types": "^7.15.4" } @@ -481,7 +481,7 @@ "version": "7.15.4", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", - "dev": true, + "devOptional": true, "requires": { "@babel/types": "^7.15.4" } @@ -490,13 +490,13 @@ "version": "7.19.4", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true + "devOptional": true }, "@babel/helper-validator-identifier": { "version": "7.15.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true + "devOptional": true }, "@babel/helper-validator-option": { "version": "7.14.5", @@ -519,7 +519,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dev": true, + "devOptional": true, "requires": { "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", @@ -530,7 +530,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, + "devOptional": true, "requires": { "color-convert": "^1.9.0" } @@ -539,7 +539,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, + "devOptional": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -550,7 +550,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, + "devOptional": true, "requires": { "color-name": "1.1.3" } @@ -559,28 +559,13 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "devOptional": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } + "devOptional": true } } }, @@ -872,7 +857,7 @@ "version": "7.15.4", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", - "dev": true, + "devOptional": true, "requires": { "@babel/code-frame": "^7.14.5", "@babel/parser": "^7.15.4", @@ -883,7 +868,7 @@ "version": "7.15.8", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", - "dev": true + "devOptional": true } } }, @@ -891,7 +876,7 @@ "version": "7.15.4", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", - "dev": true, + "devOptional": true, "requires": { "@babel/code-frame": "^7.14.5", "@babel/generator": "^7.15.4", @@ -908,7 +893,7 @@ "version": "7.15.8", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", - "dev": true, + "devOptional": true, "requires": { "@babel/types": "^7.15.6", "jsesc": "^2.5.1", @@ -919,13 +904,13 @@ "version": "7.15.8", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", - "dev": true + "devOptional": true }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "devOptional": true } } }, @@ -933,7 +918,7 @@ "version": "7.15.6", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", - "dev": true, + "devOptional": true, "requires": { "@babel/helper-validator-identifier": "^7.14.9", "to-fast-properties": "^2.0.0" @@ -993,18 +978,18 @@ } }, "@f5devcentral/atg-shared-utilities": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@f5devcentral/atg-shared-utilities/-/atg-shared-utilities-0.5.4.tgz", - "integrity": "sha512-7SIEYyyCmpcDYILimz6/O+gAMNv81aJcyu11M7SUMzOpCNm2X8Vb3aRO7LY6XfcAV9SmYyT/d7xNCPjhcz6oOQ==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@f5devcentral/atg-shared-utilities/-/atg-shared-utilities-0.5.5.tgz", + "integrity": "sha512-aAZkJxO7NYiAoREsh3foEdVbaHvfH5Z8GWyywY+hUaevpLJWrWnkQqSIqBA+pjJYDLlX8rFQWgFEaQeyvKQd5A==", "requires": { "error": "7.2.1", "jaeger-client": "^3.18.1" } }, "@f5devcentral/atg-shared-utilities-dev": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@f5devcentral/atg-shared-utilities-dev/-/atg-shared-utilities-dev-0.2.11.tgz", - "integrity": "sha512-rF7OO98jAY0x2K3TTgkpDIhG/Rlwpi0RszVGxWP0s4bs3y9wKPCxX12BcK6DgDMZPjoWUM+BNk+ve7SgRKbTgg==", + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@f5devcentral/atg-shared-utilities-dev/-/atg-shared-utilities-dev-0.2.12.tgz", + "integrity": "sha512-S0uYIUcE83SQ+u3bl19r+ymOV3G2BDL42E8o3UG+FP6BKBXAjTaXLqRxBOKXWB+J7jBvKWtnrvfkp2DEV2caBA==", "dev": true }, "@f5devcentral/atg-storage": { @@ -1023,9 +1008,9 @@ } }, "@f5devcentral/f5-cloud-libs": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@f5devcentral/f5-cloud-libs/-/f5-cloud-libs-4.28.1.tgz", - "integrity": "sha512-G2YnlSacCN0OubyhsSwqyugM91UQlE0FPvpC9hZcGsSlLPHPFM51vs4jBBl//T4Pm5LpyiePxTkl2QSCUURuBw==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@f5devcentral/f5-cloud-libs/-/f5-cloud-libs-4.28.2.tgz", + "integrity": "sha512-Xz+ng3KNyDlw7VTC6nWnQ45sWIbKENKnqyF74Dp58eKz8AFBxPXZVdcbbD8GPKDTby47QP0FOiSGZFGq4L9MmQ==", "requires": { "commander": "^2.19.0", "jmespath": "^0.15.0", @@ -1169,25 +1154,25 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true + "devOptional": true }, "@jridgewell/set-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true + "devOptional": true }, "@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "devOptional": true }, "@jridgewell/trace-mapping": { "version": "0.3.17", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, + "devOptional": true, "requires": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -1199,6 +1184,12 @@ "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", "dev": true }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "optional": true + }, "@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -1352,6 +1343,12 @@ "brace-expansion": "^2.0.1" } }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, "semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", @@ -1662,12 +1659,6 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -1711,11 +1702,20 @@ "lodash.flatmap": "~4.5.0" } }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "optional": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, "@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true + "devOptional": true }, "@types/json5": { "version": "0.0.29", @@ -1733,7 +1733,8 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "requires": {} }, "aggregate-error": { "version": "3.1.0", @@ -1765,6 +1766,15 @@ "tslib": "2.4.1" } }, + "ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "optional": true, + "requires": { + "string-width": "^4.1.0" + } + }, "ansi-color": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/ansi-color/-/ansi-color-0.2.1.tgz", @@ -1790,13 +1800,13 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "devOptional": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "devOptional": true, "requires": { "color-convert": "^2.0.1" } @@ -1805,7 +1815,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, + "devOptional": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -1830,7 +1840,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "devOptional": true }, "array-from": { "version": "2.1.1", @@ -1867,6 +1877,7 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "devOptional": true, "requires": { "safer-buffer": "~2.1.0" } @@ -1922,18 +1933,19 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "devOptional": true }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true + "devOptional": true }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "devOptional": true, "requires": { "tweetnacl": "^0.14.3" } @@ -1942,7 +1954,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true + "devOptional": true }, "bl": { "version": "5.1.0", @@ -1955,6 +1967,41 @@ "readable-stream": "^3.4.0" } }, + "boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "optional": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "optional": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "optional": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1969,7 +2016,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, + "devOptional": true, "requires": { "fill-range": "^7.0.1" } @@ -1984,7 +2031,7 @@ "version": "4.17.5", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.5.tgz", "integrity": "sha512-I3ekeB92mmpctWBoLXe0d5wPS2cBuRvvW0JyyJHMrk9/HmP2ZjrTboNAZ8iuGqaEIlKguljbQY32OkOJIRrgoA==", - "dev": true, + "devOptional": true, "requires": { "caniuse-lite": "^1.0.30001271", "electron-to-chromium": "^1.3.878", @@ -2021,6 +2068,38 @@ "integrity": "sha512-pziaA+p/wdVImfcbsZLNF32EiWyujlQLwolMqUQE8xpKNOH7KmZQaY8sXN7DGOEzPAElo9QTaeNRfGnf3iOJbA==", "optional": true }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "optional": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "optional": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "optional": true + } + } + }, "caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", @@ -2047,7 +2126,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true + "devOptional": true }, "callsites": { "version": "3.1.0", @@ -2059,13 +2138,13 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true + "devOptional": true }, "caniuse-lite": { "version": "1.0.30001271", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001271.tgz", "integrity": "sha512-BBruZFWmt3HFdVPS8kceTBIguKxu4f99n5JNp06OlPD/luoAMIaIK5ieV5YjnBLH3Nysai9sxj9rpJj4ZisXOA==", - "dev": true + "devOptional": true }, "caseless": { "version": "0.12.0", @@ -2101,7 +2180,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "devOptional": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2111,7 +2190,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "devOptional": true, "requires": { "has-flag": "^4.0.0" } @@ -2134,7 +2213,7 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, + "devOptional": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -2146,12 +2225,24 @@ "readdirp": "~3.6.0" } }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "optional": true + }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "optional": true + }, "cli-cursor": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", @@ -2177,7 +2268,7 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, + "devOptional": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -2188,7 +2279,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, + "devOptional": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -2203,11 +2294,20 @@ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true }, + "clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "optional": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "devOptional": true, "requires": { "color-name": "~1.1.4" } @@ -2216,7 +2316,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "devOptional": true }, "colors": { "version": "1.4.0", @@ -2250,6 +2350,20 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "optional": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, "confusing-browser-globals": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", @@ -2277,7 +2391,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "devOptional": true }, "coveralls": { "version": "3.1.1", @@ -2334,6 +2448,12 @@ "which": "^2.0.1" } }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "optional": true + }, "cycle": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", @@ -2358,7 +2478,7 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, + "devOptional": true, "requires": { "ms": "2.1.2" }, @@ -2367,7 +2487,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "devOptional": true } } }, @@ -2377,6 +2497,15 @@ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "optional": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, "deep-diff": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-1.0.2.tgz", @@ -2391,6 +2520,12 @@ "type-detect": "^4.0.0" } }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "optional": true + }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -2423,6 +2558,12 @@ "clone": "^1.0.2" } }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "optional": true + }, "define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -2460,6 +2601,21 @@ "esutils": "^2.0.2" } }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "optional": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", + "optional": true + }, "eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -2480,13 +2636,22 @@ "version": "1.3.878", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.878.tgz", "integrity": "sha512-O6yxWCN9ph2AdspAIszBnd9v8s11hQx8ub9w4UGApzmNRnoKhbulOWqbO8THEQec/aEHtvy+donHZMlh6l1rbA==", - "dev": true + "devOptional": true }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "devOptional": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "optional": true, + "requires": { + "once": "^1.4.0" + } }, "enquirer": { "version": "2.3.6", @@ -2587,7 +2752,13 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "devOptional": true + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "optional": true }, "escape-string-regexp": { "version": "4.0.0", @@ -2807,7 +2978,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, + "devOptional": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -2882,7 +3053,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, + "devOptional": true, "requires": { "estraverse": "^5.2.0" }, @@ -2891,7 +3062,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true + "devOptional": true } } }, @@ -2899,7 +3070,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "devOptional": true }, "esutils": { "version": "2.0.3", @@ -3019,7 +3190,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, + "devOptional": true, "requires": { "to-regex-range": "^5.0.1" } @@ -3113,14 +3284,6 @@ "requires": { "flatted": "^3.1.0", "rimraf": "^3.0.2" - }, - "dependencies": { - "flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", - "dev": true - } } }, "flatted": { @@ -3192,7 +3355,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "optional": true }, "function-bind": { @@ -3235,7 +3397,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "devOptional": true }, "get-func-name": { "version": "2.0.0", @@ -3309,16 +3471,25 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, + "devOptional": true, "requires": { "is-glob": "^4.0.1" } }, + "global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "optional": true, + "requires": { + "ini": "2.0.0" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "devOptional": true }, "globalthis": { "version": "1.0.3", @@ -3338,11 +3509,41 @@ "get-intrinsic": "^1.1.3" } }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "optional": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "dependencies": { + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "optional": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, "graceful-fs": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true + "devOptional": true }, "har-schema": { "version": "2.0.0", @@ -3379,7 +3580,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "devOptional": true }, "has-property-descriptors": { "version": "1.0.0", @@ -3411,6 +3612,12 @@ "has-symbols": "^1.0.2" } }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "optional": true + }, "hasha": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", @@ -3453,6 +3660,12 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "optional": true + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -3483,7 +3696,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true + "devOptional": true }, "ignore": { "version": "4.0.6", @@ -3501,11 +3714,17 @@ "resolve-from": "^4.0.0" } }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", + "optional": true + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "devOptional": true }, "indent-string": { "version": "4.0.0", @@ -3527,7 +3746,13 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "devOptional": true + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "optional": true }, "inquirer": { "version": "9.1.4", @@ -3627,7 +3852,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, + "devOptional": true, "requires": { "binary-extensions": "^2.0.0" } @@ -3648,6 +3873,15 @@ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "optional": true, + "requires": { + "ci-info": "^2.0.0" + } + }, "is-core-module": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", @@ -3670,19 +3904,19 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "devOptional": true }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "devOptional": true }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, + "devOptional": true, "requires": { "is-extglob": "^2.1.1" } @@ -3692,6 +3926,16 @@ "resolved": "https://registry.npmjs.org/is-in-subnet/-/is-in-subnet-4.0.1.tgz", "integrity": "sha512-D3mAuAo6vZ+/AxsLkEIZ3moTx7AIGQLLzLQslV6n0RRO/CzdUemXap+lj3OPAehKCbdkGPikxOVUYqRo0GGJAA==" }, + "is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "optional": true, + "requires": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + } + }, "is-interactive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", @@ -3704,11 +3948,17 @@ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, + "is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "optional": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "devOptional": true }, "is-number-object": { "version": "1.0.7", @@ -3719,6 +3969,18 @@ "has-tostringtag": "^1.0.0" } }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "optional": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "optional": true + }, "is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -3747,7 +4009,8 @@ "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "devOptional": true }, "is-string": { "version": "1.0.7", @@ -3784,7 +4047,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "devOptional": true }, "is-unicode-supported": { "version": "1.3.0", @@ -3807,6 +4070,12 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "optional": true + }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -3947,13 +4216,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "devOptional": true }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, + "devOptional": true, "requires": { "argparse": "^2.0.1" } @@ -3968,10 +4237,16 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true + "devOptional": true }, - "json-schema": { - "version": "0.4.0", + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "optional": true + }, + "json-schema": { + "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true @@ -4035,6 +4310,24 @@ "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", "dev": true }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "optional": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "optional": true, + "requires": { + "package-json": "^6.3.0" + } + }, "lcov-parse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", @@ -4064,7 +4357,7 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "devOptional": true }, "lodash.clonedeep": { "version": "4.5.0", @@ -4177,11 +4470,17 @@ "get-func-name": "^2.0.0" } }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "optional": true + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, + "devOptional": true, "requires": { "yallist": "^4.0.0" } @@ -4190,6 +4489,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "devOptional": true, "requires": { "semver": "^6.0.0" } @@ -4198,7 +4498,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "devOptional": true }, "mime-db": { "version": "1.50.0", @@ -4221,6 +4521,12 @@ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "optional": true + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4233,12 +4539,13 @@ "minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "devOptional": true }, "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.3.tgz", + "integrity": "sha512-sjAkg21peAG9HS+Dkx7hlG9Ztx7HLeKnvB3NQRcu/mltCVmvkF0pisbiTSfDVYTT86XEfZrTUosLdZLStquZUw==", "dev": true }, "mocha": { @@ -4409,9 +4716,9 @@ "dev": true }, "nan": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", "optional": true }, "nanoid": { @@ -4469,12 +4776,12 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "dev": true + "devOptional": true }, "node-ssh": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/node-ssh/-/node-ssh-13.0.0.tgz", - "integrity": "sha512-8yfPvuB8z1M5rXFR8Z1Tl0a0M43N64VjZfjXRwOGCcImFphuXhMPniPksf1FkVj9djKbpHvLUMIVS399H9yCSQ==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/node-ssh/-/node-ssh-13.0.1.tgz", + "integrity": "sha512-prGXb9KXXtrienVBPiyOCm7F8KSsQciN8VCgrkZeJAlSEtF8HsXa/0uVE5a6MgwIBPa0etTgwiyj/lfiFdVK1Q==", "optional": true, "requires": { "is-stream": "^2.0.0", @@ -4489,7 +4796,13 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "devOptional": true + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "optional": true }, "npm-run-path": { "version": "5.1.0", @@ -4719,7 +5032,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, + "devOptional": true, "requires": { "wrappy": "1" } @@ -4799,6 +5112,12 @@ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "optional": true + }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -4838,6 +5157,18 @@ "release-zalgo": "^1.0.0" } }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "optional": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + } + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -4896,13 +5227,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "devOptional": true }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "devOptional": true }, "prelude-ls": { "version": "1.2.1", @@ -4910,6 +5241,12 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "optional": true + }, "process": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/process/-/process-0.10.1.tgz", @@ -4937,11 +5274,30 @@ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "optional": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "optional": true, + "requires": { + "escape-goat": "^2.0.0" + } + }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -4960,11 +5316,37 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, + "devOptional": true, "requires": { "safe-buffer": "^5.1.0" } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "optional": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "optional": true + } + } + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -4980,7 +5362,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, + "devOptional": true, "requires": { "picomatch": "^2.2.1" } @@ -5005,104 +5387,6 @@ "yargs": "^17.3.1" }, "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "optional": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/generator": { - "version": "7.14.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz", - "integrity": "sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==", - "optional": true, - "requires": { - "@babel/types": "^7.14.2", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "optional": true - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", - "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", - "optional": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-function-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", - "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", - "optional": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.14.2" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "optional": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", - "optional": true, - "requires": { - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "optional": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "optional": true - }, - "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "optional": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.4.tgz", - "integrity": "sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA==", - "optional": true - }, "@babel/runtime": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", @@ -5112,43 +5396,6 @@ "regenerator-runtime": "^0.13.4" } }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "optional": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", - "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", - "optional": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.2", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.14.2", - "@babel/types": "^7.14.2", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", - "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", - "optional": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, "@emotion/is-prop-valid": { "version": "0.8.8", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", @@ -5186,45 +5433,25 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "optional": true, + "peer": true, "requires": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" } }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" - }, "@jridgewell/source-map": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "optional": true, + "peer": true, "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "@redocly/ajv": { "version": "8.6.4", "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.6.4.tgz", @@ -5263,25 +5490,12 @@ } } }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "optional": true - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "optional": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, "@types/eslint": { "version": "8.4.6", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", + "optional": true, + "peer": true, "requires": { "@types/estree": "*", "@types/json-schema": "*" @@ -5291,6 +5505,8 @@ "version": "3.7.4", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "optional": true, + "peer": true, "requires": { "@types/eslint": "*", "@types/estree": "*" @@ -5299,30 +5515,23 @@ "@types/estree": { "version": "0.0.51", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" - }, - "@types/mkdirp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.1.tgz", - "integrity": "sha512-HkGSK7CGAXncr8Qn/0VqNtExEE+PHMWb+qlR1faHMao7ng6P3tAaoWWBMdva0gL5h4zprjIO89GJOLXsMcDm1Q==", - "requires": { - "@types/node": "*" - } + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "optional": true, + "peer": true }, "@types/node": { "version": "15.12.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz", - "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==" + "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==", + "optional": true, + "peer": true }, "@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "optional": true, + "peer": true, "requires": { "@webassemblyjs/helper-numbers": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1" @@ -5331,22 +5540,30 @@ "@webassemblyjs/floating-point-hex-parser": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "optional": true, + "peer": true }, "@webassemblyjs/helper-api-error": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "optional": true, + "peer": true }, "@webassemblyjs/helper-buffer": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "optional": true, + "peer": true }, "@webassemblyjs/helper-numbers": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "optional": true, + "peer": true, "requires": { "@webassemblyjs/floating-point-hex-parser": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", @@ -5356,12 +5573,16 @@ "@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "optional": true, + "peer": true }, "@webassemblyjs/helper-wasm-section": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "optional": true, + "peer": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -5373,6 +5594,8 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "optional": true, + "peer": true, "requires": { "@xtuc/ieee754": "^1.2.0" } @@ -5381,6 +5604,8 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "optional": true, + "peer": true, "requires": { "@xtuc/long": "4.2.2" } @@ -5388,12 +5613,16 @@ "@webassemblyjs/utf8": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "optional": true, + "peer": true }, "@webassemblyjs/wasm-edit": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "optional": true, + "peer": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -5409,6 +5638,8 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "optional": true, + "peer": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1", @@ -5421,6 +5652,8 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "optional": true, + "peer": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -5432,6 +5665,8 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "optional": true, + "peer": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", @@ -5445,6 +5680,8 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "optional": true, + "peer": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" @@ -5453,85 +5690,39 @@ "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "optional": true, + "peer": true }, "@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "optional": true, + "peer": true }, "acorn": { "version": "8.8.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==" + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "optional": true, + "peer": true }, "acorn-import-assertions": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==" - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "dependencies": { - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - } - } + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "optional": true, + "peer": true, + "requires": {} }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" - }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "optional": true, - "requires": { - "string-width": "^4.1.0" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "optional": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "optional": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "optional": true + "peer": true, + "requires": {} }, "asn1.js": { "version": "5.4.1", @@ -5598,115 +5789,21 @@ "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", "optional": true }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "optional": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "optional": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "optional": true - }, "bn.js": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", "optional": true }, - "boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "optional": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "optional": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "optional": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "optional": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "optional": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "optional": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "optional": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "optional": true, "requires": { "balanced-match": "^1.0.0" } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", @@ -5803,6 +5900,8 @@ "version": "4.21.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "optional": true, + "peer": true, "requires": { "caniuse-lite": "^1.0.30001370", "electron-to-chromium": "^1.4.202", @@ -5832,7 +5931,9 @@ "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "optional": true, + "peer": true }, "buffer-xor": { "version": "1.0.3", @@ -5846,50 +5947,6 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "optional": true }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "optional": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "optional": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "optional": true - } - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "optional": true - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "optional": true - }, "camelize": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", @@ -5899,45 +5956,16 @@ "caniuse-lite": { "version": "1.0.30001390", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001390.tgz", - "integrity": "sha512-sS4CaUM+/+vqQUlCvCJ2WtDlV81aWtHhqeEVkLokVJJa3ViN4zDxAGfq9R8i1m90uGHxo99cy10Od+lvn3hf0g==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "integrity": "sha512-sS4CaUM+/+vqQUlCvCJ2WtDlV81aWtHhqeEVkLokVJJa3ViN4zDxAGfq9R8i1m90uGHxo99cy10Od+lvn3hf0g==", "optional": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "optional": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - } + "peer": true }, "chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "optional": true + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "optional": true, + "peer": true }, "cipher-base": { "version": "1.0.4", @@ -5955,78 +5983,18 @@ "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==", "optional": true }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "optional": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "optional": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "optional": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, "clsx": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", "optional": true }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "optional": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "optional": true - }, "colorette": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", "optional": true }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "optional": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, "console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", @@ -6042,13 +6010,9 @@ "core-js": { "version": "3.25.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.0.tgz", - "integrity": "sha512-CVU1xvJEfJGhyCpBrzzzU1kjCfgsGUxhEvwUV2e/cOedYWHdmluamx+knDnmhqALddMG16fZvIqvs9aijsHHaA==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "optional": true + "integrity": "sha512-CVU1xvJEfJGhyCpBrzzzU1kjCfgsGUxhEvwUV2e/cOedYWHdmluamx+knDnmhqALddMG16fZvIqvs9aijsHHaA==", + "optional": true, + "peer": true }, "create-ecdh": { "version": "4.0.4", @@ -6114,12 +6078,6 @@ "randomfill": "^1.0.3" } }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "optional": true - }, "css-color-keywords": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", @@ -6137,42 +6095,12 @@ "postcss-value-parser": "^4.0.2" } }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "optional": true, - "requires": { - "ms": "2.1.2" - } - }, "decko": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decko/-/decko-1.2.0.tgz", "integrity": "sha1-/UPHNelnuAEzBohKVvvmZZlraBc=", "optional": true }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "optional": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "optional": true - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "optional": true - }, "des.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", @@ -6214,25 +6142,12 @@ "integrity": "sha512-kD+f8qEaa42+mjdOpKeztu9Mfx5bv9gVLO6K9jRx4uGvh6Wv06Srn4jr1wPNY2OOUGGSKHNFN+A8MA3v0E0QAQ==", "optional": true }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "optional": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", - "optional": true - }, "electron-to-chromium": { "version": "1.4.242", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.242.tgz", - "integrity": "sha512-nPdgMWtjjWGCtreW/2adkrB2jyHjClo9PtVhR6rW+oxa4E4Wom642Tn+5LslHP3XPL5MCpkn5/UEY60EXylNeQ==" + "integrity": "sha512-nPdgMWtjjWGCtreW/2adkrB2jyHjClo9PtVhR6rW+oxa4E4Wom642Tn+5LslHP3XPL5MCpkn5/UEY60EXylNeQ==", + "optional": true, + "peer": true }, "elliptic": { "version": "6.5.4", @@ -6257,25 +6172,12 @@ } } }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "optional": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "optional": true, - "requires": { - "once": "^1.4.0" - } - }, "enhanced-resolve": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "optional": true, + "peer": true, "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -6284,7 +6186,9 @@ "es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "optional": true, + "peer": true }, "es6-promise": { "version": "3.3.1", @@ -6292,52 +6196,6 @@ "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", "optional": true }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "optional": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "optional": true - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -6347,7 +6205,8 @@ "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "optional": true }, "evp_bytestokey": { "version": "1.0.3", @@ -6359,110 +6218,31 @@ "safe-buffer": "^5.1.1" } }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, "fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "optional": true }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, "foreach": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", "optional": true }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "optional": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "optional": true, - "requires": { - "pump": "^3.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, "glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "optional": true, - "requires": { - "ini": "2.0.0" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "optional": true - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "optional": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } + "peer": true }, "graceful-fs": { "version": "4.2.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "optional": true, + "peer": true }, "handlebars": { "version": "4.7.7", @@ -6477,18 +6257,6 @@ "wordwrap": "^1.0.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "optional": true - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "optional": true - }, "hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -6551,12 +6319,6 @@ } } }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "optional": true - }, "http2-client": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", @@ -6569,121 +6331,6 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "optional": true }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "optional": true - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", - "optional": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "optional": true - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "optional": true - }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "optional": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "optional": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "optional": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "optional": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "optional": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "optional": true, - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "optional": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "optional": true - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "optional": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "optional": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "optional": true - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "optional": true - }, "isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -6694,6 +6341,8 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "optional": true, + "peer": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -6703,12 +6352,16 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "optional": true, + "peer": true }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "optional": true, + "peer": true, "requires": { "has-flag": "^4.0.0" } @@ -6721,37 +6374,12 @@ "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", "optional": true }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "optional": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "optional": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "optional": true - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "optional": true - }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "optional": true, + "peer": true }, "json-pointer": { "version": "0.6.2", @@ -6768,34 +6396,12 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "optional": true }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "optional": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "optional": true, - "requires": { - "package-json": "^6.3.0" - } - }, "loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "optional": true + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "optional": true, + "peer": true }, "lodash.isequal": { "version": "4.5.0", @@ -6812,44 +6418,12 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "optional": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "optional": true, - "requires": { - "yallist": "^4.0.0" - } - }, "lunr": { "version": "2.3.9", "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", "optional": true }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "optional": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "optional": true - } - } - }, "mark.js": { "version": "8.11.1", "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", @@ -6873,11 +6447,6 @@ "safe-buffer": "^5.1.2" } }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", @@ -6899,22 +6468,20 @@ "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "optional": true, + "peer": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "optional": true, + "peer": true, "requires": { "mime-db": "1.52.0" } }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "optional": true - }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -6936,12 +6503,6 @@ "brace-expansion": "^2.0.1" } }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "optional": true - }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -6967,18 +6528,14 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.2.3.tgz", "integrity": "sha512-7exWp1FV0M9dP08H9PIeHlJqDw4IdkQVRMfLYaZFMmlbzSS6ZU6p/kx392KN+rVf81hH3IQYewvRGQ70oiwmbw==", - "optional": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "optional": true + "optional": true, + "requires": {} }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "optional": true }, "node-fetch": { "version": "2.6.7", @@ -7041,19 +6598,9 @@ "node-releases": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "optional": true - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "optional": true + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "optional": true, + "peer": true }, "oas-kit-common": { "version": "1.0.8", @@ -7116,15 +6663,6 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "optional": true }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "optional": true, - "requires": { - "wrappy": "1" - } - }, "openapi-sampler": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.3.0.tgz", @@ -7141,32 +6679,6 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "optional": true }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "optional": true - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "optional": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "optional": true - } - } - }, "pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -7211,17 +6723,6 @@ "integrity": "sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g==", "optional": true }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "optional": true - }, "pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -7243,12 +6744,6 @@ "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "optional": true }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", - "optional": true - }, "prismjs": { "version": "1.27.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", @@ -7308,31 +6803,12 @@ } } }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "optional": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "optional": true }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "optional": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -7345,14 +6821,6 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "optional": true }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, "randomfill": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", @@ -7363,26 +6831,6 @@ "safe-buffer": "^5.1.0" } }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "optional": true - } - } - }, "react": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", @@ -7407,7 +6855,9 @@ "react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "optional": true, + "peer": true }, "react-tabs": { "version": "3.2.3", @@ -7457,15 +6907,6 @@ } } }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, "redoc": { "version": "2.0.0-rc.77", "resolved": "https://registry.npmjs.org/redoc/-/redoc-2.0.0-rc.77.tgz", @@ -7516,45 +6957,6 @@ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "optional": true }, - "registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", - "optional": true, - "requires": { - "rc": "1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "optional": true, - "requires": { - "rc": "^1.2.8" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "optional": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "optional": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "optional": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, "ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", @@ -7565,17 +6967,6 @@ "inherits": "^2.0.1" } }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "optional": true - }, "scheduler": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", @@ -7590,46 +6981,14 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "optional": true, + "peer": true, "requires": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "optional": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "optional": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "optional": true - } - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "requires": { - "randombytes": "^2.1.0" - } - }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -7706,12 +7065,6 @@ "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", "optional": true }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "optional": true - }, "slugify": { "version": "1.4.7", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.4.7.tgz", @@ -7721,12 +7074,15 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true }, "source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "optional": true, + "peer": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -7754,53 +7110,19 @@ "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "optional": true, "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "optional": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "optional": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "optional": true, - "requires": { - "ansi-regex": "^5.0.1" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" } }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "optional": true - }, "style-loader": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "optional": true + "optional": true, + "requires": {} }, "styled-components": { "version": "5.3.0", @@ -7820,15 +7142,6 @@ "supports-color": "^5.5.0" } }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "optional": true, - "requires": { - "has-flag": "^3.0.0" - } - }, "swagger2openapi": { "version": "7.0.8", "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", @@ -7851,12 +7164,16 @@ "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "optional": true, + "peer": true }, "terser": { "version": "5.15.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", + "optional": true, + "peer": true, "requires": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -7868,6 +7185,8 @@ "version": "5.3.6", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "optional": true, + "peer": true, "requires": { "@jridgewell/trace-mapping": "^0.3.14", "jest-worker": "^27.4.5", @@ -7891,27 +7210,6 @@ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", "optional": true }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "optional": true - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "optional": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -7924,133 +7222,12 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "optional": true }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "optional": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "optional": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, "uglify-js": { "version": "3.13.9", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.9.tgz", "integrity": "sha512-wZbyTQ1w6Y7fHdt8sJnHfSIuWeDgk6B5rCb4E/AM6QNNPbOMIZph21PW5dRB3h7Df0GszN+t7RuUH6sWK5bF0g==", "optional": true }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "optional": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "update-browserslist-db": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", - "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "optional": true, - "requires": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "optional": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "optional": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "optional": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "optional": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "optional": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "optional": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - } - } - }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -8069,15 +7246,6 @@ } } }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "optional": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, "url-template": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", @@ -8101,12 +7269,6 @@ } } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "optional": true - }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -8117,6 +7279,8 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "optional": true, + "peer": true, "requires": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -8132,6 +7296,8 @@ "version": "5.74.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "optional": true, + "peer": true, "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", @@ -8162,7 +7328,9 @@ "webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "optional": true, + "peer": true }, "whatwg-url": { "version": "5.0.0", @@ -8174,100 +7342,12 @@ "webidl-conversions": "^3.0.0" } }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "optional": true, - "requires": { - "string-width": "^4.0.0" - } - }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "optional": true }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "optional": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "optional": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "optional": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "optional": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "optional": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "optional": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "optional": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "optional": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "optional": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true - }, "yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", @@ -8320,6 +7400,24 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, + "registry-auth-token": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "optional": true, + "requires": { + "rc": "1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "optional": true, + "requires": { + "rc": "^1.2.8" + } + }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -8358,9 +7456,9 @@ }, "dependencies": { "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true } } @@ -8369,13 +7467,13 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "devOptional": true }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true + "devOptional": true }, "require-main-filename": { "version": "2.0.0", @@ -8400,6 +7498,15 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "optional": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, "restore-cursor": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", @@ -8461,7 +7568,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "devOptional": true }, "safe-regex-test": { "version": "1.0.0", @@ -8477,7 +7584,8 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "devOptional": true }, "sb-promise-queue": { "version": "2.1.0", @@ -8497,13 +7605,23 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "devOptional": true + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "optional": true, + "requires": { + "semver": "^6.3.0" + } }, "serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, + "devOptional": true, "requires": { "randombytes": "^2.1.0" } @@ -8550,7 +7668,7 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", - "dev": true + "devOptional": true }, "sinon": { "version": "7.5.0", @@ -8572,21 +7690,6 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -8689,6 +7792,15 @@ } } }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "devOptional": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, "string-template": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", @@ -8699,7 +7811,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, + "devOptional": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -8728,20 +7840,11 @@ "es-abstract": "^1.20.4" } }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "devOptional": true, "requires": { "ansi-regex": "^5.0.1" } @@ -8768,7 +7871,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, + "devOptional": true, "requires": { "has-flag": "^3.0.0" }, @@ -8777,7 +7880,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "devOptional": true } } }, @@ -8880,13 +7983,19 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true + "devOptional": true + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "optional": true }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, + "devOptional": true, "requires": { "is-number": "^7.0.0" } @@ -8954,7 +8063,8 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "devOptional": true }, "type-check": { "version": "0.4.0", @@ -9009,7 +8119,7 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, + "devOptional": true, "requires": { "is-typedarray": "^1.0.0" } @@ -9032,6 +8142,15 @@ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", "dev": true }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "optional": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -9042,12 +8161,45 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, + "devOptional": true, "requires": { "escalade": "^3.1.1", "picocolors": "^1.0.0" } }, + "update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "optional": true, + "requires": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "optional": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -9056,11 +8208,20 @@ "punycode": "^2.1.0" } }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "optional": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "devOptional": true }, "uuid": { "version": "3.4.0", @@ -9146,6 +8307,15 @@ "is-typed-array": "^1.1.10" } }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "optional": true, + "requires": { + "string-width": "^4.0.0" + } + }, "winston": { "version": "2.4.5", "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.5.tgz", @@ -9233,13 +8403,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "devOptional": true }, "write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, + "devOptional": true, "requires": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -9247,6 +8417,12 @@ "typedarray-to-buffer": "^3.1.5" } }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "optional": true + }, "xorshift": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/xorshift/-/xorshift-1.2.0.tgz", @@ -9263,13 +8439,13 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "devOptional": true }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "devOptional": true }, "yargs": { "version": "16.2.0", diff --git a/package.json b/package.json index 8df8b072..8287502c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "f5-declarative-onboarding", - "version": "1.36.1-1", + "version": "1.37.0-3", "description": "F5 Declarative Onboarding", "main": "index.js", "repository": { @@ -19,8 +19,8 @@ "author": "F5 Networks", "license": "Apache-2.0", "dependencies": { - "@f5devcentral/atg-shared-utilities": "^0.5.4", - "@f5devcentral/f5-cloud-libs": "^4.28.1", + "@f5devcentral/atg-shared-utilities": "^0.5.5", + "@f5devcentral/f5-cloud-libs": "^4.28.2", "@f5devcentral/f5-teem": "^1.5.0", "ajv": "6.12.6", "deep-diff": "^1.0.2", @@ -28,7 +28,7 @@ "uuid": "3.4.0" }, "devDependencies": { - "@f5devcentral/atg-shared-utilities-dev": "^0.2.11", + "@f5devcentral/atg-shared-utilities-dev": "^0.2.12", "@f5devcentral/eslint-config-f5-atg": "^0.1.8", "@stryker-mutator/core": "^6.3.1", "@stryker-mutator/mocha-runner": "^6.3.1", @@ -38,7 +38,7 @@ "coveralls": "^3.1.1", "eslint": "7.32.0", "json-schema-ref-parser": "^9.0.9", - "mkdirp": "^1.0.4", + "mkdirp": "^2.1.3", "mocha": "^10.2.0", "mocha-multi-reporters": "^1.5.1", "nyc": "^15.1.0", @@ -68,7 +68,7 @@ "extends": "@f5devcentral/eslint-config-f5-atg" }, "optionalDependencies": { - "node-ssh": "^13.0.0", + "node-ssh": "^13.0.1", "redoc-cli": "^0.13.20" } } diff --git a/public/index.html b/public/index.html index 89f45e78..91d4228f 100644 --- a/public/index.html +++ b/public/index.html @@ -75,7 +75,7 @@

example

}, "mySelfIp": { "class": "SelfIp", - "address": "1.2.3.4/24", + "address": "192.0.2.4/24", "vlan": "myVlan", "allowService": "all", "floating": true diff --git a/src/lib/ajvValidator.js b/src/lib/ajvValidator.js index 0584f99a..0b65c009 100644 --- a/src/lib/ajvValidator.js +++ b/src/lib/ajvValidator.js @@ -28,6 +28,7 @@ const analyticsSchema = require('../schema/latest/analytics.schema.json'); const authSchema = require('../schema/latest/auth.schema.json'); const definitionsSchema = require('../schema/latest/definitions.schema.json'); const gslbSchema = require('../schema/latest/gslb.schema.json'); +const securitySchema = require('../schema/latest/security.schema.json'); const customFormats = require('../schema/latest/formats'); @@ -54,6 +55,7 @@ class AjvValidator { .addSchema(analyticsSchema) .addSchema(authSchema) .addSchema(gslbSchema) + .addSchema(securitySchema) .addSchema(baseSchema) .addSchema(remoteSchema) .compile(doSchema); diff --git a/src/lib/configItems.json b/src/lib/configItems.json index 4087c6b2..f41a670d 100644 --- a/src/lib/configItems.json +++ b/src/lib/configItems.json @@ -1204,6 +1204,72 @@ ], "nameless": true }, + { + "path": "/tm/security/analytics/settings", + "schemaClass": "SecurityAnalytics", + "requiredModules": [{ "module": "afm" }], + "properties": [ + { + "id": "aclRules", + "transform": [ + { "id": "collectClientIp", "newId": "collectClientIpEnabled", "truth": "enabled", "falsehood": "disabled" }, + { "id": "collectClientPort", "newId": "collectClientPortEnabled", "truth": "enabled", "falsehood": "disabled" }, + { "id": "collectDestIp", "newId": "collectDestinationIpEnabled", "truth": "enabled", "falsehood": "disabled" }, + { "id": "collectDestPort", "newId": "collectDestinationPortEnabled", "truth": "enabled", "falsehood": "disabled" }, + { "id": "collectServerSideStats", "newId": "collectServerSideStatsEnabled", "truth": "enabled", "falsehood": "disabled" } + ] + }, + { "id": "collectAllDosStatistic", "newId": "collectAllDosStatsEnabled", "truth": "enabled", "falsehood": "disabled" }, + { "id": "collectedStatsExternalLogging", "newId": "collectedStatsExternalLoggingEnabled", "truth": "enabled", "falsehood": "disabled" }, + { "id": "collectedStatsInternalLogging", "newId": "collectedStatsInternalLoggingEnabled", "truth": "enabled", "falsehood": "disabled" }, + { + "id": "dns", + "transform": [ + { "id": "collectClientIp", "newId": "collectClientIpEnabled", "truth": "enabled", "falsehood": "disabled" }, + { "id": "collectDestinationIp", "newId": "collectDestinationIpEnabled", "truth": "enabled", "falsehood": "disabled" } + ] + }, + { "id": "dnsCollectStats", "newId": "collectDnsStatsEnabled", "truth": "enabled", "falsehood": "disabled" }, + { + "id": "dosL2L4", + "transform": [ + { "id": "collectClientIp", "newId": "collectClientIpEnabled", "truth": "enabled", "falsehood": "disabled" }, + { "id": "collectDestGeo", "newId": "collectDestinationGeoEnabled", "truth": "enabled", "falsehood": "disabled" } + ] + }, + { "id": "dosl3CollectStats", "newId": "collectDosL3StatsEnabled", "truth": "enabled", "falsehood": "disabled" }, + { "id": "fwAclCollectStats", "newId": "collectFirewallAclStatsEnabled", "truth": "enabled", "falsehood": "disabled" }, + { "id": "fwDropsCollectStats", "newId": "collectFirewallDropsStatsEnabled", "truth": "enabled", "falsehood": "disabled" }, + { "id": "ipReputationCollectStats", "newId": "collectIpReputationStatsEnabled", "truth": "enabled", "falsehood": "disabled" }, + { + "id": "l3L4Errors", + "transform": [ + { "id": "collectClientIp", "newId": "collectClientIpEnabled", "truth": "enabled", "falsehood": "disabled" }, + { "id": "collectDestIp", "newId": "collectDestinationIpEnabled", "truth": "enabled", "falsehood": "disabled" } + ] + }, + { "id": "publisher", "defaultWhenOmitted": "none" }, + { "id": "sipCollectStats", "newId": "collectSipStatsEnabled", "truth": "enabled", "falsehood": "disabled" }, + { "id": "smtpConfig", "defaultWhenOmitted": "none" }, + { + "id": "staleRules", + "newId": "collectStaleRulesEnabled", + "transformBooleanOrStringToObject": { + "itemKey": "collectStaleRulesEnabled", + "toKey": "collect" + }, + "transform": [ + { "id": "collect", "truth": "enabled", "falsehood": "disabled" } + ] + } + ], + "nameless": true, + "declaration": { + "customFunctions": [ + { "id": "remapStaleRules" } + ] + } + }, { "schemaClass": "License", "nameless": true, diff --git a/src/lib/declarationHandler.js b/src/lib/declarationHandler.js index 92b78670..a540497c 100644 --- a/src/lib/declarationHandler.js +++ b/src/lib/declarationHandler.js @@ -33,6 +33,7 @@ const ProvisionHandler = require('./provisionHandler'); const DeprovisionHandler = require('./deprovisionHandler'); const AuthHandler = require('./authHandler'); const GSLBHandler = require('./gslbHandler'); +const SecurityHandler = require('./securityHandler'); const TraceManager = require('./traceManager'); const RoutingAccessListValidator = require('./routingAccessListValidator'); const configItems = require('./configItems.json'); @@ -679,8 +680,8 @@ function applyRouteMapFixes(declaration) { * * Examples * - * source (0.0.0.0 or ::) with destination 1.1.1.1 sets source 0.0.0.0/0 and destination 10.10.10.10/32 - * source 1.1.1.1 with destination (0.0.0.0 or ::) sets source 10.10.10.10/32 and destination 0.0.0.0/0 + * source (0.0.0.0 or ::) with destination 192.0.2.1 sets source 0.0.0.0/0 and destination 192.0.2.10/32 + * source 192.0.2.1 with destination (0.0.0.0 or ::) sets source 192.0.2.10/32 and destination 0.0.0.0/0 * * source 2001:0db8:: with destination (0.0.0.0 or ::) sets source 2001:0db8::/128 and destination ::/0 * source (0.0.0.0 or ::) with destination 2001:0db8:: sets source ::/0 and destination 2001:0db8::/128 @@ -1286,6 +1287,7 @@ function makeUpdates(declaration, updateDeclaration, deleteDeclaration) { [DscHandler, updateDeclaration], [AnalyticsHandler, updateDeclaration], [GSLBHandler, updateDeclaration], + [SecurityHandler, updateDeclaration], [DeleteHandler, deleteDeclaration], [DeprovisionHandler, updateDeclaration] ]; diff --git a/src/lib/declarationParser.js b/src/lib/declarationParser.js index efa86d5d..87797350 100644 --- a/src/lib/declarationParser.js +++ b/src/lib/declarationParser.js @@ -47,7 +47,7 @@ const NAMELESS_CLASSES = ConfigManager.getNamelessClasses(configItems); * "myDns": { * "class": "DNS", * "nameServers": [ - * "1.2.3.4", + * "192.0.2.4", * "FE80:0000:0000:0000:0202:B3FF:FE1E:8329" * ], * "search": [ @@ -83,7 +83,7 @@ const NAMELESS_CLASSES = ConfigManager.getNamelessClasses(configItems); * "app1SelfIp": { * "class": "SelfIp", * "vlan": "app1Vlan", - * "address": "1.2.3.4/24" + * "address": "192.0.2.4/24" * } * } * } @@ -101,7 +101,7 @@ const NAMELESS_CLASSES = ConfigManager.getNamelessClasses(configItems); * }, * "DNS": { * "nameServers": [ - * "1.2.3.4", + * "192.0.2.4", * "FE80:0000:0000:0000:0202:B3FF:FE1E:8329" * ], * "search": [ @@ -141,7 +141,7 @@ const NAMELESS_CLASSES = ConfigManager.getNamelessClasses(configItems); * "app1SelfIp": { * "name": "app1SelfIp", * "vlan": "app1Vlan", - * "address": "1.2.3.4/24" + * "address": "192.0.2.4/24" * } * } * } diff --git a/src/lib/inspectHandler.js b/src/lib/inspectHandler.js index c2591429..dec104e4 100644 --- a/src/lib/inspectHandler.js +++ b/src/lib/inspectHandler.js @@ -424,6 +424,11 @@ const customFunctions = { }); return [configKey, configObject]; }, + // SecurityAnalytics + remapStaleRules: (configKey, configObject) => { + configObject.collectStaleRulesEnabled = configObject.collectStaleRulesEnabled.collect; + return [configKey, configObject]; + }, // Some items with schemaMerge are skipped in the general handling but // should be processed by processItem anyway remapItemWithSchemaMerge: (configKey, configObject) => [configKey, configObject] diff --git a/src/lib/parserUtil.js b/src/lib/parserUtil.js index 0f09f823..32cc2c23 100644 --- a/src/lib/parserUtil.js +++ b/src/lib/parserUtil.js @@ -172,6 +172,15 @@ function updateProperty(property, itemToUpdate, propertyName, declarationItem, i let dottedId = [property.id, trans.id].join('.'); let dottedNewId = [property.id, trans.newId || trans.id].join('.'); + if (typeof property.transformBooleanOrStringToObject !== 'undefined' + && typeof itemToUpdate[property.transformBooleanOrStringToObject.itemKey] !== 'undefined') { + const toKey = property.transformBooleanOrStringToObject.toKey; + itemToUpdate[property.id] = { + [toKey]: itemToUpdate[property.transformBooleanOrStringToObject.itemKey] + }; + delete itemToUpdate[property.transformBooleanOrStringToObject.itemKey]; + } + // In some cases, the declaration only supports one item of an array // and moves it up one or more levels of what is a named property in mcp. // For example, GSLBServer devices.addresses[0].translation in mcp is diff --git a/src/lib/securityHandler.js b/src/lib/securityHandler.js new file mode 100644 index 00000000..4583d230 --- /dev/null +++ b/src/lib/securityHandler.js @@ -0,0 +1,75 @@ +/** + * Copyright 2023 F5 Networks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const Logger = require('./logger'); +const PATHS = require('./sharedConstants').PATHS; + +/** + * Handles security parts of a declaration. + * + * @class + */ +class SecurityHandler { + /** + * Constructor + * + * @param {Object} declaration - Parsed declaration. + * @param {Object} bigIp - BigIp object. + * @param {EventEmitter} - DO event emitter. + * @param {State} - The doState. + */ + constructor(declaration, bigIp, eventEmitter, state) { + this.declaration = declaration; + this.bigIp = bigIp; + this.eventEmitter = eventEmitter; + this.state = state; + this.logger = new Logger(module, (state || {}).id); + } + + /** + * Starts processing. + * + * @returns {Promise} A promise which is resolved when processing is complete + * or rejected if an error occurs. + */ + process() { + this.logger.fine('Processing security declaration.'); + + return Promise.resolve() + .then(() => { + this.logger.fine('Checking SecurityAnalytics'); + return handleSecurityAnalytics.call(this); + }) + .catch((err) => { + this.logger.severe(`Error processing security declaration: ${err.message}`); + return Promise.reject(err); + }); + } +} + +function handleSecurityAnalytics() { + if (this.declaration.Common.SecurityAnalytics) { + return this.bigIp.modify( + PATHS.SecurityAnalytics, + this.declaration.Common.SecurityAnalytics + ); + } + return Promise.resolve(); +} + +module.exports = SecurityHandler; diff --git a/src/lib/sharedConstants.js b/src/lib/sharedConstants.js index 2dba6d7e..c33bd7a9 100644 --- a/src/lib/sharedConstants.js +++ b/src/lib/sharedConstants.js @@ -70,6 +70,7 @@ module.exports = { RoutingAsPath: '/tm/net/routing/as-path', RoutingBGP: '/tm/net/routing/bgp', RoutingPrefixList: '/tm/net/routing/prefix-list', + SecurityAnalytics: '/tm/security/analytics/settings', SelfIp: '/tm/net/self', SnmpAgent: '/tm/sys/snmp', SnmpCommunity: '/tm/sys/snmp/communities', diff --git a/src/lib/systemHandler.js b/src/lib/systemHandler.js index 10eccd78..f4910f45 100644 --- a/src/lib/systemHandler.js +++ b/src/lib/systemHandler.js @@ -972,7 +972,7 @@ function handleSnmpUsers() { const user = JSON.parse(JSON.stringify(snmpUser)); if (user.authPassword) { - user.securityLevel = user.privacyPassword ? 'auth-privacy' : 'auth-no-privacy'; + user.securityLevel = user.privacyPassword ? 'auth-privacy' : 'auth-no-privacy'; // #gitleaks:allow } else { user.securityLevel = 'no-auth-no-privacy'; } diff --git a/src/schema/1.10.0/base.schema.json b/src/schema/1.10.0/base.schema.json index 06562e8c..2b7738d3 100644 --- a/src/schema/1.10.0/base.schema.json +++ b/src/schema/1.10.0/base.schema.json @@ -58,7 +58,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.10.0/remote.schema.json b/src/schema/1.10.0/remote.schema.json index d2fb38e1..a0c6395c 100644 --- a/src/schema/1.10.0/remote.schema.json +++ b/src/schema/1.10.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.11.0/base.schema.json b/src/schema/1.11.0/base.schema.json index 5c8ea606..d33b48b1 100644 --- a/src/schema/1.11.0/base.schema.json +++ b/src/schema/1.11.0/base.schema.json @@ -58,7 +58,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.11.0/remote.schema.json b/src/schema/1.11.0/remote.schema.json index d2fb38e1..a0c6395c 100644 --- a/src/schema/1.11.0/remote.schema.json +++ b/src/schema/1.11.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.12.0/base.schema.json b/src/schema/1.12.0/base.schema.json index 23cb8045..2d82854d 100644 --- a/src/schema/1.12.0/base.schema.json +++ b/src/schema/1.12.0/base.schema.json @@ -76,7 +76,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.12.0/remote.schema.json b/src/schema/1.12.0/remote.schema.json index d2fb38e1..a0c6395c 100644 --- a/src/schema/1.12.0/remote.schema.json +++ b/src/schema/1.12.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.13.0/base.schema.json b/src/schema/1.13.0/base.schema.json index 29bff544..e6cf9e2b 100644 --- a/src/schema/1.13.0/base.schema.json +++ b/src/schema/1.13.0/base.schema.json @@ -77,7 +77,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.13.0/remote.schema.json b/src/schema/1.13.0/remote.schema.json index d2fb38e1..a0c6395c 100644 --- a/src/schema/1.13.0/remote.schema.json +++ b/src/schema/1.13.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.14.0/base.schema.json b/src/schema/1.14.0/base.schema.json index e56047fe..04818257 100644 --- a/src/schema/1.14.0/base.schema.json +++ b/src/schema/1.14.0/base.schema.json @@ -78,7 +78,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.14.0/remote.schema.json b/src/schema/1.14.0/remote.schema.json index d2fb38e1..a0c6395c 100644 --- a/src/schema/1.14.0/remote.schema.json +++ b/src/schema/1.14.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.15.0/base.schema.json b/src/schema/1.15.0/base.schema.json index fb6b6c13..2817510b 100644 --- a/src/schema/1.15.0/base.schema.json +++ b/src/schema/1.15.0/base.schema.json @@ -79,7 +79,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.15.0/remote.schema.json b/src/schema/1.15.0/remote.schema.json index d2fb38e1..a0c6395c 100644 --- a/src/schema/1.15.0/remote.schema.json +++ b/src/schema/1.15.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.16.0/base.schema.json b/src/schema/1.16.0/base.schema.json index 02507593..1945e5c3 100644 --- a/src/schema/1.16.0/base.schema.json +++ b/src/schema/1.16.0/base.schema.json @@ -80,7 +80,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.16.0/remote.schema.json b/src/schema/1.16.0/remote.schema.json index d2fb38e1..a0c6395c 100644 --- a/src/schema/1.16.0/remote.schema.json +++ b/src/schema/1.16.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.17.0/base.schema.json b/src/schema/1.17.0/base.schema.json index 60913079..560aabb0 100644 --- a/src/schema/1.17.0/base.schema.json +++ b/src/schema/1.17.0/base.schema.json @@ -81,7 +81,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.17.0/remote.schema.json b/src/schema/1.17.0/remote.schema.json index d2fb38e1..a0c6395c 100644 --- a/src/schema/1.17.0/remote.schema.json +++ b/src/schema/1.17.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.18.0/base.schema.json b/src/schema/1.18.0/base.schema.json index 9dfc8330..548edde8 100644 --- a/src/schema/1.18.0/base.schema.json +++ b/src/schema/1.18.0/base.schema.json @@ -82,7 +82,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.18.0/remote.schema.json b/src/schema/1.18.0/remote.schema.json index d2fb38e1..a0c6395c 100644 --- a/src/schema/1.18.0/remote.schema.json +++ b/src/schema/1.18.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.19.0/base.schema.json b/src/schema/1.19.0/base.schema.json index 3250be71..2c332eea 100644 --- a/src/schema/1.19.0/base.schema.json +++ b/src/schema/1.19.0/base.schema.json @@ -83,7 +83,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.19.0/remote.schema.json b/src/schema/1.19.0/remote.schema.json index d2fb38e1..a0c6395c 100644 --- a/src/schema/1.19.0/remote.schema.json +++ b/src/schema/1.19.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.2.0/base.schema.json b/src/schema/1.2.0/base.schema.json index f81ca489..af54eba1 100644 --- a/src/schema/1.2.0/base.schema.json +++ b/src/schema/1.2.0/base.schema.json @@ -45,7 +45,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.2.0/remote.schema.json b/src/schema/1.2.0/remote.schema.json index ba783d34..c3989286 100644 --- a/src/schema/1.2.0/remote.schema.json +++ b/src/schema/1.2.0/remote.schema.json @@ -45,7 +45,7 @@ ] }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.20.0/base.schema.json b/src/schema/1.20.0/base.schema.json index 8c65ac4a..c6bd481a 100644 --- a/src/schema/1.20.0/base.schema.json +++ b/src/schema/1.20.0/base.schema.json @@ -84,7 +84,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.20.0/remote.schema.json b/src/schema/1.20.0/remote.schema.json index 932f7a29..5c7fecc5 100644 --- a/src/schema/1.20.0/remote.schema.json +++ b/src/schema/1.20.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.21.0/base.schema.json b/src/schema/1.21.0/base.schema.json index 7e6fd729..a6382c9b 100644 --- a/src/schema/1.21.0/base.schema.json +++ b/src/schema/1.21.0/base.schema.json @@ -85,7 +85,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.21.0/remote.schema.json b/src/schema/1.21.0/remote.schema.json index 932f7a29..5c7fecc5 100644 --- a/src/schema/1.21.0/remote.schema.json +++ b/src/schema/1.21.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.21.1/base.schema.json b/src/schema/1.21.1/base.schema.json index 7e6fd729..a6382c9b 100644 --- a/src/schema/1.21.1/base.schema.json +++ b/src/schema/1.21.1/base.schema.json @@ -85,7 +85,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.21.1/remote.schema.json b/src/schema/1.21.1/remote.schema.json index 932f7a29..5c7fecc5 100644 --- a/src/schema/1.21.1/remote.schema.json +++ b/src/schema/1.21.1/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.22.0/base.schema.json b/src/schema/1.22.0/base.schema.json index 9dc4e904..1293213e 100644 --- a/src/schema/1.22.0/base.schema.json +++ b/src/schema/1.22.0/base.schema.json @@ -86,7 +86,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.22.0/remote.schema.json b/src/schema/1.22.0/remote.schema.json index 932f7a29..5c7fecc5 100644 --- a/src/schema/1.22.0/remote.schema.json +++ b/src/schema/1.22.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.23.0/base.schema.json b/src/schema/1.23.0/base.schema.json index d110be92..e231cc49 100644 --- a/src/schema/1.23.0/base.schema.json +++ b/src/schema/1.23.0/base.schema.json @@ -87,7 +87,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.23.0/remote.schema.json b/src/schema/1.23.0/remote.schema.json index 932f7a29..5c7fecc5 100644 --- a/src/schema/1.23.0/remote.schema.json +++ b/src/schema/1.23.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.24.0/base.schema.json b/src/schema/1.24.0/base.schema.json index 90c0b5b5..fa6c93f4 100644 --- a/src/schema/1.24.0/base.schema.json +++ b/src/schema/1.24.0/base.schema.json @@ -88,7 +88,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.24.0/remote.schema.json b/src/schema/1.24.0/remote.schema.json index 932f7a29..5c7fecc5 100644 --- a/src/schema/1.24.0/remote.schema.json +++ b/src/schema/1.24.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.25.0/base.schema.json b/src/schema/1.25.0/base.schema.json index 3d24995d..c2d509f4 100644 --- a/src/schema/1.25.0/base.schema.json +++ b/src/schema/1.25.0/base.schema.json @@ -89,7 +89,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.25.0/remote.schema.json b/src/schema/1.25.0/remote.schema.json index 932f7a29..5c7fecc5 100644 --- a/src/schema/1.25.0/remote.schema.json +++ b/src/schema/1.25.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.26.0/base.schema.json b/src/schema/1.26.0/base.schema.json index fa781bc5..3c0cf342 100644 --- a/src/schema/1.26.0/base.schema.json +++ b/src/schema/1.26.0/base.schema.json @@ -90,7 +90,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.26.0/remote.schema.json b/src/schema/1.26.0/remote.schema.json index 932f7a29..5c7fecc5 100644 --- a/src/schema/1.26.0/remote.schema.json +++ b/src/schema/1.26.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.27.0/base.schema.json b/src/schema/1.27.0/base.schema.json index 7b4f04ed..79498398 100644 --- a/src/schema/1.27.0/base.schema.json +++ b/src/schema/1.27.0/base.schema.json @@ -85,7 +85,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.27.0/remote.schema.json b/src/schema/1.27.0/remote.schema.json index 932f7a29..5c7fecc5 100644 --- a/src/schema/1.27.0/remote.schema.json +++ b/src/schema/1.27.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.27.1/base.schema.json b/src/schema/1.27.1/base.schema.json index 7b4f04ed..79498398 100644 --- a/src/schema/1.27.1/base.schema.json +++ b/src/schema/1.27.1/base.schema.json @@ -85,7 +85,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.27.1/remote.schema.json b/src/schema/1.27.1/remote.schema.json index 932f7a29..5c7fecc5 100644 --- a/src/schema/1.27.1/remote.schema.json +++ b/src/schema/1.27.1/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.28.0/base.schema.json b/src/schema/1.28.0/base.schema.json index 2344aab5..081a76fe 100644 --- a/src/schema/1.28.0/base.schema.json +++ b/src/schema/1.28.0/base.schema.json @@ -86,7 +86,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.28.0/remote.schema.json b/src/schema/1.28.0/remote.schema.json index e2348fba..e7a08765 100644 --- a/src/schema/1.28.0/remote.schema.json +++ b/src/schema/1.28.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.29.0/base.schema.json b/src/schema/1.29.0/base.schema.json index 0fad98ac..02e35ba7 100644 --- a/src/schema/1.29.0/base.schema.json +++ b/src/schema/1.29.0/base.schema.json @@ -87,7 +87,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.29.0/remote.schema.json b/src/schema/1.29.0/remote.schema.json index e2348fba..e7a08765 100644 --- a/src/schema/1.29.0/remote.schema.json +++ b/src/schema/1.29.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.3.0/base.schema.json b/src/schema/1.3.0/base.schema.json index 9c04ddaa..79b340dc 100644 --- a/src/schema/1.3.0/base.schema.json +++ b/src/schema/1.3.0/base.schema.json @@ -53,7 +53,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.3.0/remote.schema.json b/src/schema/1.3.0/remote.schema.json index ba783d34..c3989286 100644 --- a/src/schema/1.3.0/remote.schema.json +++ b/src/schema/1.3.0/remote.schema.json @@ -45,7 +45,7 @@ ] }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.3.1/base.schema.json b/src/schema/1.3.1/base.schema.json index 9c04ddaa..79b340dc 100644 --- a/src/schema/1.3.1/base.schema.json +++ b/src/schema/1.3.1/base.schema.json @@ -53,7 +53,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.3.1/remote.schema.json b/src/schema/1.3.1/remote.schema.json index ba783d34..c3989286 100644 --- a/src/schema/1.3.1/remote.schema.json +++ b/src/schema/1.3.1/remote.schema.json @@ -45,7 +45,7 @@ ] }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.30.0/base.schema.json b/src/schema/1.30.0/base.schema.json index 0ae2a399..8b0d7fd1 100644 --- a/src/schema/1.30.0/base.schema.json +++ b/src/schema/1.30.0/base.schema.json @@ -88,7 +88,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.30.0/remote.schema.json b/src/schema/1.30.0/remote.schema.json index e2348fba..e7a08765 100644 --- a/src/schema/1.30.0/remote.schema.json +++ b/src/schema/1.30.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.31.0/base.schema.json b/src/schema/1.31.0/base.schema.json index 3f3d25d3..8f862d4a 100644 --- a/src/schema/1.31.0/base.schema.json +++ b/src/schema/1.31.0/base.schema.json @@ -89,7 +89,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.31.0/remote.schema.json b/src/schema/1.31.0/remote.schema.json index e2348fba..e7a08765 100644 --- a/src/schema/1.31.0/remote.schema.json +++ b/src/schema/1.31.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.33.0/base.schema.json b/src/schema/1.33.0/base.schema.json index b511b95e..aa474344 100644 --- a/src/schema/1.33.0/base.schema.json +++ b/src/schema/1.33.0/base.schema.json @@ -91,7 +91,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.33.0/remote.schema.json b/src/schema/1.33.0/remote.schema.json index cc4660d3..37316c82 100644 --- a/src/schema/1.33.0/remote.schema.json +++ b/src/schema/1.33.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.34.0/base.schema.json b/src/schema/1.34.0/base.schema.json index 61c8d84d..3f2091dc 100644 --- a/src/schema/1.34.0/base.schema.json +++ b/src/schema/1.34.0/base.schema.json @@ -92,7 +92,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.34.0/remote.schema.json b/src/schema/1.34.0/remote.schema.json index cc4660d3..37316c82 100644 --- a/src/schema/1.34.0/remote.schema.json +++ b/src/schema/1.34.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.35.0/base.schema.json b/src/schema/1.35.0/base.schema.json index e25d62ef..5173de7a 100644 --- a/src/schema/1.35.0/base.schema.json +++ b/src/schema/1.35.0/base.schema.json @@ -93,7 +93,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.35.0/remote.schema.json b/src/schema/1.35.0/remote.schema.json index cc4660d3..37316c82 100644 --- a/src/schema/1.35.0/remote.schema.json +++ b/src/schema/1.35.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.36.0/base.schema.json b/src/schema/1.36.0/base.schema.json index fb21ca3b..2d064aec 100644 --- a/src/schema/1.36.0/base.schema.json +++ b/src/schema/1.36.0/base.schema.json @@ -94,7 +94,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.36.0/remote.schema.json b/src/schema/1.36.0/remote.schema.json index cc4660d3..37316c82 100644 --- a/src/schema/1.36.0/remote.schema.json +++ b/src/schema/1.36.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.37.0/analytics.schema.json b/src/schema/1.37.0/analytics.schema.json new file mode 100644 index 00000000..517283a5 --- /dev/null +++ b/src/schema/1.37.0/analytics.schema.json @@ -0,0 +1,139 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/analytics.schema.json", + "title": "F5 BIG-IP Declarative Onboarding Global Analytics declaration", + "description": "Global analytics properties for onboarding a BIG-IP.", + "if": { + "required": ["class"], + "properties": { "class": { "const": "Analytics" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains global analytics configuration", + "type": "string", + "const": "Analytics" + }, + "debugEnabled": { + "description": "Enable debug mode. If debug mode is disabled, internal statistics are collected only if interval is set to the default value (300 seconds)", + "type": "boolean", + "default": false + }, + "interval": { + "description": "Analytics data collection interval in seconds. If this interval is different from the default value (300 seconds), internal statistics are not collected unless debugEnabled is set to true. Minimum interval is 20 seconds, maximum interval is 300 seconds.", + "type": "integer", + "minimum": 20, + "maximum": 300, + "default": 300 + }, + "sourceId": { + "description": "Unique value to signify the source of data", + "type": "string" + }, + "tenantId": { + "description": "Unique id for the tenant using the analytics backend system", + "type": "string" + }, + "offboxProtocol": { + "description": "Protocol for communication with offbox analytics application", + "type": "string", + "enum": ["https", "tcp"] + }, + "offboxTcpAddresses": { + "description": "Server IP addresses used only if the 'tcp/https' protocol is chosen", + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "anyOf": [ + { "format": "ipv4" }, + { "format": "ipv6"}, + { "format": "json-pointer" } + ] + } + }, + "offboxTcpPort": { + "description": "Server TCP port for the server IP addresses used only if the 'tcp' protocol is chosen", + "type": "number", + "minimum": 0, + "maximum": 65535 + }, + "offboxEnabled": { + "description": "Enables all communication with the offbox application on the global level", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "if": { + "properties": { + "offboxEnabled" : { "const": true } + }, + "required": ["offboxEnabled"] + }, + "then": { + "required": ["offboxProtocol"] + } + }, + { + "if": { + "properties": { + "offboxTcpPort": { + "minimum": 1 + } + }, + "required": ["offboxTcpPort"] + }, + "then": { + "required": ["offboxTcpAddresses", "offboxProtocol"] + } + }, + { + "if": { + "properties": { + "offboxTcpAddresses": { + "minItems": 1 + } + }, + "required": ["offboxTcpAddresses"] + }, + "then": { + "required": ["offboxTcpPort", "offboxProtocol"] + } + }, + { + "if": { + "properties": { + "offboxProtocol": { "enum": ["tcp", "https"] } + }, + "required": ["offboxProtocol"] + }, + "then": { + "properties": { + "offboxTcpPort": { + "minimum": 1 + }, + "offboxTcpAddresses": { + "minItems": 1 + } + }, + "required": ["offboxTcpAddresses", "offboxTcpPort"] + } + }, + { + "if": { + "properties": { + "offboxProtocol": { "enum": ["https"] } + }, + "required": ["offboxProtocol"] + }, + "then": { + "required": ["sourceId"] + } + } + ], + "additionalProperties": false + } +} diff --git a/src/schema/1.37.0/auth.schema.json b/src/schema/1.37.0/auth.schema.json new file mode 100644 index 00000000..b8d62b94 --- /dev/null +++ b/src/schema/1.37.0/auth.schema.json @@ -0,0 +1,704 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/auth.schema.json", + "title": "F5 BIG-IP Declarative Onboarding Authentication declaration", + "description": "Authentication properties for onboarding a BIG-IP.", + "allOf": [ + { + "if": { + "required": ["class"], + "type": "object", + "properties": { "class": { "const": "RemoteAuthRole" } } + }, + "then": { + "oneOf": [ + { "$ref": "#/definitions/remoteAuthRole" } + ] + } + }, + { + "if": { + "required": ["class"], + "type": "object", + "properties": { "class": { "const": "Authentication" } } + }, + "then": { + "oneOf": [ + { "$ref": "#/definitions/remoteInfo" } + ] + } + }, + { + "if": { + "required": ["class"], + "type": "object", + "properties": { "class": { "const": "PasswordPolicy" } } + }, + "then": { + "$ref": "#/definitions/passwordPolicy" + } + } + ], + "definitions": { + "passwordPolicy": { + "required": ["class"], + "type": "object", + "description": "Password policy info.", + "properties": { + "class": { + "description": "Indicates that this property contains password policy configuration.", + "type": "string", + "const": "PasswordPolicy" + }, + "expirationWarningDays": { + "description": "Specifies the number of days prior to password expiration that the system sends a warning message to users.", + "type": "integer", + "minimum": 1, + "maximum": 255, + "default": 7 + }, + "minLength": { + "description": "Specifies the minimum number of characters in a valid password.", + "type": "integer", + "minimum": 6, + "maximum": 255, + "default": 6 + }, + "minDurationDays": { + "description": "Specifies the minimum number of days a password is valid.", + "type": "integer", + "minimum": 0, + "maximum": 255, + "default": 0 + }, + "maxDurationDays": { + "description": "Specifies the maximum number of days a password is valid.", + "type": "integer", + "minimum": 0, + "maximum": 99999, + "default": 99999 + }, + "lockoutDurationSeconds": { + "description": "Specifies number of seconds in which to automatically reinstate users after being locked out. 0 means users must be manually reinstated. This is for BIG-IP 15.1+", + "type": "integer", + "minimum": 0, + "maximum": 999999, + "default": 0 + }, + "maxLoginFailures": { + "description": "Specifies the number of consecutive unsuccessful login attempts that the system allows before locking out the user. 0 means disabled.", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "passwordMemory": { + "description": "Specifies the number of former passwords that the BIG-IP system retains to prevent the user from reusing a recent password.", + "type": "integer", + "minimum": 0, + "maximum": 127, + "default": 0 + }, + "policyEnforcementEnabled": { + "description": "Enables or disables the password policy.", + "type": "boolean", + "default": true + }, + "requiredUppercase": { + "description": "Specifies the number of uppercase alpha characters that must be present in a password for the password to be valid.", + "type": "integer", + "minimum": 0, + "maximum": 127, + "default": 0 + }, + "requiredLowercase": { + "description": "Specifies the number of lowercase alpha characters that must be present in a password for the password to be valid.", + "type": "integer", + "minimum": 0, + "maximum": 127, + "default": 0 + }, + "requiredNumeric": { + "description": "Specifies the number of numeric characters that must be present in a password for the password to be valid.", + "type": "integer", + "minimum": 0, + "maximum": 127, + "default": 0 + }, + "requiredSpecial": { + "description": "Specifies the number of special characters that must be present in a password for the password to be valid.", + "type": "integer", + "minimum": 0, + "maximum": 127, + "default": 0 + } + }, + "additionalProperties": false + }, + "remoteInfo": { + "required": ["class", "enabledSourceType"], + "type": "object", + "description": "Remote authentication info.", + "properties": { + "class": { + "description": "Indicates that this property contains authentication configuration.", + "type": "string", + "const": "Authentication" + }, + "enabledSourceType": { + "description": "Type of remote authentication source to enable for the system.", + "type": "string", + "enum": ["radius", "local", "tacacs", "ldap", "activeDirectory"], + "default": "local" + }, + "remoteUsersDefaults": { + "description": "The default values that the BIG-IP system applies to any user account that is not part of a remotely-stored user group.", + "type": "object", + "required": [ "partitionAccess", "terminalAccess", "role" ], + "properties": { + "role": { + "description": "Role for the remote users.", + "type": "string", + "enum": [ + "acceleration-policy-editor", + "admin", + "application-editor", + "auditor", + "certificate-manager", + "firewall-manager", + "fraud-protection-manager", + "guest", + "irule-manager", + "manager", + "no-access", + "operator", + "resource-admin", + "user-manager", + "web-application-security-administrator", + "web-application-security-editor" + ], + "default": "no-access" + }, + "partitionAccess": { + "description": "Default accessible partitions for remote users.", + "type": "string", + "enum": ["Common", "all"], + "default": "all" + }, + "terminalAccess": { + "description": "Default terminal access for remote users.", + "type": "string", + "enum": ["tmsh", "disabled"], + "default": "disabled" + } + }, + "additionalProperties": false + }, + "fallback": { + "description": "Specifies that the system uses the Local authentication method if the remote authentication method is not available.", + "type": "boolean", + "default": false + }, + "radius": { + "$ref": "#/definitions/radius" + }, + "tacacs": { + "$ref": "#/definitions/tacacs" + }, + "ldap": { + "$ref": "#/definitions/ldap" + } + }, + "allOf": [ + { + "if": { + "required": ["enabledSourceType"], + "properties": { "enabledSourceType": { "const": "radius"} } + }, + "then": { "required": ["radius"] } + }, + { + "if": { + "required": ["enabledSourceType"], + "properties": { "enabledSourceType": { "const": "tacacs"} } + }, + "then": { "required": ["tacacs"] } + }, + { + "if": { + "required": ["enabledSourceType"], + "properties": { "enabledSourceType": { "oneOf": [ + { "const": "ldap" }, + { "const": "activeDirectory" } + ] } } + }, + "then": { "required": ["ldap"] } + } + ], + "additionalProperties": false + }, + "variableString": { + "description": "Variable string value. Should always start with %.", + "type": "string", + "pattern": "^%.+" + }, + "remoteAuthRole": { + "description": "Creates a file used by LDAP, Active Directory(r), RADIUS, or TACACS+ server to determine specific access rights.", + "type": "object", + "required": [ "class", "attribute", "lineOrder", "userPartition" ], + "properties": { + "class": { + "description": "Indicates that this property contains RemoteAuthRole configuration.", + "type": "string", + "const": "RemoteAuthRole" + }, + "attribute": { + "description": "Specifies an attribute-value pair that an authentication server supplies to the BIG-IP system to match against entries in /config/bigip/auth/remoterole. The specified pair typically identifies users with access rights in common. This option is required.", + "type": "string" + }, + "console": { + "description": "Specifes if the remotely-authenticated users have tmsh console access or not. Accepted values are 'disabled' and 'tmsh'.", + "oneOf": [ + { + "type": "string", + "enum": [ + "disabled", + "tmsh" + ] + }, + { + "$ref": "#/definitions/variableString" + } + ], + "default": "disabled" + }, + "remoteAccess": { + "description": "Enables the specified group of remotely-authenticated users, remote access.", + "type": "boolean", + "default": false + }, + "lineOrder": { + "description": "The BIG-IP only allows one role per user for each partition/tenant. Because some remote servers allow multiple user roles, the BIG-IP uses the lineOrder parameter to choose one of the conflicting roles for the user at login time. In these cases, the system chooses the role with the lowest line-order number. See line order in the BIG-IP documentation for more information and examples.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295 + }, + "role": { + "description": "Specifies the role that you want to grant to the specified group of remotely-authenticated users.", + "oneOf": [ + { + "type": "string", + "enum": [ + "admin", + "application-editor", + "auditor", + "certificate-manager", + "firewall-manager", + "fraud-protection-manager", + "guest", + "irule-manager", + "manager", + "no-access", + "operator", + "resource-admin", + "user-manager", + "web-application-security-administrator", + "web-application-security-editor" + ] + }, + { + "$ref": "#/definitions/variableString" + } + ], + "default": "no-access" + }, + "userPartition": { + "description": "Specifies the BIG-IP partition to which you are assigning access to the specified group of remotely-authenticated users. The default value is Common. This option is required.", + "oneOf": [ + { + "type": "string", + "enum": [ + "all", + "Common" + ] + }, + { + "$ref": "#/definitions/variableString" + } + ], + "default": "Common" + } + }, + "additionalProperties": false + }, + "radius": { + "description": "Remote RADIUS authentication info.", + "type": "object", + "required": [ "servers"], + "properties": { + "serviceType": { + "description": "Type of service used for the RADIUS server.", + "type": "string", + "enum": [ + "administrative", + "authenticate-only", + "call-check", + "callback-administrative", + "callback-framed", + "callback-login", + "callback-nas-prompt", + "default", + "framed", + "login", + "nas-prompt", + "outbound" + ], + "default": "default" + }, + "servers": { + "description": "RADIUS servers settings", + "required": ["primary"], + "properties": { + "primary": { + "description": "Server connection settings for the primary RADIUS server", + "allOf": [ {"$ref": "#/definitions/radiusServer"} ] + }, + "secondary": { + "description": "Server connection settings for the secondary RADIUS server (optional)", + "allOf": [ {"$ref": "#/definitions/radiusServer"} ] + } + }, + "additionalProperties": false + } + } + }, + "radiusServer": { + "description": "RADIUS server connection settings.", + "type": "object", + "required": [ "server", "secret" ], + "properties": { + "server": { + "type": "string", + "description": "The RADIUS server IP address or hostname.", + "anyOf": [ + { "format": "ipv4" }, + { "format": "ipv6" }, + { "format": "hostname" } + ] + }, + "port": { + "type": "integer", + "description": "Port to use when connecting to the RADIUS server.", + "default": 1812 + }, + "secret": { + "description": "Password to use when connection to the RADIUS server.", + "type": "string" + } + } + }, + "tacacs": { + "description": "TACACS+ authentication info", + "type": "object", + "required": [ "secret", "servers", "service" ], + "properties": { + "accounting": { + "description": "Specifies how the system returns accounting information, such as which services users access and how much network resources they consume, to the TACACS+ server. The default setting is Send to first available server.", + "type": "string", + "enum": [ + "send-to-all-servers", + "send-to-first-server" + ], + "default": "send-to-first-server" + }, + "authentication": { + "description": "Specifies the process the system employs when sending authentication requests. The default is Authenticate to first server.", + "type": "string", + "enum": [ + "use-all-servers", + "use-first-server" + ], + "default": "use-first-server" + }, + "debug": { + "description": "Specifies whether to log Syslog debugging information at the LOG_DEBUG level. We do not recommend enabling this setting for normal use. The default is Disabled.", + "type": "boolean", + "default": false + }, + "encryption": { + "description": "Specifies whether to use encryption of TACACS+ packets. The default is Enabled.", + "type": "boolean", + "default": true + }, + "protocol": { + "description": "Specifies the protocol associated with the value specified in Service Name, which is a subset of the associated service being used for client authorization or system accounting. You can use following values: lcp, ip, ipx, atalk, vines, lat, xremote, tn3270, telnet, rlogin, pad, vpdn, ftp, http, deccp, osicp, and unknown. Note that the majority of TACACS+ implementations are of protocol type ip, so try that first.", + "type": "string", + "enum": [ + "lcp", + "ip", + "ipx", + "atalk", + "vines", + "lat", + "xremote", + "tn3270", + "telnet", + "rlogin", + "pad", + "vpdn", + "ftp", + "http", + "deccp", + "osicp", + "unknown" + ] + }, + "secret": { + "description": "Type the secret key used to encrypt and decrypt packets sent or received from the server. Do not use the pound sign ( # ) in the secret for TACACS+ servers.", + "type": "string" + }, + "servers": { + "description": "Specifies a list of the IPv4 addresses for servers using the Terminal Access Controller Access System (TACACS)+ protocol with which the system communicates to obtain authorization data. For each address, an alternate TCP port number may be optionally specified by entering the address in the format address:port. If no port number is specified, the default port 49 is used.", + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "service": { + "description": "Specifies the name of the service that the user is requesting to be authorized to use. Identifying what the user is asking to be authorized for, enables the TACACS+ server to behave differently for different types of authorization requests. You can use following values: slip, ppp, arap, shell, tty-daemon, connection, system, and firewall. Specifying this setting is required. Note that the majority of TACACS+ implementations are of service type ppp, so try that first.", + "type": "string", + "enum": [ + "slip", + "ppp", + "arap", + "shell", + "tty-daemon", + "connection", + "system", + "firewall" + ] + } + } + }, + "ldap": { + "description": "Remote LDAP authentication info", + "type": "object", + "required": ["servers"], + "properties": { + "bindDn": { + "description": "Distinguished name of the server account. If server is a Microsoft Windows Active Directory server, the name must be an email address", + "type": "string" + }, + "bindPassword": { + "description": "Password for the server account", + "type": "string" + }, + "bindTimeout": { + "description": "Timeout limit in seconds to bind to remote authentication server", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 30 + }, + "checkBindPassword": { + "description": "Confirms the password for the server account", + "type": "boolean", + "default": false + }, + "checkRemoteRole": { + "description": "Verifies a user's group membership based on the remote-role definition, formatted as *member*of=\"group-dn\"", + "type": "boolean", + "default": false + }, + "filter": { + "description": "Filter used for authorizing client traffic", + "type": "string" + }, + "groupDn": { + "description": "Group distinguished name for authorizing client traffic", + "type": "string" + }, + "groupMemberAttribute": { + "description": "Group member attribute for authorizing client traffic", + "type": "string" + }, + "idleTimeout": { + "description": "Connection timeout limit in seconds", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 3600 + }, + "ignoreAuthInfoUnavailable": { + "description": "Ignores authentication information if not available", + "type": "boolean", + "default": false + }, + "ignoreUnknownUser": { + "description": "Ignores a user that is unknown", + "type": "boolean", + "default": false + }, + "loginAttribute": { + "description": "Logon attribute. If server is a Microsoft Windows Active Directory server, the value must be the account name \"samaccountname\"", + "type": "string" + }, + "port": { + "description": "Port number for the LDAP service", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 389 + }, + "referrals": { + "description": "Specifies whether automatic referral chasing should be enabled. This is for BIG-IP 15.1+", + "type": "boolean", + "default": true + }, + "searchScope": { + "description": "Level of remote server's directory to search for user authentication, either base object, one level, or subtree", + "type": "string", + "enum": ["base", "one", "sub"], + "default": "sub" + }, + "searchBaseDn": { + "description": "Search base distinguished name", + "type": "string" + }, + "searchTimeout": { + "description": "Search timeout limit in seconds", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 30 + }, + "servers": { + "description": "IP addresses or hostnames of the remote authentication servers.", + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "ssl": { + "description": "Enables SSL", + "type": "string", + "enum": [ "enabled", "disabled", "start-tls" ], + "default": "disabled" + }, + "sslCaCert": { + "description": "SSL certificate issued by a certificate authority", + "allOf": [ + { "$ref": "definitions.schema.json#/definitions/pkiCertificate" }, + { "not": { "required": ["privateKey"] } } + ] + }, + "sslCheckPeer": { + "description": "Specifies whether the system checks an SSL peer", + "type": "boolean", + "default": false + }, + "sslCiphers": { + "description": "Specifies SSL ciphers", + "$comment": "References: https://support.f5.com/csp/article/K13163 https://support.f5.com/csp/article/K97098157 https://support.f5.com/csp/article/K86554600", + "type": "array", + "items": { + "type": "string", + "enum": [ + "ECDHE-RSA-AES128-GCM-SHA256", + "ECDHE-RSA-AES128-CBC-SHA", + "ECDHE-RSA-AES128-SHA256", + "ECDHE-RSA-AES256-GCM-SHA384", + "ECDHE-RSA-AES256-CBC-SHA", + "ECDHE-RSA-AES256-SHA384", + "ECDHE-RSA-CHACHA20-POLY1305-SHA256", + "ECDH-RSA-AES128-GCM-SHA256", + "ECDH-RSA-AES128-SHA256", + "ECDH-RSA-AES128-SHA", + "ECDH-RSA-AES256-GCM-SHA384", + "ECDH-RSA-AES256-SHA384", + "ECDH-RSA-AES256-SHA", + "AES128-GCM-SHA256", + "AES128-SHA", + "AES128-SHA256", + "AES256-GCM-SHA384", + "AES256-SHA", + "AES256-SHA256", + "CAMELLIA128-SHA", + "CAMELLIA256-SHA", + "ECDHE-ECDSA-AES128-GCM-SHA256", + "ECDHE-ECDSA-AES128-SHA", + "ECDHE-ECDSA-AES128-SHA256", + "ECDHE-ECDSA-AES256-GCM-SHA384", + "ECDHE-ECDSA-AES256-SHA", + "ECDHE-ECDSA-AES256-SHA384", + "ECDHE-ECDSA-CHACHA20-POLY1305-SHA256", + "ECDH-ECDSA-AES128-GCM-SHA256", + "ECDH-ECDSA-AES128-SHA", + "ECDH-ECDSA-AES128-SHA256", + "ECDH-ECDSA-AES256-GCM-SHA384", + "ECDH-ECDSA-AES256-SHA", + "ECDH-ECDSA-AES256-SHA384", + "DHE-RSA-AES128-GCM-SHA256", + "DHE-RSA-AES128-SHA", + "DHE-RSA-AES128-SHA256", + "DHE-RSA-AES256-GCM-SHA384", + "DHE-RSA-AES256-SHA", + "DHE-RSA-AES256-SHA256", + "DHE-RSA-CAMELLIA128-SHA", + "DHE-RSA-CAMELLIA256-SHA", + "DHE-DSS-AES128-GCM-SHA256", + "DHE-DSS-AES128-SHA", + "DHE-DSS-AES128-SHA256", + "DHE-DSS-AES256-GCM-SHA384", + "DHE-DSS-AES256-SHA", + "DHE-DSS-AES256-SHA256", + "DHE-DSS-CAMELLIA128-SHA", + "DHE-DSS-CAMELLIA256-SHA", + "ADH-AES128-GCM-SHA256", + "ADH-AES128-SHA", + "ADH-AES256-GCM-SHA384", + "ADH-AES256-SHA", + "ECDHE-RSA-DES-CBC3-SHA", + "ECDH-RSA-DES-CBC3-SHA", + "DES-CBC3-SHA", + "ECDHE-ECDSA-DES-CBC3-SHA", + "ECDH-ECDSA-DES-CBC3-SHA", + "DHE-RSA-DES-CBC3-SHA", + "ADH-DES-CBC3-SHA", + "DHE-RSA-DES-CBC-SHA", + "DES-CBC-SHA", + "ADH-DES-CBC-SHA", + "RC4-SHA", + "RC4-MD5", + "ADH-RC4-MD5", + "EXP1024-DES-CBC-SHA", + "EXP1024-RC4-SHA", + "EXP-RC4-MD5", + "EXP-DES-CBC-SHA", + "TLS13-AES128-GCM-SHA256", + "TLS13-AES256-GCM-SHA384", + "TLS13-CHACHA20-POLY1305-SHA256", + "NULL-SHA", + "NULL-MD5" + ] + }, + "default": [] + }, + "userTemplate": { + "description": "Specifies a user template for the LDAP application to use for authentication.", + "type": "string" + }, + "version": { + "description": "Specifies the version number of the LDAP application.", + "type": "integer", + "minimum": 2, + "maximum": 3, + "default": 3 + } + }, + "additionalProperties": false + } + } +} diff --git a/src/schema/1.37.0/base.schema.json b/src/schema/1.37.0/base.schema.json new file mode 100644 index 00000000..a5c6b5fd --- /dev/null +++ b/src/schema/1.37.0/base.schema.json @@ -0,0 +1,282 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/base.schema.json", + "title": "F5 BIG-IP Declarative Onboarding base declaration", + "description": "Top level schema for onboarding a BIG-IP.", + "type": "object", + "required": ["schemaVersion", "class"], + "properties": { + "schemaVersion": { + "description": "Version of BIG-IP Declarative Onboarding schema this declaration uses.", + "type": "string", + "enum": [ + "1.37.0", + "1.36.0", + "1.35.0", + "1.34.0", + "1.33.0", + "1.32.0", + "1.31.0", + "1.30.0", + "1.29.0", + "1.28.0", + "1.27.0", + "1.26.0", + "1.25.0", + "1.24.0", + "1.23.0", + "1.22.0", + "1.21.0", + "1.20.0", + "1.19.0", + "1.18.0", + "1.17.0", + "1.16.0", + "1.15.0", + "1.14.0", + "1.13.0", + "1.12.0", + "1.11.1", + "1.11.0", + "1.10.0", + "1.9.0", + "1.8.0", + "1.7.0", + "1.6.1", + "1.6.0", + "1.5.1", + "1.5.0", + "1.4.1", + "1.4.0", + "1.3.0", + "1.2.0", + "1.1.0", + "1.0.0" + ] + }, + "class": { + "description": "Indicates this JSON document is a Device declaration", + "type": "string", + "const": "Device" + }, + "$schema": { + "description": "URL of schema against which to validate. Used by validation in your local environment only (via Visual Studio Code, for example)", + "type": "string", + "format": "uri" + }, + "async": { + "description": "Tells the API to return a 202 HTTP status before processing is complete. User must then poll for status.", + "type": "boolean", + "default": false + }, + "webhook": { + "description": "URL to post results to", + "type": "string", + "format": "uri" + }, + "label": { + "description": "Optional friendly name for this declaration", + "type": "string" + }, + "Credentials": { + "description": "Credentials which can be referenced from other parts of the declaration or the remote wrapper.", + "type": "array", + "items": { + "type": "object", + "properties": { + "username": { + "description": "Username of principal authorized to modify configuration of device (may not include the character ':'). NOTE: this is generally not required to configure 'localhost' because client authentication and authorization precede invocation of DO. It is also not required for any host if you populate tokens", + "type": "string", + "pattern": "^[^:]{0,254}$" + }, + "password": { + "description": "Password for username account. This is generally not required to configure 'localhost' and is not required when you populate tokens", + "type": "string", + "pattern": "^.{0,254}$" + }, + "tokens": { + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", + "type": "object", + "patternProperties": { + "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x7f-\\xff]*$", + "maxLength": 8192 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "if": { + "required": ["tokens"] + }, + "then": { + "dependencies": { + "username": { + "not": {} + }, + "password": { + "not": {} + } + } + }, + "else": { + "dependencies": { + "tokens": { + "not": {} + } + } + } + } + }, + "Common": { + "description": "Special tenant Common holds objects other tenants can share", + "type": "object", + "required": ["class"], + "propertyNames": { + "pattern": "^[A-Za-z][0-9A-Za-z_.-]*$", + "maxLength": 48 + }, + "properties": { + "class": { + "type": "string", + "const": "Tenant" + }, + "hostname": { + "description": "Hostname to set for the device. Note: If you set the hostname as part of the System class, you CANNOT set a hostname in the Common class (they are mutually exclusive).", + "type": "string", + "format": "hostname" + } + }, + "additionalProperties": { + "properties": { + "class": { + "enum": [ + "Analytics", + "Authentication", + "ConfigSync", + "DagGlobals", + "DbVariables", + "DeviceCertificate", + "DeviceGroup", + "DeviceTrust", + "Disk", + "DNS", + "DNS_Resolver", + "FailoverUnicast", + "FailoverMulticast", + "HTTPD", + "License", + "MAC_Masquerade", + "ManagementIp", + "ManagementIpFirewall", + "ManagementRoute", + "MirrorIp", + "NetAddressList", + "NetPortList", + "NTP", + "PasswordPolicy", + "Provision", + "RemoteAuthRole", + "Route", + "RouteDomain", + "RouteMap", + "RoutingAccessList", + "RoutingAsPath", + "RoutingPrefixList", + "RoutingBGP", + "SelfIp", + "SnmpAgent", + "SnmpCommunity", + "SnmpTrapEvents", + "SnmpTrapDestination", + "SnmpUser", + "SSHD", + "SyslogRemoteServer", + "System", + "TrafficControl", + "Trunk", + "Tunnel", + "User", + "VLAN", + "TrafficGroup", + "GSLBGlobals", + "GSLBDataCenter", + "GSLBServer", + "GSLBMonitor", + "GSLBProberPool", + "FirewallPolicy", + "FirewallAddressList", + "FirewallPortList", + "SecurityAnalytics" + ] + } + }, + "allOf": [ + { "$ref": "system.schema.json#" }, + { "$ref": "network.schema.json#" }, + { "$ref": "dsc.schema.json#" }, + { "$ref": "analytics.schema.json#" }, + { "$ref": "auth.schema.json#" }, + { "$ref": "gslb.schema.json#" }, + { "$ref": "security.schema.json#" } + ] + }, + "default": { + "class": "Tenant" + } + }, + "controls": { + "description": "Options to control configuration process", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "Controls" + }, + "dryRun": { + "description": "Boolean that indicates if this declaration will be run as a dry-run. If true, the declaration will NOT make any changes to the system, but will respond with whether or not it would.", + "type": "boolean", + "default": false + }, + "trace": { + "description": "If true, create a detailed trace of the configuration process for subsequent analysis (default false). Warning: trace files may contain sensitive configuration data.", + "type": "boolean", + "default": false + }, + "traceResponse": { + "description": "If true, the response will contain the trace files.", + "type": "boolean", + "default": false + }, + "userAgent": { + "description": "User Agent information to include in TEEM report.", + "type": "string" + } + } + }, + "result": { + "description": "Status of current request. This is set by the system.", + "type": "object", + "readOnly": true, + "required": ["class", "code"], + "properties": { + "class": { + "type": "string", + "const": "Result" + }, + "code": { + "description": "Status code.", + "type": "string", + "enum": ["OK", "ERROR"] + }, + "message": { + "description": "Further detail about the status.", + "type": "string" + } + } + } + }, + "additionalProperties": false +} diff --git a/src/schema/1.37.0/definitions.schema.json b/src/schema/1.37.0/definitions.schema.json new file mode 100644 index 00000000..68b7fa25 --- /dev/null +++ b/src/schema/1.37.0/definitions.schema.json @@ -0,0 +1,50 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/definitions.schema.json", + "title": "F5 BIG-IP Declarative Onboarding Definitions declaration", + "description": "Shared definitions for onboarding a BIG-IP.", + "type": "object", + "definitions": { + "F5string": { + "description": "String value in base64", + "type": "object", + "properties": { + "base64": { + "description": "Base64-encoded value (in JSON string)", + "type": "string", + "format": "f5base64" + } + } + }, + "pkiCertificate": { + "description": "PKI certificate with optional chain", + "required": ["certificate"], + "properties": { + "certificate": { + "description": "X.509 public-key certificate", + "allOf": [ + { "$ref": "#/definitions/F5string" } + ] + }, + "privateKey": { + "description": "Private key matching certificate's public key (optional)", + "allOf": [ + { "$ref": "#/definitions/F5string" } + ] + } + } + }, + "Label": { + "title": "Label", + "description": "Optional friendly name for this object", + "type": "string", + "format": "f5label" + }, + "Remark": { + "title": "Remark", + "description": "Arbitrary (brief) text pertaining to this object (optional)", + "type": "string", + "format": "f5remark" + } + } +} diff --git a/src/schema/1.37.0/do.schema.json b/src/schema/1.37.0/do.schema.json new file mode 100644 index 00000000..39873d1c --- /dev/null +++ b/src/schema/1.37.0/do.schema.json @@ -0,0 +1,39 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/do.schema.json", + "title": "F5 BIG-IP Declarative Onboarding base declaration", + "description": "Schema for onboarding a BIG-IP.", + "type": "object", + "required": ["class"], + "properties": { + "class": { + "description": "Top level class. Indicates whether this is a deployment directly to a BIG-IP or to some other system such as BIG-IQ.", + "enum": [ + "Device", + "DO" + ] + } + }, + "allOf": [ + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "Device" } } + }, + "then": { + "description": "Indicates that this is a deployment directly to a BIG-IP.", + "$ref": "base.schema.json#" + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "DO" } } + }, + "then": { + "description": "Indicates that this is a deployment through an intermediary like BIG-IQ.", + "$ref": "remote.schema.json#" + } + } + ] +} diff --git a/src/schema/1.37.0/dsc.schema.json b/src/schema/1.37.0/dsc.schema.json new file mode 100644 index 00000000..a9f9161c --- /dev/null +++ b/src/schema/1.37.0/dsc.schema.json @@ -0,0 +1,400 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/dsc.schema.json", + "title": "F5 BIG-IP Declarative Onboarding DSC declaration", + "description": "Clustering properties for onboarding a BIG-IP.", + "allOf": [ + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "ConfigSync" } } + }, + "then": { + "required": ["class", "configsyncIp"], + "properties": { + "class": { + "description": "Indicates that this property contains config sync IP configuration.", + "type": "string", + "const": "ConfigSync" + }, + "configsyncIp": { + "description": "ConfigSync IP", + "type": "string", + "anyOf": [ + { "const": "none" }, + { "format": "ipv4" }, + { "format": "ipv6" }, + { "format": "json-pointer" } + ] + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "FailoverUnicast" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains failover unicast address configuration.", + "type": "string", + "const": "FailoverUnicast" + }, + "address": { + "description": "IP address to listen on for failover heartbeats", + "type": "string", + "anyOf": [ + { "format": "ipv4" }, + { "format": "ipv6" }, + { "format": "json-pointer" } + ] + }, + "port": { + "description": "Port to listen on for failover heartbeats. The default is 1026.", + "type": "number", + "minimum": 0, + "maximum": 65535 + }, + "addressPorts": { + "description": "An array of address and port objects, that will create multiple failover unicast objects in the BIG-IP device. This array is mutually exclusive from using the other address and port features. Available in BIG-IP DO 1.15 and later.", + "type": "array", + "items": { + "type": "object", + "required": ["address"], + "properties": { + "address": { + "description": "IP address to listen on for failover heartbeats", + "type": "string", + "anyOf": [ + { "format": "ipv4" }, + { "format": "ipv6" }, + { "format": "json-pointer" } + ] + }, + "port": { + "description": "Port to listen on for failover heartbeats", + "type": "number", + "minimum": 0, + "maximum": 65535, + "default": 1026 + } + } + } + } + }, + "additionalProperties": false, + "dependencies": { + "address": { + "properties": { + "port": { + "default": 1026 + } + } + } + }, + "oneOf": [ + { + "required": ["address"], + "not": { "required": ["addressPorts"] } + }, + { + "required": ["addressPorts"], + "allOf": [ + { "not": { "required": ["address"] } }, + { "not": { "required": ["port"] } } + ] + } + ] + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "FailoverMulticast" } } + }, + "then": { + "required": ["class", "interface", "address", "port"], + "properties": { + "class": { + "description": "Indicates that this property contains multicast failover configuration.", + "type": "string", + "const": "FailoverMulticast" + }, + "interface": { + "description": "Specifies the interface name used for the failover multicast IP address. Specifying 'none' (the default) here disables Failover Multicast on the BIG-IP.", + "type": "string", + "default": "none" + }, + "address": { + "description": "IP address to listen on for multicast failover. This address cannot have a CIDR.", + "type": "string", + "default": "any6" + }, + "port": { + "description": "Port to listen on for failover heartbeats.", + "type": "number", + "minimum": 0, + "maximum": 65535, + "default": 0 + } + } + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "DeviceGroup" } } + }, + "then": { + "required": ["class", "type", "owner"], + "properties": { + "class": { + "description": "Indicates that this property contains device group configuration.", + "type": "string", + "const": "DeviceGroup" + }, + "type": { + "description": "Type of the device group", + "type": "string", + "enum": ["sync-failover", "sync-only"] + }, + "owner": { + "description": "Owning device. Config will be pushed from this device. If this is present, device group will only be created if the current device is the owner. If not present, device group will be created if it does not exist", + "type": "string", + "anyOf": [ + { "format": "hostname" }, + { "format": "json-pointer" }, + { "format": "ipv4" }, + { "format": "ipv6" } + ] + }, + "members": { + "description": "Members to add to the device group if they are already in the trust domain", + "type": "array", + "items": { + "type": "string", + "anyOf": [ + { "format": "ipv4" }, + { "format": "ipv6" }, + { "format": "hostname" } + ] + } + }, + "autoSync": { + "description": "Whether or not the device group should auto sync", + "type": "boolean", + "default": false + }, + "saveOnAutoSync": { + "description": "Whether or not the device group should save on auto sync", + "type": "boolean", + "default": false + }, + "networkFailover": { + "description": "Whether or not the device group supports network failover", + "type": "boolean", + "default": false + }, + "asmSync": { + "description": "Whether or not the device group should sync ASM properties", + "type": "boolean", + "default": false + }, + "fullLoadOnSync": { + "description": "Whether or not the device group should do a full load on sync", + "type": "boolean", + "default": false + } + }, + "if": { + "required": ["class"], + "properties": { "type": { "const": "sync-failover" } } + }, + "then": { + "if": { + "required": ["autoSync"], + "properties": { "autoSync": { "const": true } } }, + "then": { + "properties": { + "fullLoadOnSync": { + "const": false + } + } + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "DeviceTrust" } } + }, + "then": { + "required": ["class", "localUsername", "localPassword", "remoteHost", "remoteUsername", "remotePassword"], + "properties": { + "class": { + "description": "Indicates that this property contains device trust configuration.", + "type": "string", + "const": "DeviceTrust" + }, + "localUsername": { + "description": "The username for the local device", + "type": "string" + }, + "localPassword": { + "description": "The password for the localUsername", + "type": "string" + }, + "remoteHost": { + "description": "The remote hostname or IP address", + "type": "string", + "anyOf": [ + { "format": "ipv4" }, + { "format": "ipv6" }, + { "format": "hostname" }, + { "format": "json-pointer" } + ] + }, + "remoteUsername": { + "description": "An admin user on the remote host", + "type": "string" + }, + "remotePassword": { + "description": "Password for the remote user in remoteUsername", + "type": "string" + } + } + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "TrafficGroup" } } + }, + "then" : { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains Traffic Group configuration.", + "type": "string", + "const": "TrafficGroup" + }, + "autoFailbackEnabled": { + "type": "boolean", + "description": "Specifies whether the traffic group fails back to the default device.", + "default": false + }, + "autoFailbackTime": { + "type": "integer", + "description": "Specifies the time required to fail back.", + "default": 60, + "minimum": 0, + "maximum": 300 + }, + "failoverMethod": { + "type": "string", + "description": "Specifies the method used to decide if the current device needs to failover the traffic-group to another device. If the failover-method is set to ha-order, a list of devices and their respective HA load is used to decide the next one to take over if the current devices fails.", + "enum": [ + "ha-order" + ], + "default": "ha-order" + }, + "haLoadFactor": { + "type": "integer", + "description": "Specifies a number for this traffic group that represents the load this traffic group presents to the system relative to other traffic groups. This allows the failover daemon to load balance the active traffic groups amongst the devices.", + "default": 1, + "minimum": 1, + "maximum": 1000 + }, + "haOrder": { + "type": "array", + "description": "This list of devices specifies the order in which the devices will become active for the traffic group when a failure occurs. This list may contain zero, one, or more entries up to the number of devices in the failover device group.", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "MAC_Masquerade" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains MAC masquerade configuration.", + "type": "string", + "const": "MAC_Masquerade" + }, + "source": { + "description": "MAC address source to use for masquerading.", + "oneOf": [ + { + "type": "object", + "properties": { + "interface": { + "description": "Generate a MAC address from an interface", + "type": "string" + } + }, + "required": ["interface"], + "additionalProperties": false + } + ] + }, + "trafficGroup": { + "description": "Traffic group to apply the MAC masquerade to.", + "type": "string", + "enum": ["traffic-group-local-only", "traffic-group-1"], + "default": "traffic-group-1" + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": [ + "class" + ], + "properties": { + "class": { + "const": "MirrorIp" + } + } + }, + "then": { + "required": [ + "class" + ], + "properties": { + "class": { + "description": "Indicates IP addresses to use for connection and persistence mirroring.", + "type": "string", + "const": "MirrorIp" + }, + "primaryIp": { + "description": "IP of primary mirror. Specify 'any6' to disable.", + "type": "string", + "default": "any6" + }, + "secondaryIp": { + "description": "IP of secondary mirror. Specify 'any6' to disable.", + "type": "string", + "default": "any6" + } + }, + "additionalProperties": false + } + } + ] +} diff --git a/src/schema/1.37.0/formats.js b/src/schema/1.37.0/formats.js new file mode 100644 index 00000000..40fbc2cd --- /dev/null +++ b/src/schema/1.37.0/formats.js @@ -0,0 +1,91 @@ +/** + * Copyright 2023 F5 Networks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +/* eslint-disable max-len */ +const IPv4rex = /^(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))(%(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{3}|[1-9]\d{2}|[1-9]?\d))?(\x2f(3[012]|[12]?\d))?$/; + +const IPv6rex = /^(::(([0-9a-f]{1,4}:){0,5}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}::(([0-9a-f]{1,4}:){0,4}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}:[0-9a-f]{1,4}::(([0-9a-f]{1,4}:){0,3}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){2}::(([0-9a-f]{1,4}:){0,2}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){3}::(([0-9a-f]{1,4}:)?((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){4}::((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){5}::([0-9a-f]{1,4})?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){0,6}::)|(([0-9a-f]{1,4}:){7}[0-9a-f]{1,4})(%(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{3}|[1-9]\d{2}|[1-9]?\d))?(\x2f(12[0-8]|1[01]\d|[1-9]?\d))?$/; + +const IPv4optionalPrefixNoRouteDomainRex = /^(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))?(\x2f(3[012]|[12]?\d))?$/; + +const IPv6optionalPrefixNoRouteDomainRex = /^((::(([0-9a-f]{1,4}:){0,5}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}::(([0-9a-f]{1,4}:){0,4}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}:[0-9a-f]{1,4}::(([0-9a-f]{1,4}:){0,3}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){2}::(([0-9a-f]{1,4}:){0,2}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){3}::(([0-9a-f]{1,4}:)?((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){4}::((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){5}::([0-9a-f]{1,4})?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){0,6}::)|(([0-9a-f]{1,4}:){7}[0-9a-f]{1,4}))(\x2f(12[0-8]|1[01]\d|[1-9]?\d))?$/; + +const IPv4requiredPrefixNoRouteDomainRex = /^(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))?(\x2f(3[012]|[12]?\d))$/; + +const IPv6requiredPrefixNoRouteDomainRex = /^((::(([0-9a-f]{1,4}:){0,5}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}::(([0-9a-f]{1,4}:){0,4}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}:[0-9a-f]{1,4}::(([0-9a-f]{1,4}:){0,3}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){2}::(([0-9a-f]{1,4}:){0,2}((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){3}::(([0-9a-f]{1,4}:)?((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d))))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){4}::((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})|(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)[.]){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)))?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){5}::([0-9a-f]{1,4})?)|([0-9a-f]{1,4}(:[0-9a-f]{1,4}){0,6}::)|(([0-9a-f]{1,4}:){7}[0-9a-f]{1,4}))(\x2f(12[0-8]|1[01]\d|[1-9]?\d))$/; + +/* eslint-enable max-len */ + +module.exports = { + IPv4optionalPrefixNoRouteDomainRex, + IPv6optionalPrefixNoRouteDomainRex, + IPv4requiredPrefixNoRouteDomainRex, + IPv6requiredPrefixNoRouteDomainRex, + f5ip: (address) => { + const lowerAddress = address.toLowerCase(); + return (!lowerAddress.length + || ((lowerAddress.length > 1) + && (lowerAddress.match(/[^0-9a-f:.%\x2f]/) === null) + && (IPv4rex.test(lowerAddress) || IPv6rex.test(lowerAddress)))); + }, + f5base64: (string) => { + const regex = /^([0-9A-Za-z/+_-]*|[0-9A-Za-z/+_-]+={1,2})$/; + return regex.test(string); + }, + f5bigip: (name) => { + // "f5bigip" ought to match names of BIG-IP configuration + // components. In fact it merely excludes egregious errors. + // It does demand absolute pathnames (i.e., starting with / + // like "/Common/foo") and it forbids space in names + const regex = /^\/[^\s"#'*<>?[-\]{-}]+$/; + return regex.test(name); + }, + ipWithOptionalPrefix: (address) => { + const lowerAddress = address.toLowerCase(); + return (!lowerAddress.length + || ((lowerAddress.length > 1) + && (lowerAddress.match(/[^0-9a-f:.%\x2f]/) === null) + && (IPv4optionalPrefixNoRouteDomainRex.test(lowerAddress) + || IPv6optionalPrefixNoRouteDomainRex.test(lowerAddress)))); + }, + ipWithRequiredPrefix: (address) => { + const lowerAddress = address.toLowerCase(); + return (!lowerAddress.length + || ((lowerAddress.length > 1) + && (lowerAddress.match(/[^0-9a-f:.%\x2f]/) === null) + && (IPv4requiredPrefixNoRouteDomainRex.test(lowerAddress) + || IPv6requiredPrefixNoRouteDomainRex.test(lowerAddress)))); + }, + f5label: (string) => { + // 'f5label' allows 0-64 chars, excluding a few likely to + // cause trouble with string searching, JS, TCL, or HTML + + // eslint-disable-next-line no-control-regex + const regex = /^[^\x00-\x1f\x22#&*<>?\x5b-\x5d`\x7f]{0,64}$/; + return regex.test(string); + }, + f5remark: (string) => { + // 'f5remark' allows 0-64 chars, excluding only control- + // chars, double-quote, and backslash. This is permissive + // enough that you should worry about XSS attacks + + // eslint-disable-next-line no-control-regex + const regex = /^[^\x00-\x1f\x22\x5c\x7f]{0,64}$/; + return regex.test(string); + } +}; diff --git a/src/schema/1.37.0/gslb.schema.json b/src/schema/1.37.0/gslb.schema.json new file mode 100644 index 00000000..ee4cfa3f --- /dev/null +++ b/src/schema/1.37.0/gslb.schema.json @@ -0,0 +1,668 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/gslb.schema.json", + "title": "F5 BIG-IP Declarative Onboarding GSLB declaration", + "description": "GSLB properties for onboarding a BIG-IP.", + "allOf": [ + { + "if": { + "required": ["class"], + "type": "object", + "properties": { "class": { "const": "GSLBGlobals" } } + }, + "then": { "$ref": "#/definitions/gslbGlobals" } + }, + { + "if": { + "required": ["class"], + "type": "object", + "properties": { "class": { "const": "GSLBDataCenter" } } + }, + "then": { "$ref": "#/definitions/gslbDataCenter" } + }, + { + "if": { + "required": ["class"], + "type": "object", + "properties": { "class": { "const": "GSLBServer" } } + }, + "then": { "$ref": "#/definitions/gslbServer" } + }, + { + "if": { + "required": ["class"], + "type": "object", + "properties": { "class": { "const": "GSLBMonitor" } } + }, + "then": { "$ref": "#/definitions/gslbMonitor" } + }, + { + "if": { + "required": ["class"], + "type": "object", + "properties": { "class": { "const": "GSLBProberPool" } } + }, + "then": { "$ref": "#/definitions/gslbProberPool" } + } + ], + "definitions": { + "gslbGlobals": { + "required": ["class"], + "type": "object", + "description": "GSLB global settings.", + "properties": { + "class": { + "description": "Indicates that this property contains gslb global settings configuration.", + "type": "string", + "const": "GSLBGlobals" + }, + "general": { + "$ref": "#/definitions/generalGlobals" + } + }, + "additionalProperties": false + }, + "generalGlobals": { + "type":"object", + "description": "GSLB general global settings.", + "properties": { + "synchronizationEnabled": { + "description": "Specifies if the system is a member of a synchronization group.", + "type": "boolean", + "default": false + }, + "synchronizationGroupName": { + "description": "Specifies the name of the synchronization group that the system belongs to.", + "type": "string", + "default": "default" + }, + "synchronizationTimeTolerance": { + "description": "Specifies the number of seconds that one system can be out of sync with another in the synchronization group. A value of 0 turns time synchronization off. The values 1-4 are not allowed.", + "type": "integer", + "minimum": 0, + "maximum": 600, + "default": 10, + "not": { + "enum": [1, 2, 3, 4] + } + }, + "synchronizationTimeout": { + "description": "Specifies the number of seconds that the system attempts to sync with the GSLB configuration with a sync group member.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 180 + } + }, + "additionalProperties": false + }, + "gslbDataCenter": { + "required": ["class"], + "description": "Declares a GSLB Data Center configuration", + "type": "object", + "properties": { + "class": { + "type": "string", + "const": "GSLBDataCenter" + }, + "remark": { + "$ref": "definitions.schema.json#/definitions/Remark" + }, + "enabled": { + "description": "Specifies whether the data center is enabled or disabled", + "type": "boolean", + "default": true + }, + "location": { + "description": "Specifies the location of the data center", + "type": "string" + }, + "contact": { + "description": "Specifies the name of the administrator or the name of the department that manages the data center", + "type": "string" + }, + "proberPreferred": { + "description": "Specifies the type of prober to use to monitor servers defined in this data center. The default value is inside-data-center. Note: Prober pools are not used by the bigip monitor", + "type": "string", + "enum": [ + "inside-datacenter", "outside-datacenter", "pool" + ], + "default": "inside-datacenter" + }, + "proberFallback": { + "description": "Specifies the type of prober to use to monitor servers defined in this data center when the preferred type is not available. The default value is any-available", + "type": "string", + "enum": [ + "any-available", "inside-datacenter", "none", "outside-datacenter", "pool" + ], + "default": "any-available" + }, + "proberPool": { + "description": "Specifies a prober pool to monitor servers defined in the data center when proberPreferred or proberFallback are a value of pool.", + "type": "string" + } + }, + + "dependencies": { + "proberPool": { + "oneOf": [ + { "properties": { "proberPreferred": { "const": "pool" } } }, + { "properties": { "proberFallback": { "const": "pool" } } } + ] + } + }, + "additionalProperties": false + }, + "gslbServer": { + "required": [ "class", "dataCenter", "devices" ], + "description": "Declares a GSLB server object which contains configuration for a load balancer or a host server", + "type": "object", + "properties": { + "class": { + "description": "Indicates that this property contains GSLB server configuration", + "type": "string", + "const": "GSLBServer" + }, + "label": { + "$ref": "definitions.schema.json#/definitions/Label" + }, + "remark": { + "$ref": "definitions.schema.json#/definitions/Remark" + }, + "enabled": { + "description": "Specifies whether the server is enabled or disabled", + "type": "boolean", + "default": true + }, + "serverType": { + "description": "Specifies the server type. The server type determines the metrics that the system can collect from the server", + "type": "string", + "enum":[ + "bigip", "generic-host" + ], + "default": "bigip" + }, + "proberPreferred": { + "description": "Specifies the type of prober to use to monitor servers defined in this data center. The default value is inherit. Note: Prober pools are not used by the bigip monitor", + "type": "string", + "enum": [ + "inherit", "inside-datacenter", "outside-datacenter", "pool" + ], + "default": "inherit" + }, + "proberFallback": { + "description": "Specifies the type of prober to use to monitor servers defined in this data center when the preferred type is not available. The default value is inherit", + "type": "string", + "enum": [ + "inherit", "any-available", "inside-datacenter", "none", "outside-datacenter", "pool" + ], + "default": "inherit" + }, + "proberPool": { + "description": "Specifies the name of a prober pool to use to monitor this server's resources when either the proberPreferred or proberFallback value is pool", + "type": "string" + }, + "dataCenter": { + "description": "Specifies the GSLB data center to which the server belongs", + "type": "string" + }, + "devices": { + "description": "Specifies the actual device(s) that are represented by this server object", + "type": "array", + "items": { "$ref": "#/definitions/gslbServerDevice" }, + "minItems": 1 + }, + "virtualServers": { + "description": "Specifies the virtual server(s) that are resources on this server object", + "type": "array", + "items": { "$ref": "#/definitions/gslbVirtualServer" } + }, + "virtualServerDiscoveryMode": { + "description": "Specifies virtual server auto-discovery settings. Use 'enabled' (add, modify, delete), 'enabled-no-delete' (add, modify) or the default 'disabled' (manual configuration)", + "type": "string", + "enum": [ + "disabled", + "enabled", + "enabled-no-delete" + ], + "default": "disabled" + }, + "exposeRouteDomainsEnabled": { + "description": "Allows virtual servers from all route domains to be auto-discovered. The default setting is false", + "type": "boolean", + "default": false + }, + "bpsLimit": { + "description": "Specifies the maximum allowable data throughput rate, in bits per second, for the virtual servers on the server. If the network traffic volume exceeds this limit, the system marks the server as unavailable", + "type": "integer", + "default": 0, + "minimum": 0 + }, + "bpsLimitEnabled": { + "description": "Enables or disables the maximum Bits Per Second (BPS) option for the virtual servers on the server. The default value is false (disabled)", + "type": "boolean", + "default": false + }, + "ppsLimit": { + "description": "Specifies the maximum allowable data transfer rate, in packets per second, for the virtual servers on the server. If the network traffic volume exceeds this value, the system marks the server as unavailable", + "type": "integer", + "default": 0, + "minimum": 0 + }, + "ppsLimitEnabled": { + "description": "Enables or disables the maximum Packets Per Second (PPS) option for the virtual servers on the server. The default value is false (disabled)", + "type": "boolean", + "default": false + }, + "connectionsLimit": { + "description": "Specifies the number of current connections allowed for the virtual servers on the server. If the current connections exceed this value, the system marks the server as unavailable", + "type": "integer", + "default": 0, + "minimum": 0 + }, + "connectionsLimitEnabled": { + "description": "Enables or disables the maximum current connections option for the virtual servers on the server. The default value is false (disabled)", + "type": "boolean", + "default": false + }, + "cpuUsageLimit": { + "description": "Specifies the percent of CPU usage. If percent of CPU usage goes above the limit, the system marks the server as unavailable", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "cpuUsageLimitEnabled": { + "description": "Enables or disables the CPU Usage limit option for this pool. The default value is false (disabled)", + "type": "boolean", + "default": false + }, + "memoryLimit": { + "description": "Specifies the available memory in kilobytes required by the virtual servers on the server. If available memory falls below this limit, the system marks the server as unavailable", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "memoryLimitEnabled": { + "description": "Enables or disables the maximum Bits Per Second (BPS) option for this pool. The default value is false (disabled)", + "type": "boolean", + "default": false + }, + "serviceCheckProbeEnabled": { + "description": "Specifies whether this BIG-IP device will be used to conduct a service check probe before traffic will be delegated to it. The default value is (true) enabled ", + "type": "boolean", + "default": true + }, + "pathProbeEnabled": { + "description": "Specifies whether this BIG-IP device will be used to conduct a path probe before traffic will be delegated to it. The default value is (true) enabled ", + "type": "boolean", + "default": true + }, + "snmpProbeEnabled": { + "description": "Specifies whether this BIG-IP device will be used to conduct a SNMP probe before traffic will be delegated to it. The default value is (true) enabled ", + "type": "boolean", + "default": true + }, + "monitors": { + "description": "Specifies the path and name of the health monitors that the system uses to determine whether it can use this server for load balancing", + "type": "array", + "items": { + "type": "string" + } + } + }, + "dependencies": { + "proberPreferred": { + "if": { "properties": { "proberPreferred": { "const": "pool" } } }, + "then": { "required": [ "proberPool" ] } + }, + "proberFallback": { + "if": { "properties": { "proberFallback": { "const": "pool" } } }, + "then": { "required": [ "proberPool" ] } + } + }, + "additionalProperties": false + }, + "gslbServerDevice": { + "description": "Configures a device for the GSLB server", + "type": "object", + "required": [ "address" ], + "properties": { + "label": { + "$ref": "definitions.schema.json#/definitions/Label" + }, + "remark": { + "$ref": "definitions.schema.json#/definitions/Remark" + }, + "address": { + "type": "string", + "description": " Specifies an external (public) address for the device. If BIG-IP DNS configuration synchronization is enabled and all existing addresses for a device are being replaced, new addresses should be added and synchronized before old addresses are removed, otherwise the changes may fail to synchronize. Alternatively, the address configuration changes can be performed on each BIG-IP DNS system", + "format": "f5ip" + }, + "addressTranslation": { + "type": "string", + "description": "Specifies the internal (private) address that corresponds to the external address", + "format": "f5ip" + } + }, + "additionalProperties": false + }, + "gslbMonitor": { + "description": "Declares a monitor that verifies the availability and/or performance status of a particular protocol, service or application", + "type": "object", + "required": [ "class", "monitorType" ], + "properties": { + "class": { + "type": "string", + "const": "GSLBMonitor" + }, + "label": { + "$ref": "definitions.schema.json#/definitions/Label" + }, + "remark": { + "$ref": "definitions.schema.json#/definitions/Remark" + }, + "monitorType": { + "description": "Specifies the type of monitor", + "type": "string", + "enum": [ "http", "https", "gateway-icmp", "tcp", "udp" ] + }, + "target": { + "description": "Specifies the IP address and service port of the resource that is the destination of this monitor. Format is ip:port", + "type": "string", + "default": "*:*" + }, + "interval": { + "description": "Specifies, in seconds, the frequency at which the system issues the monitor check when either the resource is down or the status of the resource is unknown", + "type": "integer", + "minimum": 0, + "maximum": 86399, + "default": 30 + }, + "timeout": { + "description": "Specifies the number of seconds the target has in which to respond to the monitor request", + "type": "integer", + "minimum": 0, + "maximum": 86400, + "default": 120 + }, + "probeTimeout": { + "description": "Specifies the number of seconds after which the system times out the probe request to the system", + "type": "integer", + "minimum": 0, + "maximum": 86400, + "default": 5 + }, + "ignoreDownResponseEnabled": { + "description": "Specifies whether the monitor immediately marks an object down when it recieves a down response. If enabled, the monitor ignores the down response for the duration of timeout. The default is false (disabled)", + "type": "boolean", + "default": false + }, + "transparent": { + "description": "Enables monitoring of pool members through firewalls. The default value is false (disabled)", + "type": "boolean", + "default": false + } + }, + "allOf": [ + { + "if": { "properties": { "monitorType": { "const": "http" } } }, + "then": { "$ref": "#/definitions/gslbMonitorHTTP" } + }, + { + "if": { "properties": { "monitorType": { "const": "https" } } }, + "then": { "$ref": "#/definitions/gslbMonitorHTTPS" } + }, + { + "if": { "properties": { "monitorType": { "const": "gateway-icmp" } } }, + "then": { "$ref": "#/definitions/gslbMonitorICMP" } + }, + { + "if": { "properties": { "monitorType": { "const": "tcp" } } }, + "then": { "$ref": "#/definitions/gslbMonitorTCP" } + }, + { + "if": { "properties": { "monitorType": { "const": "udp" } } }, + "then": { "$ref": "#/definitions/gslbMonitorUDP" } + } + ] + }, + + "gslbMonitorHTTP": { + "description": "Additional Monitor class properties available when monitorType = http", + "type": "object", + "properties": { + "reverseEnabled": { + "description": "When enabled, a successful check marks the monitored object down instead of up. You can use the Reverse mode only if you configure both the send and receive options", + "type": "boolean", + "default": false + }, + "send": { + "description": "Specifies the text string that the monitor sends to the target object. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "HEAD / HTTP/1.0\\r\\n\\r\\n" + }, + "receive": { + "description": "Specifies the text string that the monitor looks for in the returned resource. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "HTTP/1." + } + } + }, + "gslbMonitorHTTPS": { + "description": "Additional Monitor class properties available when monitorType = https", + "type": "object", + "allOf": [ + { + "properties": { + "ciphers": { + "description": "Ciphersuite selection string", + "type": "string", + "default": "DEFAULT" + }, + "clientCertificate": { + "description": "Pointer to client Certificate declaration, for TLS authentication (optional)", + "type": "string" + } + } + }, + { + "$ref": "#/definitions/gslbMonitorHTTP" + } + ] + }, + "gslbMonitorICMP": { + "description": "Additional Monitor class properties available when monitorType = gateway-icmp", + "type": "object", + "properties": { + "probeInterval": { + "description": "Specifies the frequency at which the BIG-IP system probes the host server", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "probeAttempts": { + "description": "Specifies the number of times the BIG-IP system attempts to probe the host server, after which the BIG-IP system considers the host server down or unavailable", + "type": "integer", + "minimum": 0, + "default": 3 + } + } + }, + "gslbMonitorTCP": { + "description": "Additional Monitor class properties available when monitorType = tcp", + "type": "object", + "properties": { + "reverseEnabled": { + "description": "When enabled, a successful check marks the monitored object down instead of up. You can use the Reverse mode only if you configure both the send and receive options", + "type": "boolean", + "default": false + }, + "send": { + "description": "Specifies the text string that the monitor sends to the target object. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "" + }, + "receive": { + "description": "Specifies the text string that the monitor looks for in the returned resource. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "" + } + } + }, + "gslbMonitorUDP": { + "description": "Additional Monitor class properties available when monitorType = udp", + "type": "object", + "properties": { + "debugEnabled": { + "description": "When enabled, the monitor sends error messages and additional information to a log file created and labeled specifically for this monitor. The default is false (disabled)", + "type": "boolean", + "default": false + }, + "probeAttempts": { + "description": "Specifies the number of times the BIG-IP system attempts to probe the host server, after which the BIG-IP system considers the host server down or unavailable", + "type": "integer", + "minimum": 0, + "default": 3 + }, + "probeInterval": { + "description": "Specifies the frequency at which the BIG-IP system probes the host server", + "type": "integer", + "minimum": 0, + "default": 1 + }, + "reverseEnabled": { + "description": "When enabled, a successful check marks the monitored object down instead of up. You can use the Reverse mode only if you configure both the send and receive options", + "type": "boolean", + "default": false + }, + "send": { + "description": "Specifies the text string that the monitor sends to the target object. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "default send string" + }, + "receive": { + "description": "Specifies the text string that the monitor looks for in the returned resource. If you do not specify a value for both the send and receive options, the monitor performs a simple service check and connect only", + "type": "string", + "default": "" + } + } + }, + "gslbProberPool": { + "description": "Declares a pool of BIG-IP devices that will monitor server resources for health and performance. Note: Prober pools are not used by the bigip monitor", + "type": "object", + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains GSLB Prober Pool configuration", + "type": "string", + "const": "GSLBProberPool" + }, + "label": { + "$ref": "definitions.schema.json#/definitions/Label" + }, + "remark": { + "$ref": "definitions.schema.json#/definitions/Remark" + }, + "enabled": { + "description": "Specifies whether this pool is available for conducting probes", + "type": "boolean", + "default": true + }, + "lbMode": { + "description": "Specifies the load balancing mode that the system uses to select the members of this pool", + "type": "string", + "enum": [ + "global-availability", + "round-robin" + ], + "default": "global-availability" + }, + "members": { + "description": "Specifies the members of the prober pool", + "type": "array", + "items": { + "$ref": "#/definitions/gslbProberPoolMember" + } + } + }, + "additionalProperties": false + }, + "gslbProberPoolMember": { + "description": "Declares member of the GSLB prober pool", + "type": "object", + "required": [ "server" ], + "properties": { + "server": { + "description": "Specifies the GSLB Server name of the pool member", + "type": "string" + }, + "label": { + "$ref": "definitions.schema.json#/definitions/Label" + }, + "remark": { + "$ref": "definitions.schema.json#/definitions/Remark" + }, + "enabled": { + "description": "Specifies whether the server can be used as a member of a prober pool", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + }, + "gslbVirtualServer": { + "description": "Declares virtual server resource for the GSLB server", + "type": "object", + "required": ["address"], + "properties": { + "label": { + "$ref": "definitions.schema.json#/definitions/Label" + }, + "remark": { + "$ref": "definitions.schema.json#/definitions/Remark" + }, + "enabled": { + "description": "Specifies whether the virtual server is enabled or disabled", + "type": "boolean", + "default": true + }, + "port": { + "description": "Specifies the L4 port for the service (like 443 for HTTPS)", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "address": { + "description": "Specifies the IP address for the virtual server", + "type": "string", + "format": "f5ip" + }, + "addressTranslation": { + "description": "Specifies the public address that this virtual server translates into when the GSLB provider communicates between the network and the Internet", + "type": "string", + "format": "f5ip" + }, + "addressTranslationPort": { + "description": "Specifies the translation port number for the virtual server", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "monitors": { + "description": "Specifies the health monitors that the system uses to determine whether it can use this linked virtual server for load balancing", + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "description": "Specifies the name of the virtual server", + "type": "string" + } + }, + "additionalProperties": false + } + } +} diff --git a/src/schema/1.37.0/network.schema.json b/src/schema/1.37.0/network.schema.json new file mode 100644 index 00000000..f7cac3c2 --- /dev/null +++ b/src/schema/1.37.0/network.schema.json @@ -0,0 +1,1508 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/network.schema.json", + "title": "F5 BIG-IP Declarative Onboarding network declaration", + "description": "Network properties for onboarding a BIG-IP.", + "allOf": [ + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "Trunk" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains Trunk configuration.", + "type": "string", + "const": "Trunk" + }, + "distributionHash": { + "description": "Specifies the basis for the hash that the system uses as the frame distribution algorithm. Choices are 'dst-mac' (use the destination MAC addresses), 'src-dist-mac' (use the source, destination, and MAC addresses), or 'src-dst-ipport' (use the source and destination IP addresses and ports).", + "type": "string", + "enum": ["dst-mac", "src-dst-ipport", "src-dst-mac"], + "default": "dst-mac" + }, + "interfaces": { + "description": "Interfaces for the Trunk. The number of interfaces used is recommended to be a power of 2 (for example 2, 4, or 8). Interfaces must be untagged.", + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }, + "lacpEnabled": { + "description": "Specifies, when true, that the system supports the link aggregation control protocol (LACP), which monitors the trunk by exchanging control packets over the member links to determine the health of the links.", + "type": "boolean", + "default": false + }, + "lacpMode": { + "description": "Specifies the operation mode for LACP if the lacp option is enabled for the trunk. The values are 'active' (specifies the system periodically transmits LACP packets, regardless of the control value of the peer system) and 'passive' (specifies the system periodically transmits LACP packets, unless the control value of the peer system is active).", + "type": "string", + "enum": ["active", "passive"], + "default": "active" + }, + "lacpTimeout": { + "description": "Specifies the rate at which the system sends the LACP control packets.", + "type": "string", + "enum": ["long", "short"], + "default": "long" + }, + "linkSelectPolicy": { + "description": "Sets the LACP policy that the trunk uses to determine which member link (interface) can handle new traffic.", + "type": "string", + "enum": ["auto", "maximum-bandwidth"], + "default": "auto" + }, + "qinqEthertype": { + "description": "Specifies the ether-type value used for the packets handled on this trunk when it is a member in a QinQ vlan.", + "type": "string", + "pattern": "^0x[a-fA-F0-9]{4}$", + "default": "0x8100" + }, + "spanningTreeEnabled": { + "description": "Enables the spanning tree protocols (STP).", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "VLAN" } } + }, + "then": { + "required": ["class", "interfaces"], + "properties": { + "class": { + "description": "Indicates that this property contains VLAN configuration.", + "type": "string", + "const": "VLAN" + }, + "mtu": { + "description": "MTU for the VLAN.", + "type": "integer", + "minimum": 576, + "maximum": 9198, + "default": 1500 + }, + "tag": { + "description": "Tag for the VLAN.", + "type": "integer", + "minimum": 1, + "maximum": 4094 + }, + "interfaces": { + "description": "Interfaces for the VLAN.", + "type": "array", + "items": { + "type": "object", + "required": ["name"], + "properties": { + "name": { + "description": "Name of the interface.", + "type": "string" + }, + "tagged": { + "description": "Whether or not the interface is tagged. Default is true if a VLAN tag is provided, otherwise false.", + "type": "boolean" + } + }, + "additionalProperties": false + } + }, + "autoLastHop": { + "description": "When enabled, allows the system to send return traffic to the MAC address that transmitted the request, even if the routing table points to a different network or interface. As a result, the system can send return traffic to clients even when there is no matching route. Settings are default (inherited global setting), enabled, and disabled.", + "type": "string", + "enum": ["default", "enabled", "disabled"], + "default": "default" + }, + "cmpHash": { + "description": "Specifies how the traffic on the VLAN will be disaggregated.", + "type": "string", + "enum": ["default", "dst-ip", "src-ip"], + "default": "default" + }, + "failsafeEnabled": { + "description": "Enables a fail-safe mechanism that causes the active cluster to fail over to a redundant cluster when loss of traiffic is detected on a VLAN", + "type": "boolean", + "default": false + }, + "failsafeAction": { + "description": "Specifies the action for the system to take when the fail-safe mechanism is triggered", + "type": "string", + "enum": ["failover", "failover-restart-tm", "reboot", "restart-all"], + "default": "failover-restart-tm" + }, + "failsafeTimeout": { + "description": "Specifies the number of seconds that an active unit can run without detecting network traffic on this VLAN before starting a failover", + "type": "integer", + "minimum": 10, + "maximum": 3600, + "default": 90 + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "type": "object", + "properties": { "class": { "const": "FirewallPolicy" } } + }, + "then": { "$ref": "#/definitions/firewallPolicy" } + }, + { + "if": { + "required": ["class"], + "type": "object", + "properties": { "class": { "const": "FirewallAddressList" } } + }, + "then": { "$ref": "#/definitions/firewallAddressList" } + }, + { + "if": { + "required": ["class"], + "type": "object", + "properties": { "class": { "const": "FirewallPortList" } } + }, + "then": { "$ref": "#/definitions/firewallPortList" } + }, + { + "if": { + "required": ["class"], + "type": "object", + "properties": { "class": { "const": "NetAddressList" } } + }, + "then": { "$ref": "#/definitions/netAddressList" } + }, + { + "if": { + "required": ["class"], + "type": "object", + "properties": { "class": { "const": "NetPortList" } } + }, + "then": { "$ref": "#/definitions/netPortList" } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "SelfIp" } } + }, + "then": { + "required": ["class", "address", "vlan"], + "properties": { + "class": { + "description": "Indicates that this property contains Self IP configuration.", + "type": "string", + "const": "SelfIp" + }, + "address": { + "description": "IP address.", + "type": "string", + "format": "f5ip" + }, + "trafficGroup": { + "description": "Traffic group for the Self IP.", + "type": "string", + "enum": ["traffic-group-local-only", "traffic-group-1"], + "default": "traffic-group-local-only" + }, + "vlan": { + "description": "VLAN or Tunnel for the self IP.", + "type": "string" + }, + "allowService": { + "description": "Which services (ports) to allow on the self IP. Value should be 'all', 'none', 'default', or array of ''. NOTE: The default value is not recommended and a value of 'none' should be used if possible.", + "oneOf": [ + { + "type": "string", + "enum": ["all", "none", "default"] + }, + { + "type": "array", + "items": { + "type": "string", + "pattern": "(\\w+:\\d+|default)" + } + } + ], + "default": "none" + }, + "enforcedFirewallPolicy": { + "description": "Specifies an enforced firewall policy on the self IP.", + "type": "string" + }, + "stagedFirewallPolicy": { + "description": "Specifies a staged firewall policy on the self IP.", + "type": "string" + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "DNS_Resolver" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains DNS Resolver configuration.", + "type": "string", + "const": "DNS_Resolver" + }, + "answerDefaultZones": { + "description": "Specifies whether the resolver answers queries for default zones: localhost, reverse 127.0.0.1, ::1, and AS112 zones.", + "type": "boolean", + "default": false + }, + "cacheSize": { + "description": "Specifies the maximum cach size in bytes of the DNS Resolver object", + "type": "integer", + "minimum": 10, + "maximum": 9437184, + "default": 5767168 + }, + "forwardZones": { + "description": "Forward zones on a DNS Resolver. A given zone name should only use the symbols allowed for a fully qualified domain name (FQDN), namely ASCII letters a through z, digits 0 through 9, hyphen, nad period. For example site.example.com would be a valid zone name. A DNS Resolver configured with a forward zone will forward any queries that resulted in a cache-miss and which also match a configured zone name, to the nameserver specified on the zone.", + "type": "array", + "items": { + "type": "object", + "required": ["name"], + "properties": { + "name": { + "description": "Name of a forward zone.", + "type": "string", + "anyOf": [ + { + "format": "hostname" + }, + { + "pattern": "^\\.$" + } + ] + }, + "nameservers": { + "description": "Specifies the IP address and service port of a recursive nameserver that answers DNS queries when the response cannot be found in the internal DNS resolver cache. Enter each address in the format address:port (IPv4) or addrss.port (IPv6). The port is usually 53.", + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "randomizeQueryNameCase": { + "description": "Specifies whether the resolver randomizes the case of query names.", + "type": "boolean", + "default": true + }, + "routeDomain": { + "description": "Specifies the name of the route domain the resolver uses for outbound traffic.", + "type": "string", + "default": "0" + }, + "useIpv4": { + "description": "Specifies whether the resolver sends DNS queries to IPv4", + "type": "boolean", + "default": true + }, + "useIpv6": { + "description": "Specifies whether the resolver sends DNS queries to IPv6", + "type": "boolean", + "default": true + }, + "useTcp": { + "description": "Specifies whether the resolver sends DNS queries over TCP", + "type": "boolean", + "default": true + }, + "useUdp": { + "description": "Specifies whether the resolver sends DNS queries over UDP", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "Route" } } + }, + "then": { + "properties": { + "class": { + "description": "Indicates that this property contains Route configuration.", + "type": "string", + "const": "Route" + }, + "gw": { + "description": "Gateway for the route.", + "type": "string", + "format": "f5ip" + }, + "network": { + "description": "IP address/netmask for route", + "type": "string", + "anyOf": [ + { "format": "f5ip" }, + { "enum": ["default", "default-inet6"]} + ], + "default": "default" + }, + "mtu": { + "description": "MTU for the route.", + "type": "integer", + "minimum": 0, + "maximum": 9198 + }, + "target": { + "description": "The VLAN or Tunnel for the Route.", + "type": "string", + "minLength": 0 + }, + "localOnly": { + "description": "A boolean to indicate if the Route should be added to the LOCAL_ONLY partition. 'Across Network' clusters in AWS require this partition to be configured.", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false, + "anyOf": [ + { + "required": ["class", "gw"] + }, + { + "required": ["class", "target"] + } + ] + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "RouteDomain" } } + }, + "then": { + "required": ["class", "id"], + "properties": { + "class": { + "description": "Indicates that this property contains Route Domain configuration.", + "type": "string", + "const": "RouteDomain" + }, + "id": { + "description": "Specifies a unique numeric identifier for the route domain.", + "type": "integer", + "minimum": 0, + "maximum": 65534 + }, + "parent": { + "description": "Specifies the route domain the system searches when it cannot find a route in the configured domain.", + "type": "string" + }, + "bandWidthControllerPolicy": { + "description": "Specifies the bandwidth controller policy for the route domain.", + "type": "string" + }, + "connectionLimit": { + "description": "The connection limit for the route domain.", + "type": "integer", + "minimum": 0, + "maximum": 4294967295, + "default": 0 + }, + "flowEvictionPolicy": { + "description": "Specifies a flow eviction policy for the route domain to use.", + "type": "string" + }, + "ipIntelligencePolicy": { + "description": "Specifies an IP intelligence policy for the route domain to use.", + "type": "string" + }, + "enforcedFirewallPolicy": { + "description": "Specifies an enforced firewall policy on the route domain.", + "type": "string" + }, + "stagedFirewallPolicy": { + "description": "Specifies a staged firewall policy on the route domain.", + "type": "string" + }, + "securityNatPolicy": { + "description": "Specifies the security NAT policy for the route domain.", + "type": "string" + }, + "servicePolicy": { + "description": "Specifies the service policy for the route domain.", + "type": "string" + }, + "strict": { + "description": "Determines whether a connection can span route domains.", + "type": "boolean", + "default": true + }, + "routingProtocols": { + "description": "Specifies routing protocols for the system to use in the route domain.", + "type": "array", + "items": { + "type": "string", + "enum": ["BFD", "BGP", "IS-IS", "OSPFv2", "OSPFv3", "PIM", "RIP", "RIPng"] + } + }, + "vlans": { + "description": "Specifies VLANS for the system to use in the route domain.", + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "DagGlobals" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains DAG Globals configuration.", + "type": "string", + "const": "DagGlobals" + }, + "icmpHash": { + "description": "Specifies ICMP hash for ICMP echo request and ICMP echo reply in SW DAG.", + "type": "string", + "enum": ["icmp", "ipicmp"], + "default": "icmp" + }, + "ipv6PrefixLength": { + "description": "Specifies whether SPDAG or IPv6 prefix DAG should be used to disaggregate IPv6 traffic when vlan cmp hash is set to src-ip or dst-ip.", + "type": "integer", + "default": 128, + "minimum": 0, + "maximum": 128 + }, + "roundRobinMode": { + "description": "Specifies whether the round robin disaggregator (DAG) on a blade can disaggregate packets to all the TMMs in the system or only to the TMMs local to the blade.", + "type": "string", + "enum": ["global", "local"], + "default": "global" + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "Tunnel" } } + }, + "then": { + "required": ["class", "tunnelType"], + "properties": { + "class": { + "description": "Indicates that this property contains Tunnel configuration.", + "type": "string", + "const": "Tunnel" + }, + "remark": { + "$ref": "definitions.schema.json#/definitions/Remark" + }, + "tunnelType": { + "description": "Specifies the profile that you want to associate with the Tunnel. Note: As of 1.36.0, when creating a VXLAN Tunnel, accept-ip-options in traffic controls will no longer default to true. Instead it will remain the same or be set to the value in the declaration.", + "type": "string", + "enum": ["geneve", "gre", "tcp-forward", "vxlan"] + }, + "mtu": { + "description": "Specifies the maximum transmission unit of the Tunnel.", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "usePmtu": { + "description": "Enable or disable the Tunnel to use Path MTU information provided by ICMP NeedFrag error messages.", + "type": "boolean", + "default": true + }, + "typeOfService": { + "description": "Specifies a value for insertion into the Type of Service octet within the IP header of the encapsulating header of transmitted packets.", + "oneOf": [ + { + "type": "string", + "enum": ["preserve"] + }, + { + "type": "integer", + "minimum": 0, + "maximum": 255 + } + ], + "default": "preserve" + }, + "autoLastHop": { + "description": "Specifies that packets are returned to the MAC address from which they were sent when enabled. The default setting specifies that the system uses the default route to send back the request.", + "type": "string", + "enum": [ + "default", + "enabled", + "disabled" + ], + "default": "default" + }, + "key": { + "description": "When applied to a GRE tunnel, this value specifies an optional field in the GRE header, used to authenticate the source of the packet. When applied to a VXLAN or Geneve tunnel, this value specifies the Virtual Network Identifier (VNI). When applied to an NVGRE tunnel, this value specifies the Virtual Subnet Identifier (VSID).", + "type": "integer", + "minimum": 0, + "default": 0 + }, + "localAddress": { + "description": "Specifies the IP address of the local endpoint of the tunnel.", + "type": "string", + "anyOf": [ + { "enum": ["any", "any6"] }, + { "format": "f5ip" } + ], + "default": "any6" + }, + "remoteAddress": { + "description": "Specifies the IP address of the remote endpoint of the tunnel.", + "type": "string", + "anyOf": [ + { "enum": ["any", "any6"] }, + { "format": "f5ip" } + ], + "default": "any6" + }, + "secondaryAddress": { + "description": "Specifies a non-floating IP address for the tunnel, to be used with host-initiated traffic.", + "type": "string", + "anyOf": [ + { "enum": ["any", "any6"] }, + { "format": "f5ip" } + ], + "default": "any6" + }, + "mode": { + "description": "Specifies how the tunnel carries traffic.", + "type": "string", + "enum": ["bidirectional", "inbound", "outbound"], + "default": "bidirectional" + }, + "transparent": { + "description": "Specifies that the tunnel operates in transparent mode. When enabled, you can inspect and manipulate the encapsulated traffic flowing through the BIG-IP system.", + "type": "boolean", + "default": false + }, + "trafficGroup": { + "description": "Specifies the traffic group to associate with the tunnel.", + "type": "string", + "default": "none" + } + }, + "allOf": [ + { + "if": { + "required": ["transparent", "trafficGroup"], + "properties": { "transparent": { "const": true } } + }, + "then": { + "properties": { + "trafficGroup": { "const": "none" } + } + } + }, + { + "if": { + "required": ["tunnelType"], + "properties": { "tunnelType": { "const": "geneve" } } + }, + "then": { + "properties": { + "mode": { "const": "bidirectional" }, + "remoteAddress": { "enum": ["any", "any6"] } + } + } + }, + { + "if": { + "required": ["tunnelType"], + "properties": { "tunnelType": { "const": "vxlan" } } + }, + "then": { + "properties": { + "defaultsFrom": { + "description": "Specifies the existing profile from which the system imports settings for the new profile. Default value is vxlan. Can NOT default from itself.", + "type": "string", + "default": "vxlan" + }, + "port": { + "description": "Specifies the local port for receiving VXLAN packets. The default is 4789.", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 4789 + }, + "floodingType": { + "description": "Specifies the flooding type to use to transmit multicast, broadcast, and unknown destination frames. The default is multicast.", + "type": "string", + "enum": ["none", "multicast", "multipoint", "replicator"], + "default": "multicast" + }, + "encapsulationType": { + "description": "Specifies whether the VXLAN header is formatted according to RFC 7348 (vxlan) or with the Generic Protocol Extension (vxlan-gpe). The default is vxlan.", + "type": "string", + "enum": ["vxlan", "vxlan-gpe"], + "default": "vxlan" + } + } + } + } + ] + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "RoutingAsPath" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains routing AS path configuration.", + "type": "string", + "const": "RoutingAsPath" + }, + "entries": { + "description": "An array that holds action and regex objects", + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "integer", + "description": "Name of the entity" + }, + "regex": { + "type": "string", + "description": "A regex string" + } + }, + "required": ["name", "regex"], + "additionalProperties": false + }, + "default": [] + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "RoutingAccessList" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains routing access list configuration.", + "type": "string", + "const": "RoutingAccessList" + }, + "label": { + "$ref": "definitions.schema.json#/definitions/Label" + }, + "remark": { + "$ref": "definitions.schema.json#/definitions/Remark" + }, + "entries": { + "description": "An array that holds sources and destinations.", + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "integer", + "description": "Name of the entity identified as an integer" + }, + "action": { + "type": "string", + "description": "Permit or deny access", + "enum": [ + "permit", + "deny" + ] + }, + "destination": { + "description": "IPv4 or IPv6 address or address range. Specify either [address] or [address/prefixlength].", + "type": "string", + "format": "ipWithOptionalPrefix", + "default": "::" + }, + "exactMatchEnabled": { + "description": "Perform exact matching. A single entry with exactMatchEnabled true disallows any entry to have a non-default destination.", + "type": "boolean", + "default": false + }, + "source": { + "description": "IPv4 or IPv6 address or address range. Specify either [address] or [address/prefixlength].", + "type": "string", + "format": "ipWithOptionalPrefix", + "default": "::" + } + }, + "required": ["name", "action"], + "additionalProperties": false + }, + "default": [] + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "RoutingPrefixList" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains routing prefix list configuration.", + "type": "string", + "const": "RoutingPrefixList" + }, + "entries": { + "description": "An array that holds action, prefix, and prefixLengthRange.", + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "integer", + "description": "Name of the entity" + }, + "action": { + "type": "string", + "description": "An action to take", + "enum": [ + "permit", + "deny" + ] + }, + "prefix": { + "type": "string", + "description": "Address with prefix length [address/prefix length]", + "format": "ipWithRequiredPrefix", + "default": "::/0" + }, + "prefixLengthRange": { + "type": "string", + "description": "Prefix length range. Examples: Specify '1:32' for greater than or equal to 1 and less than or equal to 32. Specify '1:' for greater than or equal to 1. Specify ':32' for less than or equal to 32. Specify '32' for equal to 32. Must be 0 or greater than the length on the prefix property.", + "pattern": "^\\d*:?\\d*$", + "default": "0" + } + }, + "required": ["name", "action"], + "additionalProperties": false + }, + "default": [] + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "RouteMap" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains route map configuration.", + "type": "string", + "const": "RouteMap" + }, + "entries": { + "description": "An array that holds action to take when corresponding entries are matched.", + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "description": "Name of the entity", + "type": "integer" + }, + "action": { + "description": "An action to take", + "type": "string", + "enum": [ + "permit", + "deny" + ] + }, + "match": { + "description": "AS path and addresses to match", + "type": "object", + "properties": { + "asPath": { + "description": "RoutingAsPath to match. Defines a BGP AS path access list.", + "type": "string" + }, + "ipv4": { + "description": "IPv4 to match", + "type": "object", + "properties": { + "address": { + "description": "IPv4 addresses to match", + "type": "object", + "properties": { + "prefixList": { + "description": "RoutingPrefixList to match", + "type": "string" + } + }, + "default": {} + }, + "nextHop": { + "description": "IPv4 next hops to match", + "type": "object", + "properties": { + "prefixList": { + "description": "RoutingPrefixList to match", + "type": "string" + } + }, + "default": {} + } + }, + "default": { + "address": {}, + "nextHop": {} + }, + "additionalProperties": false + }, + "ipv6": { + "description": "IPv6 to match", + "type": "object", + "properties": { + "address": { + "description": "IPv6 addresses to match", + "type": "object", + "properties": { + "prefixList": { + "description": "RoutingPrefixList to match", + "type": "string" + } + }, + "default": {} + }, + "nextHop": { + "description": "IPv6 next hops to match", + "type": "object", + "properties": { + "prefixList": { + "description": "RoutingPrefixList to match", + "type": "string" + } + }, + "default": {} + } + }, + "default": { + "address": {}, + "nextHop": {} + }, + "additionalProperties": false + } + }, + "default": { + "ipv4": { + "address": {}, + "nextHop": {} + }, + "ipv6": { + "address": {}, + "nextHop": {} + } + }, + "additionalProperties": false + } + }, + "required": ["name", "action"], + "additionalProperties": false + }, + "default": [] + }, + "routeDomain": { + "description": "Specifies the name of the route domain used by the route map", + "type": "string", + "default": "0" + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "RoutingBGP" } } + }, + "then": { + "required": ["class", "localAS"], + "properties": { + "class": { + "description": "Indicates that this property contains Border Gateway Protocol configuration.", + "type": "string", + "const": "RoutingBGP" + }, + "localAS": { + "description": "Local Autonomous System. After the RoutingBGP has been created this value cannot be modified.", + "type": "integer", + "minimum": 1, + "maximum": 4294967295 + }, + "addressFamilies": { + "description": "Address family", + "type": "array", + "items": { + "type": "object", + "required": ["internetProtocol"], + "properties": { + "internetProtocol": { + "description": "Address family. The value 'all' sets both 'ipv4' and 'ipv6' to the 'all' values.", + "type": "string", + "enum": ["ipv4", "ipv6", "all"] + }, + "redistributionList": { + "description": "Redistribution list", + "type": "array", + "items": { + "type": "object", + "required": ["routingProtocol"], + "properties": { + "routingProtocol": { + "description":"Routing protocol", + "type": "string", + "enum": ["connected", "isis", "kernel", "ospf", "rip", "static"] + }, + "routeMap": { + "description": "Route map", + "type": "string" + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + }, + "gracefulRestart": { + "description": "Graceful restart", + "type": "object", + "properties": { + "gracefulResetEnabled": { + "description": "Graceful reset capability", + "type": "boolean", + "default": false + }, + "restartTime": { + "description": "Maximum time needed for neighbor(s) to restart (seconds)", + "type": "integer", + "default": 0, + "minimum": 0, + "maximum": 3600 + }, + "stalePathTime": { + "description": "Maximum time to retain stale paths from restarting neighbor(s) (seconds)", + "type": "integer", + "default": 0, + "minimum": 0, + "maximum": 3600 + } + }, + "default": { + "gracefulResetEnabled": false, + "restartTime": 0, + "stalePathTime": 0 + }, + "additionalProperties": false + }, + "holdTime": { + "description": "Globally set or reset the hold time for all of the neighbors. The holdTime must be either 0 or at least 3 times keepAlive", + "type": "integer", + "default": 90, + "minimum": 0, + "maximum": 65535 + }, + "keepAlive": { + "description": "Globally set or reset the keep alive for all of the neighbors", + "type": "integer", + "default": 30, + "minimum": 0, + "maximum": 65535 + }, + "neighbors": { + "description": "Neighbors", + "type": "array", + "items": { + "type": "object", + "required": ["address", "peerGroup"], + "properties": { + "address": { + "description": "Name", + "type": "string", + "format": "f5ip" + }, + "ebgpMultihop": { + "description": "Allow external BGP members not on directly connected networks", + "type": "integer", + "minimum": 1, + "maximum": 255, + "default": 1 + }, + "peerGroup": { + "description": "Peer group", + "type": "string" + } + }, + "additionalProperties": false + }, + "default": [] + }, + "peerGroups": { + "description": "Peer group", + "type": "array", + "items": { + "description": "Peer groups member", + "type": "object", + "required": ["name"], + "properties": { + "name": { + "description": "Name", + "type": "string" + }, + "addressFamilies": { + "description": "Address family", + "type": "array", + "items": { + "type": "object", + "required": ["internetProtocol"], + "properties": { + "internetProtocol": { + "description": "Address family", + "type": "string", + "enum": ["ipv4", "ipv6"] + }, + "softReconfigurationInboundEnabled": { + "description": "Soft reconfiguration inbound enabled", + "type": "boolean", + "default": false + }, + "routeMap": { + "description": "Route maps", + "type": "object", + "properties": { + "in": { + "description": "Incoming route map", + "type": "string" + }, + "out": { + "description": "Outgoing route map", + "type": "string" + } + }, + "default": {}, + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "remoteAS": { + "description": "Remote Autonomous System", + "type": "integer", + "default": 0 + } + }, + "additionalProperties": false + }, + "default": [] + }, + "routeDomain": { + "description": "Specifies the name of the route domain used by the routing bgp", + "type": "string", + "default": "0" + }, + "routerId": { + "description": "Manually override current router identifier (peers will reset)", + "type": "string", + "default": "any6" + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "ManagementIpFirewall" } } + }, + "then": { "$ref": "#/definitions/managementIpFirewall" } + } + ], + "definitions": { + "firewallPolicy": { + "description": "Configures firewall policy", + "type": "object", + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains firewall policy configuration", + "type": "string", + "const": "FirewallPolicy" + }, + "label": { + "$ref": "definitions.schema.json#/definitions/Label" + }, + "remark": { + "$ref": "definitions.schema.json#/definitions/Remark" + }, + "rules": { + "description": "Specifies the list of firewall policy rules", + "type": "array", + "items": { "$ref": "#/definitions/firewallRulePolicy" } + } + }, + "additionalProperties": false + }, + "firewallAddressList": { + "title": "Firewall Address List", + "description": "Declares an address-list for use by firewall rules. An address list is a list of IP-address prefixes to compare against the source-IP address and/or destination-IP address in an IP packet", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "FirewallAddressList" + }, + "label": { + "$ref": "definitions.schema.json#/definitions/Label" + }, + "remark": { + "$ref": "definitions.schema.json#/definitions/Remark" + }, + "addresses": { + "type": "array", + "description": "A list of IPv4 and IPv6 addresses and address ranges. You can specify a network with CIDR slash notation.", + "items": { + "type": "string" + }, + "minItems": 1 + }, + "fqdns": { + "type": "array", + "description": "A list of fully qualified domain names.", + "items": { + "type": "string", + "format": "hostname" + }, + "minItems": 1 + }, + "geo": { + "type": "array", + "description": "A list of geographic locations (for example, US:Washington).", + "items": { + "type": "string" + }, + "minItems": 1 + } + }, + "additionalProperties": false, + "required": [ + "class" + ], + "anyOf": [ + { + "required": [ + "addresses" + ] + }, + { + "required": [ + "fqdns" + ] + }, + { + "required": [ + "geo" + ] + } + ] + }, + "firewallPortList": { + "title": "Firewall Port List", + "description": "Declares a port-list for use by firewall rules. A firewall rule can match a packet's source port or destination port against one of the ports in a port list, and can take some action (such as ACCEPT or DROP) for a matching packet.", + "type": "object", + "f5modules": [ + "afm" + ], + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "FirewallPortList" + }, + "label": { + "$ref": "definitions.schema.json#/definitions/Label" + }, + "remark": { + "$ref": "definitions.schema.json#/definitions/Remark" + }, + "ports": { + "type": "array", + "description": "A list of ports and port ranges (for example, 80, \"8080-8090\").", + "items": { + "type": [ + "integer", + "string" + ] + }, + "minItems": 1 + } + }, + "additionalProperties": false, + "required": [ + "class", + "ports" + ] + }, + "firewallRuleCore": { + "description": "Configures a firewall rule.", + "type": "object", + "required": ["name", "action"], + "properties": { + "name": { + "type": "string", + "description": "Specifies the name of the firewall rule" + }, + "label": { + "$ref": "definitions.schema.json#/definitions/Label" + }, + "remark": { + "$ref": "definitions.schema.json#/definitions/Remark" + }, + "action": { + "description": "Specifies the action that the firewall rule will take on matching packets", + "type": "string", + "enum": [ + "accept", + "drop", + "accept-decisively", + "reject" + ] + }, + "protocol": { + "description": "Specifies the protocol to which the firewall rule applies", + "type": "string", + "enum": [ + "any", + "tcp", + "udp" + ], + "default": "any" + }, + "source": { + "$ref": "#/definitions/firewallRuleSourceCore" + }, + "destination": { + "$ref": "#/definitions/firewallRuleDestinationCore" + }, + "loggingEnabled": { + "description": "Specifies whether the system enables or disables logging for the firewall rule", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "firewallRulePolicy": { + "type": "object", + "allOf": [ + { "$ref": "#/definitions/firewallRuleCore" }, + { + "properties": { + "source": { "$ref": "#/definitions/firewallRuleSourcePolicy" } + } + } + ] + }, + "firewallRuleSourceCore": { + "description": "Configures the packet sources to which the network firewall rule applies", + "type": "object", + "properties": { + "addressLists": { + "type": "array", + "description": "Specifies a list of address lists against which the packet will be compared.", + "items": { + "type": "string" + }, + "additionalProperties": false + }, + "portLists": { + "type": "array", + "description": "Specifies a list of port lists against which the packet will be compared.", + "items": { + "type": "string" + }, + "additionalProperties": false + } + } + }, + "firewallRuleSourcePolicy": { + "type": "object", + "allOf": [ + { "$ref": "#/definitions/firewallRuleSourceCore" }, + { + "type": "object", + "properties": { + "vlans": { + "type": "array", + "description": "Specifies a list of VLANs against which the packets will be compared", + "items": { + "type": "string" + }, + "additionalProperties": false + } + } + } + ] + }, + "firewallRuleDestinationCore": { + "description": "Configures the packet destination to which the network firewall rule applies", + "type": "object", + "properties": { + "addressLists": { + "type": "array", + "description": "Specifies a list of address lists against which the packet will be compared.", + "items": { + "type": "string" + }, + "additionalProperties": false + }, + "portLists": { + "type": "array", + "description": "Specifies a list of port lists against which the packet will be compared.", + "items": { + "type": "string" + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "netAddressList": { + "title": "Network Address List", + "description": "Declares an address-list for use by management IP firewall rules. This property doesn't need an AFM to be provisioned. An address list is a list of IP-address prefixes to compare against the source-IP address and/or destination-IP address in an IP packet", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "NetAddressList" + }, + "remark": { + "$ref": "definitions.schema.json#/definitions/Remark" + }, + "addresses": { + "type": "array", + "description": "A list of IPv4 and IPv6 addresses and address ranges. You can specify a network with CIDR slash notation.", + "items": { + "type": "string" + }, + "minItems": 1 + } + }, + "additionalProperties": false, + "required": [ + "class", + "addresses" + ] + }, + "netPortList": { + "title": "Network Port List", + "description": "Declares a port-list for use by management IP firewall rules. This property doesn't need an AFM to be provisioned. A firewall rule can match a packet's source port or destination port against one of the ports in a port list, and can take some action (such as ACCEPT or DROP) for a matching packet.", + "type": "object", + "properties": { + "class": { + "title": "Class", + "type": "string", + "const": "NetPortList" + }, + "remark": { + "$ref": "definitions.schema.json#/definitions/Remark" + }, + "ports": { + "type": "array", + "description": "A list of ports and port ranges (for example, 80, \"8080-8090\").", + "items": { + "type": [ + "integer", + "string" + ] + }, + "minItems": 1 + } + }, + "additionalProperties": false, + "required": [ + "class", + "ports" + ] + }, + "managementIpFirewall": { + "description": "Configures the management IP firewall", + "type": "object", + "required": ["class"], + "properties": { + "class": { + "description": "Indicates this property contains management IP firewall configuration.", + "type": "string", + "const": "ManagementIpFirewall" + }, + "label": { + "$ref": "definitions.schema.json#/definitions/Label" + }, + "remark": { + "$ref": "definitions.schema.json#/definitions/Remark" + }, + "rules": { + "description": "Specifies the list of firewall rules", + "type": "array", + "items": { "$ref": "#/definitions/firewallRuleCore" } + } + }, + "additionalProperties": false + } + } +} diff --git a/src/schema/1.37.0/openapi.yaml b/src/schema/1.37.0/openapi.yaml new file mode 100644 index 00000000..8b292232 --- /dev/null +++ b/src/schema/1.37.0/openapi.yaml @@ -0,0 +1,590 @@ +openapi: 3.0.3 +info: + title: F5 BIG-IP Declarative Onboarding + description: This reference describes the BIG-IP DO API and available endpoints. For more details, see https://clouddocs.f5.com/products/extensions/f5-declarative-onboarding/latest/using-do.html. + version: 1.37.0 + contact: + name: BIG-IP Declarative Onboarding + email: solutionsfeedback@f5.com + url: 'https://github.com/F5Networks/f5-declarative-onboarding' + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0.html' +servers: + - url: https://192.0.2.1:443/mgmt/shared/declarative-onboarding +paths: + /: + get: + summary: Get status of configuration request + description: Retrieve the status of the most recently deployed configuration request. + operationId: getMostRecentTask + tags: + - Configuration + parameters: + - name: show + in: query + required: false + description: Retrieve original and current configuration. + schema: + type : string + enum: + - full + - name: statusCodes + in: query + required: false + description: | + Determines how BIG-IP DO returns HTTP status codes. + - *legacy*: Returns any errors as the HTTP status. + - *experimental*: Returns a 200 HTTP status code unless there is an actual error with the request. The result in the body of the response contains the status of the task. + schema: + type : string + enum: + - legacy + - experimental + default: legacy + responses: + 200: + description: Configuration was successful. + content: + application/json: + schema: + $ref: '#/components/schemas/task' + examples: + success: + value: + $ref: '#/components/examples/task' + failure: + value: + $ref: '#/components/examples/errorConfig' + 500: + $ref: '#/components/responses/500' + post: + summary: Apply BIG-IP DO configuration + description: Configure the device per the declaration. + operationId: postDeclaration + tags: + - Configuration + requestBody: + description: BIG-IP DO Declaration. + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/device' + responses: + 200: + description: Successful synchronous response. + content: + application/json: + schema: + $ref: '#/components/schemas/task' + example: + $ref: '#/components/examples/task' + 202: + description: Successful asynchronous response. + content: + application/json: + schema: + $ref: '#/components/schemas/task' + example: + id: 'c098f4f1-d2a4-4c53-8728-7d1ce5567a4a' + result: + class: Result, + code: 202, + status: RUNNING, + dryRun: false, + message: processing + declaration: + class: Device + schemaVersion: 1.0.0 + async: true + Common: + class: Tenant + myLicense: + class: License + licenseType: regKey + regKey: AAAAA-BBBBB-CCCCC-DDDDD-EEEEEEE + selfLink: 'https://localhost/mgmt/shared/appsvcs/task/c098f4f1-d2a4-4c53-8728-7d1ce5567a4' + 422: + description: Error while applying config. + content: + application/json: + schema: + $ref: '#/components/schemas/task' + example: + $ref: '#/components/examples/errorConfig' + 500: + $ref: '#/components/responses/500' + /config: + get: + summary: Return all original configurations + description: Retrieve the original configuration of all devices. + operationId: getAllConfigs + tags: + - Configuration + responses: + 200: + description: Retrieval was successful. + content: + application/json: + schema: + type: array + items: + allOf: + - $ref: '#/components/schemas/config' + 500: + $ref: '#/components/responses/500' + /config/{machineId}: + get: + summary: Return original configuration by machine ID + description: Retrieve the original configuration of a device by machine ID. + operationId: getConfig + tags: + - Configuration + parameters: + - name: machineId + in: path + required: true + description: The machine ID that is returned by the /shared/identified-devices/config/device-info endpoint. + schema: + type : string + format: uuid + responses: + 200: + description: Retrieval was successful. + content: + application/json: + schema: + $ref: '#/components/schemas/config' + 404: + $ref: '#/components/responses/404' + 500: + $ref: '#/components/responses/500' + delete: + summary: Delete the stored original configuration by config ID + description: Delete the stored original configuration by config ID. This can be used in some cases when BIG-IP DO has gotten into an unusable state. + operationId: deleteConfig + tags: + - Configuration + parameters: + - name: configId + in: path + required: true + description: The config ID that was returned by a GET to /config + schema: + type : string + format: uuid + responses: + 200: + description: Delete was successful. + content: + application/json: + schema: + type: array + example: + [] + 404: + $ref: '#/components/responses/404' + 500: + $ref: '#/components/responses/500' + /info: + get: + summary: /mgmt/shared/appsvcs/info + tags: + - Information + description: | + This returns version and release information for the instance of BIG-IP DO you are using. + It also shows current and minimum required versions of the BIG-IP DO schema. + responses: + 200: + description: Successful response. + content: + application/json: + schema: + type: object + properties: + id: + type: integer + enum: + - 0 + selfLink: + type: string + format: uri + result: + $ref: '#/components/schemas/result' + version: + type: string + description: The version of BIG-IP DO. + release: + type: string + description: The build number of the current version. + schemaCurrent: + type: string + description: The maximum schema version supported. + schemaMinimum: + type: string + description: The minimum schema version supported. + example: + id: 0 + selfLink: https://localhost/mgmt/shared/declarative-onboarding/info, + result: + class: Result, + code: 200, + status: OK, + message: "" + errors: [] + version: 1.30.0 + release: 2 + schemaCurrent: 1.30.0 + schemaMinimum: 1.0.0 + 500: + $ref: '#/components/responses/500' + /inspect: + get: + summary: Return current configuration + description: Retrieve the current configuration of a device. + operationId: getInspect + tags: + - Inspect + parameters: + - name: targetHost + in: query + required: false + description: The IP address or domain name of the host from which to retrieve the current configuration. + schema: + type : string + default: localhost + - name: targetPort + in: query + required: false + description: The port that is used with the targetHost to establish a connection to the device. By default, BIG-IP DO tries to establish a connection to the device using ports 443 and 8443. + schema: + type : integer + minimum: 0 + maximum: 65535 + - name: targetUsername + in: query + required: false + description: The username for the targetHost. + schema: + type : string + default: admin + - name: targetPassword + in: query + required: false + description: The password for the targetHost. + schema: + type : string + default: admin + responses: + 200: + description: Retrieval was successful. + content: + application/json: + schema: + $ref: '#/components/schemas/inspect' + 500: + $ref: '#/components/responses/500' + /task: + get: + summary: Return status of all configurations + description: Retrieve the status of all previously deployed configurations. + operationId: getAllTasks + tags: + - Task + responses: + 200: + description: Retrieval was successful. + content: + application/json: + schema: + type: array + items: + allOf: + - $ref: '#/components/schemas/task' + example: + $ref: '#/components/examples/task' + + 500: + $ref: '#/components/responses/500' + /task/{taskId}: + get: + summary: Return status of configuration by task ID + description: Retrieve the status of a previously deployed configuration by task ID. + operationId: getTask + tags: + - Task + parameters: + - name: taskId + in: path + required: true + description: The task ID. + schema: + type : string + format: uuid + responses: + 200: + description: Retrieval was successful. + content: + application/json: + schema: + $ref: '#/components/schemas/task' + examples: + success: + value: + $ref: '#/components/examples/task' + failure: + value: + $ref: '#/components/examples/errorConfig' + 404: + $ref: '#/components/responses/404' + 500: + $ref: '#/components/responses/500' +components: + schemas: + config: + title: Config + description: The original configuration of a device. + type: object + allOf: + - properties: + id: + type: string + format: uuid + selfLink: + type: string + format: uri + result: + $ref: '#/components/schemas/result' + - $ref: '#/components/schemas/configObject' + configObject: + title: Config Object + type: object + properties: + Common: + type: object + description: A collection of sub-objects that describe the configuration state of a device. + additionalProperties: true + errorConfig: + title: BIG-IP DO Processing Error + description: An error response caused by attempting to apply invalid config. + type: object + properties: + id: + description: Unique ID for task. + type: string + format: uuid + selfLink: + description: URI at which to fetch task on the device. + type: string + format: uri + code: + type: integer + enum: + - 422 + - 500 + status: + type: string + enum: + - ERROR + message: + type: string + errors: + type: array + items: + type: string + result: + $ref: '#/components/schemas/result' + declaration: + $ref: '#/components/schemas/device' + errorProcessing: + title: Bad declaration Error + description: An error response caused by a bad parameter or bad declaration. + type: object + properties: + code: + type: integer + message: + type: string + referer: + type: string + format: ipv4 + restOperationId: + type: integer + kind: + type: string + enum: + - ':resterrorresponse' + device: + $ref: base.schema.json + inspect: + title: Inspect + description: The current configuration of a device. + type: object + properties: + id: + type: string + format: uuid + selfLink: + type: string + format: uri + result: + $ref: '#/components/schemas/result' + declaration: + type: object + properties: + class: + type: string + enum: + - DO + declaration: + $ref: '#/components/schemas/device' + result: + title: Result + description: Standard result object in responses. + type: object + properties: + class: + type: string + enum: + - Result + code: + description: Status code. + type: integer + status: + description: Status string. + type: string + enum: + - OK + - ERROR + - ROLLING_BACK + - RUNNING + - REBOOTING + - REVOKING + message: + description: Overall result message. + type: string + errors: + description: Array of errors that occurred. + type: array + items: + type: string + task: + title: Task + description: The configuration status and associated declaration. + type: object + properties: + id: + description: Unique ID for task. + type: string + format: uuid + selfLink: + description: URI at which to fetch task on the device. + type: string + format: uri + message: + description: Overall result message. + type: string + errors: + description: Array of errors that occurred. + type: array + items: + type: string + result: + $ref: '#/components/schemas/result' + declaration: + $ref: '#/components/schemas/device' + currentConfig: + $ref: '#/components/schemas/configObject' + originalConfig: + $ref: '#/components/schemas/configObject' + examples: + errorConfig: + id: c098f4f1-d2a4-4c53-8728-7d1ce5567a4 + selfLink: 'https://localhost/mgmt/shared/appsvcs/task/c098f4f1-d2a4-4c53-8728-7d1ce5567a4' + code: 422 + status: ERROR + message: 'Error licensing: Invalid reg key' + errors: + - 'Invalid reg key' + result: + class: Result + code: 422 + status: ERROR + dryRun: false + message: 'Error licensing: Invalid reg key' + errors: + - 'Invalid reg key' + declaration: + class: Device + schemaVersion: 1.0.0 + async: true + Common: + class: Tenant + myLicense: + class: License + licenseType: regKey + regKey: AAAAA-BBBBB-CCCCC-DDDDD-EEEEEEE + errorNotFound: + code: 404, + message: 'java.net.ProtocolException: status:404, body:b1994382-8b2d-46c1-9e1b-44bd08925e7b does not exist' + referer: 172.18.6.16 + restOperationId: 46740167 + kind: :resterrorresponse + errorProcessing: + code: 400 + message: 'java.net.ProtocolException: status:400, body:DELETE is only supported for the config endpoint' + referer: '192.168.0.1' + restOperationId: 12345678 + kind: ':resterrorresponse' + task: + id: c098f4f1-d2a4-4c53-8728-7d1ce5567a4 + selfLink: 'https://localhost/mgmt/shared/appsvcs/task/c098f4f1-d2a4-4c53-8728-7d1ce5567a4' + result: + class: Result + code: 200 + status: OK + message: success + declaration: + class: Device + schemaVersion: 1.0.0 + async: true + Common: + class: Tenant + myLicense: + class: License + licenseType: regKey + regKey: AAAAA-BBBBB-CCCCC-DDDDD-EEEEEEE + responses: + 404: + description: ID not found. + content: + application/json: + schema: + title: 404 + description: Not found. + type: object + properties: + code: + type: integer + enum: + - 404 + message: + type: string + referer: + type: string + format: ipv4 + restOperationId: + type: integer + kind: + type: string + example: + $ref: '#/components/examples/errorNotFound' + 500: + description: Something went wrong internally and a bug report should be filed: https://github.com/F5Networks/f5-declarative-onboarding/issues/new/choose. + content: + application/json: + schema: + $ref: '#/components/schemas/errorProcessing' + example: + $ref: '#/components/examples/errorProcessing' diff --git a/src/schema/1.37.0/remote.schema.json b/src/schema/1.37.0/remote.schema.json new file mode 100644 index 00000000..37316c82 --- /dev/null +++ b/src/schema/1.37.0/remote.schema.json @@ -0,0 +1,202 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/remote.schema.json", + "title": "F5 BIG-IP Declarative Onboarding request declaration", + "description": "Wrapper for remote onboarding of a BIG-IP device using F5 BIG-IP Declarative Onboarding", + "type": "object", + "required": ["class", "declaration"], + "if": { + "required": ["targetPassphrase"] + }, + "then": { + "dependencies": { + "targetSshKey": { + "not": {} + } + } + }, + "else": { + "if": { + "required": ["targetSshKey"] + }, + "then": { + "dependencies": { + "targetPassphrase": { + "not": {} + } + } + } + }, + "properties": { + "class": { + "description": "Indicates that this is a BIG-IP Declarative Onboarding request", + "type": "string", + "const": "DO" + }, + "$schema": { + "description": "URL of schema against which to validate. Used by validation in your local environment only (via Visual Studio Code, for example)", + "type": "string", + "format": "uri" + }, + "targetHost": { + "description": "Hostname or IP address of ADC to which request applies (default localhost)", + "type": "string", + "anyOf": [ + { "format": "ipv4" }, + { "format": "ipv6" }, + { "format": "hostname" } + ], + "default": "localhost" + }, + "targetPort": { + "description": "TCP port number of management service on targetHost; default 0 means try common ports", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "targetUsername": { + "description": "Username of principal authorized to modify configuration of targetHost (may not include the character ':'). NOTE: this is generally not required to configure 'localhost' because client authentication and authorization precede invocation of BIG-IP DO. It is also not required for any targetHost if you populate targetTokens", + "type": "string", + "anyOf": [ + { "format": "json-pointer" }, + { "pattern": "^[^:]{0,254}$" } + ] + }, + "targetPassphrase": { + "description": "Passphrase for targetUsername account. This is generally not required to configure 'localhost' and is not required when you populate targetTokens", + "type": "string", + "anyOf": [ + { "format": "json-pointer" }, + { "pattern": "^.{0,254}$" } + ] + }, + "targetSshKey": { + "description": "Private key for use in ssh operations. Corresponding public key must be in the targetUsername's ~/.ssh/authorized_keys file on the targetHost. This is only used to do initial account creation in environments where that is necessary. If this value is present, BIG-IP DO will look in the declaration for a user matching targetUsername and set its password via ssh.", + "type": "object", + "required": ["path"], + "properties": { + "path": { + "description": "Full path to private ssh key. File must be owned by restnoded.", + "type": "string" + } + }, + "additionalProperties": false + }, + "targetTokens": { + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "oneOf": [ + { + "description": "Pointer to tokens in a format that matches the 'object' schema below", + "type": "string", + "anyOf": [ + { "format": "json-pointer" } + ] + }, + { + "type": "object", + "patternProperties": { + "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { + "type": "string", + "pattern": "^[^\\x00-\\x1f\\x7f-\\xff]{0,8192}$" + } + }, + "additionalProperties": false + } + ] + }, + "targetTimeout": { + "description": "Maximum delay allowed while communicating with targetHost device (seconds, default 900)", + "type": "integer", + "minimum": 1, + "maximum": 900, + "default": 900 + }, + "bigIqSettings": { + "description": "Settings for the management of a BIG-IP which is onboarded via a BIG-IQ.", + "type": "object", + "properties": { + "snapshotWorkingConfig": { + "description": "Whether or not to snapshot the working configuration for current device before the import.", + "type": "boolean", + "default": false + }, + "accessModuleProperties": { + "description": "Key/value properties for importing access module. If apm module is not listed in provision section of current declaration, BIG-IQ will only discover/import ltm module.", + "type": "object", + "propertyNames": { + "description": "The name of the access module property." + }, + "additionalProperties": { + "description": "The value to set for the access module property." + } + }, + "failImportOnConflict": { + "description": "Whether or not to fail import task on conflicts.", + "type": "boolean", + "default": false + }, + "conflictPolicy": { + "description": "Conflict policy for shared objects. For Access, a shared import will Accept/USE_BIGIP for all shared and device-specific objects.", + "type": "string", + "enum": ["NONE", "USE_BIGIP", "USE_BIGIQ", "KEEP_VERSION"] + }, + "deviceConflictPolicy": { + "description": "Conflict policy for device-specific objects. For Access, a device-specific import will Accept/USE_BIGIP for all device-specific objects. If value not provided the value will be the same as conflictPolicy.", + "type": "string", + "enum": ["NONE", "USE_BIGIP", "USE_BIGIQ", "KEEP_VERSION"] + }, + "versionedConflictPolicy": { + "description": "Conflict policy for version-specific objects. This is used for all the devices for which device specific versionedConflictPolicy is not specified. If value not provided the value will be the same as conflictPolicy.", + "type": "string", + "enum": ["NONE", "USE_BIGIP", "USE_BIGIQ", "KEEP_VERSION"] + }, + "clusterName": { + "description": "Cluster display name on BIG-IQ.", + "type": "string" + }, + "useBigiqSync": { + "description": "Instead of using the BIG-IP cluster sync to synchronize cluster devices configuration, use BIG-IQ to push changes to cluster devices during deployment.", + "type": "boolean" + }, + "deployWhenDscChangesPending": { + "description": "Deploy when there are pending DSC changes on BIG-IP.", + "type": "boolean" + }, + "statsConfig": { + "description": "Options for configuring http analytics/avr on BIG-IQ.", + "type": "object", + "required": ["enabled"], + "properties": { + "enabled": { + "description": "Whether or not to enable collecting statistics for this device", + "type": "boolean", + "default": false + }, + "zone": { + "description": "User-defined names that associate BIG-IP devices with one or more data collection device (DCD) systems to provide optimal routing for statistics traffic.", + "type": "string", + "default": "default" + } + } + } + }, + "allOf": [ + { + "if": { + "required": ["failImportOnConflict"], + "properties": { "failImportOnConflict": { "const": false }} + }, + "then": { + "required": ["conflictPolicy"] + } + } + ] + }, + "declaration": { + "description": "Declaration to deploy to targetHost", + "$ref": "base.schema.json#" + } + }, + "additionalProperties": false +} diff --git a/src/schema/1.37.0/security.schema.json b/src/schema/1.37.0/security.schema.json new file mode 100644 index 00000000..bb610f79 --- /dev/null +++ b/src/schema/1.37.0/security.schema.json @@ -0,0 +1,162 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/security.schema.json", + "title": "F5 BIG-IP Declarative Onboarding security declaration", + "description": "Security properties for onboarding a BIG-IP.", + "allOf": [ + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "SecurityAnalytics" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains SecurityAnalytics configuration.", + "type": "string", + "const": "SecurityAnalytics" + }, + "aclRules": { + "description": "Firewall (ACL) security statistics collection options.", + "type": "object", + "properties": { + "collectClientIpEnabled": { + "description": " Specifies whether source/client IP address should be collected for ACL rule matching.", + "type": "boolean", + "default": true + }, + "collectClientPortEnabled": { + "description": "Specifies whether source/client port should be collected for ACL rule matching.", + "type": "boolean", + "default": false + }, + "collectDestinationIpEnabled": { + "description": "Specifies whether the destination IP address should be collected for ACL rule matching.", + "type": "boolean", + "default": true + }, + "collectDestinationPortEnabled": { + "description": "Specifies whether the destination port should be collected for ACL rule matching.", + "type": "boolean", + "default": true + }, + "collectServerSideStatsEnabled": { + "description": "Specifies whether server side statistics (source address translation information, self IP address and pool member address) should be collected for ACL rule matching.", + "type": "boolean", + "default": false + } + } + }, + "collectAllDosStatsEnabled": { + "description": "Specifies whether to enable or disable the collection of all DoS statistics.", + "type": "boolean", + "default": false + }, + "collectedStatsExternalLoggingEnabled": { + "description": "Specifies whether to enable or disable external logging of collected statistics.", + "type": "boolean", + "default": false + }, + "collectedStatsInternalLoggingEnabled": { + "description": "Specifies whether to enable or disable internal logging of collected statistics.", + "type": "boolean", + "default": false + }, + "dns": { + "description": "DNS security statistics collection options.", + "type": "object", + "properties": { + "collectClientIpEnabled": { + "description": "Specifies whether source/client IP address should be collected for DNS security.", + "type": "boolean", + "default": true + }, + "collectDestinationIpEnabled": { + "description": "Specifies whether the destination IP address should be collected for DNS security.", + "type": "boolean", + "default": true + } + } + }, + "collectDnsStatsEnabled": { + "description": "Specifies whether to enable or disable DNS statistics collection.", + "type": "boolean", + "default": true + }, + "dosL2L4": { + "description": "Network DoS statistics collection options.", + "type": "object", + "properties": { + "collectClientIpEnabled": { + "description": "Specifies whether source/client IP address should be collected for network layer's DoS security.", + "type": "boolean", + "default": true + }, + "collectDestinationGeoEnabled": { + "description": "Specifies whether the destination geo should be collected for network layer's DoS security.", + "type": "boolean", + "default": true + } + } + }, + "collectDosL3StatsEnabled": { + "description": "Specifies whether to enable or disable the collection of DoS L3 statistics.", + "type": "boolean", + "default": true + }, + "collectFirewallAclStatsEnabled": { + "description": "Specifies whther to enable or disable the collection of firewall ACL statistics.", + "type": "boolean", + "default": true + }, + "collectFirewallDropsStatsEnabled": { + "description": "Specifies whether to enable or disable the collection of firewall drops statistics.", + "type": "boolean", + "default": true + }, + "collectIpReputationStatsEnabled": { + "description": "Specifies whether to enable or disable the collection of IP reputation statistics.", + "type": "boolean", + "default": true + }, + "l3L4Errors": { + "description": "Firewall errors statistics collection options.", + "type": "object", + "properties": { + "collectClientIpEnabled": { + "description": "Specifies whether source/client IP address should be collected for firewall errors.", + "type": "boolean", + "default": true + }, + "collectDestinationIpEnabled": { + "description": "Specifies whether the destination IP address should be collected for firewall errors.", + "type": "boolean", + "default": true + } + } + }, + "publisher": { + "description": "Specifies the external logging publisher used to send statistical data to one or more destinations.", + "type": "string" + }, + "collectSipStatsEnabled": { + "description": "Specifies whether to enable or disable the collection of SIP statistics.", + "type": "boolean", + "default": true + }, + "smtpConfig": { + "description": "Specifies the default SMTP configuration used for exporting CSV or PDF security analytics reports.", + "type": "string" + }, + "collectStaleRulesEnabled": { + "description": "Specifies whether statistics about all firewall rules should be collected in order to present information regarding rule staleness.", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + } + } + ] +} diff --git a/src/schema/1.37.0/system.schema.json b/src/schema/1.37.0/system.schema.json new file mode 100644 index 00000000..5c2d607d --- /dev/null +++ b/src/schema/1.37.0/system.schema.json @@ -0,0 +1,1457 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/system.schema.json", + "title": "F5 BIG-IP Declarative Onboarding system declaration", + "description": "System properties for onboarding a BIG-IP.", + "allOf": [ + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "DeviceCertificate" } } + }, + "then": { + "description": "PKI certificate with optional chain", + "required": ["class", "certificate"], + "allOf": [ + { + "properties": { + "class": { + "description": "Indicates that this property contains device certificate information", + "type": "string", + "const": "DeviceCertificate" + } + } + }, + { "$ref": "definitions.schema.json#/definitions/pkiCertificate" } + ] + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "License" } } + }, + "then": { + "oneOf": [ + { "$ref": "#/definitions/regKeyInfo" }, + { "$ref": "#/definitions/licensePoolInfo" } + ], + "if": { + "required": ["licenseType"], + "properties": { "licenseType": { "const": "licensePool" } } + }, + "then": { + "properties": { + "unitOfMeasure": { + "default": "monthly" + } + } + } + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "DbVariables" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains global db variable configuration.", + "type": "string", + "const": "DbVariables" + } + }, + "propertyNames": { + "description": "The name of the db variable." + }, + "additionalProperties": { + "description": "The value to set for the db variable." + } + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "Provision" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains module provisioning configuration.", + "type": "string", + "const": "Provision" + } + }, + "propertyNames": { + "description": "The module to provision. Note: 'cgnat' is only supported on TMOS v15+", + "enum": [ + "class", + "afm", + "am", + "apm", + "asm", + "avr", + "cgnat", + "dos", + "fps", + "gtm", + "ilx", + "lc", + "ltm", + "pem", + "swg", + "urldb", + "sslo" + ] + }, + "additionalProperties": { + "description": "The level at which to provision the module.", + "type": "string", + "enum": ["dedicated", "nominal", "minimum", "none"] + } + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "DNS" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains DNS configuration.", + "type": "string", + "const": "DNS" + }, + "nameServers": { + "description": "IP addresses of name servers to use for DNS.", + "type": "array", + "items": { + "type": "string", + "anyOf": [ + { "format": "ipv4" }, + { "format": "ipv6" } + ] + } + }, + "search": { + "description": "Search domain to use for DNS.", + "type": "array", + "items": { + "type": "string", + "format": "hostname" + } + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "NTP" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains NTP configuration.", + "type": "string", + "const": "NTP" + }, + "servers": { + "description": "IP addresses of servers to use for NTP.", + "type": "array", + "items": { + "type": "string", + "anyOf": [ + { "format": "ipv4" }, + { "format": "ipv6" }, + { "format": "hostname" } + ] + } + }, + "timezone": { + "description": "The timezone to set.", + "type": "string", + "default": "UTC" + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "HTTPD" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Configures the HTTP daemon for the system. Important: F5 Networks recommends that users of the Configuration utility exit the utility before changes are made to the system using the httpd component. This is because making changes to the system using this component causes a restart of the httpd daemon. Additionally, restarting the httpd daemon creates the necessity for a restart of the Configuration utility.", + "type": "string", + "const": "HTTPD" + }, + "allow": { + "description": "Configures IP addresses for the HTTP clients from which the httpd daemon accepts requests.", + "oneOf": [ + { + "type": "string", + "enum": [ + "all", + "none" + ] + }, + { + "type": "array", + "items": { + "type": "string", + "anyOf": [ + { "format": "ipWithOptionalPrefix" }, + { "const": "all" } + ] + } + } + ], + "default": "all" + }, + "authPamIdleTimeout": { + "description": "Specifies the number of seconds of inactivity that can elapse before the GUI session is automatically logged out.", + "type": "integer", + "minimum": 120, + "maximum": 2147483647, + "default": 1200 + }, + "maxClients": { + "description": "Maximum number of clients allowed to be simultaneously connected.", + "type": "integer", + "minimum": 10, + "maximum": 256, + "default": 10 + }, + "sslCiphersuite": { + "description": "Specifies the ciphers that the system uses.", + "type": "array", + "items": { + "type": "string", + "pattern": "^[0-9A-Za-z!:\\-+.~@$%^&*()_=\\[\\]|]+$" + }, + "default": [ + "ECDHE-RSA-AES128-GCM-SHA256", + "ECDHE-RSA-AES256-GCM-SHA384", + "ECDHE-RSA-AES128-SHA", + "ECDHE-RSA-AES256-SHA", + "ECDHE-RSA-AES128-SHA256", + "ECDHE-RSA-AES256-SHA384", + "ECDHE-ECDSA-AES128-GCM-SHA256", + "ECDHE-ECDSA-AES256-GCM-SHA384", + "ECDHE-ECDSA-AES128-SHA", + "ECDHE-ECDSA-AES256-SHA", + "ECDHE-ECDSA-AES128-SHA256", + "ECDHE-ECDSA-AES256-SHA384", + "AES128-GCM-SHA256", + "AES256-GCM-SHA384", + "AES128-SHA", + "AES256-SHA", + "AES128-SHA256", + "AES256-SHA256" + ] + }, + "sslProtocol": { + "description": "The list of SSL protocols to accept on the management console. A space-separated list of tokens in the format accepted by the Apache mod_ssl SSLProtocol directive.", + "type": "string", + "default": "all -SSLv2 -SSLv3 -TLSv1" + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "SnmpAgent" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains basic SNMP agent configuration.", + "type": "string", + "const": "SnmpAgent" + }, + "contact": { + "description": "The name of the person who administers the SNMP service for this system.", + "type": "string" + }, + "location": { + "description": "The description of this system's physical location.", + "type": "string" + }, + "allowList": { + "description": "Allowed client IP addresses.", + "type": "array", + "items": { + "type": "string", + "format": "f5ip" + } + }, + "snmpV1": { + "description": "Enables snmpd daemon support of snmpV1 queries.", + "type": "boolean", + "default": true + }, + "snmpV2c": { + "description": "Enables snmpd daemon support of snmpV2c queries.", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "SnmpCommunity" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains SNMP v1 or v2c community configuration.", + "type": "string", + "const": "SnmpCommunity" + }, + "ipv6": { + "description": "Specifies whether the record applies to IPv6 addresses.", + "type": "boolean", + "default": false + }, + "source": { + "description": "Specifies the source address for access to the MIB.", + "type": "string" + }, + "oid": { + "description": "Specifies the current object identifier (OID) for the record.", + "type": "string" + }, + "access": { + "description": "Whether the user's access level to the MIB is readOnly.", + "type": "string", + "enum": [ "ro", "rw" ], + "default": "ro" + }, + "name": { + "description": "Overrides using the object name as the community name. Use this if you want special characters in the community name.", + "type": "string" + } + }, + "if": { + "required": ["oid"] + }, + "then": { + "required": ["source"] + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "SnmpUser" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains SNMP v3 user configuration.", + "type": "string", + "const": "SnmpUser" + }, + "authentication": { + "description": "Specifies the user's authentication method and password.", + "type": "object", + "required": [ "protocol", "password" ], + "properties": { + "protocol": { + "description": "Authentication protocol.", + "type": "string", + "enum": ["sha", "md5"], + "default": "sha" + }, + "password": { + "description": "Specifies the password for the user.", + "type": "string" + } + }, + "additionalProperties": false + }, + "privacy": { + "description": "Specifies the privacy protcol to use to deliver authentication information for this user.", + "type": "object", + "required": [ "protocol", "password" ], + "properties": { + "protocol": { + "description": "Specifies the encryption protocol.", + "type": "string", + "enum": ["aes", "des"], + "default": "aes" + }, + "password": { + "description": "Specifies the password for the user.", + "type": "string" + } + } + }, + "oid": { + "description": "Specifies the current object identifier (OID) for the record.", + "type": "string", + "default": ".1" + }, + "access": { + "description": "Whether the user's access level to the MIB is readOnly.", + "type": "string", + "enum": ["ro", "rw"], + "default": "ro" + }, + "name": { + "description": "Overrides using the object name as the username. Use this if you want special characters in the username.", + "type": "string" + } + }, + "additionalProperties": false, + "if": { + "required": [ "privacy" ] + }, + "then": { + "required": [ "authentication" ] + } + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "SnmpTrapEvents" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains SNMP trap configuration.", + "type": "string", + "const": "SnmpTrapEvents" + }, + "agentStartStop": { + "description": "Indicates whether to send a trap when the SNMP agent starts/stops.", + "type": "boolean", + "default": true + }, + "authentication": { + "description": "Indicates whether to send authentication warning traps.", + "type": "boolean", + "default": false + }, + "device": { + "description": "Indicates whether to send device warning traps.", + "type": "boolean", + "default": true + } + } + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "SnmpTrapDestination" } } + }, + "then": { + "required": ["class", "version", "destination", "port", "network"], + "properties": { + "class": { + "description": "Indicates that this property contains SNMP trap configuration.", + "type": "string", + "const": "SnmpTrapDestination" + }, + "version": { + "description": "Specifies to which Simple Network Management Protocol (SNMP) version the trap destination applies.", + "type": "string", + "enum": ["1", "2c", "3"], + "default": "2c" + }, + "destination": { + "description": "Specifies the address for the trap destination.", + "type": "string", + "oneOf": [ + { "format": "ipv4" }, + { "format": "ipv6" } + ] + }, + "port": { + "description": "Specifies the port for the trap destination.", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 162 + }, + "network": { + "description": "Specifies the trap network. The system sends the SNMP trap out the specified network. 'management' specifies that the system sends the trap out of the management IP address. 'other' specifies that the system sends the trap out of the interface based on the routing tables.", + "type": "string", + "enum": ["management", "other"], + "default": "management" + } + }, + "if": { + "required": ["version"], + "properties": { "version": { "const" : "3" } } }, + "then": { + "required": ["securityName", "authentication"], + "properties": { + "securityName": { + "description": "Specifies the user name the system uses to handle SNMP v3 traps.", + "type": "string" + }, + "authentication": { + "description": "Specifies the user's authentication method and password.", + "type": "object", + "required": [ "protocol", "password" ], + "properties": { + "protocol": { + "description": "Authentication protocol.", + "type": "string", + "enum": ["sha", "md5"] + }, + "password": { + "description": "Specifies the password for the user.", + "type": "string" + } + }, + "additionalProperties": false + }, + "privacy": { + "description": "Specifies the privacy protcol to use to deliver authentication information for this user.", + "type": "object", + "properties": { + "protocol": { + "description": "Specifies the encryption protocol.", + "type": "string", + "enum": ["aes", "des"] + }, + "password": { + "description": "Specifies the password for the user.", + "type": "string" + } + } + }, + "engineId": { + "description": "Specifies the unique identifier (snmpEngineID) of the remote SNMP protocol engine.", + "type": "string" + } + } + }, + "else": { + "required": ["community"], + "properties": { + "community": { + "description": "Specifies the community name for the trap destination.", + "type": "string" + } + } + } + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "User" } } + }, + "then": { + "if": { + "properties": { "userType": { "const": "root" } } + }, + "then": { + "required": ["class", "userType", "newPassword", "oldPassword"], + "properties": { + "class": { + "description": "Indicates that this property contains user configuration.", + "type": "string", + "const": "User" + }, + "userType": { + "description": "The type of user.", + "type": "string", + "const": "root" + }, + "newPassword": { + "description": "Password to set for the root user.", + "type": "string", + "anyOf": [ + { "format": "json-pointer" }, + { "pattern": "^.{0,254}$" } + ] + }, + "oldPassword": { + "description": "Old password for the root user.", + "type": "string", + "anyOf": [ + { "format": "json-pointer" }, + { "pattern": "^.{0,254}$" } + ] + }, + "keys": { + "description": "An array of public keys for the user. If the user is root, this will preserve only the master key and then overwrite the rest in the file: /root/.ssh/authorized_keys.", + "type": "array", + "items": { + "type": "string" + } + }, + "forceInitialPasswordChange": { + "description": "Determines if a password change will be required on the first user login.", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + }, + "else": { + "required": ["class", "userType"], + "properties": { + "class": { + "description": "Indicates that this property contains user configuration.", + "type": "string", + "const": "User" + }, + "userType": { + "description": "The type of user.", + "type": "string", + "const": "regular" + }, + "password": { + "description": "Password for the user.", + "type": "string", + "anyOf": [ + { "format": "json-pointer" }, + { "pattern": "^.{0,254}$" } + ] + }, + "partitionAccess": { + "description": "Access control configuration.", + "type": "object", + "properties": { + "Common": { + "$ref": "#/definitions/partitionAccess" + }, + "all-partitions": { + "$ref": "#/definitions/partitionAccess" + } + }, + "additionalProperties": false + }, + "shell": { + "description": "Shell for the user.", + "type": "string", + "enum": ["bash", "tmsh", "none"], + "default": "tmsh" + }, + "keys": { + "description": "An array of public keys for the user. These will overwrite the /home/username/.ssh/authorized_keys if not root.", + "type": "array", + "items": { + "type": "string" + } + }, + "forceInitialPasswordChange": { + "description": "Determines if a password change will be required on the first user login.", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false + } + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "ManagementIp" } } + }, + "then": { + "required": ["class", "address"], + "properties": { + "class": { + "description": "Indicates this property contains management IP configuration. Note that if you set this you will have to poll for status on the new address.", + "type": "string", + "const": "ManagementIp" + }, + "address": { + "description": "IP address.", + "type": "string", + "format": "ipWithRequiredPrefix" + }, + "remark": { + "description": "To handle rollback to a dynamically configured address, do not set this to 'configured-by-dhcp'", + "$ref": "definitions.schema.json#/definitions/Remark", + "default": "configured-statically by DO" + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "ManagementRoute" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates this property contains management route configuration", + "type": "string", + "const": "ManagementRoute" + }, + "remark": { + "$ref": "definitions.schema.json#/definitions/Remark" + }, + "gw": { + "description": "Gateway for the management route.", + "type": "string", + "anyOf": [ + { "format": "ipv4" }, + { "format": "ipv6" } + ] + }, + "network": { + "description": "IP address/netmask for the management route", + "type": "string", + "anyOf": [ + { "format": "f5ip" }, + { "enum": ["default", "default-inet6"]} + ], + "default": "default" + }, + "mtu": { + "description": "MTU for the management route.", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 0 + }, + "type": { + "description": "Type of the management route", + "type": "string", + "enum": [ + "interface", + "blackhole" + ] + } + }, + "additionalProperties": false, + "allOf": [ + { + "if": { + "properties": { + "network": { + "not": { + "enum": ["default", "default-inet6"] + } + }, + "type": { + "not": { + "enum": ["interface", "blackhole"] + } + } + } + }, + "then": { + "required": ["gw"] + } + }, + { + "if": { + "required": ["type"] + }, + "then": { + "dependencies": { + "gw": { + "not": {} + } + } + } + } + ] + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "SyslogRemoteServer" } } + }, + "then": { + "required": ["class", "host"], + "properties": { + "class": { + "description": "Indicates that this property contains Syslog Remote Server Information", + "type": "string", + "const": "SyslogRemoteServer" + }, + "host": { + "description": "Specifies the IP address of a remote server to which syslog sends messages.", + "type": "string", + "anyOf": [ + { "format": "ipv4" }, + { "format": "ipv6" }, + { "format": "hostname" } + ] + }, + "localIp": { + "description": "Specifies the IP address of the interface syslog binds with in order to log messages to a remote host.", + "type": "string", + "anyOf": [ + { "format": "ipv4" }, + { "format": "ipv6" } + ] + }, + "remotePort": { + "description": "Specifies the port to which the syslog sends messages.", + "type": "integer", + "minimum": 0, + "maximum": 65535, + "default": 514 + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "System" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates this property contains global system settings", + "type": "string", + "const": "System" + }, + "hostname": { + "description": "Hostname to set for the device. Note: If you set the hostname as part of the Common class, you CANNOT set a hostname in the System class (they are mutually exclusive).", + "type": "string", + "format": "hostname", + "default": "bigip1" + }, + "consoleInactivityTimeout": { + "description": "Configure automatic logout for idle serial console sessions (command line sessions) in seconds. The default value 0 means that no timeout is set.", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 0 + }, + "cliInactivityTimeout": { + "description": "Configure automatic logout for idle users in TMSH interactive mode. A setting other than 0 automatically logs a user out after a specified number of seconds, which must be entered in multiples of 60. The default value 0 means that no timeout is set.", + "type": "integer", + "minimum": 0, + "maximum": 128849018820, + "multipleOf": 60, + "default": 0 + }, + "autoPhonehome": { + "description": "Enables the BIG-IP system to send non-confidential, high-level device information to F5 in order to help determine product usage to optimize product development.", + "type": "boolean", + "default": true + }, + "autoCheck": { + "description": "Enables the BIG-IP system to check for and recommend software updates.", + "type": "boolean", + "default": true + }, + "tmshAuditLog": { + "description": "Enables audit logging for tmsh.", + "type": "boolean", + "default": true + }, + "guiAuditLog": { + "description": "Enables audit logging for the GUI. Only available on TMOS v14+", + "type": "boolean", + "default": false + }, + "mcpAuditLog": { + "description": "Enables audit logging for MCP.", + "type": "string", + "enum": [ + "disable", + "enable", + "verbose", + "all" + ], + "default": "enable" + }, + "preserveOrigDhcpRoutes": { + "description": "Determines if DHCP ManagementRoute objects are preserved.", + "type": "boolean", + "default": false + }, + "mgmtDhcpEnabled": { + "description": "Determines if Management DHCP is enabled or not.", + "type": "boolean" + }, + "guiSecurityBanner": { + "description": "Specifies whether the system presents on the login screen the text you specify in guiSecurityBannerText. If you disable this option, the system presents an empty frame in the right portion of the login screen.", + "type": "boolean", + "default": true + }, + "guiSecurityBannerText": { + "description": "Specifies the text to present on the login screen when the guiSecurityBanner is enabled.", + "type": "string", + "default": "Welcome to the BIG-IP Configuration Utility.\n\nLog in with your username and password using the fields on the left." + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "TrafficControl" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates this property contains traffic control configuration", + "type": "string", + "const": "TrafficControl" + }, + "acceptIpOptions": { + "description": "Specifies whether the system accepts IPv4 packets with IP Options.", + "type": "boolean", + "default": false + }, + "acceptIpSourceRoute": { + "description": "Specifies whether the system accepts IPv4 packets with IP source route options that are destined for TMM. To enable this option, you must also enable the acceptIpOptions option.", + "type": "boolean", + "default": false + }, + "allowIpSourceRoute": { + "description": "Specifies whether the system allows IPv4 packets with IP source route options enabled to be routed through TMM. To enable this option, you must also enable the acceptIpOptions option.", + "type": "boolean", + "default": false + }, + "continueMatching": { + "description": "Specifies whether the system matches against a less-specific virtual server when the more-specific one is disabled or rejects / drops the packets depending on the value of rejectUnmatched.", + "type": "boolean", + "default": false + }, + "maxIcmpRate": { + "description": "Specifies the maximum rate per second at which the system issues ICMP errors.", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "default": 100 + }, + "maxPortFindLinear": { + "description": "Specifies the maximum of ports to linearly search for outbound connections", + "type": "integer", + "minimum": 0, + "maximum": 61439, + "default": 16 + }, + "maxPortFindRandom": { + "description": "Specifies the maximum of ports to randomly search for outbound connections", + "type": "integer", + "minimum": 0, + "maximum": 1024, + "default": 16 + }, + "maxRejectRate": { + "description": "Specifies the maximum rate per second at which the system issues reject packets (TCP RST or ICMP port unreach).", + "type": "integer", + "minimum": 1, + "maximum": 1000, + "default": 250 + }, + "maxRejectRateTimeout": { + "description": "Specifies the time in seconds which the system ignores ICMP port unreach and TCP RST ratelimits on becoming active after a failover.", + "type": "integer", + "minimum": 0, + "maximum": 300, + "default": 30 + }, + "minPathMtu": { + "description": "Specifies the minimum packet size that can traverse the path without suffering fragmentation", + "type": "integer", + "minimum": 68, + "maximum": 1500, + "default": 296 + }, + "pathMtuDiscovery": { + "description": "Specifies that the system discovers the MTU that it can send over a path without fragmenting TCP packets", + "type": "boolean", + "default": true + }, + "portFindThresholdWarning": { + "description": "Specifies if the ephemeral port-exhaustion threshold warning is to be monitored.", + "type": "boolean", + "default": true + }, + "portFindThresholdTrigger": { + "description": "Specifies the threshold warning's trigger which is the value of random port attempts when attempting to find an unused outbound port for a connection.", + "type": "integer", + "minimum": 1, + "maximum": 12, + "default": 8 + }, + "portFindThresholdTimeout": { + "description": "Specifies the threshold warning's timeout which is the time in seconds since the last trigger value was hit and will drop the tuple if not hit.", + "type": "integer", + "minimum": 0, + "maximum": 300, + "default": 30 + }, + "rejectUnmatched": { + "description": "Specifies, when enabled, that the system returns a TCP RST or ICMP port unreach packet if no virtual servers on the system match the destination address of the incoming packet. When disabled, the system silently drops the unmatched packet.", + "type": "boolean", + "default": true + } + }, + "additionalProperties": false, + "dependencies": { + "acceptIpSourceRoute": { + "if": { + "required": ["acceptIpSourceRoute"], + "properties": { "acceptIpSourceRoute": { "const": true } } + }, + "then": { + "required": ["acceptIpOptions"], + "properties": { "acceptIpOptions": { "const": true } } + } + }, + "allowIpSourceRoute": { + "if": { + "required": ["allowIpSourceRoute"], + "properties": { "allowIpSourceRoute": { "const": true } } + }, + "then": { + "required": ["acceptIpOptions"], + "properties": { "acceptIpOptions": { "const": true } } + } + } + } + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "SSHD" } } + }, + "then": { + "properties": { + "class": { + "description": "Indicates this contains SSH configuration.", + "type": "string", + "const": "SSHD" + }, + "allow": { + "description": "Specifies the list of IP addresses that are allowed to log in to the system. Allow all addresses by using the 'all' value or disallow all addresses using the 'none' value.", + "oneOf": [ + { + "type": "string", + "enum": [ + "all", + "none" + ] + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "banner": { + "description": "Enables or disabled the display of the banner text field when a user logs in.", + "type": "string" + }, + "ciphers": { + "description": "Specifies the ciphers to be included.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "3des-cbc", + "aes128-ctr", + "aes192-ctr", + "aes256-ctr", + "aes128-cbc", + "aes192-cbc", + "aes256-cbc", + "aes128-gcm@openssh.com", + "aes256-gcm@openssh.com", + "arcfour", + "arcfour128", + "arcfour256", + "blowfish-cbc", + "cast128-cbc", + "chacha20-poly1305@openssh.com" + ] + } + }, + "inactivityTimeout": { + "description": "Specifies the number of seconds before inactivity causes an SSH session to log out.", + "type": "integer", + "default": 0, + "minimum": 0, + "maximum": 2147483647 + }, + "loginGraceTime": { + "description": "Specifies the login grace period that will be included. This is in the number of seconds.", + "type": "integer" + }, + "MACS": { + "description": "Specifies the MACs that will be included.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "hmac-sha1", + "hmac-ripemd160", + "hmac-md5", + "hmac-md5-96", + "hmac-sha1-96", + "hmac-sha2-256", + "hmac-sha2-512", + "hmac-md5-etm@openssh.com", + "hmac-md5-96-etm@openssh.com", + "hmac-ripemd160-etm@openssh.com", + "hmac-sha1-etm@openssh.com", + "hmac-sha1-96-etm@openssh.com", + "hmac-sha2-256-etm@openssh.com", + "hmac-sha2-512-etm@openssh.com", + "umac-64@openssh.com", + "umac-128@openssh.com", + "umac-64-etm@openssh.com", + "umac-128-etm@openssh.com" + ] + } + }, + "kexAlgorithms": { + "description": "Specifies the KexAlgorithms that will be included.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "diffie-hellman-group1-sha1", + "diffie-hellman-group14-sha1", + "diffie-hellman-group14-sha256", + "diffie-hellman-group16-sha512", + "diffie-hellman-group18-sha512", + "diffie-hellman-group-exchange-sha1", + "diffie-hellman-group-exchange-sha256", + "ecdh-sha2-nistp256", + "ecdh-sha2-nistp384", + "ecdh-sha2-nistp521", + "curve25519-sha256", + "curve25519-sha256@libssh.org", + "gss-gex-sha1-", + "gss-group1-sha1-", + "gss-group14-sha1-" + ] + } + }, + "maxAuthTries": { + "description": "Specifies the max auth tries to be included.", + "type": "integer" + }, + "maxStartups": { + "description": "Specifies the max startups to include.", + "type": "string" + }, + "protocol": { + "description": "Specifies the protocol to be included.", + "type": "integer", + "minimum": 1, + "maximum": 2 + } + }, + "additionalProperties": false + } + }, + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "Disk" } } + }, + "then": { + "properties": { + "class": { + "description": "Indicates this contains Disk configuration. This API is experimental and subject to change.", + "type": "string", + "const": "Disk" + }, + "applicationData": { + "description": "Specifies the size in kilobytes for the application data. This size should be less than the current size. This API is experimental and subject to change.", + "type": "integer", + "minimum": 0, + "multipleOf": 4096 + } + }, + "additionalProperties": false + } + } + ], + "definitions": { + "partitionAccess": { + "description": "The partition - either 'Common' or 'all-partitions'.", + "type": "object", + "required": ["role"], + "properties": { + "role": { + "description": "Role for the user.", + "type": "string", + "enum": [ + "admin", + "auditor", + "guest", + "manager", + "operator", + "user-manager", + "application-editor", + "certificate-manager", + "irule-manager", + "no-access", + "resource-admin" + ] + } + }, + "additionalProperties": false + }, + "regKeyInfo": { + "description": "Registration key information.", + "required": ["class", "licenseType", "regKey"], + "properties": { + "class": { + "description": "Indicates that this property contains licensing information.", + "type": "string", + "const": "License" + }, + "licenseType": { + "description": "The type of license", + "type": "string", + "const": "regKey" + }, + "regKey": { + "description": "Registration key.", + "type": "string", + "pattern": "^([A-Z]{5}-[A-Z]{5}-[A-Z]{5}-[A-Z]{5}-[A-Z]{7})|([A-Z][0-9]{4}-[0-9]{5}-[0-9]{5}-[0-9]{5}-[0-9]{7})$" + }, + "addOnKeys": { + "description": "Add on keys.", + "type": "array", + "items": { + "type": "string", + "pattern": "^[A-Z]{7}-[A-Z]{7}$", + "uniqueItems": true + } + }, + "overwrite": { + "description": "Whether or not to overwrite the license if the device is already licensed.", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + }, + "licensePoolInfo": { + "required": ["class", "licenseType"], + "if": { + "required": ["reachable"], + "properties": { "reachable": { "const": false }} + }, + "then": { + "if": { + "required": ["licensePool"] + }, + "then": { + "required": ["hypervisor"] + } + }, + "else": { + "not": { "required": ["tenant"] }, + "if": { + "required": ["licensePool"] + }, + "then": { + "required": ["bigIpUsername", "bigIpPassword"] + } + }, + "properties": { + "class": { + "description": "Indicates that this property contains licensing information.", + "type": "string", + "const": "License" + }, + "licenseType": { + "description": "The type of license", + "type": "string", + "const": "licensePool" + }, + "licensePool": { + "description": "Name of the BIG-IQ license pool from which to get a new license.", + "type": "string" + }, + "skuKeyword1": { + "description": "skuKeyword1 parameter for subscription licensing.", + "type": "string" + }, + "skuKeyword2": { + "description": "skuKeyword2 parameter for subscription licensing.", + "type": "string" + }, + "unitOfMeasure": { + "description": "unitOfMeasure parameter for subscription licensing.", + "type": "string", + "enum": ["yearly", "monthly", "daily", "hourly"] + }, + "hypervisor": { + "description": "Hypervisor which is running the BIG-IP. Required by BIG-IQ if 'reachable' is false.", + "type": "string", + "oneOf": [ + { "enum": ["aws", "azure", "gce", "vmware", "hyperv", "kvm", "xen", "alibaba"] }, + { "pattern": "0x[0-9a-zA-Z]*" } + ] + }, + "bigIpUsername": { + "description": "An admin user on the BIG-IP. Used by BIG-IQ to login to BIG-IP if 'reachable' is true.", + "type": "string", + "anyOf": [ + { "format": "json-pointer" }, + { "pattern": "^.{0,254}$" } + ] + }, + "bigIpPassword": { + "description": "Password for the user in bigIpUsername. Used by BIG-IQ to login to BIG-IP if 'reachable' is true.", + "type": "string", + "anyOf": [ + { "format": "json-pointer" }, + { "pattern": "^.{0,254}$" } + ] + }, + "chargebackTag": { + "description": "An optional text string which can be used as a charge back tag.", + "type": "string" + }, + "overwrite": { + "description": "Whether or not to overwrite the license if the device is already licensed.", + "type": "boolean", + "default": false + }, + "revokeFrom": { + "description": "Current license should be revoked from the pool specified. Either just the name of the pool (if old license is on the same BIG-IQ as in the main License section) or full licensePoolInfo (if old license is on a different BIG-IQ)", + "oneOf": [ + { "type": "string" }, + { + "required": ["licensePool"], + "properties": { + "licensePool": { + "description": "Name of the BIG-IQ license pool.", + "type": "string" + } + }, + "allOf": [ + { "$ref": "#/definitions/bigIqHostInfo" } + ] + } + ] + }, + "tenant": { + "description": "An optional description for the license. Can be useful in a clustered environment. Requires that reachable is set to false.", + "type": "string" + } + }, + "allOf": [ + { "$ref": "#/definitions/bigIqHostInfo" } + ] + }, + "bigIqHostInfo": { + "description": "BIG-IQ host/credentials information", + "type": "object", + "allOf": [ + { + "if": { + "required": ["bigIqPassword"] + }, + "then": { + "dependencies": { + "bigIqPasswordUri": { + "not": {} + } + } + } + }, + { + "if": { + "required": ["bigIqHost"] + }, + "then": { + "if": { "not": {"properties": { "bigIqHost": { "const": "localhost" } } } }, + "then": { + "required": ["bigIqUsername"], + "oneOf": [ + { "required": ["bigIqPassword"] }, + { "required": ["bigIqPasswordUri"] } + ] + } + } + } + ], + "properties": { + "bigIqHost": { + "description": "The BIG-IQ hostname or IP address.", + "type": "string", + "anyOf": [ + { "format": "ipv4" }, + { "format": "ipv6" }, + { "format": "hostname" } + ] + }, + "bigIqUsername": { + "description": "An admin user on the BIG-IQ.", + "type": "string", + "anyOf": [ + { "format": "json-pointer" }, + { "pattern": "^[^:]{0,254}$" } + ] + }, + "bigIqPassword": { + "description": "Password for the user in bigIqUsername.", + "type": "string", + "anyOf": [ + { "format": "json-pointer" }, + { "pattern": "^.{0,254}$" } + ] + }, + "bigIqPasswordUri": { + "description": "URI which will return the password for the user in bigIqUsername.", + "type": "string", + "format": "uri" + }, + "bigIqAuthProvider": { + "description": "Name of auth provider on BIG-IQ. Default is to use TMOS.", + "type": "string" + }, + "reachable": { + "description": "Whether or not BIG-IQ has a route to the BIG-IP device.", + "type": "boolean", + "default": true + } + } + } + } +} diff --git a/src/schema/1.4.0/base.schema.json b/src/schema/1.4.0/base.schema.json index 9c04ddaa..79b340dc 100644 --- a/src/schema/1.4.0/base.schema.json +++ b/src/schema/1.4.0/base.schema.json @@ -53,7 +53,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.4.0/remote.schema.json b/src/schema/1.4.0/remote.schema.json index b81385b0..11d56ea6 100644 --- a/src/schema/1.4.0/remote.schema.json +++ b/src/schema/1.4.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.4.1/base.schema.json b/src/schema/1.4.1/base.schema.json index 9c04ddaa..79b340dc 100644 --- a/src/schema/1.4.1/base.schema.json +++ b/src/schema/1.4.1/base.schema.json @@ -53,7 +53,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.4.1/remote.schema.json b/src/schema/1.4.1/remote.schema.json index b81385b0..11d56ea6 100644 --- a/src/schema/1.4.1/remote.schema.json +++ b/src/schema/1.4.1/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.5.0/base.schema.json b/src/schema/1.5.0/base.schema.json index 022f934d..2650b8c0 100644 --- a/src/schema/1.5.0/base.schema.json +++ b/src/schema/1.5.0/base.schema.json @@ -53,7 +53,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.5.0/remote.schema.json b/src/schema/1.5.0/remote.schema.json index 336e23de..3b4b485e 100644 --- a/src/schema/1.5.0/remote.schema.json +++ b/src/schema/1.5.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.6.0/base.schema.json b/src/schema/1.6.0/base.schema.json index cb327c21..c4b811e3 100644 --- a/src/schema/1.6.0/base.schema.json +++ b/src/schema/1.6.0/base.schema.json @@ -58,7 +58,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.6.0/remote.schema.json b/src/schema/1.6.0/remote.schema.json index 336e23de..3b4b485e 100644 --- a/src/schema/1.6.0/remote.schema.json +++ b/src/schema/1.6.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.6.1/base.schema.json b/src/schema/1.6.1/base.schema.json index cb327c21..c4b811e3 100644 --- a/src/schema/1.6.1/base.schema.json +++ b/src/schema/1.6.1/base.schema.json @@ -58,7 +58,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.6.1/remote.schema.json b/src/schema/1.6.1/remote.schema.json index 336e23de..3b4b485e 100644 --- a/src/schema/1.6.1/remote.schema.json +++ b/src/schema/1.6.1/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.7.0/base.schema.json b/src/schema/1.7.0/base.schema.json index 23764bef..6fa7976e 100644 --- a/src/schema/1.7.0/base.schema.json +++ b/src/schema/1.7.0/base.schema.json @@ -58,7 +58,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.7.0/remote.schema.json b/src/schema/1.7.0/remote.schema.json index 034c3985..5845b424 100644 --- a/src/schema/1.7.0/remote.schema.json +++ b/src/schema/1.7.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.8.0/base.schema.json b/src/schema/1.8.0/base.schema.json index 88282cd5..97953505 100644 --- a/src/schema/1.8.0/base.schema.json +++ b/src/schema/1.8.0/base.schema.json @@ -58,7 +58,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.8.0/remote.schema.json b/src/schema/1.8.0/remote.schema.json index d2fb38e1..a0c6395c 100644 --- a/src/schema/1.8.0/remote.schema.json +++ b/src/schema/1.8.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/1.9.0/base.schema.json b/src/schema/1.9.0/base.schema.json index 5c8ea606..d33b48b1 100644 --- a/src/schema/1.9.0/base.schema.json +++ b/src/schema/1.9.0/base.schema.json @@ -58,7 +58,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { diff --git a/src/schema/1.9.0/remote.schema.json b/src/schema/1.9.0/remote.schema.json index d2fb38e1..a0c6395c 100644 --- a/src/schema/1.9.0/remote.schema.json +++ b/src/schema/1.9.0/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/latest/base.schema.json b/src/schema/latest/base.schema.json index fb21ca3b..a5c6b5fd 100644 --- a/src/schema/latest/base.schema.json +++ b/src/schema/latest/base.schema.json @@ -10,6 +10,7 @@ "description": "Version of BIG-IP Declarative Onboarding schema this declaration uses.", "type": "string", "enum": [ + "1.37.0", "1.36.0", "1.35.0", "1.34.0", @@ -94,7 +95,7 @@ "pattern": "^.{0,254}$" }, "tokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the device management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the device management service as authentication/authorization tokens", "type": "object", "patternProperties": { "^[^\\x00-\\x20:\\x7f-\\xff]{1,254}$": { @@ -207,7 +208,8 @@ "GSLBProberPool", "FirewallPolicy", "FirewallAddressList", - "FirewallPortList" + "FirewallPortList", + "SecurityAnalytics" ] } }, @@ -217,7 +219,8 @@ { "$ref": "dsc.schema.json#" }, { "$ref": "analytics.schema.json#" }, { "$ref": "auth.schema.json#" }, - { "$ref": "gslb.schema.json#" } + { "$ref": "gslb.schema.json#" }, + { "$ref": "security.schema.json#" } ] }, "default": { diff --git a/src/schema/latest/openapi.yaml b/src/schema/latest/openapi.yaml index 2c219e42..8b292232 100644 --- a/src/schema/latest/openapi.yaml +++ b/src/schema/latest/openapi.yaml @@ -2,7 +2,7 @@ openapi: 3.0.3 info: title: F5 BIG-IP Declarative Onboarding description: This reference describes the BIG-IP DO API and available endpoints. For more details, see https://clouddocs.f5.com/products/extensions/f5-declarative-onboarding/latest/using-do.html. - version: 1.36.0 + version: 1.37.0 contact: name: BIG-IP Declarative Onboarding email: solutionsfeedback@f5.com diff --git a/src/schema/latest/remote.schema.json b/src/schema/latest/remote.schema.json index cc4660d3..37316c82 100644 --- a/src/schema/latest/remote.schema.json +++ b/src/schema/latest/remote.schema.json @@ -84,7 +84,7 @@ "additionalProperties": false }, "targetTokens": { - "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'MF6APSRUYKTMSDBEOOEWLCNSO2') you want to send with queries to the targetHost management service as authentication/authorization tokens", + "description": "One or more HTTP headers (each a property, like 'X-F5-Auth-Token': 'ABCABC') you want to send with queries to the targetHost management service as authentication/authorization tokens", "oneOf": [ { "description": "Pointer to tokens in a format that matches the 'object' schema below", diff --git a/src/schema/latest/security.schema.json b/src/schema/latest/security.schema.json new file mode 100644 index 00000000..bb610f79 --- /dev/null +++ b/src/schema/latest/security.schema.json @@ -0,0 +1,162 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/F5Networks/f5-declarative-onboarding/master/src/schema/latest/security.schema.json", + "title": "F5 BIG-IP Declarative Onboarding security declaration", + "description": "Security properties for onboarding a BIG-IP.", + "allOf": [ + { + "if": { + "required": ["class"], + "properties": { "class": { "const": "SecurityAnalytics" } } + }, + "then": { + "required": ["class"], + "properties": { + "class": { + "description": "Indicates that this property contains SecurityAnalytics configuration.", + "type": "string", + "const": "SecurityAnalytics" + }, + "aclRules": { + "description": "Firewall (ACL) security statistics collection options.", + "type": "object", + "properties": { + "collectClientIpEnabled": { + "description": " Specifies whether source/client IP address should be collected for ACL rule matching.", + "type": "boolean", + "default": true + }, + "collectClientPortEnabled": { + "description": "Specifies whether source/client port should be collected for ACL rule matching.", + "type": "boolean", + "default": false + }, + "collectDestinationIpEnabled": { + "description": "Specifies whether the destination IP address should be collected for ACL rule matching.", + "type": "boolean", + "default": true + }, + "collectDestinationPortEnabled": { + "description": "Specifies whether the destination port should be collected for ACL rule matching.", + "type": "boolean", + "default": true + }, + "collectServerSideStatsEnabled": { + "description": "Specifies whether server side statistics (source address translation information, self IP address and pool member address) should be collected for ACL rule matching.", + "type": "boolean", + "default": false + } + } + }, + "collectAllDosStatsEnabled": { + "description": "Specifies whether to enable or disable the collection of all DoS statistics.", + "type": "boolean", + "default": false + }, + "collectedStatsExternalLoggingEnabled": { + "description": "Specifies whether to enable or disable external logging of collected statistics.", + "type": "boolean", + "default": false + }, + "collectedStatsInternalLoggingEnabled": { + "description": "Specifies whether to enable or disable internal logging of collected statistics.", + "type": "boolean", + "default": false + }, + "dns": { + "description": "DNS security statistics collection options.", + "type": "object", + "properties": { + "collectClientIpEnabled": { + "description": "Specifies whether source/client IP address should be collected for DNS security.", + "type": "boolean", + "default": true + }, + "collectDestinationIpEnabled": { + "description": "Specifies whether the destination IP address should be collected for DNS security.", + "type": "boolean", + "default": true + } + } + }, + "collectDnsStatsEnabled": { + "description": "Specifies whether to enable or disable DNS statistics collection.", + "type": "boolean", + "default": true + }, + "dosL2L4": { + "description": "Network DoS statistics collection options.", + "type": "object", + "properties": { + "collectClientIpEnabled": { + "description": "Specifies whether source/client IP address should be collected for network layer's DoS security.", + "type": "boolean", + "default": true + }, + "collectDestinationGeoEnabled": { + "description": "Specifies whether the destination geo should be collected for network layer's DoS security.", + "type": "boolean", + "default": true + } + } + }, + "collectDosL3StatsEnabled": { + "description": "Specifies whether to enable or disable the collection of DoS L3 statistics.", + "type": "boolean", + "default": true + }, + "collectFirewallAclStatsEnabled": { + "description": "Specifies whther to enable or disable the collection of firewall ACL statistics.", + "type": "boolean", + "default": true + }, + "collectFirewallDropsStatsEnabled": { + "description": "Specifies whether to enable or disable the collection of firewall drops statistics.", + "type": "boolean", + "default": true + }, + "collectIpReputationStatsEnabled": { + "description": "Specifies whether to enable or disable the collection of IP reputation statistics.", + "type": "boolean", + "default": true + }, + "l3L4Errors": { + "description": "Firewall errors statistics collection options.", + "type": "object", + "properties": { + "collectClientIpEnabled": { + "description": "Specifies whether source/client IP address should be collected for firewall errors.", + "type": "boolean", + "default": true + }, + "collectDestinationIpEnabled": { + "description": "Specifies whether the destination IP address should be collected for firewall errors.", + "type": "boolean", + "default": true + } + } + }, + "publisher": { + "description": "Specifies the external logging publisher used to send statistical data to one or more destinations.", + "type": "string" + }, + "collectSipStatsEnabled": { + "description": "Specifies whether to enable or disable the collection of SIP statistics.", + "type": "boolean", + "default": true + }, + "smtpConfig": { + "description": "Specifies the default SMTP configuration used for exporting CSV or PDF security analytics reports.", + "type": "string" + }, + "collectStaleRulesEnabled": { + "description": "Specifies whether statistics about all firewall rules should be collected in order to present information regarding rule staleness.", + "type": "boolean", + "default": false + } + }, + "additionalProperties": false + } + } + ] +} diff --git a/test/README.md b/test/README.md index 765adcf0..ca4ebfea 100644 --- a/test/README.md +++ b/test/README.md @@ -18,7 +18,7 @@ If `npx` is available on your system, you can run the locally installed version * Note: For future runs of the test, you'll need to delete and relaunch not only the BIG-IPs but the Stack object as well. * You will also need a BIG-IQ. * This BIG-IQ needs to be setup and running, make note of the login credentials for step 4. - * Get two "clpv2 license F5-BIG-MSP-LOADV2-LIC" eval (not dev) licenses from go/license. + * Get two "clpv2 license F5-BIG-MSP-LOADV2-LIC-DEV" dev (not eval) licenses from go/license. * Then add them to the BIG-IQ via Devices -> 'License Management' -> Licenses -> click 'Add License' * Name one 'myLicense' and the other 'myOtherLicensePool' 2. A Harness file is required to run the functional testing. This file will need the following (example below): diff --git a/test/integration/bodies/gslb.json b/test/integration/bodies/gslb.json index c1cf9469..81e04c31 100644 --- a/test/integration/bodies/gslb.json +++ b/test/integration/bodies/gslb.json @@ -108,7 +108,7 @@ "class": "GSLBMonitor", "remark": "description", "monitorType": "http", - "target": "1.1.1.1:80", + "target": "192.0.2.10:80", "interval": 100, "timeout": 1000, "probeTimeout": 110, @@ -122,7 +122,7 @@ "class": "GSLBMonitor", "remark": "description", "monitorType": "https", - "target": "2.2.2.2:80", + "target": "192.0.2.16:80", "interval": 100, "timeout": 1000, "probeTimeout": 110, @@ -138,7 +138,7 @@ "class": "GSLBMonitor", "remark": "description", "monitorType": "gateway-icmp", - "target": "3.3.3.3:80", + "target": "192.0.2.15:80", "interval": 100, "timeout": 1000, "probeTimeout": 110, @@ -151,7 +151,7 @@ "class": "GSLBMonitor", "remark": "description", "monitorType": "tcp", - "target": "4.4.4.4:80", + "target": "192.0.2.12:80", "interval": 100, "timeout": 1000, "probeTimeout": 110, @@ -165,7 +165,7 @@ "class": "GSLBMonitor", "remark": "description", "monitorType": "udp", - "target": "5.5.5.5:80", + "target": "192.0.2.18:80", "interval": 100, "timeout": 1000, "probeTimeout": 110, diff --git a/test/integration/bodies/network.json b/test/integration/bodies/network.json index 4cc88a85..687cc1bd 100644 --- a/test/integration/bodies/network.json +++ b/test/integration/bodies/network.json @@ -107,7 +107,7 @@ "name": "forward.net", "nameservers": [ "10.10.10.10:53", - "::ffff:1414:1414.53" + "::ffff:c000:20b.53" ] } ] diff --git a/test/integration/bodies/onboard.json b/test/integration/bodies/onboard.json index 512a36ef..2a0509d9 100644 --- a/test/integration/bodies/onboard.json +++ b/test/integration/bodies/onboard.json @@ -86,7 +86,7 @@ "myFailoverMulticast": { "class": "FailoverMulticast", "interface": "eth0", - "address": "224.0.0.100", + "address": "233.252.0.10", "port": 123 }, "mySystem": { @@ -139,8 +139,8 @@ "myManagementRoute": { "class": "ManagementRoute", "remark": "not-configured-by-dhcp", - "network": "1.2.3.4", - "gw": "4.3.2.1", + "network": "192.0.2.13", + "gw": "192.0.2.14", "mtu": 0 } } diff --git a/test/integration/misc/deleteTests.js b/test/integration/misc/deleteTests.js index db07f5b5..ceb6887d 100644 --- a/test/integration/misc/deleteTests.js +++ b/test/integration/misc/deleteTests.js @@ -50,7 +50,7 @@ describe('Delete items', function DeleteItems() { }, mySelfIp: { class: 'SelfIp', - address: '192.0.1.1/32', + address: '192.0.2.10/32', vlan: 'myVlan', allowService: 'default' } diff --git a/test/integration/misc/rollback.js b/test/integration/misc/rollback.js index be411671..ce5c3a42 100644 --- a/test/integration/misc/rollback.js +++ b/test/integration/misc/rollback.js @@ -57,7 +57,7 @@ describe('Rollback', function User() { }, mySelfIp: { class: 'SelfIp', - address: '192.0.1.1/32', + address: '192.0.2.10/32', vlan: 'myVlan', allowService: 'default' } diff --git a/test/integration/property/propertiesAuthentication.js b/test/integration/property/propertiesAuthentication.js index 42a9b39a..d604cc1a 100644 --- a/test/integration/property/propertiesAuthentication.js +++ b/test/integration/property/propertiesAuthentication.js @@ -195,7 +195,7 @@ describe('Authentication', function testAuthentication() { searchTimeout: 687, servers: [ 'a.host.com', - '1.2.3.4', + '192.0.2.10', 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329' ], ssl: 'enabled', @@ -228,7 +228,7 @@ describe('Authentication', function testAuthentication() { searchTimeout: 888, servers: [ 'b.host.com', - '5.6.7.8', + '192.0.2.20', 'FE80:0000:0000:0000:0202:B3FF:FE1E:1111' ], ssl: 'disabled', @@ -265,7 +265,7 @@ describe('Authentication', function testAuthentication() { searchTimeout: 687, servers: [ 'a.host.com', - '1.2.3.4', + '192.0.2.10', 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329' ], ssl: 'enabled', @@ -295,7 +295,7 @@ describe('Authentication', function testAuthentication() { searchTimeout: 888, servers: [ 'b.host.com', - '5.6.7.8', + '192.0.2.20', 'FE80:0000:0000:0000:0202:B3FF:FE1E:1111' ], ssl: 'disabled', @@ -354,7 +354,7 @@ describe('Authentication', function testAuthentication() { secret: 'test', servers: [ 'a.host.com', - '1.2.3.4', + '192.0.2.10', 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329' ], service: 'ppp' @@ -369,7 +369,7 @@ describe('Authentication', function testAuthentication() { secret: 'test', servers: [ 'b.host.com', - '5.6.7.8', + '192.0.2.20', 'FE80:0000:0000:0000:0202:B3FF:FE1E:1111' ], service: 'shell' @@ -383,7 +383,7 @@ describe('Authentication', function testAuthentication() { protocol: 'ip', servers: [ 'a.host.com', - '1.2.3.4', + '192.0.2.10', 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329' ], service: 'ppp' @@ -397,7 +397,7 @@ describe('Authentication', function testAuthentication() { protocol: 'ipx', servers: [ 'b.host.com', - '5.6.7.8', + '192.0.2.20', 'FE80:0000:0000:0000:0202:B3FF:FE1E:1111' ], service: 'shell' diff --git a/test/integration/property/propertiesHttpd.js b/test/integration/property/propertiesHttpd.js index 6c99be0e..489df2b4 100644 --- a/test/integration/property/propertiesHttpd.js +++ b/test/integration/property/propertiesHttpd.js @@ -35,8 +35,8 @@ describe('HTTPD', function testAuthentication() { const properties = [ { name: 'allow', - inputValue: [undefined, ['1.2.3.4'], undefined], - expectedValue: [['All'], ['1.2.3.4'], ['All']] + inputValue: [undefined, ['192.0.2.10'], undefined], + expectedValue: [['All'], ['192.0.2.10'], ['All']] }, { name: 'authPamIdleTimeout', diff --git a/test/integration/property/propertiesSecurityAnalytics.js b/test/integration/property/propertiesSecurityAnalytics.js new file mode 100644 index 00000000..ca869246 --- /dev/null +++ b/test/integration/property/propertiesSecurityAnalytics.js @@ -0,0 +1,248 @@ +/** + * Copyright 2023 F5 Networks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const { + assertClass, + deProvisionModules, + provisionModules +} = require('./propertiesCommon'); + +// Remove the .skip once AUTOTOOL-3700 has been resolved. +describe.skip('Security Analytics', function testSecurityAnalyticsSuite() { + this.timeout(900000); + + before(() => { + const modules = ['afm']; + return provisionModules(modules); + }); + + after(() => { + const modules = ['afm']; + return deProvisionModules(modules); + }); + + it('All properties', () => { + const properties = [ + { + name: 'aclRules', + inputValue: [ + {}, + { + collectClientIpEnabled: false, + collectClientPortEnabled: true, + collectDestinationIpEnabled: false, + collectDestinationPortEnabled: false, + collectServerSideStatsEnabled: true + }, + {} + ], + expectedValue: [ + { + collectClientIp: 'enabled', + collectClientPort: 'disabled', + collectDestIp: 'enabled', + collectDestPort: 'enabled', + collectServerSideStats: 'disabled' + }, + { + collectClientIp: 'disabled', + collectClientPort: 'enabled', + collectDestIp: 'disabled', + collectDestPort: 'disabled', + collectServerSideStats: 'enabled' + }, + { + collectClientIp: 'enabled', + collectClientPort: 'disabled', + collectDestIp: 'enabled', + collectDestPort: 'enabled', + collectServerSideStats: 'disabled' + } + ] + }, + { + name: 'collectAllDosStatsEnabled', + inputValue: [undefined, true, undefined], + expectedValue: ['disabled', 'enabled', 'disabled'] + }, + { + name: 'collectedStatsExternalLoggingEnabled', + inputValue: [undefined, true, undefined], + expectedValue: ['disabled', 'enabled', 'disabled'] + }, + { + name: 'collectedStatsInternalLoggingEnabled', + inputValue: [undefined, true, undefined], + expectedValue: ['disabled', 'enabled', 'disabled'] + }, + { + name: 'dns', + inputValue: [ + {}, + { + collectClientIpEnabled: false, + collectDestinationIpEnabled: false + }, + {} + ], + expectedValue: [ + { + collectClientIp: 'enabled', + collectDestinationIp: 'enabled' + }, + { + collectClientIp: 'disabled', + collectDestinationIp: 'disabled' + }, + { + collectClientIp: 'enabled', + collectDestinationIp: 'enabled' + } + ] + }, + { + name: 'collectDnsStatsEnabled', + inputValue: [undefined, false, undefined], + expectedValue: ['enabled', 'disabled', 'enabled'] + }, + { + name: 'dosL2L4', + inputValue: [ + {}, + { + collectClientIpEnabled: false, + collectDestinationGeoEnabled: false + }, + {} + ], + expectedValue: [ + { + collectClientIp: 'enabled', + collectDestGeo: 'enabled' + }, + { + collectClientIp: 'disabled', + collectDestGeo: 'disabled' + }, + { + collectClientIp: 'enabled', + collectDestGeo: 'enabled' + } + ] + }, + { + name: 'collectDosL3StatsEnabled', + inputValue: [undefined, false, undefined], + expectedValue: ['enabled', 'disabled', 'enabled'] + }, + { + name: 'collectFirewallAclStatsEnabled', + inputValue: [undefined, false, undefined], + expectedValue: ['enabled', 'disabled', 'enabled'] + }, + { + name: 'collectFirewallDropsStatsEnabled', + inputValue: [undefined, false, undefined], + expectedValue: ['enabled', 'disabled', 'enabled'] + }, + { + name: 'collectIpReputationStatsEnabled', + inputValue: [undefined, false, undefined], + expectedValue: ['enabled', 'disabled', 'enabled'] + }, + { + name: 'l3L4Errors', + inputValue: [ + {}, + { + collectClientIpEnabled: false, + collectDestinationIpEnabled: false + }, + {} + ], + expectedValue: [ + { + collectClientIp: 'enabled', + collectDestIp: 'enabled' + }, + { + collectClientIp: 'disabled', + collectDestIp: 'disabled' + }, + { + collectClientIp: 'enabled', + collectDestIp: 'enabled' + } + ] + }, + { + name: 'collectSipStatsEnabled', + inputValue: [undefined, false, undefined], + expectedValue: ['enabled', 'disabled', 'enabled'] + }, + { + name: 'collectStaleRulesEnabled', + inputValue: [ + undefined, + true, + undefined + ], + expectedValue: [ + { + collect: 'disabled' + }, + { + collect: 'enabled' + }, + { + collect: 'disabled' + } + ], + extractFunction: (o) => o.staleRules + }, + { + name: 'publisher', + inputValue: [undefined, 'default-ipsec-log-publisher', undefined], + expectedValue: [undefined, 'default-ipsec-log-publisher', undefined], + extractFunction: (o) => (o.publisher ? o.publisher.name : undefined) + }, + { + name: 'smtpConfig', + inputValue: [undefined, 'testSmtpServer', undefined], + expectedValue: [undefined, 'testSmtpServer', undefined], + extractFunction: (o) => (o.smtpConfig ? o.smtpConfig.name : undefined) + } + ]; + + const options = { + bigipItems: [ + { + endpoint: '/tm/sys/smtp-server', + data: { + name: 'testSmtpServer', + smtpServerHostName: 'test.hostname', + localHostName: 'local.hostname', + fromAddress: 'example@example.com' + } + } + ] + }; + + return assertClass('SecurityAnalytics', properties, options); + }); +}); diff --git a/test/integration/property/propertiesSnmp.js b/test/integration/property/propertiesSnmp.js index 628da55a..b63b7d9f 100644 --- a/test/integration/property/propertiesSnmp.js +++ b/test/integration/property/propertiesSnmp.js @@ -48,20 +48,20 @@ describe('Snmp', function testSnmp() { { name: 'allowList', inputValue: [ - ['127.0.0.0/8'], + ['192.0.2.10/8'], [ '10.30.100.0/23', '10.40.100.0/23' ], - ['127.0.0.0/8'] + ['192.0.2.10/8'] ], expectedValue: [ - ['127.0.0.0/8'], + ['192.0.2.10/8'], [ '10.30.100.0/23', '10.40.100.0/23' ], - ['127.0.0.0/8'] + ['192.0.2.10/8'] ] }, { diff --git a/test/integration/property/propertiesTunnel.js b/test/integration/property/propertiesTunnel.js index a035cc07..54151c7a 100644 --- a/test/integration/property/propertiesTunnel.js +++ b/test/integration/property/propertiesTunnel.js @@ -71,8 +71,8 @@ describe('Tunnel', function testAuthentication() { // Any6 is outside the remote address range of ips { name: 'remoteAddress', - inputValue: ['any', '224.0.0.1', 'any'], - expectedValue: ['any', '224.0.0.1', 'any'] + inputValue: ['any', '192.0.2.10', 'any'], + expectedValue: ['any', '192.0.2.10', 'any'] }, // Can only be configured with a NVGRE Tunnel { @@ -170,12 +170,12 @@ describe('Tunnel', function testAuthentication() { // Any6 is outside the remote address range of ips { name: 'remoteAddress', - inputValue: ['224.0.0.1', 'any', '224.0.0.1'], + inputValue: ['233.252.0.10', 'any', '233.252.0.10'], skipAssert: true }, { name: 'localAddress', - inputValue: ['224.0.0.2'], + inputValue: ['192.0.2.11'], skipAssert: true } ]; diff --git a/test/integration/test.js b/test/integration/test.js index 82f19ee2..dd3b901e 100644 --- a/test/integration/test.js +++ b/test/integration/test.js @@ -151,7 +151,7 @@ describe('Declarative Onboarding Integration Test Suite', function performIntegr currentState.FailoverMulticast, { multicastInterface: 'eth0', - multicastIp: '224.0.0.100', + multicastIp: '233.252.0.10', multicastPort: 123 } )); @@ -214,9 +214,9 @@ describe('Declarative Onboarding Integration Test Suite', function performIntegr { name: 'myManagementRoute', description: 'not-configured-by-dhcp', - gateway: '4.3.2.1', + gateway: '192.0.2.14', mtu: 0, - network: '1.2.3.4/32' + network: '192.0.2.13/32' } )); @@ -1018,7 +1018,7 @@ describe('Declarative Onboarding Integration Test Suite', function performIntegr transparent: 'enabled', monitorType: 'http', description: 'description', - destination: '1.1.1.1:80', + destination: '192.0.2.10:80', ignoreDownResponse: 'enabled', reverse: 'enabled', recv: 'HTTP' @@ -1036,7 +1036,7 @@ describe('Declarative Onboarding Integration Test Suite', function performIntegr transparent: 'enabled', monitorType: 'https', description: 'description', - destination: '2.2.2.2:80', + destination: '192.0.2.16:80', ignoreDownResponse: 'enabled', reverse: 'enabled', recv: 'HTTP', @@ -1055,7 +1055,7 @@ describe('Declarative Onboarding Integration Test Suite', function performIntegr transparent: 'enabled', monitorType: 'gateway-icmp', description: 'description', - destination: '3.3.3.3:80', + destination: '192.0.2.15:80', ignoreDownResponse: 'enabled', probeInterval: 1, probeAttempts: 3 @@ -1072,7 +1072,7 @@ describe('Declarative Onboarding Integration Test Suite', function performIntegr transparent: 'enabled', monitorType: 'tcp', description: 'description', - destination: '4.4.4.4:80', + destination: '192.0.2.12:80', ignoreDownResponse: 'enabled', reverse: 'enabled', recv: 'example receive', @@ -1091,7 +1091,7 @@ describe('Declarative Onboarding Integration Test Suite', function performIntegr transparent: 'enabled', monitorType: 'udp', description: 'description', - destination: '5.5.5.5:80', + destination: '192.0.2.18:80', ignoreDownResponse: 'enabled', reverse: 'enabled', recv: 'udp receive', @@ -1546,7 +1546,7 @@ function testDnsResolver(target, response) { const responseForwardZone = responseResolver.forwardZones[0]; const validName = responseForwardZone.name === 'forward.net'; const validNameserver = responseForwardZone.nameservers[0].name === '10.10.10.10:53'; - const validIpv6Nameserver = responseForwardZone.nameservers[1].name === '20.20.20.20:53'; + const validIpv6Nameserver = responseForwardZone.nameservers[1].name === '192.0.2.11:53'; return validName && validNameserver && validIpv6Nameserver diff --git a/test/unit/lib/authHandlerTests.js b/test/unit/lib/authHandlerTests.js index ddf4a1c0..bf9f3df7 100644 --- a/test/unit/lib/authHandlerTests.js +++ b/test/unit/lib/authHandlerTests.js @@ -124,7 +124,7 @@ describe('authHandler', () => { serviceType: 'callback-login', servers: { primary: { - server: '1.2.3.4', + server: '192.0.2.10', port: 1811, secret: 'something' }, @@ -147,7 +147,7 @@ describe('authHandler', () => { assert.strictEqual(pathsSent[0], '/tm/auth/radius-server'); assert.deepEqual(dataSent[0], { - server: '1.2.3.4', + server: '192.0.2.10', port: 1811, secret: 'something', name: 'system_auth_name1', @@ -196,7 +196,7 @@ describe('authHandler', () => { serviceType: 'callback-login', servers: { primary: { - server: '1.2.3.4', + server: '192.0.2.10', port: 1811, secret: 'something' } @@ -229,7 +229,7 @@ describe('authHandler', () => { serviceType: 'callback-login', servers: { primary: { - server: '1.2.3.4', + server: '192.0.2.10', port: 1811, secret: 'something' } @@ -259,7 +259,7 @@ describe('authHandler', () => { radius: { servers: { name: 'foo', - server: '1.2.3.4', + server: '192.0.2.10', port: 1811, secret: 'something' } @@ -306,7 +306,7 @@ describe('authHandler', () => { tacacs: { servers: [ 'my.host.com', - '1.2.3.4', + '192.0.2.10', 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329' ], secret: 'test', @@ -333,7 +333,7 @@ describe('authHandler', () => { secret: 'test', servers: [ 'my.host.com', - '1.2.3.4', + '192.0.2.10', 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329' ], service: 'ppp' @@ -357,7 +357,7 @@ describe('authHandler', () => { servers: [ 'my.host.com', - '1.2.3.4', + '192.0.2.10', 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329' ], secret: 'test', @@ -382,7 +382,7 @@ describe('authHandler', () => { protocol: 'http', servers: [ 'my.host.com', - '1.2.3.4', + '192.0.2.10', 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329' ], secret: 'test', @@ -442,7 +442,7 @@ describe('authHandler', () => { searchTimeout: 30, servers: [ 'my.host.com', - '1.2.3.4', + '192.0.2.10', 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329' ], ssl: 'disabled', @@ -485,7 +485,7 @@ describe('authHandler', () => { searchTimeout: 30, servers: [ 'my.host.com', - '1.2.3.4', + '192.0.2.10', 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329' ], ssl: 'disabled', @@ -527,7 +527,7 @@ describe('authHandler', () => { searchTimeout: 687, servers: [ 'my.host.com', - '1.2.3.4', + '192.0.2.10', 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329' ], ssl: 'tls-start', @@ -653,7 +653,7 @@ describe('authHandler', () => { searchTimeout: 687, servers: [ 'my.host.com', - '1.2.3.4', + '192.0.2.10', 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329' ], ssl: 'tls-start', @@ -688,7 +688,7 @@ describe('authHandler', () => { searchTimeout: 30, servers: [ 'my.host.com', - '1.2.3.4', + '192.0.2.10', 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329' ], ssl: 'disabled', @@ -742,7 +742,7 @@ describe('authHandler', () => { searchTimeout: 30, servers: [ 'my.host.com', - '1.2.3.4', + '192.0.2.10', 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329' ], ssl: 'disabled', diff --git a/test/unit/lib/bigIqSettingsValidatorTests.js b/test/unit/lib/bigIqSettingsValidatorTests.js index e7cd6d39..9c791f85 100644 --- a/test/unit/lib/bigIqSettingsValidatorTests.js +++ b/test/unit/lib/bigIqSettingsValidatorTests.js @@ -25,7 +25,7 @@ describe('bigIqSettingsValidator', () => { describe('valid', () => { it('should validate declarations with no bigIqSettings', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { } @@ -39,7 +39,7 @@ describe('bigIqSettingsValidator', () => { it('should validate declarations with valid bigIqSettings', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', bigIqSettings: { snapshotWorkingConfig: true }, @@ -58,7 +58,7 @@ describe('bigIqSettingsValidator', () => { describe('clusterName', () => { it('should validate declarations with deviceGroup and clusterName', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', bigIqSettings: { snapshotWorkingConfig: true, clusterName: 'foo' @@ -79,7 +79,7 @@ describe('bigIqSettingsValidator', () => { it('should invalidate declarations with deviceGroup but no clusterName', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', bigIqSettings: { snapshotWorkingConfig: true }, @@ -101,7 +101,7 @@ describe('bigIqSettingsValidator', () => { describe('accessModuleProperties', () => { it('should validate declarations with apm and accessModuleProperties', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', bigIqSettings: { snapshotWorkingConfig: true, accessModuleProperties: { @@ -125,7 +125,7 @@ describe('bigIqSettingsValidator', () => { it('should validate declarations with apm none and no accessModuleProperties', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', bigIqSettings: { snapshotWorkingConfig: true }, @@ -146,7 +146,7 @@ describe('bigIqSettingsValidator', () => { it('should validate declarations with no apm and no accessModuleProperties', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', bigIqSettings: { snapshotWorkingConfig: true }, @@ -166,7 +166,7 @@ describe('bigIqSettingsValidator', () => { it('should invalidate declarations with apm but no accessModuleProperties', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', bigIqSettings: { snapshotWorkingConfig: true }, diff --git a/test/unit/lib/configManagerTests.js b/test/unit/lib/configManagerTests.js index 8ed9b4c7..f1099918 100644 --- a/test/unit/lib/configManagerTests.js +++ b/test/unit/lib/configManagerTests.js @@ -30,7 +30,7 @@ const ConfigItems = require('../../../src/lib/configItems.json'); describe('configManager', () => { const hostname = 'myhost.bigip.com'; const deviceName = 'device1'; - const version = '15.1.6.5'; + const version = '15.1.6'; let listResponses; let bigIpMock; @@ -101,7 +101,7 @@ describe('configManager', () => { { name: 'default', partition: 'Common', - gw: '1.2.3.4', + gw: '192.0.2.70', network: 'default', mtu: 0 }, @@ -109,13 +109,13 @@ describe('configManager', () => { name: 'route1', partition: 'LOCAL_ONLY', tmInterface: '/Common/myVlan', - network: '5.5.5.5', + network: '192.0.2.90', mtu: 1500 }, { name: 'outsideDoRoute', partition: 'otherPartition', - gw: '3.3.3.5', + gw: '192.0.2.60', network: 'default', mtu: 12 } @@ -128,7 +128,7 @@ describe('configManager', () => { state.currentConfig.Common.Route, { default: { - gw: '1.2.3.4', + gw: '192.0.2.70', mtu: 0, name: 'default', network: 'default' @@ -137,7 +137,7 @@ describe('configManager', () => { tmInterface: 'myVlan', mtu: 1500, name: 'route1', - network: '5.5.5.5', + network: '192.0.2.90', localOnly: true } } @@ -233,14 +233,14 @@ describe('configManager', () => { listResponses['/tm/net/route'] = [ { name: 'default', - gw: '1.2.3.4', + gw: '192.0.2.70', network: 'default', mtu: 0 }, { name: 'route1', - gw: '5.6.7.8', - network: '5.5.5.5', + gw: '192.0.2.71', + network: '192.0.2.90', mtu: 1500 } ]; @@ -252,7 +252,7 @@ describe('configManager', () => { state.currentConfig.Common.Route.default, { name: 'default', - gw: '1.2.3.4', + gw: '192.0.2.70', network: 'default', mtu: 0 } @@ -261,8 +261,8 @@ describe('configManager', () => { state.currentConfig.Common.Route.route1, { name: 'route1', - gw: '5.6.7.8', - network: '5.5.5.5', + gw: '192.0.2.71', + network: '192.0.2.90', mtu: 1500 } ); @@ -501,7 +501,7 @@ describe('configManager', () => { { name: 'default', fullPath: '/Common/default', - gateway: '8.8.8.8', + gateway: '192.0.2.40', network: 'default', mtu: 0, myProp1: 'my property 1', @@ -518,7 +518,7 @@ describe('configManager', () => { .then(() => { assert.strictEqual( state.currentConfig.Common.ManagementRoute.default.gw, - '8.8.8.8' + '192.0.2.40' ); assert.strictEqual( state.currentConfig.Common.ManagementRoute.default.gateway, @@ -631,7 +631,7 @@ describe('configManager', () => { { name: 'examplePrefixList', entriesReference: { - link: 'https://localhost/mgmt/tm/net/routing/prefix-list/~Common~examplePrefixList/entries?ver=14.1.2.7' + link: 'https://localhost/mgmt/tm/net/routing/prefix-list/~Common~examplePrefixList/entries?ver=14.1.2' } } ]; @@ -750,15 +750,15 @@ describe('configManager', () => { name: deviceName, unicastAddress: [ { - effectiveIp: '1.1.1.106', + effectiveIp: '192.0.2.50', effectivePort: 1026, - ip: '1.1.1.106', + ip: '192.0.2.50', port: 1026 }, { - effectiveIp: '1.1.1.2', + effectiveIp: '192.0.2.51', effectivePort: 777, - ip: '1.1.1.2', + ip: '192.0.2.51', port: 777 } ] @@ -771,11 +771,11 @@ describe('configManager', () => { { unicastAddress: [ { - ip: '1.1.1.106', + ip: '192.0.2.50', port: 1026 }, { - ip: '1.1.1.2', + ip: '192.0.2.51', port: 777 } ] @@ -2271,14 +2271,14 @@ describe('configManager', () => { name: 'kernel', routeMap: '/Common/routeMap1', routeMapReference: { - link: 'https://localhost/mgmt/tm/net/routing/route-map/~Common~routeMap1?ver=14.1.2.8' + link: 'https://localhost/mgmt/tm/net/routing/route-map/~Common~routeMap1?ver=14.1.2' } }, { name: 'static', routeMap: '/Common/routeMap1', routeMapReference: { - link: 'https://localhost/mgmt/tm/net/routing/route-map/~Common~routeMap1?ver=14.1.2.8' + link: 'https://localhost/mgmt/tm/net/routing/route-map/~Common~routeMap1?ver=14.1.2' } } ] @@ -2297,24 +2297,24 @@ describe('configManager', () => { name: 'kernel', routeMap: '/Common/routeMap1', routeMapReference: { - link: 'https://localhost/mgmt/tm/net/routing/route-map/~Common~routeMap1?ver=14.1.2.8' + link: 'https://localhost/mgmt/tm/net/routing/route-map/~Common~routeMap1?ver=14.1.2' } }, { name: 'static', routeMap: '/Common/routeMap1', routeMapReference: { - link: 'https://localhost/mgmt/tm/net/routing/route-map/~Common~routeMap1?ver=14.1.2.8' + link: 'https://localhost/mgmt/tm/net/routing/route-map/~Common~routeMap1?ver=14.1.2' } } ] } ], neighborReference: { - link: 'https://localhost/mgmt/tm/net/routing/bgp/~Common~peerGroup/neighbor?ver=14.1.2.8' + link: 'https://localhost/mgmt/tm/net/routing/bgp/~Common~peerGroup/neighbor?ver=14.1.2' }, peerGroupReference: { - link: 'https://localhost/mgmt/tm/net/routing/bgp/~Common~peerGroup/peer-group?ver=14.1.2.8' + link: 'https://localhost/mgmt/tm/net/routing/bgp/~Common~peerGroup/peer-group?ver=14.1.2' } } ]; @@ -2352,11 +2352,11 @@ describe('configManager', () => { routeMap: { in: '/Common/routeMap1', inReference: { - link: 'https://localhost/mgmt/tm/net/routing/route-map/~Common~routeMap1?ver=14.1.2.8' + link: 'https://localhost/mgmt/tm/net/routing/route-map/~Common~routeMap1?ver=14.1.2' }, out: '/Common/routeMap1', outReference: { - link: 'https://localhost/mgmt/tm/net/routing/route-map/~Common~routeMap1?ver=14.1.2.8' + link: 'https://localhost/mgmt/tm/net/routing/route-map/~Common~routeMap1?ver=14.1.2' } }, softReconfigurationInbound: 'enabled' @@ -2492,7 +2492,7 @@ describe('configManager', () => { { name: 'exampleAsPath', entriesReference: { - link: 'https://localhost/mgmt/tm/net/routing/as-path/~Common~exampleAsPath/entries?ver=14.1.2.7' + link: 'https://localhost/mgmt/tm/net/routing/as-path/~Common~exampleAsPath/entries?ver=14.1.2' } } ]; @@ -2541,7 +2541,7 @@ describe('configManager', () => { { name: 'exampleRouteMap', entriesReference: { - link: 'https://localhost/mgmt/tm/net/routing/route-map/~Common~exampleRouteMap/entries?ver=14.1.2.8' + link: 'https://localhost/mgmt/tm/net/routing/route-map/~Common~exampleRouteMap/entries?ver=14.1.2' } } ]; @@ -2647,7 +2647,7 @@ describe('configManager', () => { { name: 'examplePrefixList', entriesReference: { - link: 'https://localhost/mgmt/tm/net/routing/prefix-list/~Common~examplePrefixList/entries?ver=14.1.2.7' + link: 'https://localhost/mgmt/tm/net/routing/prefix-list/~Common~examplePrefixList/entries?ver=14.1.2' } } ]; @@ -2880,7 +2880,7 @@ describe('configManager', () => { { name: 'virtualServer1', description: 'virtual server description one', - destination: '192.0.10.20:443', + destination: '192.0.2.80:443', enabled: false, disabled: true, translationAddress: '10.10.0.10', @@ -2941,7 +2941,7 @@ describe('configManager', () => { name: 'virtualServer1', description: 'virtual server description one', enabled: false, - address: '192.0.10.20', + address: '192.0.2.80', port: 443, translationAddress: '10.10.0.10', translationPort: 23, @@ -3064,7 +3064,7 @@ describe('configManager', () => { selfLink: 'https://localhost/mgmt/tm/gtm/monitor/http/~Common~GSLBmonitor?ver=15.1.2', defaultsFrom: '/Common/http', description: 'description', - destination: '1.1.1.1:80', + destination: '192.0.2.20:80', ignoreDownResponse: 'enabled', interval: 100, probeTimeout: 110, @@ -3095,7 +3095,7 @@ describe('configManager', () => { description: 'description', reverse: 'enabled', send: 'HEAD / HTTP/1.0\\r\\n', - destination: '1.1.1.1:80', + destination: '192.0.2.20:80', timeout: 1000, transparent: 'enabled' } @@ -3573,7 +3573,7 @@ describe('configManager', () => { listResponses['/tm/sys/management-route'] = [ { name: '24', - fullPath: '/Common/8.8.8.8/32' + fullPath: '/Common/192.0.2.40/32' } ]; @@ -3583,8 +3583,8 @@ describe('configManager', () => { assert.deepStrictEqual( state.currentConfig.Common.ManagementRoute, { - '8.8.8.8/32': { - name: '8.8.8.8/32', + '192.0.2.40/32': { + name: '192.0.2.40/32', description: 'none' } } @@ -3600,7 +3600,7 @@ describe('configManager', () => { listResponses['/tm/sys/snmp/users'] = [ { name: 'user1', - username: 'special!username' + username: 'bigipUsername' } ]; @@ -3611,7 +3611,7 @@ describe('configManager', () => { state.currentConfig.Common.SnmpUser.user1, { name: 'user1', - username: 'special!username', + username: 'bigipUsername', oidSubset: 'none', authProtocol: 'none', privacyProtocol: 'none' @@ -3662,7 +3662,7 @@ describe('configManager', () => { tos: 'preserve', usePmtu: 'enabled', localAddress: '10.145.0.1', - remoteAddress: '250.250.0.1', + remoteAddress: '192.0.2.30', secondaryAddress: 'any6', key: 0, mode: 'bidirectional', @@ -3720,7 +3720,7 @@ describe('configManager', () => { tos: 'preserve', usePmtu: 'enabled', localAddress: '10.145.0.1', - remoteAddress: '250.250.0.1', + remoteAddress: '192.0.2.30', secondaryAddress: 'any6', key: 0, mode: 'bidirectional', diff --git a/test/unit/lib/configResponseTests.js b/test/unit/lib/configResponseTests.js index f5bd6706..fe3f0e46 100644 --- a/test/unit/lib/configResponseTests.js +++ b/test/unit/lib/configResponseTests.js @@ -37,7 +37,7 @@ state.originalConfig = { }, DNS: { nameServers: [ - '8.8.8.8' + '192.0.2.10' ] }, VLAN: { @@ -59,7 +59,7 @@ state.originalConfig = { }, DNS: { nameServers: [ - '127.0.1.1' + '192.0.2.20' ] }, VLAN: { @@ -123,7 +123,7 @@ describe('configResponse', () => { hostname: 'bigip1.example.com', Provision: { afm: 'none', ltm: 'nominal', urldb: 'none' }, NTP: { timezone: 'UTC' }, - DNS: { nameServers: ['8.8.8.8'] }, + DNS: { nameServers: ['192.0.2.10'] }, VLAN: { foo: '1234 vlan' } }, lastUpdate: 'last update 1234' @@ -135,7 +135,7 @@ describe('configResponse', () => { hostname: 'bigip2.example.com', Provision: { afm: 'nominal', ltm: 'none', urldb: 'none' }, NTP: { timezone: 'America/Los_Angeles' }, - DNS: { nameServers: ['127.0.1.1'] }, + DNS: { nameServers: ['192.0.2.20'] }, VLAN: { foo: '5678 vlan' } }, lastUpdate: 'last update 5678' diff --git a/test/unit/lib/declarationHandlerTests.js b/test/unit/lib/declarationHandlerTests.js index b999c85b..1d9c3797 100644 --- a/test/unit/lib/declarationHandlerTests.js +++ b/test/unit/lib/declarationHandlerTests.js @@ -127,7 +127,7 @@ describe('declarationHandler', () => { name: 'afm', fullPath: 'afm', generation: 1, - selfLink: 'https://localhost/mgmt/tm/sys/provision/afm?ver=12.1.5.1', + selfLink: 'https://localhost/mgmt/tm/sys/provision/afm?ver=12.1.5', cpuRatio: 0, diskRatio: 0, level: 'none', @@ -138,7 +138,7 @@ describe('declarationHandler', () => { name: 'avr', fullPath: 'avr', generation: 1, - selfLink: 'https://localhost/mgmt/tm/sys/provision/avr?ver=12.1.5.1', + selfLink: 'https://localhost/mgmt/tm/sys/provision/avr?ver=12.1.5', cpuRatio: 0, diskRatio: 0, level: 'none', @@ -149,7 +149,7 @@ describe('declarationHandler', () => { name: 'urldb', fullPath: 'urldb', generation: 1, - selfLink: 'https://localhost/mgmt/tm/sys/provision/urldb?ver=12.1.5.1', + selfLink: 'https://localhost/mgmt/tm/sys/provision/urldb?ver=12.1.5', cpuRatio: 0, diskRatio: 0, level: 'none', @@ -778,7 +778,7 @@ describe('declarationHandler', () => { Common: { ManagementIp: { myManagementIp: { - name: '1.2.3.4/5' + name: '192.0.2.10/5' } } } @@ -797,8 +797,8 @@ describe('declarationHandler', () => { assert.deepStrictEqual( declarationWithDefaults.Common.ManagementIp, { - '1.2.3.4/5': { - name: '1.2.3.4/5' + '192.0.2.10/5': { + name: '192.0.2.10/5' } } ); @@ -819,8 +819,8 @@ describe('declarationHandler', () => { originalConfig: { Common: { ManagementIp: { - '1.2.3.4/5': { - name: '1.2.3.4/5' + '192.0.2.10/5': { + name: '192.0.2.10/5' } } } @@ -832,8 +832,8 @@ describe('declarationHandler', () => { assert.deepStrictEqual( declarationWithDefaults.Common.ManagementIp, { - '1.2.3.4/5': { - name: '1.2.3.4/5' + '192.0.2.10/5': { + name: '192.0.2.10/5' } } ); @@ -2294,7 +2294,7 @@ describe('declarationHandler', () => { name: '20', destination: '10.10.10.10', action: 'deny', - source: '20.20.20.20' + source: '192.0.2.20' } ]; @@ -2302,7 +2302,7 @@ describe('declarationHandler', () => { return declarationHandler.process(newDeclaration) .then(() => { assert.strictEqual(declarationWithDefaults.Common.RoutingAccessList.list.entries[0].destination, '10.10.10.10/32'); - assert.strictEqual(declarationWithDefaults.Common.RoutingAccessList.list.entries[0].source, '20.20.20.20/32'); + assert.strictEqual(declarationWithDefaults.Common.RoutingAccessList.list.entries[0].source, '192.0.2.20/32'); }); }); @@ -2330,7 +2330,7 @@ describe('declarationHandler', () => { name: '20', destination: '10.10.0.0/16', action: 'deny', - source: '20.20.0.0/16' + source: '192.0.2.20/16' } ]; @@ -2338,7 +2338,7 @@ describe('declarationHandler', () => { return declarationHandler.process(newDeclaration) .then(() => { assert.strictEqual(declarationWithDefaults.Common.RoutingAccessList.list.entries[0].destination, '10.10.0.0/16'); - assert.strictEqual(declarationWithDefaults.Common.RoutingAccessList.list.entries[0].source, '20.20.0.0/16'); + assert.strictEqual(declarationWithDefaults.Common.RoutingAccessList.list.entries[0].source, '192.0.2.20/16'); }); }); @@ -3336,8 +3336,8 @@ describe('declarationHandler', () => { ManagementRoute: { newManagementRoute: { name: 'newManagementRoute', - network: '1.2.3.4', - gw: '4.3.2.1', + network: '192.0.2.10', + gw: '192.0.2.30', mtu: 0 } } @@ -3392,8 +3392,8 @@ describe('declarationHandler', () => { ManagementRoute: { newManagementRoute: { name: 'newManagementRoute', - network: '1.2.3.4', - gw: '4.3.2.1', + network: '192.0.2.10', + gw: '192.0.2.30', mtu: 0 } } @@ -3678,7 +3678,7 @@ describe('declarationHandler', () => { name: 'afm', fullPath: 'afm', generation: 1, - selfLink: 'https://localhost/mgmt/tm/sys/provision/afm?ver=12.1.5.1', + selfLink: 'https://localhost/mgmt/tm/sys/provision/afm?ver=12.1.5', cpuRatio: 0, diskRatio: 0, level: 'none', @@ -3689,7 +3689,7 @@ describe('declarationHandler', () => { name: 'avr', fullPath: 'avr', generation: 1, - selfLink: 'https://localhost/mgmt/tm/sys/provision/avr?ver=12.1.5.1', + selfLink: 'https://localhost/mgmt/tm/sys/provision/avr?ver=12.1.5', cpuRatio: 0, diskRatio: 0, level: 'none', @@ -3700,7 +3700,7 @@ describe('declarationHandler', () => { name: 'urldb', fullPath: 'urldb', generation: 1, - selfLink: 'https://localhost/mgmt/tm/sys/provision/urldb?ver=12.1.5.1', + selfLink: 'https://localhost/mgmt/tm/sys/provision/urldb?ver=12.1.5', cpuRatio: 0, diskRatio: 0, level: 'none', diff --git a/test/unit/lib/declarationParserTests.js b/test/unit/lib/declarationParserTests.js index f82a70d8..8ab9201a 100644 --- a/test/unit/lib/declarationParserTests.js +++ b/test/unit/lib/declarationParserTests.js @@ -94,7 +94,7 @@ describe('declarationParser', () => { myDns: { class: 'DNS', nameServers: [ - '1.2.3.4', + '192.0.2.20', 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329' ], search: [ @@ -163,9 +163,9 @@ describe('declarationParser', () => { class: 'DNS_Resolver', forwardZones: [ { - name: 'google.public.dns', + name: 'test.public.dns', nameservers: [ - '8.8.8.8:53' + '192.0.2.10:53' ] } ] @@ -233,8 +233,8 @@ describe('declarationParser', () => { assert.strictEqual(parsedDeclaration.Common.MAC_Masquerade.commonMac2.source.interface, '1.2'); assert.strictEqual(parsedDeclaration.Common.MAC_Masquerade.commonMac2.trafficGroup, 'traffic-group-local-only'); assert.strictEqual(parsedDeclaration.Common.DNS_Resolver.commonDNS.name, 'commonDNS'); - assert.strictEqual(parsedDeclaration.Common.DNS_Resolver.commonDNS.forwardZones[0].name, 'google.public.dns'); - assert.strictEqual(parsedDeclaration.Common.DNS_Resolver.commonDNS.forwardZones[0].nameservers[0], '8.8.8.8:53'); + assert.strictEqual(parsedDeclaration.Common.DNS_Resolver.commonDNS.forwardZones[0].name, 'test.public.dns'); + assert.strictEqual(parsedDeclaration.Common.DNS_Resolver.commonDNS.forwardZones[0].nameservers[0], '192.0.2.10:53'); assert.strictEqual(parsedDeclaration.Tenant1.VLAN.app1Vlan.name, 'app1Vlan'); assert.strictEqual(parsedDeclaration.Tenant1.VLAN.app1Vlan.tag, 1234); assert.strictEqual(parsedDeclaration.Tenant1.VLAN.app2Vlan.tag, 3456); @@ -431,7 +431,7 @@ describe('declarationParser', () => { }, mySelfIp: { class: 'SelfIp', - address: '1.2.3.4', + address: '192.0.2.20', vlan: '/Common/myVlan' }, myConfigSync: { @@ -440,8 +440,8 @@ describe('declarationParser', () => { }, myLicense: { class: 'License', - bigIpUsername: '/Credentials/0/username', - bigIqUsername: '/Credentials/1/username', + bigIpUsername: '/Credentials/0/username', // #gitleaks:allow + bigIqUsername: '/Credentials/1/username', // #gitleaks:allow notAPointer: '/foo/bar' }, myFailoverUnicast: { @@ -457,10 +457,10 @@ describe('declarationParser', () => { const declarationParser = new DeclarationParser(declaration); const parsedDeclaration = declarationParser.parse().parsedDeclaration; assert.strictEqual(parsedDeclaration.Common.SelfIp.mySelfIp.vlan, '/Common/myVlan'); - assert.strictEqual(parsedDeclaration.Common.ConfigSync.configsyncIp, '1.2.3.4'); + assert.strictEqual(parsedDeclaration.Common.ConfigSync.configsyncIp, '192.0.2.20'); assert.strictEqual(parsedDeclaration.Common.License.bigIpUsername, 'myUser'); assert.strictEqual(parsedDeclaration.Common.License.bigIqUsername, 'myOtherUser'); - assert.strictEqual(parsedDeclaration.Common.FailoverUnicast.unicastAddress[0].ip, '1.2.3.4'); + assert.strictEqual(parsedDeclaration.Common.FailoverUnicast.unicastAddress[0].ip, '192.0.2.20'); // If we get a pointer that does not de-reference, we should just get back the // original pointer diff --git a/test/unit/lib/deleteHandlerTests.js b/test/unit/lib/deleteHandlerTests.js index 69dadff8..27412070 100644 --- a/test/unit/lib/deleteHandlerTests.js +++ b/test/unit/lib/deleteHandlerTests.js @@ -131,7 +131,7 @@ describe(('deleteHandler'), function testDeleteHandler() { deleteThisRoute: { name: 'deleteThisRoute', mtu: 0, - network: '1.2.3.5' + network: '192.0.2.10' } } } @@ -486,7 +486,7 @@ describe(('deleteHandler'), function testDeleteHandler() { deleteThisRoute: { name: 'deleteThisRoute', mtu: 0, - network: '1.2.3.5' + network: '192.0.2.10' } } } @@ -611,7 +611,7 @@ describe(('deleteHandler'), function testDeleteHandler() { description: 'none', key: 0, localAddress: '10.10.0.0', - remoteAddress: '20.20.0.0', + remoteAddress: '192.0.2.20', secondaryAddress: 'any6', mode: 'bidirectional', transparent: 'disabled', @@ -675,12 +675,12 @@ describe(('deleteHandler'), function testDeleteHandler() { route: { name: 'route', mtu: 0, - netowrk: '1.2.3.5' + netowrk: '192.0.2.10' }, localRoute: { name: 'localRoute', mtu: 0, - netowrk: '1.2.3.4', + netowrk: '192.0.2.11', localOnly: true } } @@ -1079,7 +1079,7 @@ describe(('deleteHandler'), function testDeleteHandler() { NetAddressList: { netAddressList: { name: 'netAddressList', - addresses: ['192.0.2.10', '192.1.2.0/24'] + addresses: ['192.0.2.10', '192.0.2.0/24'] } } } @@ -1108,13 +1108,13 @@ describe(('deleteHandler'), function testDeleteHandler() { NetAddressList: { netAddressList: { name: 'netAddressList', - addresses: ['192.0.2.10', '192.1.2.0/24'] + addresses: ['192.0.2.10', '192.0.2.0/24'] } }, FirewallAddressList: { netAddressList: { name: 'netAddressList', - addresses: ['192.0.2.10', '192.1.2.0/24'] + addresses: ['192.0.2.10', '192.0.2.0/24'] } } } @@ -1205,7 +1205,7 @@ describe(('deleteHandler'), function testDeleteHandler() { FirewallAddressList: { firewallAddressList: { name: 'firewallAddressList', - addresses: ['192.0.2.10', '192.1.2.0/24'] + addresses: ['192.0.2.10', '192.0.2.0/24'] } } } @@ -1234,13 +1234,13 @@ describe(('deleteHandler'), function testDeleteHandler() { NetAddressList: { netAddressList: { name: 'netAddressList', - addresses: ['192.0.2.10', '192.1.2.0/24'] + addresses: ['192.0.2.10', '192.0.2.0/24'] } }, FirewallAddressList: { netAddressList: { name: 'netAddressList', - addresses: ['192.0.2.10', '192.1.2.0/24'] + addresses: ['192.0.2.10', '192.0.2.0/24'] } } } diff --git a/test/unit/lib/doUtilTests.js b/test/unit/lib/doUtilTests.js index 65044fea..d0ea068a 100644 --- a/test/unit/lib/doUtilTests.js +++ b/test/unit/lib/doUtilTests.js @@ -419,14 +419,14 @@ describe('doUtil', () => { commandResult: 'status: NXDOMAIN' }); - return assert.isRejected(doUtil.checkDnsResolution(bigIpMock, '260.84.18.2'), 'Unable to resolve host 260.84.18.2'); + return assert.isRejected(doUtil.checkDnsResolution(bigIpMock, '260.84.18.2'), 'Unable to resolve host 260.84.18.2'); // gitleaks:allow }); it('should resolve true if a valid ip is given', () => { bigIpMock.create = () => Promise.resolve({ commandResult: 'status: NOERROR' }); - return assert.isFulfilled(doUtil.checkDnsResolution(bigIpMock, '160.84.18.2', true)); + return assert.isFulfilled(doUtil.checkDnsResolution(bigIpMock, '192.0.2.10', true)); }); it('should resolve true if dig returns the address', () => { diff --git a/test/unit/lib/dscHandlerTests.js b/test/unit/lib/dscHandlerTests.js index 98514d31..ca77e5db 100644 --- a/test/unit/lib/dscHandlerTests.js +++ b/test/unit/lib/dscHandlerTests.js @@ -69,7 +69,7 @@ describe('dscHandler', () => { const declaration = { Common: { ConfigSync: { - configsyncIp: '1.2.3.4' + configsyncIp: '192.0.2.10' } } }; @@ -77,7 +77,7 @@ describe('dscHandler', () => { const dscHandler = new DscHandler(declaration, bigIpMock); return dscHandler.process() .then(() => { - assert.strictEqual(configSyncIpSent, '1.2.3.4'); + assert.strictEqual(configSyncIpSent, '192.0.2.10'); }); }); @@ -85,7 +85,7 @@ describe('dscHandler', () => { const declaration = { Common: { ConfigSync: { - configsyncIp: '1.2.3.4/24' + configsyncIp: '192.0.2.10/24' } } }; @@ -93,7 +93,7 @@ describe('dscHandler', () => { const dscHandler = new DscHandler(declaration, bigIpMock); return dscHandler.process() .then(() => { - assert.strictEqual(configSyncIpSent, '1.2.3.4'); + assert.strictEqual(configSyncIpSent, '192.0.2.10'); }); }); @@ -129,7 +129,7 @@ describe('dscHandler', () => { }); describe('FailoverUnicast', () => { - const address = '1.2.3.4'; + const address = '192.0.2.10'; const port = 1234; let pathSent; @@ -148,7 +148,7 @@ describe('dscHandler', () => { FailoverUnicast: { unicastAddress: [ { ip: `${address}/24`, port }, - { ip: '5.6.7.8', port: 3456 } + { ip: '192.0.2.50', port: 3456 } ] } } @@ -160,8 +160,8 @@ describe('dscHandler', () => { assert.strictEqual(pathSent, '/tm/cm/device/~Common~my.bigip.com'); assert.deepStrictEqual(bodySent.unicastAddress, [ - { ip: '1.2.3.4', port: 1234 }, - { ip: '5.6.7.8', port: 3456 } + { ip: '192.0.2.10', port: 1234 }, + { ip: '192.0.2.50', port: 3456 } ]); }); }); @@ -183,7 +183,7 @@ describe('dscHandler', () => { const dscHandler = new DscHandler(declaration, bigIpMock); return dscHandler.process() .then(() => { - assert.strictEqual(bodySent.unicastAddress[0].ip, '1.2.3.4'); + assert.strictEqual(bodySent.unicastAddress[0].ip, '192.0.2.10'); }); }); @@ -224,7 +224,7 @@ describe('dscHandler', () => { FailoverUnicast: { unicastAddress: [ { - ip: '224.0.0.100', + ip: '192.0.2.40', port: 1026 } ] @@ -240,7 +240,7 @@ describe('dscHandler', () => { [ { port: 1026, - ip: '224.0.0.100' + ip: '192.0.2.40' } ] ); @@ -264,7 +264,7 @@ describe('dscHandler', () => { Common: { FailoverMulticast: { multicastInterface: 'exampleInterface', - multicastIp: '1.2.3.4', + multicastIp: '192.0.2.10', multicastPort: 765 } } @@ -275,7 +275,7 @@ describe('dscHandler', () => { .then(() => { assert.deepStrictEqual(bodySent, { multicastInterface: 'exampleInterface', - multicastIp: '1.2.3.4', + multicastIp: '192.0.2.10', multicastPort: 765 }); assert.strictEqual(pathSent, '/tm/cm/device/~Common~my.bigip.com'); @@ -338,7 +338,7 @@ describe('dscHandler', () => { const declaration = { Common: { MirrorIp: { - mirrorIp: '1.0.0.0', + mirrorIp: '192.0.2.30', mirrorSecondaryIp: 'any6' } } @@ -348,7 +348,7 @@ describe('dscHandler', () => { return dscHandler.process() .then(() => { assert.strictEqual(pathSent, '/tm/cm/device/~Common~my.bigip.com'); - assert.strictEqual(bodySent.mirrorIp, '1.0.0.0'); + assert.strictEqual(bodySent.mirrorIp, '192.0.2.30'); assert.strictEqual(bodySent.mirrorSecondaryIp, 'any6'); }); }); @@ -358,7 +358,7 @@ describe('dscHandler', () => { Common: { MirrorIp: { mirrorIp: 'any6', - mirrorSecondaryIp: '1.0.0.0' + mirrorSecondaryIp: '192.0.2.30' } } }; @@ -368,7 +368,7 @@ describe('dscHandler', () => { .then(() => { assert.strictEqual(pathSent, '/tm/cm/device/~Common~my.bigip.com'); assert.strictEqual(bodySent.mirrorIp, 'any6'); - assert.strictEqual(bodySent.mirrorSecondaryIp, '1.0.0.0'); + assert.strictEqual(bodySent.mirrorSecondaryIp, '192.0.2.30'); }); }); @@ -376,8 +376,8 @@ describe('dscHandler', () => { const declaration = { Common: { MirrorIp: { - mirrorIp: '1.0.0.0', - mirrorSecondaryIp: '2.0.0.0' + mirrorIp: '192.0.2.30', + mirrorSecondaryIp: '192.0.2.20' } } }; @@ -386,8 +386,8 @@ describe('dscHandler', () => { return dscHandler.process() .then(() => { assert.strictEqual(pathSent, '/tm/cm/device/~Common~my.bigip.com'); - assert.strictEqual(bodySent.mirrorIp, '1.0.0.0'); - assert.strictEqual(bodySent.mirrorSecondaryIp, '2.0.0.0'); + assert.strictEqual(bodySent.mirrorIp, '192.0.2.30'); + assert.strictEqual(bodySent.mirrorSecondaryIp, '192.0.2.20'); }); }); @@ -1189,7 +1189,7 @@ describe('dscHandler', () => { { name: 'my.bigip.com', configsyncIp: 'fdc3:eaf2:d8b9:123a::1', - managementIp: '1.2.3.4' + managementIp: '192.0.2.10' } ]); } diff --git a/test/unit/lib/gslbHandlerTests.js b/test/unit/lib/gslbHandlerTests.js index 692ce606..12331543 100644 --- a/test/unit/lib/gslbHandlerTests.js +++ b/test/unit/lib/gslbHandlerTests.js @@ -487,7 +487,7 @@ describe('gslbHandler', () => { gslbMonitor1: { name: 'gslbMonitor1', description: 'description', - destination: '1.1.1.1:80', + destination: '192.0.2.10:80', interval: 100, timeout: 1000, probeTimeout: 110, @@ -536,7 +536,7 @@ describe('gslbHandler', () => { { name: 'gslbMonitor1', description: 'description', - destination: '1.1.1.1:80', + destination: '192.0.2.10:80', interval: 100, timeout: 1000, probeTimeout: 110, @@ -585,7 +585,7 @@ describe('gslbHandler', () => { { name: 'gslbMonitor1', description: 'description', - destination: '1.1.1.1:80', + destination: '192.0.2.10:80', interval: 100, timeout: 1000, probeTimeout: 110, @@ -636,7 +636,7 @@ describe('gslbHandler', () => { { name: 'gslbMonitor1', description: 'description', - destination: '1.1.1.1:80', + destination: '192.0.2.10:80', interval: 100, timeout: 1000, probeTimeout: 110, @@ -681,7 +681,7 @@ describe('gslbHandler', () => { { name: 'gslbMonitor1', description: 'description', - destination: '1.1.1.1:80', + destination: '192.0.2.10:80', interval: 100, timeout: 1000, probeTimeout: 110, @@ -734,7 +734,7 @@ describe('gslbHandler', () => { { name: 'gslbMonitor1', description: 'description', - destination: '1.1.1.1:80', + destination: '192.0.2.10:80', interval: 100, timeout: 1000, probeTimeout: 110, diff --git a/test/unit/lib/inspectHandlerTests.js b/test/unit/lib/inspectHandlerTests.js index d2d1ffea..7a07fe0c 100644 --- a/test/unit/lib/inspectHandlerTests.js +++ b/test/unit/lib/inspectHandlerTests.js @@ -557,10 +557,10 @@ describe('inspectHandler', () => { name: 'amazonaws.com', nameservers: [ { - name: '8.8.8.8:53' + name: '192.0.2.13:53' }, { - name: '8.8.8.7:53' + name: '192.0.2.14:53' } ] }, @@ -568,10 +568,10 @@ describe('inspectHandler', () => { name: 'idservice.net', nameservers: [ { - name: '8.8.4.4:53' + name: '192.0.2.12:53' }, { - name: '8.8.4.3:53' + name: '192.0.2.15:53' } ] } @@ -644,7 +644,7 @@ describe('inspectHandler', () => { }, { name: 'externalSelfIp', - address: '11.0.0.2/24', + address: '192.0.2.30/24', vlan: '/Common/externalVlan', trafficGroup: '/Common/traffic-group-local-only', allowService: 'none', @@ -661,7 +661,7 @@ describe('inspectHandler', () => { }, { name: 'testRoute2', - gw: '11.0.0.11', + gw: '192.0.2.11', network: '30.0.0.0/24', mtu: 0, partition: 'Common' @@ -669,7 +669,7 @@ describe('inspectHandler', () => { { name: 'testRoute3', tmInterface: '/Common/tunnel', - network: '1.2.3.4/32', + network: '192.0.2.16/32', mtu: 0, partition: 'LOCAL_ONLY' } @@ -678,7 +678,7 @@ describe('inspectHandler', () => { { name: 'exampleAsPath', entriesReference: { - link: 'https://localhost/mgmt/tm/net/routing/as-path/~Common~exampleAsPath/entries?ver=14.1.2.7' + link: 'https://localhost/mgmt/tm/net/routing/as-path/~Common~exampleAsPath/entries?ver=14.1.2' } } ], @@ -687,7 +687,7 @@ describe('inspectHandler', () => { name: 'exampleAccessList', description: 'my description', entriesReference: { - link: 'https://localhost/mgmt/tm/net/routing/access-list/~Common~exampleAccessList/entries?ver=14.1.2.7' + link: 'https://localhost/mgmt/tm/net/routing/access-list/~Common~exampleAccessList/entries?ver=14.1.2' } } ], @@ -723,7 +723,7 @@ describe('inspectHandler', () => { { name: 'examplePrefixList', entriesReference: { - link: 'https://localhost/mgmt/tm/net/routing/prefix-list/~Common~examplePrefixList/entries?ver=14.1.2.7' + link: 'https://localhost/mgmt/tm/net/routing/prefix-list/~Common~examplePrefixList/entries?ver=14.1.2' } } ], @@ -746,7 +746,7 @@ describe('inspectHandler', () => { name: 'exampleRouteMap', routeDomain: '/Common/one', entriesReference: { - link: 'https://localhost/mgmt/tm/net/routing/route-map/~Common~exampleRouteMap/entries?ver=14.1.2.8' + link: 'https://localhost/mgmt/tm/net/routing/route-map/~Common~exampleRouteMap/entries?ver=14.1.2' } } ], @@ -786,7 +786,7 @@ describe('inspectHandler', () => { name: 'kernel', routeMap: '/Common/routeMap1', routeMapReference: { - link: 'https://localhost/mgmt/tm/net/routing/route-map/~Common~exampleBGP?ver=14.1.2.8' + link: 'https://localhost/mgmt/tm/net/routing/route-map/~Common~exampleBGP?ver=14.1.2' } } ] @@ -801,10 +801,10 @@ describe('inspectHandler', () => { keepAlive: 10, localAs: 65010, neighborReference: { - link: 'https://localhost/mgmt/tm/net/routing/bgp/~Common~exampleBGP/neighbor?ver=14.1.2.8' + link: 'https://localhost/mgmt/tm/net/routing/bgp/~Common~exampleBGP/neighbor?ver=14.1.2' }, peerGroupReference: { - link: 'https://localhost/mgmt/tm/net/routing/bgp/~Common~exampleBGP/peer-group?ver=14.1.2.8' + link: 'https://localhost/mgmt/tm/net/routing/bgp/~Common~exampleBGP/peer-group?ver=14.1.2' }, routerId: '10.1.1.1', routeDomain: '/Common/4' @@ -828,11 +828,11 @@ describe('inspectHandler', () => { routeMap: { in: '/Common/routeMapIn', inReference: { - link: 'https://localhost/mgmt/tm/net/routing/route-map/~Common~routeMapIn?ver=14.1.2.8' + link: 'https://localhost/mgmt/tm/net/routing/route-map/~Common~routeMapIn?ver=14.1.2' }, out: '/Common/routeMapOut', outReference: { - link: 'https://localhost/mgmt/tm/net/routing/route-map/~Common~routeMapOut?ver=14.1.2.8' + link: 'https://localhost/mgmt/tm/net/routing/route-map/~Common~routeMapOut?ver=14.1.2' } }, softReconfigurationInbound: 'enabled', @@ -851,10 +851,10 @@ describe('inspectHandler', () => { [`/tm/cm/device/~Common~${deviceName}`]: { configsyncIp: '10.0.0.2', mirrorIp: '10.0.0.2', - mirrorSecondaryIp: '11.0.0.2', + mirrorSecondaryIp: '192.0.2.30', unicastAddress: [{ ip: '10.0.0.2', port: 1026 }], multicastInterface: 'exampleInterface', - multicastIp: '1.2.3.4', + multicastIp: '192.0.2.16', multicastPort: 12 }, '/tm/analytics/global-settings': { @@ -869,7 +869,7 @@ describe('inspectHandler', () => { }, '/tm/sys/management-ip': [ { - name: '1.2.3.4/5', + name: '192.0.2.16/5', description: 'configured-statically by DO' } ], @@ -944,7 +944,7 @@ describe('inspectHandler', () => { sysContact: 'me@me.com', sysLocation: 'F5 Tower', allowedAddresses: [ - '1.2.3.4/32' + '192.0.2.16/32' ], bigipTraps: 'enabled', authTrap: 'disabled', @@ -978,7 +978,7 @@ describe('inspectHandler', () => { { name: '/Common/otherTrapDestination', version: '3', - host: '1.2.3.4', + host: '192.0.2.16', port: 8080, authPassword: '$M$4H$PXdpZO3Xd65xnMkC+F+mdQ==', authProtocol: 'sha', @@ -992,7 +992,7 @@ describe('inspectHandler', () => { { name: '/Common/mgmtTrapDestination', version: '3', - host: '1.2.3.4', + host: '192.0.2.16', port: 8080, authPassword: '$M$4H$PXdpZO3Xd65xnMkC+F+mdQ==', authProtocol: 'sha', @@ -1053,7 +1053,7 @@ describe('inspectHandler', () => { { name: 'system_auth_name2', port: 1812, - server: '127.0.0.2', + server: '192.0.2.32', secret: 'secret' } ], @@ -1195,7 +1195,7 @@ describe('inspectHandler', () => { autoLasthop: 'default', localAddress: 'any6', remoteAddress: 'any6', - secondaryAddress: '30.30.30.30', + secondaryAddress: '192.0.2.31', key: 0, mode: 'bidirectional', transparent: 'disabled', @@ -1303,7 +1303,7 @@ describe('inspectHandler', () => { { name: 'virtualServer1', description: 'virtual server description one', - destination: '192.0.10.20:443', + destination: '192.0.2.20:443', enabled: false, disabled: true, translationAddress: '10.10.0.10', @@ -1328,7 +1328,7 @@ describe('inspectHandler', () => { selfLink: 'https://localhost/mgmt/tm/gtm/monitor/http/~Common~currentGSLBMonitorHTTP?ver=15.1.2', defaultsFrom: '/Common/http', description: 'description', - destination: '1.1.1.1:80', + destination: '192.0.2.10:80', ignoreDownResponse: 'enabled', interval: 100, probeTimeout: 110, @@ -1351,7 +1351,7 @@ describe('inspectHandler', () => { cert: '/Common/cert', defaultsFrom: '/Common/https', description: 'description', - destination: '1.1.1.1:80', + destination: '192.0.2.10:80', ignoreDownResponse: 'enabled', interval: 100, probeTimeout: 110, @@ -1372,7 +1372,7 @@ describe('inspectHandler', () => { selfLink: 'https://localhost/mgmt/tm/gtm/monitor/gateway-icmp/~Common~currentGSLBMonitorICMP?ver=15.1.2', defaultsFrom: '/Common/gateway-icmp', description: 'description', - destination: '1.1.1.1:80', + destination: '192.0.2.10:80', ignoreDownResponse: 'enabled', interval: 100, probeAttempts: 3, @@ -1392,7 +1392,7 @@ describe('inspectHandler', () => { selfLink: 'https://localhost/mgmt/tm/gtm/monitor/tcp/~Common~currentGSLBMonitorTCP?ver=15.1.2', defaultsFrom: '/Common/tcp', description: 'description', - destination: '1.1.1.1:80', + destination: '192.0.2.10:80', ignoreDownResponse: 'enabled', interval: 100, probeTimeout: 110, @@ -1414,7 +1414,7 @@ describe('inspectHandler', () => { debug: 'no', defaultsFrom: '/Common/udp', description: 'description', - destination: '1.1.1.1:80', + destination: '192.0.2.10:80', ignoreDownResponse: 'enabled', interval: 100, probeAttempts: 3, @@ -1687,7 +1687,42 @@ describe('inspectHandler', () => { ] } } - ] + ], + '/tm/security/analytics/settings': { + aclRules: { + collectClientIp: 'enabled', + collectClientPort: 'disabled', + collectDestIp: 'enabled', + collectDestPort: 'enabled', + collectServerSideStats: 'disabled' + }, + collectAllDosStatistic: 'disabled', + collectedStatsExternalLogging: 'disabled', + collectedStatsInternalLogging: 'disabled', + dns: { + collectClientIp: 'enabled', + collectDestinationIp: 'enabled' + }, + dnsCollectStats: 'enabled', + dosL2L4: { + collectClientIp: 'enabled', + collectDestGeo: 'enabled' + }, + dosl3CollectStats: 'enabled', + fwAclCollectStats: 'enabled', + fwDropsCollectStats: 'enabled', + ipReputationCollectStats: 'enabled', + l3L4Errors: { + collectClientIp: 'enabled', + collectDestIp: 'enabled' + }, + sipCollectStats: 'enabled', + staleRules: { + collect: 'disabled' + }, + publisher: 'none', + smtpConfig: 'none' + } }); // PURPOSE: to be sure that all properties (we are expecting) are here @@ -1741,15 +1776,15 @@ describe('inspectHandler', () => { { name: 'amazonaws.com', nameservers: [ - '8.8.8.8:53', - '8.8.8.7:53' + '192.0.2.13:53', + '192.0.2.14:53' ] }, { name: 'idservice.net', nameservers: [ - '8.8.4.4:53', - '8.8.4.3:53' + '192.0.2.12:53', + '192.0.2.15:53' ] } ], @@ -1810,7 +1845,7 @@ describe('inspectHandler', () => { }, externalSelfIp: { stagedFirewallPolicy: 'currentFirewallPolicy', - address: '11.0.0.2/24', + address: '192.0.2.30/24', vlan: 'externalVlan', trafficGroup: 'traffic-group-local-only', allowService: 'none', @@ -1823,14 +1858,14 @@ describe('inspectHandler', () => { class: 'Route' }, testRoute2: { - gw: '11.0.0.11', + gw: '192.0.2.11', network: '30.0.0.0/24', mtu: 0, class: 'Route' }, testRoute3: { target: 'tunnel', - network: '1.2.3.4/32', + network: '192.0.2.16/32', mtu: 0, class: 'Route', localOnly: true @@ -1981,7 +2016,7 @@ describe('inspectHandler', () => { }, currentFailoverMulticast: { interface: 'exampleInterface', - address: '1.2.3.4', + address: '192.0.2.16', port: 12, class: 'FailoverMulticast' }, @@ -1998,7 +2033,7 @@ describe('inspectHandler', () => { }, currentManagementIp: { class: 'ManagementIp', - address: '1.2.3.4/5', + address: '192.0.2.16/5', remark: 'configured-statically by DO' }, 'default-mgmt-route': { @@ -2066,7 +2101,7 @@ describe('inspectHandler', () => { contact: 'me@me.com', location: 'F5 Tower', allowList: [ - '1.2.3.4/32' + '192.0.2.16/32' ], snmpV1: true, snmpV2c: true @@ -2080,7 +2115,7 @@ describe('inspectHandler', () => { otherTrapDestination: { class: 'SnmpTrapDestination', version: '3', - destination: '1.2.3.4', + destination: '192.0.2.16', community: 'communityName', port: 8080, network: 'other', @@ -2098,7 +2133,7 @@ describe('inspectHandler', () => { mgmtTrapDestination: { class: 'SnmpTrapDestination', version: '3', - destination: '1.2.3.4', + destination: '192.0.2.16', community: 'communityName', port: 8080, network: 'management', @@ -2175,7 +2210,7 @@ describe('inspectHandler', () => { }, secondary: { port: 1812, - server: '127.0.0.2', + server: '192.0.2.32', secret: 'secret' } } @@ -2328,7 +2363,7 @@ describe('inspectHandler', () => { transparent: false, localAddress: 'any6', remoteAddress: 'any6', - secondaryAddress: '30.30.30.30', + secondaryAddress: '192.0.2.31', key: 0, mode: 'bidirectional', trafficGroup: 'none', @@ -2344,7 +2379,7 @@ describe('inspectHandler', () => { currentMirrorIp: { class: 'MirrorIp', primaryIp: '10.0.0.2', - secondaryIp: '11.0.0.2' + secondaryIp: '192.0.2.30' }, currentGSLBGlobals: { class: 'GSLBGlobals', @@ -2406,7 +2441,7 @@ describe('inspectHandler', () => { name: 'virtualServer1', remark: 'virtual server description one', enabled: false, - address: '192.0.10.20', + address: '192.0.2.20', port: 443, addressTranslation: '10.10.0.10', addressTranslationPort: 23, @@ -2434,7 +2469,7 @@ describe('inspectHandler', () => { class: 'GSLBMonitor', remark: 'description', monitorType: 'http', - target: '1.1.1.1:80', + target: '192.0.2.10:80', interval: 100, timeout: 1000, probeTimeout: 110, @@ -2448,7 +2483,7 @@ describe('inspectHandler', () => { class: 'GSLBMonitor', remark: 'description', monitorType: 'https', - target: '1.1.1.1:80', + target: '192.0.2.10:80', interval: 100, timeout: 1000, probeTimeout: 110, @@ -2464,7 +2499,7 @@ describe('inspectHandler', () => { class: 'GSLBMonitor', remark: 'description', monitorType: 'gateway-icmp', - target: '1.1.1.1:80', + target: '192.0.2.10:80', interval: 100, timeout: 1000, probeTimeout: 110, @@ -2477,7 +2512,7 @@ describe('inspectHandler', () => { class: 'GSLBMonitor', remark: 'description', monitorType: 'tcp', - target: '1.1.1.1:80', + target: '192.0.2.10:80', interval: 100, timeout: 1000, probeTimeout: 110, @@ -2491,7 +2526,7 @@ describe('inspectHandler', () => { class: 'GSLBMonitor', remark: 'description', monitorType: 'udp', - target: '1.1.1.1:80', + target: '192.0.2.10:80', interval: 100, timeout: 1000, probeTimeout: 110, @@ -2643,6 +2678,40 @@ describe('inspectHandler', () => { } } ] + }, + currentSecurityAnalytics: { + class: 'SecurityAnalytics', + aclRules: { + collectClientIpEnabled: true, + collectClientPortEnabled: false, + collectDestinationIpEnabled: true, + collectDestinationPortEnabled: true, + collectServerSideStatsEnabled: false + }, + collectAllDosStatsEnabled: false, + collectedStatsExternalLoggingEnabled: false, + collectedStatsInternalLoggingEnabled: false, + dns: { + collectClientIpEnabled: true, + collectDestinationIpEnabled: true + }, + collectDnsStatsEnabled: true, + dosL2L4: { + collectClientIpEnabled: true, + collectDestinationGeoEnabled: true + }, + collectDosL3StatsEnabled: true, + collectFirewallAclStatsEnabled: true, + collectFirewallDropsStatsEnabled: true, + collectIpReputationStatsEnabled: true, + l3L4Errors: { + collectClientIpEnabled: true, + collectDestinationIpEnabled: true + }, + collectSipStatsEnabled: true, + collectStaleRulesEnabled: false, + publisher: 'none', + smtpConfig: 'none' } } } @@ -2734,7 +2803,7 @@ describe('inspectHandler', () => { const sharedName = 'sharedName'; listResponses['/tm/net/self'].push({ name: sharedName, - address: '11.0.0.2/24', + address: '192.0.2.30/24', vlan: '/Common/externalVlan', trafficGroup: '/Common/traffic-group-local-only', allowService: 'none' diff --git a/test/unit/lib/licensePoolValidatorTests.js b/test/unit/lib/licensePoolValidatorTests.js index 52e63723..c843785e 100644 --- a/test/unit/lib/licensePoolValidatorTests.js +++ b/test/unit/lib/licensePoolValidatorTests.js @@ -74,7 +74,7 @@ describe('licensePoolValidator', () => { myLicense: { class: 'License', licenseType: 'licensePool', - bigIqHost: '1.2.3.4', + bigIqHost: '192.0.2.10', bigIqUsername: 'myUser', bigIqPassword: 'myPassword' } @@ -133,7 +133,7 @@ describe('licensePoolValidator', () => { myLicense: { class: 'License', licenseType: 'licensePool', - bigIqHost: '1.2.3.4', + bigIqHost: '192.0.2.10', bigIqPassword: 'myPassword' } } @@ -152,7 +152,7 @@ describe('licensePoolValidator', () => { myLicense: { class: 'License', licenseType: 'licensePool', - bigIqHost: '1.2.3.4', + bigIqHost: '192.0.2.10', bigIqUsername: 'myUser' } } diff --git a/test/unit/lib/networkHandlerTests.js b/test/unit/lib/networkHandlerTests.js index ec6f736d..21dfb444 100644 --- a/test/unit/lib/networkHandlerTests.js +++ b/test/unit/lib/networkHandlerTests.js @@ -141,10 +141,10 @@ describe('networkHandler', () => { name: 'amazonaws.com', nameservers: [ { - name: '8.8.8.8:53' + name: '192.0.2.12:53' }, { - name: '8.8.8.7:53' + name: '192.0.2.13:53' } ] }, @@ -152,10 +152,10 @@ describe('networkHandler', () => { name: 'idservice.net', nameservers: [ { - name: '8.8.4.4:53' + name: '192.0.2.11:53' }, { - name: '8.8.4.3:53' + name: '192.0.2.14:53' } ] } @@ -183,12 +183,12 @@ describe('networkHandler', () => { assert.strictEqual(resolverData[0].forwardZones.length, 2); assert.strictEqual(resolverData[0].forwardZones[0].name, 'amazonaws.com'); - assert.strictEqual(resolverData[0].forwardZones[0].nameservers[0].name, '8.8.8.8:53'); - assert.strictEqual(resolverData[0].forwardZones[0].nameservers[1].name, '8.8.8.7:53'); + assert.strictEqual(resolverData[0].forwardZones[0].nameservers[0].name, '192.0.2.12:53'); + assert.strictEqual(resolverData[0].forwardZones[0].nameservers[1].name, '192.0.2.13:53'); assert.strictEqual(resolverData[0].forwardZones[1].name, 'idservice.net'); - assert.strictEqual(resolverData[0].forwardZones[1].nameservers[0].name, '8.8.4.4:53'); - assert.strictEqual(resolverData[0].forwardZones[1].nameservers[1].name, '8.8.4.3:53'); + assert.strictEqual(resolverData[0].forwardZones[1].nameservers[0].name, '192.0.2.11:53'); + assert.strictEqual(resolverData[0].forwardZones[1].nameservers[1].name, '192.0.2.14:53'); assert.strictEqual(resolverData[0].randomizeQueryNameCase, 'yes'); assert.strictEqual(resolverData[0].routeDomain, '0'); @@ -211,10 +211,10 @@ describe('networkHandler', () => { name: 'amazonaws.com', nameservers: [ { - name: '8.8.8.8:53' + name: '192.0.2.12:53' }, { - name: '8.8.8.7:53' + name: '192.0.2.13:53' } ] }, @@ -222,10 +222,10 @@ describe('networkHandler', () => { name: 'idservice.net', nameservers: [ { - name: '8.8.4.4:53' + name: '192.0.2.11:53' }, { - name: '8.8.4.3:53' + name: '192.0.2.14:53' } ] } @@ -244,11 +244,11 @@ describe('networkHandler', () => { assert.strictEqual(resolverData[0].partition, 'Common'); assert.strictEqual(resolverData[0].forwardZones.length, 2); assert.strictEqual(resolverData[0].forwardZones[0].name, 'amazonaws.com'); - assert.strictEqual(resolverData[0].forwardZones[0].nameservers[0].name, '8.8.8.8:53'); - assert.strictEqual(resolverData[0].forwardZones[0].nameservers[1].name, '8.8.8.7:53'); + assert.strictEqual(resolverData[0].forwardZones[0].nameservers[0].name, '192.0.2.12:53'); + assert.strictEqual(resolverData[0].forwardZones[0].nameservers[1].name, '192.0.2.13:53'); assert.strictEqual(resolverData[0].forwardZones[1].name, 'idservice.net'); - assert.strictEqual(resolverData[0].forwardZones[1].nameservers[0].name, '8.8.4.4:53'); - assert.strictEqual(resolverData[0].forwardZones[1].nameservers[1].name, '8.8.4.3:53'); + assert.strictEqual(resolverData[0].forwardZones[1].nameservers[0].name, '192.0.2.11:53'); + assert.strictEqual(resolverData[0].forwardZones[1].nameservers[1].name, '192.0.2.14:53'); }); }); }); @@ -441,7 +441,7 @@ describe('networkHandler', () => { selfIp1: { name: 'selfIp1', vlan: '/Common/vlan1', - address: '1.2.3.4', + address: '192.0.2.60', trafficGroup: '/Common/traffic-group-local-only', allowService: ['tcp:1234', 'tcp:5678'], fwEnforcedPolicy: 'firewallPolicy' @@ -449,7 +449,7 @@ describe('networkHandler', () => { selfIp2: { name: 'selfIp2', vlan: '/Common/vlan2', - address: '5.6.7.8', + address: '192.0.2.110', trafficGroup: '/Common/traffic-group-local-only', allowService: 'default', fwStagedPolicy: 'firewallPolicy' @@ -464,7 +464,7 @@ describe('networkHandler', () => { const selfIpData = dataSent[PATHS.SelfIp]; assert.strictEqual(selfIpData[0].name, 'selfIp1'); assert.strictEqual(selfIpData[0].vlan, '/Common/vlan1'); - assert.strictEqual(selfIpData[0].address, '1.2.3.4'); + assert.strictEqual(selfIpData[0].address, '192.0.2.60'); assert.strictEqual( selfIpData[0].trafficGroup, '/Common/traffic-group-local-only' ); @@ -476,7 +476,7 @@ describe('networkHandler', () => { assert.strictEqual(selfIpData[0].fwStagedPolicy, 'none'); assert.strictEqual(selfIpData[1].name, 'selfIp2'); assert.strictEqual(selfIpData[1].vlan, '/Common/vlan2'); - assert.strictEqual(selfIpData[1].address, '5.6.7.8'); + assert.strictEqual(selfIpData[1].address, '192.0.2.110'); assert.strictEqual( selfIpData[1].trafficGroup, '/Common/traffic-group-local-only' ); @@ -619,14 +619,14 @@ describe('networkHandler', () => { selfIp1: { name: 'selfIp1', vlan: '/Common/vlan1', - address: '1.2.3.4/24', + address: '192.0.2.60/24', trafficGroup: '/Common/traffic-group-local-only' } } } }; const device = { - configsyncIp: '1.2.3.4' + configsyncIp: '192.0.2.60' }; bigIpMock.list = (path) => { @@ -647,7 +647,7 @@ describe('networkHandler', () => { return networkHandler.process() .then(() => { assert.strictEqual(configSyncIpDataSent[0], 'none'); - assert.strictEqual(configSyncIpDataSent[1], '1.2.3.4'); + assert.strictEqual(configSyncIpDataSent[1], '192.0.2.60'); }); }); @@ -866,7 +866,7 @@ describe('networkHandler', () => { selfIp: { name: 'selfIp', vlan: '/Common/vlan', - address: '1.2.3.4', + address: '192.0.2.60', allowService: 'default', trafficGroup: '/Common/traffic-group-local-only' } @@ -899,13 +899,13 @@ describe('networkHandler', () => { theRoute: { name: 'theRoute', gw: '10.11.12.13', - network: '50.60.70.80', + network: '192.0.2.20', mtu: 1000 }, localRoute: { name: 'localRoute', tmInterface: 'targetVLAN', - network: '50.60.70.81', + network: '192.0.2.21', mtu: 1120, localOnly: true } @@ -919,13 +919,13 @@ describe('networkHandler', () => { theRoute: { name: 'theRoute', gw: '10.11.12.13', - network: '51.62.73.84/32', + network: '192.0.2.21/32', mtu: 1000 }, localRoute: { name: 'localRoute', gw: '10.11.12.13', - network: '51.62.73.85/32', + network: '192.0.2.22/32', mtu: 1005, localOnly: true } @@ -947,14 +947,14 @@ describe('networkHandler', () => { }, route2: { name: 'route2', - gw: '1.1.1.1', - network: '2.2.2.2', + gw: '192.0.2.10', + network: '192.0.2.100', mtu: 1400 }, route3: { name: 'route3', tmInterface: 'targetTunnel', - network: '1.2.3.4', + network: '192.0.2.60', mtu: 100, localOnly: false }, @@ -987,13 +987,13 @@ describe('networkHandler', () => { assert.strictEqual(routeData[0].mtu, 1500); assert.strictEqual(routeData[0].partition, 'Common'); assert.strictEqual(routeData[1].name, 'route2'); - assert.strictEqual(routeData[1].gw, '1.1.1.1'); - assert.strictEqual(routeData[1].network, '2.2.2.2/32'); + assert.strictEqual(routeData[1].gw, '192.0.2.10'); + assert.strictEqual(routeData[1].network, '192.0.2.100/32'); assert.strictEqual(routeData[1].mtu, 1400); assert.strictEqual(routeData[1].partition, 'Common'); assert.strictEqual(routeData[2].name, 'route3'); assert.strictEqual(routeData[2].interface, '/Common/targetTunnel'); - assert.strictEqual(routeData[2].network, '1.2.3.4/32'); + assert.strictEqual(routeData[2].network, '192.0.2.60/32'); assert.strictEqual(routeData[2].mtu, 100); assert.strictEqual(routeData[2].partition, 'Common'); assert.deepStrictEqual(routeData[3], { @@ -1061,19 +1061,19 @@ describe('networkHandler', () => { localRoute: { name: 'localRoute', gw: '10.11.12.13', - network: '51.62.73.85/32', + network: '192.0.2.32/32', mtu: 1005, localOnly: true } }; - declaration.Common.Route.localRoute.network = '51.62.73.86/32'; + declaration.Common.Route.localRoute.network = '192.0.2.31/32'; const networkHandler = new NetworkHandler(declaration, bigIpMock, null, state); return networkHandler.process() .then(() => { assert.strictEqual(bigIpMockSpy.create.callCount, 2); assert.strictEqual(bigIpMockSpy.delete.callCount, 1); assert.deepStrictEqual(deletedPaths, ['/tm/net/route/~LOCAL_ONLY~localRoute']); - assert.strictEqual(dataSent[PATHS.Route][1].network, '51.62.73.86/32'); + assert.strictEqual(dataSent[PATHS.Route][1].network, '192.0.2.31/32'); }); }); }); @@ -1392,8 +1392,8 @@ describe('networkHandler', () => { autoLasthop: 'default', key: 0, localAddress: '10.10.10.10', - remoteAddress: '20.20.20.10', - secondaryAddress: '30.30.30.10', + remoteAddress: '192.0.2.50', + secondaryAddress: '192.0.2.70', mode: 'bidirectional', transparent: 'disabled', trafficGroup: 'traffic-group-local-only' @@ -1407,8 +1407,8 @@ describe('networkHandler', () => { autoLasthop: 'enabled', key: 1, localAddress: '10.10.10.20', - remoteAddress: '20.20.20.20', - secondaryAddress: '30.30.30.20', + remoteAddress: '192.0.2.30', + secondaryAddress: '192.0.2.80', mode: 'inbound', transparent: 'enabled', trafficGroup: 'none' @@ -1423,7 +1423,7 @@ describe('networkHandler', () => { description: 'none', key: 0, localAddress: '10.10.0.0', - remoteAddress: '20.20.0.0', + remoteAddress: '192.0.2.40', secondaryAddress: 'any6', mode: 'bidirectional', transparent: 'disabled', @@ -1486,8 +1486,8 @@ describe('networkHandler', () => { tos: 'preserve', usePmtu: 'enabled', localAddress: '10.10.10.10', - remoteAddress: '20.20.20.10', - secondaryAddress: '30.30.30.10', + remoteAddress: '192.0.2.50', + secondaryAddress: '192.0.2.70', key: 0, mode: 'bidirectional', transparent: 'disabled', @@ -1503,8 +1503,8 @@ describe('networkHandler', () => { tos: 12, usePmtu: 'disabled', localAddress: '10.10.10.20', - remoteAddress: '20.20.20.20', - secondaryAddress: '30.30.30.20', + remoteAddress: '192.0.2.30', + secondaryAddress: '192.0.2.80', key: 1, mode: 'inbound', transparent: 'enabled', @@ -1520,7 +1520,7 @@ describe('networkHandler', () => { tos: 'preserve', usePmtu: 'enabled', localAddress: '10.10.0.0', - remoteAddress: '20.20.0.0', + remoteAddress: '192.0.2.40', secondaryAddress: 'any6', key: 0, mode: 'bidirectional', diff --git a/test/unit/lib/parserUtilTests.js b/test/unit/lib/parserUtilTests.js index 4480b113..87d84426 100644 --- a/test/unit/lib/parserUtilTests.js +++ b/test/unit/lib/parserUtilTests.js @@ -738,5 +738,56 @@ describe('parserUtil', () => { } ); }); + + it('should handle converting a boolean or string to an object', () => { + const configItems = [ + { + schemaClass: 'MySchemaClass', + properties: [ + { + id: 'staleRules', + newId: 'collectStaleRulesEnabled', + transformBooleanOrStringToObject: { + itemKey: 'collectStaleRulesEnabled', + toKey: 'collect' + }, + transform: [ + { id: 'collect', truth: 'enabled', falsehood: 'disabled' } + ] + }, + { + id: 'testProp', + transformBooleanOrStringToObject: { + itemKey: 'testStringProp', + toKey: 'objectKey' + }, + transform: [ + { id: 'objectKey' } + ] + } + ] + } + ]; + + const declarationItem = { + class: 'MySchemaClass', + collectStaleRulesEnabled: true, + testStringProp: 'string' + }; + + const updated = parserUtil.updateIds(configItems, 'MySchemaClass', declarationItem); + assert.deepStrictEqual( + updated, + { + class: 'MySchemaClass', + staleRules: { + collect: 'enabled' + }, + testProp: { + objectKey: 'string' + } + } + ); + }); }); }); diff --git a/test/unit/lib/routingAccessListValidatorTests.js b/test/unit/lib/routingAccessListValidatorTests.js index 51bd8e7e..81458e76 100644 --- a/test/unit/lib/routingAccessListValidatorTests.js +++ b/test/unit/lib/routingAccessListValidatorTests.js @@ -39,7 +39,7 @@ describe('routingAccessListValidator', () => { describe('valid', () => { it('should validate single item entries', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { exampleRoutingAccessList1: { @@ -77,7 +77,7 @@ describe('routingAccessListValidator', () => { it('should validate multiple item entries with a single exactMatch true', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { exampleRoutingAccessList1: { @@ -145,7 +145,7 @@ describe('routingAccessListValidator', () => { describe('invalid', () => { it('should invalidate any non-any-address destination when any 1 entry has exactMatch true', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { exampleRoutingAccessList: { @@ -180,7 +180,7 @@ describe('routingAccessListValidator', () => { it('should invalidate mixing address families in the same entry', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { exampleRoutingAccessList: { @@ -208,7 +208,7 @@ describe('routingAccessListValidator', () => { it('should invalidate mixing address families across entries', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { exampleRoutingAccessList: { @@ -219,7 +219,7 @@ describe('routingAccessListValidator', () => { action: 'permit', source: '10.10.10.10', exactMatchEnabled: false, - destination: '20.20.20.20' + destination: '192.0.2.20' }, { name: 20, diff --git a/test/unit/lib/routingBgpValidatorTests.js b/test/unit/lib/routingBgpValidatorTests.js index 4e220b09..c524b7e3 100644 --- a/test/unit/lib/routingBgpValidatorTests.js +++ b/test/unit/lib/routingBgpValidatorTests.js @@ -27,7 +27,7 @@ describe('routingBgpValidator', () => { beforeEach(() => { wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { exampleRoutingBgp: { @@ -113,7 +113,7 @@ describe('routingBgpValidator', () => { beforeEach(() => { wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { exampleRoutingBgp: { @@ -163,7 +163,7 @@ describe('routingBgpValidator', () => { it('should validate when there is nothing to validate', () => { wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: {} } @@ -206,7 +206,7 @@ describe('routingBgpValidator', () => { beforeEach(() => { wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { exampleRouteMap1: { diff --git a/test/unit/lib/routingPrefixListValidatorTests.js b/test/unit/lib/routingPrefixListValidatorTests.js index e1a916ef..1b8da3a6 100644 --- a/test/unit/lib/routingPrefixListValidatorTests.js +++ b/test/unit/lib/routingPrefixListValidatorTests.js @@ -25,7 +25,7 @@ describe('routingPrefixListValidator', () => { describe('valid', () => { it('should validate single-value prefixLengthRange', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { exampleRoutingPrefixList1: { @@ -73,7 +73,7 @@ describe('routingPrefixListValidator', () => { it('should validate multi-value prefixLengthRange', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { exampleRoutingPrefixList1: { @@ -121,7 +121,7 @@ describe('routingPrefixListValidator', () => { it('should validate when prefixLength range is 0', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { exampleRoutingPrefixList1: { @@ -157,7 +157,7 @@ describe('routingPrefixListValidator', () => { it('should validate prefixLengthRange if start or end is 0', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { exampleRoutingPrefixList1: { @@ -205,7 +205,7 @@ describe('routingPrefixListValidator', () => { it('should validate prefixLengthRange if start or end is missing', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { exampleRoutingPrefixList1: { @@ -253,7 +253,7 @@ describe('routingPrefixListValidator', () => { it('should validate when there is nothing to validate', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: {} } @@ -266,7 +266,7 @@ describe('routingPrefixListValidator', () => { it('should validate when entries property is missing', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { exampleRoutingPrefixList1: { @@ -284,7 +284,7 @@ describe('routingPrefixListValidator', () => { it('should validate when entries property is empty', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { exampleRoutingPrefixList1: { @@ -304,7 +304,7 @@ describe('routingPrefixListValidator', () => { describe('invalid', () => { it('should invalidate if prefixLengthRange is only a colon', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { exampleRoutingPrefixList: { @@ -331,7 +331,7 @@ describe('routingPrefixListValidator', () => { it('should invalidate if prefixLengthRange is only empty string', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { exampleRoutingPrefixList: { @@ -358,7 +358,7 @@ describe('routingPrefixListValidator', () => { it('should invalidate if range start greater than end unless end is 0', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { exampleRoutingPrefixList: { @@ -394,7 +394,7 @@ describe('routingPrefixListValidator', () => { describe('hard range limit exceeded', () => { it('should invalidate if prefixLengthRange is greater than 32 if prefix is an ipv4 address', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { exampleRoutingPrefixList: { @@ -429,7 +429,7 @@ describe('routingPrefixListValidator', () => { it('should invalidate if prefixLengthRange is greater than 128 if prefix is an ipv6 address', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { exampleRoutingPrefixList: { @@ -466,7 +466,7 @@ describe('routingPrefixListValidator', () => { describe('prefix length limit exceeded', () => { it('should invalidate if prefixLengthRange is equal to or less than ipv6 prefix property length', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { exampleRoutingPrefixList: { @@ -501,7 +501,7 @@ describe('routingPrefixListValidator', () => { it('should invalidate if prefixLengthRange is equal to or less than ipv4 prefix property length', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { exampleRoutingPrefixList: { diff --git a/test/unit/lib/securityHandlerTests.js b/test/unit/lib/securityHandlerTests.js new file mode 100644 index 00000000..9d736bd7 --- /dev/null +++ b/test/unit/lib/securityHandlerTests.js @@ -0,0 +1,152 @@ +/** + * Copyright 2023 F5 Networks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const chai = require('chai'); +const chaiAsPromised = require('chai-as-promised'); + +chai.use(chaiAsPromised); +const assert = chai.assert; +const sinon = require('sinon'); +const PATHS = require('../../../src/lib/sharedConstants').PATHS; +const Logger = require('../../../src/lib/logger'); + +const SecurityHandler = require('../../../src/lib/securityHandler'); + +describe('SecurityHandler', () => { + let dataSent; + let bigIpMock; + + beforeEach(() => { + dataSent = []; + bigIpMock = { + modify(path, data) { + if (!dataSent[path]) { + dataSent[path] = []; + } + dataSent[path].push(data); + return Promise.resolve(); + } + }; + }); + + it('should reject and log error when there is an error processing security options', () => { + const severeLogSpy = sinon.spy(Logger.prototype, 'severe'); + bigIpMock.modify = () => Promise.reject(new Error('Error!')); + const declaration = { + Common: { + SecurityAnalytics: {} + } + }; + const securityHandler = new SecurityHandler(declaration, bigIpMock); + return assert.isRejected(securityHandler.process(), /Error!/) + .then(() => { + assert.strictEqual(severeLogSpy.args[0][0], 'Error processing security declaration: Error!'); + assert.strictEqual(severeLogSpy.thisValues[0].metadata, 'securityHandler.js'); + }); + }); + + describe('SecurityAnalytics', () => { + it('should handle fully specified SecurityAnalytics', () => { + const declaration = { + Common: { + SecurityAnalytics: { + aclRules: { + collectClientIp: 'enabled', + collectClientPort: 'disabled', + collectDestIp: 'enabled', + collectDestPort: 'enabled', + collectServerSideStats: 'disabled' + }, + collectAllDosStatistic: 'disabled', + collectedStatsExternalLogging: 'disabled', + collectedStatsInternalLogging: 'disabled', + dns: { + collectClientIp: 'enabled', + collectDestinationIp: 'enabled' + }, + dnsCollectStats: 'enabled', + dosL2L4: { + collectClientIp: 'enabled', + collectDestGeo: 'enabled' + }, + dosL3CollectStats: 'enabled', + fwAclCollectStats: 'enabled', + fwDropsCollectStats: 'enabled', + ipReputationCollectStats: 'enabled', + l3L4Errors: { + collectClientIp: 'enabled', + collectDestIp: 'enabled' + }, + sipCollectStats: 'enabled', + staleRules: { + collect: 'disabled' + }, + publisher: 'none', + smtpConfig: 'none' + } + } + }; + + const securityHandler = new SecurityHandler(declaration, bigIpMock); + return securityHandler.process() + .then(() => { + const securityAnalyticsData = dataSent[PATHS.SecurityAnalytics]; + assert.deepStrictEqual( + securityAnalyticsData, + [ + { + aclRules: { + collectClientIp: 'enabled', + collectClientPort: 'disabled', + collectDestIp: 'enabled', + collectDestPort: 'enabled', + collectServerSideStats: 'disabled' + }, + collectAllDosStatistic: 'disabled', + collectedStatsExternalLogging: 'disabled', + collectedStatsInternalLogging: 'disabled', + dns: { + collectClientIp: 'enabled', + collectDestinationIp: 'enabled' + }, + dnsCollectStats: 'enabled', + dosL2L4: { + collectClientIp: 'enabled', + collectDestGeo: 'enabled' + }, + dosL3CollectStats: 'enabled', + fwAclCollectStats: 'enabled', + fwDropsCollectStats: 'enabled', + ipReputationCollectStats: 'enabled', + l3L4Errors: { + collectClientIp: 'enabled', + collectDestIp: 'enabled' + }, + sipCollectStats: 'enabled', + staleRules: { + collect: 'disabled' + }, + publisher: 'none', + smtpConfig: 'none' + } + ] + ); + }); + }); + }); +}); diff --git a/test/unit/lib/systemHandlerTests.js b/test/unit/lib/systemHandlerTests.js index 060c7c7e..0e532396 100644 --- a/test/unit/lib/systemHandlerTests.js +++ b/test/unit/lib/systemHandlerTests.js @@ -125,7 +125,7 @@ describe('systemHandler', () => { return Promise.resolve(); }, deviceInfo() { - return Promise.resolve({ version: '15.1.0.1' }); + return Promise.resolve({ version: '15.1.0' }); }, setHost() { return Promise.resolve(); @@ -474,7 +474,7 @@ describe('systemHandler', () => { Common: { DNS: { nameServers: [ - '8.8.8.8', + '192.0.2.20', '2001:4860:4860::8844' ], search: ['one.com', 'two.com'] @@ -495,7 +495,7 @@ describe('systemHandler', () => { Common: { DNS: { nameServers: [ - '8.8.8.8', + '192.0.2.20', '2001:4860:4860::8844' ], search: ['one.com', 'two.com'] @@ -507,7 +507,7 @@ describe('systemHandler', () => { return systemHandler.process() .then(() => { assert.strictEqual(pathSent, PATHS.DNS); - assert.deepEqual(dataSent['name-servers'], ['8.8.8.8', '2001:4860:4860::8844']); + assert.deepEqual(dataSent['name-servers'], ['192.0.2.20', '2001:4860:4860::8844']); assert.deepEqual(dataSent.search, ['one.com', 'two.com']); }); }); @@ -516,7 +516,7 @@ describe('systemHandler', () => { const declaration = { Common: { DNS: { - nameServers: ['1.2.3.4'], + nameServers: ['192.0.2.10'], search: ['f5.com'] } } @@ -539,7 +539,7 @@ describe('systemHandler', () => { const declaration = { Common: { DNS: { - nameServers: ['1.2.3.4'], + nameServers: ['192.0.2.10'], search: ['f5.com'] } } @@ -564,7 +564,7 @@ describe('systemHandler', () => { const declaration = { Common: { DNS: { - nameServers: ['1.2.3.4'], + nameServers: ['192.0.2.10'], search: ['f5.com'] } } @@ -834,7 +834,7 @@ describe('systemHandler', () => { }); it('should ignore guiAudit if version < 14.0', () => { - sinon.stub(bigIpMock, 'deviceInfo').resolves({ version: '13.1.1.3' }); + sinon.stub(bigIpMock, 'deviceInfo').resolves({ version: '13.1.1' }); const declaration = { Common: { System: { @@ -1242,7 +1242,7 @@ describe('systemHandler', () => { } } }; - const host = '11.12.13.14'; + const host = '192.0.2.50'; let bigIqHostSent; let bigIqUsernameSent; @@ -1302,8 +1302,8 @@ describe('systemHandler', () => { } } }; - const host = '11.12.13.14'; - const managementAddress = '1.2.3.4'; + const host = '192.0.2.50'; + const managementAddress = '192.0.2.10'; const managementPort = 5678; let optionsSent; @@ -1336,7 +1336,7 @@ describe('systemHandler', () => { assert.strictEqual(optionsSent.noUnreachable, true); assert.strictEqual(bigIpUsernameSent, 'mybigipuser'); assert.strictEqual(bigIpPasswordSent, 'barbar'); - assert.strictEqual(bigIpHostSent, '1.2.3.4'); + assert.strictEqual(bigIpHostSent, '192.0.2.10'); assert.strictEqual(bigIpPortSent, 5678); assert.strictEqual(activeCalled, true); }); @@ -1352,7 +1352,7 @@ describe('systemHandler', () => { } } }; - const host = '11.12.13.14'; + const host = '192.0.2.50'; let bigIqHostSent; let optionsSent; @@ -1374,7 +1374,7 @@ describe('systemHandler', () => { return systemHandler.process() .then(() => { assert.strictEqual(bigIqHostSent, 'localhost'); - assert.strictEqual(optionsSent.bigIpMgmtAddress, '11.12.13.14'); + assert.strictEqual(optionsSent.bigIpMgmtAddress, '192.0.2.50'); assert.strictEqual(optionsSent.bigIqMgmtPort, 8100); assert.strictEqual(optionsSent.tenant, 'Test tenant description'); }); @@ -1393,7 +1393,7 @@ describe('systemHandler', () => { } } }; - const managementAddress = '1.2.3.4'; + const managementAddress = '192.0.2.10'; bigIpMock.onboard = { licenseViaBigIq() {} @@ -1586,8 +1586,8 @@ describe('systemHandler', () => { hostSet = undefined; state.currentConfig.Common.ManagementIp = { - '4.5.6.7/8': { - name: '4.5.6.7/8', + '192.0.2.40/8': { + name: '192.0.2.40/8', description: 'configured-by-dhcp' } }; @@ -1603,8 +1603,8 @@ describe('systemHandler', () => { const declaration = { Common: { ManagementIp: { - '1.2.3.4/5': { - name: '1.2.3.4/5', + '192.0.2.10/5': { + name: '192.0.2.10/5', description: 'this is my description' } } @@ -1619,7 +1619,7 @@ describe('systemHandler', () => { assert.deepStrictEqual( managementIpData, { - name: '1.2.3.4/5', + name: '192.0.2.10/5', description: 'this is my description' } ); @@ -1629,7 +1629,7 @@ describe('systemHandler', () => { mgmtDhcp: 'disabled' } ); - assert.strictEqual(hostSet, '1.2.3.4'); + assert.strictEqual(hostSet, '192.0.2.10'); }); }); @@ -1637,8 +1637,8 @@ describe('systemHandler', () => { const declaration = { Common: { ManagementIp: { - '1.2.3.4/5': { - name: '1.2.3.4/5', + '192.0.2.10/5': { + name: '192.0.2.10/5', description: 'this is my description' } } @@ -1646,8 +1646,8 @@ describe('systemHandler', () => { }; state.currentConfig.Common.ManagementIp = { - '4.5.6.7/8': { - name: '4.5.6.7/8', + '192.0.2.40/8': { + name: '192.0.2.40/8', description: 'this is my description' } }; @@ -1660,7 +1660,7 @@ describe('systemHandler', () => { assert.deepStrictEqual( managementIpData, { - name: '1.2.3.4/5', + name: '192.0.2.10/5', description: 'this is my description' } ); @@ -1670,7 +1670,7 @@ describe('systemHandler', () => { mgmtDhcp: 'disabled' } ); - assert.strictEqual(hostSet, '1.2.3.4'); + assert.strictEqual(hostSet, '192.0.2.10'); }); }); @@ -1678,8 +1678,8 @@ describe('systemHandler', () => { const declaration = { Common: { ManagementIp: { - '1.2.3.4/5': { - name: '1.2.3.4/5', + '192.0.2.10/5': { + name: '192.0.2.10/5', description: 'this is new' } } @@ -1687,8 +1687,8 @@ describe('systemHandler', () => { }; state.currentConfig.Common.ManagementIp = { - '1.2.3.4/5': { - name: '1.2.3.4/5', + '192.0.2.10/5': { + name: '192.0.2.10/5', description: 'this is my description' } }; @@ -1696,7 +1696,7 @@ describe('systemHandler', () => { const systemHandler = new SystemHandler(declaration, bigIpMock, null, state); return systemHandler.process() .then(() => { - const expectedPath = `${PATHS.ManagementIp}/1.2.3.4~5`; + const expectedPath = `${PATHS.ManagementIp}/192.0.2.10~5`; const managementIpData = dataSent[expectedPath][0]; const mgmtDhcpData = dataSent[PATHS.SysGlobalSettings][0]; assert.deepStrictEqual( @@ -1711,7 +1711,7 @@ describe('systemHandler', () => { mgmtDhcp: 'disabled' } ); - assert.strictEqual(hostSet, '1.2.3.4'); + assert.strictEqual(hostSet, '192.0.2.10'); }); }); @@ -1719,8 +1719,8 @@ describe('systemHandler', () => { const declaration = { Common: { ManagementIp: { - '1.2.3.4/5': { - name: '1.2.3.4/5', + '192.0.2.10/5': { + name: '192.0.2.10/5', description: 'this is my description' } } @@ -1737,13 +1737,13 @@ describe('systemHandler', () => { }); it('should delete the current management ip if using localhost and only changing mask', () => { - // Note: the beforeAll hook sets the IP to '4.5.6.7/8'. So this test + // Note: the beforeAll hook sets the IP to '192.0.2.40/8'. So this test // is changing just the mask and looking for a delete call. const declaration = { Common: { ManagementIp: { - '4.5.6.7/9': { - name: '4.5.6.7/9', + '192.0.2.40/9': { + name: '192.0.2.40/9', description: 'this is my description' } } @@ -1755,7 +1755,7 @@ describe('systemHandler', () => { const systemHandler = new SystemHandler(declaration, bigIpMock, null, state); return systemHandler.process() .then(() => { - assert.strictEqual(deletePathSent, `${PATHS.ManagementIp}/4.5.6.7~8`); + assert.strictEqual(deletePathSent, `${PATHS.ManagementIp}/192.0.2.40~8`); }); }); @@ -1763,8 +1763,8 @@ describe('systemHandler', () => { const declaration = { Common: { ManagementIp: { - '1.2.3.4/5': { - name: '1.2.3.4/5', + '192.0.2.10/5': { + name: '192.0.2.10/5', description: 'this is my description' } } @@ -1784,8 +1784,8 @@ describe('systemHandler', () => { const declaration = { Common: { ManagementIp: { - '4.5.6.7/9': { - name: '4.5.6.7/9', + '192.0.2.40/9': { + name: '192.0.2.40/9', description: 'this is my description' } } @@ -1800,8 +1800,8 @@ describe('systemHandler', () => { const declaration = { Common: { ManagementIp: { - '1.2.3.4/5': { - name: '1.2.3.4/5', + '192.0.2.10/5': { + name: '192.0.2.10/5', description: 'this is my description' } } @@ -1819,8 +1819,8 @@ describe('systemHandler', () => { const declaration = { Common: { ManagementIp: { - '1.2.3.4/5': { - name: '1.2.3.4/5', + '192.0.2.10/5': { + name: '192.0.2.10/5', description: 'configured-by-dhcp' } } @@ -1832,7 +1832,7 @@ describe('systemHandler', () => { return systemHandler.process() .then(() => { assert.deepStrictEqual(dataSent, null); - assert.strictEqual(hostSet, '1.2.3.4'); + assert.strictEqual(hostSet, '192.0.2.10'); }); }); @@ -1840,8 +1840,8 @@ describe('systemHandler', () => { const declaration = { Common: { ManagementIp: { - '4.5.6.7/8': { - name: '4.5.6.7/8', + '192.0.2.40/8': { + name: '192.0.2.40/8', description: 'configured-by-dhcp' } } @@ -1856,7 +1856,7 @@ describe('systemHandler', () => { dataSent, null ); - assert.strictEqual(hostSet, '4.5.6.7'); + assert.strictEqual(hostSet, '192.0.2.40'); }); }); @@ -1864,8 +1864,8 @@ describe('systemHandler', () => { const declaration = { Common: { ManagementIp: { - '4.5.6.7/8': { - name: '4.5.6.7/8' + '192.0.2.40/8': { + name: '192.0.2.40/8' } } } @@ -1876,7 +1876,7 @@ describe('systemHandler', () => { return systemHandler.process() .then(() => { assert.deepStrictEqual(dataSent, null); - assert.strictEqual(hostSet, '4.5.6.7'); + assert.strictEqual(hostSet, '192.0.2.40'); }); }); @@ -1889,16 +1889,16 @@ describe('systemHandler', () => { } }, ManagementIp: { - '1.2.3.4/5': { - name: '1.2.3.4/5', + '192.0.2.10/5': { + name: '192.0.2.10/5', description: 'configured-by-dhcp' } }, ManagementRoute: { managementRoute1: { name: 'managementRoute1', - gateway: '1.2.3.4', - network: '4.3.2.1', + gateway: '192.0.2.10', + network: '192.0.2.30', mtu: 1 } } @@ -1923,8 +1923,8 @@ describe('systemHandler', () => { const declaration = { Common: { ManagementIp: { - '4.5.6.7/8': { - name: '4.5.6.7/8', + '192.0.2.40/8': { + name: '192.0.2.40/8', description: 'this is my description' } } @@ -1952,8 +1952,8 @@ describe('systemHandler', () => { ManagementRoute: { theManagementRoute: { name: 'theManagementRoute', - gateway: '4.3.2.1', - network: '1.2.3.4', + gateway: '192.0.2.30', + network: '192.0.2.10', mtu: 123 } } @@ -1963,7 +1963,7 @@ describe('systemHandler', () => { state.currentConfig.Common.ManagementRoute = { theManagementRoute: { name: 'theManagementRoute', - gateway: '4.3.2.1', + gateway: '192.0.2.30', network: '10.20.30.40', mtu: 123 } @@ -1980,15 +1980,15 @@ describe('systemHandler', () => { managementRoute1: { name: 'managementRoute1', description: 'Example description', - gateway: '1.1.1.1', + gateway: '192.0.2.10', network: 'default-inet6', mtu: 1234, type: 'interface' }, managementRoute2: { name: 'managementRoute1', - gateway: '1.2.3.4', - network: '4.3.2.1', + gateway: '192.0.2.10', + network: '192.0.2.30', mtu: 1 } }; @@ -2001,14 +2001,14 @@ describe('systemHandler', () => { assert.strictEqual(managementRouteData[0].name, 'managementRoute1'); assert.strictEqual(managementRouteData[0].description, 'Example description'); assert.strictEqual(managementRouteData[0].partition, 'Common'); - assert.strictEqual(managementRouteData[0].gateway, '1.1.1.1'); + assert.strictEqual(managementRouteData[0].gateway, '192.0.2.10'); assert.strictEqual(managementRouteData[0].network, 'default-inet6'); assert.strictEqual(managementRouteData[0].mtu, 1234); assert.strictEqual(managementRouteData[0].type, 'interface'); assert.strictEqual(managementRouteData[1].name, 'managementRoute1'); assert.strictEqual(managementRouteData[1].partition, 'Common'); - assert.strictEqual(managementRouteData[1].gateway, '1.2.3.4'); - assert.strictEqual(managementRouteData[1].network, '4.3.2.1/32'); + assert.strictEqual(managementRouteData[1].gateway, '192.0.2.10'); + assert.strictEqual(managementRouteData[1].network, '192.0.2.30/32'); assert.strictEqual(managementRouteData[1].mtu, 1); }); }); @@ -2021,8 +2021,8 @@ describe('systemHandler', () => { assert.deepEqual(deletedPaths, ['/tm/sys/management-route/~Common~theManagementRoute']); assert.strictEqual(managementRouteData[0].name, 'theManagementRoute'); assert.strictEqual(managementRouteData[0].partition, 'Common'); - assert.strictEqual(managementRouteData[0].gateway, '4.3.2.1'); - assert.strictEqual(managementRouteData[0].network, '1.2.3.4/32'); + assert.strictEqual(managementRouteData[0].gateway, '192.0.2.30'); + assert.strictEqual(managementRouteData[0].network, '192.0.2.10/32'); assert.strictEqual(managementRouteData[0].mtu, 123); }); }); @@ -2038,7 +2038,7 @@ describe('systemHandler', () => { }); it('should not delete the existing ManagementRoute if network not updated', () => { - state.currentConfig.Common.ManagementRoute.theManagementRoute.network = '1.2.3.4/32'; + state.currentConfig.Common.ManagementRoute.theManagementRoute.network = '192.0.2.10/32'; const systemHandler = new SystemHandler(declaration, bigIpMock, null, state); return systemHandler.process() .then(() => { @@ -2046,8 +2046,8 @@ describe('systemHandler', () => { assert.deepEqual(deletedPaths, []); assert.strictEqual(managementRouteData[0].name, 'theManagementRoute'); assert.strictEqual(managementRouteData[0].partition, 'Common'); - assert.strictEqual(managementRouteData[0].gateway, '4.3.2.1'); - assert.strictEqual(managementRouteData[0].network, '1.2.3.4/32'); + assert.strictEqual(managementRouteData[0].gateway, '192.0.2.30'); + assert.strictEqual(managementRouteData[0].network, '192.0.2.10/32'); assert.strictEqual(managementRouteData[0].mtu, 123); }); }); @@ -2093,10 +2093,10 @@ describe('systemHandler', () => { '/tm/sys/management-route': [ { description: undefined, - gateway: '4.3.2.1', + gateway: '192.0.2.30', mtu: 123, name: 'theManagementRoute', - network: '1.2.3.4/32', + network: '192.0.2.10/32', partition: 'Common', type: undefined } @@ -2111,8 +2111,8 @@ describe('systemHandler', () => { declaration.Common.ManagementRoute = { managementRoute: { name: 'managementRoute1', - gateway: '1.2.3.4', - network: '4.3.2.1', + gateway: '192.0.2.10', + network: '192.0.2.30', mtu: 1 } }; @@ -2212,15 +2212,15 @@ describe('systemHandler', () => { managementRoute: {}, managementRoute1: { name: 'managementRoute1', - gateway: '1.2.3.4', - network: '4.3.2.1' + gateway: '192.0.2.10', + network: '192.0.2.30' } }; state.currentConfig.Common.ManagementRoute = { managementRoute: { name: 'managementRoute', - gateway: '1.2.3.4', - network: '4.3.2.1' + gateway: '192.0.2.10', + network: '192.0.2.30' } }; const systemHandler = new SystemHandler(declaration, bigIpMock, null, state); @@ -2234,8 +2234,8 @@ describe('systemHandler', () => { name: 'managementRoute1', description: undefined, partition: 'Common', - gateway: '1.2.3.4', - network: '4.3.2.1/32', + gateway: '192.0.2.10', + network: '192.0.2.30/32', mtu: undefined, type: undefined } @@ -2311,7 +2311,7 @@ describe('systemHandler', () => { SnmpUser: { myFirstSnmpUser: { name: 'myFirstSnmpUser', - username: 'my!name!withspecials', + username: 'bigipUser!name!withspecials', authProtocol: 'sha', authPassword: 'pass1W0rd!', privacyProtocol: 'aes', @@ -2327,7 +2327,7 @@ describe('systemHandler', () => { return systemHandler.process() .then(() => { assert.strictEqual(dataSent[PATHS.SnmpUser][0].name, 'myFirstSnmpUser'); - assert.strictEqual(dataSent[PATHS.SnmpUser][0].username, 'my!name!withspecials'); + assert.strictEqual(dataSent[PATHS.SnmpUser][0].username, 'bigipUser!name!withspecials'); assert.strictEqual(dataSent[PATHS.SnmpUser][0].authPassword, 'pass1W0rd!'); assert.strictEqual(dataSent[PATHS.SnmpUser][0].authProtocol, 'sha'); assert.strictEqual(dataSent[PATHS.SnmpUser][0].privacyPassword, 'P@ssW0rd'); @@ -2371,7 +2371,7 @@ describe('systemHandler', () => { } } }; - sinon.stub(bigIpMock, 'deviceInfo').resolves({ version: '13.1.1.3' }); + sinon.stub(bigIpMock, 'deviceInfo').resolves({ version: '13.1.1' }); const systemHandler = new SystemHandler(declaration, bigIpMock, null, state); return systemHandler.process() @@ -2597,7 +2597,7 @@ describe('systemHandler', () => { } } }; - sinon.stub(bigIpMock, 'deviceInfo').resolves({ version: '13.1.1.3' }); + sinon.stub(bigIpMock, 'deviceInfo').resolves({ version: '13.1.1' }); const systemHandler = new SystemHandler(declaration, bigIpMock, null, state); return systemHandler.process() @@ -2797,7 +2797,7 @@ describe('systemHandler', () => { SSHD: { allow: [ '192.168.*.*', - '1.2.3.4/32' + '192.0.2.10/32' ], bannerText: 'Text for banner', inactivityTimeout: 12345, @@ -2834,7 +2834,7 @@ describe('systemHandler', () => { { allow: [ '192.168.*.*', - '1.2.3.4/32' + '192.0.2.10/32' ], banner: 'enabled', bannerText: 'Text for banner', diff --git a/test/unit/lib/userValidatorTests.js b/test/unit/lib/userValidatorTests.js index d045cd60..c3992fd1 100644 --- a/test/unit/lib/userValidatorTests.js +++ b/test/unit/lib/userValidatorTests.js @@ -25,7 +25,7 @@ describe('userValidator', () => { describe('valid', () => { it('should validate valid root user and 2 valid non-root users', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { root: { @@ -57,7 +57,7 @@ describe('userValidator', () => { describe('invalid', () => { it('should invalidate a userType of "root" when user is not "root"', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { user1: { @@ -76,7 +76,7 @@ describe('userValidator', () => { it('should invalidate a userType of "regular" when user is "root"', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { root: { @@ -95,7 +95,7 @@ describe('userValidator', () => { it('should invalidate user names that are too long', () => { const wrapper = { - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', declaration: { Common: { userWithTooLongName_123456789012: { diff --git a/test/unit/lib/validatorTests.js b/test/unit/lib/validatorTests.js index 23506b79..0fa3e5b6 100644 --- a/test/unit/lib/validatorTests.js +++ b/test/unit/lib/validatorTests.js @@ -58,7 +58,7 @@ describe('validator', () => { "class": "Tenant", "mySelfIp": { "class": "SelfIp", - "address": "1.2.3.4", + "address": "192.0.2.10", "vlan": "foo" } } diff --git a/test/unit/nodejs/restWorkerTests.js b/test/unit/nodejs/restWorkerTests.js index cd5997cd..509fafd2 100644 --- a/test/unit/nodejs/restWorkerTests.js +++ b/test/unit/nodejs/restWorkerTests.js @@ -907,7 +907,7 @@ describe('restWorker', () => { it('should dereference json-pointers in the DO wrapper', () => new Promise((resolve, reject) => { declaration = { class: 'DO', - targetUsername: '/declaration/Credentials/0/username', + targetUsername: '/declaration/Credentials/0/username', // #gitleaks:allow targetPassphrase: '/declaration/Credentials/1/password', declaration: { Credentials: [ @@ -1027,7 +1027,7 @@ describe('restWorker', () => { Common: { mySelfIp: { class: 'SelfIp', - address: '1.2.3.4', + address: '192.0.2.10', vlan: 'foo' } } @@ -1597,7 +1597,7 @@ describe('restWorker', () => { it('should handle initial password set if user/password is admin/admin', () => new Promise((resolve, reject) => { declaration = { class: 'DO', - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', targetPort: 443, targetUsername: 'admin', targetPassphrase: 'admin', @@ -1637,7 +1637,7 @@ describe('restWorker', () => { declaration = { class: 'DO', - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', targetUsername: 'admin', targetSshKey: { path: '~/.ssh/id_rsa' @@ -1667,7 +1667,7 @@ describe('restWorker', () => { it('should ssh to BIG-IP if an ssh key is provided and shell is tmsh', (done) => { declaration = { class: 'DO', - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', targetUsername: 'admin', targetSshKey: { path: '~/.ssh/id_rsa' @@ -1697,7 +1697,7 @@ describe('restWorker', () => { it('should dereference user password if it is a pointer', () => new Promise((resolve, reject) => { declaration = { class: 'DO', - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', targetUsername: 'admin', targetSshKey: { path: '~/.ssh/id_rsa' @@ -1732,7 +1732,7 @@ describe('restWorker', () => { it('should delete targetSshKey when setting targetPassphrase', () => new Promise((resolve, reject) => { declaration = { class: 'DO', - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', targetUsername: 'admin', targetSshKey: { path: '~/.ssh/id_rsa' @@ -1768,7 +1768,7 @@ describe('restWorker', () => { it('should update password used to create bigIp', () => new Promise((resolve, reject) => { declaration = { class: 'DO', - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', targetUsername: 'admin', targetSshKey: { path: '~/.ssh/id_rsa' @@ -1807,7 +1807,7 @@ describe('restWorker', () => { it('should use password value if it is not really a pointer', () => new Promise((resolve, reject) => { declaration = { class: 'DO', - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', targetUsername: 'admin', targetSshKey: { path: '~/.ssh/id_rsa' @@ -1865,7 +1865,7 @@ describe('restWorker', () => { declaration = { class: 'DO', - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', targetPort: 443, targetUsername: 'admin', targetPassphrase: 'admin', @@ -1915,7 +1915,7 @@ describe('restWorker', () => { declaration = { class: 'DO', - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', targetPort: 443, targetUsername: 'admin', targetPassphrase: 'admin', @@ -1977,7 +1977,7 @@ describe('restWorker', () => { declaration = { class: 'DO', - targetHost: '1.2.3.4', + targetHost: '192.0.2.10', targetPort: 443, targetUsername: 'admin', targetSshKey: { diff --git a/test/unit/schema/authSchemaTests.js b/test/unit/schema/authSchemaTests.js index 06e89277..3a8e1cff 100644 --- a/test/unit/schema/authSchemaTests.js +++ b/test/unit/schema/authSchemaTests.js @@ -166,7 +166,7 @@ describe('auth.schema.json', () => { "radius": { "servers": { "primary": { - "server": "1.2.3.4", + "server": "192.0.2.10", "secret": "mumble" }, "secondary": { @@ -208,7 +208,7 @@ describe('auth.schema.json', () => { "radius": { "servers": { "secondary": { - "server": "5.6.7.8", + "server": "192.0.2.10", "secret": "mumble" } } @@ -336,7 +336,7 @@ describe('auth.schema.json', () => { "tacacs": { "servers": [ "my.host.com", - "1.2.3.4", + "192.0.2.10", "FE80:0000:0000:0000:0202:B3FF:FE1E:8329" ], "accounting": "send-to-all-servers", @@ -397,7 +397,7 @@ describe('auth.schema.json', () => { "class": "Authentication", "enabledSourceType": "tacacs", "tacacs": { - "servers": ["1.1.1.1"], + "servers": ["192.0.2.10"], "service": "ppp" } }; @@ -411,7 +411,7 @@ describe('auth.schema.json', () => { "class": "Authentication", "enabledSourceType": "tacacs", "tacacs": { - "servers": ["1.1.1.1"], + "servers": ["192.0.2.10"], "secret": "test" } }; @@ -448,7 +448,7 @@ describe('auth.schema.json', () => { searchTimeout: 687, servers: [ 'my.host.com', - '1.2.3.4', + '192.0.2.10', 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329' ], ssl: "enabled", diff --git a/test/unit/schema/baseSchemaTests.js b/test/unit/schema/baseSchemaTests.js index 3a936e10..fd569eed 100644 --- a/test/unit/schema/baseSchemaTests.js +++ b/test/unit/schema/baseSchemaTests.js @@ -28,6 +28,7 @@ const authSchema = require('../../../src/schema/latest/auth.schema.json'); const customFormats = require('../../../src/schema/latest/formats'); const defSchema = require('../../../src/schema/latest/definitions.schema.json'); const gslbSchema = require('../../../src/schema/latest/gslb.schema.json'); +const securitySchema = require('../../../src/schema/latest/security.schema.json'); const ajv = new Ajv( { @@ -50,6 +51,7 @@ const validate = ajv .addSchema(analyticsSchema) .addSchema(authSchema) .addSchema(gslbSchema) + .addSchema(securitySchema) .compile(baseSchema); /* eslint-disable quotes, quote-props */ diff --git a/test/unit/schema/doSchemaTests.js b/test/unit/schema/doSchemaTests.js index 0ea4323b..fe2bad67 100644 --- a/test/unit/schema/doSchemaTests.js +++ b/test/unit/schema/doSchemaTests.js @@ -30,6 +30,7 @@ const authSchema = require('../../../src/schema/latest/auth.schema.json'); const customFormats = require('../../../src/schema/latest/formats'); const defSchema = require('../../../src/schema/latest/definitions.schema.json'); const gslbSchema = require('../../../src/schema/latest/gslb.schema.json'); +const securitySchema = require('../../../src/schema/latest/security.schema.json'); const ajv = new Ajv( { @@ -52,6 +53,7 @@ const validate = ajv .addSchema(analyticsSchema) .addSchema(authSchema) .addSchema(gslbSchema) + .addSchema(securitySchema) .addSchema(baseSchema) .addSchema(remoteSchema) .compile(doSchema); diff --git a/test/unit/schema/dscSchemaTests.js b/test/unit/schema/dscSchemaTests.js index ff5c1aca..b7bcef42 100644 --- a/test/unit/schema/dscSchemaTests.js +++ b/test/unit/schema/dscSchemaTests.js @@ -44,7 +44,7 @@ describe('dsc.schema.json', () => { it('should validate config sync data with IP configsyncIp', () => { const data = { "class": "ConfigSync", - "configsyncIp": "1.2.3.4" + "configsyncIp": "192.0.2.10" }; assert.ok(validate(data), getErrorString(validate)); }); @@ -87,7 +87,7 @@ describe('dsc.schema.json', () => { it('should invalidate additional properties', () => { const data = { "class": "ConfigSync", - "configsyncIp": "1.2.3.4", + "configsyncIp": "192.0.2.10", "foo": "bar" }; assert.strictEqual(validate(data), false, 'additional properties should not be valid'); @@ -101,7 +101,7 @@ describe('dsc.schema.json', () => { it('should validate minimal unicast address with ip', () => { const data = { "class": "FailoverUnicast", - "address": "1.2.3.4" + "address": "192.0.2.10" }; assert.ok(validate(data), getErrorString(validate)); }); @@ -122,7 +122,7 @@ describe('dsc.schema.json', () => { it('should validate full unicast address', () => { const data = { "class": "FailoverUnicast", - "address": "1.2.3.4", + "address": "192.0.2.10", "port": 8888 }; assert.ok(validate(data), getErrorString(validate)); @@ -132,16 +132,16 @@ describe('dsc.schema.json', () => { const data = { "class": "FailoverUnicast", "addressPorts": [ - { "address": "2.3.4.5", "port": 876 }, - { "address": "1.2.3.4" } + { "address": "192.0.2.20", "port": 876 }, + { "address": "192.0.2.10" } ] }; assert.ok(validate(data), getErrorString(validate)); assert.deepStrictEqual(data, { class: 'FailoverUnicast', addressPorts: [ - { address: '2.3.4.5', port: 876 }, - { address: '1.2.3.4', port: 1026 } + { address: '192.0.2.20', port: 876 }, + { address: '192.0.2.10', port: 1026 } ] }); }); @@ -175,7 +175,7 @@ describe('dsc.schema.json', () => { it('should invalidate bad port', () => { const data = { "class": "FailoverUnicast", - "address": "1.2.3.4", + "address": "192.0.2.10", "port": 65536 }; assert.strictEqual(validate(data), false, 'additional properties should not be valid'); @@ -200,10 +200,10 @@ describe('dsc.schema.json', () => { it('should invalidate if an addressPorts is provided as well as address', () => { const data = { "class": "FailoverUnicast", - "address": "1.2.3.4", + "address": "192.0.2.10", "addressPorts": [ { - "address": "1.2.3.4" + "address": "192.0.2.10" } ] }; @@ -219,7 +219,7 @@ describe('dsc.schema.json', () => { "port": 59, "addressPorts": [ { - "address": "1.2.3.4" + "address": "192.0.2.10" } ] }; @@ -234,7 +234,7 @@ describe('dsc.schema.json', () => { "class": "FailoverUnicast", "addressPorts": [ { - "address": "1.2.3.4", + "address": "192.0.2.10", "port": 65536 } ] @@ -248,7 +248,7 @@ describe('dsc.schema.json', () => { "class": "FailoverUnicast", "addressPorts": [ { - "address": "1.2.3.400" + "address": "192.0.2.1000" } ] }; @@ -267,7 +267,7 @@ describe('dsc.schema.json', () => { const data = { "class": "FailoverMulticast", "interface": "exampleInterface", - "address": "1.2.3.4", + "address": "192.0.2.10", "port": 123 }; assert.ok(validate(data), getErrorString(validate)); @@ -397,7 +397,7 @@ describe('dsc.schema.json', () => { "class": "DeviceTrust", "localUsername": "myUser", "localPassword": "myPassword", - "remoteHost": "1.2.3.4", + "remoteHost": "192.0.2.10", "remoteUsername": "yourUser", "remotePassword": "yourPassword" }; @@ -422,7 +422,7 @@ describe('dsc.schema.json', () => { const data = { "class": "DeviceTrust", "localPassword": "myPassword", - "remoteHost": "1.2.3.4", + "remoteHost": "192.0.2.10", "remoteUsername": "yourUser", "remotePassword": "yourPassword" }; @@ -434,7 +434,7 @@ describe('dsc.schema.json', () => { const data = { "class": "DeviceTrust", "localUsername": "myUser", - "remoteHost": "1.2.3.4", + "remoteHost": "192.0.2.10", "remoteUsername": "yourUser", "remotePassword": "yourPassword" }; @@ -459,7 +459,7 @@ describe('dsc.schema.json', () => { "class": "DeviceTrust", "localUsername": "myUser", "localPassword": "myPassword", - "remoteHost": "1.2.3.4", + "remoteHost": "192.0.2.10", "remotePassword": "yourPassword" }; assert.strictEqual(validate(data), false, 'missing remoteUsername should not be valid'); @@ -471,7 +471,7 @@ describe('dsc.schema.json', () => { "class": "DeviceTrust", "localUsername": "myUser", "localPassword": "myPassword", - "remoteHost": "1.2.3.4", + "remoteHost": "192.0.2.10", "remoteUsername": "yourUser" }; assert.strictEqual(validate(data), false, 'missing remotePassword should not be valid'); diff --git a/test/unit/schema/formatsTests.js b/test/unit/schema/formatsTests.js index 232197a3..cc5e86a6 100644 --- a/test/unit/schema/formatsTests.js +++ b/test/unit/schema/formatsTests.js @@ -23,41 +23,41 @@ describe('formats', () => { describe('f5ip', () => { describe('ipv4', () => { it('should validate standalone address', () => { - assert.strictEqual(formats.f5ip('1.2.3.4'), true); + assert.strictEqual(formats.f5ip('192.0.2.10'), true); }); it('should invalidate invalid address', () => { - assert.strictEqual(formats.f5ip('256.2.3.4'), false); + assert.strictEqual(formats.f5ip('256.2.3.4'), false); // gitleaks:allow }); it('should validate addresses with valid prefixes', () => { - assert.strictEqual(formats.f5ip('1.2.3.4/32'), true, 'prefix 32 should be valid'); - assert.strictEqual(formats.f5ip('1.2.3.4/24'), true, 'prefix 24 should be valid'); - assert.strictEqual(formats.f5ip('1.2.3.4/16'), true, 'prefix 16 should be valid'); - assert.strictEqual(formats.f5ip('1.2.3.4/8'), true, 'prefix 8 should be valid'); - assert.strictEqual(formats.f5ip('1.2.3.4/0'), true, 'prefix 0 should be valid'); + assert.strictEqual(formats.f5ip('192.0.2.10/32'), true, 'prefix 32 should be valid'); + assert.strictEqual(formats.f5ip('192.0.2.10/24'), true, 'prefix 24 should be valid'); + assert.strictEqual(formats.f5ip('192.0.2.10/16'), true, 'prefix 16 should be valid'); + assert.strictEqual(formats.f5ip('192.0.2.10/8'), true, 'prefix 8 should be valid'); + assert.strictEqual(formats.f5ip('192.0.2.10/0'), true, 'prefix 0 should be valid'); }); it('should invalidate addresses with invalid prefixes', () => { - assert.strictEqual(formats.f5ip('1.2.3.4/40'), false, 'prefix 40 should be invalid'); - assert.strictEqual(formats.f5ip('1.2.3.4/33'), false, 'prefix 33 should be invalid'); - assert.strictEqual(formats.f5ip('1.2.3.4/321'), false, 'prefix 321 should be invalid'); - assert.strictEqual(formats.f5ip('1.2.3.4/200'), false, 'prefix 200 should be invalid'); + assert.strictEqual(formats.f5ip('192.0.2.10/40'), false, 'prefix 40 should be invalid'); + assert.strictEqual(formats.f5ip('192.0.2.10/33'), false, 'prefix 33 should be invalid'); + assert.strictEqual(formats.f5ip('192.0.2.10/321'), false, 'prefix 321 should be invalid'); + assert.strictEqual(formats.f5ip('192.0.2.10/200'), false, 'prefix 200 should be invalid'); }); it('should validate addresses with valid route domain', () => { - assert.strictEqual(formats.f5ip('1.2.3.4%0'), true, 'route domain 0 should be valid'); - assert.strictEqual(formats.f5ip('1.2.3.4%65535'), true, 'route domain 65535 should be valid'); + assert.strictEqual(formats.f5ip('192.0.2.10%0'), true, 'route domain 0 should be valid'); + assert.strictEqual(formats.f5ip('192.0.2.10%65535'), true, 'route domain 65535 should be valid'); }); it('should invalidate addresses with invalid route domain', () => { assert.strictEqual( - formats.f5ip('1.2.3.4%65536'), false, 'route domain 65536 should be invalid' + formats.f5ip('192.0.2.10%65536'), false, 'route domain 65536 should be invalid' ); }); it('should validate address with valid prefix and route domain', () => { - assert.strictEqual(formats.f5ip('1.2.3.4%1/24'), true); + assert.strictEqual(formats.f5ip('192.0.2.10%1/24'), true); }); }); @@ -160,35 +160,35 @@ describe('formats', () => { } it('should validate standalone address', () => { - testValid('1.2.3.4'); + testValid('192.0.2.10'); }); it('should invalidate invalid address', () => { - testInvalid('256.2.3.4', 'address must be valid'); + testInvalid('256.2.3.4', 'address must be valid'); // gitleaks:allow }); it('should validate addresses with valid prefixes', () => { - testValid('1.2.3.4/32', 'prefix 32 should be valid'); - testValid('1.2.3.4/24', 'prefix 24 should be valid'); - testValid('1.2.3.4/16', 'prefix 16 should be valid'); - testValid('1.2.3.4/8', 'prefix 8 should be valid'); - testValid('1.2.3.4/0', 'prefix 0 should be valid'); + testValid('192.0.2.10/32', 'prefix 32 should be valid'); + testValid('192.0.2.10/24', 'prefix 24 should be valid'); + testValid('192.0.2.10/16', 'prefix 16 should be valid'); + testValid('192.0.2.10/8', 'prefix 8 should be valid'); + testValid('192.0.2.10/0', 'prefix 0 should be valid'); }); it('should invalidate addresses with invalid prefix', () => { - testInvalid('1.2.3.4/40', 'prefix 40 should be invalid'); - testInvalid('1.2.3.4/33', 'prefix 33 should be invalid'); - testInvalid('1.2.3.4/321', 'prefix 321 should be invalid'); - testInvalid('1.2.3.4/200', 'prefix 200 should be invalid'); + testInvalid('192.0.2.10/40', 'prefix 40 should be invalid'); + testInvalid('192.0.2.10/33', 'prefix 33 should be invalid'); + testInvalid('192.0.2.10/321', 'prefix 321 should be invalid'); + testInvalid('192.0.2.10/200', 'prefix 200 should be invalid'); }); it('should invalidate addresses with route domain', () => { - testInvalid('1.2.3.4%0', 'should not specify a route domain'); - testInvalid('1.2.3.4%65535', 'should not specify a route domain'); + testInvalid('192.0.2.10%0', 'should not specify a route domain'); + testInvalid('192.0.2.10%65535', 'should not specify a route domain'); }); it('should invalidate address with prefix and route domain', () => { - testInvalid('1.2.3.4%1/24', 'should not specify a route domain'); + testInvalid('192.0.2.10%1/24', 'should not specify a route domain'); }); }); @@ -309,7 +309,7 @@ describe('formats', () => { }); it('should invalidate invalid address with prefix', () => { - testInvalid('256.2.3.4/24', 'address must be valid'); + testInvalid('256.2.3.4/24', 'address must be valid'); // gitleaks:allow }); it('should invalidate address without prefix', () => { @@ -317,27 +317,27 @@ describe('formats', () => { }); it('should validate addresses with valid prefixes', () => { - testValid('1.2.3.4/32', 'prefix 32 should be valid'); - testValid('1.2.3.4/24', 'prefix 24 should be valid'); - testValid('1.2.3.4/16', 'prefix 16 should be valid'); - testValid('1.2.3.4/8', 'prefix 8 should be valid'); - testValid('1.2.3.4/0', 'prefix 0 should be valid'); + testValid('192.0.2.10/32', 'prefix 32 should be valid'); + testValid('192.0.2.10/24', 'prefix 24 should be valid'); + testValid('192.0.2.10/16', 'prefix 16 should be valid'); + testValid('192.0.2.10/8', 'prefix 8 should be valid'); + testValid('192.0.2.10/0', 'prefix 0 should be valid'); }); it('should invalidate addresses with invalid prefixes', () => { - testInvalid('1.2.3.4/40', 'prefix 40 should be invalid'); - testInvalid('1.2.3.4/33', 'prefix 33 should be invalid'); - testInvalid('1.2.3.4/321', 'prefix 321 should be invalid'); - testInvalid('1.2.3.4/200', 'prefix 200 should be invalid'); + testInvalid('192.0.2.10/40', 'prefix 40 should be invalid'); + testInvalid('192.0.2.10/33', 'prefix 33 should be invalid'); + testInvalid('192.0.2.10/321', 'prefix 321 should be invalid'); + testInvalid('192.0.2.10/200', 'prefix 200 should be invalid'); }); it('should invalidate addresses with route domain', () => { - testInvalid('1.2.3.4%0', 'should not specify a route domain'); - testInvalid('1.2.3.4%65535', 'should not specify a route domain'); + testInvalid('192.0.2.10%0', 'should not specify a route domain'); + testInvalid('192.0.2.10%65535', 'should not specify a route domain'); }); it('should invalidate address with prefix and route domain', () => { - testInvalid('1.2.3.4%1/24', 'should not specify a route domain'); + testInvalid('192.0.2.10%1/24', 'should not specify a route domain'); }); }); diff --git a/test/unit/schema/gslbSchemaTests.js b/test/unit/schema/gslbSchemaTests.js index 68c6059a..0dd8e8eb 100644 --- a/test/unit/schema/gslbSchemaTests.js +++ b/test/unit/schema/gslbSchemaTests.js @@ -210,7 +210,7 @@ describe('gslb.schema.json', () => { remark: 'virtual server description one', label: 'virtual server label one', enabled: false, - address: '192.0.10.20', + address: '192.0.2.20', port: 443, addressTranslation: '10.10.0.10', addressTranslationPort: 23, diff --git a/test/unit/schema/networkSchemaTests.js b/test/unit/schema/networkSchemaTests.js index 399fa0a9..eac904c5 100644 --- a/test/unit/schema/networkSchemaTests.js +++ b/test/unit/schema/networkSchemaTests.js @@ -54,10 +54,10 @@ describe('network.schema.json', () => { class: 'DNS_Resolver', forwardZones: [ { - name: 'google.public-dns', + name: 'test.public-dns', nameservers: [ - '8.8.8.8:53', - '8.8.4.4:53' + '192.0.2.10:53', + '192.0.2.20:53' ] } ], @@ -80,8 +80,8 @@ describe('network.schema.json', () => { { name: '.', nameservers: [ - '8.8.8.8:53', - '8.8.4.4:53' + '192.0.2.10:53', + '192.0.2.20:53' ] } ] @@ -105,10 +105,10 @@ describe('network.schema.json', () => { class: 'DNS_Resolver', forwardZones: [ { - name: 'google.public.dns', + name: 'test.public.dns', nameservers: [ - '8.8.8.8:53', - '8.8.4.4:53' + '192.0.2.10:53', + '192.0.2.20:53' ], rogueProperty: true } @@ -124,8 +124,8 @@ describe('network.schema.json', () => { forwardZones: [ { nameservers: [ - '8.8.8.8:53', - '8.8.4.4:53' + '192.0.2.10:53', + '192.0.2.20:53' ] } ] @@ -337,7 +337,7 @@ describe('network.schema.json', () => { it('should validate network data with IPv4 address', () => { const data = { class: 'SelfIp', - address: '1.2.3.4/32', + address: '192.0.2.10/32', vlan: 'myVlan', allowService: 'all', trafficGroup: 'traffic-group-1', @@ -361,7 +361,7 @@ describe('network.schema.json', () => { it('should validate network data with allow service:port', () => { const data = { class: 'SelfIp', - address: '1.2.3.4/32', + address: '192.0.2.10/32', vlan: 'myVlan', allowService: ['foo:1234'], trafficGroup: 'traffic-group-1' @@ -372,7 +372,7 @@ describe('network.schema.json', () => { it('should validate network data with allow service:port and default', () => { const data = { class: 'SelfIp', - address: '1.2.3.4/32', + address: '192.0.2.10/32', vlan: 'myVlan', allowService: ['foo:1234', 'default'], trafficGroup: 'traffic-group-1' @@ -394,7 +394,7 @@ describe('network.schema.json', () => { it('should invalidate self ips with no vlan', () => { const data = { class: 'SelfIp', - address: '1.2.3.4' + address: '192.0.2.10' }; assert.strictEqual(validate(data), false, 'missing self ip vlan should not be valid'); assert(getErrorString().includes('"missingProperty": "vlan"')); @@ -413,7 +413,7 @@ describe('network.schema.json', () => { it('should invalidate IPv4 selfIp with out of range CIDR', () => { const data = { class: 'SelfIp', - address: '1.2.3.4/33', + address: '192.0.2.10/33', vlan: 'myVlan' }; assert.strictEqual(validate(data), false, 'missing self ip vlan should not be valid'); @@ -433,7 +433,7 @@ describe('network.schema.json', () => { it('should invalidate bad traffic group', () => { const data = { class: 'SelfIp', - address: '1.2.3.4', + address: '192.0.2.10', vlan: 'myVlan', trafficGroup: 'traffic-group-foo' }; @@ -445,7 +445,7 @@ describe('network.schema.json', () => { it('should invalidate single words that are not all, default, or none', () => { const data = { class: 'SelfIp', - address: '1.2.3.4', + address: '192.0.2.10', vlan: 'myVlan', allowService: 'foo' }; @@ -456,7 +456,7 @@ describe('network.schema.json', () => { it('should invalidate service:port that is not in an array', () => { const data = { class: 'SelfIp', - address: '1.2.3.4', + address: '192.0.2.10', vlan: 'myVlan', allowService: 'tcp:1234' }; @@ -471,7 +471,7 @@ describe('network.schema.json', () => { it('should invalidate invalid port values', () => { const data = { class: 'SelfIp', - address: '1.2.3.4', + address: '192.0.2.10', vlan: 'myVlan', allowService: ['foo:bar'] }; @@ -482,7 +482,7 @@ describe('network.schema.json', () => { it('should invalidate misspelled default in port array', () => { const data = { class: 'SelfIp', - address: '1.2.3.4', + address: '192.0.2.10', vlan: 'myVlan', allowService: ['foo:1234', 'defalt'] }; @@ -498,7 +498,7 @@ describe('network.schema.json', () => { it('should validate route data', () => { const data = { class: 'Route', - gw: '1.2.3.4', + gw: '192.0.2.10', network: 'default', mtu: 1234 }; @@ -518,7 +518,7 @@ describe('network.schema.json', () => { it('should allow route domains', () => { const data = { class: 'Route', - gw: '1.2.3.4%10/24', + gw: '192.0.2.10%10/24', network: 'default', mtu: 1234 }; @@ -528,7 +528,7 @@ describe('network.schema.json', () => { it('should validate route data to LOCAL_ONLY', () => { const data = { class: 'Route', - gw: '1.2.3.4', + gw: '192.0.2.10', network: 'default', mtu: 1234, localOnly: true @@ -541,7 +541,7 @@ describe('network.schema.json', () => { it('should invalidate additional properties', () => { const data = { class: 'Route', - gw: '1.2.3.4', + gw: '192.0.2.10', foo: 'bar' }; assert.strictEqual(validate(data), false, 'additional properties should not be valid'); @@ -567,7 +567,7 @@ describe('network.schema.json', () => { it('should invalidate route data with bad network', () => { const data = { class: 'Route', - gw: '1.2.3.4', + gw: '192.0.2.10', network: 'foo' }; assert.strictEqual(validate(data), false, 'bad gateway IP address should not be valid'); diff --git a/test/unit/schema/remoteSchemaTests.js b/test/unit/schema/remoteSchemaTests.js index 657683ea..6af3dd15 100644 --- a/test/unit/schema/remoteSchemaTests.js +++ b/test/unit/schema/remoteSchemaTests.js @@ -29,6 +29,7 @@ const requestSchema = require('../../../src/schema/latest/remote.schema.json'); const customFormats = require('../../../src/schema/latest/formats'); const defSchema = require('../../../src/schema/latest/definitions.schema.json'); const gslbSchema = require('../../../src/schema/latest/gslb.schema.json'); +const securitySchema = require('../../../src/schema/latest/security.schema.json'); const ajv = new Ajv( { @@ -51,6 +52,7 @@ const validate = ajv .addSchema(analyticsSchema) .addSchema(authSchema) .addSchema(gslbSchema) + .addSchema(securitySchema) .addSchema(baseSchema) .compile(requestSchema); @@ -102,7 +104,7 @@ describe('remote.schema.json', () => { it('should validate targetHost', () => { const data = { "class": "DO", - "targetHost": "1.2.3.4", + "targetHost": "192.0.2.10", "declaration": { "schemaVersion": "1.0.0", "class": "Device" diff --git a/test/unit/schema/securitySchemaTests.js b/test/unit/schema/securitySchemaTests.js new file mode 100644 index 00000000..5578de8f --- /dev/null +++ b/test/unit/schema/securitySchemaTests.js @@ -0,0 +1,106 @@ +/** + * Copyright 2023 F5 Networks, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const assert = require('assert'); +const Ajv = require('ajv'); + +const ajv = new Ajv( + { + allErrors: false, + useDefaults: true, + coerceTypes: true, + extendRefs: 'fail' + } +); +const defSchema = require('../../../src/schema/latest/definitions.schema.json'); +const securitySchema = require('../../../src/schema/latest/security.schema.json'); +const customFormats = require('../../../src/schema/latest/formats'); + +Object.keys(customFormats).forEach((customFormat) => { + ajv.addFormat(customFormat, customFormats[customFormat]); +}); + +const validate = ajv + .addSchema(defSchema) + .compile(securitySchema); + +describe('security.schema.json', () => { + describe('SecurityAnalytics', () => { + describe('valid', () => { + it('should validate minimal data', () => { + const data = { + class: 'SecurityAnalytics' + }; + assert.ok(validate(data), getErrorString(validate)); + }); + + it('should validate with all properties', () => { + const data = { + class: 'SecurityAnalytics', + aclRules: { + collectClientIpEnabled: true, + collectClientPortEnabled: false, + collectDestinationIpEnabled: true, + collectDestinationPortEnabled: true, + collectServerSideStatsEnabled: false + }, + collectAllDosStatsEnabled: false, + collectedStatsExternalLoggingEnabled: false, + collectedStatsInternalLoggingEnabled: false, + dns: { + collectClientIpEnabled: true, + collectDestinationIpEnabled: true + }, + collectDnsStatsEnabled: true, + dosL2L4: { + collectClientIpEnabled: true, + collectDestinationGeoEnabled: true + }, + collectDosL3StatsEnabled: true, + collectFirewallAclStatsEnabled: true, + collectFirewallDropsStatsEnabled: true, + collectIpReputationStatsEnabled: true, + l3L4Errors: { + collectClientIpEnabled: true, + collectDestinationIpEnabled: true + }, + collectSipStatsEnabled: true, + collectStaleRulesEnabled: false, + publisher: 'none', + smtpConfig: 'none' + }; + assert.ok(validate(data), getErrorString(validate)); + }); + }); + + describe('invalid', () => { + it('should invalidate additional properties', () => { + const data = { + class: 'SecurityAnalytics', + invalidProperty: '' + }; + assert.strictEqual(validate(data), false, 'additional properties should not be valid'); + assert(getErrorString().includes('"additionalProperty": "invalidProperty"')); + }); + }); + }); +}); + +function getErrorString() { + return JSON.stringify(validate.errors, null, 4); +} diff --git a/test/unit/schema/systemSchemaTests.js b/test/unit/schema/systemSchemaTests.js index 19401873..b2569339 100644 --- a/test/unit/schema/systemSchemaTests.js +++ b/test/unit/schema/systemSchemaTests.js @@ -48,7 +48,7 @@ describe('system.schema.json', () => { const data = { "class": "DNS", "nameServers": [ - "1.2.3.4", + "192.0.2.10", "FE80:0000:0000:0000:0202:B3FF:FE1E:8329" ], "search": [ @@ -190,7 +190,7 @@ describe('system.schema.json', () => { const data = { "class": "License", "licenseType": "licensePool", - "bigIqHost": "1.2.3.4", + "bigIqHost": "192.0.2.10", "bigIqUsername": "admin", "bigIqPassword": "foofoo", "licensePool": "myPool", @@ -209,7 +209,7 @@ describe('system.schema.json', () => { const data = { "class": "License", "licenseType": "licensePool", - "bigIqHost": "1.2.3.4", + "bigIqHost": "192.0.2.10", "bigIqUsername": "admin", "bigIqPasswordUri": "https://my.passwordscom/bigIq", "licensePool": "myPool", @@ -223,7 +223,7 @@ describe('system.schema.json', () => { const data = { "class": "License", "licenseType": "licensePool", - "bigIqHost": "1.2.3.4", + "bigIqHost": "192.0.2.10", "bigIqUsername": "admin", "bigIqPassword": "foofoo", "licensePool": "myPool", @@ -243,7 +243,7 @@ describe('system.schema.json', () => { const data = { "class": "License", "licenseType": "licensePool", - "bigIqHost": "1.2.3.4", + "bigIqHost": "192.0.2.10", "bigIqUsername": "admin", "bigIqPassword": "foofoo", "licensePool": "myPool", @@ -261,7 +261,7 @@ describe('system.schema.json', () => { const data = { "class": "License", "licenseType": "licensePool", - "bigIqHost": "1.2.3.4", + "bigIqHost": "192.0.2.10", "bigIqUsername": "admin", "bigIqPassword": "foofoo", "licensePool": "myPool", @@ -279,7 +279,7 @@ describe('system.schema.json', () => { const data = { "class": "License", "licenseType": "licensePool", - "bigIqHost": "1.2.3.4", + "bigIqHost": "192.0.2.10", "bigIqUsername": "admin", "bigIqPassword": "foofoo", "licensePool": "myPool", @@ -298,7 +298,7 @@ describe('system.schema.json', () => { const data = { "class": "License", "licenseType": "licensePool", - "bigIqHost": "1.2.3.4", + "bigIqHost": "192.0.2.10", "bigIqUsername": "admin", "bigIqPassword": "foofoo", "reachable": true @@ -310,7 +310,7 @@ describe('system.schema.json', () => { const data = { "class": "License", "licenseType": "licensePool", - "bigIqHost": "1.2.3.4", + "bigIqHost": "192.0.2.10", "bigIqUsername": "admin", "bigIqPassword": "foofoo", "reachable": false @@ -322,7 +322,7 @@ describe('system.schema.json', () => { const data = { "class": "License", "licenseType": "licensePool", - "bigIqHost": "1.2.3.4", + "bigIqHost": "192.0.2.10", "bigIqUsername": "admin", "bigIqPassword": "foofoo", "reachable": false, @@ -335,12 +335,12 @@ describe('system.schema.json', () => { const data = { "class": "License", "licenseType": "licensePool", - "bigIqHost": "1.2.3.4", + "bigIqHost": "192.0.2.10", "bigIqUsername": "admin", "bigIqPassword": "foofoo", "reachable": false, "revokeFrom": { - "bigIqHost": "1.2.3.4", + "bigIqHost": "192.0.2.10", "bigIqUsername": "admin", "bigIqPassword": "foofoo", "licensePool": "barbar" @@ -355,7 +355,7 @@ describe('system.schema.json', () => { const data = { "class": "License", "licenseType": "licensePool", - "bigIqHost": "1.2.3.4", + "bigIqHost": "192.0.2.10", "bigIqUsername": "admin", "bigIqPassword": "foofoo", "bigIqPasswordUri": "https://my.passwordscom/bigIq", @@ -375,7 +375,7 @@ describe('system.schema.json', () => { const data = { "class": "License", "licenseType": "licensePool", - "bigIqHost": "1.2.3.4", + "bigIqHost": "192.0.2.10", "bigIqUsername": "admin", "bigIqPassword": "foofoo", "bigIqPasswordUri": "https://my.passwordscom/bigIq", @@ -393,7 +393,7 @@ describe('system.schema.json', () => { const data = { "class": "License", "licenseType": "licensePool", - "bigIqHost": "1.2.3.4", + "bigIqHost": "192.0.2.10", "bigIqUsername": "admin", "bigIqPassword": "foofoo", "licensePool": "myPool", @@ -418,7 +418,7 @@ describe('system.schema.json', () => { const data = { "class": "License", "licenseType": "licensePool", - "bigIqHost": "1.2.3.4", + "bigIqHost": "192.0.2.10", "bigIqUsername": "admin", "bigIqPassword": "foofoo", "bigIqPasswordUri": "https://my.passwordscom/bigIq", @@ -436,12 +436,12 @@ describe('system.schema.json', () => { const data = { "class": "License", "licenseType": "licensePool", - "bigIqHost": "1.2.3.4", + "bigIqHost": "192.0.2.10", "bigIqUsername": "admin", "bigIqPassword": "foofoo", "reachable": false, "revokeFrom": { - "bigIqHost": "1.2.3.4", + "bigIqHost": "192.0.2.10", "bigIqUsername": "admin", "bigIqPassword": "foofoo" } @@ -458,7 +458,7 @@ describe('system.schema.json', () => { const data = { "class": "License", "licenseType": "licensePool", - "bigIqHost": "1.2.3.4", + "bigIqHost": "192.0.2.10", "bigIqPassword": "foofoo", "licensePool": "barbar", "reachable": false, @@ -479,7 +479,7 @@ describe('system.schema.json', () => { const data = { "class": "License", "licenseType": "licensePool", - "bigIqHost": "1.2.3.4", + "bigIqHost": "192.0.2.10", "bigIqUsername": "admin", "licensePool": "barbar", "reachable": false, @@ -518,7 +518,7 @@ describe('system.schema.json', () => { const data = { "class": "NTP", "servers": [ - "1.2.3.4", + "192.0.2.10", "FE80:0000:0000:0000:0202:B3FF:FE1E:8329", "0.pool.ntp.org" ], @@ -687,7 +687,7 @@ describe('system.schema.json', () => { it('should validate minimal SnmpTrapDestination', () => { const data = { "class": "SnmpTrapDestination", - "destination": "1.2.3.4", + "destination": "192.0.2.10", "community": "myCommunity" }; assert.ok(validate(data), getErrorString(validate)); @@ -882,7 +882,7 @@ describe('system.schema.json', () => { it('should validate management ip with address and netmask', () => { const data = { class: 'ManagementIp', - address: '1.2.3.4/24' + address: '192.0.2.10/24' }; assert.ok(validate(data), getErrorString(validate)); }); @@ -891,7 +891,7 @@ describe('system.schema.json', () => { describe('invalid', () => { const data = { class: 'ManagementIp', - address: '1.2.3.4' + address: '192.0.2.10' }; assert.strictEqual(validate(data), false, 'Should not accept IP without prefix'); assert(getErrorString().includes('ipWithRequiredPrefix')); @@ -904,8 +904,8 @@ describe('system.schema.json', () => { const data = { class: 'ManagementRoute', remark: 'Example description', - gw: '1.2.3.4', - network: '4.3.2.1', + gw: '192.0.2.0', + network: '192.0.2.50', mtu: 1000 }; assert.ok(validate(data), getErrorString(validate)); @@ -930,7 +930,7 @@ describe('system.schema.json', () => { it('should validate with a non-default network and a type but no gw', () => { const data = { class: 'ManagementRoute', - network: '4.3.2.1/8', + network: '192.0.2.10/8', type: 'interface' }; assert.ok(validate(data), getErrorString(validate)); @@ -950,7 +950,7 @@ describe('system.schema.json', () => { it('should invalidate when only non-default network', () => { const data = { class: 'ManagementRoute', - network: '9.9.9.9' + network: '192.0.2.10' }; assert.strictEqual(validate(data), false, 'Missing required property gw'); assert(getErrorString().includes('should have required property \'.gw\'')); @@ -979,7 +979,7 @@ describe('system.schema.json', () => { it('should invalidate incorrect gw format', () => { const data = { class: 'ManagementRoute', - network: '100.100.200.200', + network: '192.0.2.10', gw: 'theGateway' }; assert.strictEqual(validate(data), false, 'must be ipv4 or ipv6');