improve sdnc-web for external apps 98/126798/2
authorMichael DÜrre <michael.duerre@highstreet-technologies.com>
Thu, 27 Jan 2022 12:43:37 +0000 (13:43 +0100)
committerMichael DÜrre <michael.duerre@highstreet-technologies.com>
Thu, 27 Jan 2022 13:01:45 +0000 (14:01 +0100)
add package manager for more flexibility

Issue-ID: SDNC-1658
Signed-off-by: Michael DÜrre <michael.duerre@highstreet-technologies.com>
Change-Id: I30f4aaa24cf05fce212282b06d5e08437dbcfa8b
Signed-off-by: Michael DÜrre <michael.duerre@highstreet-technologies.com>
Former-commit-id: f41f011ff2e18befd77dd63ab828ea14aafac2a7

16 files changed:
installation/sdnc-web/README.md [new file with mode: 0644]
installation/sdnc-web/certs/cacert.pem [new file with mode: 0644]
installation/sdnc-web/certs/cert.pem [new file with mode: 0644]
installation/sdnc-web/certs/key.pem [new file with mode: 0644]
installation/sdnc-web/pom.xml
installation/sdnc-web/src/main/docker/Dockerfile
installation/sdnc-web/src/main/resources/favicon.ico [new file with mode: 0644]
installation/sdnc-web/src/main/resources/http_site.conf
installation/sdnc-web/src/main/resources/https_site.conf
installation/sdnc-web/src/main/resources/location.rules [new file with mode: 0644]
installation/sdnc-web/src/main/resources/odlux.application.list [new file with mode: 0644]
installation/sdnc-web/src/main/scripts/configure.py [new file with mode: 0644]
installation/sdnc-web/src/main/scripts/configure.sh [deleted file]
installation/sdnc-web/src/main/scripts/core.py [new file with mode: 0644]
installation/sdnc-web/src/main/scripts/opm.py [new file with mode: 0755]
installation/sdnc-web/src/main/scripts/run.sh

diff --git a/installation/sdnc-web/README.md b/installation/sdnc-web/README.md
new file mode 100644 (file)
index 0000000..d793b67
--- /dev/null
@@ -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. 55linkCalculationApp.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 linkCalculationApp 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/installation/sdnc-web/certs/cacert.pem b/installation/sdnc-web/certs/cacert.pem
new file mode 100644 (file)
index 0000000..0146e6b
--- /dev/null
@@ -0,0 +1,31 @@
+-----BEGIN CERTIFICATE-----
+MIIFPjCCAyagAwIBAgIJAJ6u7cCnzrWdMA0GCSqGSIb3DQEBCwUAMCwxDjAMBgNV\r
+BAsMBU9TQUFGMQ0wCwYDVQQKDARPTkFQMQswCQYDVQQGEwJVUzAeFw0xODA0MDUx\r
+NDE1MjhaFw0zODAzMzExNDE1MjhaMCwxDjAMBgNVBAsMBU9TQUFGMQ0wCwYDVQQK\r
+DARPTkFQMQswCQYDVQQGEwJVUzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC\r
+ggIBAMA5pkgRs7NhGG4ew5JouhyYakgYUyFaG121+/h8qbSdt0hVQv56+EA41Yq7\r
+XGie7RYDQK9NmAFF3gruE+6X7wvJiChp+Cyd7sFMnb65uWhxEdxWTM2BJFrgfzUn\r
+H8ZCxgaCo3XH4PzlKRy2LQQJEJECwl/RZmRCXijMt5e9h8XoZY/fKkKcZZUsWNCM\r
+pTo266wjvA9MXLmdgReRj0+vrCjrNqy+htwJDztoiHWiYPqT6o8EvGcgjNqjlZx7\r
+NUNf8MfLDByqKF6+wRbHv1GKjn3/Vijd45Fv8riyRYROiFanvbV6jIfBkv8PZbXg\r
+2VDWsYsgp8NAvMxK+iV8cO+Ck3lBI2GOPZbCEqpPVTYbLUz6sczAlCXwQoPzDIZY\r
+wYa3eR/gYLY1gP2iEVHORag3bLPap9ZX5E8DZkzTNTjovvLk8KaCmfcaUMJsBtDd\r
+ApcUitz10cnRyZc1sX3gE1f3DpzQM6t9C5sOVyRhDcSrKqqwb9m0Ss04XAS9FsqM\r
+P3UWYQyqDXSxlUAYaX892u8mV1hxnt2gjb22RloXMM6TovM3sSrJS0wH+l1nznd6\r
+aFXftS/G4ZVIVZ/LfT1is4StoyPWZCwwwly1z8qJQ/zhip5NgZTxQw4mi7ww35DY\r
+PdAQOCoajfSvFjqslQ/cPRi/MRCu079heVb5fQnnzVtnpFQRAgMBAAGjYzBhMB0G\r
+A1UdDgQWBBRTVTPyS+vQUbHBeJrBKDF77+rtSTAfBgNVHSMEGDAWgBRTVTPyS+vQ\r
+UbHBeJrBKDF77+rtSTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAN\r
+BgkqhkiG9w0BAQsFAAOCAgEAPx/IaK94n02wPxpnYTy+LVLIxwdq/kawNd6IbiMz\r
+L87zmNMDmHcGbfoRCj8OkhuggX9Lx1/CkhpXimuYsZOFQi5blr/u+v4mIbsgbmi9\r
+7j+cUHDP0zLycvSvxKHty51LwmaX9a4wkJl5zBU4O1sd/H9tWcEmwJ39ltKoBKBx\r
+c94Zc3iMm5ytRWGj+0rKzLDAXEWpoZ5bE5PLJauA6UDCxDLfs3FwhbS7uDggxYvf\r
+jySF5FCNET94oJ+m8s7VeHvoa8iPGKvXrIqdd7XDHnqJJlVKr7m9S0fMbyEB8ci2\r
+RtOXDt93ifY1uhoEtEykn4dqBSp8ezvNMnwoXdYPDvTd9uCAFeWFLVreBAWxd25h\r
+PsBTkZA5hpa/rA+mKv6Af4VBViYr8cz4dZCsFChuioVebe9ighrfjB//qKepFjPF\r
+CyjzKN1u0JKm/2x/ORqxkTONG8p3uDwoIOyimUcTtTMv42bfYD88RKakqSFXE9G+\r
+Z0LlaKABqfjK49o/tsAp+c5LoNlYllKhnetO3QAdraHwdmC36BhoghzR1jpX751A\r
+cZn2VH3Q4XKyp01cJNCJIrua+A+bx6zh3RyW6zIIkbRCbET+UD+4mr8WIcSE3mtR\r
+ZVlnhUDO4z9//WKMVzwS9Rh8/kuszrGFI1KQozXCHLrce3YP6RYZfOed79LXaRwX\r
+dYY=
+-----END CERTIFICATE-----
diff --git a/installation/sdnc-web/certs/cert.pem b/installation/sdnc-web/certs/cert.pem
new file mode 100644 (file)
index 0000000..1195a12
--- /dev/null
@@ -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: <No 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/installation/sdnc-web/certs/key.pem b/installation/sdnc-web/certs/key.pem
new file mode 100644 (file)
index 0000000..04bc849
--- /dev/null
@@ -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-----
+
index 8817c93..2724c7a 100644 (file)
@@ -59,7 +59,7 @@
                         <id>copy-dockerfile</id>
                         <goals>
                             <goal>copy-resources</goal>
-                        </goals>                        <!-- here the phase you need -->
+                        </goals>
                         <phase>validate</phase>
                         <configuration>
                             <outputDirectory>${basedir}/target/docker-stage</outputDirectory>
                         <id>copy-siteconf</id>
                         <goals>
                             <goal>copy-resources</goal>
-                        </goals>                        <!-- here the phase you need -->
+                        </goals>
                         <phase>validate</phase>
                         <configuration>
-                            <outputDirectory>${basedir}/target/docker-stage</outputDirectory>
+                            <outputDirectory>${basedir}/target/docker-stage/conf</outputDirectory>
                             <resources>
                                 <resource>
                                     <directory>src/main/resources</directory>
                                     <includes>
                                         <include>*.conf</include>
+                                        <include>*.rules</include>
                                     </includes>
                                     <filtering>true</filtering>
                                 </resource>
                             </resources>
                         </configuration>
                     </execution>
-
                     <execution>
                         <id>copy-scripts</id>
                         <goals>
                             <goal>copy-resources</goal>
-                        </goals>                        <!-- here the phase you need -->
+                        </goals>
                         <phase>validate</phase>
                         <configuration>
                             <outputDirectory>${basedir}/target/docker-stage/bin</outputDirectory>
                                     <directory>src/main/scripts</directory>
                                     <includes>
                                         <include>*.sh</include>
+                                        <include>*.py</include>
                                     </includes>
                                     <filtering>true</filtering>
                                 </resource>
                             </resources>
                         </configuration>
                     </execution>
+                    <execution>
+                        <id>copy-favicon</id>
+                        <goals>
+                            <goal>copy-resources</goal>
+                        </goals>
+                        <phase>validate</phase>
+                        <configuration>
+                            <outputDirectory>${basedir}/target/docker-stage/html</outputDirectory>
+                            <resources>
+                                <resource>
+                                    <directory>src/main/resources</directory>
+                                    <includes>
+                                        <include>favicon.ico</include>
+                                        <include>odlux.application.list</include>
+                                    </includes>
+                                    <filtering>false</filtering>
+                                </resource>
+                            </resources>
+                        </configuration>
+                    </execution>
                 </executions>
             </plugin>
             <plugin>
index a552137..9f3f687 100644 (file)
 # 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/
+COPY conf/* /opt/bitnami/nginx/conf/server_blocks/
 
 # setup environment variables
 ENV WEBPROTOCOL="HTTP" \
@@ -38,20 +40,25 @@ ENV WEBPROTOCOL="HTTP" \
     TRPCEURL="" \
     TOPOURL="" \
     TILEURL="" \
-    DNS_RESOLVER="1.1.1.1" \
+    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/*.sh /opt/bitnami/nginx/sbin/
+COPY bin/* /opt/bitnami/nginx/sbin/ 
 
 USER root
-RUN chmod +x /opt/bitnami/nginx/sbin/configure.sh /opt/bitnami/nginx/sbin/run.sh
+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
-
+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/installation/sdnc-web/src/main/resources/favicon.ico b/installation/sdnc-web/src/main/resources/favicon.ico
new file mode 100644 (file)
index 0000000..650067e
Binary files /dev/null and b/installation/sdnc-web/src/main/resources/favicon.ico differ
index ea6c33b..3d9ade1 100644 (file)
@@ -49,36 +49,5 @@ server {
 
     server_name _;
 
-    location ~ ^/$  {
-        return 301 /odlux/index.html;
-    }
-    location ~ ^/help/$  {
-        try_files /help/$args.json $uri;
-    }
-    location ~ ^/transportpce  {
-        if ($request_uri ~* "/transportpce/(.*)") { 
-            proxy_pass TRPCEURL/$1;
-        }
-    }
-    location ~ ^/topology  {
-        proxy_pass TOPOURL;
-    }
-    location ~ ^/tiles/  {
-        resolver DNS_RESOLVER;
-        if ($request_uri ~* "/tiles/(.*)") { 
-            proxy_pass TILEURL/$1;
-        }
-    }
-    location /  {
-        try_files $uri $uri/ @backend;
-    }
-    location /websocket {
-        proxy_pass SDNRPROTOCOL://SDNRHOST:SDNRPORT/websocket;
-        proxy_http_version 1.1;
-        proxy_set_header Upgrade $http_upgrade;
-        proxy_set_header Connection "upgrade";
-    }
-    location @backend {
-        proxy_pass SDNRPROTOCOL://SDNRHOST:SDNRPORT;
-    }
+    include server_blocks/location.rules;
 }
index 5e61fec..6dcfb79 100644 (file)
@@ -68,36 +68,6 @@ server {
 
     server_name _;
 
-    location ~ ^/$  {
-        return 301 /odlux/index.html;
-    }
-    location ~ ^/help/$  {
-        try_files /help/$args.json $uri;
-    }
-    location ~ ^/transportpce  {
-        if ($request_uri ~* "/transportpce/(.*)") { 
-            proxy_pass TRPCEURL/$1;
-        }
-    }
-    location ~ ^/topology  {
-        proxy_pass TOPOURL;
-    }
-    location ~ ^/tiles/  {
-        resolver DNS_RESOLVER;
-        if ($request_uri ~* "/tiles/(.*)") { 
-            proxy_pass TILEURL/$1;
-        }
-    }
-    location /  {
-        try_files $uri $uri/ @backend;
-    }
-    location /websocket {
-        proxy_pass SDNRPROTOCOL://SDNRHOST:SDNRPORT/websocket;
-        proxy_http_version 1.1;
-        proxy_set_header Upgrade $http_upgrade;
-        proxy_set_header Connection "upgrade";
-    }
-    location @backend {
-        proxy_pass SDNRPROTOCOL://SDNRHOST:SDNRPORT;
-    }
+    include server_blocks/location.rules;
+  
 }
diff --git a/installation/sdnc-web/src/main/resources/location.rules b/installation/sdnc-web/src/main/resources/location.rules
new file mode 100644 (file)
index 0000000..83120d6
--- /dev/null
@@ -0,0 +1,46 @@
+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 /  {
+    try_files $uri $uri/ @backend;
+}
+location /websocket {
+    proxy_pass SDNRPROTOCOL://SDNRHOST:SDNRPORT/websocket;
+    proxy_http_version 1.1;
+    proxy_set_header Upgrade $http_upgrade;
+    proxy_set_header Connection "upgrade";
+}
+location @backend {
+    proxy_pass SDNRPROTOCOL://SDNRHOST:SDNRPORT;
+}
\ No newline at end of file
diff --git a/installation/sdnc-web/src/main/resources/odlux.application.list b/installation/sdnc-web/src/main/resources/odlux.application.list
new file mode 100644 (file)
index 0000000..9176aae
--- /dev/null
@@ -0,0 +1,9 @@
+1 connectApp
+10 faultApp
+20 maintenanceApp
+30 configurationApp
+55 performanceHistoryApp
+70 inventoryApp
+75 eventLogApp
+90 mediatorApp
+200 helpApp
diff --git a/installation/sdnc-web/src/main/scripts/configure.py b/installation/sdnc-web/src/main/scripts/configure.py
new file mode 100644 (file)
index 0000000..255cbcd
--- /dev/null
@@ -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/installation/sdnc-web/src/main/scripts/configure.sh b/installation/sdnc-web/src/main/scripts/configure.sh
deleted file mode 100644 (file)
index a257e6e..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-#!/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=========================================================
-###
-
-# Comment listening on 8080 in nginx.conf as we don't want nginx to listen on any port other than SDNR
-sed -i 's/listen/\#listen/g' /opt/bitnami/nginx/conf/nginx.conf
-
-update_index_html() {
-    # Backup the index.html file
-    cp /opt/bitnami/nginx/html/odlux/index.html /opt/bitnami/nginx/html/odlux/index.html.backup
-    #default values
-    ODLUX_AUTH_METHOD="basic"
-    ENABLE_ODLUX_RBAC=${ENABLE_ODLUX_RBAC:-false}
-    
-    if [ "$ENABLE_OAUTH" == "true" ]; then
-        ODLUX_AUTH_METHOD="oauth"
-    fi
-    echo "authentication is $ODLUX_AUTH_METHOD"
-    echo "rbac access is enabled: $ENABLE_ODLUX_RBAC"
-    ODLUX_CONFIG='{"authentication":"'$ODLUX_AUTH_METHOD'","enablePolicy":'$ENABLE_ODLUX_RBAC'}'
-#    sed -z 's/<script>[^<]*<\/script>/<script>\n    \/\/ run the application \n  require\(\[\"connectApp\",\"faultApp\",\"maintenanceApp\",\"configurationApp\",\"performanceHistoryApp\",\"inventoryApp\",\"eventLogApp\",\"mediatorApp\",\"networkMapApp\",\"linkCalculationApp\",\"helpApp\",\"run\"\], function \(connectApp,faultApp,maintenanceApp,configurationApp,performanceHistoryApp,inventoryApp,eventLogApp,mediatorApp,networkMapApp,linkCalculationApp,helpApp,run\) \{ \n run.configure('$ODLUX_CONFIG'); \n    connectApp.register\(\); \n  faultApp.register\(\);\n    maintenanceApp.register\(\); \n     configurationApp.register\(\);\n    performanceHistoryApp.register\(\); \n    inventoryApp.register\(\);\n    eventLogApp.register\(\);\n   mediatorApp.register\(\);\n   networkMapApp.register\(\);\n   linkCalculationApp.register\(\);\n     helpApp.register\(\);\n      run.runApplication();\n    \}\);\n  <\/script>/' -i /opt/bitnami/nginx/html/odlux/index.html 
-
-    #replace require expression
-    sed -z 's/require(\["run"\],\ function\ (run)/require\(\[\"connectApp\",\"faultApp\",\"maintenanceApp\",\"configurationApp\",\"performanceHistoryApp\",\"inventoryApp\",\"eventLogApp\",\"mediatorApp\",\"networkMapApp\",\"linkCalculationApp\",\"helpApp\",\"run\"\], function \(connectApp,faultApp,maintenanceApp,configurationApp,performanceHistoryApp,inventoryApp,eventLogApp,mediatorApp,networkMapApp,linkCalculationApp,helpApp,run\)/' -i /opt/bitnami/nginx/html/odlux/index.html 
-    #replace run.runApplication expression
-    sed -z 's/run.runApplication();/connectApp.register\(\); \n  faultApp.register\(\);\n    maintenanceApp.register\(\); \n     configurationApp.register\(\);\n    performanceHistoryApp.register\(\); \n    inventoryApp.register\(\);\n    eventLogApp.register\(\);\n   mediatorApp.register\(\);\n   networkMapApp.register\(\);\n   linkCalculationApp.register\(\);\n     helpApp.register\(\);\n      run.runApplication();/' -i /opt/bitnami/nginx/html/odlux/index.html 
-    #replace run.configure expression if exists
-    sed -z 's/run.configureApplication([^)]\+)/run.configureApplication('$ODLUX_CONFIG');/' -i /opt/bitnami/nginx/html/odlux/index.html 
-
-}
-
-update_nginx_site_conf() {
-
-    if [ "$WEBPROTOCOL" == "HTTPS" ]
-    then
-        FN=/opt/bitnami/nginx/conf/server_blocks/https_site.conf
-        rm /opt/bitnami/nginx/conf/server_blocks/http_site.conf
-        
-        sed -i 's|SSL_CERT_DIR|'$SSL_CERT_DIR'|g' $FN
-        sed -i 's|\bSSL_CERTIFICATE\b|'$SSL_CERTIFICATE'|g' $FN
-        sed -i 's|\bSSL_CERTIFICATE_KEY\b|'$SSL_CERTIFICATE_KEY'|g' $FN
-
-    elif [ "$WEBPROTOCOL" == "HTTP" ]
-    then
-        FN=/opt/bitnami/nginx/conf/server_blocks/http_site.conf
-        rm /opt/bitnami/nginx/conf/server_blocks/https_site.conf
-       fi
-
-    if [ -z "$FN" ]; then
-        echo "unknown env WEBPROTOCOL: $WEBPROTOCOL"
-        exit 1
-    fi
-
-    # replace needed parameters
-    sed -i 's|WEBPORT|'$WEBPORT'|g' $FN
-    sed -i 's|SDNRPROTOCOL|'$SDNRPROTOCOL'|g' $FN
-    sed -i 's|SDNRHOST|'$SDNRHOST'|g' $FN
-    sed -i 's|SDNRPORT|'$SDNRPORT'|g' $FN
-    sed -i 's|DNS_RESOLVER|'$DNS_RESOLVER'|g' $FN
-
-    # handle optional parameters
-    if [ -z "$TRPCEURL" ]; then
-        echo "transportPCE forwarding disabled"
-        sed -i 's|proxy_pass TRPCEURL/$1;|return 404;|g' $FN
-    
-    else
-        sed -i 's|TRPCEURL|'$TRPCEURL'|g' $FN
-    fi
-    if [ -z "$TOPOURL" ]; then
-        echo "topology api forwarding disabled"
-        sed -i 's|proxy_pass TOPOURL;|return 404;|g' $FN
-    else
-        sed -i 's|TOPOURL|'$TOPOURL'|g' $FN
-    fi
-    if [ -z "$TILEURL" ]; then
-        echo "tile server forwarding disabled"
-        sed -i 's|proxy_pass TILEURL/$1;|return 404;|g' $FN
-    else
-        sed -i 's|TILEURL|'$TILEURL'|g' $FN
-    fi
-
-}
-
-update_index_html
-
-update_nginx_site_conf
diff --git a/installation/sdnc-web/src/main/scripts/core.py b/installation/sdnc-web/src/main/scripts/core.py
new file mode 100644 (file)
index 0000000..feb5734
--- /dev/null
@@ -0,0 +1,333 @@
+###
+# ============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)"
+    for file in files:
+        matches = re.finditer(regex,file)
+        match = next(matches, 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)
+        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 "<blueprint" in line:
+                return True
+        fp.close()
+    return False
+
+def findBlueprintXml(dir):
+    result = [os.path.join(dp, f) for dp, dn, filenames in os.walk(dir) for f in filenames if os.path.splitext(f)[1] == '.xml']
+    for file in result:
+        if containsBlueprintExpression(file):
+            return file
+    return None
+
+def autoDetectInfosFromJar(file):
+    print("autodetect infos(appName and index) from jar {}".format(file))
+    tmpDir=getRandomTempDir()
+    regexBundleName = r"<property[\ ]+name=\"bundleName\"[\ ]+value=\"([^\"]+)\""
+    regexIndex = r"<property[\ ]+name=\"index\"[\ ]+value=\"([^\"]+)\""
+    name=None
+    index=0
+    with zipfile.ZipFile(file, 'r') as zip_ref:
+        zip_ref.extractall(tmpDir)
+        blueprint = findBlueprintXml(tmpDir)
+        if blueprint is None:
+            return None
+        with open(blueprint) as fp:
+            lines = fp.readlines()
+            for line in lines:
+                if name is None:
+                    matches = re.finditer(regexBundleName, line)
+                    match = next(matches,None)
+                    if match is not None:
+                        name = match.group(1)
+                if index == 0:
+                    matches = re.finditer(regexIndex, line)
+                    match = next(matches,None)
+                    if match is not None:
+                        index = int(match.group(1))
+       
+            fp.close()
+    print("found infos from jar: name={} index={}".format(name,index))
+    return dict(index=index,name=name)
+        
+def getRandomTempDir(create=False):
+    while(True):
+        dir='/tmp/{}'.format(uuid.uuid4())
+        if not os.path.exists(dir):
+#            print("found random not-existing dir {}".format(dir))
+            if create:
+                os.makedirs(dir)
+            return dir
+#        print("dir {} already exists. try new".format(dir))
+    return None
+
+def getRandomTempFile():
+    dir = getRandomTempDir(True)
+    if dir is None:
+        return None
+
+    while True:
+        file='{}/{}.dat'.format(dir,uuid.uuid4())
+        if not os.path.exists(file):
+#            print("found random not-existing file {}".format(file))
+            return file
+#        print("file {} already exists. try new".format(file))
+    return None
+
+def extract(fn):
+
+    tmpDir=getRandomTempDir()  
+    with zipfile.ZipFile(fn, 'r') as zip_ref:
+        zip_ref.extractall(tmpDir)
+        exec(" ".join(['cp','-r',tmpDir+'/odlux/*',ODLUX_BASE_FOLDER+'/']))
+        zip_ref.close()
+
+
+def load_applications():
+    apps=[]
+    if os.path.exists(APPLICATION_LISTFILE):
+        with open(APPLICATION_LISTFILE,'r') as fp:
+            lines= fp.readlines()
+            for line in lines:
+                if len(line.rstrip())<=0:
+                    continue
+                try:
+                    hlp=line.split(' ')
+                    apps.append(dict(index=int(hlp[0]),name=hlp[1].rstrip()))
+                except:
+                    print('problem reading line {}'.format(line))
+            fp.close()
+    else:
+        index=10
+        for app in DEFAULT_APPLICATIONS:
+            apps.append(dict(index=index,name=app))
+            index+=10
+#    print('applications loaded={}'.format(apps))
+    return sorted(apps, key=lambda d: d['index']) 
+  
+def write_applications(apps):
+#    print('saving applications={}'.format(apps))
+    apps = sorted(apps, key=lambda d: d['index'])
+    os.remove(APPLICATION_LISTFILE)
+    with open(APPLICATION_LISTFILE,'w') as fp:
+        for app in apps:
+            fp.write('{} {}\n'.format(app['index'], app['name']))
+        fp.close()
+
+def update_index_html(apps=None):
+#     # Backup the index.html file
+    if not os.path.exists(INDEX_HTML_TEMPLATE):
+        execToStdOut(['cp',INDEX_HTML,INDEX_HTML_TEMPLATE])
+    else:
+        execToStdOut(['cp',INDEX_HTML_TEMPLATE,INDEX_HTML])
+#     #default values
+    if apps is None:
+        apps=load_applications()
+    ODLUX_AUTH_METHOD="basic"
+    ENABLE_ODLUX_RBAC=getEnv('ENABLE_ODLUX_RBAC','false')
+    TRPCEGUIURL=getEnv('TRPCEGUIURL')
+
+    if getEnv('ENABLE_OAUTH') == "true":
+        ODLUX_AUTH_METHOD="oauth"
+    ODLUX_CONFIG=dict(authentication=ODLUX_AUTH_METHOD,enablePolicy=ENABLE_ODLUX_RBAC == 'true')
+    print("authentication is {}".format(ODLUX_AUTH_METHOD))
+    print("rbac access is enabled: {}".format(ENABLE_ODLUX_RBAC))
+   
+    if TRPCEGUIURL is not None:
+        ODLUX_CONFIG['transportpceUrl']=TRPCEGUIURL
+        print("trpce gui url is: {}".format(TRPCEGUIURL))
+
+#    sed -z 's/<script>[^<]*<\/script>/<script>\n    \/\/ run the application \n  require\(\[\"connectApp\",\"faultApp\",\"maintenanceApp\",\"configurationApp\",\"performanceHistoryApp\",\"inventoryApp\",\"eventLogApp\",\"mediatorApp\",\"networkMapApp\",\"linkCalculationApp\",\"helpApp\",\"run\"\], function \(connectApp,faultApp,maintenanceApp,configurationApp,performanceHistoryApp,inventoryApp,eventLogApp,mediatorApp,networkMapApp,linkCalculationApp,helpApp,run\) \{ \n run.configure('$ODLUX_CONFIG'); \n    connectApp.register\(\); \n  faultApp.register\(\);\n    maintenanceApp.register\(\); \n     configurationApp.register\(\);\n    performanceHistoryApp.register\(\); \n    inventoryApp.register\(\);\n    eventLogApp.register\(\);\n   mediatorApp.register\(\);\n   networkMapApp.register\(\);\n   linkCalculationApp.register\(\);\n     helpApp.register\(\);\n      run.runApplication();\n    \}\);\n  <\/script>/' -i /opt/bitnami/nginx/html/odlux/index.html 
+    requireArg=""
+    fnArgs=""
+    appCalls=""
+    for app in apps:
+        requireArg+='"{}",'.format(app['name'])
+        fnArgs+='{},'.format(app['name'])
+        appCalls+='{}.register();\\n'.format(app['name'])
+    #replace require expression
+    execToStdOut(['sed', '-z', 's/require(\["run"\],\ function\ (run)/require\(\[{}\"run\"\], function \({}run\)/'.format(requireArg,fnArgs), '-i', INDEX_HTML]) 
+    #replace run.runApplication expression
+    execToStdOut(['sed','-z', 's/run.runApplication();/{}run.runApplication();/'.format(appCalls), '-i',INDEX_HTML])
+    #replace run.configure expression if exists
+    execToStdOut(['sed', '-z', 's|run.configureApplication([^)]\+)|run.configureApplication({});|'.format(json.dumps(ODLUX_CONFIG)), '-i', INDEX_HTML]) 
+  
+
+def check_for_rule_template():
+    if os.path.exists('/opt/bitnami/nginx/conf/server_blocks/location.rules.tmpl'):
+        print("using template for forwarding rules")
+        execToStdOut(['cp','/opt/bitnami/nginx/conf/server_blocks/location.rules.tmpl','/opt/bitnami/nginx/conf/server_blocks/location.rules'])
+
+def update_nginx_site_conf():
+    FN=None
+    if getEnv('WEBPROTOCOL') == "HTTPS":
+        FN='/opt/bitnami/nginx/conf/server_blocks/https_site.conf'
+        execToStdOut(['rm', '/opt/bitnami/nginx/conf/server_blocks/http_site.conf'])
+        SSL_CERT_DIR=getEnv('SSL_CERT_DIR')
+        SSL_CERTIFICATE=getEnv('SSL_CERTIFICATE')
+        SSL_CERTIFICATE_KEY=getEnv('SSL_CERTIFICATE_KEY')
+        sedInFile('SSL_CERTIFICATE_KEY',SSL_CERTIFICATE_KEY,FN)
+        sedInFile('SSL_CERT_DIR',SSL_CERT_DIR,FN)
+        sedInFile('SSL_CERTIFICATE',SSL_CERTIFICATE, FN)
+        
+    elif getEnv('WEBPROTOCOL') == "HTTP":
+        FN='/opt/bitnami/nginx/conf/server_blocks/http_site.conf'
+        execToStdOut(['rm', '/opt/bitnami/nginx/conf/server_blocks/https_site.conf'])
+
+    WEBPROTOCOL=getEnv('WEBPROTOCOL')
+    WEBPORT=getEnv('WEBPORT')
+    SDNRPROTOCOL=getEnv('SDNRPROTOCOL')
+    SDNRHOST=getEnv('SDNRHOST')
+    SDNRPORT=getEnv('SDNRPORT')
+    DNS_RESOLVER=getEnv('DNS_RESOLVER')
+    DNS_INTERNAL_RESOLVER=getEnv('DNS_INTERNAL_RESOLVER')
+    if FN is None:
+        print("unknown env WEBPROTOCOL: {}".format(WEBPROTOCOL))
+        exit(1)
+    
+    # replace needed base parameters
+    sedInFile('WEBPORT',WEBPORT,FN)
+
+    FN='/opt/bitnami/nginx/conf/server_blocks/location.rules'
+    # replace needed parameters in forwarding rules
+    sedInFile('WEBPORT',WEBPORT,FN)
+    sedInFile('SDNRPROTOCOL',SDNRPROTOCOL,FN)
+    sedInFile('SDNRHOST',SDNRHOST ,FN)
+    sedInFile('SDNRPORT',SDNRPORT,FN)
+    sedInFile('DNS_RESOLVER',DNS_RESOLVER ,FN)
+    sedInFile('DNS_INTERNAL_RESOLVER',DNS_INTERNAL_RESOLVER ,FN)
+
+    TRPCEURL=getEnv('TRPCEURL')
+    TOPOURL=getEnv('TOPOURL')
+    SITEDOCURL=getEnv('SITEDOCURL')
+    TILEURL=getEnv('TILEURL')
+    DATAPROVIDERURL=getEnv('DATAPROVIDERURL')
+    TERRAINURL=getEnv('TERRAINURL')
+    # handle optional parameters
+    if TRPCEURL is None:
+        print("transportPCE forwarding disabled")
+        sedInFile('proxy_pass TRPCEURL/$1;','return 404;',FN)
+    else:
+        sedInFile('TRPCEURL',TRPCEURL ,FN)
+
+    if TOPOURL is None:
+        print("topology api forwarding disabled")
+        sedInFile('proxy_pass TOPOURL;','return 404;',FN)
+    else:
+        sedInFile('TOPOURL',TOPOURL ,FN)
+    
+    if SITEDOCURL is None:
+        print("sitedoc api forwarding disabled")
+        sedInFile('proxy_pass SITEDOCURL/topology/stadok/$1;','return 404;', FN)
+    else:
+        sedInFile('SITEDOCURL',SITEDOCURL, FN)
+    
+    if TILEURL is None:
+        print("tile server forwarding disabled")
+        sedInFile('proxy_pass TILEURL/$1;','return 404;',FN)
+    else:
+        sedInFile('TILEURL',TILEURL ,FN)
+    
+    if DATAPROVIDERURL is None:
+        print("data provider forwarding disabled")
+        sedInFile('proxy_pass DATAPROVIDERURL/$1;','return 404;',FN)
+    else:
+        sedInFile('DATAPROVIDERURL',DATAPROVIDERURL ,FN)
+    
+    if TERRAINURL is None:
+        print("terrain server forwarding disabled")
+        sedInFile('proxy_pass TERRAINURL/$1;','return 404;',FN)
+    else:
+        sedInFile('TERRAINURL',TERRAINURL ,FN)
diff --git a/installation/sdnc-web/src/main/scripts/opm.py b/installation/sdnc-web/src/main/scripts/opm.py
new file mode 100755 (executable)
index 0000000..955822a
--- /dev/null
@@ -0,0 +1,126 @@
+#!/usr/bin/python3
+###
+# ============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=========================================================
+###
+
+# opm = ODLUX package manager
+# install odlux application inside of the container
+# $1 install|uninstall
+# $2 appName
+# $3 zip file to add(extract)
+
+import sys
+from core import *
+
+
+
+
+# install application
+# $1 appName
+# $2
+# $2 zip file (optional)
+def run_install(name, index=0, file=None):
+    if name is None:
+        error("no name given")
+    add_application(name, index, file)
+    update_index_html()
+
+
+# install application from url
+# $1 url
+# $2 name (optional)
+# $3 index (optional)
+def run_install_from_url(url, name=None, index=0):
+    if url is None:
+        error("no url given")
+    print("installing from url...")
+    localFile = getRandomTempFile()
+    download(url,localFile)
+    if (name is None) or (index==0):
+        infos = autoDetectInfosFromJar(localFile)
+        if infos is not None:
+            if name is None:
+                name = infos['name']
+            if index == 0:
+                index = infos['index']
+    add_application(name,index,localFile)
+
+# uninstall application
+# $1 appName
+def run_uninstall(name):
+    if name is None:
+        error("no name given")
+    apps = load_applications()
+    apps = [app for app in apps if app['name']!=name]
+    write_applications(apps)
+    update_index_html()
+    
+def run_list(args):
+    apps = load_applications()
+    print('installed apps') 
+    for app in apps:
+        print('{} {}'.format(app['index'],app['name']))
+    
+def print_help():
+    print("ODLUX package manager")
+    print("=====================")
+    print("usage:")
+    print(" opm.py install --name myApplication --index 23 --file app.zip")
+    print(" opm.py install --url https://link-to-my-odlux-application.jar")
+    print(" opm.py list")
+    print(" opm.py uninstall --name myApplication")
+
+def error(msg):
+    print('ERROR: {}'.format(msg))
+    exit(1)
+
+args = sys.argv
+args.pop(0)
+cmd = args.pop(0)
+name=None
+index=0
+file=None
+url=None
+while(len(args)>0):
+    x=args.pop(0)
+    if x=='--name':
+        name=args.pop(0) if len(args)>0 else error("no name given")
+    elif x=='--index':
+        index=int(args.pop(0)) if len(args)>0 else error("no index given")
+    elif x=='--file':
+        file=args.pop(0) if len(args)>0 else error("no file given")
+    elif x=='--url':
+        url=args.pop(0) if len(args)>0 else error("no file given")
+    
+print("command={} name={} index={} file={} url={}".format(cmd,name,index, file, url))
+       
+if cmd=='install':
+    if url is not None:
+        run_install_from_url(url, name, index)
+    else:
+        run_install(name,index,file)
+elif cmd=='uninstall':
+    run_uninstall(name)
+elif cmd=='list':
+    run_list(args)
+else:
+    print_help
+    exit(1)
+exit(0)
index c310837..3343faf 100644 (file)
 #============LICENSE_END=========================================================
 ###
  
-/opt/bitnami/nginx/sbin/configure.sh
+python3 /opt/bitnami/nginx/sbin/configure.py
 
 echo "starting sdnc-web"
-echo "================="
+echo "======================="
 echo " WEBPROTOCOL  : $WEBPROTOCOL"
 echo " WEBPORT      : $WEBPORT"
 echo " SDNRPROTOCOL : $SDNRPROTOCOL"
 echo " SDNRHOST     : $SDNRHOST"
 echo " SDNRPORT     : $SDNRPORT"
 echo " DNS_RESOLVER : $DNS_RESOLVER"
+echo " DNS_INTERNAL_RESOLVER : $DNS_INTERNAL_RESOLVER"
 echo " TRPCEURL     : $TRPCEURL"
+echo " TRPCEGUIURL  : $TRPCEGUIURL"
 echo " TOPOURL      : $TOPOURL"
 echo " TILEURL      : $TILEURL"
+echo " SITEDOCURL   : $SITEDOCURL"
+echo " TERRAINURL   : $TERRAINURL"
+echo "======================="
 if [ "$WEBPROTOCOL" == "HTTPS" ]; then
   echo " SSL_CERT_DIR : $SSL_CERT_DIR"
   echo -n " SSL_CERTIFICATE: $SSL_CERTIFICATE"
@@ -71,4 +76,4 @@ if [ ! -z "$DEBUG" ]; then
 fi
 
 # Call the base images' run.sh to start NGINX
-bash /run.sh
+bash /opt/bitnami/scripts/nginx/run.sh