From f6f1d82487c29665bfb4afaea773961b64db238c Mon Sep 17 00:00:00 2001 From: Ravi Pendurty Date: Thu, 12 Jun 2025 15:53:13 +0530 Subject: [PATCH] Include distribution artifacts Provides infrastucture for building sdnc-image and sdnc-web-image Issue-ID: OAM-469 Change-Id: Ic97d9c208c38c4c4c934a7bf608ae6a0fd001148 Signed-off-by: Ravi Pendurty --- distribution/TagVersion.groovy | 41 ++ distribution/oam-controller-web/README.md | 56 +++ distribution/oam-controller-web/certs/cacert.pem | 31 ++ distribution/oam-controller-web/certs/cert.pem | 102 +++++ distribution/oam-controller-web/certs/key.pem | 29 ++ distribution/oam-controller-web/pom.xml | 200 +++++++++ .../oam-controller-web/src/main/docker/Dockerfile | 65 +++ .../src/main/resources/favicon.ico | Bin 0 -> 268322 bytes .../src/main/resources/http_custom.conf | 4 + .../src/main/resources/http_site.conf | 66 +++ .../src/main/resources/https_site.conf | 85 ++++ .../src/main/resources/location.rules | 64 +++ .../src/main/resources/odlux.application.list | 8 + .../src/main/scripts/configure.py | 34 ++ .../oam-controller-web/src/main/scripts/core.py | 358 ++++++++++++++++ .../oam-controller-web/src/main/scripts/opm.py | 126 ++++++ .../oam-controller-web/src/main/scripts/run.sh | 81 ++++ distribution/oam-controller/README.md | 63 +++ distribution/oam-controller/certs/certs.properties | 4 + distribution/oam-controller/certs/keys0.zip | Bin 0 -> 3917 bytes distribution/oam-controller/certs/keys1.zip | Bin 0 -> 3917 bytes distribution/oam-controller/pom.xml | 328 +++++++++++++++ .../oam-controller/src/main/docker/Dockerfile | 99 +++++ .../src/main/etc/oauth-aaa-app-config.xml | 97 +++++ .../src/main/etc/oauth-provider.config.json | 22 + .../src/main/etc/org.apache.karaf.management.cfg | 123 ++++++ .../src/main/groovy/TagVersion.groovy | 41 ++ .../src/main/scripts/installCerts.py | 386 +++++++++++++++++ .../oam-controller/src/main/scripts/startODL.sh | 456 +++++++++++++++++++++ 29 files changed, 2969 insertions(+) create mode 100644 distribution/TagVersion.groovy create mode 100644 distribution/oam-controller-web/README.md create mode 100644 distribution/oam-controller-web/certs/cacert.pem create mode 100644 distribution/oam-controller-web/certs/cert.pem create mode 100644 distribution/oam-controller-web/certs/key.pem create mode 100644 distribution/oam-controller-web/pom.xml create mode 100644 distribution/oam-controller-web/src/main/docker/Dockerfile create mode 100644 distribution/oam-controller-web/src/main/resources/favicon.ico create mode 100644 distribution/oam-controller-web/src/main/resources/http_custom.conf create mode 100644 distribution/oam-controller-web/src/main/resources/http_site.conf create mode 100644 distribution/oam-controller-web/src/main/resources/https_site.conf create mode 100644 distribution/oam-controller-web/src/main/resources/location.rules create mode 100644 distribution/oam-controller-web/src/main/resources/odlux.application.list create mode 100644 distribution/oam-controller-web/src/main/scripts/configure.py create mode 100644 distribution/oam-controller-web/src/main/scripts/core.py create mode 100755 distribution/oam-controller-web/src/main/scripts/opm.py create mode 100644 distribution/oam-controller-web/src/main/scripts/run.sh create mode 100644 distribution/oam-controller/README.md create mode 100644 distribution/oam-controller/certs/certs.properties create mode 100644 distribution/oam-controller/certs/keys0.zip create mode 100644 distribution/oam-controller/certs/keys1.zip create mode 100644 distribution/oam-controller/pom.xml create mode 100644 distribution/oam-controller/src/main/docker/Dockerfile create mode 100644 distribution/oam-controller/src/main/etc/oauth-aaa-app-config.xml create mode 100644 distribution/oam-controller/src/main/etc/oauth-provider.config.json create mode 100644 distribution/oam-controller/src/main/etc/org.apache.karaf.management.cfg create mode 100644 distribution/oam-controller/src/main/groovy/TagVersion.groovy create mode 100755 distribution/oam-controller/src/main/scripts/installCerts.py create mode 100755 distribution/oam-controller/src/main/scripts/startODL.sh diff --git a/distribution/TagVersion.groovy b/distribution/TagVersion.groovy new file mode 100644 index 0000000..bcf2452 --- /dev/null +++ b/distribution/TagVersion.groovy @@ -0,0 +1,41 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP CCSDK + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * 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. + * ============LICENSE_END============================================ + * =================================================================== + * + */ + +package org.onap.sdnc.oam + + +def versionArray; +if ( project.properties['sdnc.project.version'] != null ) { + versionArray = project.properties['sdnc.project.version'].split('\\.'); +} + +if ( project.properties['sdnc.project.version'].endsWith("-SNAPSHOT") ) { + patchArray = versionArray[2].split('-'); + project.properties['project.docker.latestminortag.version']=versionArray[0] + '.' + versionArray[1] + "-SNAPSHOT-latest"; + project.properties['project.docker.latestfulltag.version']=versionArray[0] + '.' + versionArray[1] + '.' + patchArray[0] + "-SNAPSHOT-latest"; + project.properties['project.docker.latesttagtimestamp.version']=versionArray[0] + '.' + versionArray[1] + '.' + patchArray[0] + "-SNAPSHOT-"+project.properties['sdnc.build.timestamp']; +} else { + project.properties['project.docker.latestminortag.version']=versionArray[0] + '.' + versionArray[1] + "-STAGING-latest"; + project.properties['project.docker.latestfulltag.version']=versionArray[0] + '.' + versionArray[1] + '.' + versionArray[2] + "-STAGING-latest"; + project.properties['project.docker.latesttagtimestamp.version']=versionArray[0] + '.' + versionArray[1] + '.' + versionArray[2] + "-STAGING-"+project.properties['sdnc.build.timestamp']; +} diff --git a/distribution/oam-controller-web/README.md b/distribution/oam-controller-web/README.md new file mode 100644 index 0000000..834b93a --- /dev/null +++ b/distribution/oam-controller-web/README.md @@ -0,0 +1,56 @@ +# sdnc web image + + +## folder structure + +| folder | description | +| ------ | ----------- | +| /opt/bitnami/nginx/conf/server_blocks/http(s)_site.conf | nginx config | +| /opt/bitnami/nginx/conf/server_blocks/location.rules | forwarding rules for nginx | +| /app/odlux | http content files (html, js, css, ...) | +| /app/odlux.application.list | application list file | +| /app/opm.py | Odlux package manager for install or uninstall apps | +| /app/init.d/ | autoinstall folder for opm | + +## Default app order + +| index | application | +| ----- | ----------- | +| 1 | connectApp | +| 10 | faultApp | +| 20 | maintenanceApp | +| 30 | configurationApp | +| 55 | performanceHistoryApp | +| 70 | inventoryApp | +| 75 | eventLogApp | +| 90 | mediatorApp | +| 200 | helpApp | + + +## usage + +### auto installation + +To auto install additional applications for odlux they can be easily injected before startup into the ```/app/init.d/``` folder. There are two options of file format allowed. + +[1] The first fileformat is e.g. 55microwaveApp.jar but also .zip is allowed. The important thing is that a number is leading the app package to specify the order number where the menu item is ordered in the menu bar. So the microwaveApp would be located between performanceApp and inventoryApp. + +[2] The second is the default jar format, like it would be installed into the opendaylight karaf environment, including a blueprint and the sources. There the filename is not important because application name and index will be detected by the blueprint information. + + +### manual method +``` +opm install --name myApp --index 53 --file myarchive.zip +``` +``` +opm install --url https://link-to-my-odlux-application.jar +``` + +``` +opm uninstall --name myApp +``` + +``` +opm list +``` + diff --git a/distribution/oam-controller-web/certs/cacert.pem b/distribution/oam-controller-web/certs/cacert.pem new file mode 100644 index 0000000..0146e6b --- /dev/null +++ b/distribution/oam-controller-web/certs/cacert.pem @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIIFPjCCAyagAwIBAgIJAJ6u7cCnzrWdMA0GCSqGSIb3DQEBCwUAMCwxDjAMBgNV +BAsMBU9TQUFGMQ0wCwYDVQQKDARPTkFQMQswCQYDVQQGEwJVUzAeFw0xODA0MDUx +NDE1MjhaFw0zODAzMzExNDE1MjhaMCwxDjAMBgNVBAsMBU9TQUFGMQ0wCwYDVQQK +DARPTkFQMQswCQYDVQQGEwJVUzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBAMA5pkgRs7NhGG4ew5JouhyYakgYUyFaG121+/h8qbSdt0hVQv56+EA41Yq7 +XGie7RYDQK9NmAFF3gruE+6X7wvJiChp+Cyd7sFMnb65uWhxEdxWTM2BJFrgfzUn +H8ZCxgaCo3XH4PzlKRy2LQQJEJECwl/RZmRCXijMt5e9h8XoZY/fKkKcZZUsWNCM +pTo266wjvA9MXLmdgReRj0+vrCjrNqy+htwJDztoiHWiYPqT6o8EvGcgjNqjlZx7 +NUNf8MfLDByqKF6+wRbHv1GKjn3/Vijd45Fv8riyRYROiFanvbV6jIfBkv8PZbXg +2VDWsYsgp8NAvMxK+iV8cO+Ck3lBI2GOPZbCEqpPVTYbLUz6sczAlCXwQoPzDIZY +wYa3eR/gYLY1gP2iEVHORag3bLPap9ZX5E8DZkzTNTjovvLk8KaCmfcaUMJsBtDd +ApcUitz10cnRyZc1sX3gE1f3DpzQM6t9C5sOVyRhDcSrKqqwb9m0Ss04XAS9FsqM +P3UWYQyqDXSxlUAYaX892u8mV1hxnt2gjb22RloXMM6TovM3sSrJS0wH+l1nznd6 +aFXftS/G4ZVIVZ/LfT1is4StoyPWZCwwwly1z8qJQ/zhip5NgZTxQw4mi7ww35DY +PdAQOCoajfSvFjqslQ/cPRi/MRCu079heVb5fQnnzVtnpFQRAgMBAAGjYzBhMB0G +A1UdDgQWBBRTVTPyS+vQUbHBeJrBKDF77+rtSTAfBgNVHSMEGDAWgBRTVTPyS+vQ +UbHBeJrBKDF77+rtSTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAN +BgkqhkiG9w0BAQsFAAOCAgEAPx/IaK94n02wPxpnYTy+LVLIxwdq/kawNd6IbiMz +L87zmNMDmHcGbfoRCj8OkhuggX9Lx1/CkhpXimuYsZOFQi5blr/u+v4mIbsgbmi9 +7j+cUHDP0zLycvSvxKHty51LwmaX9a4wkJl5zBU4O1sd/H9tWcEmwJ39ltKoBKBx +c94Zc3iMm5ytRWGj+0rKzLDAXEWpoZ5bE5PLJauA6UDCxDLfs3FwhbS7uDggxYvf +jySF5FCNET94oJ+m8s7VeHvoa8iPGKvXrIqdd7XDHnqJJlVKr7m9S0fMbyEB8ci2 +RtOXDt93ifY1uhoEtEykn4dqBSp8ezvNMnwoXdYPDvTd9uCAFeWFLVreBAWxd25h +PsBTkZA5hpa/rA+mKv6Af4VBViYr8cz4dZCsFChuioVebe9ighrfjB//qKepFjPF +CyjzKN1u0JKm/2x/ORqxkTONG8p3uDwoIOyimUcTtTMv42bfYD88RKakqSFXE9G+ +Z0LlaKABqfjK49o/tsAp+c5LoNlYllKhnetO3QAdraHwdmC36BhoghzR1jpX751A +cZn2VH3Q4XKyp01cJNCJIrua+A+bx6zh3RyW6zIIkbRCbET+UD+4mr8WIcSE3mtR +ZVlnhUDO4z9//WKMVzwS9Rh8/kuszrGFI1KQozXCHLrce3YP6RYZfOed79LXaRwX +dYY= +-----END CERTIFICATE----- diff --git a/distribution/oam-controller-web/certs/cert.pem b/distribution/oam-controller-web/certs/cert.pem new file mode 100644 index 0000000..1195a12 --- /dev/null +++ b/distribution/oam-controller-web/certs/cert.pem @@ -0,0 +1,102 @@ +Bag Attributes + friendlyName: sdnc@sdnc.onap.org + localKeyID: 54 69 6D 65 20 31 36 31 31 36 38 33 32 39 38 35 32 32 +Key Attributes: +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIk4s7xBaGXdgCAggA +MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECI7qjnyFxa3mBIIEyHgvXzCmhOT/ +atHsneicZqaGXxz57z1mPosvGwf2w6WerxOyW+cFejNepgMH+c5MQAfTuTD0H5g3 +SoyC9TKfHBld439sKO3hnDBROsypugO2uP4ownGiKQxOdwHNCOS8nC1EbUYC6nHR +B5QtRpDHZzB2t9dd6+RU1PuPUFRxjIPZsCM1DdKKhMHQHr8WDSbi170XfzC6O2Ko +23tgDq9cQYTqmgFedjyWpEmxfcibaujGOZ4VQej+tn60A03cXHG05tN/XvDCbQty +9bw1kiS8e+qmdUhkEIhR2aY0Z9sCUOLwJPDg/1vE0ZwK/bRGRD432PD+dmSLFV+v +m2m/ec8IQer8hCleI6GBaFI28QZyS2jznbzS7b/hU+nyxkZXejAymU1OBcNV4H8M +qf5ITWs+Ma5fc/8X90MlJacmBo3JuusTvDImLFP+5Nn5Yo3cnDeiAyMo0vFuywrv +bATYAncPlzksb6py3D5iXmLxREgLI14/TdZLhcYXBHw76oPz+/CH0A2P/HICPIjr +zF8U6zNI4bIguBTfVmm6YLjzOkVkKx4e/0fJiQO1yhzIsghhByIMg1uPcm0olNQz +r+YRPKTqFCPRxyGgPMleN56qeLhN8Q1WyJzIJoVVpDFc+4Stbv71C/po6/6A3v4r +hGUPCSsj8wJN+ozdamDWpeyRVCwXmmKwJU96pbnhdH/l6CPjmniAuKLzOMLJH1AD +FJEm1Frpz40BDC2U/165+nlfcHZfePWVPpNuqWzUfywqu8ORS/pYhapFoLLafQIn +22KhnPnbNXclIzuI0wiKjoNAfzJM0S9hysdojK/bptaZXUFeBEe41A8exuOjOxRh +pJqqgq2cRx6cmnAy0dr54+GoZr3haQCqTk814cxumOHqQdWllblA1D9b5Wd+8T5+ +tYdzYatsvjeY/VDH5czAbUhgBHGO3Vkxm49QemcopNDeCZ7RXmSwl2X6HLfCwnfH +9zsdNrIMfSTdRk9H4iHTyFRyoPViX6wYxlD7B9hJWggEyDVg9RvJImOSKyWk+NKd +WmfxaywgUJkxsJeEBCso8V690lm//oWrc17qWEd29h/9J0MPNa2zXJyG1Yq1RohZ +JW3IcnE8gCoyHVjxBCVjKPA6dXtfDNfmCDyEG+GgPglQUj9TBIRGmn9e067M6dB9 +vhnK12SBQNTyoH5vWSbP2u5wk6jV5QKYyqMbNHAD1uvsBbWy4FpoI+epp2Y3XcAr +kgBzopKSaCbj1thxxUHsMYBspVDR+D0SR4fsHhj+Y3jmr37s3q1NOSkWUMcMa7Hi +zaozRSo8hYUwP5RHpPcNCTcK0dhFPAWXyGPtP7IribGQDhUAdde/s4yPuSLa28zy +uTKWU5vSlaE+9WRSKvbA8HdKTPv45dV/qUCHITvPOdsqkWJ3qhNQMrrD9Mx17oj/ +zGZTcRGQG62dfYUR9v2rGE6Gj7MzaE1SrQgYqtCzWfJ9e3fBqOlko5jtZ5Kz86DU +ZFISrkb1sATngzWFtvyNgHFx4fUsYDJbc8XlB47H5Byyj/6SypS6dMpwqpNezn8s +xQi3yUfpg7GQzTFKdwmqK/KVeh0KZF/0FM+ZCUPh6IaRDcp8+Hm7H72ZD4vPxs4s +8bvLx9bxfiI+/6Om51IQrQ== +-----END ENCRYPTED PRIVATE KEY----- +Bag Attributes + friendlyName: sdnc@sdnc.onap.org + localKeyID: 54 69 6D 65 20 31 36 31 31 36 38 33 32 39 38 35 32 32 +subject=CN = sdnc, OU = sdnc@sdnc.onap.org:DEV, OU = OSAAF, O = ONAP, C = US + +issuer=C = US, O = ONAP, OU = OSAAF, CN = intermediateCA_9 + +-----BEGIN CERTIFICATE----- +MIIE6zCCA9OgAwIBAgIJALyx+8HFJuYTMA0GCSqGSIb3DQEBCwUAMEcxCzAJBgNV +BAYTAlVTMQ0wCwYDVQQKDARPTkFQMQ4wDAYDVQQLDAVPU0FBRjEZMBcGA1UEAwwQ +aW50ZXJtZWRpYXRlQ0FfOTAeFw0yMTAxMjYxNzQ4MThaFw0yMjAxMjYxNzQ4MTha +MFwxDTALBgNVBAMMBHNkbmMxHzAdBgNVBAsMFnNkbmNAc2RuYy5vbmFwLm9yZzpE +RVYxDjAMBgNVBAsMBU9TQUFGMQ0wCwYDVQQKDARPTkFQMQswCQYDVQQGEwJVUzCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALQtwrW3Eiru18BADUiBIbEU +sruiLu63h6jDprLqrxGt57d5MSpxaRoOPoWDPE/Z6LvMwTGfiQIPsFnZ2H3YtDsI +/p1fOFAHxCUl5Cs4HnYjJUkDs2U7dXUYZR8enNPZRfFZNUOajxERUgyE/0g+yHS1 +AlysMInFDblmNEYgQoNiN996FpBamHivCDXw612bBkkZQOTeKJaCZ0DPGIYGAJtf +Q1kIL7Y1D3c3C0VD39homtxqIb21rje63YVISprbfKX0RxijkWw0wXjaRDwxPGwH +TrDHgsrPH/zv9Hak6cJkTw5e7VBHHlL1sHYgPSDLd/8PFGkmD4a/N/IKLy/14KMC +AwEAAaOCAcMwggG/MAkGA1UdEwQCMAAwDgYDVR0PAQH/BAQDAgXgMCAGA1UdJQEB +/wQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBUBgNVHSMETTBLgBSB95lbELnIjN7z +Ul7qTmmgQz6s3aEwpC4wLDEOMAwGA1UECwwFT1NBQUYxDTALBgNVBAoMBE9OQVAx +CzAJBgNVBAYTAlVTggEHMB0GA1UdDgQWBBRUhHQPlauGoN9fiGiB7WYr+oIHJDCC +AQkGA1UdEQSCAQAwgf2BH21hcmsuZC5tYW5hZ2VyQHBlb3BsZS5vc2FhZi5jb22C +BHNkbmOCG2MxLnZtMS5zZG5jLnNpbXBsZWRlbW8ub25hcIIbYzIudm0xLnNkbmMu +c2ltcGxlZGVtby5vbmFwghtjMy52bTEuc2RuYy5zaW1wbGVkZW1vLm9uYXCCG2M0 +LnZtMS5zZG5jLnNpbXBsZWRlbW8ub25hcIIJb25hcC1zZG5jgg5vbmFwLXNkbmMu +b25hcIIcc2RuYy5hcGkuc2ltcGxlZGVtby5vbmFwLm9yZ4IJc2RuYy5vbmFwghx2 +bTEuc2RuYy5zaW1wbGVkZW1vLm9uYXAub3JnMA0GCSqGSIb3DQEBCwUAA4IBAQAg +7fybHysjWyKejSfPnodYuLfQoCIaXe5C4JbwLGKweAost5E6ud2rscN/c5UYNPs/ +IskfnMxULLzJpEXdUHwLQaLJj0fQQBRHq23s8P7Emu44ZeEzxAQfI+4pKRzTYxag +4dIitf91nhUq5SQI/pcki+/ElkwfeKHYQLBDU8ygG/gZKh1UHxIjfva7v/ENqL2h +H8UDXsLhOx/guaJzH2CRQdKMminsdtnNgSRRPzWRe4EMc2ah6G6E4B/Za/n7Rhq5 +r6jpvM/XIxPCY4ci5jJIbvdahS4I54kMaLRTSl4gT8+n8ie/GzhZlXX+1MR8HCZc +8SWDYxmc8MkJ20iekiSc +-----END CERTIFICATE----- +Bag Attributes + friendlyName: CN=intermediateCA_9,OU=OSAAF,O=ONAP,C=US +subject=C = US, O = ONAP, OU = OSAAF, CN = intermediateCA_9 + +issuer=OU = OSAAF, O = ONAP, C = US + +-----BEGIN CERTIFICATE----- +MIIEdTCCAl2gAwIBAgIBBzANBgkqhkiG9w0BAQsFADAsMQ4wDAYDVQQLDAVPU0FB +RjENMAsGA1UECgwET05BUDELMAkGA1UEBhMCVVMwHhcNMTgwODE3MTg1MTM3WhcN +MjMwODE3MTg1MTM3WjBHMQswCQYDVQQGEwJVUzENMAsGA1UECgwET05BUDEOMAwG +A1UECwwFT1NBQUYxGTAXBgNVBAMMEGludGVybWVkaWF0ZUNBXzkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCv0HHUkba3uNtNI3jPKimUcd6RNwmhSCJL +neMWpnjqp5/A+HCKyNsEaT4y177hNLmCm/aMm1u2JIfikc+8wEqLCSBBPz+P0h+d +o+sZ7U+4oeQizdYYpEdzHJ2SieHHa8vtu80rU3nO2NEIkuYC20HcKSEtl8fFKsk3 +nqlhY+tGfYJPTXcDOQAO40BTcgat3C3uIJHkWJJ4RivunE4LEuRv9QyKgAw7rkJV +v+f7guqpZlXy6dzAkuU7XULWcgo55MkZlssoiErMvEZJad5aWKvRY3g7qUjaQ6wO +15wOAUoRBW96eeZZbytgn8kybcBy++Ue49gPtgm1MF/KlAsp0MD5AgMBAAGjgYYw +gYMwHQYDVR0OBBYEFIH3mVsQuciM3vNSXupOaaBDPqzdMB8GA1UdIwQYMBaAFFNV +M/JL69BRscF4msEoMXvv6u1JMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjANBgkqhkiG9w0B +AQsFAAOCAgEADxNymiCNr2e37iLReoaxKmZvwox0cTiNAaj7iafRzmwIoY3VXO8Q +ix5IYcp4FaQ7fV1jyp/AmaSnyHf6Osl0sx8PxsQkO7ALttxKUrjfbvNSVUA2C/vl +u5m7UVJLIUtFDZBWanzUSmkTsYLHpiANFQKd2c/cU1qXcyzgJVFEFVyyHNkF7Is+ ++pjG9M1hwQHOoTnEuU013P7X1mHek+RXEfhJWwe7UsZnBKZaZKbQZu7hEtqKWYp/ +QsHgnjoLYXsh0WD5rz/mBxdTdDLGpFqWDzDqb8rsYnqBzoowvsasV8X8OSkov0Ht +8Yka0ckFH9yf8j1Cwmbl6ttuonOhky3N/gwLEozuhy7TPcZGVyzevF70kXy7g1CX +kpFGJyEHXoprlNi8FR4I+NFzbDe6a2cFow1JN19AJ9Z5Rk5m7M0mQPaQ4RcikjB3 +aoLsASCJTm1OpOFHfxEKiBW4Lsp3Uc5/Rb9ZNbfLrwqWZRM7buW1e3ekLqntgbky +uKKISHqVJuw/vXHl1jNibEo9+JuQ88VNuAcm7WpGUogeCa2iAlPTckPZei+MwZ8w +tpvxTyYlZEC8DWzY1VC29+W2N5cvh01e2E3Ql08W1zL63dqrgdEZ3VWjzooYi4ep +BmMXTvouW+Flyvcw/0oTcfN0biDIt0mCkZ5CQVjfGL9DTOYteR5hw+k= +-----END CERTIFICATE----- diff --git a/distribution/oam-controller-web/certs/key.pem b/distribution/oam-controller-web/certs/key.pem new file mode 100644 index 0000000..04bc849 --- /dev/null +++ b/distribution/oam-controller-web/certs/key.pem @@ -0,0 +1,29 @@ +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC0LcK1txIq7tfA +QA1IgSGxFLK7oi7ut4eow6ay6q8Rree3eTEqcWkaDj6FgzxP2ei7zMExn4kCD7BZ +2dh92LQ7CP6dXzhQB8QlJeQrOB52IyVJA7NlO3V1GGUfHpzT2UXxWTVDmo8REVIM +hP9IPsh0tQJcrDCJxQ25ZjRGIEKDYjffehaQWph4rwg18OtdmwZJGUDk3iiWgmdA +zxiGBgCbX0NZCC+2NQ93NwtFQ9/YaJrcaiG9ta43ut2FSEqa23yl9EcYo5FsNMF4 +2kQ8MTxsB06wx4LKzx/87/R2pOnCZE8OXu1QRx5S9bB2ID0gy3f/DxRpJg+Gvzfy +Ci8v9eCjAgMBAAECggEAbB+J2MIjhOAPWK8XSYs0TK+/EhohT9+S6RN/1Z4/sLxL +cS6o8m9cQuaJXlWCu+hoYUpeJQk3jqUbjs/LurlwbnzXTlj10hDXA/PZGJZ0sTAm +D8rIvNcRhVM+W45jTj30WwDNleQKNpPOSPUGvLPwVxjIchRijEpUEg3jELILOAuW +ebloKLqc5SDAPKIpepZO7bz4L/dVlQSEBp3OTzyfeecbBNS2Vfw0K+I5BqGJAssZ +Dq+ixSHRj6mdvm7tf5e14j65W8VKvUoHbktp9z2OBCItySV4g1dqrfM7T9SqsosH +cbwR5dIieiFnhdg94rfpzH2QTCBt5MGUpCcv+CbQAQKBgQDkenCAImG1jAjzQNxb +7LXLJeIqJC2E3290hEYge2Bi+1/WmV222AAwNUEPQfKa7qUJRLpX8a4p+9kTaZos +93szyYEyp4vf93GDHvQPmKMJDCbbxa94txd5dnrtYTN+MCPjpwr+75++JRUUwcNr +k3mkzM87zhSBkyYcGiCsza4gQQKBgQDJ4enp8Zly3GqufbWJNpKut6e9hC6f4qWi +4qRUBmjnogm0HiGmn83n9B6SI6OnaRy/dXgPBogZDeETyzGu78nArDK+cy8wSy0H +aPuApqGJzsuAl6YWudYt4ooBcJL99XgTGxFAb2q04JKxh18V6DRfj7pY2uhZongI +OdcMSE2H4wKBgQCUzNEcAkhUbmEd264oCB/VsFR9UZZ7pPD3l3X8jZ2WmVQvdS69 +eCuXOfenMjIIiUfeo24g/HuLSER2Ch6pDnykm6WTEd9c+9Bnru8QgT4dFFbyZusC +2WtmZa1lkBpzInMdPptAsVr+ATSbkh3tn9xnYiPNNUfRo738K2AAauvugQKBgQCd +dzbqoOXdr4sOm0LzybtTyDBwJB/x2ej0Se9/EpjUw5DqCu6YduE2YTVPK7lEpTol +JE0G+0NAt5CtzbntB1/Ihwf1gQZ3lsuCkiJJ0K8DPGeC38ZOx5kFpUObp+EfcU29 +KUmlhsImX1xMWJiUD9B6ETN6hxTghVc2o1bXX7YJnQKBgQCGiRnjCEmKd8hefkS8 +ub9F4kdOzXmG4XhK+oZWVGPXIGfnoxm6IbWcjSArA/m8TLfJSHPKujnLOnOkffpi +7+PWzTHn5BFDGUb8z3mxwJV8e9szoDkljoiUwYU/S8eatAm6lyJv1gp2wmDI9DfT +86BefCEvGk3EzAo3L6hhHdICzA== +-----END PRIVATE KEY----- + diff --git a/distribution/oam-controller-web/pom.xml b/distribution/oam-controller-web/pom.xml new file mode 100644 index 0000000..7e6365b --- /dev/null +++ b/distribution/oam-controller-web/pom.xml @@ -0,0 +1,200 @@ + + + 4.0.0 + + org.o-ran-sc.sdnc.oam + installation-sdnc-web + 2.6.1-SNAPSHOT + pom + + sdnc-oam :: installation :: ${project.artifactId} + Creates SDN Controller WebUI Docker container + + + docker.io/bitnami/nginx:1.21-debian-10 + o-ran-sc/sdnc-web-image + ${project.version} + 1.7.0-SNAPSHOT + ${maven.build.timestamp} + ${https_proxy} + yyyyMMdd'T'HHmmss'Z' + deploy + true + + + + + org.o-ran-sc.oam-controller.features.sdnr.odlux + sdnr-odlux-installer + ${ccsdk.features.version} + zip + repo + + + + + + + org.codehaus.gmaven + groovy-maven-plugin + 2.1.1 + + + validate + + execute + + + ${basedir}/../TagVersion.groovy + + + + + + maven-resources-plugin + 2.6 + + + copy-dockerfile + + copy-resources + + validate + + ${basedir}/target/docker-stage + + + src/main/docker + + Dockerfile + + true + + + + + + copy-siteconf + + copy-resources + + validate + + ${basedir}/target/docker-stage/conf + + + src/main/resources + + *.conf + *.rules + + true + + + + + + copy-scripts + + copy-resources + + validate + + ${basedir}/target/docker-stage/bin + + + src/main/scripts + + *.sh + *.py + + true + + + + + + copy-favicon + + copy-resources + + validate + + ${basedir}/target/docker-stage/html + + + src/main/resources + + favicon.ico + odlux.application.list + + false + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + unpack features + generate-sources + + unpack-dependencies + + + ${basedir}/target/docker-stage/html + true + false + true + true + + + + + + io.fabric8 + docker-maven-plugin + 0.30.0 + false + + + + ${image.name} + + try + ${basedir}/target/docker-stage + + + ${project.docker.latestminortag.version} + ${project.docker.latestfulltag.version} + ${project.docker.latesttagtimestamp.version} + + + + + + + + generate-images + package + + build + + + + push-images + ${docker.push.phase} + + build + push + + + + + + + diff --git a/distribution/oam-controller-web/src/main/docker/Dockerfile b/distribution/oam-controller-web/src/main/docker/Dockerfile new file mode 100644 index 0000000..b2b45a3 --- /dev/null +++ b/distribution/oam-controller-web/src/main/docker/Dockerfile @@ -0,0 +1,65 @@ +### +#============LICENSE_START======================================================= +# ONAP : ccsdk distribution web +# ================================================================================ +# Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. +# All rights reserved. +# ================================================================================ +# 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. +# ============LICENSE_END========================================================= +### + +# Base bitnami nginx image +FROM ${base.image.repo} +LABEL maintainer="CCSDK Team (onap-ccsdk@lists.onap.org)" +USER root +RUN apt-get update && apt-get install python3-minimal python3-urllib3 unzip openssl -y +USER 1001 +# copy ODLUX files to nginx +COPY html /opt/bitnami/nginx/html + +# copy site conf files +COPY conf/* /opt/bitnami/nginx/conf/server_blocks/ + +# setup environment variables +ENV WEBPROTOCOL="HTTP" \ + WEBPORT="8080" \ + SDNRPROTOCOL="HTTP" \ + SDNRHOST="172.18.0.3" \ + SDNRPORT="8181" \ + ONETONSETUP="false" \ + TRPCEURL="" \ + TOPOURL="" \ + TILEURL="" \ + SITEDOCURL="" \ + DNS_RESOLVER="1.1.1.1 ipv6=off" \ + DNS_INTERNAL_RESOLVER="127.0.0.11" \ + SSL_CERT_DIR="/app/cert" \ + SSL_CERTIFICATE="cert.pem" \ + SSL_CERTIFICATE_KEY="cert.key" + +# Check if /app can be used. If so, create "custom" directory and copy the files there. +COPY bin/* /opt/bitnami/nginx/sbin/ + +USER root +RUN chmod +x /opt/bitnami/nginx/sbin/run.sh /opt/bitnami/nginx/sbin/opm.py +# By default, docker copies files with the permissions of the build user. To avoid cases where build user +# has 644 which can result in failure of certain commands +RUN chmod -R g+w /opt/bitnami/nginx/html/odlux && mkdir /app/init.d +RUN chmod 666 /opt/bitnami/nginx/conf/server_blocks/*.rules +#RUN chown 1001:1001 /app/odlux.application.list && chmod 777 /app/odlux.application.list +RUN chown -R 1001:1001 /app +RUN ln -s /opt/bitnami/nginx/sbin/opm.py /usr/local/bin/opm +USER 1001 +CMD [ "/opt/bitnami/nginx/sbin/run.sh" ] + diff --git a/distribution/oam-controller-web/src/main/resources/favicon.ico b/distribution/oam-controller-web/src/main/resources/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..650067ebaa707d0a3b2155cc6ab31bf11c120861 GIT binary patch literal 268322 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ⅆnUkXW8-^j=xD>R+ob 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%0AC0mRC$HuMGRC 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 I;CA}_FQ`l!JOBUy literal 0 HcmV?d00001 diff --git a/distribution/oam-controller-web/src/main/resources/http_custom.conf b/distribution/oam-controller-web/src/main/resources/http_custom.conf new file mode 100644 index 0000000..fd637dd --- /dev/null +++ b/distribution/oam-controller-web/src/main/resources/http_custom.conf @@ -0,0 +1,4 @@ +map $http_authorization $auth_header { + ~^Basic $http_authorization; + default "Bearer $cookie_token"; +} diff --git a/distribution/oam-controller-web/src/main/resources/http_site.conf b/distribution/oam-controller-web/src/main/resources/http_site.conf new file mode 100644 index 0000000..1fe4303 --- /dev/null +++ b/distribution/oam-controller-web/src/main/resources/http_site.conf @@ -0,0 +1,66 @@ +### +# ============LICENSE_START======================================================= +# ONAP : ccsdk distribution web +# ================================================================================ +# Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. +# All rights reserved. +# ================================================================================ +# 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. +# ============LICENSE_END========================================================= +### + +## +# You should look at the following URL's in order to grasp a solid understanding +# of Nginx configuration files in order to fully unleash the power of Nginx. +# https://www.nginx.com/resources/wiki/start/ +# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/ +# https://wiki.debian.org/Nginx/DirectoryStructure +# +# In most cases, administrators will remove this file from sites-enabled/ and +# leave it as reference inside of sites-available where it will continue to be +# updated by the nginx packaging team. +# +# This file will automatically load configuration files provided by other +# applications, such as Drupal or Wordpress. These applications will be made +# available underneath a path with that package name, such as /drupal8. +# +# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples. +## + +# Default server configuration +# +server { + listen WEBPORT default_server ; + listen [::]:WEBPORT default_server; + +# root /var/www; + + index index.html index.htm index.nginx-debian.html; + + server_name _; + + include server_blocks/location.rules; + + gzip on; + gzip_min_length 1000; + gzip_comp_level 5; + gzip_proxied any; + gzip_vary on; + gzip_types text/plain + application/json + application/xml + application/yang-data+json + application/yang-data+xml + text/javascript + application/javascript; +} diff --git a/distribution/oam-controller-web/src/main/resources/https_site.conf b/distribution/oam-controller-web/src/main/resources/https_site.conf new file mode 100644 index 0000000..734a48b --- /dev/null +++ b/distribution/oam-controller-web/src/main/resources/https_site.conf @@ -0,0 +1,85 @@ +### +# ============LICENSE_START======================================================= +# ONAP : ccsdk distribution web +# ================================================================================ +# Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. +# All rights reserved. +# ================================================================================ +# 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. +# ============LICENSE_END========================================================= +### + +## +# You should look at the following URL's in order to grasp a solid understanding +# of Nginx configuration files in order to fully unleash the power of Nginx. +# https://www.nginx.com/resources/wiki/start/ +# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/ +# https://wiki.debian.org/Nginx/DirectoryStructure +# +# In most cases, administrators will remove this file from sites-enabled/ and +# leave it as reference inside of sites-available where it will continue to be +# updated by the nginx packaging team. +# +# This file will automatically load configuration files provided by other +# applications, such as Drupal or Wordpress. These applications will be made +# available underneath a path with that package name, such as /drupal8. +# +# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples. +## + +# Default server configuration +# +server { + listen WEBPORT ssl default_server ; + listen [::]:WEBPORT ssl default_server; + + # SSL configuration + # + # listen 443 ssl default_server; + # listen [::]:443 ssl default_server; + # + # Note: You should disable gzip for SSL traffic. + # See: https://bugs.debian.org/773332 + # + # Read up on ssl_ciphers to ensure a secure configuration. + # See: https://bugs.debian.org/765782 + # + # Self signed certs generated by the ssl-cert package + # Don't use them in a production server! + # + # include snippets/snakeoil.conf; + + ssl_certificate SSL_CERT_DIR/SSL_CERTIFICATE; + ssl_certificate_key SSL_CERT_DIR/SSL_CERTIFICATE_KEY; + +# root /var/www; + + index index.html index.htm index.nginx-debian.html; + + server_name _; + + include server_blocks/location.rules; + + gzip on; + gzip_min_length 1000; + gzip_comp_level 5; + gzip_proxied any; + gzip_vary on; + gzip_types text/plain + application/json + application/xml + application/yang-data+json + application/yang-data+xml + text/javascript + application/javascript; +} diff --git a/distribution/oam-controller-web/src/main/resources/location.rules b/distribution/oam-controller-web/src/main/resources/location.rules new file mode 100644 index 0000000..0342e31 --- /dev/null +++ b/distribution/oam-controller-web/src/main/resources/location.rules @@ -0,0 +1,64 @@ +location ~ ^/$ { + return 301 " /odlux/index.html"; +} +location ~ ^/help/$ { + try_files /help/$args.json $uri; +} +location ~ ^/transportpce { + resolver DNS_INTERNAL_RESOLVER; + if ($request_uri ~* "/transportpce/(.*)") { + proxy_pass TRPCEURL/$1; + } +} +location ~ ^/topology/ { + resolver DNS_INTERNAL_RESOLVER; + proxy_pass TOPOURL; +} +location ~ ^/sitedoc/ { + resolver DNS_INTERNAL_RESOLVER; + if ($request_uri ~* "/sitedoc/(.*)") { + proxy_pass SITEDOCURL/topology/stadok/$1; + } +} +location ~ ^/tiles/ { + resolver DNS_RESOLVER; + if ($request_uri ~* "/tiles/(.*)") { + proxy_pass TILEURL/$1; + } +} +location ~ ^/terrain/ { + resolver DNS_INTERNAL_RESOLVER; + if ($request_uri ~* "/terrain/(.*)") { + proxy_pass TERRAINURL/$1; + } +} +location ~ ^/electromagnetic-field/ { + resolver DNS_RESOLVER; + proxy_set_header Authorization "Basic ELECTROMAGNETICFIELDBAUTHTOKEN"; + proxy_pass_header Authorization; + if ($request_uri ~* "/electromagnetic-field/(.*)") { + proxy_pass ELECTROMAGNETICFIELDURL/$1; + } +} +location / { + try_files $uri $uri/ @backend; +} +location /websocket { + proxy_pass http://SDNRHOST:SDNRWEBSOCKETPORT/websocket; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; +} +location /apidoc/ { + proxy_pass SDNRPROTOCOL://SDNRHOST:SDNRPORT; + + # Inject Authorization header + proxy_set_header Authorization $auth_header; + # + # Optional CORS settings + #add_header Access-Control-Allow-Origin *; + add_header Access-Control-Allow-Headers Authorization,Content-Type; +} +location @backend { + proxy_pass SDNRPROTOCOL://SDNRHOST:SDNRPORT; +} \ No newline at end of file diff --git a/distribution/oam-controller-web/src/main/resources/odlux.application.list b/distribution/oam-controller-web/src/main/resources/odlux.application.list new file mode 100644 index 0000000..c56559c --- /dev/null +++ b/distribution/oam-controller-web/src/main/resources/odlux.application.list @@ -0,0 +1,8 @@ +1 connectApp +10 faultApp +20 maintenanceApp +30 configurationApp +55 performanceHistoryApp +70 inventoryApp +75 eventLogApp +200 helpApp diff --git a/distribution/oam-controller-web/src/main/scripts/configure.py b/distribution/oam-controller-web/src/main/scripts/configure.py new file mode 100644 index 0000000..255cbcd --- /dev/null +++ b/distribution/oam-controller-web/src/main/scripts/configure.py @@ -0,0 +1,34 @@ +#!/bin/bash + +### +# ============LICENSE_START======================================================= +# ONAP : ccsdk distribution web +# ================================================================================ +# Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. +# All rights reserved. +# ================================================================================ +# 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. +# ============LICENSE_END========================================================= +### + +# load core methods to call +from core import * + +# Comment listening on 8080 in nginx.conf as we don't want nginx to listen on any port other than SDNR +sedInFile('listen','\#listen', '/opt/bitnami/nginx/conf/nginx.conf') +initial_load() +update_index_html() + +check_for_rule_template() + +update_nginx_site_conf() diff --git a/distribution/oam-controller-web/src/main/scripts/core.py b/distribution/oam-controller-web/src/main/scripts/core.py new file mode 100644 index 0000000..461f8cd --- /dev/null +++ b/distribution/oam-controller-web/src/main/scripts/core.py @@ -0,0 +1,358 @@ +### +# ============LICENSE_START======================================================= +# ONAP : ccsdk distribution web +# ================================================================================ +# Copyright (C) 2020 highstreet technologies GmbH Intellectual Property. +# All rights reserved. +# ================================================================================ +# 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. +# ============LICENSE_END========================================================= +### +import subprocess +import os +import json +import zipfile +import re +import uuid +import urllib3 +import shutil +import re +import ssl +urllib3.disable_warnings() + +APPLICATION_LISTFILE="/app/odlux.application.list" +INIT_FOLDER="/app/init.d" +ODLUX_BASE_FOLDER='/app/odlux' +INDEX_HTML=ODLUX_BASE_FOLDER+'/index.html' +INDEX_HTML_TEMPLATE=INDEX_HTML+'.template' +DEFAULT_APPLICATIONS=["connectApp" "faultApp" "maintenanceApp" "configurationApp" "performanceHistoryApp" "inventoryApp" "eventLogApp" "mediatorApp" "helpApp"] +http = urllib3.PoolManager(cert_reqs=ssl.CERT_NONE) + +def exec(command): + output = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE).stdout.read() + return output +def execToStdOut(commandArray): + process = subprocess.Popen(commandArray, shell=False) + process.communicate() + +def download(url, dst): + print("downloading from {}...".format(url),end="") + with open(dst, 'wb') as out_file: + resp= http.request('GET',url, preload_content=False) + shutil.copyfileobj(resp, out_file) + resp.release_conn() + print("done") + +def getEnv(key, defaultValue=None): + x=os.getenv(key) + return x if x is not None and len(x)>0 else defaultValue + +def sedInFile(old, nu, fn): + execToStdOut(['sed', '-i', 's|{}|{}|g'.format(old,nu),fn]) + +def add_application(name, index, file=None): + apps = load_applications() + if index==0: + print("no index given. put it to last position") + index=apps[len(apps)-1]['index']+10 + apps.append(dict(index=index,name=name)) + if file is not None and os.path.exists(file): + extract(file) + else: + print('unable to find file {}'.format(file)) + write_applications(apps) + print("{} installed on index {}".format(name, index)) + +def initial_load(): + files = os.listdir(INIT_FOLDER) + regex = r"([0-9]+)([a-zA-Z]+)\.(jar|zip)" + regexUrl = r"([0-9]+)([a-zA-Z]+)\.(url)" + for file in files: + matches = re.finditer(regex,file) + match = next(matches, None) + matchesUrl = re.finditer(regexUrl,file) + matchUrl = next(matchesUrl, None) + if match is not None: + print("installing {}".format(file)) + index = int(match.group(1)) + name = match.group(2) + add_application(name,index,INIT_FOLDER+'/'+file) + elif matchUrl is not None: + print("installing {}".format(file)) + index = int(match.group(1)) + name = match.group(2) + add_application(name,index,INIT_FOLDER+'/'+file) + else: + print("no index naming format found. try to autodetect") + infos = autoDetectInfosFromJar(file) + if infos is None: + print("unable to detect index and application name for {}".format(file)) + else: + add_application(infos['name'],infos['index'],INIT_FOLDER+'/'+file) + + + +def containsBlueprintExpression(file) -> bool: + print("check if file {} is blueprint".format(file)) + with open(file, 'r') as fp: + lines = fp.readlines() + for line in lines: + if "[^<]*<\/script>/