From 246357858b7c921e96f1e4a81687e885190ee671 Mon Sep 17 00:00:00 2001 From: theBigBlase Date: Sat, 9 Dec 2023 16:10:01 -0500 Subject: [PATCH] init: docker file + openhab config files --- .gitignore | 3 + Makefile | 7 + docker-compose.yml | 23 + mqtt/rumqttd.toml | 118 ++++ openhab/openhab_conf/html/index.html | 5 + openhab/openhab_conf/html/readme.txt | 3 + openhab/openhab_conf/icons/classic/readme.txt | 6 + .../items/IFT605_SmartClothes.items | 38 ++ openhab/openhab_conf/items/readme.txt | 5 + openhab/openhab_conf/persistence/readme.txt | 5 + .../rules/IFT605_SmartClothes.rules | 175 ++++++ openhab/openhab_conf/rules/readme.txt | 5 + openhab/openhab_conf/scripts/readme.txt | 5 + openhab/openhab_conf/services/addons.cfg | 36 ++ openhab/openhab_conf/services/basicui.cfg | 23 + openhab/openhab_conf/services/readme.txt | 6 + openhab/openhab_conf/services/rrd4j.cfg | 10 + openhab/openhab_conf/services/runtime.cfg | 277 ++++++++++ openhab/openhab_conf/sitemaps/readme.txt | 5 + openhab/openhab_conf/sounds/barking.mp3 | Bin 0 -> 8776 bytes openhab/openhab_conf/sounds/doorbell.mp3 | Bin 0 -> 102399 bytes .../things/IFT605_SmartClothes.things | 62 +++ openhab/openhab_conf/things/readme.txt | 5 + openhab/openhab_conf/transform/de.map | 3 + openhab/openhab_conf/transform/en.map | 4 + openhab/openhab_conf/transform/readme.txt | 5 + .../jmx/acl/org/apache/karaf/bundle.config | 19 + .../jmx/acl/org/apache/karaf/config.config | 28 + .../felix/eventadmin/impl/EventAdmin.config | 9 + .../felix/fileinstall%007edeploy.config | 13 + .../apache/karaf/command/acl/bundle.config | 18 + .../apache/karaf/command/acl/config.config | 23 + .../apache/karaf/command/acl/feature.config | 8 + .../org/apache/karaf/command/acl/jaas.config | 5 + .../org/apache/karaf/command/acl/kar.config | 6 + .../karaf/command/acl/scope_bundle.config | 13 + .../org/apache/karaf/command/acl/shell.config | 8 + .../apache/karaf/command/acl/system.config | 9 + .../config/org/apache/karaf/features.config | 9 + .../org/apache/karaf/features/repos.config | 41 ++ .../config/org/apache/karaf/http.config | 3 + .../config/org/apache/karaf/jaas.config | 10 + .../config/org/apache/karaf/kar.config | 7 + .../config/org/apache/karaf/log.config | 6 + .../config/org/apache/karaf/shell.config | 13 + .../openhab_userdata/config/org/jupnp.config | 7 + .../config/org/openhab/addons.config | 3 + .../config/org/openhab/audio.config | 5 + .../config/org/openhab/autoupdate.config | 3 + .../config/org/openhab/basicui.config | 3 + ...c0ca031-fc00-41d8-8c46-4474cc442330.config | 6 + .../config/org/openhab/folder.config | 8 + .../config/org/openhab/rrd4j.config | 3 + .../config/org/openhab/runtime.config | 3 + .../config/org/openhab/services.config | 3 + .../config/org/openhab/startlevel.config | 8 + .../config/org/openhab/threadpool.config | 5 + .../config/org/openhab/voice.config | 5 + .../config/org/ops4j/pax/logging.config | 5 + .../config/org/ops4j/pax/url/mvn.config | 17 + .../config/org/ops4j/pax/web.config | 13 + ...pache_felix_cm_impl_DynamicBindings.config | 1 + .../openhab_userdata/config/profile.config | 112 ++++ openhab/openhab_userdata/etc/all.policy | 22 + .../etc/branding-ssh.properties | 12 + .../openhab_userdata/etc/branding.properties | 12 + .../openhab_userdata/etc/config.properties | 322 +++++++++++ .../openhab_userdata/etc/custom.properties | 10 + .../etc/custom.system.properties | 7 + .../openhab_userdata/etc/distribution.info | 26 + .../etc/equinox-debug.properties | 111 ++++ .../etc/java.util.logging.properties | 6 + openhab/openhab_userdata/etc/jetty-web.xml | 35 ++ openhab/openhab_userdata/etc/jetty.xml | 135 +++++ .../etc/jmx.acl.org.apache.karaf.bundle.cfg | 40 ++ .../etc/jmx.acl.org.apache.karaf.config.cfg | 54 ++ openhab/openhab_userdata/etc/jre.properties | 503 ++++++++++++++++++ openhab/openhab_userdata/etc/keys.properties | 36 ++ openhab/openhab_userdata/etc/keystore | Bin 0 -> 606 bytes openhab/openhab_userdata/etc/log4j2.xml | 135 +++++ ...pache.felix.eventadmin.impl.EventAdmin.cfg | 15 + .../org.apache.felix.fileinstall-deploy.cfg | 13 + .../org.apache.karaf.command.acl.bundle.cfg | 46 ++ .../org.apache.karaf.command.acl.config.cfg | 46 ++ .../org.apache.karaf.command.acl.feature.cfg | 28 + .../etc/org.apache.karaf.command.acl.jaas.cfg | 25 + .../etc/org.apache.karaf.command.acl.kar.cfg | 29 + ....apache.karaf.command.acl.scope_bundle.cfg | 33 ++ .../org.apache.karaf.command.acl.shell.cfg | 28 + .../org.apache.karaf.command.acl.system.cfg | 29 + .../etc/org.apache.karaf.features.cfg | 100 ++++ .../etc/org.apache.karaf.features.repos.cfg | 62 +++ .../etc/org.apache.karaf.features.xml | 22 + .../etc/org.apache.karaf.jaas.cfg | 48 ++ .../etc/org.apache.karaf.kar.cfg | 22 + .../etc/org.apache.karaf.log.cfg | 23 + .../etc/org.apache.karaf.shell.cfg | 152 ++++++ openhab/openhab_userdata/etc/org.jupnp.cfg | 3 + .../etc/org.openhab.audio.cfg | 2 + .../etc/org.openhab.voice.cfg | 2 + .../etc/org.ops4j.pax.logging.cfg | 1 + .../etc/org.ops4j.pax.url.mvn.cfg | 120 +++++ .../etc/org.ops4j.pax.web.cfg | 62 +++ .../openhab_userdata/etc/overrides.properties | 0 openhab/openhab_userdata/etc/profile.cfg | 119 +++++ .../etc/scripts/shell.colors.script | 40 ++ .../etc/scripts/shell.completion.script | 271 ++++++++++ .../openhab_userdata/etc/shell.init.script | 55 ++ .../openhab_userdata/etc/startup.properties | 20 + .../openhab_userdata/etc/system.properties | 162 ++++++ openhab/openhab_userdata/etc/users.properties | 33 ++ .../openhab_userdata/etc/version.properties | 11 + .../secrets/rsa_json_web_key.json | 1 + 113 files changed, 4381 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 docker-compose.yml create mode 100644 mqtt/rumqttd.toml create mode 100644 openhab/openhab_conf/html/index.html create mode 100644 openhab/openhab_conf/html/readme.txt create mode 100644 openhab/openhab_conf/icons/classic/readme.txt create mode 100644 openhab/openhab_conf/items/IFT605_SmartClothes.items create mode 100644 openhab/openhab_conf/items/readme.txt create mode 100644 openhab/openhab_conf/persistence/readme.txt create mode 100644 openhab/openhab_conf/rules/IFT605_SmartClothes.rules create mode 100644 openhab/openhab_conf/rules/readme.txt create mode 100644 openhab/openhab_conf/scripts/readme.txt create mode 100644 openhab/openhab_conf/services/addons.cfg create mode 100644 openhab/openhab_conf/services/basicui.cfg create mode 100644 openhab/openhab_conf/services/readme.txt create mode 100644 openhab/openhab_conf/services/rrd4j.cfg create mode 100644 openhab/openhab_conf/services/runtime.cfg create mode 100644 openhab/openhab_conf/sitemaps/readme.txt create mode 100644 openhab/openhab_conf/sounds/barking.mp3 create mode 100644 openhab/openhab_conf/sounds/doorbell.mp3 create mode 100644 openhab/openhab_conf/things/IFT605_SmartClothes.things create mode 100644 openhab/openhab_conf/things/readme.txt create mode 100644 openhab/openhab_conf/transform/de.map create mode 100644 openhab/openhab_conf/transform/en.map create mode 100644 openhab/openhab_conf/transform/readme.txt create mode 100644 openhab/openhab_userdata/config/jmx/acl/org/apache/karaf/bundle.config create mode 100644 openhab/openhab_userdata/config/jmx/acl/org/apache/karaf/config.config create mode 100644 openhab/openhab_userdata/config/org/apache/felix/eventadmin/impl/EventAdmin.config create mode 100644 openhab/openhab_userdata/config/org/apache/felix/fileinstall%007edeploy.config create mode 100644 openhab/openhab_userdata/config/org/apache/karaf/command/acl/bundle.config create mode 100644 openhab/openhab_userdata/config/org/apache/karaf/command/acl/config.config create mode 100644 openhab/openhab_userdata/config/org/apache/karaf/command/acl/feature.config create mode 100644 openhab/openhab_userdata/config/org/apache/karaf/command/acl/jaas.config create mode 100644 openhab/openhab_userdata/config/org/apache/karaf/command/acl/kar.config create mode 100644 openhab/openhab_userdata/config/org/apache/karaf/command/acl/scope_bundle.config create mode 100644 openhab/openhab_userdata/config/org/apache/karaf/command/acl/shell.config create mode 100644 openhab/openhab_userdata/config/org/apache/karaf/command/acl/system.config create mode 100644 openhab/openhab_userdata/config/org/apache/karaf/features.config create mode 100644 openhab/openhab_userdata/config/org/apache/karaf/features/repos.config create mode 100644 openhab/openhab_userdata/config/org/apache/karaf/http.config create mode 100644 openhab/openhab_userdata/config/org/apache/karaf/jaas.config create mode 100644 openhab/openhab_userdata/config/org/apache/karaf/kar.config create mode 100644 openhab/openhab_userdata/config/org/apache/karaf/log.config create mode 100644 openhab/openhab_userdata/config/org/apache/karaf/shell.config create mode 100644 openhab/openhab_userdata/config/org/jupnp.config create mode 100644 openhab/openhab_userdata/config/org/openhab/addons.config create mode 100644 openhab/openhab_userdata/config/org/openhab/audio.config create mode 100644 openhab/openhab_userdata/config/org/openhab/autoupdate.config create mode 100644 openhab/openhab_userdata/config/org/openhab/basicui.config create mode 100644 openhab/openhab_userdata/config/org/openhab/core/service/WatchService/4c0ca031-fc00-41d8-8c46-4474cc442330.config create mode 100644 openhab/openhab_userdata/config/org/openhab/folder.config create mode 100644 openhab/openhab_userdata/config/org/openhab/rrd4j.config create mode 100644 openhab/openhab_userdata/config/org/openhab/runtime.config create mode 100644 openhab/openhab_userdata/config/org/openhab/services.config create mode 100644 openhab/openhab_userdata/config/org/openhab/startlevel.config create mode 100644 openhab/openhab_userdata/config/org/openhab/threadpool.config create mode 100644 openhab/openhab_userdata/config/org/openhab/voice.config create mode 100644 openhab/openhab_userdata/config/org/ops4j/pax/logging.config create mode 100644 openhab/openhab_userdata/config/org/ops4j/pax/url/mvn.config create mode 100644 openhab/openhab_userdata/config/org/ops4j/pax/web.config create mode 100644 openhab/openhab_userdata/config/org_apache_felix_cm_impl_DynamicBindings.config create mode 100644 openhab/openhab_userdata/config/profile.config create mode 100644 openhab/openhab_userdata/etc/all.policy create mode 100644 openhab/openhab_userdata/etc/branding-ssh.properties create mode 100644 openhab/openhab_userdata/etc/branding.properties create mode 100644 openhab/openhab_userdata/etc/config.properties create mode 100644 openhab/openhab_userdata/etc/custom.properties create mode 100644 openhab/openhab_userdata/etc/custom.system.properties create mode 100644 openhab/openhab_userdata/etc/distribution.info create mode 100644 openhab/openhab_userdata/etc/equinox-debug.properties create mode 100644 openhab/openhab_userdata/etc/java.util.logging.properties create mode 100644 openhab/openhab_userdata/etc/jetty-web.xml create mode 100644 openhab/openhab_userdata/etc/jetty.xml create mode 100644 openhab/openhab_userdata/etc/jmx.acl.org.apache.karaf.bundle.cfg create mode 100644 openhab/openhab_userdata/etc/jmx.acl.org.apache.karaf.config.cfg create mode 100644 openhab/openhab_userdata/etc/jre.properties create mode 100644 openhab/openhab_userdata/etc/keys.properties create mode 100644 openhab/openhab_userdata/etc/keystore create mode 100644 openhab/openhab_userdata/etc/log4j2.xml create mode 100644 openhab/openhab_userdata/etc/org.apache.felix.eventadmin.impl.EventAdmin.cfg create mode 100644 openhab/openhab_userdata/etc/org.apache.felix.fileinstall-deploy.cfg create mode 100644 openhab/openhab_userdata/etc/org.apache.karaf.command.acl.bundle.cfg create mode 100644 openhab/openhab_userdata/etc/org.apache.karaf.command.acl.config.cfg create mode 100644 openhab/openhab_userdata/etc/org.apache.karaf.command.acl.feature.cfg create mode 100644 openhab/openhab_userdata/etc/org.apache.karaf.command.acl.jaas.cfg create mode 100644 openhab/openhab_userdata/etc/org.apache.karaf.command.acl.kar.cfg create mode 100644 openhab/openhab_userdata/etc/org.apache.karaf.command.acl.scope_bundle.cfg create mode 100644 openhab/openhab_userdata/etc/org.apache.karaf.command.acl.shell.cfg create mode 100644 openhab/openhab_userdata/etc/org.apache.karaf.command.acl.system.cfg create mode 100644 openhab/openhab_userdata/etc/org.apache.karaf.features.cfg create mode 100644 openhab/openhab_userdata/etc/org.apache.karaf.features.repos.cfg create mode 100644 openhab/openhab_userdata/etc/org.apache.karaf.features.xml create mode 100644 openhab/openhab_userdata/etc/org.apache.karaf.jaas.cfg create mode 100644 openhab/openhab_userdata/etc/org.apache.karaf.kar.cfg create mode 100644 openhab/openhab_userdata/etc/org.apache.karaf.log.cfg create mode 100644 openhab/openhab_userdata/etc/org.apache.karaf.shell.cfg create mode 100644 openhab/openhab_userdata/etc/org.jupnp.cfg create mode 100644 openhab/openhab_userdata/etc/org.openhab.audio.cfg create mode 100644 openhab/openhab_userdata/etc/org.openhab.voice.cfg create mode 100644 openhab/openhab_userdata/etc/org.ops4j.pax.logging.cfg create mode 100644 openhab/openhab_userdata/etc/org.ops4j.pax.url.mvn.cfg create mode 100644 openhab/openhab_userdata/etc/org.ops4j.pax.web.cfg create mode 100644 openhab/openhab_userdata/etc/overrides.properties create mode 100644 openhab/openhab_userdata/etc/profile.cfg create mode 100644 openhab/openhab_userdata/etc/scripts/shell.colors.script create mode 100644 openhab/openhab_userdata/etc/scripts/shell.completion.script create mode 100644 openhab/openhab_userdata/etc/shell.init.script create mode 100644 openhab/openhab_userdata/etc/startup.properties create mode 100644 openhab/openhab_userdata/etc/system.properties create mode 100644 openhab/openhab_userdata/etc/users.properties create mode 100644 openhab/openhab_userdata/etc/version.properties create mode 100644 openhab/openhab_userdata/secrets/rsa_json_web_key.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..88530cf --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +openhab/openhab_userdata/cache +openhab/openhab_userdata/logs +openhab/openhab_userdata/tmp diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..29ece41 --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ +.PHONY: all test clean build + +ID := $(shell id -u) +GID := $(shell id -g) + +all: + ID=$(ID) GID=$(GID) docker compose up -d diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..8af036c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,23 @@ +services: + mqtt: + image: "bytebeamio/rumqttd:0.18.0" + ports: + - 1883:1883 + - 1884:1884 + + openhab: + image: "openhab/openhab:4.0.3" + restart: always + network_mode: host + user: "${UID}:${GID}" + volumes: + - "/etc/localtime:/etc/localtime:ro" + - "./openhab/openhab_addons:/openhab/addons" + - "./openhab/openhab_conf:/openhab/conf" + - "./openhab/openhab_userdata:/openhab/userdata" + environment: + CRYPTO_POLICY: "unlimited" + EXTRA_JAVA_OPTS: "-Duser.timezone=Canada/Eastern" + OPENHAB_HTTP_PORT: "8080" + OPENHAB_HTTPS_PORT: "8043" + diff --git a/mqtt/rumqttd.toml b/mqtt/rumqttd.toml new file mode 100644 index 0000000..ecc741e --- /dev/null +++ b/mqtt/rumqttd.toml @@ -0,0 +1,118 @@ +id = 0 + +# A commitlog read will pull full segment. Make sure that a segment isn't +# too big as async tcp writes readiness of one connection might affect tail +# latencies of other connection. Not a problem with preempting runtimes +[router] +id = 0 +max_connections = 10010 +max_outgoing_packet_count = 200 +max_segment_size = 104857600 +max_segment_count = 10 +# shared_subscriptions_strategy = "random" # "sticky" | "roundrobin" ( default ) | "random" +# Any filters that match to configured filter will have custom segment size. + # [router.custom_segment.'/office/+/devices/status'] + # max_segment_size = 102400 + # max_segment_count = 2 + # [router.custom_segment.'/home/+/devices/status'] + # max_segment_size = 51200 + # max_segment_count = 2 + +# [bridge] +# name = "bridge-1" +# addr = "localhost:1883" +# qos = 0 +# sub_path = "#" +# reconnection_delay = 5 +# ping_delay = 5 +# timeout_delay = 5 +# [bridge.connections] +# connection_timeout_ms = 60000 +# max_payload_size = 20480 +# max_inflight_count = 500 +# dynamic_filters = true +# [bridge.transport.tls] +# ca = "ca.cert.pem" +# client_auth = { certs = "test-1.cert.pem", key = "test-1.key.pem" } + +# Configuration of server and connections that it accepts +[v4.1] +name = "v4-1" +listen = "0.0.0.0:1883" +next_connection_delay_ms = 1 + [v4.1.connections] + connection_timeout_ms = 60000 + max_payload_size = 20480 + max_inflight_count = 100 + dynamic_filters = true + # auth = { user1 = "p@ssw0rd", user2 = "password" } + # [v4.1.connections.auth] + # user1 = "p@ssw0rd" + # user2 = "password" + +# [v4.2] +# name = "v4-2" +# listen = "0.0.0.0:8883" +# next_connection_delay_ms = 10 +# # tls config for rustls +# [v4.2.tls] +# capath = "/etc/tls/ca.cert.pem" +# certpath = "/etc/tls/server.cert.pem" +# keypath = "/etc/tls/server.key.pem" +# # settings for all the connections on this server +# [v4.2.connections] +# connection_timeout_ms = 60000 +# throttle_delay_ms = 0 +# max_payload_size = 20480 +# max_inflight_count = 100 +# max_inflight_size = 1024 + +[v5.1] +name = "v5-1" +listen = "0.0.0.0:1884" +next_connection_delay_ms = 1 + [v5.1.connections] + connection_timeout_ms = 60000 + max_payload_size = 20480 + max_inflight_count = 100 + +[prometheus] +listen = "127.0.0.1:9042" +interval = 1 + +[ws.1] +name = "ws-1" +listen = "0.0.0.0:8083" +next_connection_delay_ms = 1 + [ws.1.connections] + connection_timeout_ms = 60000 + max_client_id_len = 256 + throttle_delay_ms = 0 + max_payload_size = 20480 + max_inflight_count = 500 + max_inflight_size = 1024 + +# [ws.2] +# name = "ws-2" +# listen = "0.0.0.0:8081" +# next_connection_delay_ms = 1 +# [ws.2.tls] +# capath = "/etc/tls/ca.cert.pem" +# certpath = "/etc/tls/server.cert.pem" +# keypath = "/etc/tls/server.key.pem" +# [ws.2.connections] +# connection_timeout_ms = 60000 +# max_client_id_len = 256 +# throttle_delay_ms = 0 +# max_payload_size = 20480 +# max_inflight_count = 500 +# max_inflight_size = 1024 + +[console] +listen = "0.0.0.0:3030" + +# [metrics] +# [metrics.alerts] +# push_interval = 1 +# [metrics.meters] +# push_interval = 1 diff --git a/openhab/openhab_conf/html/index.html b/openhab/openhab_conf/html/index.html new file mode 100644 index 0000000..58ba0e9 --- /dev/null +++ b/openhab/openhab_conf/html/index.html @@ -0,0 +1,5 @@ + +

openHAB user provided static content

+

Serve your own static html pages or resources from here. Files stored in the openHAB configuration subfolder html will be available through the HTTP server of openHAB, e.g. http://device-address:8080/static/image.png.

+

Resources for sitemap elements (image, video,...) can also be provided though this folder.

+ diff --git a/openhab/openhab_conf/html/readme.txt b/openhab/openhab_conf/html/readme.txt new file mode 100644 index 0000000..5eeeb99 --- /dev/null +++ b/openhab/openhab_conf/html/readme.txt @@ -0,0 +1,3 @@ +Serve your own static html pages or resources from here. +Files stored in this folder will be available through the HTTP server of openHAB, e.g. "http://device-address:8080/static/image.png". +Resources for sitemap elements (image, video,...) can also be provided though this folder. diff --git a/openhab/openhab_conf/icons/classic/readme.txt b/openhab/openhab_conf/icons/classic/readme.txt new file mode 100644 index 0000000..7fc793f --- /dev/null +++ b/openhab/openhab_conf/icons/classic/readme.txt @@ -0,0 +1,6 @@ +Your additional icons go here. +Icons can be provided as png (32x32) or preferably as svg files. +ClassicUI and BasicUI can be configured to accept svg (default) or png icons. + +Check out the openHAB documentation for more details: +https://www.openhab.org/docs/configuration/items.html#icons diff --git a/openhab/openhab_conf/items/IFT605_SmartClothes.items b/openhab/openhab_conf/items/IFT605_SmartClothes.items new file mode 100644 index 0000000..c939242 --- /dev/null +++ b/openhab/openhab_conf/items/IFT605_SmartClothes.items @@ -0,0 +1,38 @@ + +Group Room +Group SmartClothes + +Group Sensors +Group:Number:AVG Luminance "average luminosity" (Sensors) +Group:Number:AVG Noise "average noise" (Sensors) + +Group Actuators +Group Lights (Actuators) + +Group Batteries + +Contact room1 "room 1" + +// Room fixed devices +Number rfidReader "RFID reader" (Sensors, Room) {channel="rfidReader:device:reader1"} + +// smart clothes, mobile devices +Color stripColor "el-wire" (Lights, SmartClothes) {channel="elwire:0210:ewbridge:strip1"} +Dimmer stripIntensity "el-wire" (Lights, SmartClothes) {channel="elwire:0210:ewbridge:strip1"} + +Color stripColor2 "el-wire" (Lights, SmartClothes) {channel="elwire:0210:ewbridge:strip2"} +Dimmer stripIntensity2 "el-wire" (Lights, SmartClothes) {channel="elwire:0210:ewbridge:strip2"} + +Switch vibrationPatch "vibration patch" (Actuators, SmartClothes) {channel="vibrationPatch:device:vibration"} + +Number luminance "luminance level" (Luminance, Sensors, SmartClothes) {channel=zwave:device:luxmeter:node2:sensor_luminance"} +Number luxmeterBattery "luxmeter battery level" (Batteries, SmartClothes) {channel="zwave:device:luxmeter:node2:battery-level"} + +Number noise "noise level" (Noise, Sensors, SmartClothes) {channel="Channel=“zwave:device:noisemeter:node3:sensor_noise”"} +Number noiseSensorBattery "noise sensor battery level" (Batteries, SmartClothes) {channel="zwave:device:noisemeter:node3:battery-level"} + +// optionnel +Number luminanceWristBand "luminance level" (Sensors, SmartClothes) {channel="zwave:device:wristband:node4:luminance"} +Number noiseWristBand "noise level" (Sensors, SmartClothes) {channel="zwave:device:wristband:node4:luminance"} +Contact gsrWristBand "galvanic skin response level" (Sensors, SmartClothes) {channel=“zwave:device:wristband:node4:galvanicSkinResponse"} +Switch vibrationWristBand "noise level" (Actuators, SmartClothes) {channel="zwave:device:wristband:node4:vibration"} diff --git a/openhab/openhab_conf/items/readme.txt b/openhab/openhab_conf/items/readme.txt new file mode 100644 index 0000000..b214510 --- /dev/null +++ b/openhab/openhab_conf/items/readme.txt @@ -0,0 +1,5 @@ +Your item definitions go here. +All items files have to have the ".items" file extension and must follow a special syntax. + +Check out the openHAB documentation for more details: +https://www.openhab.org/docs/configuration/items.html diff --git a/openhab/openhab_conf/persistence/readme.txt b/openhab/openhab_conf/persistence/readme.txt new file mode 100644 index 0000000..b1df35b --- /dev/null +++ b/openhab/openhab_conf/persistence/readme.txt @@ -0,0 +1,5 @@ +Your persistence configuration goes here. +All persistence files have to have the ".persist" file extension and must follow a special syntax. + +Check out the openHAB documentation for more details: +https://www.openhab.org/docs/configuration/persistence.html diff --git a/openhab/openhab_conf/rules/IFT605_SmartClothes.rules b/openhab/openhab_conf/rules/IFT605_SmartClothes.rules new file mode 100644 index 0000000..26abcc6 --- /dev/null +++ b/openhab/openhab_conf/rules/IFT605_SmartClothes.rules @@ -0,0 +1,175 @@ +import org.eclipse.smarthome.model.script.ScriptServiceUtil +// import org.eclipse.smarthome.core.library.items.StringItem +import java.util.HashMap +import java.util.HashSet + +val TAG_FileName = "IFT605SmartClothes.rules" +val smartClothesID = "12345678" + +var Contact currentRoom +var MQTTBroker currentMQTTBroker + +// managing context +var boolean goodConditions = true // of course, only one of good/bad conditions is required +var boolean badConditions = false +var badConditionsStartTime = 0 // in milliseconds +val URGE_TO_CHANGE_ROOM_TIME_TRIGGER = 300000 // 5 minutes + +// managing people in the room +var people = new HashSet() +var luminanceMeasures = new HashMap() +var noiseMeasures = new HashMap() + +// j'entre dans une pièce +val iEnter = [ ContactItem room, String smartClothesID, MQTTBroker broker | + broker.sendCommand(CONNECT); + broker.sendCommand(SUBSCRIBE, "room/1/#"); + broker.sendCommand(SUBSCRIBE, "smartclothes/#"); + broker.sendCommand(SUBSCRIBE, "room/1/tag/+"); + broker.sendCommand(SUBSCRIBE, "smartclothes/+/sensor/luminance"); + broker.sendCommand(SUBSCRIBE, "smartclothes/+/sensor/noise"); + // informer que l'on vient d'entrer dans la pièce + broker.sendCommand(PUBLISH, smartClothesID+"/status", "Online") + vibrationPatch.sendCommand(OFF) +] + +// je sors de une pièce +val iQuit = [ ContactItem room, String smartClothesID, MQTTBroker broker | + broker.sendCommand(UNSUBSCRIBE, "room/1/#"); + broker.sendCommand(UNSUBSCRIBE, "smartclothes/#"); + broker.sendCommand(UNSUBSCRIBE, "room/1/tag/+"); + broker.sendCommand(UNSUBSCRIBE, "smartclothes/+/sensor/luminance"); + broker.sendCommand(UNSUBSCRIBE, "smartclothes/+/sensor/noise"); + // informer que l'on vient d'entrer dans la pièce + broker.sendCommand(PUBLISH, smartClothesID+"/status", "Offline") +] +// le vêtement entre dans une pièce +val someoneEnterInRoom = [ String smartClothesID | + people.add(smartClothesID) +] + +val someoneQuitRoom = [ String smartClothesID | + people.remove(smartClothesID) + noiseMeasures.remove(smartClothesID) + luminanceMeasures.remove(smartClothesID) +] + +// fonctions utilitaires pour la gestion du contexte +// autre solutions pour calculer les moyennes, utiliser les HashMap luminanceMeasures et noiseMeasures +val Integer averageLuminance = [ | Luminance.state +] + +val Integer averagenoise = [ | Noise.state +] + +val boolean checkGoodConditions = [ Integer roomLuminance, Integer roomNoise | + return (LUMINOSITE_MIN < roomLuminance || roomLuminance < LUMINOSITE_MAX) + && (NIVEAU_SONORE_MIN < roomNoise || roomNoise < NIVEAU_SONORE_MAX) +] + +val reactToNewConditions = [ | + goodConditions = checkGoodConditions(averageLuminance(), averageNoise()) + badConditions = !goodConditions + if (goodConditions) { + badConditionsStartTime = 0 + vibrationPatch.sendCommand(OFF) + // rapprocher l'éclairage de la valeur optimale + if (Luminance.state < LUMOINOSITE_OPTIMALE) { + stripIntensity.sendCommand(INCREASE) + } else { + stripIntensity.sendCommand(DECREASE) + } + } else { + // Éviter de rester trop longtemps dans des conditions défavorables + vibrationPatch.sendCommand(ON) + if (badConditionsStartTime == 0){ + badConditionsStartTime = now.getMillis(); + } + if (now.getMillis() - badConditionsStartTime > URGE_TO_CHANGE_ROOM_TIME_TRIGGER) { + vibrationPatch.sendCommand(ON) + } + } +] + + + +rule "Démarrage de openHAB" +when + System started +then + logInfo(TAG_FileName, "Rule : Démarrage de openHAB") + currentRoom = room1 + currentMQTTBroker = room1MQTT + iEnter(currentRoom, smartClothesID, currentMQTTBroker) +end + +// Diffuser les mesures de ses capteurs aux autres vêtements intelligents +rule "lecture d'une mesure de luminosité par le capteur du vêtement" +when + // Item luminance received update + Member of Luminance received update +then + var sensorName = triggeringItem.name + var value = triggeringItem.state + currentMQTTBroker.sendCommand(PUBLISH, "smartclothes/"+smartClothesID+"/sensor/luminance", value) + +end + +rule "lecture d'une mesure de bruit par le capteur du vêtement" +when + // Item noise received update + Member of Noise received update +then + var sensorName = triggeringItem.name + var value = triggeringItem.state + currentMQTTBroker.sendCommand(PUBLISH, "smartclothes/"+smartClothesID+"/sensor/noise", value) +end + +// Gérer son contexte ambiant + +rule "nouvelle mesure de bruit publiée par le courtier MQTT" +when currentMQTTBroker "smartclothes/+/sensor/noise" changed +then + noiseMeasures.put(extractID(triggeringItem.newState.topic), trigerringItem.newState.value) + reactToNewConditions() +end + +rule "nouvelle mesure de bruit publiée par le courtier MQTT" +when currentMQTTBroker "smartclothes/+/sensor/luminance" changed +then + luminanceMeasures.put(extractID(triggeringItem.newState.topic), trigerringItem.newState.value) + reactToNewConditions() +end + +// Tenir compte des arrivées et départs de personnes dans la salle +rule "arrivée d'une personne" +when + // si on n'utilise pas le mécanisme des dernières volontés de MQTT, + // il faut surveiller les éléments pertinents à la main + // currentMQTTBroker "room/+/tag" changed //lecture d'un tag RFID + // or currentMQTTBroker "smartclothes/+/sensor/luminance" changed // member of Luminance changed + // or currentMQTTBroker "smartclothes/+/sensor/noise" changed + currentMQTTBroker "+/status " changed to "Online" //lecture d'un tag RFID + +then + String triggeringSmartClothesID = extractID(triggeringItem.newState.topic) + someoneEnterInRoom(triggeringSmartClothesID) +end + +// Tenir compte des arrivées et départs de personnes dans la salle +rule "départ d'une personne" +when + currentMQTTBroker "+/status " changed to "Offline" //lecture d'un tag RFID +then + String triggeringSmartClothesID = extractID(triggeringItem.newState.topic) + someoneQuitRoom(triggeringSmartClothesID) +end + +rule "Arrêt de openHAB" +when + System shuts down +then + logInfo(TAG_FileName, " Rule : Arrêt de openHAB") + // sauvegarder les états des items et le contexte + iQuit(currentRoom, smartClothesID, currentMQTTBroker) +end diff --git a/openhab/openhab_conf/rules/readme.txt b/openhab/openhab_conf/rules/readme.txt new file mode 100644 index 0000000..f7952e1 --- /dev/null +++ b/openhab/openhab_conf/rules/readme.txt @@ -0,0 +1,5 @@ +Your rules go here. +All rule files have to have the ".rules" file extension and must follow a special syntax. + +Check out the openHAB documentation for more details: +https://www.openhab.org/docs/configuration/rules-dsl.html diff --git a/openhab/openhab_conf/scripts/readme.txt b/openhab/openhab_conf/scripts/readme.txt new file mode 100644 index 0000000..0faff68 --- /dev/null +++ b/openhab/openhab_conf/scripts/readme.txt @@ -0,0 +1,5 @@ +Your scripts go here. +All script files have to have the ".script" file extension and must follow a special syntax. + +Check out the openHAB documentation for more details: +https://www.openhab.org/docs/configuration/rules-dsl.html#scripts diff --git a/openhab/openhab_conf/services/addons.cfg b/openhab/openhab_conf/services/addons.cfg new file mode 100644 index 0000000..87e8dbb --- /dev/null +++ b/openhab/openhab_conf/services/addons.cfg @@ -0,0 +1,36 @@ +# Access Remote Add-on Repository +# Defines whether the remote openHAB add-on repository should be used for browsing and installing add-ons. (default is true) +# +#remote = true + +# Some add-on services may provide add-ons where compatibility with the currently running system is not expected. +# Enabling this option will include these entries in the list of available add-ons. +# +#includeIncompatible = false + +# The add-on configuration in the lists below is applied EVERY TIME openHAB is started. +# Add-ons installed using the UI that do not occur in the lists will be uninstalled each startup. +# When lists are commented again any add-ons in the list remain installed and are not removed. +# So if you want to uninstall all add-ons part of a list, first remove all add-ons from it, restart +# openHAB and then comment the list. + +# A comma-separated list of automation services to install (e.g. "automation = groovyscripting") +#automation = + +# A comma-separated list of bindings to install (e.g. "binding = knx,sonos,zwave") +#binding = + +# A comma-separated list of miscellaneous services to install (e.g. "misc = openhabcloud") +#misc = + +# A comma-separated list of persistence services to install (e.g. "persistence = jpa,rrd4j") +#persistence = + +# A comma-separated list of transformation services to install (e.g. "transformation = jsonpath,map") +#transformation = + +# A comma-separated list of UIs to install (e.g. "ui = basic,habpanel") +#ui = + +# A comma-separated list of voice services to install (e.g. "voice = googletts,marytts") +#voice = diff --git a/openhab/openhab_conf/services/basicui.cfg b/openhab/openhab_conf/services/basicui.cfg new file mode 100644 index 0000000..6c91e62 --- /dev/null +++ b/openhab/openhab_conf/services/basicui.cfg @@ -0,0 +1,23 @@ +# Defines the UI theme. +# +#theme=default + +# Defines whether UI renders icons for the widgets or not. +# +#enableIcons=true + +# When enabled, changes the layout so that more widgets can fit on the screen. +# +#condensedLayout=false + +# Displays all widget states in uppercase. +# +#capitalizeValues=false + +# Play audio sent to the web audio sink. +# +#webAudio=false + +# The sitemap to show if no parameter is passed. +# +#defaultSitemap= diff --git a/openhab/openhab_conf/services/readme.txt b/openhab/openhab_conf/services/readme.txt new file mode 100644 index 0000000..62ba811 --- /dev/null +++ b/openhab/openhab_conf/services/readme.txt @@ -0,0 +1,6 @@ +Your service configurations will reside here. +All configuration files have to have the ".cfg" file extension. +Service configuration files are automatically created as soon as you install an add-on that can be configured. + +Check out the openHAB documentation for more details: +https://www.openhab.org/docs/configuration/services.html diff --git a/openhab/openhab_conf/services/rrd4j.cfg b/openhab/openhab_conf/services/rrd4j.cfg new file mode 100644 index 0000000..cd8d75b --- /dev/null +++ b/openhab/openhab_conf/services/rrd4j.cfg @@ -0,0 +1,10 @@ +# configure specific rrd properties for given items in this file. +# please refer to the documentation available at +# https://www.openhab.org/addons/persistence/rrd4j/ +# +# default_numeric and default_other are internally defined defnames and are used as +# defaults when no other defname applies + +#.def=[ABSOLUTE|COUNTER|DERIVE|GAUGE],,[|U],[|U], +#.archives=[AVERAGE|MIN|MAX|LAST|FIRST|TOTAL],,, +#.items= diff --git a/openhab/openhab_conf/services/runtime.cfg b/openhab/openhab_conf/services/runtime.cfg new file mode 100644 index 0000000..dcabe47 --- /dev/null +++ b/openhab/openhab_conf/services/runtime.cfg @@ -0,0 +1,277 @@ +#################################### LOCALE #################################### + +# The default language that should be used. If not specified, the system default locale is used. +# The ISO 639 alpha-2 or alpha-3 language code (if there is no alpha-2 one). +# Example: "en" (English), "de" (German), "ja" (Japanese), "kok" (Konkani) +# +#org.openhab.i18n:language= + +# The region that should be used. +# ISO 3166 alpha-2 country code or UN M.49 numeric-3 area code. +# Example: "US" (United States), "DE" (Germany), "FR" (France), "029" (Caribbean) +# +#org.openhab.i18n:region= + +# A time zone can be set from the user interface. The underlying system's time zone is the default. +# +#org.openhab.i18n:timezone= + +# The location of this installation. +# Coordinates as ,[] +# Example: "52.5200066,13.4049540" (Berlin) +# +#org.openhab.i18n:location= + +# The measurement system is used for unit conversion. +# 2 values are accepted: +# - SI: Metric +# - US: Imperial (US) +# +#org.openhab.i18n:measurementSystem= + + +################################# PERSISTENCE ################################## + +# The persistence service to use if no other is specified. +# +#org.openhab.persistence:default= + + +#################################### AUDIO ##################################### + +# This parameter defines the default audio source to use (if not set, the first available one will be used. +# +#org.openhab.audio:defaultSource= + +# This parameter defines the default audio sink to use (if not set, the first available one will be used. +# +#org.openhab.audio:defaultSink= + + +#################################### VOICE ##################################### + +# This parameter defines the default text-to-speech service to use (if not set, the first available one will be used. +# +#org.openhab.voice:defaultTTS= + +# This parameter defines the default speech-to-text service to use (if not set, the first available one will be used. +# +#org.openhab.voice:defaultSTT= + +# The default voice to use if no specific TTS service or voice is specified. +# +#org.openhab.voice:defaultVoice= + +# The default human language interpreter to use if no other is specified. +# +#org.openhab.voice:defaultHLI= + +# The default keyword spotting service to use if no other is specified. +# +#org.openhab.voice:defaultKS= + +# The magic word to spot before initiating a dialog. +# +#org.openhab.voice:keyword= + +# If provided, the item will be switched on during the period when the dialog processor has spotted the keyword and is listening for commands. +# +#org.openhab.voice:listeningItem= + +# Listening Melody: A melody to be played to advertise the user the dialog processing is going to start. +# This is a spaced separated list of notes. Example: "A O:100 A':50" +# Leave empty to disable it. +# +#org.openhab.voice:listeningMelody= + +# Enable TTS caching: true to allow TTS services to cache audio files on disk. +# +#org.openhab.voice:enableCacheTTS=true + +# TTS Cache Size: the limit size of the TTS cache (in kB). +# +#org.openhab.voice:cacheSizeTTS=10240 + + +################################### SITEMAP #################################### + +# Defines how the members of a group are sorted in UI. +# 3 values are accepted: +# - NONE: No sorting +# - LABEL: Sorted by label +# - NAME: Sorted by name +# +#org.openhab.sitemap:groupMembersSorting=NONE + + +#################################### CHART ##################################### + +# Defines the default height in pixels for the chart to build. +# +#org.openhab.chart:defaultHeight=240 + +# Defines the default width in pixels for the chart to build. +# +#org.openhab.chart:defaultWidth=480 + +# Defines the scale to apply to the requested chart height (0.5 to divide by 2 for example). +# +#org.openhab.chart:scale=1 + +# Defines the maximum width in pixels for the chart to build. +# +#org.openhab.chart:maxWidth= + + +################################### NETWORK #################################### + +# Primary address subnet (e.g. 192.168.1.0/24). +# +#org.openhab.network:primaryAddress= + +# A broadcast address (e.g. 192.168.1.255). +# +#org.openhab.network:broadcastAddress= + +# Use only one IP address per interface and family. +# +#org.openhab.network:useOnlyOneAddress=false + +# Use IPv6 Addresses if available. +# +#org.openhab.network:useIPv6=true + +################################## EPHEMERIS ################################### + +# This parameter defines the default list of usual non workable days for the Ephemeris service. +# The value has to be surrounded by square brackets ('[' and ']') and optionally contain value delimiters - a comma ',' to be interpreted as a list of values. +# Example: [SATURDAY,SUNDAY] +# +#org.openhab.ephemeris:dayset-weekend=[SATURDAY,SUNDAY] + +# See https://jollyday.sourceforge.net/data.html for help with the following parameters. +# This parameter defines the specific country to get the holidays for. +# Examples: Germany = "de", United States of America = "us" +# +#org.openhab.ephemeris:country= + +# This parameter defines the specific region/state to get the holidays for. +# Examples: New York = "ny", Baden-Wuerttemberg = "bw" +# +#org.openhab.ephemeris:region= + +# This parameter defines the specific city to get the holidays for. +# Examples: München = "mu" +# +#org.openhab.ephemeris:city= + +################################# MISCELLANOUS ################################# + +# The karaf sshHost parameter configures the bind address for the ssh login to karaf. +# Default is 127.0.0.1 (localhost), so it is only possible to login from the local machine. +# +# Setting this to the address of another network interfaces will allow login from this network. +# Setting this to 0.0.0.0 will allow login from all network interfaces. +# +# !!! Security warning !!! +# Remember to change default login/password, if you allow external login. +# See https://www.openhab.org/docs/administration/console.html for details. +# +#org.apache.karaf.shell:sshHost = 0.0.0.0 + +# Cross-origin resource sharing (CORS) is a browser security feature that restricts cross-origin +# HTTP requests that are initiated from scripts running in the browser. Setting this option to 'true' +# will disable the browser cross-origin check. This is required if you want to use a web UI that is not +# hosted on the openHAB server domain. +#org.openhab.cors:enable=true + + +################################### REST API ################################### + +# Allow the use of Basic authentication to access protected API resources, in addition to access tokens and API tokens +# +#org.openhab.restauth:allowBasicAuth=true + +# When basic authentication is activated, credentials are put in a cache in order to speed up request +# authorization. The entries in the cache expire after a while in order to not keep credentials in memory indefinitely. +# This value defines the expiration time in hours. Set it to 0 for disabling the cache. +# +#org.openhab.restauth:cacheExpiration=6 + +# By default, operations requiring the "user" role are available when unauthenticated. +# Disabling this option will enforce authorization for these operations. +# Warning: This causes clients that do not support authentication to break. +# +#org.openhab.restauth:implicitUserRole=false + +# Grant implicit user role to requests originating from these networks. +# Comma separated list of CIDR. +# This value is ignored if "org.openhab.restauth:implicitUserRole" is enabled. +# +#org.openhab.restauth:trustedNetworks=127.0.0.1/32, 192.168.1.1/24 + + +############################### LANGUAGE SERVER ################################ + +# The port the language server listens to. +# +#org.openhab.lsp:port=5007 + + +################################# JSON STORAGE ################################# + +# Sets the number of backup files to keep. +# +#org.openhab.storage.json:backup_files=5 + +# Sets the time to wait before writing changes to disk. This can reduce the number of writes when many changes are being introduced within a short period. +# The value is specified in milliseconds +# +#org.openhab.storage.json:write_delay=500 + +# Sets the maximum period the service will wait to write data to disk in the event that many changes are happening continually. +# The value is specified in milliseconds +# +#org.openhab.storage.json:max_defer_delay=30000 + + +################################# MARKETPLACE ################################## + +# If set to false no add-ons from the community marketplace will be shown. Already installed add-ons will still be available. +# +#org.openhab.marketplace:enable=true + +# Include entries which have not been tagged as published. Warning: this may include entries that are not ready and might not work or harm your installation. +# Enable at your own risk, for testing purposes only. +# +#org.openhab.marketplace:showUnpublished=false + +# Specify the API key to use on the community forum (for staff and curators - this allows for instance to see content which is not yet reviewed or otherwise hidden from the general public). +# Leave blank if you don't have one. +# +#org.openhab.marketplace:apiKey= + + +############################# JSON ADD-ON SERVICE ############################## + +# Pipe (|) separated list of URLS that provide 3rd party add-on services via Json files. +# Warning: Bundles distributed over 3rd party add-on services may lack proper review and can potentially contain malicious code and thus harm your system. +# +#org.openhab.jsonaddonservice:urls= + +# Include entries which have not been tagged as "stable". These add-ons should be used for testing purposes only and are not considered production-system ready. +# +#org.openhab.jsonaddonservice:showUnstable=false + + +#################################### INBOX ##################################### + +# If enabled, an Inbox result matching an existing thing is automatically ignored. +# If set to false, the Inbox may contain results although identical things already exist. +# +#org.openhab.inbox:autoIgnore=true + +# If enabled, Inbox results are automatically approved, unless they were marked as ignored. +# +#org.openhab.inbox:autoApprove=false + diff --git a/openhab/openhab_conf/sitemaps/readme.txt b/openhab/openhab_conf/sitemaps/readme.txt new file mode 100644 index 0000000..0e78121 --- /dev/null +++ b/openhab/openhab_conf/sitemaps/readme.txt @@ -0,0 +1,5 @@ +Your sitemap definitions go here. +All sitemap files have to have the ".sitemap" file extension and must follow a special syntax. + +Check out the openHAB documentation for more details: +https://www.openhab.org/docs/ui/sitemaps.html diff --git a/openhab/openhab_conf/sounds/barking.mp3 b/openhab/openhab_conf/sounds/barking.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..5a3c41d2e9d5e1b53bdb55e9327f106f16635ac7 GIT binary patch literal 8776 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 ALI3~& literal 0 HcmV?d00001 diff --git a/openhab/openhab_conf/sounds/doorbell.mp3 b/openhab/openhab_conf/sounds/doorbell.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..7a8a5a3653109c6383a26627aa3edc27d8f9a75c GIT binary patch literal 102399 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%0Dopukv9MxGCUXBa+ z!E(jxKwj;H#=A7RpS6?Z2Y_F06@~g+jrQP~yLO@TN`Ao5h)gI^`pp*WAy3MO1KJut z+43QfOB#E0{kFKag%PqIYC?chVf%Xzk459<=dGK`lqGT0FaH;ui16l0d3UXWqi@I0 zpTC>g|M`c|wl7>F+92bpN4(k5!x1VC3RK_|Oxm^q#^&r?CVn36u-4$@tR<90B~F>mqeA92hKC3-Wu8hGXsfuJ_s!YuVp3 zkJrA*?ibIgHtYBpj>GK^>mLb0)1Gr)Vg=9Zp{uQ$EovxnaJ+A!$tt>DMf^4EeA$Wm zF4NEg&3TFwIJT$=>Qf~b?Aj;|M8$v}z3DjQZtXo{oFhC;FG8a*9fqy>*;gAMpU_{t z@w!h^7AE%!S3bxKf|e&nsYy=t?fZ3!W`cUho{mC4V>77x5&KYA#rdUy@bkHBl3d$URz^Ov27W8X6kllGVQU60p;oC6d}MH- z{{gP2>p_{=T2 z>qFf|`$?^23e7ra+01DeVjr8eeEV4629qWgn|;(8?uUCb&V`yv&9es#z1)lLkmJpU77(-uSRNgVZKm& zGFpG+LXASO&ijGnr*2Ypf^Ol-@8lltwraKWn4Gi=Dm~ksT1lMyLGhYCqqg0OpQ_}m zo<2rZ>gl8EHZ;mVyO#(U`+Y9Ls$BEy@03 zf$I8lpS>{^hhMhjOsb~Sa=j+iMIygU#$VQ9%T|Anbn?aa1pu;J?!JU>rLB>Q)R*hb zrZP`ynfv8m4ej~EMWGFjV9DlMp?j?S>vCdzxVfFZ(A+u`7sKdY?{ZjvI5uQlA~;VA zpb9VJ;DQ=wD&tmZ(H9#fZS7#fSyzsosy<)`B}WU+%3hjSMYlOLbskk~8_8&M*(xsd z?tC?xSc~h($ZZg|7u1uDeoaZay*iC?FrqANJ_XCxve_$79m(Qi!!@U?07{~=Q3=<8 zswsR{gB}S<%+de>b&BlJ~~pse_;7lb9In8^c}N2(tnn_uL@HJI6P&LYZ5_x1Twah*ZqixWMCF{U$?#6k15ClX#HJ*SvHRl3OjVD zOb=7sK1$X|W7Ro(uc{?3GLJ!n6Z0Fc!MbWZ++YG)o7oD+6Sr01V7 z_)SFyH?|1r_iWm3$$pJ3B9j07Xu?SXT(_m?E7eOO{urTa!D18}1|qUpk0U;!!B^q2 z7R$QoGw+QpWz}GA;R?aw!nm>PS5>FigWG!1;#-Y*fC2DO8zD@{2c9%h7dtTZ_gFk` zL6xU|1m`G1ey}P5wv%q$iW*r4s%sk{!(j@jS+IwFxb>)gMfKEebA-l1OAtn&EN+NFKH9hR3+o~Ym zos_$zOq?`Y$?f`R`hpd+J)fD57L3L63f zxcE-IC}!G)Xr~_B#tXl-IaEY`-|$_`_gQ32S!Ka|VL))f0vrcIv{AMwI9A)1;QoY_ z&IEt*!60u`#G9wgumul}av2XTcz1kAQmJ;_vG&zS=0Y1s zuV&p!|F4Ds)LN*JVGh|`$5YuM;(j|h-S~V&5Xf2qT**+9EP-mM zX?-#Zg0Hx|RINX13OxoJoR01$l?i=>w6Rc9l-0y268^HZgA`_Ogb2@ebhX%Yl!eM( ztUx>(Hjk)KdRzhAh@q95`S~n~jW)YJg!|W6iBQ#{CB9<{t>_QcN?nm<14+W6o|!+E zIG;Z&;k%?F0pRrpa*f&mZAT1IrRG_?)@(03&}+ELEJ@1;|biitk8Z zN+m5JV+ERbbsu3$ON%W%Gwf%yl29i!E?Ddm`s)%|is9B3Y>ORZheCUkLn*!XFxJF$ zLEvoObVq2(t9qw3fyqKAf=fd@gUbHv=*X0r3SKQH&zBPgrtv-n;y0azSa?Vv&c`SP zbo{+lIrPTHBH@xR)^V*eeBE>Tx^s=?80q7GqTqvOjh{~RtXzQBLluX5@`<O%7}&TlCaZVj2TzAqx?bh_qi3*G_E$NIa<50BKv27#9_Dvs$hW zK0r{GQosdqhCraV5Q$YuX__U7q1cg6nc)pieuI_TlZT7|T_7n?$6RjJn>SScndiGt z48O`!x83e;<)_e2_mj0FmTLdg`PyT>YwL z{t}i4h!9~d9sa8y;ce%*zv$KAs+yhB^yp1f&i8AndTC*8^+M-~rlsQ=XEvBGMu_8j z7~?7tTdqnS+o>S2DEL9$&sPi}&t+_Hjsc{{0uLs7>Ogs+g@NQzR}XhS?>WolKPnUi9U0!9- zSmajxcWAup566!M8Hv*NwHzBh0!d291z8h?1S*bfR_@T6q=vyXA4zUg0tlw<2jxb> z1LbXvJ)7j4HQn`WJ8%p~8d)9TaaKOvfQO*7#C~?={Bu4DiseW!cRpYXU-&^(U|FrL5ww zDSYqRHxxRsljP%N*qusSoSMrIud{GZMTIfIXpW&-hLN*V$vvyx$h6vGX@k68o^k&1pldGqIuF$Jud0EEdloN%;oKxRbz zeIrC9A{j)yj*=toRiARUuPDGVzFW_1&||289Na z{Kaw++TH9_*es39ZA)iR$EZ!Q4+pfRpaB<-TUK`dYBBVOST;n36gik*hH*Wze~Aph zfIcOGpEGc;ND-;Tcq~k*^@nzyyY#xmA!3LGx|SKb`MxZE%=4}a)%LGvGmkjgpK+u4 zCgW|S(FkxNCb3g8yYD9Kr$sEO0!>sj9od1qHq>@NyzWarB#&w1%s;nWUXO2WulAy`)XdSoT?{c_jYP>JU|6 z`l8BSyi**(C{+BS%*w1~h}Q+dWEAV&q^GUQAjx7ofD?vHN^=^H{XnG~u@dIF`EO?Q zKH}8&FjDPfvgL&o1O3+L66X9Zm6U)KoyX!Db(M;Du6EL1wZp|%$g9)k2y_vVSZIw} z8gu>sb-4&Q2r^^@3+ihj|L_Fka!~L)BBWYVAndWRU1Lm-iV=DPY*eNmm$FFC^x$(Q zQX_N0;b<;3iLV~V#r`rH8_SY7WJJX}f2qYx9U!|iiQ)EWMNHi#{YExB$u-Upf$D%H zVe~!jHCSGTm5?<2>mN-0OqMTl>X8BPMdClY6l)*44~n=hJmzUV%6QD9(;W-D%tp~-E5kGH z29L(!0>Uuq8Sy<(WIbwgdy^VXudNri>!eMkF# zjNn|&0PDfC{-{19p~&XMQ?d5_t5uaeqNPUJfYzFoAjcjSVk(?~6gxH}OY1`rRqk(C z1^&krfN&NVgToxeN@nAzXvF;>c@%E~Db9o>Fn;VN=~BAJ`n5ws&texAB+5kh zQmxV)hKHfS!{d`?cj*#>tuqsLnn(nkVH#5vl%xQ##z^fo2 z92e00aT(c1yR>`8M#ncC>Y@9FkA2$^1(VKI2zB6sigNe-SuUOPEhVF3njS9w;V$iR znXN*)CsWbLRO0P-yD@41*$k39s*E?{M&wl>GBcrEKG=7grU2DW*L78$vY{C00nn3i z=A!Ew@YdReOUIy5#nATQTi#^Xn&l%64;@=lYgy~KcCkYl{><(rBf``5!^h+2AQ11s z3I0Q9*VpJBskEUbDW?-_D@-}HgRXH90BQ}P3!K}_2^fz8&fNfPY%xt-I6rV6q9MKj zzwd)AP7XOU3NLvBt+|SY6h7EBG@Og1s$vmQBU@@RB;baroO_n}ds(P&Kc!pQk2p78 z-PYUs$+gtQtak!?Zm-uI`)A3{CeAM44bq`W8=Lj=mMb&>iWtyRpfIb(k;#>X+E+FG z6Ke|pTQVwgj~)?bv6&!3t26`?P-vFdED$iCsBO%<5fN)!!=Nd`OeJ?{Fr3bgY)c*B z7oR(=bP|P0;E-E-SU)8SlgI%Ia*61@i*ofAGipDT8xxobOdR~B&~(D9e*~n{N#ut0 zo|ksyuk<8jkgXdI4`VpuK zi?^pWqFrqN0DDlnZBXA+e4xc63-i32fBHNe^?g z`VXN1I6D-`usv*IJ&}bm1wy$_F8qLZaJ@h4sbL5`C;?;vz!(Vk=_5o`ek*w>)wi*W zS!MnR-+7VLNVe@s+5zT)ZSlEkIU^G0MGX9H%4fX(qaWE%Ixn|A5@%y6dwX1;LZKo4 zsdh?HcJcY6BF>8n$-bDATeyD^&zyzEa9cK#!mGmanGL>41(*Z?&^Vgrx-6q^s=%fg zEyz~n{DVPAnP;@kFa_rai`>Hxo_zP{ZvB!>a&n))`4*=JQk`}iW$i`nI9XC*dz_iA$<4Br#SLL21$hZ`3%_@$Mt0&3A zIHAkHN5MghactG)YQzgskM|(VBWbtQ*sq`qm=m*n!(&KeP}T_UY^-kUj)$$3TrSnd zDJYMef)pd%m_MA-xme*W%P0Bm1nUJQCu=c_@nQo2Wwr+IoFC#h!bm|~tPyFT0d}Kp z)nne>m^bt%`3UuC5y~9n^CzjU=L$O%XE9%0Bh~aPK6~V?Xmk!c(9=t(B^*XWa{nQ; z<4Y}zGbnySB4*3PI6~YX34LH8Kt{_@=m7{HCxORTw`;djz+qVOE5_lcjDGf~T!b5Jxf70mO zXfr3Zx+D+hz4dS4jn^~l+R85el|>*MAMZL8BAc_WxMa>c*)~VI7u}#!GN8$PW0Z5u z5mD9#I^W}CnNT<(Hy9pq%FTUY&8lXfYp2BGoIT{AT<~s|qst2vD3@1QU+9cbe$nKX z7U*gukIGLgYv0)=52(`Pm+e+2=TfDU`6 z!oubfas|J(VDZU%tj<{usydS%pGMhCwAMS$$ft=}TCi{$?H~$fW#4A6S2y9%`LBlH z;UFl3BQa24+p%RBLSN;ct#M0gWk)Z)qj02i+jIwRLxa0`%7 zxRMbQ`G>!8>PGPJO&H>C+;E_9YPhsp?Vt3VbpLf-LJU#nwtMExUOaP89^7LuM<@Is z3jS9%ZA>^xB?X^~yEk!hj82XKi^E-m&5ncL7CwPta%gn8CF>wQdqrRWg(M8~M6E}VXZ7_kvKSSd# zl7u$;;1(+hrxiL1tjpoc^WI{Y6k3Fxux=+NU<#5*-XN33SmXNw0K{8GRpv96=2xch;k{%kU$6@@It33q!Yst*m3Muzc#(0!PRM39K8+$vFnw;8 zXcK*VidI#35*QnWs@;!Q7ZJ)T7yIshAUI!rmnQ?qyFG?h>R7c)kN5uL7m1F^EoO;) zk8qs2Tu=9?jd7!o$6_#R!k@l9P!TKFixx$NVF!Z6Sk7F~*X-(#%0!cm!Cz8*NVr{W zM>E{x2v!HbcYggFSK1Z#BtQG?MA7&nxY&NOQZk!x=4li|cn(b|{d4iU@pt|1UkR=I z8FAnY_Ke{a+RCTG#-Xn$nKDG+PGeww9t|ywD5O}x>NOMv)G|vSRxlloG~m|fBhg)K z)7?bdaoG%iL~EkWCG^WGNJ2}+B3?q3P#u>?-QnKWZhwo$Yusfm17D5sG)$d7hxE%k z`b)<@9P1)Mt@TSjyqM9Z-e{x~Unjbg-|Oz%D$wLtHy8;lgzHk9I3(Rd?n;0FIN^F= z%KmnMoftk!;4;-)-$RVh%DUfZ^QO#<^qG%j3z^CU31Sj71YMC}%Wc7SrNx6F$gNvl z@Gn*JUTg&X!ocULG!GI*4=TVE;0D(TWQ?EssXxI&vnhTo)FXT(f8~7i~Du}7zp6J1e;s;AlP!&(6y03;ju64D3i6;27?{AfvoqeM8Z7L z<5fDcWS|7CK!H5Xc)KkK9;-NG1gkbsIuE!P!TZJYWSm0#0PSHwUd7=kG3g&d$8bg+ zTvENT6{|ZdN;7SLHq?ZI09d*0ms0UhI2F&k@CA?((SQk()dG`}Su_WrYu6y4XE`bZjaHQ@wIM6DLv2R?wO5uE?W_=vb$g%!q_wNUl zTc~cQoc?r=LIIk`kPam%H%0!lqCOJ*uNxsGGm5Qk6r8JIihlrv>W zg)5hb1i8(0U>9$$|JgUpwWCOQ_hY*lOfz*n3*;;jQqc*?Mx-wgU@ZT8ydS^UPK<11 z@8yL{8lxbl*B5Z^pundx9h}P4wsD1GCRX;`+IGukF+H2__lM0^EMCj@A3{fPMz#1- zJqpA`MKSpx`Sq;ldBbUH2E4^qz& zVl}7uHS=nRn)#QM{2Pyn*a)=D5)OU5y|-Iz=bAB6Q zo0&gT#Uv{F=Ldb>!0x4=Nzc2IKHa{_EDGzZv`~m?1Ga=$Y7hAhAlQJ)H5?*?*!L!z zkmrWprA*&W0lJf_sk-M6_m&&9v>mbzeRqn)Cziu4$zys6 z_QG0awl~E-XrZ1IKU!KE*Xb$gxnF@;wPr?hA(*1_=7TeZ}+^rpU$XPNGq+a^h zhm+SK6UQD;c)nn-1D=j6w7^l;Id55A^|K6jv12zg8N4iN_h8g^F9;NjH#* zJd^Q`bC1|^J8(tVdRXkEVm6AS9kPJz0a)`-zmf2@W{chHQkk6t0Erfn@*hGwzTEnF z5b+psUk9syL?K#woa0R%u`#felLkKkqZKECkSDGpX*_#va~q8!`)YA5DDhk`oz0rm z&h6lUTu!MgpDTxy-8-cNXBVUS4D+)^W^n{_)AGr;&l(iKY1yH9sVJrdM#Jlkt+>MQ zG;i5COmY?d4cP;i+M#yg#C8``h0nQzVwY55hP{}HRB1%kWymAO)LraKCK868Xlw49 z=bYe8*un+nQMcZ)!T`%2VvY706fSPMoeeKS2WmQ*wd=4bTOi@}3PYU%F{>T zfgo`rE5<`{KZ4S1Oi~4>1Jd{zJA`S>bMx^uH3H&SJvj8ydubvLSAr!sX6evEpCZ(vj`3O8Xz9ay? z|MJKfbJu=->GfB4(yac9?LAKl)|j?V)|YRHo_eS{jP2uDZpVRY8m9jcx&b&-iAt6o zk#dKjFDG&K-#|t9iGo22;?0cIn=qnKoa>klu&}{aV2nitl&X>%5oT_D5F8gw#*%z_trU|B+Q^LwmN(f<0@8uQ zoAGGSmZvH$s!`X{?XOdKz6|H@&xAGDdnl32juViQ*U$ht0YGP$RQv~CY0mA)L(esgD+83S0jO#}$GKz!8U+v6BdT&c|IPQx0?k^@tC;uU|=?^EXHMnI+ zacLPL`%G+HFIN_aTZo`J@=!~in1I#uS^!5mMD~1J%{HJrKlXB=>GJnJhPd0yz!!y1 z(vh~woZd%eS~cEI>ZeK5Cy$9zdO9SgEaqirr}%aLxwV!ceV?`c$G>CLmhs`_5P$j) zihKx@)BX<(XeM#Dci-bEf9SU4E?6Y_eElyX-(Rnbwuv0=H7xq5)wv0h9RiZ64!xo}#*6_gdR%u3A`sy(QmZxG&#fNJg zNFGONdBS+sz+GQEV65y}CMvtle9lVu3AuEdNBln8ta7I5OI#gDu1w+0ch(YTkhB1v z3>Q6XPAZKh<=k}^b_vrU6CnPqgRO%=k`oMsdO2{k6ZfCJZN33%sS%4f>_m_$S+x*A z+=C^z0;m05meV9ZcqtR%)#|LWTGA1t+o=8^6X166N^HlU{W-k5mZInoAT@W0F9aDY(Db_#c-O)Ffaug8%^fY_#Npja3STwl|CFc2qV;;^Pqv zzA2k!jWqV?p6e3sfb#;EyG1)*^lS$sM3PvrjmpxMWPAd+$Gu!%k9;=-OB*f#6mYIrlSQNszwuj*E%%a|z<-lBoj{a(Mtw-+vR^J`aUWxF znVB}(iyigbjRvq3fbgSzW%MTXTa!#SWZp|Ekpy?PAA~HGpgbm7@As^krptLIl5Lc~ z0ym9`fkJsBT2auJuF|e0ZRqzyBDgwneJIZ`l!pN%j&PPoB23~(#hFDj7dTo!`bEn9 z!A#FdBs#7?)!!49IS{ITmftjE)I#B`u_`t@0+SYSkd39#Rm6Yz6+ljieNLot%Z2|u zetmkKpS+{{40(N#(hl!z(6zubt86-Y8j)+Zp6fjNbFNvL5kNd>&LO{F9NW9s7>}@cwt{D$ughhzVzAh!pSTj#B;nQ&A5*PCz9oNz z{6o4rp>Up&$S`8p=*H$6a)(Lw@?Zm#2>e_+VWT%#3Sxt{zH9aQfH0vQ9G7!cOE_Ep z^RFgnIfu$j<+HpU^1w9S>I2G~q-Bz7<}nrTF_BjvuT`p0)ffP9zQwOfL0Simrg3mD zJ>nchgc-Wub5wHtjO%jt^ION^htn+mr9*=!TM9u(LIkv~{3KfLYv?ZofG@&;Ni`1b zEWb%ma?e|^abS0d1_0eoiBC}j48-j;|A!ihHe zLs_6PCm>DRZ$pQ)@L_(;__3OC2j?+8DN^Iw=}MvnFN}9lsgN)YNu91vvH?L81CbGd z836zv*WCO5dDEmL;{$^+35ssiJA5whd-ag)uQO@t5yPoPa?;6rZ6%Dai8GHa{Uwdu z*B`!pslcZ`qhrIka5)daLt~`P?*YFP_h<(oGw0=x;?pVq8H$iF{IARTQmg0;ZUG65 zY^=4`XpQ}4N}*%{#HM~j4aOG6pfUgez*4R@4NntKC5)av?VzTmZQRJJF2!v%&Fym6 zh$|2}yEmU!+`posC4K~-oFf-aedLG3jACfXNPs&fPK>gt5QLDgUh`Y55azkhV=s3|2FK%V%(OC&`gH4Vob7AEA%w9Cw`al_PNM=_*z zj^bdCh^{+eCkw^X#M{jC~R zG{X>|!`cwbtcn*L43_+(lJ^fIF$Tq=CQi#9IN9I|>5BLIkWaR~Tm>A8>5@D${+stP(5nq#5 ze2K*XIOM`0ng|in9z%1KKZqH0<64aSs9A?@&DKUt?OT$Lmpv3h);S)XR4bBW7%asS zDgf6BM*kBDRJ6kPo_yl>=?3$*e=#fTK5u*FSc80)o^0yz%?w{*gr<$5Vyh71%; zxk*#UC5v?*ph2E-W9GR76L52tGCXOfeT(sf^EcMJ-G%1+2l=^*{2VH35sfqr&uc$a zH2NYK8JO{#GM|iAgi1T-$;i(*196~ybon^I_x^28cJkI zuHe|s?U_nz{e!_kM7+1~fiopa1C~~1@KF?m!TuV2hREP$m=E9|LK^{aI_MB>dJ;}A z>xZ^~6DzGaK|cu88=hxeXc#T72#S`v69dX^&n4S>IpB)LJ1$62hrDIb=Z>dj7M8B& zs%8wtcPt}JC`vfgw%nfQ1ky`CqoL!Mg93JX+*$P3za)`~B;aGL4ReZ-O871N)`QCx z*+S~!%v7wnhjvP?@+kNm8xS28Z#xp{ehtKP!3J}00Y5nK!@4YJhGZYNu2t8(wQU@EgBB^L#34F-cT9N+|6sKltf-GhF3N;9*WF0A5I@!{7uiN}Z|<wgHrYzht-gHRS6PMZqZ zBU)oSIfD`$1O!*q9R`>zhefjdwXQV4Y3j$hty8NqEf@e0V#-v;PmK*@-AHcRlO?P= z;GAHOoaml#`K=smWpNWy`0STe&y8G?s(x)uZ_y)x#mK=sy502lJ_ktRIeIz9xS!@J z*ph(biZZ3B8lJW=9F#}I^P?BJ7L<-Ykrxk<-?bAvIr+Lm}tPqSdw|zBK7(4;ta}Eaj1*Q`tDu)V?Fdq|$`fO$L2 zZ#xu1(l6xX4&~?ClW^b!7PVX2EGw62=Xy_<_2ZXr@4;I&sU=I-%^3&j7Npl-QP<%j z;peb+mdX*3YEITgt|^6C_-qkkV+y>dRhy1=Adxw^f0MiWf2$81wX@Nn!4}1pO{DrG~XS03p5xMwCD6;Qm73|P4U5P87@p`g-&mTeL_8{v@VV(e<`D!llY{Knx61F zYU0EGdddE#IKPn&C+4JmFnjD_J68!T_{FRdLBmxkh6Cs6@Q*^VJH6;7z|a*P!m9cP zz9`yeg^s$3{mol#7JRrm;OrEZul^2oyuHqt0&m1TExg0FoQz`kU|P{(1XHBLyH*2$ zjI!=1cdBVImZfW00<&SD6=yd;F&q6)-J57$eMXs?CBHp**rJ4(jz|>r%6LnMY&905 zyt`E4vXD(ygP(N#!(3oqzj~VAGfBEjJN7hsn`$sDBf?U&mDd28O)W+3#4WP#j66XI zawVognRn7b1+znN2MSO#UW>p5u=-&x@fS`Mxup}G{uE(HH-W$fHEce~ZEN#dDI%_WxeI|dD)n(+6Xzik0KlA44~5lVGPzFF_e}v_}sc`yP#$U(6Fuo!2leYGT<#Xtw*hXwON~5-A#qwuWP3- z&*)?QaeF`~tT)Vm*~oL}5YU+3G-!mR2bk5-+R9z9Ie%lGWA6HGI$*ym{w?y9-0gcS z0GV?~NFwyJa+H=c_x8ko;{xMYqalQ5?Hb{RR8^VHAFHjoDA!mnf5@>^_fC^dQUZ1$ zQkbF7p-@>c87~;u^!7xRt~br)r>u%)wJ?tKTZA@-jbsqWaUuvwB+yy0p#Y7S=gL`@G>8Xr8U>-{Ba zHmKcQ2Ij44Yii42zKNJ5bY}~%^qA7>vCKE)b^NC%l)`un=x1o8E-;8 zo$;sx-A6LnjkOG;{mM4_sAk0gz5r%+3wbtMT!LZ5!*VM4tKSF_nEoVelLE`;5Kh(Y zYgC1{FOg)o4P8j`L+1V&rTeXlG%jb+a~x{x?i(Cm?q98c-9VWxew0Go2dBmz{?xblY1XiA-v*5jGAM z$wY_(+OY(2{SYOcc#88lLEEq&FWS3vaKpg>0#;K{vahdVysT5I`k)3*+a$60Xm^JG zOrlQ~W%I?mSO==C7lUDwLn(O>- z*(?d8uGTEnY|BmfU~t9hxgcO-=)Tb1@GKHYe8%qIWM z%UmkP^e7z6SZ|Jksl!8{)NY%^hnN-G(0&0gI|X1U!)->6OUv5bm)b`v{`6w$QZgdA z$J0iV>`c!bA~N`==0PhkOITAY;{6rRP-ySWFOE0=5IXXQYuA?&6DPm=3KE#0GZT~D z#lr*oO5qe%)0h}yDK8BQ-%j96)S?0i^V|W^I>vdljq$}@qRMLHwsZUQ5b%64N0 zelwH_ z;fD)lASO7vPmGHTc{aH}*+s$xuLus;(i$fzDT)%YSjv{y;So=t$Xz9w)V%4>yIBwW z8o4W3t;KB$*<_M*qY)P(0nleav8vlN2tDLG!OdlG`%@EbQnh4L{zb$^)2s3C#qYZ> zo3ON>P$)gkP+$26wt6dhvBxB{O0vP>B|=4$%~=me@DURvgfWa&K~RuIZa$82m5H}S zc^+?5I?mDayO&-pRX3qR_|1si*n88`J*~>tcty2z&=9G;!e3jD#Xmv3l^sK(bDp|Q zbobU*dm;k;T}XFJ%$Q$ZaJXv(m&4tT8DQt&#PrP6cu3>^R)m(O-G!Q8!kdnv=W6B~+vO{sQ{Co|MO9}G|oO4MN4*jg59>6$z-UJ;#tFt2<< zOh_k=4VbnRpWR!`Gr#JsozBEl-Hvah$AcwrPEP3)0%EliV;8geoFJHp^8>Jvo>1hc zBJR@GhsgXYs+KSxAAhY0w!L)e(NOf(j1S|c$=)82(q@6m;(`tC=;5XU-i38hOe;Ne z-(khRdU6jw5}rFq9(-sxD|YONBh^)PFh~xrlksb?;}~P5jZ0_LI_Hg7g2JfN#fl@n zjlCckfFKHdJ8|=!UcWq5`4`Rm*tED9AUY?hTN*J+EL5wGnf@Fe7{@me{w7nMxpqW1 zViNRX6(4IyXOwbCi?XSv=6FAf>|t~w@ytEArutuoCQS8#0HheHNG~nqTmPLt$R5(+ z0Rjzx{cOg>hB3XWaj)#!tHuDB;!d?|p`PtDE#^Q4Z*tX@k2lTRN1i9W$JlMSs69Nw z!s*E*g@030Dim6|?Vz@=%=7lA-LRukPAp3cNxzCfxijzhYO9=H-zow7`D%DDll_r_ zD{35tMBK>r;f~IJn1+ZNTYcbpYh3Td*fD6OmHj%AcaQ%y_vxTa+F3;WJa1^PT_@cU zyK3KZPmiiY@YI{o>A;!o$qegg@12hMkVG(A*_*D;#HP1y3VxV49*u#qLYMOeZ76FB z?r4y|NTx~n00$#C@ff>=3X&l4%PI~h-Dbhb#z|1~?ve5W$kS@&wb_Y=c!ynmAItnl~Z zoevzJ53M`*uaJSsEByWcdb^k=;aT-c{3{w;10N?v^a>iO$UIQG)0K9_kJEXMjK<+( z5xNT9g^DWXvbJ0v5*7vz-#P%>7Pfa8&)vCZb!k&xbq%mQ4Q{SD(02#s8D<0>Kl`t>^s~$$h$4 z^2E38G_bjP-&0sbYwDZLTbHFj-*G8(R)*BQw?-V#o~m|eFo-cvSm<#_h9i1Pl-oMz zeJh1D?1a}|dfIr{^E#{3t&5u`ZQ<6r63}d_-c)$Dy?nW+m~qyrD;Zyce?<0+PuqJ~ z>$(1+)#}@(=H&N&2X4L=p7B0jjjP?b{iEt+)f>wvaW65Jlb)0EsdtNVUa;RctHW<@ z&YJtqTTx%bkXws^A!lFx&;N&G`?4a}|9@N7I(@5h?#z?>Q&}{&-u|}wXtqw#HXGA7 zdh*Aj+*Y}*UVrDwwy2{0#Ra?5XO?82uUsEma$Y8=V9K}k!4@Z_pWR%!g((5JR+h`B z(_1O&kzWMIy~{nl>!Q3wpVN#8cINZqsYz@9 zi)1gPkYBeE&J2tG8-l)Lv|9^<9^8Y)_xFiIMtnKIh zm=~2|(bcwS=b`WNrN!2>S)KLIo&FSLn##i?B~>93xa-G;-S+?21b20-h59)9x*F?Q znuiV)0L9R|j;8h$rwPoaMP(j0W=b53@!GKL(F4|AhHv6>bJX}b2Fh)N!rnmZBkPBp*GyqR{8x$cmVjTeh58Hhh literal 0 HcmV?d00001 diff --git a/openhab/openhab_conf/things/IFT605_SmartClothes.things b/openhab/openhab_conf/things/IFT605_SmartClothes.things new file mode 100644 index 0000000..ca258ca --- /dev/null +++ b/openhab/openhab_conf/things/IFT605_SmartClothes.things @@ -0,0 +1,62 @@ +/** + Vêtement intelligent +**/ + +Bridge elwire:bridge:ewbridge [ ipAddress="192.168.3.123" ] { + // gateway el-wire + Thing 0210 strip1 [stripId="1"] //référer par elwire:0210:ewbridge:strip1 + Thing 0220 strip2 [stripId="2"] // référer par elwire:0220:ewbridge:strip2 +} +//vibration patch +Thing vibrationPatch:device:vibration "vibration patch" @ "smart clothes" + + +// voir description à https://www.openhab.org/addons/bindings/zwave/doc/things.html +Bridge zwave:serial_zstick:8c582004 "ZWave Controller" [ port="/dev/ttyACM0", controller_softreset="false", controller_master="true", heal_enable="true", security_networkkey="???" ] { + // ampèremètres placés sur les interrupteurs du plafonnier + Thing luxMeter node2 "luxmeter " @ "smart clothes" [ node_id=2 ] { + Channels: + // sensors + Type number : luminance [ updateInterval=10 ] + Type number : battery-level [ updateInterval=10 ] + } + Thing noiseMeter node3 "noise meter" @ "smart clothes" [ node_id=3 ] + Channels: + // sensors + Type number : noise [ updateInterval=10 ] + Type number : battery-level [ updateInterval=10 ] + Thing wristband node4 "wristBand" @ "smart clothes" [ node_id=4 ] { + Channels: + // sensors + Type number : luminance [ updateInterval=10 ] + Type number : noise [ updateInterval=10 ] + Type string : accelerometer [ updateInterval=10 ] + Type number : speed [ updateInterval=10 ] + Type number : galvanicSkinResponse [ updateInterval=10 ] + // effectors + Type switch : vibration + Type switch : enable + } +} + +/** + Pièce +**/ + +// https://www.smarthomeblog.net/mqtt-openhab/ +// https://gist.github.com/davidgraeff/6c00d2ad5e4bc553f5f209118307d8fd +// https://community.openhab.org/t/solved-oh-2-4-mqtt-binding-generic-thing-statetopic-working-commandtopic-not-working/63619 + +Bridge mqtt:systemBroker:embedded-mqtt-broker [ host="127.0.0.1", secure=false ] +{ + Thing mqtt:topic:room1MQTT { + Channels: + Type string : room1 "all MQTT room events" @ "room 1"[ stateTopic="room/1/#" ] + Type string : smartclothes "all MQTT smart clothes events" @ "room 1"[ stateTopic="smartclothes/#" ] + Type switch : tag "RFID MQTT event" @ "room 1" [ stateTopic="room/+/tag"] + Type string : noise "noise MQTT event" @ "room 1" [ stateTopic="smartclothes/+/sensor/noise" ] + Type string : luminance "luminosity MQTT event" @ "room 1" [ stateTopic="smartclothes/+/sensor/luminance" ] + } +} + +Thing rfidReader:device:reader1 "rfidReader " @ "room 1" diff --git a/openhab/openhab_conf/things/readme.txt b/openhab/openhab_conf/things/readme.txt new file mode 100644 index 0000000..27b6689 --- /dev/null +++ b/openhab/openhab_conf/things/readme.txt @@ -0,0 +1,5 @@ +Your thing definitions go here. +All thing files have to have the ".things" file extension and must follow a special syntax. + +Check out the openHAB documentation for more details: +https://www.openhab.org/docs/configuration/things.html diff --git a/openhab/openhab_conf/transform/de.map b/openhab/openhab_conf/transform/de.map new file mode 100644 index 0000000..8cc1579 --- /dev/null +++ b/openhab/openhab_conf/transform/de.map @@ -0,0 +1,3 @@ +CLOSED=zu +OPEN=offen +NULL=undefiniert diff --git a/openhab/openhab_conf/transform/en.map b/openhab/openhab_conf/transform/en.map new file mode 100644 index 0000000..bd08f17 --- /dev/null +++ b/openhab/openhab_conf/transform/en.map @@ -0,0 +1,4 @@ +CLOSED=closed +OPEN=open +NULL=unknown + \ No newline at end of file diff --git a/openhab/openhab_conf/transform/readme.txt b/openhab/openhab_conf/transform/readme.txt new file mode 100644 index 0000000..6933c16 --- /dev/null +++ b/openhab/openhab_conf/transform/readme.txt @@ -0,0 +1,5 @@ +Transformations like map or jsonpath can utilize configuration files with data definitions. +These files have their specific file extensions and syntax definition. + +Check out the openHAB documentation for more details: +https://www.openhab.org/docs/configuration/transformations.html diff --git a/openhab/openhab_userdata/config/jmx/acl/org/apache/karaf/bundle.config b/openhab/openhab_userdata/config/jmx/acl/org/apache/karaf/bundle.config new file mode 100644 index 0000000..66fc88b --- /dev/null +++ b/openhab/openhab_userdata/config/jmx/acl/org/apache/karaf/bundle.config @@ -0,0 +1,19 @@ +:org.apache.felix.configadmin.revision:=L"1" +felix.fileinstall.filename="file:/openhab/userdata/etc/jmx.acl.org.apache.karaf.bundle.cfg" +install="manager" +refresh="manager" +resolve="manager" +restart="manager" +service.bundleLocation="?" +service.pid="jmx.acl.org.apache.karaf.bundle" +setStartLevel="manager" +setStartLevel(java.lang.String,="int)[/([1-4])?[0-9]/,/.*/]\ \=\ admin" +start="manager" +start(java.lang.String)[/([1-4])?[0-9]/]="admin" +stop="manager" +stop(java.lang.String)[/([1-4])?[0-9]/]="admin" +uninstall="admin" +uninstall(java.lang.String)[\"0\"]="#this\ is\ a\ comment,\ no\ roles\ can\ perform\ this\ operation" +update="manager" +update(java.lang.String)[/([1-4])?[0-9]/]="admin" +update(java.lang.String,java.lang.String)[/([1-4])?[0-9]/,/.*/]="admin" diff --git a/openhab/openhab_userdata/config/jmx/acl/org/apache/karaf/config.config b/openhab/openhab_userdata/config/jmx/acl/org/apache/karaf/config.config new file mode 100644 index 0000000..0e0e434 --- /dev/null +++ b/openhab/openhab_userdata/config/jmx/acl/org/apache/karaf/config.config @@ -0,0 +1,28 @@ +:org.apache.felix.configadmin.revision:=L"1" +appendProperty(java.lang.String,java.lang.String,java.lang.String)="manager" +appendProperty(java.lang.String,java.lang.String,java.lang.String)[/jmx[.]acl.*/,/.*/,/.*/]="admin" +appendProperty(java.lang.String,java.lang.String,java.lang.String)[/org[.]apache[.]karaf[.]command[.]acl.+/,/.*/,/.*/]="admin" +appendProperty(java.lang.String,java.lang.String,java.lang.String)[/org[.]apache[.]karaf[.]service[.]acl.+/,/.*/,/.*/]="admin" +create(java.lang.String)="manager" +create(java.lang.String)[/jmx[.]acl.*/]="admin" +create(java.lang.String)[/org[.]apache[.]karaf[.]command[.]acl.+/]="admin" +create(java.lang.String)[/org[.]apache[.]karaf[.]service[.]acl.+/]="admin" +delete(java.lang.String)="manager" +delete(java.lang.String)[/jmx[.]acl.*/]="admin" +delete(java.lang.String)[/org[.]apache[.]karaf[.]command[.]acl.+/]="admin" +delete(java.lang.String)[/org[.]apache[.]karaf[.]service[.]acl.+/]="admin" +deleteProperty(java.lang.String,java.lang.String)="manager" +deleteProperty(java.lang.String,java.lang.String)[/jmx[.]acl.*/,/.*/]="admin" +deleteProperty(java.lang.String,java.lang.String)[/org[.]apache[.]karaf[.]command[.]acl.+/,/.*/]="admin" +deleteProperty(java.lang.String,java.lang.String)[/org[.]apache[.]karaf[.]service[.]acl.+/,/.*/]="admin" +felix.fileinstall.filename="file:/openhab/userdata/etc/jmx.acl.org.apache.karaf.config.cfg" +service.bundleLocation="?" +service.pid="jmx.acl.org.apache.karaf.config" +setProperty(java.lang.String,java.lang.String,java.lang.String)="manager" +setProperty(java.lang.String,java.lang.String,java.lang.String)[/jmx[.]acl.*/,/.*/,/.*/]="admin" +setProperty(java.lang.String,java.lang.String,java.lang.String)[/org[.]apache[.]karaf[.]command[.]acl.+/,/.*/,/.*/]="admin" +setProperty(java.lang.String,java.lang.String,java.lang.String)[/org[.]apache[.]karaf[.]service[.]acl.+/,/.*/,/.*/]="admin" +update(java.lang.String,java.util.Map)="manager" +update(java.lang.String,java.util.Map)[/jmx[.]acl.*/,/.*/]="admin" +update(java.lang.String,java.util.Map)[/org[.]apache[.]karaf[.]command[.]acl.+/,/.*/]="admin" +update(java.lang.String,java.util.Map)[/org[.]apache[.]karaf[.]service[.]acl.+/,/.*/]="admin" diff --git a/openhab/openhab_userdata/config/org/apache/felix/eventadmin/impl/EventAdmin.config b/openhab/openhab_userdata/config/org/apache/felix/eventadmin/impl/EventAdmin.config new file mode 100644 index 0000000..d72aefe --- /dev/null +++ b/openhab/openhab_userdata/config/org/apache/felix/eventadmin/impl/EventAdmin.config @@ -0,0 +1,9 @@ +:org.apache.felix.configadmin.revision:=L"1" +felix.fileinstall.filename="file:/openhab/userdata/etc/org.apache.felix.eventadmin.impl.EventAdmin.cfg" +org.apache.felix.eventadmin.AddSubject="true" +org.apache.felix.eventadmin.AddTimestamp="true" +org.apache.felix.eventadmin.AsyncToSyncThreadRatio="1" +org.apache.felix.eventadmin.ThreadPoolSize="3" +org.apache.felix.eventadmin.Timeout="0" +service.bundleLocation="?" +service.pid="org.apache.felix.eventadmin.impl.EventAdmin" diff --git a/openhab/openhab_userdata/config/org/apache/felix/fileinstall%007edeploy.config b/openhab/openhab_userdata/config/org/apache/felix/fileinstall%007edeploy.config new file mode 100644 index 0000000..d1a0b1b --- /dev/null +++ b/openhab/openhab_userdata/config/org/apache/felix/fileinstall%007edeploy.config @@ -0,0 +1,13 @@ +:org.apache.felix.configadmin.revision:=L"1" +felix.fileinstall.active.level="90" +felix.fileinstall.dir="/openhab/addons" +felix.fileinstall.filename="file:/openhab/userdata/etc/org.apache.felix.fileinstall-deploy.cfg" +felix.fileinstall.filter=".*\\.(jar|kar)" +felix.fileinstall.log.level="3" +felix.fileinstall.poll="10000" +felix.fileinstall.start.level="80" +felix.fileinstall.subdir.mode="skip" +felix.fileinstall.tmpdir="/openhab/userdata/tmp/bundles" +service.bundleLocation="?" +service.factoryPid="org.apache.felix.fileinstall" +service.pid="org.apache.felix.fileinstall~deploy" diff --git a/openhab/openhab_userdata/config/org/apache/karaf/command/acl/bundle.config b/openhab/openhab_userdata/config/org/apache/karaf/command/acl/bundle.config new file mode 100644 index 0000000..d474fd2 --- /dev/null +++ b/openhab/openhab_userdata/config/org/apache/karaf/command/acl/bundle.config @@ -0,0 +1,18 @@ +:org.apache.felix.configadmin.revision:=L"1" +felix.fileinstall.filename="file:/openhab/userdata/etc/org.apache.karaf.command.acl.bundle.cfg" +install="admin" +refresh="manager" +refresh[/.*[-][f].*/]="admin" +restart="manager" +restart[/.*[-][f].*/]="admin" +service.bundleLocation="?" +service.pid="org.apache.karaf.command.acl.bundle" +start="manager" +start[/.*[-][f].*/]="admin" +stop="manager" +stop[/.*[-][f].*/]="admin" +uninstall="manager" +uninstall[/.*[-][f].*/]="admin" +update="manager" +update[/.*[-][f].*/]="admin" +watch="admin" diff --git a/openhab/openhab_userdata/config/org/apache/karaf/command/acl/config.config b/openhab/openhab_userdata/config/org/apache/karaf/command/acl/config.config new file mode 100644 index 0000000..849f5b4 --- /dev/null +++ b/openhab/openhab_userdata/config/org/apache/karaf/command/acl/config.config @@ -0,0 +1,23 @@ +:org.apache.felix.configadmin.revision:=L"1" +cancel="manager" +delete="admin" +edit="manager" +edit[/.*jmx[.]acl.*/]="admin" +edit[/.*org[.]apache[.]karaf[.]command[.]acl[.].+/]="admin" +edit[/.*org[.]apache[.]karaf[.]service[.]acl[.].+/]="admin" +felix.fileinstall.filename="file:/openhab/userdata/etc/org.apache.karaf.command.acl.config.cfg" +property-append="manager" +property-append[/.*jmx[.]acl.*/]="admin" +property-append[/.*org[.]apache[.]karaf[.]command[.]acl[.].+/]="admin" +property-append[/.*org[.]apache[.]karaf[.]service[.]acl[.].+/]="admin" +property-delete="manager" +property-delete[/.*jmx[.]acl.*/]="admin" +property-delete[/.*org[.]apache[.]karaf[.]command[.]acl[.].+/]="admin" +property-delete[/.*org[.]apache[.]karaf[.]service[.]acl[.].+/]="admin" +property-set="manager" +property-set[/.*jmx[.]acl.*/]="admin" +property-set[/.*org[.]apache[.]karaf[.]command[.]acl[.].+/]="admin" +property-set[/.*org[.]apache[.]karaf[.]service[.]acl[.].+/]="admin" +service.bundleLocation="?" +service.pid="org.apache.karaf.command.acl.config" +update="manager" diff --git a/openhab/openhab_userdata/config/org/apache/karaf/command/acl/feature.config b/openhab/openhab_userdata/config/org/apache/karaf/command/acl/feature.config new file mode 100644 index 0000000..81c1460 --- /dev/null +++ b/openhab/openhab_userdata/config/org/apache/karaf/command/acl/feature.config @@ -0,0 +1,8 @@ +:org.apache.felix.configadmin.revision:=L"1" +felix.fileinstall.filename="file:/openhab/userdata/etc/org.apache.karaf.command.acl.feature.cfg" +install="admin" +service.bundleLocation="?" +service.pid="org.apache.karaf.command.acl.feature" +start="admin" +stop="admin" +uninstall="admin" diff --git a/openhab/openhab_userdata/config/org/apache/karaf/command/acl/jaas.config b/openhab/openhab_userdata/config/org/apache/karaf/command/acl/jaas.config new file mode 100644 index 0000000..517fe01 --- /dev/null +++ b/openhab/openhab_userdata/config/org/apache/karaf/command/acl/jaas.config @@ -0,0 +1,5 @@ +:org.apache.felix.configadmin.revision:=L"1" +felix.fileinstall.filename="file:/openhab/userdata/etc/org.apache.karaf.command.acl.jaas.cfg" +service.bundleLocation="?" +service.pid="org.apache.karaf.command.acl.jaas" +update="admin" diff --git a/openhab/openhab_userdata/config/org/apache/karaf/command/acl/kar.config b/openhab/openhab_userdata/config/org/apache/karaf/command/acl/kar.config new file mode 100644 index 0000000..ba08d87 --- /dev/null +++ b/openhab/openhab_userdata/config/org/apache/karaf/command/acl/kar.config @@ -0,0 +1,6 @@ +:org.apache.felix.configadmin.revision:=L"1" +felix.fileinstall.filename="file:/openhab/userdata/etc/org.apache.karaf.command.acl.kar.cfg" +install="admin" +service.bundleLocation="?" +service.pid="org.apache.karaf.command.acl.kar" +uninstall="admin" diff --git a/openhab/openhab_userdata/config/org/apache/karaf/command/acl/scope_bundle.config b/openhab/openhab_userdata/config/org/apache/karaf/command/acl/scope_bundle.config new file mode 100644 index 0000000..cce6495 --- /dev/null +++ b/openhab/openhab_userdata/config/org/apache/karaf/command/acl/scope_bundle.config @@ -0,0 +1,13 @@ +:org.apache.felix.configadmin.revision:=L"1" +admin="org.apache.karaf.admin.command" +config="org.apache.karaf.shell.config" +features="org.apache.karaf.features.command" +felix.fileinstall.filename="file:/openhab/userdata/etc/org.apache.karaf.command.acl.scope_bundle.cfg" +jaas="org.apache.karaf.jaas.command" +log="org.apache.karaf.shell.log" +osgi="org.apache.karaf.shell.osgi" +packages="org.apache.karaf.shell.packages" +service.bundleLocation="?" +service.pid="org.apache.karaf.command.acl.scope_bundle" +shell="org.apache.karaf.shell.commands" +ssh="org.apache.karaf.shell.ssh" diff --git a/openhab/openhab_userdata/config/org/apache/karaf/command/acl/shell.config b/openhab/openhab_userdata/config/org/apache/karaf/command/acl/shell.config new file mode 100644 index 0000000..7bfe320 --- /dev/null +++ b/openhab/openhab_userdata/config/org/apache/karaf/command/acl/shell.config @@ -0,0 +1,8 @@ +:org.apache.felix.configadmin.revision:=L"1" +exec="admin" +felix.fileinstall.filename="file:/openhab/userdata/etc/org.apache.karaf.command.acl.shell.cfg" +java="admin" +nano="admin" +new="admin" +service.bundleLocation="?" +service.pid="org.apache.karaf.command.acl.shell" diff --git a/openhab/openhab_userdata/config/org/apache/karaf/command/acl/system.config b/openhab/openhab_userdata/config/org/apache/karaf/command/acl/system.config new file mode 100644 index 0000000..54c2146 --- /dev/null +++ b/openhab/openhab_userdata/config/org/apache/karaf/command/acl/system.config @@ -0,0 +1,9 @@ +:org.apache.felix.configadmin.revision:=L"1" +felix.fileinstall.filename="file:/openhab/userdata/etc/org.apache.karaf.command.acl.system.cfg" +property="admin" +service.bundleLocation="?" +service.pid="org.apache.karaf.command.acl.system" +shutdown="admin" +start-level="admin\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ #\ admin\ can\ set\ any\ start\ level,\ including\ <\ 100" +start-level[/.*[1-9][0-9][0-9]+.*/]="manager\ #\ manager\ can\ set\ startlevels\ above\ 100" +start-level[/[^0-9]*/]="viewer\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ #\ viewer\ can\ obtain\ the\ current\ start\ level" diff --git a/openhab/openhab_userdata/config/org/apache/karaf/features.config b/openhab/openhab_userdata/config/org/apache/karaf/features.config new file mode 100644 index 0000000..1f6e214 --- /dev/null +++ b/openhab/openhab_userdata/config/org/apache/karaf/features.config @@ -0,0 +1,9 @@ +:org.apache.felix.configadmin.revision:=L"1" +autoRefresh="true" +configCfgStore="false" +featuresBoot="instance/4.4.3,\ package/4.4.3,\ log/4.4.3,\ ssh/4.4.3,\ framework/4.4.3,\ system/4.4.3,\ eventadmin/4.4.3,\ feature/4.4.3,\ shell/4.4.3,\ service/4.4.3,\ jaas/4.4.3,\ openhab-runtime-base,\ openhab-runtime-ui,\ deployer/4.4.3,\ diagnostic/4.4.3,\ bundle/4.4.3,\ config/4.4.3,\ kar/4.4.3" +featuresBootAsynchronous="false" +featuresRepositories="mvn:org.openhab.distro/distro/4.0.3/xml/features,\ mvn:org.openhab.distro/openhab-addons/4.0.3/xml/features,\ mvn:org.apache.karaf.features/framework/4.4.3/xml/features,\ mvn:org.apache.karaf.features/standard/4.4.3/xml/features" +felix.fileinstall.filename="file:/openhab/userdata/etc/org.apache.karaf.features.cfg" +service.bundleLocation="?" +service.pid="org.apache.karaf.features" diff --git a/openhab/openhab_userdata/config/org/apache/karaf/features/repos.config b/openhab/openhab_userdata/config/org/apache/karaf/features/repos.config new file mode 100644 index 0000000..72d9d6b --- /dev/null +++ b/openhab/openhab_userdata/config/org/apache/karaf/features/repos.config @@ -0,0 +1,41 @@ +:org.apache.felix.configadmin.revision:=L"1" +activemq="mvn:org.apache.activemq/activemq-karaf/RELEASE/xml/features" +aries-cdi="mvn:org.apache.aries.cdi/aries-cdi-feature/RELEASE/xml/features" +aries-jpa="mvn:org.apache.aries.jpa/jpa-features/RELEASE/xml/features" +aries-rsa="mvn:org.apache.aries.rsa/rsa-features/RELEASE/xml/features" +aries.jax.rs.whiteboard="mvn:org.apache.aries.jax.rs/org.apache.aries.jax.rs.features/RELEASE/xml" +artemis="mvn:org.apache.activemq/artemis-features/RELEASE/xml/features" +brave="mvn:io.zipkin.brave.karaf/brave-features/RELEASE/xml/features" +camel="mvn:org.apache.camel.karaf/apache-camel/RELEASE/xml/features" +camel-extras="mvn:org.apache-extras.camel-extra.karaf/camel-extra/RELEASE/xml/features" +cave="mvn:org.apache.karaf.cave/apache-karaf-cave/RELEASE/xml/features" +cellar="mvn:org.apache.karaf.cellar/apache-karaf-cellar/RELEASE/xml/features" +cxf="mvn:org.apache.cxf.karaf/apache-cxf/RELEASE/xml/features" +cxf-dosgi="mvn:org.apache.cxf.dosgi/cxf-dosgi/RELEASE/xml/features" +cxf-dosgi-samples="mvn:org.apache.cxf.dosgi/cxf-dosgi-samples/RELEASE/xml/features" +cxf-xkms="mvn:org.apache.cxf.services.xkms/cxf-services-xkms-features/RELEASE/xml" +decanter="mvn:org.apache.karaf.decanter/apache-karaf-decanter/RELEASE/xml/features" +ecf="http://download.eclipse.org/rt/ecf/RELEASE/site.p2/karaf-features.xml" +eclipsesource-jaxrs="mvn:com.eclipsesource.jaxrs/features/RELEASE/xml/features" +enterprise="mvn:org.apache.karaf.features/enterprise/4.4.3/xml/features" +felix.fileinstall.filename="file:/openhab/userdata/etc/org.apache.karaf.features.repos.cfg" +hawtio="mvn:io.hawt/hawtio-karaf/RELEASE/xml/features" +hibernate="mvn:org.hibernate/hibernate-osgi/RELEASE/xml/karaf" +ignite="mvn:org.apache.ignite/ignite-osgi-karaf/RELEASE/xml/features" +jclouds="mvn:org.apache.jclouds.karaf/jclouds-karaf/RELEASE/xml/features" +openejb="mvn:org.apache.openejb/openejb-feature/RELEASE/xml/features" +openjpa="mvn:org.apache.openjpa/openjpa-features/RELEASE/xml/features" +pax-cdi="mvn:org.ops4j.pax.cdi/pax-cdi-features/RELEASE/xml/features" +pax-jdbc="mvn:org.ops4j.pax.jdbc/pax-jdbc-features/RELEASE/xml/features" +pax-jms="mvn:org.ops4j.pax.jms/pax-jms-features/RELEASE/xml/features" +pax-jpa="mvn:org.ops4j.pax.jpa/pax-jpa-features/RELEASE/xml/features" +pax-keycloak="mvn:org.ops4j.pax.keycloak/pax-keycloak-features/RELEASE/xml/features" +pax-transx="mvn:org.ops4j.pax.transx/pax-transx-features/RELEASE/xml/features" +pax-web="mvn:org.ops4j.pax.web/pax-web-features/RELEASE/xml/features" +pax-wicket="mvn:org.ops4j.pax.wicket/pax-wicket-features/RELEASE/xml/features" +service.bundleLocation="?" +service.pid="org.apache.karaf.features.repos" +sling="mvn:org.apache.sling/org.apache.sling.karaf-features/RELEASE/xml/features" +spring="mvn:org.apache.karaf.features/spring/4.4.3/xml/features" +spring-legacy="mvn:org.apache.karaf.features/spring-legacy/4.4.3/xml/features" +wicket="mvn:org.ops4j.pax.wicket/features/RELEASE/xml/features" diff --git a/openhab/openhab_userdata/config/org/apache/karaf/http.config b/openhab/openhab_userdata/config/org/apache/karaf/http.config new file mode 100644 index 0000000..eaae903 --- /dev/null +++ b/openhab/openhab_userdata/config/org/apache/karaf/http.config @@ -0,0 +1,3 @@ +:org.apache.felix.configadmin.revision:=L"1" +_felix_.cm.newConfiguration=B"true" +service.pid="org.apache.karaf.http" diff --git a/openhab/openhab_userdata/config/org/apache/karaf/jaas.config b/openhab/openhab_userdata/config/org/apache/karaf/jaas.config new file mode 100644 index 0000000..f527887 --- /dev/null +++ b/openhab/openhab_userdata/config/org/apache/karaf/jaas.config @@ -0,0 +1,10 @@ +:org.apache.felix.configadmin.revision:=L"1" +encryption.algorithm="SHA-256" +encryption.enabled="true" +encryption.encoding="hexadecimal" +encryption.name="basic" +encryption.prefix="{CRYPT}" +encryption.suffix="{CRYPT}" +felix.fileinstall.filename="file:/openhab/userdata/etc/org.apache.karaf.jaas.cfg" +service.bundleLocation="?" +service.pid="org.apache.karaf.jaas" diff --git a/openhab/openhab_userdata/config/org/apache/karaf/kar.config b/openhab/openhab_userdata/config/org/apache/karaf/kar.config new file mode 100644 index 0000000..2b7bcdd --- /dev/null +++ b/openhab/openhab_userdata/config/org/apache/karaf/kar.config @@ -0,0 +1,7 @@ +:org.apache.felix.configadmin.revision:=L"1" +felix.fileinstall.filename="file:/openhab/userdata/etc/org.apache.karaf.kar.cfg" +karStorage="/openhab/userdata/tmp/kar" +noAutoRefreshBundles="false" +noAutoStartBundles="false" +service.bundleLocation="?" +service.pid="org.apache.karaf.kar" diff --git a/openhab/openhab_userdata/config/org/apache/karaf/log.config b/openhab/openhab_userdata/config/org/apache/karaf/log.config new file mode 100644 index 0000000..36f7554 --- /dev/null +++ b/openhab/openhab_userdata/config/org/apache/karaf/log.config @@ -0,0 +1,6 @@ +:org.apache.felix.configadmin.revision:=L"1" +felix.fileinstall.filename="file:/openhab/userdata/etc/org.apache.karaf.log.cfg" +pattern="%d{HH:mm:ss.SSS}\ [%-5.5p]\ [%-37.37c]\ -\ %h{%m}%n" +service.bundleLocation="?" +service.pid="org.apache.karaf.log" +size="500" diff --git a/openhab/openhab_userdata/config/org/apache/karaf/shell.config b/openhab/openhab_userdata/config/org/apache/karaf/shell.config new file mode 100644 index 0000000..636e6c9 --- /dev/null +++ b/openhab/openhab_userdata/config/org/apache/karaf/shell.config @@ -0,0 +1,13 @@ +:org.apache.felix.configadmin.revision:=L"1" +completionMode="GLOBAL" +disableEofExit="false" +disableLogout="false" +felix.fileinstall.filename="file:/openhab/userdata/etc/org.apache.karaf.shell.cfg" +hostKey="/openhab/userdata/etc/host.key" +service.bundleLocation="?" +service.pid="org.apache.karaf.shell" +sftpEnabled="true" +sshHost="127.0.0.1" +sshIdleTimeout="1800000" +sshPort="8101" +sshRealm="karaf" diff --git a/openhab/openhab_userdata/config/org/jupnp.config b/openhab/openhab_userdata/config/org/jupnp.config new file mode 100644 index 0000000..6969160 --- /dev/null +++ b/openhab/openhab_userdata/config/org/jupnp.config @@ -0,0 +1,7 @@ +:org.apache.felix.configadmin.revision:=L"1" +asyncThreadPoolSize="30" +felix.fileinstall.filename="file:/openhab/userdata/etc/org.jupnp.cfg" +multicastResponsePort="0" +service.bundleLocation="?" +service.pid="org.jupnp" +threadPoolSize="15" diff --git a/openhab/openhab_userdata/config/org/openhab/addons.config b/openhab/openhab_userdata/config/org/openhab/addons.config new file mode 100644 index 0000000..74bb0fe --- /dev/null +++ b/openhab/openhab_userdata/config/org/openhab/addons.config @@ -0,0 +1,3 @@ +:org.apache.felix.configadmin.revision:=L"1" +_felix_.cm.newConfiguration=B"true" +service.pid="org.openhab.addons" diff --git a/openhab/openhab_userdata/config/org/openhab/audio.config b/openhab/openhab_userdata/config/org/openhab/audio.config new file mode 100644 index 0000000..01153d2 --- /dev/null +++ b/openhab/openhab_userdata/config/org/openhab/audio.config @@ -0,0 +1,5 @@ +:org.apache.felix.configadmin.revision:=L"1" +defaultSink="enhancedjavasound" +felix.fileinstall.filename="file:/openhab/userdata/etc/org.openhab.audio.cfg" +service.bundleLocation="?" +service.pid="org.openhab.audio" diff --git a/openhab/openhab_userdata/config/org/openhab/autoupdate.config b/openhab/openhab_userdata/config/org/openhab/autoupdate.config new file mode 100644 index 0000000..c2731e9 --- /dev/null +++ b/openhab/openhab_userdata/config/org/openhab/autoupdate.config @@ -0,0 +1,3 @@ +:org.apache.felix.configadmin.revision:=L"1" +sendOptimisticUpdates="true" +service.pid="org.openhab.autoupdate" diff --git a/openhab/openhab_userdata/config/org/openhab/basicui.config b/openhab/openhab_userdata/config/org/openhab/basicui.config new file mode 100644 index 0000000..2ce4ad3 --- /dev/null +++ b/openhab/openhab_userdata/config/org/openhab/basicui.config @@ -0,0 +1,3 @@ +:org.apache.felix.configadmin.revision:=L"1" +_felix_.cm.newConfiguration=B"true" +service.pid="org.openhab.basicui" diff --git a/openhab/openhab_userdata/config/org/openhab/core/service/WatchService/4c0ca031-fc00-41d8-8c46-4474cc442330.config b/openhab/openhab_userdata/config/org/openhab/core/service/WatchService/4c0ca031-fc00-41d8-8c46-4474cc442330.config new file mode 100644 index 0000000..44fe25e --- /dev/null +++ b/openhab/openhab_userdata/config/org/openhab/core/service/WatchService/4c0ca031-fc00-41d8-8c46-4474cc442330.config @@ -0,0 +1,6 @@ +:org.apache.felix.configadmin.revision:=L"1" +name="configWatcher" +path="/openhab/conf" +service.bundleLocation="?" +service.factoryPid="org.openhab.core.service.WatchService" +service.pid="org.openhab.core.service.WatchService.4c0ca031-fc00-41d8-8c46-4474cc442330" diff --git a/openhab/openhab_userdata/config/org/openhab/folder.config b/openhab/openhab_userdata/config/org/openhab/folder.config new file mode 100644 index 0000000..4eec7da --- /dev/null +++ b/openhab/openhab_userdata/config/org/openhab/folder.config @@ -0,0 +1,8 @@ +:org.apache.felix.configadmin.revision:=L"1" +items="items" +persistence="persist" +rules="rules" +scripts="script" +service.pid="org.openhab.folder" +sitemaps="sitemap" +things="things" diff --git a/openhab/openhab_userdata/config/org/openhab/rrd4j.config b/openhab/openhab_userdata/config/org/openhab/rrd4j.config new file mode 100644 index 0000000..9f8418f --- /dev/null +++ b/openhab/openhab_userdata/config/org/openhab/rrd4j.config @@ -0,0 +1,3 @@ +:org.apache.felix.configadmin.revision:=L"1" +_felix_.cm.newConfiguration=B"true" +service.pid="org.openhab.rrd4j" diff --git a/openhab/openhab_userdata/config/org/openhab/runtime.config b/openhab/openhab_userdata/config/org/openhab/runtime.config new file mode 100644 index 0000000..699b0cd --- /dev/null +++ b/openhab/openhab_userdata/config/org/openhab/runtime.config @@ -0,0 +1,3 @@ +:org.apache.felix.configadmin.revision:=L"1" +_felix_.cm.newConfiguration=B"true" +service.pid="org.openhab.runtime" diff --git a/openhab/openhab_userdata/config/org/openhab/services.config b/openhab/openhab_userdata/config/org/openhab/services.config new file mode 100644 index 0000000..17cc80a --- /dev/null +++ b/openhab/openhab_userdata/config/org/openhab/services.config @@ -0,0 +1,3 @@ +:org.apache.felix.configadmin.revision:=L"1" +_felix_.cm.newConfiguration=B"true" +service.pid="org.openhab.services" diff --git a/openhab/openhab_userdata/config/org/openhab/startlevel.config b/openhab/openhab_userdata/config/org/openhab/startlevel.config new file mode 100644 index 0000000..d90ce9f --- /dev/null +++ b/openhab/openhab_userdata/config/org/openhab/startlevel.config @@ -0,0 +1,8 @@ +20="dsl:items,managed:item,dsl:things,managed:thing,managed:itemchannellink,dsl:persist,managed:metadata" +30="persistence:restore,automation:scriptEngineFactories" +40="dsl:rules,managed:rule,rules:refresh,rules:dslprovider" +50="ruleengine:start" +70="dsl:sitemap" +80="things:handler" +:org.apache.felix.configadmin.revision:=L"1" +service.pid="org.openhab.startlevel" diff --git a/openhab/openhab_userdata/config/org/openhab/threadpool.config b/openhab/openhab_userdata/config/org/openhab/threadpool.config new file mode 100644 index 0000000..ed1a881 --- /dev/null +++ b/openhab/openhab_userdata/config/org/openhab/threadpool.config @@ -0,0 +1,5 @@ +:org.apache.felix.configadmin.revision:=L"1" +discovery="5" +safeCall="10" +service.pid="org.openhab.threadpool" +thingHandler="5" diff --git a/openhab/openhab_userdata/config/org/openhab/voice.config b/openhab/openhab_userdata/config/org/openhab/voice.config new file mode 100644 index 0000000..f1f1e95 --- /dev/null +++ b/openhab/openhab_userdata/config/org/openhab/voice.config @@ -0,0 +1,5 @@ +:org.apache.felix.configadmin.revision:=L"1" +defaultHLI="rulehli" +felix.fileinstall.filename="file:/openhab/userdata/etc/org.openhab.voice.cfg" +service.bundleLocation="?" +service.pid="org.openhab.voice" diff --git a/openhab/openhab_userdata/config/org/ops4j/pax/logging.config b/openhab/openhab_userdata/config/org/ops4j/pax/logging.config new file mode 100644 index 0000000..40914c4 --- /dev/null +++ b/openhab/openhab_userdata/config/org/ops4j/pax/logging.config @@ -0,0 +1,5 @@ +:org.apache.felix.configadmin.revision:=L"1" +felix.fileinstall.filename="file:/openhab/userdata/etc/org.ops4j.pax.logging.cfg" +org.ops4j.pax.logging.log4j2.config.file="/openhab/userdata/etc/log4j2.xml" +service.bundleLocation="?" +service.pid="org.ops4j.pax.logging" diff --git a/openhab/openhab_userdata/config/org/ops4j/pax/url/mvn.config b/openhab/openhab_userdata/config/org/ops4j/pax/url/mvn.config new file mode 100644 index 0000000..8da6e79 --- /dev/null +++ b/openhab/openhab_userdata/config/org/ops4j/pax/url/mvn.config @@ -0,0 +1,17 @@ +:org.apache.felix.configadmin.revision:=L"1" +felix.fileinstall.filename="file:/openhab/userdata/etc/org.ops4j.pax.url.mvn.cfg" +org.ops4j.pax.url.mvn.connection.bufferSize="8192" +org.ops4j.pax.url.mvn.connection.retryCount="3" +org.ops4j.pax.url.mvn.defaultRepositories="file:/openhab/runtime/system@id\=system.repository@snapshots,\ file:/openhab/userdata/tmp/kar@id\=kar.repository@multi@snapshots,\ file:/openhab/userdata/system@id\=child.system.repository@snapshots" +org.ops4j.pax.url.mvn.localRepository="/openhab/userdata/tmp/mvn" +org.ops4j.pax.url.mvn.repositories="https://openhab.jfrog.io/openhab/libs-release@id\=openhab" +org.ops4j.pax.url.mvn.socket.connectionTimeout="5000" +org.ops4j.pax.url.mvn.socket.keepAlive="false" +org.ops4j.pax.url.mvn.socket.linger="-1" +org.ops4j.pax.url.mvn.socket.readTimeout="30000" +org.ops4j.pax.url.mvn.socket.reuseAddress="false" +org.ops4j.pax.url.mvn.socket.tcpNoDelay="true" +org.ops4j.pax.url.mvn.timeout="5000" +org.ops4j.pax.url.mvn.useFallbackRepositories="false" +service.bundleLocation="?" +service.pid="org.ops4j.pax.url.mvn" diff --git a/openhab/openhab_userdata/config/org/ops4j/pax/web.config b/openhab/openhab_userdata/config/org/ops4j/pax/web.config new file mode 100644 index 0000000..70b1c11 --- /dev/null +++ b/openhab/openhab_userdata/config/org/ops4j/pax/web.config @@ -0,0 +1,13 @@ +:org.apache.felix.configadmin.revision:=L"1" +felix.fileinstall.filename="file:/openhab/userdata/etc/org.ops4j.pax.web.cfg" +org.ops4j.pax.web.config.file="/openhab/runtime/etc/jetty.xml" +org.ops4j.pax.web.server.idleTimeout="300000" +org.ops4j.pax.web.server.maxThreads="50" +org.ops4j.pax.web.server.minThreads="2" +org.ops4j.pax.web.session.timeout="10" +org.ops4j.pax.web.ssl.clientauthneeded="false" +org.ops4j.pax.web.ssl.clientauthwanted="false" +org.osgi.service.http.secure.enabled="true" +org.osgi.service.http.useNIO="true" +service.bundleLocation="?" +service.pid="org.ops4j.pax.web" diff --git a/openhab/openhab_userdata/config/org_apache_felix_cm_impl_DynamicBindings.config b/openhab/openhab_userdata/config/org_apache_felix_cm_impl_DynamicBindings.config new file mode 100644 index 0000000..e0d0c22 --- /dev/null +++ b/openhab/openhab_userdata/config/org_apache_felix_cm_impl_DynamicBindings.config @@ -0,0 +1 @@ +org.openhab.addons="mvn:org.openhab.core.bundles/org.openhab.core.karaf/4.0.3" diff --git a/openhab/openhab_userdata/config/profile.config b/openhab/openhab_userdata/config/profile.config new file mode 100644 index 0000000..89a3f91 --- /dev/null +++ b/openhab/openhab_userdata/config/profile.config @@ -0,0 +1,112 @@ +:org.apache.felix.configadmin.revision:=L"1" +attribute.overlay="true" +attribute.parents="generated-startup\ generated-boot\ generated-installed" +feature.bundle="bundle" +feature.config="config" +feature.deployer="deployer" +feature.diagnostic="diagnostic" +feature.distro-kar/4.0.3="distro-kar/4.0.3" +feature.distro/4.0.3="distro/4.0.3" +feature.eventadmin="eventadmin" +feature.feature="feature" +feature.framework="framework" +feature.instance="instance" +feature.jaas="jaas" +feature.kar="kar" +feature.log="log" +feature.openhab-core-addon-marketplace/4.0.3="openhab-core-addon-marketplace/4.0.3" +feature.openhab-core-auth-jaas/4.0.3="openhab-core-auth-jaas/4.0.3" +feature.openhab-core-auth-oauth2client/4.0.3="openhab-core-auth-oauth2client/4.0.3" +feature.openhab-core-automation-module-media/4.0.3="openhab-core-automation-module-media/4.0.3" +feature.openhab-core-automation-module-script-rulesupport/4.0.3="openhab-core-automation-module-script-rulesupport/4.0.3" +feature.openhab-core-automation-module-script/4.0.3="openhab-core-automation-module-script/4.0.3" +feature.openhab-core-automation-rest/4.0.3="openhab-core-automation-rest/4.0.3" +feature.openhab-core-base/4.0.3="openhab-core-base/4.0.3" +feature.openhab-core-io-bin2json/4.0.3="openhab-core-io-bin2json/4.0.3" +feature.openhab-core-io-console-karaf/4.0.3="openhab-core-io-console-karaf/4.0.3" +feature.openhab-core-io-http-auth/4.0.3="openhab-core-io-http-auth/4.0.3" +feature.openhab-core-io-rest-audio/4.0.3="openhab-core-io-rest-audio/4.0.3" +feature.openhab-core-io-rest-auth/4.0.3="openhab-core-io-rest-auth/4.0.3" +feature.openhab-core-io-rest-log/4.0.3="openhab-core-io-rest-log/4.0.3" +feature.openhab-core-io-rest-mdns/4.0.3="openhab-core-io-rest-mdns/4.0.3" +feature.openhab-core-io-rest-sitemap/4.0.3="openhab-core-io-rest-sitemap/4.0.3" +feature.openhab-core-io-rest-swagger/4.0.3="openhab-core-io-rest-swagger/4.0.3" +feature.openhab-core-io-rest-transform/4.0.3="openhab-core-io-rest-transform/4.0.3" +feature.openhab-core-io-rest-voice/4.0.3="openhab-core-io-rest-voice/4.0.3" +feature.openhab-core-io-transport-coap/4.0.3="openhab-core-io-transport-coap/4.0.3" +feature.openhab-core-io-transport-http/4.0.3="openhab-core-io-transport-http/4.0.3" +feature.openhab-core-io-transport-mdns/4.0.3="openhab-core-io-transport-mdns/4.0.3" +feature.openhab-core-io-transport-modbus/4.0.3="openhab-core-io-transport-modbus/4.0.3" +feature.openhab-core-io-transport-mqtt/4.0.3="openhab-core-io-transport-mqtt/4.0.3" +feature.openhab-core-io-transport-serial-javacomm/4.0.3="openhab-core-io-transport-serial-javacomm/4.0.3" +feature.openhab-core-io-transport-upnp/4.0.3="openhab-core-io-transport-upnp/4.0.3" +feature.openhab-core-io-websocket/4.0.3="openhab-core-io-websocket/4.0.3" +feature.openhab-core-model-item-ide/4.0.3="openhab-core-model-item-ide/4.0.3" +feature.openhab-core-model-item/4.0.3="openhab-core-model-item/4.0.3" +feature.openhab-core-model-lsp/4.0.3="openhab-core-model-lsp/4.0.3" +feature.openhab-core-model-persistence-ide/4.0.3="openhab-core-model-persistence-ide/4.0.3" +feature.openhab-core-model-persistence/4.0.3="openhab-core-model-persistence/4.0.3" +feature.openhab-core-model-rule-ide/4.0.3="openhab-core-model-rule-ide/4.0.3" +feature.openhab-core-model-rule/4.0.3="openhab-core-model-rule/4.0.3" +feature.openhab-core-model-script-ide/4.0.3="openhab-core-model-script-ide/4.0.3" +feature.openhab-core-model-script/4.0.3="openhab-core-model-script/4.0.3" +feature.openhab-core-model-sitemap-ide/4.0.3="openhab-core-model-sitemap-ide/4.0.3" +feature.openhab-core-model-sitemap/4.0.3="openhab-core-model-sitemap/4.0.3" +feature.openhab-core-model-thing-ide/4.0.3="openhab-core-model-thing-ide/4.0.3" +feature.openhab-core-model-thing/4.0.3="openhab-core-model-thing/4.0.3" +feature.openhab-core-storage-json/4.0.3="openhab-core-storage-json/4.0.3" +feature.openhab-core-ui-icon/4.0.3="openhab-core-ui-icon/4.0.3" +feature.openhab-core-ui/4.0.3="openhab-core-ui/4.0.3" +feature.openhab-runtime-base="openhab-runtime-base" +feature.openhab-runtime-base/4.0.3="openhab-runtime-base/4.0.3" +feature.openhab-runtime-certificate/4.0.3="openhab-runtime-certificate/4.0.3" +feature.openhab-runtime-ui="openhab-runtime-ui" +feature.openhab-runtime-ui/4.0.3="openhab-runtime-ui/4.0.3" +feature.openhab-transport-coap/4.0.3="openhab-transport-coap/4.0.3" +feature.openhab-transport-http/4.0.3="openhab-transport-http/4.0.3" +feature.openhab-transport-mdns/4.0.3="openhab-transport-mdns/4.0.3" +feature.openhab-transport-modbus/4.0.3="openhab-transport-modbus/4.0.3" +feature.openhab-transport-mqtt/4.0.3="openhab-transport-mqtt/4.0.3" +feature.openhab-transport-serial/4.0.3="openhab-transport-serial/4.0.3" +feature.openhab-transport-upnp/4.0.3="openhab-transport-upnp/4.0.3" +feature.openhab.inc-model-core/4.0.3="openhab.inc-model-core/4.0.3" +feature.openhab.tp-asm/4.0.3="openhab.tp-asm/4.0.3" +feature.openhab.tp-base/4.0.3="openhab.tp-base/4.0.3" +feature.openhab.tp-coap/4.0.3="openhab.tp-coap/4.0.3" +feature.openhab.tp-commons-net/4.0.3="openhab.tp-commons-net/4.0.3" +feature.openhab.tp-cxf/4.0.3="openhab.tp-cxf/4.0.3" +feature.openhab.tp-gson/4.0.3="openhab.tp-gson/4.0.3" +feature.openhab.tp-hivemqclient/4.0.3="openhab.tp-hivemqclient/4.0.3" +feature.openhab.tp-httpclient/4.0.3="openhab.tp-httpclient/4.0.3" +feature.openhab.tp-jackson/4.0.3="openhab.tp-jackson/4.0.3" +feature.openhab.tp-jax-rs-whiteboard/4.0.3="openhab.tp-jax-rs-whiteboard/4.0.3" +feature.openhab.tp-jaxb/4.0.3="openhab.tp-jaxb/4.0.3" +feature.openhab.tp-jaxws/4.0.3="openhab.tp-jaxws/4.0.3" +feature.openhab.tp-jbbp/4.0.3="openhab.tp-jbbp/4.0.3" +feature.openhab.tp-jmdns/4.0.3="openhab.tp-jmdns/4.0.3" +feature.openhab.tp-jna/4.0.3="openhab.tp-jna/4.0.3" +feature.openhab.tp-jollyday/4.0.3="openhab.tp-jollyday/4.0.3" +feature.openhab.tp-jose4j/4.0.3="openhab.tp-jose4j/4.0.3" +feature.openhab.tp-jupnp/4.0.3="openhab.tp-jupnp/4.0.3" +feature.openhab.tp-lsp4j/4.0.3="openhab.tp-lsp4j/4.0.3" +feature.openhab.tp-netty/4.0.3="openhab.tp-netty/4.0.3" +feature.openhab.tp-serial-javacomm/4.0.3="openhab.tp-serial-javacomm/4.0.3" +feature.openhab.tp-serial-rxtx/4.0.3="openhab.tp-serial-rxtx/4.0.3" +feature.openhab.tp-swagger-jaxrs/4.0.3="openhab.tp-swagger-jaxrs/4.0.3" +feature.openhab.tp-xtext-ide/4.0.3="openhab.tp-xtext-ide/4.0.3" +feature.openhab.tp-xtext/4.0.3="openhab.tp-xtext/4.0.3" +feature.package="package" +feature.service="service" +feature.shell="shell" +feature.ssh="ssh" +feature.system="system" +feature.wrap="wrap" +feature.wrapper="wrapper" +felix.fileinstall.filename="file:/openhab/userdata/etc/profile.cfg" +repository.mvn:org.apache.karaf.features/framework/4.4.3/xml/features="mvn:org.apache.karaf.features/framework/4.4.3/xml/features" +repository.mvn:org.apache.karaf.features/standard/4.4.3/xml/features="mvn:org.apache.karaf.features/standard/4.4.3/xml/features" +repository.mvn:org.openhab.distro/distro-kar/4.0.3/xml/features="mvn:org.openhab.distro/distro-kar/4.0.3/xml/features" +repository.mvn:org.openhab.distro/distro/4.0.3/xml/features="mvn:org.openhab.distro/distro/4.0.3/xml/features" +repository.mvn:org.openhab.distro/openhab-addons/4.0.3/xml/features="mvn:org.openhab.distro/openhab-addons/4.0.3/xml/features" +service.bundleLocation="?" +service.pid="profile" diff --git a/openhab/openhab_userdata/etc/all.policy b/openhab/openhab_userdata/etc/all.policy new file mode 100644 index 0000000..7585f22 --- /dev/null +++ b/openhab/openhab_userdata/etc/all.policy @@ -0,0 +1,22 @@ +//=========================================================================== +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You 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. +// +//=========================================================================== + +grant { + permission java.security.AllPermission; +}; diff --git a/openhab/openhab_userdata/etc/branding-ssh.properties b/openhab/openhab_userdata/etc/branding-ssh.properties new file mode 100644 index 0000000..df03670 --- /dev/null +++ b/openhab/openhab_userdata/etc/branding-ssh.properties @@ -0,0 +1,12 @@ +welcome = \r\n\ +\u001B[91m \u001B[97m _ _ _ ____ \u001B[0m\r\n\ +\u001B[91m ___ ___ ___ ___ \u001B[97m| | | | / \\ | __ ) \u001B[0m\r\n\ +\u001B[91m / _ \\ / _ \\ / _ \\ / _ \\ \u001B[97m| |_| | / _ \\ | _ \\ \u001B[0m\r\n\ +\u001B[91m | (_) | (_) | __/| | | |\u001B[97m| _ | / ___ \\ | |_) )\u001B[0m\r\n\ +\u001B[91m \\___/| __/ \\___/|_| |_|\u001B[97m|_| |_|/_/ \\_\\|____/ \u001B[0m\r\n\ +\u001B[91m |_| \u001B[0m 4.0.3 - Release Build\u001B[0m\r\n\ +\r\n\ +Use '\u001B[1m\u001B[0m' for a list of available commands\r\n\ + and '\u001B[1m[cmd] --help\u001B[0m' for help on a specific command.\r\n\ +To exit, use '\u001B[1m\u001B[0m' or '\u001B[1mlogout\u001B[0m'.\r\n +prompt = \u001B[36mopenhab>\u001B[0m diff --git a/openhab/openhab_userdata/etc/branding.properties b/openhab/openhab_userdata/etc/branding.properties new file mode 100644 index 0000000..df03670 --- /dev/null +++ b/openhab/openhab_userdata/etc/branding.properties @@ -0,0 +1,12 @@ +welcome = \r\n\ +\u001B[91m \u001B[97m _ _ _ ____ \u001B[0m\r\n\ +\u001B[91m ___ ___ ___ ___ \u001B[97m| | | | / \\ | __ ) \u001B[0m\r\n\ +\u001B[91m / _ \\ / _ \\ / _ \\ / _ \\ \u001B[97m| |_| | / _ \\ | _ \\ \u001B[0m\r\n\ +\u001B[91m | (_) | (_) | __/| | | |\u001B[97m| _ | / ___ \\ | |_) )\u001B[0m\r\n\ +\u001B[91m \\___/| __/ \\___/|_| |_|\u001B[97m|_| |_|/_/ \\_\\|____/ \u001B[0m\r\n\ +\u001B[91m |_| \u001B[0m 4.0.3 - Release Build\u001B[0m\r\n\ +\r\n\ +Use '\u001B[1m\u001B[0m' for a list of available commands\r\n\ + and '\u001B[1m[cmd] --help\u001B[0m' for help on a specific command.\r\n\ +To exit, use '\u001B[1m\u001B[0m' or '\u001B[1mlogout\u001B[0m'.\r\n +prompt = \u001B[36mopenhab>\u001B[0m diff --git a/openhab/openhab_userdata/etc/config.properties b/openhab/openhab_userdata/etc/config.properties new file mode 100644 index 0000000..c46ef60 --- /dev/null +++ b/openhab/openhab_userdata/etc/config.properties @@ -0,0 +1,322 @@ +################################################################################ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +################################################################################ + +# +# This file lists Karaf default settings for this particular version of Karaf. +# For easier maintenance when upgrading Karaf and to better document which +# default values have changed, it is recommended to place any changes to +# these values in a custom.properties file in the same folder as this file. +# Each value specified in custom.properties will override the default value +# here. +# + +# +# Properties file inclusions (as a space separated list of relative paths) +# Included files will override the values specified in this file +# NB: ${includes} properties files are mandatory, it means that Karaf will not start +# if the include file is not found +# +${includes} = jre.properties custom.properties + +# +# Properties file inclusions (as a space separated list of relative paths) +# Included files will override the values specified in this file +# NB: ${optionals} properties files are optionals, it means that Karaf will just +# display a warning message but the bootstrap will be performed +# +# ${optionals} = my.properties + +# +# Framework selection properties +# +karaf.framework=felix + +# +# Location of the OSGi frameworks +# +karaf.framework.equinox=mvn\:org.eclipse.platform/org.eclipse.osgi/3.18.0 +karaf.framework.felix=mvn\:org.apache.felix/org.apache.felix.framework/7.0.5 + +# +# Framework config properties. +# +org.osgi.framework.system.packages= \ + org.osgi.dto;version="1.1",\ + org.osgi.resource;version="1.0",\ + org.osgi.resource.dto;version="1.0";uses:="org.osgi.dto",\ + org.osgi.framework;version="1.10",\ + org.osgi.framework.dto;version="1.10";uses:="org.osgi.dto",\ + org.osgi.framework.hooks.bundle;version="1.1";uses:="org.osgi.framework",\ + org.osgi.framework.hooks.resolver;version="1.0";uses:="org.osgi.framework.wiring",\ + org.osgi.framework.hooks.service;version="1.1";uses:="org.osgi.framework",\ + org.osgi.framework.hooks.weaving;version="1.1";uses:="org.osgi.framework.wiring",\ + org.osgi.framework.launch;version="1.2";uses:="org.osgi.framework",\ + org.osgi.framework.namespace;version="1.1";uses:="org.osgi.resource",\ + org.osgi.framework.startlevel;version="1.0";uses:="org.osgi.framework",\ + org.osgi.framework.startlevel.dto;version="1.0";uses:="org.osgi.dto",\ + org.osgi.framework.wiring;version="1.2";uses:="org.osgi.framework,org.osgi.resource",\ + org.osgi.framework.wiring.dto;version="1.3";uses:="org.osgi.dto,org.osgi.resource.dto",\ + org.osgi.service.condpermadmin;version="1.1.1";uses:="org.osgi.framework,org.osgi.service.permissionadmin",\ + org.osgi.service.packageadmin;version="1.2";uses:="org.osgi.framework",org.osgi.service.permissionadmin;version="1.2",\ + org.osgi.service.resolver;version="1.1";uses:="org.osgi.resource",\ + org.osgi.service.startlevel;version="1.1";uses:="org.osgi.framework",\ + org.osgi.service.url;version="1.0",\ + org.osgi.util.tracker;version="1.5.2";uses:="org.osgi.framework",\ + org.apache.karaf.version;version="4.4.3",\ + org.apache.karaf.jaas.boot.principal;uses:=javax.security.auth;version="4.4.3",\ + org.apache.karaf.jaas.boot;uses:="javax.security.auth,javax.security.auth.callback,javax.security.auth.login,javax.security.auth.spi,org.osgi.framework";version="4.4.3",\ + org.apache.karaf.info;version="4.4.3",\ + ${jre-${java.specification.version}} + +# +# Extra packages appended after standard packages +# +org.osgi.framework.system.packages.extra = \ + org.apache.karaf.branding, \ + sun.misc, \ + com.sun.jmx.remote.protocol, \ + com.sun.jmx.remote.protocol.jmxmp, \ + org.apache.karaf.jaas.boot.principal;uses:=javax.security.auth;version=4.4.3, \ + org.apache.karaf.jaas.boot;uses:=\"javax.security.auth,javax.security.auth.callback,javax.security.auth.login,javax.security.auth.spi,org.osgi.framework\";version=4.4.3, \ + org.apache.karaf.diagnostic.core;uses:=org.osgi.framework;version=4.4.3, \ + org.apache.karaf.diagnostic.core.common;uses:=org.apache.karaf.diagnostic.core;version=4.4.3 + +org.osgi.framework.system.capabilities= \ + ${eecap-${java.specification.version}}, \ + ${${karaf.framework}-capabilities}, \ + ${karaf-capabilities} + +karaf-capabilities= \ + osgi.service;objectClass:List=org.apache.karaf.info.ServerInfo + +felix-capabilities= \ + osgi.service;objectClass:List=org.osgi.service.packageadmin.PackageAdmin, \ + osgi.service;objectClass:List=org.osgi.service.resolver.Resolver, \ + osgi.service;objectClass:List=org.osgi.service.startlevel.StartLevel + +equinox-capabilities= \ + osgi.service;objectClass:List=java.lang.ClassLoader;equinox.classloader.type=contextClassLoader, \ + osgi.service;objectClass:List=javax.xml.parsers.DocumentBuilderFactory, \ + osgi.service;objectClass:List=javax.xml.parsers.SAXParserFactory, \ + osgi.service;objectClass:List=org.eclipse.osgi.framework.log.FrameworkLog, \ + osgi.service;objectClass:List=org.eclipse.osgi.framework.log.FrameworkLog;performance=true, \ + osgi.service;objectClass:List=org.eclipse.osgi.service.datalocation.Location;type=eclipse.home.location, \ + osgi.service;objectClass:List=org.eclipse.osgi.service.datalocation.Location;type=osgi.configuration.area, \ + osgi.service;objectClass:List=org.eclipse.osgi.service.datalocation.Location;type=osgi.install.area, \ + osgi.service;objectClass:List=org.eclipse.osgi.service.datalocation.Location;type=osgi.instance.area, \ + osgi.service;objectClass:List=org.eclipse.osgi.service.datalocation.Location;type=osgi.user.area, \ + osgi.service;objectClass:List=org.eclipse.osgi.service.debug.DebugOptions, \ + osgi.service;objectClass:List=org.eclipse.osgi.service.environment.EnvironmentInfo, \ + osgi.service;objectClass:List=org.eclipse.osgi.service.localization.BundleLocalization, \ + osgi.service;objectClass:List="org.osgi.service.log.LogReaderService,org.eclipse.equinox.log.ExtendedLogReaderService", \ + osgi.service;objectClass:List="org.osgi.service.log.LogService,org.eclipse.equinox.log.ExtendedLogService", \ + osgi.service;objectClass:List=org.eclipse.osgi.service.security.TrustEngine;osgi.signedcontent.trust.engine=org.eclipse.osgi, \ + osgi.service;objectClass:List=org.eclipse.osgi.service.urlconversion.URLConverter;protocol:List="bundleentry,bundleresource" + +eecap-18 = osgi.ee; osgi.ee="OSGi/Minimum"; version:List="1.0,1.1,1.2", \ + osgi.ee; osgi.ee="JavaSE"; version:List="1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,9.0,10.0,11.0,13.0,14.0,15.0,16.0,17.0,18.0", \ + osgi.ee; osgi.ee="JRE"; version:List="1.0,1.1", \ + osgi.ee; osgi.ee="JavaSE/compact1"; version:List="1.8,9.0,10.0,11.0,13.0,14.0,15.0,16.0,17.0,18.0", \ + osgi.ee; osgi.ee="JavaSE/compact2"; version:List="1.8,9.0,10.0,11.0,13.0,14.0,15.0,16.0,17.0,18.0", \ + osgi.ee; osgi.ee="JavaSE/compact3"; version:List="1.8,9.0,10.0,11.0,13.0,14.0,15.0,16.0,17.0,18.0" +eecap-17 = osgi.ee; osgi.ee="OSGi/Minimum"; version:List="1.0,1.1,1.2", \ + osgi.ee; osgi.ee="JavaSE"; version:List="1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,9.0,10.0,11.0,13.0,14.0,15.0,16.0,17.0", \ + osgi.ee; osgi.ee="JRE"; version:List="1.0,1.1", \ + osgi.ee; osgi.ee="JavaSE/compact1"; version:List="1.8,9.0,10.0,11.0,13.0,14.0,15.0,16.0,17.0", \ + osgi.ee; osgi.ee="JavaSE/compact2"; version:List="1.8,9.0,10.0,11.0,13.0,14.0,15.0,16.0,17.0", \ + osgi.ee; osgi.ee="JavaSE/compact3"; version:List="1.8,9.0,10.0,11.0,13.0,14.0,15.0,16.0,17.0" +eecap-16 = osgi.ee; osgi.ee="OSGi/Minimum"; version:List="1.0,1.1,1.2", \ + osgi.ee; osgi.ee="JavaSE"; version:List="1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,9.0,10.0,11.0,13.0,14.0,15.0,16.0", \ + osgi.ee; osgi.ee="JRE"; version:List="1.0,1.1", \ + osgi.ee; osgi.ee="JavaSE/compact1"; version:List="1.8,9.0,10.0,11.0,13.0,14.0,15.0,16.0", \ + osgi.ee; osgi.ee="JavaSE/compact2"; version:List="1.8,9.0,10.0,11.0,13.0,14.0,15.0,16.0", \ + osgi.ee; osgi.ee="JavaSE/compact3"; version:List="1.8,9.0,10.0,11.0,13.0,14.0,15.0,16.0" +eecap-15 = osgi.ee; osgi.ee="OSGi/Minimum"; version:List="1.0,1.1,1.2", \ + osgi.ee; osgi.ee="JavaSE"; version:List="1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,9.0,10.0,11.0,13.0,14.0,15.0", \ + osgi.ee; osgi.ee="JRE"; version:List="1.0,1.1", \ + osgi.ee; osgi.ee="JavaSE/compact1"; version:List="1.8,9.0,10.0,11.0,13.0,14.0,15.0", \ + osgi.ee; osgi.ee="JavaSE/compact2"; version:List="1.8,9.0,10.0,11.0,13.0,14.0,15.0", \ + osgi.ee; osgi.ee="JavaSE/compact3"; version:List="1.8,9.0,10.0,11.0,13.0,14.0,15.0" +eecap-14 = osgi.ee; osgi.ee="OSGi/Minimum"; version:List="1.0,1.1,1.2", \ + osgi.ee; osgi.ee="JavaSE"; version:List="1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,9.0,10.0,11.0,13.0,14.0", \ + osgi.ee; osgi.ee="JRE"; version:List="1.0,1.1", \ + osgi.ee; osgi.ee="JavaSE/compact1"; version:List="1.8,9.0,10.0,11.0,13.0,14.0", \ + osgi.ee; osgi.ee="JavaSE/compact2"; version:List="1.8,9.0,10.0,11.0,13.0,14.0", \ + osgi.ee; osgi.ee="JavaSE/compact3"; version:List="1.8,9.0,10.0,11.0,13.0,14.0" +eecap-13 = osgi.ee; osgi.ee="OSGi/Minimum"; version:List="1.0,1.1,1.2", \ + osgi.ee; osgi.ee="JavaSE"; version:List="1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,9.0,10.0,11.0,13.0", \ + osgi.ee; osgi.ee="JRE"; version:List="1.0,1.1", \ + osgi.ee; osgi.ee="JavaSE/compact1"; version:List="1.8,9.0,10.0,11.0,13.0", \ + osgi.ee; osgi.ee="JavaSE/compact2"; version:List="1.8,9.0,10.0,11.0,13.0", \ + osgi.ee; osgi.ee="JavaSE/compact3"; version:List="1.8,9.0,10.0,11.0,13.0" +eecap-11= osgi.ee; osgi.ee="OSGi/Minimum"; version:List="1.0,1.1,1.2", \ + osgi.ee; osgi.ee="JavaSE"; version:List="1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,9.0,10.0,11.0", \ + osgi.ee; osgi.ee="JRE"; version:List="1.0,1.1", \ + osgi.ee; osgi.ee="JavaSE/compact1"; version:List="1.8,9.0,10.0,11.0", \ + osgi.ee; osgi.ee="JavaSE/compact2"; version:List="1.8,9.0,10.0,11.0", \ + osgi.ee; osgi.ee="JavaSE/compact3"; version:List="1.8,9.0,10.0,11.0" +eecap-10= osgi.ee; osgi.ee="OSGi/Minimum"; version:List="1.0,1.1,1.2", \ + osgi.ee; osgi.ee="JavaSE"; version:List="1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,9.0,10.0", \ + osgi.ee; osgi.ee="JRE"; version:List="1.0,1.1", \ + osgi.ee; osgi.ee="JavaSE/compact1"; version:List="1.8,9.0,10.0", \ + osgi.ee; osgi.ee="JavaSE/compact2"; version:List="1.8,9.0,10.0", \ + osgi.ee; osgi.ee="JavaSE/compact3"; version:List="1.8,9.0,10.0" +eecap-9= osgi.ee; osgi.ee="OSGi/Minimum"; version:List="1.0,1.1,1.2", \ + osgi.ee; osgi.ee="JavaSE"; version:List="1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,9.0", \ + osgi.ee; osgi.ee="JRE"; version:List="1.0,1.1", \ + osgi.ee; osgi.ee="JavaSE/compact1"; version:List="1.8,9.0", \ + osgi.ee; osgi.ee="JavaSE/compact2"; version:List="1.8,9.0", \ + osgi.ee; osgi.ee="JavaSE/compact3"; version:List="1.8,9.0" +eecap-1.8= osgi.ee; osgi.ee="OSGi/Minimum"; version:List="1.0,1.1,1.2", \ + osgi.ee; osgi.ee="JavaSE"; version:List="1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8", \ + osgi.ee; osgi.ee="JRE"; version:List="1.0,1.1", \ + osgi.ee; osgi.ee="JavaSE/compact1"; version:List="1.8", \ + osgi.ee; osgi.ee="JavaSE/compact2"; version:List="1.8", \ + osgi.ee; osgi.ee="JavaSE/compact3"; version:List="1.8" + +# +# javax.transaction is needed ONLY for com.sun.corba.se.impl.javax.rmi.CORBA.Util.mapSystemException(). +# JDK8 and earlier provide only 3 exception classes in this package, so full JTA API bundles should always try the +# bootdelegation first - even if they also package (and export) javax.transaction package +# +# boot delegation of javax.transaction.xa is needed to avoid class loader constraint violation when using javax.sql +# and this package is always complete in all JDKs +# +# javax.security.cert is needed by pax-transx-tm-narayana as it uses URLClassLoader and otherwise is unable to create +# object store. +# +org.osgi.framework.bootdelegation = \ + com.sun.*, \ + javax.transaction, \ + javax.transaction.xa, \ + javax.xml.crypto, \ + javax.xml.crypto.*, \ + javax.security.cert, \ + jdk.nashorn.*, \ + sun.*, \ + jdk.internal.reflect, \ + jdk.internal.reflect.*, \ + org.apache.karaf.jaas.boot.principal, \ + org.apache.karaf.jaas.boot + +# jVisualVM support +# in order to use Karaf with jvisualvm, the org.osgi.framework.bootdelegation property has to contain the org.netbeans.lib.profiler.server package +# and, so, it should look like: +# +# org.osgi.framework.bootdelegation=org.apache.karaf.jaas.boot,org.apache.karaf.jaas.boot.principal,sun.*,com.sun.*,javax.transaction,javax.transaction.*,javax.xml.crypto,javax.xml.crypto.*,org.apache.xerces.jaxp.datatype,org.apache.xerces.stax,org.apache.xerces.parsers,org.apache.xerces.jaxp,org.apache.xerces.jaxp.validation,org.apache.xerces.dom,org.netbeans.lib.profiler.server +# +# YourKit support +# in order to use Karaf with YourKit, the org.osgi.framework.bootdelegation property has to contain the com.yourkit.* packages +# and, so, it should look like: +# +# org.osgi.framework.bootdelegation=org.apache.karaf.jaas.boot,org.apache.karaf.jaas.boot.principal,sun.*,com.sun.*,javax.transaction,javax.transaction.*,javax.xml.crypto,javax.xml.crypto.*,org.apache.xerces.jaxp.datatype,org.apache.xerces.stax,org.apache.xerces.parsers,org.apache.xerces.jaxp,org.apache.xerces.jaxp.validation,org.apache.xerces.dom,com.yourkit.* +# + +# +# Set the parent classloader for the bundle to the classloader that loads the Framework (i.e. everything in lib/*.jar) +# +org.osgi.framework.bundle.parent=framework + +# +# Definition of the default bundle start level +# +org.osgi.framework.startlevel.beginning=100 +karaf.startlevel.bundle=80 + +# +# The location of the Karaf shutdown port file used to stop instance +# +karaf.shutdown.port.file=${karaf.data}/port + +# +# The location of the Karaf pid file +# +karaf.pid.file=${karaf.base}/karaf.pid + +# +# Configuration secrets file location +# +org.apache.felix.configadmin.plugin.interpolation.secretsdir=${karaf.etc} + +# +# Configuration FileMonitor properties +# +felix.fileinstall.enableConfigSave = true +felix.fileinstall.dir = ${karaf.etc} +felix.fileinstall.filter = .*\\.(cfg|config|json) +felix.fileinstall.poll = 1000 +felix.fileinstall.noInitialDelay = true +felix.fileinstall.log.level = 3 +felix.fileinstall.log.default = jul + +# Use cached urls for bundle CodeSource to avoid +# problems with JCE cached informations, see KARAF-3974 +felix.bundlecodesource.usecachedurls = true + +# +# Delay for writing the framework state to disk in equinox +# must be >= 1000 and <= 1800000 +# +eclipse.stateSaveDelayInterval = 1000 + +# +# OBR Repository list +# This property will be modified by the obr:addUrl and obr:removeUrl commands. +# +obr.repository.url = + +# +# Start blueprint bundles synchronously when possible +# +org.apache.aries.blueprint.synchronous=true + +# +# Do not weave all any classes by default +# +org.apache.aries.proxy.weaving.enabled= + +# +# mvn url handler requires config instance configuration +# +org.ops4j.pax.url.mvn.requireConfigAdminConfig=true + +# +# Don't delay the console startup. Set to true if you want the console to start after all other bundles +# +karaf.delay.console=false + +# +# Generated command shutdown +# +karaf.shutdown.command = 3671966a-c132-484c-b14d-9dfe27d34b1b + +# +# Enable native Karaf support for systemd's watchdog. +# +# In addition to setting the flag to true, the JNA library needs to be made +# available to the main classloader by adding the two following libraries +# to the lib/boot directory +# mvn:net.java.dev.jna/jna/${jna.version} +# mvn:net.java.dev.jna/jna-platform/${jna.version} +# or by building a custom distribution and adding the following lines for the +# karaf maven plugin configuration: +# mvn:net.java.dev.jna/jna/${jna.version};type:=boot;export:=false +# mvn:net.java.dev.jna/jna-platform/${jna.version};type:=boot;export:=false +# +#karaf.systemd.enabled=true diff --git a/openhab/openhab_userdata/etc/custom.properties b/openhab/openhab_userdata/etc/custom.properties new file mode 100644 index 0000000..3705c92 --- /dev/null +++ b/openhab/openhab_userdata/etc/custom.properties @@ -0,0 +1,10 @@ +karaf.bootstrap.log = ${karaf.log}/openhab.log +karaf.systemBundlesStartLevel = 50 +karaf.framework = equinox +karaf.lock.dir=${karaf.data}/tmp +karaf.shutdown.port.file=${karaf.data}/tmp/port +karaf.pid.file=${karaf.data}/tmp/karaf.pid + +osgi.compatibility.bootdelegation = true + +felix.fileinstall.dir = ${karaf.data}/etc diff --git a/openhab/openhab_userdata/etc/custom.system.properties b/openhab/openhab_userdata/etc/custom.system.properties new file mode 100644 index 0000000..35333ad --- /dev/null +++ b/openhab/openhab_userdata/etc/custom.system.properties @@ -0,0 +1,7 @@ +karaf.name=openhab +karaf.local.user=openhab +openhab.servicecfg=${openhab.runtime}/services.cfg +jetty.keystore.path=${openhab.userdata}/etc/keystore +jetty.truststore.path=${openhab.userdata}/etc/keystore +equinox.ds.block_timeout=240000 +equinox.scr.waitTimeOnBlock=60000 diff --git a/openhab/openhab_userdata/etc/distribution.info b/openhab/openhab_userdata/etc/distribution.info new file mode 100644 index 0000000..a5d8fb3 --- /dev/null +++ b/openhab/openhab_userdata/etc/distribution.info @@ -0,0 +1,26 @@ +################################################################################ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +################################################################################ + +# +# This file contains the general platform information required by the itests to find out +# about the current versions. +# +karafVersion=4.4.3 +name=Apache Karaf + diff --git a/openhab/openhab_userdata/etc/equinox-debug.properties b/openhab/openhab_userdata/etc/equinox-debug.properties new file mode 100644 index 0000000..01be178 --- /dev/null +++ b/openhab/openhab_userdata/etc/equinox-debug.properties @@ -0,0 +1,111 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + + +#### Debugging options for org.eclipse.bundles + +# Turn on general debugging for org.eclipse.bundles +org.eclipse.osgi/debug = false +# Prints out class loading debug information +org.eclipse.osgi/debug/loader = false +# Prints out event (FrameworkEvent/BundleEvent/ServiceEvent) and listener debug information +org.eclipse.osgi/debug/events = false +# Prints out OSGi service debug information (registration/getting/ungetting etc.) +org.eclipse.osgi/debug/services = false +# Prints out bundle manifest parsing debug information +org.eclipse.osgi/debug/manifest = false +# Prints out LDAP filter debug information +org.eclipse.osgi/debug/filter = false +# Prints out security (PermissionAdmin service) debug information +org.eclipse.osgi/debug/security = false +# Prints out start level service debug information +org.eclipse.osgi/debug/startlevel = false +# Prints out package instance service debug information +org.eclipse.osgi/debug/packageadmin = false +# Prints out timing information for bundle activation +org.eclipse.osgi/debug/bundleTime = false +# Debug the loading of message bundles +org.eclipse.osgi/debug/messageBundles = false + +# Eclipse adaptor options +org.eclipse.osgi/eclipseadaptor/debug = false +org.eclipse.osgi/eclipseadaptor/debug/location = false +org.eclipse.osgi/eclipseadaptor/debug/platformadmin = false +org.eclipse.osgi/eclipseadaptor/debug/platformadmin/resolver = false +org.eclipse.osgi/eclipseadaptor/converter/debug = false + +### OSGi resolver options +# Turns on debugging for the resolver +org.eclipse.osgi/resolver/debug = false +# Prints out wiring information after the resolver has completed the resolve process +org.eclipse.osgi/resolver/wiring = false +# Prints out Import-Package information +org.eclipse.osgi/resolver/imports = false +# Prints out Require-Bundle information +org.eclipse.osgi/resolver/requires = false +# Prints out package grouping information form the "uses" clause +org.eclipse.osgi/resolver/grouping = false +# Prints out cycle information +org.eclipse.osgi/resolver/cycles = false +# Prints out Eclipse-GenericRequire information +org.eclipse.osgi/resolver/generics = false + +#### Profile settings +org.eclipse.osgi/profile/startup = false +org.eclipse.osgi/profile/benchmark = false +org.eclipse.osgi/profile/debug = false + +# Override the default implemenation +org.eclipse.osgi/profile/impl = org.eclipse.osgi.internal.profile.DefaultProfileLogger + +# Append all profile messages to the filename specified +org.eclipse.osgi/defaultprofile/logfilename = + +# Output all profile log messages synchronously to the jvm console. +# By default, all log messages are cached until the log buffer is +# requested. +org.eclipse.osgi/defaultprofile/logsynchronously = false + +# Specify the size of the default profile implementation log buffer. +org.eclipse.osgi/defaultprofile/buffersize = 256 + +#### Monitoring settings +# monitor class loading +org.eclipse.osgi/monitor/classes = false + +# monitor bundle activation +org.eclipse.osgi/monitor/activation = false + +# monitor resource bundle (*.properties) loading +org.eclipse.osgi/monitor/resources = false + + +#### Trace settings +# trace class loading - snapshot the execution stack when a class is loaded +org.eclipse.osgi/trace/classLoading = false + +# trace location - file in which execution traces are written +org.eclipse.osgi/trace/filename = runtime.traces + +# trace filters - Java properties file defining which classes should +# be traced (if trace/classLoading is true) +# File format: +# plugins= +# packages= +# Note that there may be many 'plugins' and 'packages' lines in one file. +org.eclipse.osgi/trace/filters = trace.properties + +# trace bundle activation - snapshot the execution stack when a bundle is activated +org.eclipse.osgi/trace/activation = false diff --git a/openhab/openhab_userdata/etc/java.util.logging.properties b/openhab/openhab_userdata/etc/java.util.logging.properties new file mode 100644 index 0000000..f2d56da --- /dev/null +++ b/openhab/openhab_userdata/etc/java.util.logging.properties @@ -0,0 +1,6 @@ +# set default format layout +java.util.logging.SimpleFormatter.format = %1$tF %1$tT.%1$tL [%4$s] [%3$s] - %5$s%6$s%n + +# disable lock messages at startup +org.apache.karaf.main.Main.level = WARNING +org.apache.karaf.main.lock.SimpleFileLock.level = WARNING \ No newline at end of file diff --git a/openhab/openhab_userdata/etc/jetty-web.xml b/openhab/openhab_userdata/etc/jetty-web.xml new file mode 100644 index 0000000..b37e3e0 --- /dev/null +++ b/openhab/openhab_userdata/etc/jetty-web.xml @@ -0,0 +1,35 @@ + + + + + + + diff --git a/openhab/openhab_userdata/etc/jetty.xml b/openhab/openhab_userdata/etc/jetty.xml new file mode 100644 index 0000000..196f59d --- /dev/null +++ b/openhab/openhab_userdata/etc/jetty.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/openhab/openhab_userdata/etc/jmx.acl.org.apache.karaf.bundle.cfg b/openhab/openhab_userdata/etc/jmx.acl.org.apache.karaf.bundle.cfg new file mode 100644 index 0000000..e1c9b1c --- /dev/null +++ b/openhab/openhab_userdata/etc/jmx.acl.org.apache.karaf.bundle.cfg @@ -0,0 +1,40 @@ + +################################################################################ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +################################################################################ + +# +# JMX ACL specific to the org.apache.karaf:type=bundle,name=* MBean which maps to the Karaf MBean +# to control OSGi bundles. +# +install = manager +refresh = manager +resolve = manager +restart = manager +setStartLevel(java.lang.String, int)[/([1-4])?[0-9]/,/.*/] = admin +setStartLevel = manager +start(java.lang.String)[/([1-4])?[0-9]/] = admin +start = manager +stop(java.lang.String)[/([1-4])?[0-9]/] = admin +stop = manager +uninstall(java.lang.String)["0"] = #this is a comment, no roles can perform this operation +uninstall = admin +update(java.lang.String)[/([1-4])?[0-9]/] = admin +update(java.lang.String,java.lang.String)[/([1-4])?[0-9]/,/.*/] = admin +update = manager + diff --git a/openhab/openhab_userdata/etc/jmx.acl.org.apache.karaf.config.cfg b/openhab/openhab_userdata/etc/jmx.acl.org.apache.karaf.config.cfg new file mode 100644 index 0000000..39fb1a4 --- /dev/null +++ b/openhab/openhab_userdata/etc/jmx.acl.org.apache.karaf.config.cfg @@ -0,0 +1,54 @@ + +################################################################################ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +################################################################################ + +# +# JMX ACL specific to the org.apache.karaf:type=config,name=* MBean which maps to the Karaf MBean to interact with the +# OSGi Config Admin service. +# +# For a description of the format of this file, see jmx.acl.cfg +# +# By default, only an admin can make changes to the JMX ACL and shell command rules, but managers can make +# changes to other PIDs. +# +appendProperty(java.lang.String,java.lang.String,java.lang.String)[/jmx[.]acl.*/,/.*/,/.*/] = admin +appendProperty(java.lang.String,java.lang.String,java.lang.String)[/org[.]apache[.]karaf[.]command[.]acl.+/,/.*/,/.*/] = admin +appendProperty(java.lang.String,java.lang.String,java.lang.String)[/org[.]apache[.]karaf[.]service[.]acl.+/,/.*/,/.*/] = admin +appendProperty(java.lang.String,java.lang.String,java.lang.String) = manager +create(java.lang.String)[/jmx[.]acl.*/] = admin +create(java.lang.String)[/org[.]apache[.]karaf[.]command[.]acl.+/] = admin +create(java.lang.String)[/org[.]apache[.]karaf[.]service[.]acl.+/] = admin +create(java.lang.String) = manager +delete(java.lang.String)[/jmx[.]acl.*/] = admin +delete(java.lang.String)[/org[.]apache[.]karaf[.]command[.]acl.+/] = admin +delete(java.lang.String)[/org[.]apache[.]karaf[.]service[.]acl.+/] = admin +delete(java.lang.String) = manager +deleteProperty(java.lang.String,java.lang.String)[/jmx[.]acl.*/,/.*/] = admin +deleteProperty(java.lang.String,java.lang.String)[/org[.]apache[.]karaf[.]command[.]acl.+/,/.*/] = admin +deleteProperty(java.lang.String,java.lang.String)[/org[.]apache[.]karaf[.]service[.]acl.+/,/.*/] = admin +deleteProperty(java.lang.String,java.lang.String) = manager +setProperty(java.lang.String,java.lang.String,java.lang.String)[/jmx[.]acl.*/,/.*/,/.*/] = admin +setProperty(java.lang.String,java.lang.String,java.lang.String)[/org[.]apache[.]karaf[.]command[.]acl.+/,/.*/,/.*/] = admin +setProperty(java.lang.String,java.lang.String,java.lang.String)[/org[.]apache[.]karaf[.]service[.]acl.+/,/.*/,/.*/] = admin +setProperty(java.lang.String,java.lang.String,java.lang.String) = manager +update(java.lang.String,java.util.Map)[/jmx[.]acl.*/,/.*/] = admin +update(java.lang.String,java.util.Map)[/org[.]apache[.]karaf[.]command[.]acl.+/,/.*/] = admin +update(java.lang.String,java.util.Map)[/org[.]apache[.]karaf[.]service[.]acl.+/,/.*/] = admin +update(java.lang.String,java.util.Map) = manager + diff --git a/openhab/openhab_userdata/etc/jre.properties b/openhab/openhab_userdata/etc/jre.properties new file mode 100644 index 0000000..871e77b --- /dev/null +++ b/openhab/openhab_userdata/etc/jre.properties @@ -0,0 +1,503 @@ +################################################################################ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +################################################################################ + +# +# Java platform package export properties. +# + +# Contains java.* packages provided by the JDK (and so system packages) +jre-base= \ + java.applet, \ + java.awt, \ + java.awt.color, \ + java.awt.datatransfer, \ + java.awt.dnd, \ + java.awt.event, \ + java.awt.font, \ + java.awt.geom, \ + java.awt.im, \ + java.awt.im.spi, \ + java.awt.image, \ + java.awt.image.renderable, \ + java.awt.print, \ + java.beans, \ + java.beans.beancontext, \ + java.io, \ + java.lang, \ + java.lang.annotation, \ + java.lang.constant, \ + java.lang.instrument, \ + java.lang.invoke, \ + java.lang.management, \ + java.lang.ref, \ + java.lang.reflect, \ + java.lang.runtime, \ + java.math, \ + java.net, \ + java.net.http, \ + java.nio, \ + java.nio.channels, \ + java.nio.channels.spi, \ + java.nio.charset, \ + java.nio.charset.spi, \ + java.nio.file, \ + java.nio.file.attribute, \ + java.rmi, \ + java.rmi.activation, \ + java.rmi.dgc, \ + java.rmi.registry, \ + java.rmi.server, \ + java.security, \ + java.security.acl, \ + java.security.cert, \ + java.security.interfaces, \ + java.security.spec, \ + java.sql, \ + java.text, \ + java.text.spi, \ + java.time, \ + java.time.chrono, \ + java.time.format, \ + java.time.temporal, \ + java.time.zone, \ + java.util, \ + java.util.concurrent, \ + java.util.concurrent.atomic, \ + java.util.concurrent.locks, \ + java.util.function, \ + java.util.random, \ + java.util.jar, \ + java.util.logging, \ + java.util.prefs, \ + java.util.regex, \ + java.util.spi, \ + java.util.stream, \ + java.util.zip + +# +# A note about javax.transaction and javax.transaction.xa packages in JDK8 and JDK9+ +# - javax.transaction package is not provided at all in JDK9+ because of the removal of Corba +# - javax.transaction package in JDK8 and earlier contains only 3 exception classes required to translate 3 Corba/OMG +# exception: org.omg.CORBA.TRANSACTION_REQUIRED, org.omg.CORBA.TRANSACTION_ROLLEDBACK, org.omg.CORBA.INVALID_TRANSACTION +# - javax.transaction.xa package should always be provided by JDK itself (thus exported from system bundle and bootdelegated) +# because of javax.sql.XAConnection interface relying on javax.sql.xa.XAResource interface +# - I decided to export javax.transaction.xa package with all the versions: 1.1, 1.2 and 1.3 just to satisfy all potential +# import version ranges (and emphasize the fact that JavaEE doesn't version packages at all) +# - javax.transaction package should be exported by JDK8 (but not JDK9+) with mandatory attribute ("partial" is an +# arbirtary name mentioned in "https://docs.osgi.org/specification/osgi.core/7.0.0/framework.module.html#framework.module.requirebundle" +# - javax.transaction exported with "partial=true;mandatory:=partial" prevents system bundle to be a wire candidate for +# bundles with just "Import-Package: javax.transaction" - actual JTA API bundle is needed to provide all the classes +# from this package (like javax.transaction.UserTransaction) +# - thus javax.transaction package is exported without a version - because each bundle with "Import-Package: javax.transaction" +# should always wire to full JTA API bundle. The fact that the JDK8 provided exception classes from this package +# are always loaded using boot class loader is an obvious, but internal consequence +# - the full trick mentioned in "3.13.1 Require-Bundle" requires another bundle that exports javax.transaction package +# without mandatory attribute and that has Require-Bundle requirement to a bundle that exports the package with mandatory +# attribute - and that's what javax.transaction/javax.transaction-api/1.2 does - it contains "Require-Bundle: system.bundle" +# - Require-Bundle in JTA API bundle is not needed if javax.transaction is boot-delegated - because failure to search +# boot-delegated javax.* packages doesn't stop the class loading process - local content is checked +# - jakarta.transaction/jakarta.transaction-api/1.3.x doesn't have (by mistake, see https://github.com/eclipse-ee4j/jta-api/issues/186) +# "Require-Bundle: system.bundle", but it still works thanks to boot-delegation +# And last, but important thing - DBCP2 (see DBCP-571) has "Import-Package: javax.transaction.xa;partial=true;mandatory:=partial" +# which is simply wrong (if anything, javax.transaction package should be imported this way, not javax.transaction.xa), +# but to allow DBCP2 to be resolved on Karaf, special export package is added just for DBCP2: +# Export-Package: javax.transaction.xa;partial=true;mandatory:=partial;version="1.1" +# - mandatory "partial" attribute is added to javax.transaction export (JDK8) to prevent wiring to this package without +# full JTA API bundle +# - mandatory "partial" attribute is added to javax.transaction.xa export (all JDKs) to satisfy DBCP2 +# + +jre-1.8= \ + ${jre-base}, \ + javax.accessibility, \ + javax.activity, \ + javax.annotation;version="1.0", \ + javax.annotation.processing;version="1.0", \ + javax.crypto, \ + javax.crypto.interfaces, \ + javax.crypto.spec, \ + javax.imageio, \ + javax.imageio.event, \ + javax.imageio.metadata, \ + javax.imageio.plugins.bmp, \ + javax.imageio.plugins.jpeg, \ + javax.imageio.spi, \ + javax.imageio.stream, \ + javax.jws, \ + javax.jws.soap, \ + javax.lang.model, \ + javax.lang.model.element, \ + javax.lang.model.type, \ + javax.lang.model.util, \ + javax.management, \ + javax.management.loading, \ + javax.management.modelmbean, \ + javax.management.monitor, \ + javax.management.openmbean, \ + javax.management.relation, \ + javax.management.remote, \ + javax.management.remote.rmi, \ + javax.management.timer, \ + javax.naming, \ + javax.naming.directory, \ + javax.naming.event, \ + javax.naming.ldap, \ + javax.naming.spi, \ + javax.net, \ + javax.net.ssl, \ + javax.print, \ + javax.print.attribute, \ + javax.print.attribute.standard, \ + javax.print.event, \ + javax.rmi, \ + javax.rmi.CORBA, \ + javax.rmi.ssl, \ + javax.script, \ + javax.security.auth, \ + javax.security.auth.callback, \ + javax.security.auth.kerberos, \ + javax.security.auth.login, \ + javax.security.auth.spi, \ + javax.security.auth.x500, \ + javax.security.cert, \ + javax.security.sasl, \ + javax.sound.midi, \ + javax.sound.midi.spi, \ + javax.sound.sampled, \ + javax.sound.sampled.spi, \ + javax.sql, \ + javax.sql.rowset, \ + javax.sql.rowset.serial, \ + javax.sql.rowset.spi, \ + javax.swing, \ + javax.swing.border, \ + javax.swing.colorchooser, \ + javax.swing.event, \ + javax.swing.filechooser, \ + javax.swing.plaf, \ + javax.swing.plaf.basic, \ + javax.swing.plaf.metal, \ + javax.swing.plaf.multi, \ + javax.swing.plaf.synth, \ + javax.swing.table, \ + javax.swing.text, \ + javax.swing.text.html, \ + javax.swing.text.html.parser, \ + javax.swing.text.rtf, \ + javax.swing.tree, \ + javax.swing.undo, \ + javax.tools, \ + javax.transaction;partial=true;mandatory:=partial, \ + javax.transaction.xa;version="1.1";partial=true;mandatory:=partial, \ + javax.transaction.xa;version="1.1", \ + javax.transaction.xa;version="1.2", \ + javax.transaction.xa;version="1.3", \ + javax.xml, \ + javax.xml.bind;version="2.2.8", \ + javax.xml.bind.annotation;version="2.2.8", \ + javax.xml.bind.annotation.adapters;version="2.2.8", \ + javax.xml.bind.attachment;version="2.2.8", \ + javax.xml.bind.helpers;version="2.2.8", \ + javax.xml.bind.util;version="2.2.8", \ + javax.xml.crypto, \ + javax.xml.crypto.dom, \ + javax.xml.crypto.dsig, \ + javax.xml.crypto.dsig.dom, \ + javax.xml.crypto.dsig.keyinfo, \ + javax.xml.crypto.dsig.spec, \ + javax.xml.datatype, \ + javax.xml.namespace, \ + javax.xml.parsers, \ + javax.xml.stream;version="1.2", \ + javax.xml.stream.events;version="1.2", \ + javax.xml.stream.util;version="1.2", \ + javax.xml.transform, \ + javax.xml.transform.dom, \ + javax.xml.transform.sax, \ + javax.xml.transform.stax, \ + javax.xml.transform.stream, \ + javax.xml.validation, \ + javax.xml.ws;version="2.2", \ + javax.xml.ws.handler;version="2.2", \ + javax.xml.ws.handler.soap;version="2.2", \ + javax.xml.ws.http;version="2.2", \ + javax.xml.ws.soap;version="2.2", \ + javax.xml.ws.spi;version="2.2", \ + javax.xml.ws.wsaddressing;version="2.2", \ + javax.xml.ws.spi.http;version="2.2", \ + javax.xml.xpath, \ + javafx.animation, \ + javafx.application, \ + javafx.beans, \ + javafx.beans.binding, \ + javafx.beans.property, \ + javafx.beans.property.adapter, \ + javafx.beans.value, \ + javafx.collections, \ + javafx.collections.transform, \ + javafx.concurrent, \ + javafx.css, \ + javafx.embed.swing, \ + javafx.embed.swt, \ + javafx.event, \ + javafx.fxml, \ + javafx.geometry, \ + javafx.print, \ + javafx.scene, \ + javafx.scene.canvas, \ + javafx.scene.chart, \ + javafx.scene.control, \ + javafx.scene.control.cell, \ + javafx.scene.effect, \ + javafx.scene.image, \ + javafx.scene.input, \ + javafx.scene.layout, \ + javafx.scene.media, \ + javafx.scene.paint, \ + javafx.scene.shape, \ + javafx.scene.text, \ + javafx.scene.transform, \ + javafx.scene.web, \ + javafx.stage, \ + javafx.util, \ + javafx.util.converter, \ + netscape.javascript, \ + org.ietf.jgss, \ + org.omg.CORBA, \ + org.omg.CORBA_2_3, \ + org.omg.CORBA_2_3.portable, \ + org.omg.CORBA.DynAnyPackage, \ + org.omg.CORBA.ORBPackage, \ + org.omg.CORBA.portable, \ + org.omg.CORBA.TypeCodePackage, \ + org.omg.CosNaming, \ + org.omg.CosNaming.NamingContextExtPackage, \ + org.omg.CosNaming.NamingContextPackage, \ + org.omg.Dynamic, \ + org.omg.DynamicAny, \ + org.omg.DynamicAny.DynAnyFactoryPackage, \ + org.omg.DynamicAny.DynAnyPackage, \ + org.omg.IOP, \ + org.omg.IOP.CodecFactoryPackage, \ + org.omg.IOP.CodecPackage, \ + org.omg.Messaging, \ + org.omg.PortableInterceptor, \ + org.omg.PortableInterceptor.ORBInitInfoPackage, \ + org.omg.PortableServer, \ + org.omg.PortableServer.CurrentPackage, \ + org.omg.PortableServer.POAManagerPackage, \ + org.omg.PortableServer.POAPackage, \ + org.omg.PortableServer.portable, \ + org.omg.PortableServer.ServantLocatorPackage, \ + org.omg.SendingContext, \ + org.omg.stub.java.rmi, \ + org.omg.stub.javax.management.remote.rmi, \ + org.w3c.dom, \ + org.w3c.dom.bootstrap, \ + org.w3c.dom.css, \ + org.w3c.dom.events, \ + org.w3c.dom.html, \ + org.w3c.dom.ls, \ + org.w3c.dom.ranges, \ + org.w3c.dom.stylesheets, \ + org.w3c.dom.traversal, \ + org.w3c.dom.views, \ + org.w3c.dom.xpath, \ + org.xml.sax, \ + org.xml.sax.ext, \ + org.xml.sax.helpers, \ + com.sun.nio.sctp + +jre-9= \ + ${jre-base}, \ + java.lang.module, \ + java.net.spi, \ + javax.accessibility, \ + javax.activity, \ + javax.annotation;version="1.3", \ + javax.annotation.processing;version="1.0", \ + javax.activation;version="1.2.1", \ + javax.crypto, \ + javax.crypto.interfaces, \ + javax.crypto.spec, \ + javax.imageio, \ + javax.imageio.event, \ + javax.imageio.metadata, \ + javax.imageio.plugins.bmp, \ + javax.imageio.plugins.jpeg, \ + javax.imageio.spi, \ + javax.imageio.stream, \ + javax.lang.model, \ + javax.lang.model.element, \ + javax.lang.model.type, \ + javax.lang.model.util, \ + javax.management, \ + javax.management.loading, \ + javax.management.modelmbean, \ + javax.management.monitor, \ + javax.management.openmbean, \ + javax.management.relation, \ + javax.management.remote, \ + javax.management.remote.rmi, \ + javax.management.timer, \ + javax.naming, \ + javax.naming.directory, \ + javax.naming.event, \ + javax.naming.ldap, \ + javax.naming.spi, \ + javax.net, \ + javax.net.ssl, \ + javax.print, \ + javax.print.attribute, \ + javax.print.attribute.standard, \ + javax.print.event, \ + javax.rmi, \ + javax.rmi.ssl, \ + javax.script, \ + javax.security.auth, \ + javax.security.auth.callback, \ + javax.security.auth.kerberos, \ + javax.security.auth.login, \ + javax.security.auth.spi, \ + javax.security.auth.x500, \ + javax.security.cert, \ + javax.security.sasl, \ + javax.sound.midi, \ + javax.sound.midi.spi, \ + javax.sound.sampled, \ + javax.sound.sampled.spi, \ + javax.sql, \ + javax.sql.rowset, \ + javax.sql.rowset.serial, \ + javax.sql.rowset.spi, \ + javax.swing, \ + javax.swing.border, \ + javax.swing.colorchooser, \ + javax.swing.event, \ + javax.swing.filechooser, \ + javax.swing.plaf, \ + javax.swing.plaf.basic, \ + javax.swing.plaf.metal, \ + javax.swing.plaf.multi, \ + javax.swing.plaf.synth, \ + javax.swing.table, \ + javax.swing.text, \ + javax.swing.text.html, \ + javax.swing.text.html.parser, \ + javax.swing.text.rtf, \ + javax.swing.tree, \ + javax.swing.undo, \ + javax.tools, \ + javax.transaction.xa;version="1.1";partial=true;mandatory:=partial, \ + javax.transaction.xa;version="1.1", \ + javax.transaction.xa;version="1.2", \ + javax.transaction.xa;version="1.3", \ + javax.xml, \ + javax.xml.bind;version="2.3.0", \ + javax.xml.bind.annotation;version="2.3.0", \ + javax.xml.bind.annotation.adapters;version="2.3.0", \ + javax.xml.bind.attachment;version="2.3.0", \ + javax.xml.bind.helpers;version="2.3.0", \ + javax.xml.bind.util;version="2.3.0", \ + javax.xml.catalog, \ + javax.xml.crypto, \ + javax.xml.crypto.dom, \ + javax.xml.crypto.dsig, \ + javax.xml.crypto.dsig.dom, \ + javax.xml.crypto.dsig.keyinfo, \ + javax.xml.crypto.dsig.spec, \ + javax.xml.datatype, \ + javax.xml.namespace, \ + javax.xml.parsers, \ + javax.xml.stream;version="1.2", \ + javax.xml.stream.events;version="1.2", \ + javax.xml.stream.util;version="1.2", \ + javax.xml.transform, \ + javax.xml.transform.dom, \ + javax.xml.transform.sax, \ + javax.xml.transform.stax, \ + javax.xml.transform.stream, \ + javax.xml.validation, \ + javax.xml.xpath, \ + javafx.animation, \ + javafx.application, \ + javafx.beans, \ + javafx.beans.binding, \ + javafx.beans.property, \ + javafx.beans.property.adapter, \ + javafx.beans.value, \ + javafx.collections, \ + javafx.collections.transformation, \ + javafx.concurrent, \ + javafx.css, \ + javafx.embed.swing, \ + javafx.embed.swt, \ + javafx.event, \ + javafx.fxml, \ + javafx.geometry, \ + javafx.print, \ + javafx.scene, \ + javafx.scene.canvas, \ + javafx.scene.chart, \ + javafx.scene.control, \ + javafx.scene.control.cell, \ + javafx.scene.effect, \ + javafx.scene.image, \ + javafx.scene.input, \ + javafx.scene.layout, \ + javafx.scene.media, \ + javafx.scene.paint, \ + javafx.scene.shape, \ + javafx.scene.text, \ + javafx.scene.transform, \ + javafx.scene.web, \ + javafx.stage, \ + javafx.util, \ + javafx.util.converter, \ + netscape.javascript, \ + org.ietf.jgss, \ + org.w3c.dom, \ + org.w3c.dom.bootstrap, \ + org.w3c.dom.css, \ + org.w3c.dom.events, \ + org.w3c.dom.html, \ + org.w3c.dom.ls, \ + org.w3c.dom.ranges, \ + org.w3c.dom.stylesheets, \ + org.w3c.dom.traversal, \ + org.w3c.dom.views, \ + org.w3c.dom.xpath, \ + org.xml.sax, \ + org.xml.sax.ext, \ + org.xml.sax.helpers, \ + com.sun.security.sasl, \ + com.sun.security.sasl.digest, \ + com.sun.security.sasl.ntlm, \ + com.sun.security.sasl.util + +jre-10 = ${jre-9} +jre-11 = ${jre-10} +jre-12 = ${jre-11} +jre-13 = ${jre-12} +jre-14 = ${jre-13} +jre-15 = ${jre-14} +jre-16 = ${jre-15} +jre-17 = ${jre-16} +jre-18 = ${jre-17} +jre-19 = ${jre-18} diff --git a/openhab/openhab_userdata/etc/keys.properties b/openhab/openhab_userdata/etc/keys.properties new file mode 100644 index 0000000..e0538ff --- /dev/null +++ b/openhab/openhab_userdata/etc/keys.properties @@ -0,0 +1,36 @@ +################################################################################ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +################################################################################ + +# +# This file contains the valid users who can log into Karaf. Each line have to be of +# the format: +# +# USER=KEY,ROLE1,ROLE2,... +# +# All users and roles entered in this file are available after Karaf startup +# and modifiable via the JAAS command group. These users reside in a JAAS domain +# with the name "karaf".. +# + +# +# This is an example of how to associate a public key with a user. +# The user guide describes how to generate/update the key. +# +#karaf=AAAAB3NzaC1kc3MAAACBAP1/U4EddRIpUt9KnC7s5Of2EbdSPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00b/JmYLdrmVClpJ+f6AR7ECLCT7up1/63xhv4O1fnxqimFQ8E+4P208UewwI1VBNaFpEy9nXzrith1yrv8iIDGZ3RSAHHAAAAFQCXYFCPFSMLzLKSuYKi64QL8Fgc9QAAAIEA9+GghdabPd7LvKtcNrhXuXmUr7v6OuqC+VdMCz0HgmdRWVeOutRZT+ZxBxCBgLRJFnEj6EwoFhO3zwkyjMim4TwWeotUfI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhRkImog9/hWuWfBpKLZl6Ae1UlZAFMO/7PSSoAAACBAKKSU2PFl/qOLxIwmBZPPIcJshVe7bVUpFvyl3BbJDow8rXfskl8wO63OzP/qLmcJM0+JbcRU/53JjTuyk31drV2qxhIOsLDC9dGCWj47Y7TyhPdXh/0dthTRBy6bqGtRPxGa7gJov1xm/UuYYXPIUR/3x9MAZvZ5xvE0kYXO+rx,_g_:admingroup +_g_\:admingroup = group,admin,manager,viewer,systembundles,ssh diff --git a/openhab/openhab_userdata/etc/keystore b/openhab/openhab_userdata/etc/keystore new file mode 100644 index 0000000000000000000000000000000000000000..88ff11eac265f375504ea95a521908ec164fc213 GIT binary patch literal 606 zcmezO_TO6u1_mY|W&~r_+{*0KN+7Q%plk6FpisR*tpOh!mo^(C3!@g3AR{9y150+= z!V9UZGac+M{QvOkN6m~=wwIms%r|6Lz5dzhdhvaxpy8Y8_Hll;%RJ7hvxn%EoC}u$(uUzkm z%`0^u9iHZPr^WAr@+v9gx+H;j8&(|YIORFN&Gh?kA^qGeHB((?g)YmstIto!=kIs> zHM3M4Ik=cT84TQ*6dCrIZc#9r%X59l8j~maUp#GgTXLPh@F;#qPKfepzEb}hppsXn zGcvU@|2dq0ey>5kW7o9Ug$E`#U&x#DDJb-Mc-HJ~A9SxvsweVz=r$(0rrZ3tlGZ;V F0RUuY!D;{i literal 0 HcmV?d00001 diff --git a/openhab/openhab_userdata/etc/log4j2.xml b/openhab/openhab_userdata/etc/log4j2.xml new file mode 100644 index 0000000..5e7838b --- /dev/null +++ b/openhab/openhab_userdata/etc/log4j2.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/openhab/openhab_userdata/etc/org.apache.felix.eventadmin.impl.EventAdmin.cfg b/openhab/openhab_userdata/etc/org.apache.felix.eventadmin.impl.EventAdmin.cfg new file mode 100644 index 0000000..7dc0168 --- /dev/null +++ b/openhab/openhab_userdata/etc/org.apache.felix.eventadmin.impl.EventAdmin.cfg @@ -0,0 +1,15 @@ +## Standard settings of Karaf + +org.apache.felix.eventadmin.AddTimestamp=true +org.apache.felix.eventadmin.AddSubject=true + +## Custom openHAB configuration + +# Configure thread pool size for EventAdmin sync event delivery. +org.apache.felix.eventadmin.ThreadPoolSize=3 + +# Use as many threads for async as for sync. +org.apache.felix.eventadmin.AsyncToSyncThreadRatio=1 + +# Do not timeout event handlers, see https://github.com/openhab/openhab-distro/issues/600 +org.apache.felix.eventadmin.Timeout=0 diff --git a/openhab/openhab_userdata/etc/org.apache.felix.fileinstall-deploy.cfg b/openhab/openhab_userdata/etc/org.apache.felix.fileinstall-deploy.cfg new file mode 100644 index 0000000..c8a28c8 --- /dev/null +++ b/openhab/openhab_userdata/etc/org.apache.felix.fileinstall-deploy.cfg @@ -0,0 +1,13 @@ +## Standard settings of Karaf + +felix.fileinstall.start.level = 80 +felix.fileinstall.log.level = 3 + +## Custom openHAB configuration + +felix.fileinstall.dir = ${openhab.home}/addons +felix.fileinstall.tmpdir = ${karaf.data}/tmp/bundles +felix.fileinstall.filter = .*\\.(jar|kar) +felix.fileinstall.poll = 10000 +felix.fileinstall.active.level = 90 +felix.fileinstall.subdir.mode = skip diff --git a/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.bundle.cfg b/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.bundle.cfg new file mode 100644 index 0000000..688c289 --- /dev/null +++ b/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.bundle.cfg @@ -0,0 +1,46 @@ + +################################################################################ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +################################################################################ + +# +# This configuration file defines the ACLs for commands in the bundle subshell +# +# For an explanation of the syntax of this file, see the file: +# org.apache.karaf.command.acl.system.cfg +# +# This configuration relies on the fact that 'system' bundles need to be managed +# with the +# -f (--force) +# flag. Operations with -f need admin permission. Most of these operations without +# the 'force' option can be done by a manager. +install = admin +refresh[/.*[-][f].*/] = admin +refresh = manager +restart[/.*[-][f].*/] = admin +restart = manager +start[/.*[-][f].*/] = admin +start = manager +stop[/.*[-][f].*/] = admin +stop = manager +uninstall[/.*[-][f].*/] = admin +uninstall = manager +update[/.*[-][f].*/] = admin +update = manager +watch = admin + diff --git a/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.config.cfg b/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.config.cfg new file mode 100644 index 0000000..b802587 --- /dev/null +++ b/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.config.cfg @@ -0,0 +1,46 @@ + +################################################################################ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +################################################################################ + +# +# This configuration file defines the ACLs for various commands in the config subshell +# +# For an explanation of the syntax of this file, see the file: +# org.apache.karaf.command.acl.system.cfg +# +cancel = manager +delete = admin +edit = manager +edit[/.*jmx[.]acl.*/] = admin +edit[/.*org[.]apache[.]karaf[.]command[.]acl[.].+/] = admin +edit[/.*org[.]apache[.]karaf[.]service[.]acl[.].+/] = admin +property-append = manager +property-append[/.*jmx[.]acl.*/] = admin +property-append[/.*org[.]apache[.]karaf[.]command[.]acl[.].+/] = admin +property-append[/.*org[.]apache[.]karaf[.]service[.]acl[.].+/] = admin +property-delete = manager +property-delete[/.*jmx[.]acl.*/] = admin +property-delete[/.*org[.]apache[.]karaf[.]command[.]acl[.].+/] = admin +property-delete[/.*org[.]apache[.]karaf[.]service[.]acl[.].+/] = admin +property-set = manager +property-set[/.*jmx[.]acl.*/] = admin +property-set[/.*org[.]apache[.]karaf[.]command[.]acl[.].+/] = admin +property-set[/.*org[.]apache[.]karaf[.]service[.]acl[.].+/] = admin +update = manager + diff --git a/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.feature.cfg b/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.feature.cfg new file mode 100644 index 0000000..b511ef5 --- /dev/null +++ b/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.feature.cfg @@ -0,0 +1,28 @@ + +################################################################################ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +################################################################################ + +# +# This configuration file defines the ACLs for commands in the feature subshell +# +install = admin +uninstall = admin +start = admin +stop = admin + diff --git a/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.jaas.cfg b/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.jaas.cfg new file mode 100644 index 0000000..9563625 --- /dev/null +++ b/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.jaas.cfg @@ -0,0 +1,25 @@ + +################################################################################ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +################################################################################ + +# +# This configuration file defines the ACLs for commands in the jaas subshell +# Jaas commands commands have no effect until update is called. +update = admin + diff --git a/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.kar.cfg b/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.kar.cfg new file mode 100644 index 0000000..d073038 --- /dev/null +++ b/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.kar.cfg @@ -0,0 +1,29 @@ + +################################################################################ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +################################################################################ + +# +# This configuration file defines the ACLs for commands in the kar subshell +# +# For an explanation of the syntax of this file, see the file: +# org.apache.karaf.command.acl.system.cfg +# +install = admin +uninstall = admin + diff --git a/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.scope_bundle.cfg b/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.scope_bundle.cfg new file mode 100644 index 0000000..ff316fa --- /dev/null +++ b/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.scope_bundle.cfg @@ -0,0 +1,33 @@ + +################################################################################ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +################################################################################ + +# +# This configuration file defines the ACLs for scope bundles +# +features=org.apache.karaf.features.command +jaas=org.apache.karaf.jaas.command +admin=org.apache.karaf.admin.command +osgi=org.apache.karaf.shell.osgi +log=org.apache.karaf.shell.log +packages=org.apache.karaf.shell.packages +config=org.apache.karaf.shell.config +ssh=org.apache.karaf.shell.ssh +shell=org.apache.karaf.shell.commands + diff --git a/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.shell.cfg b/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.shell.cfg new file mode 100644 index 0000000..4e5844d --- /dev/null +++ b/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.shell.cfg @@ -0,0 +1,28 @@ + +################################################################################ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +################################################################################ + +# +# This configuration file defines the ACLs for commands in the shell subshell +# +nano = admin +exec = admin +new = admin +java = admin + diff --git a/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.system.cfg b/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.system.cfg new file mode 100644 index 0000000..7ff0336 --- /dev/null +++ b/openhab/openhab_userdata/etc/org.apache.karaf.command.acl.system.cfg @@ -0,0 +1,29 @@ + +################################################################################ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +################################################################################ + +# +# This configuration file defines the ACLs for commands in the system subshell +# +property = admin +shutdown = admin +start-level[/.*[1-9][0-9][0-9]+.*/] = manager # manager can set startlevels above 100 +start-level[/[^0-9]*/] = viewer # viewer can obtain the current start level +start-level = admin # admin can set any start level, including < 100 + diff --git a/openhab/openhab_userdata/etc/org.apache.karaf.features.cfg b/openhab/openhab_userdata/etc/org.apache.karaf.features.cfg new file mode 100644 index 0000000..4b06cd9 --- /dev/null +++ b/openhab/openhab_userdata/etc/org.apache.karaf.features.cfg @@ -0,0 +1,100 @@ +################################################################################ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +################################################################################ + +# +# Comma separated list of features repositories to register by default +# +featuresRepositories = \ + mvn:org.openhab.distro/distro/4.0.3/xml/features, \ + mvn:org.openhab.distro/openhab-addons/4.0.3/xml/features, \ + mvn:org.apache.karaf.features/framework/4.4.3/xml/features, \ + mvn:org.apache.karaf.features/standard/4.4.3/xml/features + +# +# Comma separated list of features to install at startup +# +featuresBoot = \ + instance/4.4.3, \ + package/4.4.3, \ + log/4.4.3, \ + ssh/4.4.3, \ + framework/4.4.3, \ + system/4.4.3, \ + eventadmin/4.4.3, \ + feature/4.4.3, \ + shell/4.4.3, \ + service/4.4.3, \ + jaas/4.4.3, \ + openhab-runtime-base, \ + openhab-runtime-ui, \ + deployer/4.4.3, \ + diagnostic/4.4.3, \ + bundle/4.4.3, \ + config/4.4.3, \ + kar/4.4.3 + +# +# Resource repositories (OBR) that the features resolver can use +# to resolve requirements/capabilities +# +# The format of the resourceRepositories is +# resourceRepositories=[xml:url|json:url],... +# for Instance: +# +#resourceRepositories=xml:http://host/path/to/index.xml +# or +#resourceRepositories=json:http://host/path/to/index.json +# + +# +# Defines if the boot features are started in asynchronous mode (in a dedicated thread) +# +featuresBootAsynchronous=false + +# +# Service requirements enforcement +# +# By default, the feature resolver checks the service requirements/capabilities of +# bundles for new features (xml schema >= 1.3.0) in order to automatically installs +# the required bundles. +# The following flag can have those values: +# - disable: service requirements are completely ignored +# - default: service requirements are ignored for old features +# - enforce: service requirements are always verified +# +#serviceRequirements=default + +# +# Store cfg file for config element in feature +# +configCfgStore=false + +# +# Define if the feature service automatically refresh bundles +# +autoRefresh=true + +# +# Configuration of features processing mechanism (overrides, blacklisting, modification of features) +# XML file defines instructions related to features processing +# versions.properties may declare properties to resolve placeholders in XML file +# both files are relative to ${karaf.etc} +# +#featureProcessing=org.apache.karaf.features.xml +#featureProcessingVersions=versions.properties diff --git a/openhab/openhab_userdata/etc/org.apache.karaf.features.repos.cfg b/openhab/openhab_userdata/etc/org.apache.karaf.features.repos.cfg new file mode 100644 index 0000000..bd456a5 --- /dev/null +++ b/openhab/openhab_userdata/etc/org.apache.karaf.features.repos.cfg @@ -0,0 +1,62 @@ + +################################################################################ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +################################################################################ + +# +# This file describes the features repository URL +# It could be directly installed using feature:repo-add command +# +enterprise=mvn:org.apache.karaf.features/enterprise/${karaf.version}/xml/features +spring=mvn:org.apache.karaf.features/spring/${karaf.version}/xml/features +spring-legacy=mvn:org.apache.karaf.features/spring-legacy/${karaf.version}/xml/features +cellar=mvn:org.apache.karaf.cellar/apache-karaf-cellar/RELEASE/xml/features +cave=mvn:org.apache.karaf.cave/apache-karaf-cave/RELEASE/xml/features +camel=mvn:org.apache.camel.karaf/apache-camel/RELEASE/xml/features +camel-extras=mvn:org.apache-extras.camel-extra.karaf/camel-extra/RELEASE/xml/features +cxf=mvn:org.apache.cxf.karaf/apache-cxf/RELEASE/xml/features +cxf-dosgi=mvn:org.apache.cxf.dosgi/cxf-dosgi/RELEASE/xml/features +cxf-dosgi-samples=mvn:org.apache.cxf.dosgi/cxf-dosgi-samples/RELEASE/xml/features +cxf-xkms=mvn:org.apache.cxf.services.xkms/cxf-services-xkms-features/RELEASE/xml +activemq=mvn:org.apache.activemq/activemq-karaf/RELEASE/xml/features +aries.jax.rs.whiteboard=mvn:org.apache.aries.jax.rs/org.apache.aries.jax.rs.features/RELEASE/xml +jclouds=mvn:org.apache.jclouds.karaf/jclouds-karaf/RELEASE/xml/features +openejb=mvn:org.apache.openejb/openejb-feature/RELEASE/xml/features +wicket=mvn:org.ops4j.pax.wicket/features/RELEASE/xml/features +hawtio=mvn:io.hawt/hawtio-karaf/RELEASE/xml/features +pax-cdi=mvn:org.ops4j.pax.cdi/pax-cdi-features/RELEASE/xml/features +pax-jdbc=mvn:org.ops4j.pax.jdbc/pax-jdbc-features/RELEASE/xml/features +pax-jms=mvn:org.ops4j.pax.jms/pax-jms-features/RELEASE/xml/features +pax-jpa=mvn:org.ops4j.pax.jpa/pax-jpa-features/RELEASE/xml/features +pax-transx=mvn:org.ops4j.pax.transx/pax-transx-features/RELEASE/xml/features +pax-keycloak=mvn:org.ops4j.pax.keycloak/pax-keycloak-features/RELEASE/xml/features +pax-web=mvn:org.ops4j.pax.web/pax-web-features/RELEASE/xml/features +pax-wicket=mvn:org.ops4j.pax.wicket/pax-wicket-features/RELEASE/xml/features +ecf=http://download.eclipse.org/rt/ecf/RELEASE/site.p2/karaf-features.xml +decanter=mvn:org.apache.karaf.decanter/apache-karaf-decanter/RELEASE/xml/features +eclipsesource-jaxrs=mvn:com.eclipsesource.jaxrs/features/RELEASE/xml/features +aries-cdi=mvn:org.apache.aries.cdi/aries-cdi-feature/RELEASE/xml/features +aries-jpa=mvn:org.apache.aries.jpa/jpa-features/RELEASE/xml/features +aries-rsa=mvn:org.apache.aries.rsa/rsa-features/RELEASE/xml/features +hibernate=mvn:org.hibernate/hibernate-osgi/RELEASE/xml/karaf +ignite=mvn:org.apache.ignite/ignite-osgi-karaf/RELEASE/xml/features +openjpa=mvn:org.apache.openjpa/openjpa-features/RELEASE/xml/features +artemis=mvn:org.apache.activemq/artemis-features/RELEASE/xml/features +brave=mvn:io.zipkin.brave.karaf/brave-features/RELEASE/xml/features +sling=mvn:org.apache.sling/org.apache.sling.karaf-features/RELEASE/xml/features + diff --git a/openhab/openhab_userdata/etc/org.apache.karaf.features.xml b/openhab/openhab_userdata/etc/org.apache.karaf.features.xml new file mode 100644 index 0000000..3fb4f50 --- /dev/null +++ b/openhab/openhab_userdata/etc/org.apache.karaf.features.xml @@ -0,0 +1,22 @@ + + + + + + + + + \ No newline at end of file diff --git a/openhab/openhab_userdata/etc/org.apache.karaf.jaas.cfg b/openhab/openhab_userdata/etc/org.apache.karaf.jaas.cfg new file mode 100644 index 0000000..4bf8d61 --- /dev/null +++ b/openhab/openhab_userdata/etc/org.apache.karaf.jaas.cfg @@ -0,0 +1,48 @@ +## Standard settings of Karaf + +# +# Encryption prefix +# +encryption.prefix = {CRYPT} + +# +# Encryption suffix +# +encryption.suffix = {CRYPT} + +# +# Set the encryption algorithm to use in Karaf JAAS login module +# Supported encryption algorithms follow: +# basic/jasypt: MD2, MD5, SHA-1, SHA-256, SHA-384, SHA-512 +# spring-security-crypto: argon2, bcrypt, pbkdf2, scrypt +# +encryption.algorithm = SHA-256 + +# +# Encoding of the encrypted password. +# Can be: +# hexadecimal +# base64 +# +encryption.encoding = hexadecimal + +########################################################################## +## +## Custom openHAB configuration + +# +# Boolean enabling / disabling encrypted passwords +# +encryption.enabled = true + +# +# Encryption Service name +# basic: the default encryption service which digests passwords without +# salting them +# jasypt: a more powerful alternative which supports salting +# spring-security-crypto: Supports bcrypt, argon2, pbkdf2, scrypt. Requires +# the "spring-security-crypto-encryption" feature +# to be installed. +# +encryption.name = basic + diff --git a/openhab/openhab_userdata/etc/org.apache.karaf.kar.cfg b/openhab/openhab_userdata/etc/org.apache.karaf.kar.cfg new file mode 100644 index 0000000..e6b1493 --- /dev/null +++ b/openhab/openhab_userdata/etc/org.apache.karaf.kar.cfg @@ -0,0 +1,22 @@ +## Standard settings of Karaf + +# +# Enable or disable the refresh of the bundles when installing +# the features contained in a KAR file +# +noAutoRefreshBundles=false + +# +# Enable or disable the automatic start of the bundles when installing +# the features contained in a KAR file +# +noAutoStartBundles=false + +########################################################################## +## +## Custom openHAB configuration + +# +# Directory where the kar are stored (when downloaded from Maven for instance) +# +karStorage=${karaf.data}/tmp/kar diff --git a/openhab/openhab_userdata/etc/org.apache.karaf.log.cfg b/openhab/openhab_userdata/etc/org.apache.karaf.log.cfg new file mode 100644 index 0000000..c401b91 --- /dev/null +++ b/openhab/openhab_userdata/etc/org.apache.karaf.log.cfg @@ -0,0 +1,23 @@ +## Standard settings of Karaf + +# +# This configuration file is used to configure the default values for the log:display +# and log:exception-display commands. +# + +# +# The number of log statements to be displayed using log:display. It also defines the number +# of lines searched for exceptions using log:exception-display. You can override this value +# at runtime using -n in log:display. +# +size = 500 + +########################################################################## +## +## Custom openHAB configuration + +# +# The pattern used to format the log statement when using log:display. This pattern is according +# to the log4j layout. You can override this parameter at runtime using log:display with -p. +# +pattern = %d{HH:mm:ss.SSS} [%-5.5p] [%-37.37c] - %h{%m}%n diff --git a/openhab/openhab_userdata/etc/org.apache.karaf.shell.cfg b/openhab/openhab_userdata/etc/org.apache.karaf.shell.cfg new file mode 100644 index 0000000..d5189a5 --- /dev/null +++ b/openhab/openhab_userdata/etc/org.apache.karaf.shell.cfg @@ -0,0 +1,152 @@ + +################################################################################ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +################################################################################ + +# +# These properties are used to configure Karaf's ssh shell. +# + +# +# Via sshPort and sshHost you define the address you can login into Karaf. +# +sshPort = 8101 +sshHost = 127.0.0.1 + +# +# The sshIdleTimeout defines the inactivity timeout to logout the SSH session. +# The sshIdleTimeout is in milliseconds, and the default is set to 30 minutes. +# +sshIdleTimeout = 1800000 + +# +# Define the number of the NIO workers for the sshd server. Default is 2. +# +#nio-workers = 2 + +# +# Define the maximum number of SSH sessions. Default is unlimited. +# +#max-concurrent-sessions = -1 + +# +# sshRealm defines which JAAS domain to use for password authentication. +# +sshRealm = karaf + +# +# Role name used for SSH access authorization +# If not set, this defaults to the ${karaf.admin.role} configured in etc/system.properties +# +# sshRole = admin + +# +# Defines if the SFTP system is enabled or not in the SSH server +# +sftpEnabled=true + +# +# The location of the hostKey file defines where the private key of the server +# is located. If no file is at the defined location it will be ignored. +# +hostKey = ${karaf.etc}/host.key + +# +# The password required to decrypt the private key of the server stored in +# 'hostKey'. This is not required if the private key stored in 'hostKey' is +# not encrypted +# +#hostKeyPassword = + +# +# The location of the hostKeyPub file defines where the public key of the server +# is located. If no file is at the defined location it will be ignored. +# +#hostKeyPub = ${karaf.etc}/host.key.pub + +# +# Self defined key size in 1024, 2048, 3072, or 4096 +# If not set, this defaults to 2048. +# +# keySize = 2048 + +# +# Specify host key algorithm, defaults to RSA +# +# algorithm = RSA + +# +# Specify the client log level (default is WARN) +# 0: ERROR +# 1: WARN +# 2: INFO +# 3: DEBUG +# 4: TRACE +# +#logLevel = 1 + +# +# Specify an additional welcome banner to be displayed when a user logs into the server. +# +# welcomeBanner = + +# +# Defines the completion mode on the Karaf shell console. The possible values are: +# - GLOBAL: it's the same behavior as in previous Karaf releases. The completion displays all commands and all aliases +# ignoring if you are in a subshell or not. +# - FIRST: the completion displays all commands and all aliases only when you are not in a subshell. When you are +# in a subshell, the completion displays only the commands local to the subshell. +# - SUBSHELL: the completion displays only the subshells on the root level. When you are in a subshell, the completion +# displays only the commands local to the subshell. +# This property define the default value when you use the Karaf shell console. +# You can change the completion mode directly in the shell console, using shell:completion command. +# +completionMode = GLOBAL + +# If set to true, shell:logout command will not exit Karaf. This can be useful to avoid accidental exits. +# You will be able to exit via 'shutdown' or 'halt' instead. +disableLogout = false +# If set to true, it will stop CTRL-D from exiting Karaf. This can be useful to avoid accidental exits. +# You will be able to exit via 'shutdown' or 'halt' instead. +disableEofExit = false + +# +# Override allowed SSH cipher algorithms. +# Default: aes256-ctr,aes192-ctr,aes128-ctr +# +# ciphers = aes256-ctr,aes192-ctr,aes128-ctr + +# +# Override allowed SSH HMAC algorithms. +# Default: hmac-sha2-512,hmac-sha2-256 +# +# macs = hmac-sha2-512,hmac-sha2-256 + +# +# Override allowed SSH key exchange algorithms. +# Default: ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256 +# +# kexAlgorithms = ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256 + +# +# Override moduli-url. +# Default: moduli-url not specified to use the internal one from SSHD +# +# moduli-url = external moduli-url users wanna use + + diff --git a/openhab/openhab_userdata/etc/org.jupnp.cfg b/openhab/openhab_userdata/etc/org.jupnp.cfg new file mode 100644 index 0000000..dae0b9e --- /dev/null +++ b/openhab/openhab_userdata/etc/org.jupnp.cfg @@ -0,0 +1,3 @@ +multicastResponsePort=0 +asyncThreadPoolSize=30 +threadPoolSize=15 diff --git a/openhab/openhab_userdata/etc/org.openhab.audio.cfg b/openhab/openhab_userdata/etc/org.openhab.audio.cfg new file mode 100644 index 0000000..4f88d13 --- /dev/null +++ b/openhab/openhab_userdata/etc/org.openhab.audio.cfg @@ -0,0 +1,2 @@ + +defaultSink = enhancedjavasound diff --git a/openhab/openhab_userdata/etc/org.openhab.voice.cfg b/openhab/openhab_userdata/etc/org.openhab.voice.cfg new file mode 100644 index 0000000..164d745 --- /dev/null +++ b/openhab/openhab_userdata/etc/org.openhab.voice.cfg @@ -0,0 +1,2 @@ + +defaultHLI = rulehli diff --git a/openhab/openhab_userdata/etc/org.ops4j.pax.logging.cfg b/openhab/openhab_userdata/etc/org.ops4j.pax.logging.cfg new file mode 100644 index 0000000..e8a48ea --- /dev/null +++ b/openhab/openhab_userdata/etc/org.ops4j.pax.logging.cfg @@ -0,0 +1 @@ +org.ops4j.pax.logging.log4j2.config.file=${karaf.etc}/log4j2.xml diff --git a/openhab/openhab_userdata/etc/org.ops4j.pax.url.mvn.cfg b/openhab/openhab_userdata/etc/org.ops4j.pax.url.mvn.cfg new file mode 100644 index 0000000..c6a93d9 --- /dev/null +++ b/openhab/openhab_userdata/etc/org.ops4j.pax.url.mvn.cfg @@ -0,0 +1,120 @@ +# +# If set to true, the following property will not allow any certificate to be used +# when accessing Maven repositories through SSL +# +#org.ops4j.pax.url.mvn.certificateCheck= + +# +# Path to the local Maven settings file. +# The repositories defined in this file will be automatically added to the list +# of default repositories if the 'org.ops4j.pax.url.mvn.repositories' property +# below is not set. +# The following locations are checked for the existence of the settings.xml file +# * 1. looks for the specified url +# * 2. if not found looks for /var/jenkins_home/.m2/settings.xml +# * 3. if not found looks for /var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven_latest_/conf/settings.xml +# * 4. if not found looks for ${M2_HOME}/conf/settings.xml +# +# Properties prefixed with "org.ops4j.pax.url.mvn." have +# higher priority except element. HTTP proxies should be configured in +# settings file +#org.ops4j.pax.url.mvn.settings= + +# +# Path to the local Maven repository which is used to avoid downloading +# artifacts when they already exist locally. +# The value of this property will be extracted from the settings.xml file +# above, or defaulted to: +# System.getProperty( "user.home" ) + "/.m2/repository" +# +org.ops4j.pax.url.mvn.localRepository=${openhab.userdata}/tmp/mvn + +# +# Default this to false. It's just weird to use undocumented repos +# "false" means that https://repo1.maven.org/maven2@id=central won't be +# implicitly used as remote repository +# +org.ops4j.pax.url.mvn.useFallbackRepositories=false + +# +# Comma separated list of repositories scanned when resolving an artifact. +# list of repositories searched in the first place, should contain +# ${runtime.home}/${karaf.default.repository}. +# if "org.ops4j.pax.url.mvn.localRepository" is defined and it's not +# ~/.m2/repository, it's recommended (at least for dev purposes) to add +# ~/.m2/repository to defaultRepositories +# each of these repositories is checked by aether as "local repository". if +# artifact isn't found, "repositories" are searched next +# +# Those repositories will be checked before iterating through the +# below list of repositories and even before the local repository +# A repository url can be appended with zero or more of the following flags: +# @snapshots : the repository contains snapshots +# @noreleases : the repository does not contain any released artifacts +# +# The following property value will add the system folder as a repo. +# +org.ops4j.pax.url.mvn.defaultRepositories=\ + ${karaf.home.uri}${karaf.default.repository}@id=system.repository@snapshots, \ + ${karaf.data.uri}tmp/kar@id=kar.repository@multi@snapshots, \ + ${karaf.base.uri}${karaf.default.repository}@id=child.system.repository@snapshots + +# +# if "defaultLocalRepoAsRemote" is set to *any* value, localRepository will be +# added to the list of remote repositories being searched for artifacts +# +#org.ops4j.pax.url.mvn.defaultLocalRepoAsRemote = true + +# +# Comma separated list of repositories scanned when resolving an artifact. +# list of repositories searched after resolution fails for "defaultRepositories" +# These are true remote repositories accessed using maven/aether/wagon +# mechanisms. If any repository contains required artifact, it is then written +# to "localRepository" +# +# if this list is _prepended_ with '+' sign, all repositories from active +# profiles defined in effective settings.xml file will be _appended_ to this +# list +# The default list includes the following repositories: +# https://repo1.maven.org/maven2@id=central +# https://repository.apache.org/content/groups/snapshots-group@id=apache@snapshots@noreleases +# https://oss.sonatype.org/content/repositories/ops4j-snapshots@id=ops4j.sonatype.snapshots.deploy@snapshots@noreleases +# A repository url can be appended with zero or more of the following flags: +# @snapshots : the repository contains snapshots +# @noreleases : the repository does not contain any released artifacts +# @id=repository.id : the id for the repository, just like in the +# settings.xml this is optional but recommended +# +# This contains the openHAB and default repositories. +# +org.ops4j.pax.url.mvn.repositories= \ + https://openhab.jfrog.io/openhab/libs-release@id=openhab + +# +# Global policies override repository-specific settings (@checksum=..., @update=..., @releasesUpdate=..., ...) +# +#org.ops4j.pax.url.mvn.globalUpdatePolicy = daily +#org.ops4j.pax.url.mvn.globalChecksumPolicy = warn + +# +# socket and connection configuration (pax-url-aether 2.5.0) +# +# default value for connection and read timeouts, when socket.readTimeout and socket.connectionTimeout +# are not specified +org.ops4j.pax.url.mvn.timeout = 5000 +# timeout in ms when establishing http connection during artifact resolution +org.ops4j.pax.url.mvn.socket.connectionTimeout = 5000 +# timeout in ms when reading data after connecting to remote repository +org.ops4j.pax.url.mvn.socket.readTimeout = 30000 +# SO_KEEPALIVE option for sockets, defaults to false +org.ops4j.pax.url.mvn.socket.keepAlive = false +# SO_LINGER option for sockets, defaults to -1 +org.ops4j.pax.url.mvn.socket.linger = -1 +# SO_REUSEADDR option for sockets, defaults to false +org.ops4j.pax.url.mvn.socket.reuseAddress = false +# TCP_NODELAY option for sockets, defaults to true +org.ops4j.pax.url.mvn.socket.tcpNoDelay = true +# Configure buffer size for HTTP connections (output and input buffers), defaults to 8192 bytes +org.ops4j.pax.url.mvn.connection.bufferSize = 8192 +# Number of connection retries after failure is detected in http client. httpclient uses default value "3" +org.ops4j.pax.url.mvn.connection.retryCount = 3 diff --git a/openhab/openhab_userdata/etc/org.ops4j.pax.web.cfg b/openhab/openhab_userdata/etc/org.ops4j.pax.web.cfg new file mode 100644 index 0000000..5eedb13 --- /dev/null +++ b/openhab/openhab_userdata/etc/org.ops4j.pax.web.cfg @@ -0,0 +1,62 @@ +# +# min server threads +# +org.ops4j.pax.web.server.minThreads = 2 + +# +# max server threads +# +org.ops4j.pax.web.server.maxThreads = 50 + +# +# location of jetty config +# +org.ops4j.pax.web.config.file = ${openhab.runtime}/etc/jetty.xml + +# +# enable https +# +org.osgi.service.http.secure.enabled = true + +# +# http port. +# This is currently also in the setenv +# org.osgi.service.http.port = 8080 + +# +# https port, default is 8443. +# This is currently also in the setenv +# +#org.osgi.service.http.port.secure = 8443 + +# +# The number of minutes after which an inactive session will timeout. +# +org.ops4j.pax.web.session.timeout = 10 + +# +# Specifies if the connections established use the nio classes from java. +# +org.osgi.service.http.useNIO = true + +# +# Set to true if certificate-based client authentication at the server is "wanted". +# +org.ops4j.pax.web.ssl.clientauthwanted = false + +# +# Set to true if certificate-based client authentication at the server is "required". +# +org.ops4j.pax.web.ssl.clientauthneeded = false + +# +# The time in milliseconds that the connection can be idle before it is closed. +# +org.ops4j.pax.web.server.idleTimeout = 300000 + +# +# Listening addresses. This should match host in the sslconnector/name attribute in jetty.xml +# Default is 0.0.0.0 +# This is currently also in the setenv +# +#org.ops4j.pax.web.listening.addresses = 0.0.0.0 diff --git a/openhab/openhab_userdata/etc/overrides.properties b/openhab/openhab_userdata/etc/overrides.properties new file mode 100644 index 0000000..e69de29 diff --git a/openhab/openhab_userdata/etc/profile.cfg b/openhab/openhab_userdata/etc/profile.cfg new file mode 100644 index 0000000..ee4b584 --- /dev/null +++ b/openhab/openhab_userdata/etc/profile.cfg @@ -0,0 +1,119 @@ +# +# Profile generated by Karaf Assembly Builder +# + +# Parent profiles +attribute.parents = generated-startup generated-boot generated-installed + +# Attributes +attribute.overlay = true + +# Feature XML repositories +repository.mvn\:org.apache.karaf.features/standard/4.4.3/xml/features = mvn:org.apache.karaf.features/standard/4.4.3/xml/features +repository.mvn\:org.apache.karaf.features/framework/4.4.3/xml/features = mvn:org.apache.karaf.features/framework/4.4.3/xml/features +repository.mvn\:org.openhab.distro/distro/4.0.3/xml/features = mvn:org.openhab.distro/distro/4.0.3/xml/features +repository.mvn\:org.openhab.distro/openhab-addons/4.0.3/xml/features = mvn:org.openhab.distro/openhab-addons/4.0.3/xml/features +repository.mvn\:org.openhab.distro/distro-kar/4.0.3/xml/features = mvn:org.openhab.distro/distro-kar/4.0.3/xml/features + +# Features +feature.framework = framework +feature.eventadmin = eventadmin +feature.jaas = jaas +feature.shell = shell +feature.ssh = ssh +feature.bundle = bundle +feature.config = config +feature.deployer = deployer +feature.diagnostic = diagnostic +feature.feature = feature +feature.instance = instance +feature.kar = kar +feature.log = log +feature.package = package +feature.service = service +feature.system = system +feature.openhab-runtime-base = openhab-runtime-base +feature.openhab-runtime-ui = openhab-runtime-ui +feature.wrapper = wrapper +feature.wrap = wrap +feature.openhab-runtime-ui/4.0.3 = openhab-runtime-ui/4.0.3 +feature.openhab-core-base/4.0.3 = openhab-core-base/4.0.3 +feature.openhab-core-addon-marketplace/4.0.3 = openhab-core-addon-marketplace/4.0.3 +feature.openhab-core-auth-jaas/4.0.3 = openhab-core-auth-jaas/4.0.3 +feature.openhab-core-auth-oauth2client/4.0.3 = openhab-core-auth-oauth2client/4.0.3 +feature.openhab-core-automation-module-script/4.0.3 = openhab-core-automation-module-script/4.0.3 +feature.openhab-core-automation-module-script-rulesupport/4.0.3 = openhab-core-automation-module-script-rulesupport/4.0.3 +feature.openhab-core-automation-module-media/4.0.3 = openhab-core-automation-module-media/4.0.3 +feature.openhab-core-automation-rest/4.0.3 = openhab-core-automation-rest/4.0.3 +feature.openhab-core-io-bin2json/4.0.3 = openhab-core-io-bin2json/4.0.3 +feature.openhab-core-io-console-karaf/4.0.3 = openhab-core-io-console-karaf/4.0.3 +feature.openhab-core-io-http-auth/4.0.3 = openhab-core-io-http-auth/4.0.3 +feature.openhab-core-io-rest-auth/4.0.3 = openhab-core-io-rest-auth/4.0.3 +feature.openhab-core-io-rest-log/4.0.3 = openhab-core-io-rest-log/4.0.3 +feature.openhab-core-io-rest-sitemap/4.0.3 = openhab-core-io-rest-sitemap/4.0.3 +feature.openhab-core-io-rest-swagger/4.0.3 = openhab-core-io-rest-swagger/4.0.3 +feature.openhab-core-io-rest-audio/4.0.3 = openhab-core-io-rest-audio/4.0.3 +feature.openhab-core-io-rest-transform/4.0.3 = openhab-core-io-rest-transform/4.0.3 +feature.openhab-core-io-rest-voice/4.0.3 = openhab-core-io-rest-voice/4.0.3 +feature.openhab-core-io-rest-mdns/4.0.3 = openhab-core-io-rest-mdns/4.0.3 +feature.openhab-core-io-websocket/4.0.3 = openhab-core-io-websocket/4.0.3 +feature.openhab-core-io-transport-coap/4.0.3 = openhab-core-io-transport-coap/4.0.3 +feature.openhab-core-io-transport-http/4.0.3 = openhab-core-io-transport-http/4.0.3 +feature.openhab-core-io-transport-mdns/4.0.3 = openhab-core-io-transport-mdns/4.0.3 +feature.openhab-core-io-transport-modbus/4.0.3 = openhab-core-io-transport-modbus/4.0.3 +feature.openhab-core-io-transport-mqtt/4.0.3 = openhab-core-io-transport-mqtt/4.0.3 +feature.openhab-core-io-transport-serial-javacomm/4.0.3 = openhab-core-io-transport-serial-javacomm/4.0.3 +feature.openhab-core-io-transport-upnp/4.0.3 = openhab-core-io-transport-upnp/4.0.3 +feature.openhab.inc-model-core/4.0.3 = openhab.inc-model-core/4.0.3 +feature.openhab-core-model-item/4.0.3 = openhab-core-model-item/4.0.3 +feature.openhab-core-model-item-ide/4.0.3 = openhab-core-model-item-ide/4.0.3 +feature.openhab-core-model-persistence/4.0.3 = openhab-core-model-persistence/4.0.3 +feature.openhab-core-model-persistence-ide/4.0.3 = openhab-core-model-persistence-ide/4.0.3 +feature.openhab-core-model-rule/4.0.3 = openhab-core-model-rule/4.0.3 +feature.openhab-core-model-rule-ide/4.0.3 = openhab-core-model-rule-ide/4.0.3 +feature.openhab-core-model-script/4.0.3 = openhab-core-model-script/4.0.3 +feature.openhab-core-model-script-ide/4.0.3 = openhab-core-model-script-ide/4.0.3 +feature.openhab-core-model-sitemap/4.0.3 = openhab-core-model-sitemap/4.0.3 +feature.openhab-core-model-sitemap-ide/4.0.3 = openhab-core-model-sitemap-ide/4.0.3 +feature.openhab-core-model-thing/4.0.3 = openhab-core-model-thing/4.0.3 +feature.openhab-core-model-thing-ide/4.0.3 = openhab-core-model-thing-ide/4.0.3 +feature.openhab-core-model-lsp/4.0.3 = openhab-core-model-lsp/4.0.3 +feature.openhab-core-storage-json/4.0.3 = openhab-core-storage-json/4.0.3 +feature.openhab-core-ui/4.0.3 = openhab-core-ui/4.0.3 +feature.openhab-core-ui-icon/4.0.3 = openhab-core-ui-icon/4.0.3 +feature.openhab-runtime-base/4.0.3 = openhab-runtime-base/4.0.3 +feature.openhab-runtime-certificate/4.0.3 = openhab-runtime-certificate/4.0.3 +feature.openhab-transport-coap/4.0.3 = openhab-transport-coap/4.0.3 +feature.openhab-transport-http/4.0.3 = openhab-transport-http/4.0.3 +feature.openhab-transport-mdns/4.0.3 = openhab-transport-mdns/4.0.3 +feature.openhab-transport-modbus/4.0.3 = openhab-transport-modbus/4.0.3 +feature.openhab-transport-mqtt/4.0.3 = openhab-transport-mqtt/4.0.3 +feature.openhab-transport-serial/4.0.3 = openhab-transport-serial/4.0.3 +feature.openhab-transport-upnp/4.0.3 = openhab-transport-upnp/4.0.3 +feature.openhab.tp-base/4.0.3 = openhab.tp-base/4.0.3 +feature.openhab.tp-coap/4.0.3 = openhab.tp-coap/4.0.3 +feature.openhab.tp-commons-net/4.0.3 = openhab.tp-commons-net/4.0.3 +feature.openhab.tp-gson/4.0.3 = openhab.tp-gson/4.0.3 +feature.openhab.tp-hivemqclient/4.0.3 = openhab.tp-hivemqclient/4.0.3 +feature.openhab.tp-httpclient/4.0.3 = openhab.tp-httpclient/4.0.3 +feature.openhab.tp-jackson/4.0.3 = openhab.tp-jackson/4.0.3 +feature.openhab.tp-asm/4.0.3 = openhab.tp-asm/4.0.3 +feature.openhab.tp-jax-rs-whiteboard/4.0.3 = openhab.tp-jax-rs-whiteboard/4.0.3 +feature.openhab.tp-jna/4.0.3 = openhab.tp-jna/4.0.3 +feature.openhab.tp-cxf/4.0.3 = openhab.tp-cxf/4.0.3 +feature.openhab.tp-jbbp/4.0.3 = openhab.tp-jbbp/4.0.3 +feature.openhab.tp-netty/4.0.3 = openhab.tp-netty/4.0.3 +feature.openhab.tp-jaxb/4.0.3 = openhab.tp-jaxb/4.0.3 +feature.openhab.tp-jaxws/4.0.3 = openhab.tp-jaxws/4.0.3 +feature.openhab.tp-jollyday/4.0.3 = openhab.tp-jollyday/4.0.3 +feature.openhab.tp-jmdns/4.0.3 = openhab.tp-jmdns/4.0.3 +feature.openhab.tp-jose4j/4.0.3 = openhab.tp-jose4j/4.0.3 +feature.openhab.tp-jupnp/4.0.3 = openhab.tp-jupnp/4.0.3 +feature.openhab.tp-lsp4j/4.0.3 = openhab.tp-lsp4j/4.0.3 +feature.openhab.tp-serial-javacomm/4.0.3 = openhab.tp-serial-javacomm/4.0.3 +feature.openhab.tp-serial-rxtx/4.0.3 = openhab.tp-serial-rxtx/4.0.3 +feature.openhab.tp-xtext/4.0.3 = openhab.tp-xtext/4.0.3 +feature.openhab.tp-xtext-ide/4.0.3 = openhab.tp-xtext-ide/4.0.3 +feature.openhab.tp-swagger-jaxrs/4.0.3 = openhab.tp-swagger-jaxrs/4.0.3 +feature.distro/4.0.3 = distro/4.0.3 +feature.distro-kar/4.0.3 = distro-kar/4.0.3 diff --git a/openhab/openhab_userdata/etc/scripts/shell.colors.script b/openhab/openhab_userdata/etc/scripts/shell.colors.script new file mode 100644 index 0000000..a90bceb --- /dev/null +++ b/openhab/openhab_userdata/etc/scripts/shell.colors.script @@ -0,0 +1,40 @@ +// This script overrides the default colors for the Karaf console. +// All colors are set using the original ANSI escape code specification. + +// HIGHLIGHTER_COLORS overrides the colors related to console input. +// From the Apache Felix documentation: +// rs : Reserved words +// st : Strings +// nu : Numbers +// co : Constants +// va : Variable +// vn : Variable name +// fu : Function +// bf : Bad function +// un : Unknown +// re : Repair + +HIGHLIGHTER_COLORS = "rs=93:st=92:nu=37:co=90:va=97:vn=37:fu=96:bf=91:re=32" + +// LS_COLORS overrides the colors used in the ls command output. +// From the Apache Felix documentation: +// dr : Directory +// ex : Executable +// sl : Symbolic Link +// ot : Other + +//LS_COLORS = "dr=1;91:ex=1;92:sl=1;96:ot=34;43" + +// GREP_COLORS overrides the colors used in the grep command output. +// From the Apache Felix documentation: +// mt : Hits in the text (sets both ms and mc) +// ms : Matching text in selected line +// mc : Matching text in context line +// fn : File names +// ln : Line numbers +// se : Selected lines +// sl : Whole selected line +// cx : Context lines +// rv : If set and match is inverted, the meaning of sl and cx is inverted + +//GREP_COLORS = "mt=1;31:fn=35:ln=32:se=36" diff --git a/openhab/openhab_userdata/etc/scripts/shell.completion.script b/openhab/openhab_userdata/etc/scripts/shell.completion.script new file mode 100644 index 0000000..7785633 --- /dev/null +++ b/openhab/openhab_userdata/etc/scripts/shell.completion.script @@ -0,0 +1,271 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you 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. +// +// This script is run each time a shell is created. +// You can define here closures or variables that will be available +// in each session. +// + +__option_not_present = { + res = true + opts = $argv + each $opts { + arg = $it + each ($.commandLine words) { + if { ($it toString) equals ($arg toString) } { + res = false + } + } + } + $res +} + +__set_unset_arguments = { + is_setopt = (($.commandLine words) get 0) equals "setopt" + enums = ((__load_class 'org.jline.reader.LineReader$Option') enumConstants) + candidates = new ArrayList + each $enums { + name = ${(GL)it/_/-} + is_set = ($.reader isSet $it) + neg = %(( if(is_setopt, is_set, not(is_set)) )) + if { $neg } { + name = "no-${name}" + } + if { not { (($.commandLine words) subList 1 ($.commandLine wordIndex)) contains $name } } { + $candidates add (new org.jline.reader.Candidate $name $name (if { $neg } { "unset" } { "set" }) null null null true) + } + } + $candidates +} + +jlineReader = $.reader +if { %(jlineReader != null) } { + + complete -c shell:complete -e + complete -c shell:complete -d "Edit command specific completions" + complete -c shell:complete -s c -l command --description "Command to add completion to" -n '__option_not_present -c --command' -a '$.commands' + complete -c shell:complete -s s -l short-option --description "Posix-style option to complete" -n '__option_not_present -s --short-option' + complete -c shell:complete -s l -l long-option --description "GNU-style option to complete" -n '__option_not_present -l --long-option' + complete -c shell:complete -s a -l arguments --description "A list of possible arguments" -n '__option_not_present -a --argument' + complete -c shell:complete -s d -l description --description "Description of this completions" -n '__option_not_present -d --description' + complete -c shell:complete -s h -l help --description "Display help and exit" -n '__option_not_present -h --help' + complete -c shell:complete -s n -l condition --description "The completion should only be used if the specified command has a zero exit status" -n '__option_not_present -n --condition' + complete -c shell:complete -s e -l erase --description "Remove completion" -n '__option_not_present -e --erase' + + complete -c shell:history -e + complete -c shell:history -d "Show and manipulate command history" + complete -c shell:history -l clear --description "Clear history" -n '__option_not_present --clear' + complete -c shell:history -l save --description "Save history" -n '__option_not_present --save' + + complete -c shell:setopt -e + complete -c shell:setopt -d "Set or view set shell options" + complete -c shell:setopt -a '__set_unset_arguments' + + complete -c shell:unsetopt -e + complete -c shell:unsetopt -d "Unset or view unset shell options" + complete -c shell:unsetopt -a '__set_unset_arguments' + + complete -c shell:cat -e + complete -c shell:cat -d "Concatenate and print files" + complete -c shell:cat -s n "Number the output lines, starting at 1" + complete -c shell:cat -a '__files' + + complete -c shell:pwd -e + complete -c shell:pwd -d "Get current directory" + + complete -c shell:ls -e + complete -c shell:ls -d "List files" + + complete -c shell:cd -e + complete -c shell:cd -d "Change current directory" + complete -c shell:cd -a 'wi = ($.commandLine wordIndex); if { %(wi==1) } { __directories } { [ ] }' + + complete -c shell:sleep -e + complete -c shell:sleep -d "Pause execution for the specified amount of time" + + complete -c shell:echo -e + complete -c shell:echo -d "Write arguments to the standard output" + complete -c shell:echo -s n -d "No trailing new line" + + complete -c shell:grep -e + complete -c shell:grep -d "File pattern searcher" + # TODO + + complete -c shell:sort -e + complete -c shell:sort -d "Sort lines of text files" + # TODO + + complete -c shell:gosh -e + complete -c shell:gosh -d "Execute script with arguments in a new session" + # TODO + + complete -c shell:sh -e + complete -c shell:sh -d "Execute script with arguments in a new session" + # TODO + + complete -c shell:source -e + complete -c shell:source -d "Execute script with arguments" + # TODO + + # TODO: format getopt new set tac type addcommand removeCommand eval + + complete -c shell:break -e + complete -c shell:break -d "Break from a loop" + + complete -c shell:continue -e + complete -c shell:continue -d "Continue to next iteration in a loop" + + complete -c shell:each -e + complete -c shell:each -d "Loop and execute script on the specified elements" + + complete -c shell:if -e + complete -c shell:if -d "Conditionaly execute a script" + + complete -c shell:new -e + complete -c shell:new -d "Creates new instance of the given java class" + + complete -c shell:not -e + complete -c shell:not -d "Negates the result of a script" + + complete -c shell:throw -e + complete -c shell:throw -d "Throws an exception" + + complete -c shell:try -e + complete -c shell:try -d "Try executing a script and catch any exception" + + complete -c shell:until -e + complete -c shell:until -d "Loop and execute script until a condition is satisfied" + + complete -c shell:while -e + complete -c shell:while -d "Loop and execute script while a condition is satisfied" + + complete -c shell:less -e + complete -c shell:less -d "File pager" + complete -c shell:less -s e -l quit-at-eof --description "Exit on second EOF" + complete -c shell:less -s E -l QUIT-AT-EOF --description "Exit on EOF" + complete -c shell:less -s q -l quiet -l silent --description "Silent mode" + complete -c shell:less -s Q -l QUIET -l SILENT --description "Completely silent" + complete -c shell:less -s S -l chop-long-lines --description "Do not fold long lines" + complete -c shell:less -s i -l ignore-case --description "Search ignores lowercase case" + complete -c shell:less -s I -l IGNORE-CASE --description "Search ignores all case" + complete -c shell:less -s x -l tabs --description "Set tab stops" + complete -c shell:less -s N -l LINE-NUMBERS --description "Display line number for each line" + complete -c shell:less -a '__files' + + complete -c shell:nano -e + complete -c shell:nano -d "File editor" + complete -c shell:nano -a '__files' + + complete -c shell:keymap -e + complete -c shell:keymap -d "Manipulate keymaps" + complete -c shell:keymap -s N --description "Create a new keymap" -n '__option_not_present -N -d -D -l -r -s -A' + complete -c shell:keymap -s d --description "Delete existing keymaps and reset to default state" -n '__option_not_present -N -d -D -l -r -s -A' + complete -c shell:keymap -s D --description "Delete named keymaps" -n '__option_not_present -N -d -D -l -r -s -A' + complete -c shell:keymap -s l --description "List existing keymap names" -n '__option_not_present -N -d -D -l -r -s -A' + complete -c shell:keymap -s r --description "Unbind specified in-strings" -n '__option_not_present -N -d -D -l -r -s -A' + complete -c shell:keymap -s s --description "Bind each in-string to each out-string" -n '__option_not_present -N -d -D -l -r -s -A' + complete -c shell:keymap -s A --description "Create alias to keymap" -n '__option_not_present -N -d -D -l -r -s -A' + complete -c shell:keymap -s e --description "Select emacs keymap and bind it to main" -n '__option_not_present -e -a -v -M' + complete -c shell:keymap -s v --description "Select viins keymap and bind it to main" -n '__option_not_present -e -a -v -M' + complete -c shell:keymap -s a --description "Select vicmd keymap" -n '__option_not_present -e -a -v -M' + complete -c shell:keymap -s M --description "Specify keymap to select" -n '__option_not_present -e -a -v -M' -a '(keymap -l | tac) split " "' + complete -c shell:keymap -s R --description "Interpret in-strings as ranges" + complete -c shell:keymap -s p --description "List bindings which have given key sequence as a a prefix" + complete -c shell:keymap -s L --description "Output in form of keymap commands" + + complete -c shell:widget -e + complete -c shell:widget -d "Manipulate widgets" + complete -c shell:widget -s N --description "Create a new widget" -n '__option_not_present -N -A -D -U -l' + complete -c shell:widget -s A --description "Create alias to widget" -n '__option_not_present -N -A -D -U -l' + complete -c shell:widget -s D --description "Delete widgets" -n '__option_not_present -N -A -D -U -l' + complete -c shell:widget -s U --description "Push characters to the stack" -n '__option_not_present -N -A -D -U -l' + complete -c shell:widget -s l --description "List user-defined widgets" -n '__option_not_present -N -A -D -U -l' + complete -c shell:widget -s a --description "With -l, list all widgets" -n '__option_not_present -l' + + complete -c shell:bg -e + complete -c shell:bg -d "Put job in background" + + complete -c shell:fg -e + complete -c shell:fg -d "Put job in foreground" + + complete -c shell:jobs -e + complete -c shell:jobs -d "List jobs" + + complete -c shell:clear -e + complete -c shell:clear -d "Clear screen" + + complete -c shell:head -e + complete -c shell:head -d "Displays first lines of file" + complete -c shell:head -s n -l lines --description "Print line counts" + complete -c shell:head -s c -l bytes --description "Print byte counts" + complete -c shell:head -a '__files' + + complete -c shell:tail -e + complete -c shell:tail -d "Displays last lines of file" + complete -c shell:tail -s q -l quiet --description "Suppress headers when printing multiple sources" + complete -c shell:tail -s f -l follow --description "Do not stop at end of file" + complete -c shell:tail -s F -l FOLLOW --description "Follow and check for file renaming or rotation" + complete -c shell:tail -s n -l lines --description "Number of lines to print" + complete -c shell:tail -s c -l bytes --description "Number of bytes to print" + complete -c shell:tail -a '__files' + + complete -c shell:date -e + complete -c shell:date -d "Display date and time" + complete -c shell:date -s u --description "Use UTC" + complete -c shell:date -s r --description "Print the date represented by 'seconds' since January 1, 1970" + complete -c shell:date -s v --description "Adjust date" + complete -c shell:date -s f --description "Use 'input_fmt' to parse 'new_date'" + + complete -c shell:wc -e + complete -c shell:wc -d "Word, line, character, and byte count" + complete -c shell:wc -s n -l lines --description "Print line count" + complete -c shell:wc -s c -l bytes --description "Print byte count" + complete -c shell:wc -s m -l chars --description "Print character count" + complete -c shell:wc -s w -l words --description "Print word count" + complete -c shell:wc -a '__files' + + __get_scr_components = { + list = [ ] + scrref = ($.context getServiceReference org.osgi.service.component.runtime.ServiceComponentRuntime) + scr = ($.context getService $scrref) + each ($scr getComponentDescriptionDTOs ($.context bundles)) { + $list add ((($it getClass) getField "name") get $it) + } + $.context ungetService $scrref + $list + } + + complete -c scr:config -e + complete -c scr:config -d "Show the current SCR configuration" + + complete -c scr:disable -e + complete -c scr:disable -d "Disable an enabled component" + complete -c scr:disable -a '__get_scr_components' + + complete -c scr:enable -e + complete -c scr:enable -d "Enable an disabled component" + complete -c scr:enable -a '__get_scr_components' + + complete -c scr:info -e + complete -c scr:info -d "Dump information of a component or component configuration" + complete -c scr:info -a '__get_scr_components' + + complete -c scr:list -e + complete -c scr:list -d "List component configurations of a specific bundle" + +} diff --git a/openhab/openhab_userdata/etc/shell.init.script b/openhab/openhab_userdata/etc/shell.init.script new file mode 100644 index 0000000..1d2f8ec --- /dev/null +++ b/openhab/openhab_userdata/etc/shell.init.script @@ -0,0 +1,55 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you 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. +// +// This script is run each time a shell is created. +// You can define here closures or variables that will be available +// in each session. +// +ld = { log:display $args } ; +lde = { log:exception-display $args } ; +la = { bundle:list -t 0 $args } ; +ls = { service:list $args } ; +cl = { config:list "(service.pid=$args)" } ; +halt = { system:shutdown -h -f $args } ; +help = { *:help $args | more } ; +man = { help $args } ; +log:list = { log:get ALL } ; +service:get = { $.context getService ($.context getServiceReference $args) }; +feature:upgrade = { feature:install -u $args } ; + +env = { shell:set $args } +edit = { shell:nano $args } +more = { shell:less -F $args } + +__load_class = { + (($.reader class) classLoader) loadClass $1 +} + +// make sure that we catch exceptions +// as they do occur if the session is headless / non-interactive +jlineReader = $.reader +if { %(jlineReader != null) } { + setopt group + setopt auto-fresh-line + unsetopt insert-tab + keymap "^[OA" up-line-or-search + keymap "^[[A" up-line-or-search + keymap "^[OB" down-line-or-search + keymap "^[[B" down-line-or-search + +} diff --git a/openhab/openhab_userdata/etc/startup.properties b/openhab/openhab_userdata/etc/startup.properties new file mode 100644 index 0000000..2217321 --- /dev/null +++ b/openhab/openhab_userdata/etc/startup.properties @@ -0,0 +1,20 @@ +# Bundles to be started on startup, with startlevel +mvn\:org.apache.karaf.features/org.apache.karaf.features.extension/4.4.3 = 1 +mvn\:org.ops4j.pax.url/pax-url-aether/2.6.12 = 5 +mvn\:org.apache.felix/org.apache.felix.metatype/1.2.4 = 5 +mvn\:org.apache.karaf.services/org.apache.karaf.services.eventadmin/4.4.3 = 5 +mvn\:org.ops4j.pax.logging/pax-logging-api/2.2.0 = 8 +mvn\:org.fusesource.jansi/jansi/2.4.0 = 8 +mvn\:org.ops4j.pax.logging/pax-logging-log4j2/2.2.0 = 8 +mvn\:org.osgi/org.osgi.util.function/1.2.0 = 9 +mvn\:org.osgi/org.osgi.util.promise/1.2.0 = 9 +mvn\:org.apache.felix/org.apache.felix.coordinator/1.0.2 = 9 +mvn\:org.apache.felix/org.apache.felix.converter/1.0.14 = 9 +mvn\:org.apache.felix/org.apache.felix.configadmin/1.9.26 = 10 +mvn\:org.apache.karaf.config/org.apache.karaf.config.core/4.4.3 = 11 +mvn\:org.apache.felix/org.apache.felix.configurator/1.0.16 = 11 +mvn\:org.apache.felix/org.apache.felix.configadmin.plugin.interpolation/1.2.6 = 11 +mvn\:org.apache.sling/org.apache.sling.commons.johnzon/1.2.14 = 11 +mvn\:org.apache.felix/org.apache.felix.cm.json/1.0.6 = 11 +mvn\:org.apache.felix/org.apache.felix.fileinstall/3.7.4 = 12 +mvn\:org.apache.karaf.features/org.apache.karaf.features.core/4.4.3 = 15 diff --git a/openhab/openhab_userdata/etc/system.properties b/openhab/openhab_userdata/etc/system.properties new file mode 100644 index 0000000..20e5450 --- /dev/null +++ b/openhab/openhab_userdata/etc/system.properties @@ -0,0 +1,162 @@ +################################################################################ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +################################################################################ + +# +# The properties defined in this file will be made available through system +# properties at the very beginning of the Karaf's boot process. +# + +# Properties file inclusions (as a space separated list of relative paths) +# Included files will override the values specified in this file +${optionals} = custom.system.properties + +# Log level when the pax-logging service is not available +# This level will only be used while the pax-logging service bundle +# is not fully available. +# To change log levels, please refer to the org.ops4j.pax.logging.cfg file +# instead. +org.ops4j.pax.logging.DefaultServiceLog.level = ERROR + +# +# Name of this Karaf instance. +# +karaf.name = root + +# +# Default repository where bundles will be loaded from before using +# other Maven repositories. For the full Maven configuration, see +# the org.ops4j.pax.url.mvn.cfg file. +# +karaf.default.repository = system + +# +# Location of a shell script that will be run when starting a shell +# session. This script can be used to create aliases and define +# additional commands. +# +# NB: ${karaf.etc} is implicitly added to the path, don't use absolute path here +# +karaf.shell.init.script = shell.init.script,scripts/*.script + +# +# Sets the maximum size of the shell command history. If not set, +# defaults to 500 entries. Setting to 0 will disable history. +# +# karaf.shell.history.maxSize = 0 + +# +# Sets the maximum size of the local shell command history file. If not set, +# defaults to 10000 entries. +# +# karaf.shell.history.file.maxSize = 10000 + +# +# Deletes the entire karaf.data directory at every start +# +karaf.clean.all = false + +# +# Deletes the karaf.data/cache directory at every start +# +karaf.clean.cache = false + +# +# User name for the Karaf local console +# +karaf.local.user = karaf + +# +# Roles to use when for the default user in the local Karaf console. +# +# The syntax is the following: +# [classname:]principal +# where classname is the class name of the principal object +# (defaults to org.apache.karaf.jaas.modules.RolePrincipal) +# and principal is the name of the principal of that class +# (defaults to instance). +# +karaf.local.roles = admin,manager,viewer,systembundles + +# +# Set this empty property to avoid errors when validating xml documents. +# +xml.catalog.files = + +# +# Specs options +# +org.apache.servicemix.specs.debug = false +org.apache.servicemix.specs.timeout = 0 +org.apache.karaf.specs.debug = false +org.apache.karaf.specs.timeout = 0 + +# +# Settings for the OSGi 4.3 Weaving +# By default, we will not weave any classes. Change this setting to include classes +# that you application needs to have woven. +# +org.apache.aries.proxy.weaving.enabled = none +# Classes not to weave - Aries default + Xerces which is known to have issues. +org.apache.aries.proxy.weaving.disabled = org.objectweb.asm.*,org.slf4j.*,org.apache.log4j.*,javax.*,org.apache.xerces.* + +# +# By default, only Karaf shell commands are secured, but additional services can be +# secured by expanding this filter +# +karaf.secured.services = (&(osgi.command.scope=*)(osgi.command.function=*)) + +# +# If set to true, Karaf will exit if either the resolving of feature repositories, or +# the installation of boot features (as configured in org.apache.karaf.features.cfg) fails. +# +karaf.require.successful.features.boot = false + +# +# By default, if there's no ACL policy for a certain karaf command, this command is allowed to access +# without the RBAC. We can change this behavior by enable the following property, which means +# if a karaf command has no corresponding ACL then access it must have one of the karaf.secured.command.compulsory.roles +# +#karaf.secured.command.compulsory.roles=admin + +# +# Security properties +# +# To enable OSGi security, uncomment the properties below, +# install the framework-security feature and restart. +# +#java.security.policy=${karaf.etc}/all.policy +#org.osgi.framework.security=osgi +#org.osgi.framework.trust.repositories=${karaf.etc}/trustStore.ks + +# +# HA/Lock configuration +# +# Karaf uses a lock mechanism to know which instance is the master (HA) +# The lock can be on the filesystem (default) or on a database. +# +# See http://karaf.apache.org/manual/latest/users-guide/failover.html for details. +# +# Even using a single instance, Karaf creates the lock file +# You can specify the location of the lock file using the +# karaf.lock.dir=/path/to/the/directory/containing/the/lock +# +# By default, the slave instances start but are passive. +# If you want to prevent the slave instances startup, you can use +# the karaf.lock.slave.block property (false by default): +# karaf.lock.slave.block=true diff --git a/openhab/openhab_userdata/etc/users.properties b/openhab/openhab_userdata/etc/users.properties new file mode 100644 index 0000000..b566ad4 --- /dev/null +++ b/openhab/openhab_userdata/etc/users.properties @@ -0,0 +1,33 @@ +################################################################################ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +################################################################################ + +# +# This file contains the users, groups, and roles. +# Each line has to be of the format: +# +# USER=PASSWORD,ROLE1,ROLE2,... +# USER=PASSWORD,_g_:GROUP,... +# _g_\:GROUP=ROLE1,ROLE2,... +# +# All users, groups, and roles entered in this file are available after Karaf startup +# and modifiable via the JAAS command group. These users reside in a JAAS domain +# with the name "karaf". +# +openhab = {CRYPT}4F61A0FD056BC0FD8231899EC4D9F9CA06AF0DEC895B2A3B0773F6FBC1C99776{CRYPT},_g_:admingroup +_g_\:admingroup = group,admin,manager,viewer,systembundles diff --git a/openhab/openhab_userdata/etc/version.properties b/openhab/openhab_userdata/etc/version.properties new file mode 100644 index 0000000..e6b47cc --- /dev/null +++ b/openhab/openhab_userdata/etc/version.properties @@ -0,0 +1,11 @@ +openHAB Distribution Version Information +---------------------------------------- +build-no : Release Build +online-repo : https://openhab.jfrog.io/openhab/libs-release + +Repository Version +---------------------------------------- +openhab-distro : 4.0.3 +openhab-core : 4.0.3 +openhab-addons : 4.0.3 +karaf : 4.4.3 diff --git a/openhab/openhab_userdata/secrets/rsa_json_web_key.json b/openhab/openhab_userdata/secrets/rsa_json_web_key.json new file mode 100644 index 0000000..546a292 --- /dev/null +++ b/openhab/openhab_userdata/secrets/rsa_json_web_key.json @@ -0,0 +1 @@ +{"kty":"RSA","n":"xtlnpVyPt_L4tCCOovuFn6qNrorwSZ6RVmrMzSCZ4E7-9W6YcgRGWf8Rr2Qghv8wYlMtAc5f7xr0-CVSfM12oHyhxenWU6FcitJGFIYmnpuiwCEUphmIg3OtmsL1LnR3VFAJxLlhWYGBOhaGnz97w7zm1igF8YnxrEpuij9cR_QrSSoBd-bHVhMRJtEov0zNrxR45c0-VSGfucfSr-X-vyzd49ZPkMCeuc8BrVwsN8BfqRdX2MtyiCrulFNp8Q8gSFyUFTk67c20qHdgtJPyazT-lNc9K0TaJD5wEFCZcj5Fh-CVqav9Q1BxMLVaKmg3h78-sMgNYDzRferCCmFkCQ","e":"AQAB","d":"UQ6wVFUN9MMjpHGdE00KZFKm3J6gYrIztpFkmL2QXEJ3Zd7GX7vkXa0_LUrYg48kzv_u2cyhiJtpfnngTSWIFNWZME8o4gBl8-TRUm548bCpwD3759WCs2sFOo_8WAp71i-mO74Bs_W5ks8541KChgDL7EJ2YcaEcGIK-2nmmSFy7HZ0KypXdfqSTYbn2ZbEFJjjSYxmqSKTegvvXAUfIMwPfsdGfsy5S3H99QxX3-0K2XgduDi0d1dPxcuHMkftSG_oB0lAQrY9K9l_wisJvZNuqE0J4kucSbuvtEovHYceD0zRcGAQxFEaYa_oYSA5yJI2byr1pKVfBIpucCrYnQ","p":"x5-EO91jPK1rs__8T4orVJ_Q1T8sS7z9ny67hDhV8avbpLMpji1MwGmfNhnmSbJfm648EIvTZwxJj_-C09UaL7cZtEcmkHFJ26c9Rz0eecF_fKQbyfudr12NG0gm_immNXBBSSiRi_3KwnriUEEegfnXSXXeI6VrXHA9YDYiqAc","q":"_wHwNCcHVcxFqBsoZVRiJjRoI_8ZOhDmEE9pUjvDMTFz7cuoLBwKbggrpF-CmguENr8F3xsAQppOrW0Z-tWF9TYl0ydwF2SyiQ5ZRol0_jq2NHK7rZu2KvvRrY48kRSxNi3iRjxEM8Q-gWy8IEH1tW6Db6KQtck9axuFFl6k728","dp":"R1uTRl8OMUuAu5hfFgO7F4YFfaUWbYCCXNu0tj_5IOmhG0_cI_G3hPR8sDcz5dY4bQssd3G0QRrYVPwuRRDhSns2WgYxF-MXVsiClCuZ8EYmD2UOdfZW2LAlV8JEBgjXXDTjcYZp-NPhHgIVUkDk6etodN8IaE-igCmzFuhjHRM","dq":"6KJRCpLMS0Y2CZz05jPr8iR_GM-gqOs_poN7doyUji0qMDZJbiwKi8SiY6rKD1QQQo1Tguwz-Y6h1e6g88aVFVVXfmENDhpMEWJoqUO-2iqfjAtbEY7qyh2-dBE9SbFR1TZYpXBXW85co1-Z4-eoiuKNv2rTjzNN94c8i2K-Hrs","qi":"Q-LuIxo9bC76PubTswus3u4H9SHk-T95ASfaRHNKCqUG8rvBTC25zXB1KJlnX9KMn8cDwFb7UnuY-bqDWUpXpe4IcZJRv3MnZEKkRk0bgfTlNoX3pVOEfMiNXM1qb-3zyt4DBh1Z-1V49R8P9z_82H_gGZStBCfYQw9gZAcqfTA"} \ No newline at end of file