diff --git a/CHANGELOG.md b/CHANGELOG.md index bde49d2..686d943 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,23 @@ Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how ### Fixed +--- + +## [1.7.0] - (04-08-2024) + +### Fixed + +- [BUG] Flipper 1.6.0 Service Parsing Error #29 + +### Added + +- [RFE] TMOS/AS3 conversion output #7 +- [RFE] add confObjArray to the view #20 +- [RFE] code actions to provide conversion output #6 +- documentation details about cs/lb-vserver serviceTypes +- documentation logic flow through cs/lb vserver details + - show how everything gets mapped through cs/lb/services/serviceGroups (diagram) + --- ## [1.6.0] - (04-03-2024) diff --git a/README.md b/README.md index 158fca3..9d1b7d8 100644 --- a/README.md +++ b/README.md @@ -166,6 +166,133 @@ Add walking details... Add walking details... +# Mapping + +```mermaid +flowchart TD + A[Incoming request]-->C{CS or LB?} + C -->acv[add cs verser] + acv -->bcsvs[bind cs vserver] + bcsvs-->|"-policyName"|acsp[add cs policy] + acsp-->|"-action"|acsa[add cs action] + acsa-->albvs + + bcsvs-->|"-lbvserver"|albvs + + acsp-->aafp[add appflow policy] + aafp-->aafa[add appflow action] + aafa-->aafc[add appflow collector] + + + C -->albvs[add lb vserver] + albvs-->ssvserver[set ssl verver] + albvs-->blbvs[bind lb vserver] + blbvs-->aservice[add service] + aservice-->aserver[add server] + blbvs-->asg[add serverGroup] + asg-->bsg[bind serviceGroup] + bsg-->aserver + bsg-->albm[add lb monitor] +``` + +## add cs vserver + +https://developer-docs.netscaler.com/en-us/adc-command-reference-int/13/cs/cs-vserver.html#synopsis-9 + +add cs vserver + +### traffic-domain + +Integer value that uniquely identifies the traffic domain in which you want to configure the entity. If you do not specify an ID, the entity becomes part of the default traffic domain, which has an ID of 0. Minimum value: 0 Maximum value: 4094 + +### Possible ServiceTypes/protocols + +NS ServiceType | F5 Profiles | Additional Optional F5 profiles +| :--- | ---: | :---: | +HTTP | TCP/HTTP | +SSL | TCP/HTTP/clientssl | serverssl +TCP | TCP | +FTP | TCP | +RTSP | TCP/RTSP +SSL_TCP | TCP/clientssl | serverssl +UDP | UDP +DNS | UDP | dns +SIP_UDP | UDP | SIP +SIP_TCP | TCP | SIP +SIP_SSL | TCP/clientssl | SIP +ANY | TCP +RADIUS | UDP | RADIUS +RDP | TCP +MYSQL | TCP +MSSQL | TCP +DIAMETER | TCP | Diameter +SSL_DIAMETER | TCP/clientssl | Diameter +DNS_TCP | TCP | DNS +ORACLE | TCP +SMPP | TCP +PROXY | ? +MONGO | ? +MONGO_TLS | TCP/clientssl +MQTT | +MQTT_TLS | TCP/clientssl +HTTP_QUIC | + +## add lb vserver + +https://developer-docs.netscaler.com/en-us/adc-command-reference-int/13/lb/lb-vserver#add-lb-vserver + +add lb vserver + +### Possible ServiceTypes/Protocols + +NS ServiceType | F5 Profiles | Additional Optional F5 profiles +| :--- | ---: | :---: | +HTTP | TCP/HTTP +FTP | TCP +TCP | TCP +UDP | UDP +SSL | TCP/clientssl | serverssl/HTTP? +SSL_BRIDGE | TCP/clientssl | FastL4?/serverssl +SSL_TCP | TCP/clietssl | serverssl +DTLS | UDP/clientssl? +NNTP | TCP +DNS | UDP +DHCPRA | TCP | dhcpv4 +ANY | tcp +SIP_UDP | +SIP_TCP | +SIP_SSL | +DNS_TCP | +RTSP | +PUSH | +SSL_PUSH | +RADIUS | +RDP | +MYSQL | +MSSQL | +DIAMETER | +SSL_DIAMETER | +TFTP | +ORACLE | +SMPP | +SYSLOGTCP | +SYSLOGUDP | +FIX | +SSL_FIX | +PROXY | +USER_TCP | +USER_SSL_TCP | +QUIC | +IPFIX | +LOGSTREAM | +MONGO | +MONGO_TLS | +MQTT | +MQTT_TLS | +QUIC_BRIDGE | +HTTP_QUIC | + + # Notes - All of the 'add' operations need to happen before the 'bind' operations diff --git a/f5_flipper_test.tgz b/f5_flipper_test.tgz index 1d20c11..af81cc9 100644 Binary files a/f5_flipper_test.tgz and b/f5_flipper_test.tgz differ diff --git a/images/mermaid-diagram-2024-04-08-151541.svg b/images/mermaid-diagram-2024-04-08-151541.svg new file mode 100644 index 0000000..ef114c7 --- /dev/null +++ b/images/mermaid-diagram-2024-04-08-151541.svg @@ -0,0 +1 @@ +
-policyName
-action
-lbvserver
Incoming request
CS or LB?
add cs verser
bind cs vserver
add cs policy
add cs action
add lb vserver
add appflow policy
add appflow action
add appflow collector
set ssl verver
bind lb vserver
add service
add server
add serverGroup
bind serviceGroup
add lb monitor
\ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 895f106..ef7ae21 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscode-f5-flipper", - "version": "1.6.0", + "version": "1.7.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-f5-flipper", - "version": "1.6.0", + "version": "1.7.0", "license": "Apache-2.0", "dependencies": { "@f5devcentral/f5-fast-core": "^0.23.0", @@ -23,15 +23,15 @@ "@types/assert": "^1.5.10", "@types/js-yaml": "^4.0.9", "@types/mocha": "^10.0.6", - "@types/node": "^20.12.3", + "@types/node": "^20.12.4", "@types/object-path": "^0.11.1", "@types/tar-stream": "^3.1.3", "@types/uuid": "^9.0.8", "@types/vscode": "^1.63.0", - "@typescript-eslint/eslint-plugin": "^6.2.1", - "@typescript-eslint/parser": "^6.2.1", + "@typescript-eslint/eslint-plugin": "^7.5.0", + "@typescript-eslint/parser": "^7.5.0", "assert": "^2.1.0", - "eslint": "^8.46.0", + "eslint": "^8.57.0", "mocha": "^10.4.0", "nyc": "^15.1.0", "ts-node": "^10.4.0", @@ -517,18 +517,18 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz", - "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -549,9 +549,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz", - "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -644,13 +644,13 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -671,9 +671,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, "node_modules/@isaacs/cliui": { @@ -1017,9 +1017,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.3.tgz", - "integrity": "sha512-sD+ia2ubTeWrOu+YMF+MTAB7E+O7qsMqAbMfW7DG3K1URwhZ5hN1pLlRVGbf4wDFzSfikL05M17EyorS86jShw==", + "version": "20.12.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.4.tgz", + "integrity": "sha512-E+Fa9z3wSQpzgYQdYmme5X3OTuejnnTx88A6p6vkkJosR3KBz+HpE3kqNm98VE6cfLFcISx7zW7MsJkH6KwbTw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -1032,9 +1032,9 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "node_modules/@types/tar-stream": { @@ -1059,34 +1059,33 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.2.1.tgz", - "integrity": "sha512-iZVM/ALid9kO0+I81pnp1xmYiFyqibAHzrqX4q5YvvVEyJqY+e6rfTXSCsc2jUxGNqJqTfFSSij/NFkZBiBzLw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.5.0.tgz", + "integrity": "sha512-HpqNTH8Du34nLxbKgVMGljZMG0rJd2O9ecvr2QLYp+7512ty1j42KnsFwspPXg1Vh8an9YImf6CokUBltisZFQ==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.2.1", - "@typescript-eslint/type-utils": "6.2.1", - "@typescript-eslint/utils": "6.2.1", - "@typescript-eslint/visitor-keys": "6.2.1", + "@typescript-eslint/scope-manager": "7.5.0", + "@typescript-eslint/type-utils": "7.5.0", + "@typescript-eslint/utils": "7.5.0", + "@typescript-eslint/visitor-keys": "7.5.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", - "natural-compare-lite": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -1095,26 +1094,26 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.2.1.tgz", - "integrity": "sha512-Ld+uL1kYFU8e6btqBFpsHkwQ35rw30IWpdQxgOqOh4NfxSDH6uCkah1ks8R/RgQqI5hHPXMaLy9fbFseIe+dIg==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.5.0.tgz", + "integrity": "sha512-cj+XGhNujfD2/wzR1tabNsidnYRaFfEkcULdcIyVBYcXjBvBKOes+mpMBP7hMpOyk+gBcfXsrg4NBGAStQyxjQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.2.1", - "@typescript-eslint/types": "6.2.1", - "@typescript-eslint/typescript-estree": "6.2.1", - "@typescript-eslint/visitor-keys": "6.2.1", + "@typescript-eslint/scope-manager": "7.5.0", + "@typescript-eslint/types": "7.5.0", + "@typescript-eslint/typescript-estree": "7.5.0", + "@typescript-eslint/visitor-keys": "7.5.0", "debug": "^4.3.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -1123,16 +1122,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.2.1.tgz", - "integrity": "sha512-UCqBF9WFqv64xNsIEPfBtenbfodPXsJ3nPAr55mGPkQIkiQvgoWNo+astj9ZUfJfVKiYgAZDMnM6dIpsxUMp3Q==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.5.0.tgz", + "integrity": "sha512-Z1r7uJY0MDeUlql9XJ6kRVgk/sP11sr3HKXn268HZyqL7i4cEfrdFuSSY/0tUqT37l5zT0tJOsuDP16kio85iA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.2.1", - "@typescript-eslint/visitor-keys": "6.2.1" + "@typescript-eslint/types": "7.5.0", + "@typescript-eslint/visitor-keys": "7.5.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1140,25 +1139,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.2.1.tgz", - "integrity": "sha512-fTfCgomBMIgu2Dh2Or3gMYgoNAnQm3RLtRp+jP7A8fY+LJ2+9PNpi5p6QB5C4RSP+U3cjI0vDlI3mspAkpPVbQ==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.5.0.tgz", + "integrity": "sha512-A021Rj33+G8mx2Dqh0nMO9GyjjIBK3MqgVgZ2qlKf6CJy51wY/lkkFqq3TqqnH34XyAHUkq27IjlUkWlQRpLHw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.2.1", - "@typescript-eslint/utils": "6.2.1", + "@typescript-eslint/typescript-estree": "7.5.0", + "@typescript-eslint/utils": "7.5.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -1167,12 +1166,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.2.1.tgz", - "integrity": "sha512-528bGcoelrpw+sETlyM91k51Arl2ajbNT9L4JwoXE2dvRe1yd8Q64E4OL7vHYw31mlnVsf+BeeLyAZUEQtqahQ==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.5.0.tgz", + "integrity": "sha512-tv5B4IHeAdhR7uS4+bf8Ov3k793VEVHd45viRRkehIUZxm0WF82VPiLgHzA/Xl4TGPg1ZD49vfxBKFPecD5/mg==", "dev": true, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1180,21 +1179,22 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.2.1.tgz", - "integrity": "sha512-G+UJeQx9AKBHRQBpmvr8T/3K5bJa485eu+4tQBxFq0KoT22+jJyzo1B50JDT9QdC1DEmWQfdKsa8ybiNWYsi0Q==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.5.0.tgz", + "integrity": "sha512-YklQQfe0Rv2PZEueLTUffiQGKQneiIEKKnfIqPIOxgM9lKSZFCjT5Ad4VqRKj/U4+kQE3fa8YQpskViL7WjdPQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.2.1", - "@typescript-eslint/visitor-keys": "6.2.1", + "@typescript-eslint/types": "7.5.0", + "@typescript-eslint/visitor-keys": "7.5.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", + "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1206,48 +1206,78 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/utils": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.2.1.tgz", - "integrity": "sha512-eBIXQeupYmxVB6S7x+B9SdBeB6qIdXKjgQBge2J+Ouv8h9Cxm5dHf/gfAZA6dkMaag+03HdbVInuXMmqFB/lKQ==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.5.0.tgz", + "integrity": "sha512-3vZl9u0R+/FLQcpy2EHyRGNqAS/ofJ3Ji8aebilfJe+fobK8+LbIFmrHciLVDxjDoONmufDcnVSF38KwMEOjzw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.2.1", - "@typescript-eslint/types": "6.2.1", - "@typescript-eslint/typescript-estree": "6.2.1", + "@typescript-eslint/scope-manager": "7.5.0", + "@typescript-eslint/types": "7.5.0", + "@typescript-eslint/typescript-estree": "7.5.0", "semver": "^7.5.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.2.1.tgz", - "integrity": "sha512-iTN6w3k2JEZ7cyVdZJTVJx2Lv7t6zFA8DCrJEHD2mwfc16AEvvBWVhbFh34XyG2NORCd0viIgQY1+u7kPI0WpA==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.5.0.tgz", + "integrity": "sha512-mcuHM/QircmA6O7fy6nn2w/3ditQkj+SgtOc8DW3uQ10Yfj42amm2i+6F2K4YAOPNNTmE6iM1ynM6lrSwdendA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.2.1", + "@typescript-eslint/types": "7.5.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", @@ -1945,18 +1975,19 @@ } }, "node_modules/eslint": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", - "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.1", - "@eslint/js": "^8.46.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -1964,7 +1995,7 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.2", + "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", @@ -2015,9 +2046,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", - "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2069,9 +2100,9 @@ } }, "node_modules/esquery": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", - "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -2129,9 +2160,9 @@ "integrity": "sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw==" }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -2156,9 +2187,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -2231,12 +2262,13 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { @@ -2244,9 +2276,9 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/follow-redirects": { @@ -2514,9 +2546,9 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2712,9 +2744,9 @@ "dev": true }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -3143,6 +3175,12 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -3174,6 +3212,15 @@ "node": ">=10.0" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -3527,12 +3574,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -4254,9 +4295,9 @@ ] }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4602,12 +4643,12 @@ } }, "node_modules/ts-api-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", - "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, "engines": { - "node": ">=16.13.0" + "node": ">=16" }, "peerDependencies": { "typescript": ">=4.2.0" @@ -5369,15 +5410,15 @@ } }, "@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true }, "@eslint/eslintrc": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz", - "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -5392,9 +5433,9 @@ } }, "@eslint/js": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz", - "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true }, "@f5devcentral/atg-shared-utilities": { @@ -5474,13 +5515,13 @@ } }, "@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" } }, @@ -5491,9 +5532,9 @@ "dev": true }, "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, "@isaacs/cliui": { @@ -5760,9 +5801,9 @@ "dev": true }, "@types/node": { - "version": "20.12.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.3.tgz", - "integrity": "sha512-sD+ia2ubTeWrOu+YMF+MTAB7E+O7qsMqAbMfW7DG3K1URwhZ5hN1pLlRVGbf4wDFzSfikL05M17EyorS86jShw==", + "version": "20.12.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.4.tgz", + "integrity": "sha512-E+Fa9z3wSQpzgYQdYmme5X3OTuejnnTx88A6p6vkkJosR3KBz+HpE3kqNm98VE6cfLFcISx7zW7MsJkH6KwbTw==", "dev": true, "requires": { "undici-types": "~5.26.4" @@ -5775,9 +5816,9 @@ "dev": true }, "@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "@types/tar-stream": { @@ -5802,106 +5843,132 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.2.1.tgz", - "integrity": "sha512-iZVM/ALid9kO0+I81pnp1xmYiFyqibAHzrqX4q5YvvVEyJqY+e6rfTXSCsc2jUxGNqJqTfFSSij/NFkZBiBzLw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.5.0.tgz", + "integrity": "sha512-HpqNTH8Du34nLxbKgVMGljZMG0rJd2O9ecvr2QLYp+7512ty1j42KnsFwspPXg1Vh8an9YImf6CokUBltisZFQ==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.2.1", - "@typescript-eslint/type-utils": "6.2.1", - "@typescript-eslint/utils": "6.2.1", - "@typescript-eslint/visitor-keys": "6.2.1", + "@typescript-eslint/scope-manager": "7.5.0", + "@typescript-eslint/type-utils": "7.5.0", + "@typescript-eslint/utils": "7.5.0", + "@typescript-eslint/visitor-keys": "7.5.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", - "natural-compare-lite": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/parser": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.2.1.tgz", - "integrity": "sha512-Ld+uL1kYFU8e6btqBFpsHkwQ35rw30IWpdQxgOqOh4NfxSDH6uCkah1ks8R/RgQqI5hHPXMaLy9fbFseIe+dIg==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.5.0.tgz", + "integrity": "sha512-cj+XGhNujfD2/wzR1tabNsidnYRaFfEkcULdcIyVBYcXjBvBKOes+mpMBP7hMpOyk+gBcfXsrg4NBGAStQyxjQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "6.2.1", - "@typescript-eslint/types": "6.2.1", - "@typescript-eslint/typescript-estree": "6.2.1", - "@typescript-eslint/visitor-keys": "6.2.1", + "@typescript-eslint/scope-manager": "7.5.0", + "@typescript-eslint/types": "7.5.0", + "@typescript-eslint/typescript-estree": "7.5.0", + "@typescript-eslint/visitor-keys": "7.5.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.2.1.tgz", - "integrity": "sha512-UCqBF9WFqv64xNsIEPfBtenbfodPXsJ3nPAr55mGPkQIkiQvgoWNo+astj9ZUfJfVKiYgAZDMnM6dIpsxUMp3Q==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.5.0.tgz", + "integrity": "sha512-Z1r7uJY0MDeUlql9XJ6kRVgk/sP11sr3HKXn268HZyqL7i4cEfrdFuSSY/0tUqT37l5zT0tJOsuDP16kio85iA==", "dev": true, "requires": { - "@typescript-eslint/types": "6.2.1", - "@typescript-eslint/visitor-keys": "6.2.1" + "@typescript-eslint/types": "7.5.0", + "@typescript-eslint/visitor-keys": "7.5.0" } }, "@typescript-eslint/type-utils": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.2.1.tgz", - "integrity": "sha512-fTfCgomBMIgu2Dh2Or3gMYgoNAnQm3RLtRp+jP7A8fY+LJ2+9PNpi5p6QB5C4RSP+U3cjI0vDlI3mspAkpPVbQ==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.5.0.tgz", + "integrity": "sha512-A021Rj33+G8mx2Dqh0nMO9GyjjIBK3MqgVgZ2qlKf6CJy51wY/lkkFqq3TqqnH34XyAHUkq27IjlUkWlQRpLHw==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "6.2.1", - "@typescript-eslint/utils": "6.2.1", + "@typescript-eslint/typescript-estree": "7.5.0", + "@typescript-eslint/utils": "7.5.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.2.1.tgz", - "integrity": "sha512-528bGcoelrpw+sETlyM91k51Arl2ajbNT9L4JwoXE2dvRe1yd8Q64E4OL7vHYw31mlnVsf+BeeLyAZUEQtqahQ==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.5.0.tgz", + "integrity": "sha512-tv5B4IHeAdhR7uS4+bf8Ov3k793VEVHd45viRRkehIUZxm0WF82VPiLgHzA/Xl4TGPg1ZD49vfxBKFPecD5/mg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.2.1.tgz", - "integrity": "sha512-G+UJeQx9AKBHRQBpmvr8T/3K5bJa485eu+4tQBxFq0KoT22+jJyzo1B50JDT9QdC1DEmWQfdKsa8ybiNWYsi0Q==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.5.0.tgz", + "integrity": "sha512-YklQQfe0Rv2PZEueLTUffiQGKQneiIEKKnfIqPIOxgM9lKSZFCjT5Ad4VqRKj/U4+kQE3fa8YQpskViL7WjdPQ==", "dev": true, "requires": { - "@typescript-eslint/types": "6.2.1", - "@typescript-eslint/visitor-keys": "6.2.1", + "@typescript-eslint/types": "7.5.0", + "@typescript-eslint/visitor-keys": "7.5.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", + "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "@typescript-eslint/utils": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.2.1.tgz", - "integrity": "sha512-eBIXQeupYmxVB6S7x+B9SdBeB6qIdXKjgQBge2J+Ouv8h9Cxm5dHf/gfAZA6dkMaag+03HdbVInuXMmqFB/lKQ==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.5.0.tgz", + "integrity": "sha512-3vZl9u0R+/FLQcpy2EHyRGNqAS/ofJ3Ji8aebilfJe+fobK8+LbIFmrHciLVDxjDoONmufDcnVSF38KwMEOjzw==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.2.1", - "@typescript-eslint/types": "6.2.1", - "@typescript-eslint/typescript-estree": "6.2.1", + "@typescript-eslint/scope-manager": "7.5.0", + "@typescript-eslint/types": "7.5.0", + "@typescript-eslint/typescript-estree": "7.5.0", "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.2.1.tgz", - "integrity": "sha512-iTN6w3k2JEZ7cyVdZJTVJx2Lv7t6zFA8DCrJEHD2mwfc16AEvvBWVhbFh34XyG2NORCd0viIgQY1+u7kPI0WpA==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.5.0.tgz", + "integrity": "sha512-mcuHM/QircmA6O7fy6nn2w/3ditQkj+SgtOc8DW3uQ10Yfj42amm2i+6F2K4YAOPNNTmE6iM1ynM6lrSwdendA==", "dev": true, "requires": { - "@typescript-eslint/types": "6.2.1", + "@typescript-eslint/types": "7.5.0", "eslint-visitor-keys": "^3.4.1" } }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", @@ -6407,18 +6474,19 @@ "dev": true }, "eslint": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", - "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.1", - "@eslint/js": "^8.46.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -6426,7 +6494,7 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.2", + "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", @@ -6473,9 +6541,9 @@ } }, "eslint-visitor-keys": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", - "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "espree": { @@ -6496,9 +6564,9 @@ "dev": true }, "esquery": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", - "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -6544,9 +6612,9 @@ "integrity": "sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw==" }, "fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -6568,9 +6636,9 @@ "dev": true }, "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -6622,19 +6690,20 @@ "dev": true }, "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "requires": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "follow-redirects": { @@ -6808,9 +6877,9 @@ } }, "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -6947,9 +7016,9 @@ "dev": true }, "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true }, "import-fresh": { @@ -7253,6 +7322,12 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -7275,6 +7350,15 @@ "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-4.0.0.tgz", "integrity": "sha512-e0Jtg4KAzDJKKwzbLaUtinCn0RZseWBVRTRGihSpvFlM3wTR7ExSp+PTdeTsDrLNJUe7L7JYJe8mblHX5SCT6A==" }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -7546,12 +7630,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -8067,9 +8145,9 @@ "dev": true }, "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -8346,9 +8424,9 @@ } }, "ts-api-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", - "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, "requires": {} }, diff --git a/package.json b/package.json index 092e5cb..c2ce1fa 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "F5 Flipper", "description": "Breaking down Citrix NetScaler ADC configs", "publisher": "F5DevCentral", - "version": "1.6.0", + "version": "1.7.0", "keywords": [ "F5", "F5Networks", @@ -186,15 +186,15 @@ "@types/assert": "^1.5.10", "@types/js-yaml": "^4.0.9", "@types/mocha": "^10.0.6", - "@types/node": "^20.12.3", + "@types/node": "^20.12.4", "@types/object-path": "^0.11.1", "@types/tar-stream": "^3.1.3", "@types/uuid": "^9.0.8", "@types/vscode": "^1.63.0", - "@typescript-eslint/eslint-plugin": "^6.2.1", - "@typescript-eslint/parser": "^6.2.1", + "@typescript-eslint/eslint-plugin": "^7.5.0", + "@typescript-eslint/parser": "^7.5.0", "assert": "^2.1.0", - "eslint": "^8.46.0", + "eslint": "^8.57.0", "mocha": "^10.4.0", "nyc": "^15.1.0", "ts-node": "^10.4.0", diff --git a/src/CitrixADC.ts b/src/CitrixADC.ts index 27838cf..ba7e401 100644 --- a/src/CitrixADC.ts +++ b/src/CitrixADC.ts @@ -167,7 +167,7 @@ export default class ADC extends EventEmitter { // instantiate regex tree const rex = new RegExTree(); - + // get adc version [this.adcVersion, this.adcBuild] = this.getAdcVersion(x.content, rex.adcVersionBaseReg); @@ -240,15 +240,17 @@ export default class ADC extends EventEmitter { // dig each 'add cs vserver' await digCsVservers(this.configObjectArry, this.rx) .then(csApps => { + // add the cs apps to the main app array apps.push(...csApps as AdcApp[]) }) .catch(err => { logger.error(err) }); - - // dig each 'add lb vserver', but check for existing? - await digLbVserver(this.configObjectArry, this.rx) + + // dig each 'add lb vserver', but check for existing? + await digLbVserver(this.configObjectArry, this.rx) .then(lbApps => { + // add the lb apps to the main app array apps.push(...lbApps as AdcApp[]) }) .catch(err => { @@ -265,7 +267,14 @@ export default class ADC extends EventEmitter { }); // now that all apps have been abstracted, go through and find cs pointing to lb's - await digCStoLBreferences(apps) + digCStoLBreferences(apps) + + // loop through each app and remove any duplicate NS config lines + for await (const app of apps) { + app.lines = app.lines.filter((value, index, array) => array.indexOf(value) === index) + // resort the app object properties for better human reading + sortAdcApp(app) + } // capture app abstraction time @@ -317,7 +326,7 @@ export default class ADC extends EventEmitter { * @param app * @returns */ -export function sortAdcApp(app: AdcApp): AdcApp { +export function sortAdcApp(app: AdcApp) { const sorted: AdcApp = { name: app.name, @@ -337,5 +346,5 @@ export function sortAdcApp(app: AdcApp): AdcApp { // if(app.csPolicyActions) { // } - return sorted; + return app = sorted; } \ No newline at end of file diff --git a/src/digCStoLbRefs.ts b/src/digCStoLbRefs.ts index f53f071..583c909 100644 --- a/src/digCStoLbRefs.ts +++ b/src/digCStoLbRefs.ts @@ -5,13 +5,13 @@ import { logger } from "./logger"; import { AdcApp, CsPolicyActions, PolicyRef } from "./models"; -export async function digCStoLBreferences(apps: AdcApp[]) { +export function digCStoLBreferences(apps: AdcApp[]) { logger.info('digging lb app references from cs servers') // loop through all the apps and add -targetLBVserver and -lbvserver reference details - apps.forEach((app: AdcApp) => { + for (const app of apps) { // app.bindings.'-policyName'.forEach( x => x.'-targetLBVserver' ) /** @@ -33,7 +33,7 @@ export async function digCStoLBreferences(apps: AdcApp[]) { app.apps = []; } - app.bindings["-policyName"].forEach((p: PolicyRef) => { + for ( const p of app.bindings["-policyName"]) { if (typeof p === 'string') { @@ -87,13 +87,13 @@ export async function digCStoLBreferences(apps: AdcApp[]) { } - }) + } } if (app?.csPolicyActions) { // dig cs policy action for lb reference - app.csPolicyActions.forEach((cpa: CsPolicyActions) => { + for (const cpa of app.csPolicyActions) { if(cpa["-targetLBVserver"]) { @@ -119,7 +119,7 @@ export async function digCStoLBreferences(apps: AdcApp[]) { logger.error(`policy action with -targetLBVserver ${x} referenced by CS ${app.name} not found`) } } - }) + } } // app.bindings.'-lbvserver'.forEach( (x: string) => ) @@ -130,7 +130,7 @@ export async function digCStoLBreferences(apps: AdcApp[]) { } // this should be a list of strings/names // todo: loop through list and add lb vservers - app.bindings["-lbvserver"].forEach((e: string) => { + for (const e of app.bindings["-lbvserver"]) { const a = apps.filter((b: AdcApp) => b.name === e)[0] @@ -152,13 +152,13 @@ export async function digCStoLBreferences(apps: AdcApp[]) { } - }) + } } - }) + } // nothing to return since we just added details to existing apps return; diff --git a/src/digCsVserver.ts b/src/digCsVserver.ts index 3c6f908..ab4b853 100644 --- a/src/digCsVserver.ts +++ b/src/digCsVserver.ts @@ -19,6 +19,7 @@ export async function digCsVservers(coa: AdcConfObj, rx: AdcRegExTree) { const apps: AdcApp[] = []; + // if there are no cs vservers, then return the empty array if(!coa.add?.cs?.vserver) return apps; await Promise.all(coa.add?.cs?.vserver?.map(async vServ => { @@ -64,18 +65,20 @@ export async function digCsVservers(coa: AdcConfObj, rx: AdcRegExTree) { if (opts['-policyName']) { + // points to "add cs policy" app.bindings["-policyName"].push(opts as unknown as PolicyRef) } else if (opts['-lbvserver']) { + // points to "add lb vserver" app.bindings["-lbvserver"].push(opts['-lbvserver']) } }) await digAddCsPolicys(app, coa, rx); - await digSslBinding(app, coa, rx); - apps.push(sortAdcApp(app)) + digSslBinding(app, coa, rx); + apps.push(app) })) return apps; diff --git a/src/digLbVserver.ts b/src/digLbVserver.ts index 2fa283c..f3ab83e 100644 --- a/src/digLbVserver.ts +++ b/src/digLbVserver.ts @@ -31,9 +31,10 @@ export async function digLbVserver(coa: AdcConfObj, rx: AdcRegExTree) { const apps: AdcApp[] = []; + // if there are no add lb vservers, then return the empty array if (!coa.add?.lb?.vserver) return apps; - await Promise.all(coa.add?.lb?.vserver?.map(vServ => { + await Promise.all(coa.add?.lb?.vserver?.map(async vServ => { const parent = 'add lb vserver'; const originalString = 'add lb vserver ' + vServ; const rxMatch = vServ.match(rx.parents[parent]); @@ -55,8 +56,8 @@ export async function digLbVserver(coa: AdcConfObj, rx: AdcRegExTree) { } // start with 'bind lb vserver' - coa.bind?.lb?.vserver?.filter(el => el.startsWith(app.name)) - .forEach(async x => { + const bindLbVservers = coa.bind?.lb?.vserver?.filter(el => el.startsWith(app.name)); + for await (const x of bindLbVservers) { const parent = 'bind lb vserver'; const originalString = parent + ' ' + x; app.lines.push(originalString); @@ -76,7 +77,8 @@ export async function digLbVserver(coa: AdcConfObj, rx: AdcRegExTree) { // app.bindings.service.push(rxMatch.groups.service) // dig service details -> do we have a service with this name? - const serviceD = coa.add?.service?.filter(s => serviceName)[0] + // there should only be one "add service" with this name since we are looking in this specific "bind lb vserver" + const serviceD = coa.add?.service?.filter(s => s.startsWith(serviceName))[0] if (serviceD) { // this should only ever find one const parent = 'add service'; @@ -138,6 +140,7 @@ export async function digLbVserver(coa: AdcConfObj, rx: AdcRegExTree) { app.bindings['-policyName'] = []; } + // this reference is for "add rewrite policy" const policy = await digPolicy(pName, app, coa, rx) app.bindings['-policyName'].push(opts as unknown as PolicyRef) } @@ -145,11 +148,11 @@ export async function digLbVserver(coa: AdcConfObj, rx: AdcRegExTree) { } - }) + }; - apps.push(sortAdcApp(app)) + apps.push(app) })) return apps; @@ -292,27 +295,28 @@ export async function digServiceGroup(serviceName: string, app: AdcApp, obj: Adc export async function digServer(serverName: string, app: AdcApp, obj: AdcConfObj, rx: AdcRegExTree): Promise { let dest = undefined; - obj?.add?.server?.filter(s => s.startsWith(serverName)) - .forEach(x => { + const server = obj?.add?.server?.filter(s => s.startsWith(serverName))[0] - const parent = 'add server'; - const originalString = parent + ' ' + x; - app.lines.push(originalString) - const rxMatch = x.match(rx.parents[parent]) + if (server) { - if (rxMatch) { - dest = rxMatch.groups?.dest; - } else { - /* istanbul ignore next */ - logger.error(`regex "${rx.parents[parent]}" - failed for line "${originalString}"`); - } - }) + const parent = 'add server'; + const originalString = parent + ' ' + server; + app.lines.push(originalString) + const rxMatch = server.match(rx.parents[parent]) + + if (rxMatch) { + dest = rxMatch.groups?.dest; + } else { + /* istanbul ignore next */ + logger.error(`regex "${rx.parents[parent]}" - failed for line "${originalString}"`); + } + } return dest; } -export async function digSslBinding(app: AdcApp, obj: AdcConfObj, rx: AdcRegExTree) { +export function digSslBinding(app: AdcApp, obj: AdcConfObj, rx: AdcRegExTree) { const sslBindObj = [] @@ -321,11 +325,8 @@ export async function digSslBinding(app: AdcApp, obj: AdcConfObj, rx: AdcRegExTr const appSslVservers = obj.bind?.ssl?.vserver?.filter(s => s.startsWith(appName)) // check ssl bindings - // for await (const x of obj.bind?.ssl?.vserver) { - - // if (x.startsWith(app.name)) { if (appSslVservers.length > 0) { - for await (const x of appSslVservers) { + for (const x of appSslVservers) { const parent = 'bind ssl vserver'; @@ -337,23 +338,24 @@ export async function digSslBinding(app: AdcApp, obj: AdcConfObj, rx: AdcRegExTr // only parse certkeyName details, pass on all the ciphers and eccCurveNames if (opts['-certkeyName']) { const certKeyName = opts['-certkeyName'] - obj.add?.ssl?.certKey.filter(el => el.startsWith(certKeyName)) - .forEach(x => { + + for (const el of obj.add?.ssl?.certKey) { + + if (el.startsWith(certKeyName)) { const parent = 'add ssl certKey'; - const originalString = parent + ' ' + x; + const originalString = parent + ' ' + el; app.lines.push(originalString); - const rxMatch = x.match(rx.parents[parent]); + const rxMatch = el.match(rx.parents[parent]); const opts2 = parseNsOptions(rxMatch.groups.opts, rx) // deepmergeInto(opts2, opts2) opts2.profileName = certKeyName; sslBindObj.push(opts2) - }) + } + } } } - // deepmergeInto(sslBindObj, opts) } - // } if (sslBindObj.length > 0) { app.bindings.certs = sslBindObj; diff --git a/src/extension.ts b/src/extension.ts index 907a4ef..cf25721 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -92,8 +92,8 @@ export async function activateInternal(context: ExtensionContext) { ); /** - * this command is exposed via right click in editor so user does not have to connect to F5 - * this flow assumes the file is local + * + * */ context.subscriptions.push(commands.registerCommand('f5-flipper.cfgExplore', async (item) => { @@ -158,6 +158,24 @@ export async function activateInternal(context: ExtensionContext) { })); + context.subscriptions.push(commands.registerCommand('f5-flipper.cfgExplore-show', async (text) => { + ext.telemetry.capture({ command: 'f5-flipper.cfgExplore-show' }); + const content = JSON.stringify( text, undefined, 4); + + // var vDoc: Uri = Uri.parse("untitled:" + 'CitrixADC_Report2.yml'); + return await workspace.openTextDocument({ language: 'json', content}) + .then(async (doc) => { + await window.showTextDocument(doc); + // this.documents.push(doc); // add the document to this class doc list + + // fold all the json down + await commands.executeCommand("editor.foldAll"); + // expand the first two levels of json to better visibility + await commands.executeCommand("editor.unfold", { levels: 2 }); + return doc; + }); + })); + context.subscriptions.push(commands.registerCommand('f5-flipper.cfgExploreClear', async (text) => { ext.telemetry.capture({ command: 'f5-flipper.cfgExploreClear' }); ext.nsCfgProvider.clear(); diff --git a/src/nsCfgViewProvider.ts b/src/nsCfgViewProvider.ts index 7107660..380632f 100644 --- a/src/nsCfgViewProvider.ts +++ b/src/nsCfgViewProvider.ts @@ -473,6 +473,10 @@ export class NsCfgProvider implements TreeDataProvider { // todo: possibly move all the fast template stuff to a separate view treeItems.push(new NsCfgApp('FAST Templates', 'Conversion Templates', '', 'fastHeader', '', TreeItemCollapsibleState.Collapsed)); + // display ns config as json object + treeItems.push(new NsCfgApp('JSON', 'Parent NS.Conf objects as JSON', '', '', '', TreeItemCollapsibleState.None, + { command: 'f5-flipper.cfgExplore-show', title: '', arguments: [this.adc.configObjectArry] })); + } return Promise.resolve(treeItems); } diff --git a/src/regex.ts b/src/regex.ts index f7d528c..61f3869 100644 --- a/src/regex.ts +++ b/src/regex.ts @@ -74,8 +74,8 @@ export class RegExTree { 'add cs action': /(?\S+) (?[\S ]+)/, 'add cs policy': /(?\S+) (?[\S ]+)/, 'add gslb vserver': /(?("[\S ]+"|[\S]+)) (?\S+) (?[\S ]+)/, - 'add gslb service': /(?\S+) (?\S+) (?\S+) (?(\d+|\*)) (?[\S ]+)/, - 'add gslb site': /(?\S+) (?\S+) (?[\S ]+)/, + 'add gslb service': /(?("[\S ]+"|[\S]+)) (?\S+) (?\S+) (?(\d+|\*)) (?[\S ]+)/, + 'add gslb site': /(?("[\S ]+"|[\S]+)) (?\S+) (?[\S ]+)/, 'add rewrite action': /(?\S+) (?[\S ]+)/, 'add rewrite policy': /(?\S+) (?[\S ]+)/, 'add appflow policy': /(?\S+) (?[\S]+) (?[\S]+)/, @@ -88,11 +88,11 @@ export class RegExTree { 'set ns hostName': /(?[\S ]+)/, 'set gslb vserver': /(?\S+) (?[\S ]+)/, 'bind service': /(?[\S ]+)/, - 'bind serviceGroup': /(?\S+) ((?\S+ (\d+|\*))|(?-monitorName \S+)|(?[\S ]+))/, - 'bind lb vserver': /(?\S+) ((?-[\S ]+)|(?[\S]+))/, - 'bind cs vserver': /(?\S+) (?[\S ]+)/, - 'bind ssl vserver': /(?\S+) (?[\S ]+)/, - 'bind gslb vserver': /(?\S+) (?[\S ]+)/, + 'bind serviceGroup': /(?("[\S ]+"|[\S]+)) ((?\S+ (\d+|\*))|(?-monitorName \S+)|(?[\S ]+))/, + 'bind lb vserver': /(?("[\S ]+"|[\S]+)) ((?-[\S ]+)|(?[\S]+))/, + 'bind cs vserver': /(?("[\S ]+"|[\S]+)) (?[\S ]+)/, + 'bind ssl vserver': /(?("[\S ]+"|[\S]+)) (?[\S ]+)/, + 'bind gslb vserver': /(?("[\S ]+"|[\S]+)) (?[\S ]+)/, } } diff --git a/templates/as3/f5.json b/templates/as3/f5.json new file mode 100755 index 0000000..097981b --- /dev/null +++ b/templates/as3/f5.json @@ -0,0 +1,92 @@ +{ + "$schema": "http://json-schema.org/draft-07/hyper-schema", + "definitions": { + "bigip_name": { + "type": "string", + "minLength": 1, + "maxLength": 255, + "pattern": "^[A-Za-z][0-9A-Za-z_.-]*$" + }, + "bigip_path": { + "type": "string", + "minLength": 1, + "pattern": "^\\x2f[^\\x00-\\x19\\x22#'*<>?\\x5b-\\x5d\\x7b-\\x7d\\x7f]+$", + "maxLength": 255 + }, + "ipv4": { + "type": "string", + "pattern": "^(((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]|2\\d|1\\d|\\d))?$" + }, + "ipv4_ipv6": { + "type": "string", + "oneOf": [ + { + "title": "IPv4 Address", + "pattern": "^(((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]|2\\d|1\\d|\\d))?$" + }, + { + "title": "IPv6 Address", + "pattern": "^(::(([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))?$" + } + ], + "default": "10.1.1.1" + }, + "ipv4_ipv6_array": { + "type": "array", + "uniqueItems": true, + "default": ["10.0.0.1"], + "items": { + "$ref": "#/definitions/ipv4_ipv6", + "default": "10.0.0.2" + } + }, + "port": { + "type": "integer", + "minimum": 0, + "maximum": 65535 + }, + "persistence": { + "type": "string", + "enum": [ + "cookie", + "destination-address", + "msrdp", + "source-address", + "tls-session-id" + ] + }, + "topology": { + "type": "string", + "enum": [ + "lan", + "wan", + "mobile" + ] + }, + "load_balancing_mode": { + "type": "string", + "default": "least-connections-member", + "enum": [ + "dynamic-ratio-member", + "dynamic-ratio-node", + "fastest-app-response", + "fastest-node", + "least-connections-member", + "least-connections-node", + "least-sessions", + "observed-member", + "observed-node", + "predictive-member", + "predictive-node", + "ratio-least-connections-member", + "ratio-least-connections-node", + "ratio-member", + "ratio-node", + "ratio-session", + "round-robin", + "weighted-least-connections-member", + "weighted-least-connections-node" + ] + } + } +} diff --git a/templates/as3/http.yaml b/templates/as3/http.yaml new file mode 100644 index 0000000..f5c76cf --- /dev/null +++ b/templates/as3/http.yaml @@ -0,0 +1,86 @@ +title: Flipper -> AS3 HTTP Application Template +description: This template aims to provide a jumping point for taking an NS app config and converting it to AS3. +contentType: application/json +definitions: + tenant_name: + title: Tenant Name + description: The *tenant* is the high-level grouping in an AS3 declaration. FAST deploys all configuration for a given tenant in a BIG-IP partition of the same name. + type: string + minLength: 1 + maxLength: 255 + pattern: ^[A-Za-z][0-9A-Za-z_.-]*$ + immutable: true + app_name: + title: Application Name + description: The *application* is the low-level grouping in an AS3 declaration. FAST deploys all configuration for a given application in a BIG-IP folder within the tenant partition. + type: string + minLength: 1 + maxLength: 255 + pattern: ^[A-Za-z][0-9A-Za-z_.-]*$ + immutable: true + virtual_address: + title: Virtual Server IP Address + description: This IP address, combined with the port you specify below, becomes + the BIG-IP virtual server address and port, which clients use to access the application. + The system uses this IP:Port for distributing requests to the web servers. + virtual_port: + title: Virtual Server Port + default: 443 + client_cert: + pool_members: + title: Pool Members + description: 'The pool members are the servers that receive traffic from the virtual server (upstream). + To share nodes between pools see K88250015: AS3 expected behavior of ''shareNodes'' in declarations. + https://my.f5.com/manage/s/article/K88250015' + type: array + uniqueItems: true + items: + type: object + properties: + serverAddress: + title: Server Address + servicePort: + title: Server Port + default: 80 + shareNodes: + title: Share Node + type: boolean + default: false + monitor_name: + title: Monitor + description: Select an existing BIG-IP pool monitor. Monitors are used to determine the health of the application on each + server. If an application instance does not respond or responds incorrectly, the + system will cease to send client requests to that web server. The system will + continue to monitor the instance and will begin sending requests once the application + responds correctly. + type: string + default: '/Common/tcp' +template: | + { + "class": "ADC", + "schemaVersion": "3.0.0", + "id": "urn:uuid:a858e55e-bbe6-42ce-a9b9-0f4ab33e3bf7", + "{{tenant_name}}": { + "class": "Tenant", + "{{app_name}}": { + "class": "Application", + "template": "generic", + "virtualAddresses": [ + "{{virtual_address:f5:ipv4}}" + ], + "virtualPort": {{virtual_port:f5:port}}, + "{{app_name}}_pool": { + "class": "Pool", + "members": [ + {{#pool_members}} + { + "serverAddresses": [{{serverAddress:f5:ipv4}}], + "servicePort": {{servicePort:f5:port}}, + "shareNodes": {{shareNodes::boolean}} + }, + {{/pool_members}} + ] + } + } + } + } diff --git a/tests/024_service.unit.tests.ts b/tests/024_service.unit.tests.ts new file mode 100644 index 0000000..b8e1046 --- /dev/null +++ b/tests/024_service.unit.tests.ts @@ -0,0 +1,76 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +/* + * Copyright 2020. F5 Networks, Inc. See End User License Agreement ("EULA") for + * license terms. Notwithstanding anything to the contrary in the EULA, Licensee + * may copy and modify this software product for its internal business purposes. + * Further, Licensee may upload, publish and distribute the modified version of + * the software product on devcentral.f5.com. + */ + +'use strict'; + +import assert from 'assert'; +import ADC from '../src/CitrixADC' +import { Explosion } from '../src/models'; +import { archiveMake } from './archiveBuilder'; + +const events = []; +let testFile: string; + +const parsedFileEvents: any[] = [] +const parsedObjEvents: any[] = [] + +describe('service abstraction tests', function () { + + let adc: ADC; + let expld: Explosion; + let log; + let err; + + before(async function () { + // log test file name - makes it easer for troubleshooting + console.log(' file:', __filename) + testFile = await archiveMake() as string; + // clear the events arrays + parsedFileEvents.length = 0 + parsedObjEvents.length = 0 + adc = new ADC(); + + adc.on('parseFile', x => parsedFileEvents.push(x)) + adc.on('parseObject', x => parsedObjEvents.push(x)) + + await adc.loadParseAsync(testFile) + .then(async x => { + await adc.explode() + .then(x => { + expld = x + }) + }) + .catch(y => { + err = y; + log = adc.logs() + debugger; + }) + + }); + + afterEach(function () { + events.length = 0; + }) + + + + it(`basic service reference`, async () => { + + // this app should have three different service bindings and 15 total line of config + + // get application we are looking for + const app = expld.config.apps?.find(x => x.name === "\"1 APPLE_443_HTTPS\"") + + assert.deepStrictEqual(app!.bindings!.service!.length, 3, "should have three service bindings") + assert.deepStrictEqual(app!.lines!.length, 15, "should have 15 total lines of ns config") + + }) + + +}); \ No newline at end of file diff --git a/tests/artifacts/apps/apple.ns.conf b/tests/artifacts/apps/apple.ns.conf new file mode 100644 index 0000000..04414ed --- /dev/null +++ b/tests/artifacts/apps/apple.ns.conf @@ -0,0 +1,20 @@ +### "1 APPLE_443_HTTPS" ########## - Hover for more details - ########## +# Features: 443/ssl/multiple services/space in name + +add lb vserver "1 APPLE_443_HTTPS" SSL 10.240.20.10 443 -persistenceType COOKIEINSERT -timeout 0 -lbMethod ROUNDROBIN -cltTimeout 180 -comment "Of another world | applebaum" -devno 88932352 +bind lb vserver "1 APPLE_443_HTTPS" FUJI02_HTTPS_SVC +add service FUJI02_HTTPS_SVC FUJI02 SSL 443 -gslb NONE -maxClient 0 -maxReq 0 -cip ENABLED client-ip -usip NO -useproxyport YES -sp OFF -cltTimeout 180 -svrTimeout 360 -CKA NO -TCPB NO -CMP YES -state DISABLED -devno 73465856 +add server FUJI02 10.240.21.115 -comment "created with apple in mind" -devno 171784 +bind ssl vserver "1 APPLE_443_HTTPS" -cipherName TLS12ECDHE +bind ssl vserver "1 APPLE_443_HTTPS" -certkeyName www.applebaum.com +add ssl certKey "1 APPLE_443_HTTPS" -certkeyName www.applebaum.com +bind ssl vserver "1 APPLE_443_HTTPS" -eccCurveName P_256 +bind ssl vserver "1 APPLE_443_HTTPS" -eccCurveName P_384 +bind ssl vserver "1 APPLE_443_HTTPS" -eccCurveName P_224 +bind ssl vserver "1 APPLE_443_HTTPS" -eccCurveName P_521 +bind lb vserver "1 APPLE_443_HTTPS" GALA02_HTTPS_82_SVC +add service GALA02_HTTPS_82_SVC SERVERCORE2 SSL 82 -gslb NONE -maxClient 0 -maxReq 0 -cip ENABLED client-ip -usip NO -useproxyport YES -sp OFF -cltTimeout 180 -svrTimeout 360 -CKA NO -TCPB NO -CMP YES -devno 363397120 +add server SERVERCORE2 10.240.21.170 -comment "created with apple in mind" -devno 171689 +bind lb vserver "1 APPLE_443_HTTPS" GALA01_HTTPS_82_SVC +add service GALA01_HTTPS_82_SVC SERVERCORE SSL 82 -gslb NONE -maxClient 0 -maxReq 0 -cip ENABLED client-ip -usip NO -useproxyport YES -sp OFF -cltTimeout 180 -svrTimeout 360 -CKA NO -TCPB NO -CMP YES -devno 363462656 +add server SERVERCORE 10.240.21.171 -devno 171388 \ No newline at end of file diff --git a/tests/artifacts/f5_flipper_test.tgz b/tests/artifacts/f5_flipper_test.tgz index 1d20c11..af81cc9 100644 Binary files a/tests/artifacts/f5_flipper_test.tgz and b/tests/artifacts/f5_flipper_test.tgz differ