diff --git a/.github/workflows/check-dependencies.yaml b/.github/workflows/check-dependencies.yaml index e14cef7..180137d 100644 --- a/.github/workflows/check-dependencies.yaml +++ b/.github/workflows/check-dependencies.yaml @@ -40,7 +40,7 @@ jobs: | grep -v '^[[:space:]]*$' \ | grep -v fms- \ | grep -v influx-client \ - | grep -v zenoh \ + | grep -v up-transport-hono \ | sed -E 's|([^ ]+) v([^ ]+).*|crate/cratesio/-/\1/\2|' \ > DEPS.txt - name: Set up JDK diff --git a/.gitignore b/.gitignore index 69de282..de09756 100644 --- a/.gitignore +++ b/.gitignore @@ -21,5 +21,5 @@ *.drawio.bkp **/target -config/ +config/hono/ *.env diff --git a/.sdv-blueprint.json b/.sdv-blueprint.json index bf519d2..aa7022c 100644 --- a/.sdv-blueprint.json +++ b/.sdv-blueprint.json @@ -3,9 +3,23 @@ "version": "0.1.0", "description": "A close to real-life showcase for truck fleet management where trucks run an SDV software stack so that logistics fleet operators can manage apps, data and services for a diverse set of vehicles.", "participatingProjects": [ - { "id": "automotive.kuksa" }, - { "id": "automotive.leda" }, - { "id": "iot.hono" }, - { "id": "iot.paho" } + { + "id": "automotive.kuksa" + }, + { + "id": "automotive.leda" + }, + { + "id": "automotive.uprotocol" + }, + { + "id": "iot.hono" + }, + { + "id": "iot.paho" + }, + { + "id": "iot.zenoh" + } ] -} +} \ No newline at end of file diff --git a/DEPENDENCIES b/DEPENDENCIES deleted file mode 100644 index 22b678a..0000000 --- a/DEPENDENCIES +++ /dev/null @@ -1,308 +0,0 @@ -crate/cratesio/-/aes/0.8.4, Apache-2.0 AND MIT AND Apache-2.0 AND MIT, approved, #4260 -crate/cratesio/-/ahash/0.8.8, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/aho-corasick/1.0.2, MIT AND Unlicense, approved, #9759 -crate/cratesio/-/allocator-api2/0.2.16, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/anstream/0.6.11, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/anstyle/1.0.1, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/anstyle-parse/0.2.1, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/anstyle-query/1.0.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/anyhow/1.0.72, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/array-init/2.1.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/arrayvec/0.7.4, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/async-attributes/1.1.2, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/async-channel/1.9.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/async-channel/2.2.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/async-executor/1.8.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/async-global-executor/2.4.1, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/async-io/1.13.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/async-io/2.3.1, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/async-lock/2.8.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/async-lock/3.3.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/async-process/1.8.1, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/async-signal/0.2.5, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/async-std/1.12.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/async-stream/0.3.5, MIT, approved, clearlydefined -crate/cratesio/-/async-stream-impl/0.3.5, MIT, approved, clearlydefined -crate/cratesio/-/async-task/4.7.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/async-trait/0.1.72, Apache-2.0 AND MIT AND Apache-2.0 AND MIT, approved, #6666 -crate/cratesio/-/atomic-waker/1.1.2, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/axum/0.6.19, MIT, approved, clearlydefined -crate/cratesio/-/axum/0.7.4, MIT, approved, clearlydefined -crate/cratesio/-/axum-core/0.3.4, MIT, approved, clearlydefined -crate/cratesio/-/axum-core/0.4.3, MIT, approved, clearlydefined -crate/cratesio/-/base64/0.21.7, Apache-2.0 AND MIT AND Apache-2.0 AND MIT, approved, #9764 -crate/cratesio/-/bitflags/1.3.2, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/bitflags/2.4.2, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/block-buffer/0.10.4, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/blocking/1.5.1, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/bytes/1.4.0, MIT, approved, clearlydefined -crate/cratesio/-/cache-padded/1.3.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/castaway/0.1.2, MIT, approved, clearlydefined -crate/cratesio/-/cfg-if/1.0.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/chrono/0.4.26, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/cipher/0.4.4, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/clap/4.5.0, Apache-2.0 AND MIT AND Apache-2.0 AND MIT, approved, #13275 -crate/cratesio/-/clap_builder/4.5.0, Apache-2.0 AND MIT AND Apache-2.0 AND MIT, approved, #13276 -crate/cratesio/-/clap_derive/4.5.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/clap_lex/0.7.0, Apache-2.0 AND MIT AND Apache-2.0 AND MIT, approved, #13279 -crate/cratesio/-/colorchoice/1.0.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/concurrent-queue/2.2.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/const_format/0.2.31, Zlib, approved, clearlydefined -crate/cratesio/-/const_format_proc_macros/0.2.31, Zlib, approved, clearlydefined -crate/cratesio/-/cpufeatures/0.2.12, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/crossbeam-channel/0.5.8, Apache-2.0 AND MIT AND Apache-2.0 AND MIT AND (Apache-2.0 AND BSD-3-Clause AND CC-BY-3.0 AND MIT), approved, #9756 -crate/cratesio/-/crossbeam-utils/0.8.16, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/crypto-common/0.1.6, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/csv/1.2.2, Unlicense OR MIT, approved, clearlydefined -crate/cratesio/-/csv-core/0.1.10, Unlicense OR MIT, approved, clearlydefined -crate/cratesio/-/curl/0.4.44, MIT AND curl, approved, #9765 -crate/cratesio/-/curl-sys/0.4.65+curl-8.2.1, MIT, approved, #9784 -crate/cratesio/-/digest/0.10.7, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/dirs/5.0.1, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/dirs-sys/0.4.1, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/duration-str/0.7.1, Apache-2.0, approved, clearlydefined -crate/cratesio/-/dyn-clone/1.0.16, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/either/1.9.0, Apache-2.0 AND MIT AND Apache-2.0 AND MIT, approved, #10050 -crate/cratesio/-/encoding_rs/0.8.32, Apache-2.0 AND BSD-3-Clause AND MIT AND Apache-2.0 AND (Apache-2.0 AND CC0-1.0 AND MIT) AND MIT AND BSD-3-Clause AND (Apache-2.0 AND BSD-3-Clause AND CC0-1.0 AND MIT) AND (Apache-2.0 AND MIT) AND CC0-1.0, approved, #9762 -crate/cratesio/-/env_filter/0.1.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/env_logger/0.10.2, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/env_logger/0.11.1, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/equivalent/1.0.1, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/event-listener/2.5.3, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/event-listener/3.1.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/event-listener/4.0.3, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/event-listener/5.0.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/event-listener-strategy/0.4.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/event-listener-strategy/0.5.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/fastrand/1.9.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/fastrand/2.0.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/fixedbitset/0.4.2, Apache-2.0 AND MIT AND Apache-2.0 AND MIT, approved, #4250 -crate/cratesio/-/flume/0.11.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/fnv/1.0.7, Apache-2.0 AND MIT, approved, clearlydefined -crate/cratesio/-/form_urlencoded/1.2.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/futures/0.3.28, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/futures-channel/0.3.28, Apache-2.0 AND MIT AND Apache-2.0 AND MIT AND BSD-2-Clause-Views, approved, #6671 -crate/cratesio/-/futures-core/0.3.28, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/futures-executor/0.3.28, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/futures-io/0.3.28, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/futures-lite/1.13.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/futures-lite/2.2.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/futures-macro/0.3.28, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/futures-sink/0.3.28, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/futures-task/0.3.28, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/futures-timer/3.0.2, Apache-2.0 AND MIT, approved, clearlydefined -crate/cratesio/-/futures-util/0.3.28, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/generic-array/0.14.7, MIT, approved, clearlydefined -crate/cratesio/-/getrandom/0.2.10, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/git-version/0.3.9, BSD-2-Clause, approved, clearlydefined -crate/cratesio/-/git-version-macro/0.3.9, BSD-2-Clause, approved, clearlydefined -crate/cratesio/-/h2/0.3.24, MIT, approved, clearlydefined -crate/cratesio/-/h2/0.4.1, MIT, approved, clearlydefined -crate/cratesio/-/hashbrown/0.12.3, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/hashbrown/0.13.2, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/hashbrown/0.14.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/heck/0.4.1, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/hex/0.4.3, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/hmac/0.12.1, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/home/0.5.9, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/http/0.2.9, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/http/1.0.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/httparse/1.8.0, Apache-2.0 AND MIT AND Apache-2.0 AND MIT, approved, #4256 -crate/cratesio/-/http-body/0.4.5, MIT, approved, clearlydefined -crate/cratesio/-/http-body/1.0.0, MIT, approved, clearlydefined -crate/cratesio/-/http-body-util/0.1.0, MIT, approved, clearlydefined -crate/cratesio/-/httpdate/1.0.2, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/humantime/2.1.0, Apache-2.0 OR (Apache-2.0 AND MIT), approved, clearlydefined -crate/cratesio/-/hyper/0.14.27, MIT, approved, clearlydefined -crate/cratesio/-/hyper/1.1.0, MIT, approved, clearlydefined -crate/cratesio/-/hyper-timeout/0.4.1, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/hyper-util/0.1.2, MIT, approved, clearlydefined -crate/cratesio/-/iana-time-zone/0.1.57, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/idna/0.4.0, Apache-2.0 AND MIT AND Unicode-TOU, approved, #9786 -crate/cratesio/-/indexmap/1.9.3, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/indexmap/2.0.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/influxrs/2.0.1, MIT, approved, clearlydefined -crate/cratesio/-/inout/0.1.3, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/io-lifetimes/1.0.11, Apache-2.0 AND MIT, approved, #10134 -crate/cratesio/-/ipnetwork/0.20.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/isahc/1.7.2, MIT AND CC-BY-4.0 AND MPL-2.0, approved, #9775 -crate/cratesio/-/is-terminal/0.4.12, MIT, approved, clearlydefined -crate/cratesio/-/itertools/0.10.5, Apache-2.0 AND MIT AND Apache-2.0 AND MIT, approved, #4247 -crate/cratesio/-/itoa/1.0.9, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/json5/0.4.1, ISC, approved, clearlydefined -crate/cratesio/-/keccak/0.1.5, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/keyed-set/0.4.5, EPL-2.0, approved, clearlydefined -crate/cratesio/-/kv-log-macro/1.0.7, Apache-2.0 AND MIT, approved, clearlydefined -crate/cratesio/-/lazy_static/1.4.0, Apache-2.0 AND MIT, approved, clearlydefined -crate/cratesio/-/libc/0.2.150, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/libloading/0.8.1, ISC, approved, clearlydefined -crate/cratesio/-/libnghttp2-sys/0.1.7+1.45.0, Apache-2.0 AND MIT AND Apache-2.0 AND MIT, approved, #9783 -crate/cratesio/-/libz-sys/1.1.12, Apache-2.0 AND BSL-1.0 AND MIT AND CC-BY-3.0 AND CC-BY-4.0 AND LicenseRef-Public-domain AND (GPL-2.0-or-later AND LicenseRef-scancode-ada-linking-exception) AND Info-ZIP AND NTP AND Zlib, approved, #9763 -crate/cratesio/-/linux-raw-sys/0.3.8, Apache-2.0 AND MIT, approved, #10128 -crate/cratesio/-/linux-raw-sys/0.4.13, Apache-2.0 AND MIT, approved, #9787 -crate/cratesio/-/lock_api/0.4.11, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/log/0.4.19, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/lz4_flex/0.11.2, MIT, approved, clearlydefined -crate/cratesio/-/matchit/0.7.0, MIT, approved, clearlydefined -crate/cratesio/-/memchr/2.5.0, Unlicense OR MIT, approved, clearlydefined -crate/cratesio/-/mime/0.3.17, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/minimal-lexical/0.2.1, Apache-2.0 AND MIT AND BSD-3-Clause AND (Apache-2.0 AND MIT) AND licenseRef-Public-Domain, approved, #9755 -crate/cratesio/-/mio/0.8.10, MIT, approved, #11387 -crate/cratesio/-/nanorand/0.7.0, Zlib AND (Apache-2.0 AND BSD-3-Clause), approved, #4265 -crate/cratesio/-/nom/7.1.3, MIT AND CC0-1.0, approved, #9761 -crate/cratesio/-/no-std-net/0.6.0, MIT, approved, clearlydefined -crate/cratesio/-/num_cpus/1.16.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/num_enum/0.5.11, BSD-3-Clause OR (MIT OR Apache-2.0), approved, clearlydefined -crate/cratesio/-/num_enum_derive/0.5.11, BSD-3-Clause OR (MIT OR Apache-2.0), approved, clearlydefined -crate/cratesio/-/num-traits/0.2.16, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/once_cell/1.18.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/openssl-probe/0.1.5, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/openssl-sys/0.9.95, MIT AND (Apache-2.0 AND MIT), approved, #9757 -crate/cratesio/-/option-ext/0.2.0, MPL-2.0, approved, clearlydefined -crate/cratesio/-/ordered-float/4.2.0, MIT, approved, clearlydefined -crate/cratesio/-/paho-mqtt/0.12.3, EPL-1.0 OR BSD-3-Clause, approved, #9785 -crate/cratesio/-/paho-mqtt-sys/0.9.0, , approved, #11611 -crate/cratesio/-/parking/2.2.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/paste/1.0.14, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/percent-encoding/2.3.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/pest/2.7.7, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/pest_derive/2.7.7, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/pest_generator/2.7.7, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/pest_meta/2.7.7, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/petgraph/0.6.3, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/pin-project/1.1.2, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/pin-project-internal/1.1.2, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/pin-project-lite/0.2.13, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/pin-utils/0.1.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/piper/0.2.1, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/pnet/0.34.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/pnet_base/0.34.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/pnet_datalink/0.34.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/pnet_macros/0.34.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/pnet_macros_support/0.34.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/pnet_packet/0.34.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/pnet_sys/0.34.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/pnet_transport/0.34.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/polling/2.8.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/polling/3.4.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/ppv-lite86/0.2.17, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/proc-macro2/1.0.78, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/proc-macro-crate/1.3.1, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/prost/0.12.1, Apache-2.0, approved, #10594 -crate/cratesio/-/prost-derive/0.12.1, Apache-2.0, approved, #11612 -crate/cratesio/-/prost-types/0.12.1, Apache-2.0 AND BSD-3-Clause, approved, #10593 -crate/cratesio/-/protobuf/3.3.0, MIT, approved, clearlydefined -crate/cratesio/-/protobuf-support/3.3.0, MIT, approved, clearlydefined -crate/cratesio/-/quote/1.0.32, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/rand/0.8.5, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/rand_chacha/0.3.1, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/rand_core/0.6.4, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/rdkafka/0.36.0, MIT, approved, clearlydefined -crate/cratesio/-/rdkafka-sys/4.7.0+2.3.0, MIT AND BSD-2-Clause AND Zlib AND BSD-3-Clause AND ISC AND Apache-2.0 and LicenseRef-MSVC-Runtime, approved, https://gitlab.eclipse.org/eclip -crate/cratesio/-/regex/1.9.1, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/regex-automata/0.3.3, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/regex-syntax/0.7.4, Apache-2.0 AND MIT AND Apache-2.0 AND MIT AND Unicode-DFS-2016, approved, #9758 -crate/cratesio/-/ring/0.17.7, ISC AND OpenSSL AND MIT AND (OpenSSL OR LicenseRef-Cryptogams) AND LicenseRef-Public-domain AND LicenseRef-SSLeay, approved, #11393 -crate/cratesio/-/ringbuffer-spsc/0.1.9, EPL-2.0, approved, #4242 -crate/cratesio/-/rustc_version/0.4.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/rust_decimal/1.30.0, MIT, approved, clearlydefined -crate/cratesio/-/rustix/0.37.27, Apache-2.0 AND MIT, approved, #10131 -crate/cratesio/-/rustix/0.38.28, Apache-2.0 AND MIT, approved, #10049 -crate/cratesio/-/rustls/0.22.2, Apache-2.0 OR (ISC OR MIT), approved, clearlydefined -crate/cratesio/-/rustls-pemfile/2.0.0, Apache-2.0 OR (ISC OR MIT), approved, clearlydefined -crate/cratesio/-/rustls-pki-types/1.2.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/rustls-webpki/0.102.2, ISC, approved, #13228 -crate/cratesio/-/ryu/1.0.15, Apache-2.0 AND BSL-1.0 AND CC-BY-SA-3.0, approved, #4267 -crate/cratesio/-/schemars/0.8.16, MIT, approved, clearlydefined -crate/cratesio/-/schemars_derive/0.8.16, MIT, approved, clearlydefined -crate/cratesio/-/scopeguard/1.2.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/secrecy/0.8.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/semver/1.0.21, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/serde/1.0.193, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/serde_derive/1.0.193, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/serde_derive_internals/0.26.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/serde_json/1.0.104, Apache-2.0 AND MIT, approved, #4264 -crate/cratesio/-/serde_path_to_error/0.1.14, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/serde_urlencoded/0.7.1, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/serde_yaml/0.9.29, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/sha3/0.10.8, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/shellexpand/3.1.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/signal-hook-registry/1.4.1, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/slab/0.4.8, MIT, approved, clearlydefined -crate/cratesio/-/sluice/0.5.5, MIT, approved, clearlydefined -crate/cratesio/-/socket2/0.4.9, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/socket2/0.5.5, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/spin/0.9.8, MIT AND (Apache-2.0 AND MIT), approved, #4257 -crate/cratesio/-/static_assertions/1.1.0, Apache-2.0 AND MIT, approved, clearlydefined -crate/cratesio/-/stop-token/0.7.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/strsim/0.11.0, MIT, approved, clearlydefined -crate/cratesio/-/subtle/2.5.0, BSD-3-Clause, approved, #13229 -crate/cratesio/-/syn/1.0.109, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/syn/2.0.43, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/sync_wrapper/0.1.2, Apache-2.0, approved, clearlydefined -crate/cratesio/-/termcolor/1.4.1, Unlicense OR MIT, approved, clearlydefined -crate/cratesio/-/thiserror/1.0.44, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/thiserror-impl/1.0.44, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/time/0.3.23, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/time-core/0.1.1, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/tinyvec/1.6.0, Zlib OR (Apache-2.0 OR MIT), approved, clearlydefined -crate/cratesio/-/tinyvec_macros/0.1.1, MIT OR (Apache-2.0 OR Zlib), approved, clearlydefined -crate/cratesio/-/token-cell/1.5.0, EPL-2.0, approved, clearlydefined -crate/cratesio/-/tokio/1.36.0, MIT, approved, clearlydefined -crate/cratesio/-/tokio-io-timeout/1.2.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/tokio-macros/2.2.0, MIT, approved, clearlydefined -crate/cratesio/-/tokio-rustls/0.25.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/tokio-stream/0.1.14, MIT, approved, clearlydefined -crate/cratesio/-/tokio-util/0.7.8, MIT, approved, #11389 -crate/cratesio/-/toml_datetime/0.6.3, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/toml_edit/0.19.14, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/tonic/0.11.0, MIT AND Apache-2.0, approved, #13227 -crate/cratesio/-/tower/0.4.13, MIT AND Apache-2.0, approved, #6661 -crate/cratesio/-/tower-layer/0.3.2, MIT, approved, clearlydefined -crate/cratesio/-/tower-service/0.3.2, MIT, approved, clearlydefined -crate/cratesio/-/tracing/0.1.37, MIT, approved, clearlydefined -crate/cratesio/-/tracing-attributes/0.1.26, MIT, approved, clearlydefined -crate/cratesio/-/tracing-core/0.1.31, MIT, approved, clearlydefined -crate/cratesio/-/tracing-futures/0.2.5, MIT, approved, clearlydefined -crate/cratesio/-/try-lock/0.2.4, MIT, approved, clearlydefined -crate/cratesio/-/twox-hash/1.6.3, MIT, approved, clearlydefined -crate/cratesio/-/typenum/1.17.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/ucd-trie/0.1.6, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/uhlc/0.6.3, EPL-2.0 OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/unicode-bidi/0.3.13, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/unicode-ident/1.0.11, Apache-2.0 AND MIT AND LicenseRef-unicode, approved, #4138 -crate/cratesio/-/unicode-normalization/0.1.22, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/unicode-xid/0.2.4, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/unsafe-libyaml/0.2.10, MIT, approved, clearlydefined -crate/cratesio/-/untrusted/0.9.0, ISC AND (ISC AND MIT), approved, #7111 -crate/cratesio/-/unzip-n/0.1.2, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/url/2.4.0, MIT OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/utf8parse/0.2.1, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/uuid/1.7.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/validated_struct/2.1.0, EPL-2.0, approved, clearlydefined -crate/cratesio/-/validated_struct_macros/2.1.0, EPL-2.0, approved, clearlydefined -crate/cratesio/-/value-bag/1.7.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/vec_map/0.8.2, Apache-2.0 AND MIT, approved, clearlydefined -crate/cratesio/-/waker-fn/1.1.0, Apache-2.0 OR MIT, approved, clearlydefined -crate/cratesio/-/want/0.3.1, MIT, approved, clearlydefined -crate/cratesio/-/winnow/0.5.1, MIT, approved, #9760 -crate/cratesio/-/zenoh/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/zenoh-buffers/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/zenoh-codec/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/zenoh-collections/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/zenoh-config/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/zenoh-core/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/zenoh-crypto/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/zenoh-keyexpr/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/zenoh-link/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/zenoh-link-commons/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/zenoh-link-tcp/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/zenoh-macros/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/zenoh-plugin-trait/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/zenoh-protocol/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/zenoh-result/0.10.1-rc, Apache-2.0 AND EPL-2.0 AND (EPL-2.0 OR Apache-2.0), approved, #13278 -crate/cratesio/-/zenoh-sync/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/zenoh-transport/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/zenoh-util/0.10.1-rc, EPL-2.0 OR Apache-2.0, approved, clearlydefined -crate/cratesio/-/zerocopy/0.7.32, Apache-2.0 AND BSD-3-Clause AND MIT AND (Apache-2.0 AND BSD-2-Clause AND MIT) AND (Apache-2.0 AND BSD-2-Clause AND BSD-3-Clause AND MIT) AND Apache-2.0 AND BSD-2-Clause AND MIT AND (Apache-2.0 AND MIT) AND BSD-3-Clause, approved, #13277 -crate/cratesio/-/zeroize/1.7.0, Apache-2.0 OR MIT, approved, clearlydefined diff --git a/README.md b/README.md index 2bde456..fdc22c2 100644 --- a/README.md +++ b/README.md @@ -29,24 +29,28 @@ for truck fleet management where trucks run an SDV software stack so that logist manage apps, data and services for a diverse set of vehicles. The use case illustrates how the standard VSS model can be customized and used to report data from a vehicle -to a back end. The following diagram provides an overview of the current architecture: +to a back end. It also shows how [Eclipse uProtocol™](https://eclipse-uprotocol.github.io) can be used +to connect in-vehicle components to an off-vehicle service in the back end. The following diagram provides +an overview of the current architecture: - + The overall idea is to enable back end applications to consume data coming from a vehicle using the rFMS API. Data originates from the vehicle's sensors which are represented by a CSV file that is being played back by the -kuksa.val CSV feeder. The CSV feeder publishes the data to the kuksa.val Databroker. From there, the FMS Forwarder -consumes the data and writes it to an InfluxDB in the back end. The measurements in the InfluxDB can then be -visualized in a web browser by means of a Grafana dashboard. Alternatively, the measurements can be retrieved by -a Fleet Management application via the FMS Server's (HTTP based) rFMS API. +[Eclipse Kuksa™ CSV Provider](https://github.com/eclipse-kuksa/kuksa-csv-provider). The *CSV Provider* publishes +the data to the [Kuksa Databroker](https://github.com/eclipse-kuksa/kuksa-databroker). +The *FMS Forwarder* reads the signal values from the Databroker and sends them to the *FMS Consumer* in the back end +using uProtocol _Notifications_. The FMS Consumer then writes the measurements to an *InfluxDB* from where it +can be visualized in a web browser by means of a *Grafana* dashboard. Alternatively, the measurements can be +retrieved by a Fleet Management application via the *FMS Server's* (HTTP based) rFMS API. # Quick Start The easiest way to set up and start the services is by means of using the Docker Compose file in the top level folder: ```sh -docker compose -f ./fms-blueprint-compose.yaml up --detach +docker compose -f ./fms-blueprint-compose.yaml -f ./fms-blueprint-compose-zenoh.yaml up --detach ``` This will pull or build (if necessary) the container images and create and start all components. @@ -61,17 +65,21 @@ The rFMS API can be used to retrieve the data, e.g. curl -v -s http://127.0.0.1:8081/rfms/vehicleposition?latestOnly=true | jq ``` -# Using Eclipse Hono to send Vehicle Data to Back End +# Eclipse Zenoh™ Transport + +By default, the Docker Compose files start the _FMS Forwarder_ and _FMS Consumer_ using a [Zenoh](https://zenoh.io) based uProtocol transport. -By default, the Docker Compose file starts the FMS Forwarder configured to write vehicle data directly to the -Influx DB running in the back end. + -However, in a real world scenario, this tight coupling between the vehicle and the Influx DB is not desirable. -As an alternative, the blueprint supports configuring the FMS Forwarder to send vehicle data to the MQTT adapter -of an Eclipse Hono instance as shown in the diagram below. +# Eclipse Hono™ based Transport + +The blueprint can also be configured to use a Hono based uProtocol transport that employs Hono's MQTT adapter +and Apache Kafka™ based messaging infrastructure for sending vehicle data to the Consumer. +In order to run the blueprint with the Hono transport, perform the following steps: + 1. Register the vehicle as a device in Hono using the [create-config-hono.sh shell script](./create-config-hono.sh): ```sh @@ -95,26 +103,6 @@ of an Eclipse Hono instance as shown in the diagram below. The path set via the `--env-file` option needs to be adapted to the output folder specified in the previous step. - The second compose file specified on the command line will also start the [FMS Consumer](./components/fms-consumer) - back end component which receives vehicle data via Hono's north bound Kafka based Telemetry API and writes it to the - Influx DB. - -# Using Eclipse Zenoh to geographically distribute the vehicle data - -The blueprint supports configuring the FMS Forwarder to send vehicle data to the Eclipse Zenoh router of an [Eclipse Zenoh](https://zenoh.io/) instance as shown in the diagram below. -Zenoh router provides a plugin mechanism to other protocols to enable the Vehicle to anything communication. - - - -Start up the vehicle and back end services using Docker Compose: - -```sh -docker compose -f ./fms-blueprint-compose.yaml -f ./fms-blueprint-compose-zenoh.yaml up --detach -``` - -Once all services have been started, the current vehicle status can be viewed on a [Grafana dashboard](http://127.0.0.1:3000), -using *admin*/*admin* as username and password for logging in. - # Manual configuration All information required for setting up the networks, volumes, configs and containers is contained in the @@ -125,5 +113,6 @@ Additional information can be found in the components' corresponding subfolders. # Contributing -We are looking forward to your ideas and PRs. Each PRs triggers a GitHub action which checks the formating, performs linting and runs the test. You can performe similar check in your development environment. For more details check the respective [action](.github/workflows/lint_source_code.yaml) where the checks are listed in the bottom of the file. - +We are looking forward to your ideas and PRs. Each PRs triggers a GitHub action which checks the formating, performs +linting and runs the test. You can performe similar check in your development environment. For more details check the +respective [action](.github/workflows/lint_source_code.yaml) where the checks are listed in the bottom of the file. diff --git a/components/Cargo.lock b/components/Cargo.lock index d33640a..4191b7f 100644 --- a/components/Cargo.lock +++ b/components/Cargo.lock @@ -4,18 +4,18 @@ version = 3 [[package]] name = "addr2line" -version = "0.20.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aes" @@ -43,18 +43,18 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.0.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "allocator-api2" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "android-tzdata" @@ -73,50 +73,51 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.11" +version = "0.6.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" +checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.1" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" +checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56" [[package]] name = "anstyle-parse" -version = "0.2.1" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -133,9 +134,48 @@ checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc" [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "asn1-rs" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5493c3bedbacf7fd7382c6346bbd66687d12bbaad3a89a2d2c303ee6cf20b048" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] [[package]] name = "async-channel" @@ -156,7 +196,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -167,21 +207,21 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.1.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" -version = "0.7.4" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" +checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae" dependencies = [ "async-trait", "axum-core", "bytes", "futures-util", - "http 1.0.0", + "http 1.1.0", "http-body", "http-body-util", "hyper", @@ -197,9 +237,9 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 1.0.1", "tokio", - "tower", + "tower 0.5.1", "tower-layer", "tower-service", "tracing", @@ -207,20 +247,20 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" dependencies = [ "async-trait", "bytes", "futures-util", - "http 1.0.0", + "http 1.1.0", "http-body", "http-body-util", "mime", "pin-project-lite", "rustversion", - "sync_wrapper", + "sync_wrapper 1.0.1", "tower-layer", "tower-service", "tracing", @@ -228,17 +268,17 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.68" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -253,6 +293,12 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + [[package]] name = "bitflags" version = "1.3.2" @@ -261,9 +307,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" dependencies = [ "serde", ] @@ -279,9 +325,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.13.0" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byteorder" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" @@ -303,30 +355,42 @@ checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6" [[package]] name = "cc" -version = "1.0.83" +version = "1.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" dependencies = [ - "libc", + "shlex", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chrono" -version = "0.4.26" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", "serde", - "winapi", + "windows-targets 0.52.6", ] [[package]] @@ -341,18 +405,19 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.0" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80c21025abd42669a92efc996ef13cfb2c5c627858421ea58d5c3b331a6c134f" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" dependencies = [ "clap_builder", + "clap_derive", ] [[package]] name = "clap_builder" -version = "4.5.0" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "458bf1f341769dfcf849846f65dffdf9146daa56bcd2a47cb4e1de9915567c99" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ "anstream", "anstyle", @@ -360,26 +425,48 @@ dependencies = [ "strsim", ] +[[package]] +name = "clap_derive" +version = "4.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.85", +] + [[package]] name = "clap_lex" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "cmake" -version = "0.1.50" +version = "0.1.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a" dependencies = [ "cc", ] [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] [[package]] name = "concurrent-queue" @@ -390,6 +477,12 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + [[package]] name = "const_format" version = "0.2.33" @@ -410,28 +503,37 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ - "cfg-if", "crossbeam-utils", ] @@ -474,24 +576,24 @@ dependencies = [ [[package]] name = "curl" -version = "0.4.44" +version = "0.4.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "509bd11746c7ac09ebd19f0b17782eae80aadee26237658a6b4808afb5c11a22" +checksum = "d9fb4d13a1be2b58f14d60adba57c9834b78c62fd86c3e76a148f732686e9265" dependencies = [ "curl-sys", "libc", "openssl-probe", "openssl-sys", "schannel", - "socket2 0.4.9", - "winapi", + "socket2", + "windows-sys 0.52.0", ] [[package]] name = "curl-sys" -version = "0.4.65+curl-8.2.1" +version = "0.4.77+curl-8.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "961ba061c9ef2fe34bbd12b807152d96f0badd2bebe7b90ce6c8c8b7572a0986" +checksum = "f469e8a5991f277a208224f6c7ad72ecb5f986e36d09ae1f2c1bb9259478a480" dependencies = [ "cc", "libc", @@ -500,7 +602,47 @@ dependencies = [ "openssl-sys", "pkg-config", "vcpkg", - "winapi", + "windows-sys 0.52.0", +] + +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "der-parser" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cd0a5c643689626bec213c4d8bd4d96acc8ffdb4ad4bb6bc16abf27d5f4b553" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", ] [[package]] @@ -510,6 +652,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", "subtle", ] @@ -535,6 +678,17 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + [[package]] name = "duration-str" version = "0.7.1" @@ -549,39 +703,39 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" [[package]] name = "either" -version = "1.9.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "encoding_rs" -version = "0.8.32" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] [[package]] name = "env_filter" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" +checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" dependencies = [ "log", ] [[package]] name = "env_logger" -version = "0.11.1" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05e7cf40684ae96ade6232ed84582f40ce0a66efcd43a5117aef610534f8e0b8" +checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" dependencies = [ "env_filter", "humantime", @@ -596,9 +750,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", "windows-sys 0.52.0", @@ -632,9 +786,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "fixedbitset" @@ -644,9 +798,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flume" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" dependencies = [ "futures-core", "futures-sink", @@ -660,17 +814,15 @@ version = "0.1.0-SNAPSHOT" dependencies = [ "async-trait", "clap", - "duration-str", "env_logger", "fms-proto", - "futures", + "fms-util", "influx-client", "log", - "openssl-src", - "protobuf", - "rdkafka", "tokio", - "zenoh", + "up-rust", + "up-transport-hono-kafka", + "up-transport-zenoh", ] [[package]] @@ -683,9 +835,9 @@ dependencies = [ "duration-str", "env_logger", "fms-proto", + "fms-util", "influx-client", "log", - "paho-mqtt", "prost", "prost-types", "protobuf", @@ -693,7 +845,9 @@ dependencies = [ "tokio", "tonic", "tonic-build", - "zenoh", + "up-rust", + "up-transport-hono-mqtt", + "up-transport-zenoh", ] [[package]] @@ -723,6 +877,15 @@ dependencies = [ "tokio", ] +[[package]] +name = "fms-util" +version = "0.1.0-SNAPSHOT" +dependencies = [ + "clap", + "log", + "zenoh", +] + [[package]] name = "fnv" version = "1.0.7" @@ -731,9 +894,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -809,7 +972,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -826,9 +989,9 @@ checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-timer" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" @@ -860,9 +1023,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", @@ -873,9 +1036,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.27.3" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "git-version" @@ -894,7 +1057,7 @@ checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -908,7 +1071,7 @@ dependencies = [ "fnv", "futures-core", "futures-sink", - "http 1.0.0", + "http 1.1.0", "indexmap 2.6.0", "slab", "tokio", @@ -940,9 +1103,9 @@ checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" @@ -970,9 +1133,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", @@ -981,9 +1144,9 @@ dependencies = [ [[package]] name = "http" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ "bytes", "fnv", @@ -992,38 +1155,38 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.0.0", + "http 1.1.0", ] [[package]] name = "http-body-util" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.0.0", + "http 1.1.0", "http-body", "pin-project-lite", ] [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" @@ -1041,7 +1204,7 @@ dependencies = [ "futures-channel", "futures-util", "h2", - "http 1.0.0", + "http 1.1.0", "http-body", "httparse", "httpdate", @@ -1074,11 +1237,11 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.0.0", + "http 1.1.0", "http-body", "hyper", "pin-project-lite", - "socket2 0.5.7", + "socket2", "tokio", "tower-service", "tracing", @@ -1086,16 +1249,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.57" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows", + "windows-core", ] [[package]] @@ -1109,9 +1272,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -1172,9 +1335,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] @@ -1188,6 +1351,12 @@ dependencies = [ "serde", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "isahc" version = "1.7.2" @@ -1202,7 +1371,7 @@ dependencies = [ "encoding_rs", "event-listener 2.5.3", "futures-lite", - "http 0.2.9", + "http 0.2.12", "log", "mime", "once_cell", @@ -1217,33 +1386,44 @@ dependencies = [ [[package]] name = "itertools" -version = "0.10.5" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ "either", ] [[package]] -name = "itertools" -version = "0.13.0" +name = "itoa" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "jni" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" dependencies = [ - "either", + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", ] [[package]] -name = "itoa" -version = "1.0.9" +name = "jni-sys" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -1282,6 +1462,9 @@ name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] [[package]] name = "libc" @@ -1291,19 +1474,25 @@ checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libloading" -version = "0.8.1" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-sys 0.48.0", + "windows-targets 0.52.6", ] +[[package]] +name = "libm" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + [[package]] name = "libnghttp2-sys" -version = "0.1.7+1.45.0" +version = "0.1.10+1.61.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57ed28aba195b38d5ff02b9170cbff627e336a20925e43b4945390401c5dc93f" +checksum = "959c25552127d2e1fa72f0e52548ec04fc386e827ba71a7bd01db46a447dc135" dependencies = [ "cc", "libc", @@ -1311,20 +1500,19 @@ dependencies = [ [[package]] name = "libredox" -version = "0.0.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "libc", - "redox_syscall 0.4.1", ] [[package]] name = "libz-sys" -version = "1.1.12" +version = "1.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b" +checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" dependencies = [ "cc", "libc", @@ -1334,15 +1522,15 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -1350,15 +1538,15 @@ dependencies = [ [[package]] name = "log" -version = "0.4.19" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lz4_flex" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "912b45c753ff5f7f5208307e8ace7d2a2e30d024e26d3509f3dce546c044ce15" +checksum = "75761162ae2b0e580d7e7c390558127e5f01b4194debd6221fd8c207fc80e3f5" dependencies = [ "twox-hash", ] @@ -1374,15 +1562,21 @@ dependencies = [ [[package]] name = "matchit" -version = "0.7.0" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "mediatype" +version = "0.19.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" +checksum = "8878cd8d1b3c8c8ae4b2ba0a36652b7cf192f618a599a7fbdfa25cffd4ea72dd" [[package]] name = "memchr" -version = "2.5.0" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mime" @@ -1398,11 +1592,11 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ - "adler", + "adler2", ] [[package]] @@ -1419,9 +1613,9 @@ dependencies = [ [[package]] name = "multimap" -version = "0.8.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" +checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" [[package]] name = "nanorand" @@ -1432,6 +1626,18 @@ dependencies = [ "getrandom", ] +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "cfg_aliases", + "libc", +] + [[package]] name = "no-std-net" version = "0.6.0" @@ -1458,13 +1664,67 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" -version = "0.2.16" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -1500,13 +1760,22 @@ dependencies = [ [[package]] name = "object" -version = "0.31.1" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] +[[package]] +name = "oid-registry" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d8034d9489cdaf79228eb9f6a3b8d7bb32ba00d6645ebd48eef4077ceb5bd9" +dependencies = [ + "asn1-rs", +] + [[package]] name = "once_cell" version = "1.20.2" @@ -1521,18 +1790,18 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "300.1.6+3.1.4" +version = "300.4.0+3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439fac53e092cd7442a3660c85dde4643ab3b5bd39040912388dcdabf6b88085" +checksum = "a709e02f2b4aca747929cca5ed248880847c650233cf8b8cdc48f40aaf4898a6" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.95" +version = "0.9.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a4130519a360279579c2053038317e40eff64d13fd3f004f9e1b72b8a6aaf9" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", @@ -1547,6 +1816,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[package]] +name = "outref" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a" + [[package]] name = "overload" version = "0.1.1" @@ -1555,9 +1830,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "paho-mqtt" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e405de34b835fb6457d8b0169eda21949f855472b3e346556af9e29fac6eb2" +checksum = "b8367868d51cef74c28da328ed8f60529ddd3f04dca1867dd825fcc3085a4308" dependencies = [ "async-channel", "crossbeam-channel", @@ -1581,9 +1856,9 @@ dependencies = [ [[package]] name = "parking" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "paste" @@ -1592,16 +1867,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] -name = "percent-encoding" -version = "2.3.0" +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.7" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219c0dcc30b6a27553f9cc242972b67f75b60eb0db71f0b5462f38b058c41546" +checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" dependencies = [ "memchr", "thiserror", @@ -1610,9 +1894,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.7" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e1288dbd7786462961e69bfd4df7848c1e37e8b74303dbdab82c3a9cdd2809" +checksum = "d214365f632b123a47fd913301e14c946c61d1c183ee245fa76eb752e59a02dd" dependencies = [ "pest", "pest_generator", @@ -1620,22 +1904,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.7" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1381c29a877c6d34b8c176e734f35d7f7f5b3adaefe940cb4d1bb7af94678e2e" +checksum = "eb55586734301717aea2ac313f50b2eb8f60d2fc3dc01d190eefa2e625f60c4e" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] name = "pest_meta" -version = "2.7.7" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0934d6907f148c22a3acbda520c7eed243ad7487a30f51f6ce52b58b7077a8a" +checksum = "b75da2a70cf4d9cb76833c990ac9cd3923c9a8905a8929789ce347c84564d03d" dependencies = [ "once_cell", "pest", @@ -1682,7 +1966,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -1696,29 +1980,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.2" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.2" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -1726,11 +2010,32 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "pnet_base" @@ -1780,20 +2085,29 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "prettyplease" -version = "0.2.12" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62" +checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -1808,9 +2122,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.88" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -1833,7 +2147,7 @@ checksum = "0c1318b19085f08681016926435853bbf7858f9c082d0999b80550ff5d9abe15" dependencies = [ "bytes", "heck", - "itertools 0.10.5", + "itertools", "log", "multimap", "once_cell", @@ -1842,7 +2156,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.79", + "syn 2.0.85", "tempfile", ] @@ -1853,10 +2167,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9552f850d5f0964a4e4d0bf306459ac29323ddfbae05e35a7c0d35cb0803cc5" dependencies = [ "anyhow", - "itertools 0.10.5", + "itertools", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -1870,10 +2184,11 @@ dependencies = [ [[package]] name = "protobuf" -version = "3.6.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3018844a02746180074f621e847703737d27d89d7f0721a7a4da317f88b16385" +checksum = "a3a7c64d9bf75b1b8d981124c14c179074e8caa7dfe7b6a12e6222ddcd0c8f72" dependencies = [ + "bytes", "once_cell", "protobuf-support", "thiserror", @@ -1881,9 +2196,9 @@ dependencies = [ [[package]] name = "protobuf-codegen" -version = "3.6.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411c15a212b4de05eb8bc989fd066a74c86bd3c04e27d6e86bd7703b806d7734" +checksum = "e26b833f144769a30e04b1db0146b2aaa53fd2fd83acf10a6b5f996606c18144" dependencies = [ "anyhow", "once_cell", @@ -1896,9 +2211,9 @@ dependencies = [ [[package]] name = "protobuf-parse" -version = "3.6.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06f45f16b522d92336e839b5e40680095a045e36a1e7f742ba682ddc85236772" +checksum = "322330e133eab455718444b4e033ebfac7c6528972c784fcde28d2cc783c6257" dependencies = [ "anyhow", "indexmap 2.6.0", @@ -1912,62 +2227,119 @@ dependencies = [ [[package]] name = "protobuf-support" -version = "3.6.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf96d872914fcda2b66d66ea3fff2be7c66865d31c7bb2790cff32c0e714880" +checksum = "b088fd20b938a875ea00843b6faf48579462630015c3788d397ad6a786663252" dependencies = [ "thiserror", ] [[package]] name = "protoc-bin-vendored" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "005ca8623e5633e298ad1f917d8be0a44bcf406bf3cde3b80e63003e49a3f27d" +checksum = "dd89a830d0eab2502c81a9b8226d446a52998bb78e5e33cb2637c0cdd6068d99" dependencies = [ "protoc-bin-vendored-linux-aarch_64", "protoc-bin-vendored-linux-ppcle_64", "protoc-bin-vendored-linux-x86_32", "protoc-bin-vendored-linux-x86_64", + "protoc-bin-vendored-macos-aarch_64", "protoc-bin-vendored-macos-x86_64", "protoc-bin-vendored-win32", ] [[package]] name = "protoc-bin-vendored-linux-aarch_64" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fb9fc9cce84c8694b6ea01cc6296617b288b703719b725b8c9c65f7c5874435" +checksum = "f563627339f1653ea1453dfbcb4398a7369b768925eb14499457aeaa45afe22c" [[package]] name = "protoc-bin-vendored-linux-ppcle_64" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d2a07dcf7173a04d49974930ccbfb7fd4d74df30ecfc8762cf2f895a094516" +checksum = "5025c949a02cd3b60c02501dd0f348c16e8fff464f2a7f27db8a9732c608b746" [[package]] name = "protoc-bin-vendored-linux-x86_32" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54fef0b04fcacba64d1d80eed74a20356d96847da8497a59b0a0a436c9165b0" +checksum = "9c9500ce67d132c2f3b572504088712db715755eb9adf69d55641caa2cb68a07" [[package]] name = "protoc-bin-vendored-linux-x86_64" -version = "3.0.0" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5462592380cefdc9f1f14635bcce70ba9c91c1c2464c7feb2ce564726614cc41" + +[[package]] +name = "protoc-bin-vendored-macos-aarch_64" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8782f2ce7d43a9a5c74ea4936f001e9e8442205c244f7a3d4286bd4c37bc924" +checksum = "c637745681b68b4435484543667a37606c95ddacf15e917710801a0877506030" [[package]] name = "protoc-bin-vendored-macos-x86_64" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5de656c7ee83f08e0ae5b81792ccfdc1d04e7876b1d9a38e6876a9e09e02537" +checksum = "38943f3c90319d522f94a6dfd4a134ba5e36148b9506d2d9723a82ebc57c8b55" [[package]] name = "protoc-bin-vendored-win32" -version = "3.0.0" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dc55d7dec32ecaf61e0bd90b3d2392d721a28b95cfd23c3e176eccefbeab2f2" + +[[package]] +name = "quinn" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +dependencies = [ + "bytes", + "rand", + "ring", + "rustc-hash", + "rustls", + "rustls-platform-verifier", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9653c3ed92974e34c5a6e0a510864dab979760481714c172e0a34e437cb98804" +checksum = "e346e016eacfff12233c243718197ca12f148c84e1e84268a896699b41c71780" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.59.0", +] [[package]] name = "quote" @@ -2010,9 +2382,9 @@ dependencies = [ [[package]] name = "rdkafka" -version = "0.36.0" +version = "0.36.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54f02a5a40220f8a2dfa47ddb38ba9064475a5807a69504b6f91711df2eea63" +checksum = "1beea247b9a7600a81d4cc33f659ce1a77e1988323d7d2809c7ed1c21f4c316d" dependencies = [ "futures-channel", "futures-util", @@ -2040,29 +2412,11 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_users" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", @@ -2071,14 +2425,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.9.1" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.3.3", - "regex-syntax 0.7.4", + "regex-automata 0.4.8", + "regex-syntax 0.8.5", ] [[package]] @@ -2092,13 +2446,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.3" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.4", + "regex-syntax 0.8.5", ] [[package]] @@ -2109,22 +2463,23 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "ring" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", + "cfg-if", "getrandom", "libc", "spin", "untrusted", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -2144,16 +2499,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" dependencies = [ "base64 0.21.7", - "bitflags 2.4.2", + "bitflags 2.6.0", "serde", "serde_derive", ] +[[package]] +name = "rsa" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core", + "signature", + "spki", + "subtle", + "zeroize", +] + [[package]] name = "rust_decimal" -version = "1.30.0" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0446843641c69436765a35a5a77088e28c2e6a12da93e84aa3ab1cd4aa5a042" +checksum = "b082d80e3e3cc52b2ed634388d436fe1f4de6af5786cc2de9ba9737527bdf555" dependencies = [ "arrayvec", "num-traits", @@ -2161,9 +2536,15 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" [[package]] name = "rustc_version" @@ -2174,13 +2555,22 @@ dependencies = [ "semver", ] +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + [[package]] name = "rustix" -version = "0.38.28" +version = "0.38.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +checksum = "aa260229e6538e52293eeb577aabd09945a09d6d9cc0fc550ed7529056c2e32a" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", @@ -2189,9 +2579,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.7" +version = "0.23.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebbbdb961df0ad3f2652da8f3fdc4b36122f568f968f45ad3316f26c025c677b" +checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" dependencies = [ "log", "once_cell", @@ -2202,27 +2592,66 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-native-certs" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "rustls-pki-types", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pemfile" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e4980fa29e4c4b212ffb3db068a564cbf560e51d3944b7c88bd8bf5bec64f4" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.21.7", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.2.0" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" + +[[package]] +name = "rustls-platform-verifier" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afbb878bdfdf63a336a5e63561b1835e7a8c91524f51621db870169eac84b490" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-roots", + "winapi", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a716eb65e3158e90e17cd93d855216e27bde02745ab842f2cab4a39dba1bacf" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.102.2" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "ring", "rustls-pki-types", @@ -2231,23 +2660,32 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "same-file" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -2272,7 +2710,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -2291,30 +2729,54 @@ dependencies = [ "zeroize", ] +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "core-foundation-sys", + "libc", + "num-bigint", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "semver" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.210" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -2325,7 +2787,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -2342,9 +2804,9 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.14" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335" +checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" dependencies = [ "itoa", "serde", @@ -2375,6 +2837,17 @@ dependencies = [ "unsafe-libyaml", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha2" version = "0.10.8" @@ -2414,6 +2887,22 @@ dependencies = [ "dirs", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + [[package]] name = "siphasher" version = "0.3.11" @@ -2422,9 +2911,9 @@ checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] @@ -2446,16 +2935,6 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" -[[package]] -name = "socket2" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "socket2" version = "0.5.7" @@ -2475,6 +2954,16 @@ dependencies = [ "lock_api", ] +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "static_assertions" version = "1.1.0" @@ -2483,15 +2972,15 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strsim" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -2506,9 +2995,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.79" +version = "2.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" dependencies = [ "proc-macro2", "quote", @@ -2521,37 +3010,54 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + [[package]] name = "tempfile" -version = "3.7.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", - "fastrand 2.0.0", - "redox_syscall 0.3.5", + "fastrand 2.1.1", + "once_cell", "rustix", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] name = "thiserror" -version = "1.0.44" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" +checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.44" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" +checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -2566,25 +3072,40 @@ dependencies = [ [[package]] name = "time" -version = "0.3.23" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", "serde", "time-core", + "time-macros", ] [[package]] name = "time-core" -version = "0.1.1" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -2595,6 +3116,19 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "tls-listener" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f1d8809f604e448c7bc53a5a0e4c2a0a20ba44cb1fb407314c8eeccb92127f9" +dependencies = [ + "futures-util", + "pin-project-lite", + "thiserror", + "tokio", + "tokio-rustls", +] + [[package]] name = "token-cell" version = "1.5.0" @@ -2606,16 +3140,16 @@ dependencies = [ [[package]] name = "tokio" -version = "1.40.0" +version = "1.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" dependencies = [ "backtrace", "bytes", "libc", "mio", "pin-project-lite", - "socket2 0.5.7", + "socket2", "tokio-macros", "windows-sys 0.52.0", ] @@ -2628,7 +3162,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -2653,6 +3187,18 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite", +] + [[package]] name = "tokio-util" version = "0.7.12" @@ -2670,15 +3216,15 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" [[package]] name = "toml_edit" -version = "0.19.14" +version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap 2.6.0", "toml_datetime", @@ -2694,7 +3240,7 @@ dependencies = [ "async-trait", "base64 0.22.1", "bytes", - "http 1.0.0", + "http 1.1.0", "http-body", "http-body-util", "hyper", @@ -2707,7 +3253,7 @@ dependencies = [ "tokio", "tokio-rustls", "tokio-stream", - "tower", + "tower 0.4.13", "tower-layer", "tower-service", "tracing", @@ -2724,7 +3270,7 @@ dependencies = [ "prost-build", "prost-types", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] @@ -2748,24 +3294,39 @@ dependencies = [ ] [[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - -[[package]] -name = "tower-service" -version = "0.3.2" +name = "tower" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] +checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 0.1.2", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", "log", "pin-project-lite", "tracing-attributes", @@ -2774,20 +3335,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", "valuable", @@ -2847,9 +3408,27 @@ dependencies = [ [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http 1.1.0", + "httparse", + "log", + "rand", + "sha1", + "thiserror", + "utf-8", +] [[package]] name = "twox-hash" @@ -2869,9 +3448,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "uhlc" @@ -2889,30 +3468,30 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[package]] name = "unicode-xid" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "unsafe-libyaml" @@ -2937,22 +3516,131 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "up-rust" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30118ab07c7ca420e2196bbc0f6f380b3100928d03ec1cd960f9220472f48f1a" +dependencies = [ + "async-trait", + "bytes", + "mediatype", + "protobuf", + "protobuf-codegen", + "protoc-bin-vendored", + "rand", + "thiserror", + "tokio", + "tracing", + "uriparse", + "uuid-simd", +] + +[[package]] +name = "up-transport-hono-kafka" +version = "0.1.0-SNAPSHOT" +dependencies = [ + "async-trait", + "clap", + "fms-proto", + "futures", + "log", + "openssl-src", + "protobuf", + "rdkafka", + "tokio", + "up-rust", +] + +[[package]] +name = "up-transport-hono-mqtt" +version = "0.1.0-SNAPSHOT" +dependencies = [ + "async-trait", + "clap", + "log", + "paho-mqtt", + "protobuf", + "up-rust", + "url_encor", +] + +[[package]] +name = "up-transport-zenoh" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dba40062ff410f59a9a34a51a9288c8ad92454e4199725264f4f9eaeb604fd9" +dependencies = [ + "anyhow", + "async-trait", + "bytes", + "lazy_static", + "protobuf", + "serde_json", + "tokio", + "tracing", + "tracing-subscriber", + "up-rust", + "zenoh", +] + +[[package]] +name = "uriparse" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0200d0fc04d809396c2ad43f3c95da3582a2556eba8d453c1087f4120ee352ff" +dependencies = [ + "fnv", + "lazy_static", +] + [[package]] name = "url" -version = "2.4.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] +[[package]] +name = "url_encor" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "203f80ff045bd3adaefe8914354d2515c1a2900065baa5f8467bdbeaf03855b4" + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +dependencies = [ + "getrandom", +] + +[[package]] +name = "uuid-simd" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "23b082222b4f6619906941c17eb2297fff4c2fb96cb60164170522942a200bd8" +dependencies = [ + "outref", + "vsimd", +] [[package]] name = "validated_struct" @@ -2998,15 +3686,31 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vsimd" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" [[package]] name = "waker-fn" -version = "1.1.0" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" + +[[package]] +name = "walkdir" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] [[package]] name = "want" @@ -3025,34 +3729,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3060,32 +3765,42 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" + +[[package]] +name = "webpki-roots" +version = "0.26.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" +dependencies = [ + "rustls-pki-types", +] [[package]] name = "which" -version = "4.4.0" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" dependencies = [ "either", - "libc", + "home", "once_cell", + "rustix", ] [[package]] @@ -3104,6 +3819,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -3111,12 +3835,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows" -version = "0.48.0" +name = "windows-core" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.48.1", + "windows-targets 0.52.6", ] [[package]] @@ -3125,7 +3849,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.1", + "windows-targets 0.48.5", ] [[package]] @@ -3134,137 +3858,170 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", ] [[package]] name = "windows-targets" -version = "0.48.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.5.1" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25b5872fa2e10bd067ae946f927e726d7d603eaeb6e02fa6a350e0722d2b8c11" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" dependencies = [ "memchr", ] +[[package]] +name = "x509-parser" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcbc162f30700d6f3f82a24bf7cc62ffe7caea42c0b2cba8bf7f3ae50cf51f69" +dependencies = [ + "asn1-rs", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "rusticata-macros", + "thiserror", + "time", +] + [[package]] name = "zenoh" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0de579d53e8fe630cc147874e7545b4171148817786f65f43c4a2f09c1fcc45" +checksum = "b28b1ce69136eba7567e5ea5c9f37aa0c7cced2673bdc3c1dd7c3c1a2ecb0d21" dependencies = [ "ahash", "async-trait", @@ -3272,7 +4029,7 @@ dependencies = [ "flume", "futures", "git-version", - "itertools 0.13.0", + "itertools", "json5", "lazy_static", "once_cell", @@ -3283,7 +4040,7 @@ dependencies = [ "rustc_version", "serde", "serde_json", - "socket2 0.5.7", + "socket2", "tokio", "tokio-util", "tracing", @@ -3309,18 +4066,18 @@ dependencies = [ [[package]] name = "zenoh-buffers" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11cdd89e36fb6a885fe2bda464cde3c23b1b14fce1637e7290585fcc14eb92f1" +checksum = "592504c9854fbc781b9a389cd7225b5878b8dd0cb9a12f15546c8d4eeba9a802" dependencies = [ "zenoh-collections", ] [[package]] name = "zenoh-codec" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d5d83b5f868c72b2e79930e547834a92642efcf2e15d17ace837e7439f62196" +checksum = "bfb0ce6e9104408c6a23e100a69b16b8e5713f904e061b14ac994fef8df6baba" dependencies = [ "tracing", "uhlc", @@ -3330,15 +4087,15 @@ dependencies = [ [[package]] name = "zenoh-collections" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2976e0975b54f532bbcf67a0c34a9813b4643b75f5831c3aaf8cde36b48a80c2" +checksum = "ccb27c67033ffda0171506658802fda8dc22e62bcb094b49be86c04f84d8bdab" [[package]] name = "zenoh-config" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "810ff6f9a1a093a89dd3d44f0c666cb260d0015fd6c71c32b3cfb45535d49ae4" +checksum = "15d3ddf489ec055bc7498d66f6bb2cce8278314fbadb40aa34a37bc0125f494f" dependencies = [ "json5", "num_cpus", @@ -3358,9 +4115,9 @@ dependencies = [ [[package]] name = "zenoh-core" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c4950b4bf1cefe5259403bf92dc09b4bf4171283ecdd7c27a43c188aafa6943" +checksum = "0f3d36d0b828f429cfba005519de8941319a4ca3e0b21c7ede3cf8812e1e5518" dependencies = [ "lazy_static", "tokio", @@ -3370,9 +4127,9 @@ dependencies = [ [[package]] name = "zenoh-crypto" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "875d7984eb64470d6eed4a440a5440fd5f72d98f805e8d07e7bb3afdd30c3b4e" +checksum = "2f82ea1bb77132325e7fae5d698cfa5dddd4d6e46e94fc73409e31e65a557d7d" dependencies = [ "aes", "hmac", @@ -3384,9 +4141,9 @@ dependencies = [ [[package]] name = "zenoh-keyexpr" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38078470eb391e5bc41f7814314dba640a7c3eee9ed38d8a42537ce60966929" +checksum = "9adcce6a97d03855e2f2e7e5fafb9659d65c47eebc4dc6049ded397874ff634e" dependencies = [ "hashbrown 0.14.5", "keyed-set", @@ -3399,26 +4156,33 @@ dependencies = [ [[package]] name = "zenoh-link" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "400b03dd126673da54c926f6475346b647d9267655a7c3f8af1726c06f8a5bce" +checksum = "73741cc9d89411d9b9e969cbad3a6e494684f3a79e200caebdad62beb3cb13fe" dependencies = [ "zenoh-config", "zenoh-link-commons", + "zenoh-link-quic", "zenoh-link-tcp", + "zenoh-link-tls", + "zenoh-link-udp", + "zenoh-link-unixsock_stream", + "zenoh-link-ws", "zenoh-protocol", "zenoh-result", ] [[package]] name = "zenoh-link-commons" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94d153eee94f66174f66df0f606ce961c261f5324388158bfea9c90a63f0a529" +checksum = "6c74d63df6a0dda46f207699fafea4b832151b288451ce58eab7a56c8a07694d" dependencies = [ "async-trait", "flume", "futures", + "rustls", + "rustls-webpki", "serde", "tokio", "tokio-util", @@ -3432,14 +4196,40 @@ dependencies = [ "zenoh-util", ] +[[package]] +name = "zenoh-link-quic" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9727ec46732859c14717fba67977ef94b866510e714db1270c2f56e19bd80dad" +dependencies = [ + "async-trait", + "base64 0.22.1", + "quinn", + "rustls", + "rustls-pemfile", + "rustls-pki-types", + "rustls-webpki", + "secrecy", + "tokio", + "tokio-util", + "tracing", + "webpki-roots", + "x509-parser", + "zenoh-config", + "zenoh-core", + "zenoh-link-commons", + "zenoh-protocol", + "zenoh-result", +] + [[package]] name = "zenoh-link-tcp" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55521483edbefeda81056f7a4492a5d4065cea4db6ce94f025a856d4e40cd651" +checksum = "394d7bd1a098ef102f58b13305f88ce1ffba007c6fe1df2c6d9c4bb350fcb5cb" dependencies = [ "async-trait", - "socket2 0.5.7", + "socket2", "tokio", "tokio-util", "tracing", @@ -3450,23 +4240,112 @@ dependencies = [ "zenoh-util", ] +[[package]] +name = "zenoh-link-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9521f53cf61a41b654e976d33cfddb2e94dc0289ecba4cfa39bfb843824f767" +dependencies = [ + "async-trait", + "base64 0.22.1", + "rustls", + "rustls-pemfile", + "rustls-pki-types", + "rustls-webpki", + "secrecy", + "socket2", + "tls-listener", + "tokio", + "tokio-rustls", + "tokio-util", + "tracing", + "webpki-roots", + "x509-parser", + "zenoh-config", + "zenoh-core", + "zenoh-link-commons", + "zenoh-protocol", + "zenoh-result", + "zenoh-runtime", +] + +[[package]] +name = "zenoh-link-udp" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bd6e9814f1f0f7db6e02f8d196106e356e55e2d5814d1bc8f211910e6fb1459" +dependencies = [ + "async-trait", + "socket2", + "tokio", + "tokio-util", + "tracing", + "zenoh-buffers", + "zenoh-core", + "zenoh-link-commons", + "zenoh-protocol", + "zenoh-result", + "zenoh-sync", + "zenoh-util", +] + +[[package]] +name = "zenoh-link-unixsock_stream" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef73ad8357bf0c42abdb057686200bfd6c3fb4646ed07c13f6c18b363f1a0b6" +dependencies = [ + "async-trait", + "nix", + "tokio", + "tokio-util", + "tracing", + "uuid", + "zenoh-core", + "zenoh-link-commons", + "zenoh-protocol", + "zenoh-result", + "zenoh-runtime", +] + +[[package]] +name = "zenoh-link-ws" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f178df5cff946bc8ef81015df8d3106d19b027e9aff11db8aa2eee1a802cc05" +dependencies = [ + "async-trait", + "futures-util", + "tokio", + "tokio-tungstenite", + "tokio-util", + "tracing", + "url", + "zenoh-core", + "zenoh-link-commons", + "zenoh-protocol", + "zenoh-result", + "zenoh-runtime", + "zenoh-util", +] + [[package]] name = "zenoh-macros" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d6be8dbd09d0bcd1eb304efac37dfa253a0cc2731d83aa76e11741fa0938fd" +checksum = "528dc367e8de7e84d35d37d21998cf9a45360b0f8bffb4f9e5135bed45fd347f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", "zenoh-keyexpr", ] [[package]] name = "zenoh-plugin-trait" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8e1bbb750e7509248c180f4441bac25b922c37e9ef1cf6ab1086718bef12d33" +checksum = "a24cfd2508d900adad7c88617541b8d4a2ad581c15c307db798b6362554642fe" dependencies = [ "git-version", "libloading", @@ -3481,9 +4360,9 @@ dependencies = [ [[package]] name = "zenoh-protocol" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde920503f0775a477f5055513c9c9a80ca5676eb5fe027b392553086113ecab" +checksum = "c342042f4e7ed51718803f48ce49d9dc2e1a8060f1ed7f94c21e781c01dac9d9" dependencies = [ "const_format", "rand", @@ -3496,18 +4375,18 @@ dependencies = [ [[package]] name = "zenoh-result" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb1ee98a8286b5a7329dec08456d1f91b68d129281f79937b140efc18d4cc90" +checksum = "05f79737b88aafb33bbb0ea83821c9048e20702f3de7cce8822adac25f100aa7" dependencies = [ "anyhow", ] [[package]] name = "zenoh-runtime" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d5a76c1582fb5ab73680c70c8f813a0942fb242f55b4eb0c57dcf63cbf03c0d" +checksum = "30608ef77db6ba23df63901e3359299875474ff812c3d678b0101c88892cd3de" dependencies = [ "lazy_static", "ron", @@ -3519,9 +4398,9 @@ dependencies = [ [[package]] name = "zenoh-sync" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f0b184bc719f1cbc4534e50cff3577e0862eb809eee30fc9a1c8d31f52f7b8" +checksum = "ef62536159fcfb7eb51d22b69894d884abea5ce0bf6241cc2c3f9880f486060b" dependencies = [ "event-listener 5.3.1", "futures", @@ -3533,9 +4412,9 @@ dependencies = [ [[package]] name = "zenoh-task" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53671cbca63413e79f0b85ce44a2321cbb264ced93a7c7be583e152502bba6bc" +checksum = "06d0efd5f0f70acc408a9bddeac526f91c85e2e42dc2c0d7c29a72bc9e26d6ca" dependencies = [ "futures", "tokio", @@ -3547,9 +4426,9 @@ dependencies = [ [[package]] name = "zenoh-transport" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4b580c3b5193230ca63225bb73bd291fe0aab0ede829aee6662550cc8433e2" +checksum = "3bc2a24c34c01775bd0601043dcd75de245eb3af35ce8eff96e0d9126e019812" dependencies = [ "async-trait", "crossbeam-utils", @@ -3559,6 +4438,7 @@ dependencies = [ "paste", "rand", "ringbuffer-spsc", + "rsa", "serde", "sha3", "tokio", @@ -3580,9 +4460,9 @@ dependencies = [ [[package]] name = "zenoh-util" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26ad6f214b19cf52e6da3e4ffafc8f68213de852c49eea0c62db57c234a49bee" +checksum = "afe24db564df9094e521441b556bfc73f359ae5d7b537a0b03257387404f561d" dependencies = [ "async-trait", "const_format", @@ -3606,26 +4486,27 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.85", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/components/Cargo.toml b/components/Cargo.toml index 0b83165..f8acdf0 100644 --- a/components/Cargo.toml +++ b/components/Cargo.toml @@ -18,7 +18,15 @@ # SPDX-License-Identifier: Apache-2.0 [workspace] -members = ["fms-consumer", "fms-forwarder", "fms-server", "influx-client"] +members = [ + "fms-consumer", + "fms-forwarder", + "fms-server", + "fms-util", + "influx-client", + "up-transport-hono-kafka", + "up-transport-hono-mqtt", +] resolver = "2" [workspace.package] @@ -31,13 +39,14 @@ documentation = "https://eclipse-sdv-blueprints.github.io/blueprints-website/" [workspace.dependencies] async-trait = { version = "0.1" } +bytes = { version = "1.7" } chrono = { version = "0.4", default-features = false } clap = { version = "4.4", default-features = false } -duration-str = { version = "0.7", default-features = false } env_logger = { version = "0.11", default-features = false, features = [ "humantime", ] } fms-proto = { path = "fms-proto" } +fms-util = { path = "fms-util" } influx-client = { path = "influx-client", default-features = false } influxrs = { version = "3.0.1", default-features = false } log = { version = "0.4" } @@ -50,6 +59,10 @@ prost = { version = "0.12" } prost-types = { version = "0.12" } # tokio does not enable features by default tokio = { version = "1.39" } +up-rust = { version = "0.3.0", default-features = false } +up-transport-hono-kafka = { path = "up-transport-hono-kafka" } +up-transport-hono-mqtt = { path = "up-transport-hono-mqtt" } +up-transport-zenoh = { version = "0.4.0" } zenoh = { version = "1.0.0", default-features = false } [profile.release] diff --git a/components/DEPS.txt b/components/DEPS.txt new file mode 100644 index 0000000..e69de29 diff --git a/components/fms-consumer/Cargo.toml b/components/fms-consumer/Cargo.toml index 71a17a3..44021f6 100644 --- a/components/fms-consumer/Cargo.toml +++ b/components/fms-consumer/Cargo.toml @@ -33,6 +33,7 @@ readme.workspace = true async-trait = { workspace = true } clap = { workspace = true, features = [ "std", + "derive", "env", "color", "help", @@ -40,22 +41,12 @@ clap = { workspace = true, features = [ "error-context", "suggestions", ] } -duration-str = { workspace = true } env_logger = { workspace = true } fms-proto = { workspace = true } -futures = { version = "0.3" } +fms-util = { workspace = true } influx-client = { workspace = true, features = ["writer"] } -rdkafka = { version = "0.36", default-features = false, features = [ - "libz", - "tokio", - "cmake-build", - "ssl-vendored", -] } log = { workspace = true } -protobuf = { workspace = true } -tokio = { workspace = true, features = ["macros", "rt-multi-thread", "time"] } -zenoh = { workspace = true, features = ["transport_tcp"] } - -[build-dependencies] -# see https://github.com/fede1024/rust-rdkafka/issues/572#issuecomment-1529316876 -openssl-src = { version = "300", features = ["force-engine"] } +tokio = { workspace = true, features = ["macros", "rt-multi-thread"] } +up-rust = { workspace = true } +up-transport-hono-kafka = { workspace = true } +up-transport-zenoh = { workspace = true } diff --git a/components/fms-consumer/src/main.rs b/components/fms-consumer/src/main.rs index 8292297..aac0e83 100644 --- a/components/fms-consumer/src/main.rs +++ b/components/fms-consumer/src/main.rs @@ -17,312 +17,99 @@ // // SPDX-License-Identifier: Apache-2.0 -use std::collections::HashMap; -use std::fs::File; -use std::io::{self, BufRead, BufReader}; -use std::process; +use std::str::FromStr; use std::sync::Arc; +use std::thread; -use clap::{Arg, ArgAction, ArgMatches, Command}; +use clap::{Parser, Subcommand}; use fms_proto::fms::VehicleStatus; -use futures::TryStreamExt; +use fms_util::ZenohTransportConfig; +use influx_client::connection::InfluxConnectionConfig; use influx_client::writer::InfluxWriter; -use log::{debug, error, info, trace}; +use log::info; -use rdkafka::config::RDKafkaLogLevel; -use rdkafka::consumer::stream_consumer::StreamConsumer; -use rdkafka::consumer::Consumer; -use rdkafka::message::{BorrowedHeaders, BorrowedMessage, Headers}; -use rdkafka::{ClientConfig, Message}; +use up_rust::{UListener, UMessage, UTransport, UUri}; +use up_transport_hono_kafka::{HonoKafkaTransport, HonoKafkaTransportConfig}; +use up_transport_zenoh::UPTransportZenoh; -use zenoh::Config; - -const CONTENT_TYPE_PROTOBUF: &str = "application/vnd.google.protobuf"; - -const HEADER_NAME_ORIG_ADDRESS: &str = "orig_address"; - -const PARAM_KAFKA_PROPERTIES_FILE: &str = "kafka-properties-file"; -const PARAM_KAFKA_TOPIC_NAME: &str = "kafka-topic"; - -const SUBCOMMAND_HONO: &str = "hono"; -const SUBCOMMAND_ZENOH: &str = "zenoh"; - -const KEY_EXPR: &str = "fms/vehicleStatus"; - -fn parse_zenoh_args(args: &ArgMatches) -> Result> { - if let Some(conf_file) = args.get_one::("config") { - Config::from_file(conf_file) - } else { - Ok(Config::default()) - } -} - -fn add_property_bag_to_map(property_bag: String, headers: &mut HashMap) { - property_bag.split('&').for_each(|p| { - trace!("processing property: {p}"); - if let Some((key, value)) = p.split_once('=') { - if headers.contains_key(key) { - trace!("skipping property [{key}] from property bag because header with same name exists"); - } else { - trace!("adding propery [key: {key}, value: {value}] to header map"); - headers.insert(key.to_string(), value.to_string()); - } - } - }); -} - -fn get_headers_as_map(headers: &BorrowedHeaders) -> HashMap { - let mut result = HashMap::new(); - headers.iter().for_each(|header| { - match ( - header.key, - header - .value - .and_then(|v| String::from_utf8(v.to_vec()).ok()), - ) { - (HEADER_NAME_ORIG_ADDRESS, Some(value)) => { - if let Some((_topic, props)) = value.rsplit_once("/?") { - debug!("found property bag in {HEADER_NAME_ORIG_ADDRESS} header: {props}"); - add_property_bag_to_map(props.to_string(), &mut result); - } - } - (_, Some(value)) => { - result.insert(header.key.to_string(), value); - } - (_, None) => { - debug!("message contains empty header [{}]", header.key); - } - }; - }); - - result +struct VehicleStatusListener { + influx_writer: InfluxWriter, } -fn read_lines(filename: &String) -> Result>, Box> { - // Open the file in read-only mode. - match File::open(filename) { - Ok(file) => { - // Read the file line by line, and return an iterator of the lines of the file. - Ok(io::BufReader::new(file).lines()) +#[async_trait::async_trait] +impl UListener for VehicleStatusListener { + async fn on_receive(&self, msg: UMessage) { + if let Ok(vehicle_status) = msg.extract_protobuf::() { + self.influx_writer + .write_vehicle_status(&vehicle_status) + .await; + } else { + info!("ignoring event with invalid/unknown payload"); } - Err(e) => Err(Box::new(e)), } } -fn get_kafka_client_config(filename: &String) -> Result> { - read_lines(filename).map(|lines| { - let mut client_config = ClientConfig::new(); - for line in lines { - match line { - Ok(property) => match property.split_once('=') { - Some((key, value)) => { - client_config.set(key, value); - } - None => { - debug!("cannot parse line into property: {}", property); - } - }, - Err(e) => { - debug!("cannot read line from file: {e}"); - } - } - } - client_config - }) -} +/// Receives FMS related VSS data points via Hono's Kafka based Telemetry API or Eclipse Zenoh instance +/// and writes them to an InfluxDB server. +#[derive(Parser)] +#[command(version, about, long_about = None, arg_required_else_help = true)] +struct FmsConsumerCommand { + /// The topic URI pattern to use for consuming vehicle status events. + #[arg(long = "topic-filter", value_name = "URI", env = "TOPIC_FILTER", default_value = "up://*/D100/1/D100", value_parser = up_rust::UUri::from_str )] + vehicle_status_topic_filter: UUri, -fn deserialize_vehicle_status(protobuf: &[u8]) -> Option { - use protobuf::Message; + /// The local uService address. + #[arg(long = "uservice-uri", value_name = "URI", env = "USERVICE_URI", default_value = "up://fms-consumer/D101/1/0", value_parser = up_rust::UUri::from_str )] + local_uservice_uri: UUri, - match VehicleStatus::parse_from_bytes(protobuf) { - Ok(vehicle_status) => { - trace!("successfully deserialized VehicleStatus from protobuf"); - Some(vehicle_status) - } - Err(e) => { - debug!("failed to deserialize VehicleStatus from protobuf: {}", e); - None - } - } -} + #[command(flatten)] + influxdb_connection: InfluxConnectionConfig, -async fn process_protobuf_message( - message_properties: HashMap, - payload: &[u8], - influx_writer: Arc, -) { - match message_properties.get("device_id") { - Some(device_id) => { - debug!("received message from vehicle {}", device_id); - if let Some(vehicle_status) = deserialize_vehicle_status(payload) { - influx_writer.write_vehicle_status(&vehicle_status).await; - } - } - None => debug!("discarding message from unknown device"), - } + #[command(subcommand)] + transport: TransportType, } -async fn process_zenoh_message(payload: &[u8], influx_writer: Arc) { - if let Some(vehicle_status) = deserialize_vehicle_status(payload) { - influx_writer.write_vehicle_status(&vehicle_status).await; - } else { - debug!("ignoring message without payload"); - } -} +#[derive(Subcommand)] +#[command(subcommand_required = true)] +enum TransportType { + /// Consumes VSS data using the Eclipse Hono/Kafka based uProtocol transport. + #[command(name = "hono")] + Hono(HonoKafkaTransportConfig), -async fn process_hono_message(m: &BorrowedMessage<'_>, influx_writer: Arc) { - if let Some(headers) = m.headers() { - let message_properties = get_headers_as_map(headers); - match ( - message_properties.get("content-type").map(String::as_str), - m.payload(), - ) { - (Some(CONTENT_TYPE_PROTOBUF), Some(payload)) => { - debug!("received protobuf message"); - process_protobuf_message(message_properties, payload, influx_writer).await - } - (_, None) => debug!("ignoring message without payload"), - _ => {} - } - } else { - debug!("ignoring message without headers"); - } -} - -async fn run_async_processor_hono(args: &ArgMatches) -> Result<(), Box> { - let influx_writer = InfluxWriter::new(args).map(Arc::new)?; - - let hono_args = args.subcommand_matches(SUBCOMMAND_HONO).unwrap(); - let mut client_config = get_kafka_client_config( - hono_args - .get_one::(PARAM_KAFKA_PROPERTIES_FILE) - .unwrap(), - )?; - - // Create the `StreamConsumer`, to receive the messages from the topic in form of a `Stream`. - let consumer: StreamConsumer = client_config - .set_log_level(RDKafkaLogLevel::Debug) - .create()?; - - let topic_name = hono_args.get_one::(PARAM_KAFKA_TOPIC_NAME).unwrap(); - - consumer.subscribe(&[topic_name.as_str()])?; - info!("successfully subscribed to topic {topic_name}"); - info!("starting message consumer"); - consumer - .stream() - .try_for_each(|borrowed_message| { - let cloned_writer = influx_writer.clone(); - async move { - process_hono_message(&borrowed_message, cloned_writer).await; - Ok(()) - } - }) - .await?; - Ok(()) -} - -async fn run_async_processor_zenoh(args: &ArgMatches) -> Result<(), Box> { - let influx_writer = InfluxWriter::new(args).map(Arc::new)?; - let zenoh_args = args.subcommand_matches(SUBCOMMAND_ZENOH).unwrap(); - let config = parse_zenoh_args(zenoh_args) - .map_err(|e| Box::::from(e.to_string()))?; - - info!("Opening session..."); - let session = zenoh::open(config) - .await - .map_err(|e| Box::::from(e.to_string()))?; - - info!("Declaring Subscriber on '{}'...", &KEY_EXPR); - let subscriber = session - .declare_subscriber(KEY_EXPR) - .await - .map_err(|e| Box::::from(e.to_string()))?; - while let Ok(sample) = subscriber.recv_async().await { - let cloned_writer = influx_writer.clone(); - let payload = sample.payload().to_bytes(); - process_zenoh_message(&payload, cloned_writer).await; - } - Ok(()) + /// Consumes VSS data using the Eclipse Zenoh based uProtocol transport. + #[command(name = "zenoh")] + Zenoh(ZenohTransportConfig), } #[tokio::main] -pub async fn main() { +pub async fn main() -> Result<(), Box> { env_logger::init(); - let version = option_env!("VERGEN_GIT_SEMVER_LIGHTWEIGHT") - .unwrap_or(option_env!("VERGEN_GIT_SHA").unwrap_or("unknown")); - - let mut parser = Command::new("FMS data consumer") - .arg_required_else_help(true) - .version(version) - .about("Receives FMS related VSS data points via Hono's Kafka based Telemetry API or Eclipse Zenoh instance and writes them to an InfluxDB server"); - - parser = influx_client::connection::add_command_line_args(parser); + let command = FmsConsumerCommand::parse(); - parser = parser - .subcommand_required(true) - .subcommand( - Command::new(SUBCOMMAND_HONO) - .about("Forwards VSS data to an Influx DB server from Hono's north bound Kafka API") - .arg( - Arg::new(PARAM_KAFKA_PROPERTIES_FILE) - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long(PARAM_KAFKA_PROPERTIES_FILE) - .help("The path to a file containing Kafka client properties for connecting to the Kafka broker(s).") - .action(ArgAction::Set) - .value_name("PATH") - .env("KAFKA_PROPERTIES_FILE") - .required(true), - ) - .arg( - Arg::new(PARAM_KAFKA_TOPIC_NAME) - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long(PARAM_KAFKA_TOPIC_NAME) - .alias("topic") - .help("The name of the Kafka topic to consume VSS data from.") - .value_name("TOPIC") - .required(true) - .env("KAFKA_TOPIC_NAME"), - ), - ) - .subcommand( - Command::new(SUBCOMMAND_ZENOH) - .about("Forwards VSS data to an Influx DB server from Eclipse Zenoh") - .arg( - Arg::new("config") - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long("config") - .short('c') - .help("A configuration file.") - .required(false), - ), - ); - - let args = parser.get_matches(); - - match args.subcommand_name() { - Some(SUBCOMMAND_HONO) => { - info!("starting FMS data consumer for Hono"); - if let Err(e) = run_async_processor_hono(&args).await { - error!("failed to start Hono processor: {e}"); - process::exit(1); - } - } - Some(SUBCOMMAND_ZENOH) => { - info!("starting FMS data consumer for Zenoh"); - if let Err(e) = run_async_processor_zenoh(&args).await { - error!("failed to start Zenoh processor: {e}"); - process::exit(1); - } - } - Some(_) => { - // cannot happen because subcommand is required - process::exit(1); - } - None => { - // cannot happen because subcommand is required - process::exit(1); + let transport: Arc = match command.transport { + TransportType::Hono(config) => HonoKafkaTransport::new(config).map(Arc::new)?, + TransportType::Zenoh(config) => { + let config = config.try_into()?; + UPTransportZenoh::new(config, command.local_uservice_uri) + .await + .map(Arc::new)? } }; + + let influx_writer = InfluxWriter::new(&command.influxdb_connection)?; + let listener = Arc::new(VehicleStatusListener { influx_writer }); + info!( + "Registering listener for vehicle status events [source filter: {}]", + &command.vehicle_status_topic_filter.to_uri(false) + ); + transport + .register_listener(&command.vehicle_status_topic_filter, None, listener) + .await + .map_err(Box::new)?; + // do not let the Notifier that we use to receive and process + // Vehicle status notifications go out of scope + thread::park(); + + Ok(()) } diff --git a/components/fms-forwarder/Cargo.toml b/components/fms-forwarder/Cargo.toml index 33b66c8..41c491e 100644 --- a/components/fms-forwarder/Cargo.toml +++ b/components/fms-forwarder/Cargo.toml @@ -34,6 +34,7 @@ async-trait = { workspace = true } chrono = { workspace = true, features = ["std"] } clap = { workspace = true, features = [ "std", + "derive", "env", "color", "help", @@ -41,14 +42,14 @@ clap = { workspace = true, features = [ "error-context", "suggestions", ] } -duration-str = { workspace = true, features = ["time"] } +duration-str = { version = "0.7", default-features = false, features = [ + "time", +] } env_logger = { workspace = true } fms-proto = { workspace = true } +fms-util = { workspace = true } influx-client = { workspace = true, features = ["writer"] } log = { workspace = true } -paho-mqtt = { version = "0.12", default-features = false, features = [ - "vendored-ssl", -] } protobuf = { workspace = true } prost = { version = "0.13" } prost-types = { version = "0.13" } @@ -59,7 +60,9 @@ tonic = { version = "0.12.3", default-features = false, features = [ "tls", "prost", ] } -zenoh = { workspace = true, features = ["transport_tcp"] } +up-rust = { workspace = true, features = ["communication"] } +up-transport-hono-mqtt = { workspace = true } +up-transport-zenoh = { workspace = true } [build-dependencies] protoc-bin-vendored = { workspace = true } diff --git a/components/fms-forwarder/src/hono_publisher.rs b/components/fms-forwarder/src/hono_publisher.rs deleted file mode 100644 index 1ad936a..0000000 --- a/components/fms-forwarder/src/hono_publisher.rs +++ /dev/null @@ -1,92 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Contributors to the Eclipse Foundation -// -// See the NOTICE file(s) distributed with this work for additional -// information regarding copyright ownership. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// SPDX-License-Identifier: Apache-2.0 - -use async_trait::async_trait; -use clap::{ArgMatches, Command}; -use fms_proto::fms::VehicleStatus; -use log::{debug, warn}; -use mqtt::MessageBuilder; -use paho_mqtt as mqtt; -use protobuf::Message; - -use crate::{ - mqtt_connection::{self, MqttConnection}, - status_publishing::StatusPublisher, -}; - -const TOPIC_TELEMETRY: &str = "telemetry/?content-type=application%2Fvnd.google.protobuf"; - -/// Adds arguments to an existing command line which can be -/// used to configure the connection to a Hono MQTT protocol adapter. -/// -/// See [`mqtt_connection::add_command_line_args`] -/// -pub fn add_command_line_args(command: Command) -> Command { - mqtt_connection::add_command_line_args(command) -} - -pub struct HonoPublisher { - mqtt_connection: MqttConnection, -} - -impl HonoPublisher { - /// Creates a new publisher. - /// - /// Determines the parameters necessary for creating the publisher from values specified on - /// the command line or via environment variables as defined by [`add_command_line_args`]. - /// - /// The publisher returned is configured to keep trying to (re-)connect to the configured - /// MQTT endpoint using a client certificate of username/password credentials. - pub async fn new(args: &ArgMatches) -> Result> { - MqttConnection::new(args).await.map(|con| HonoPublisher { - mqtt_connection: con, - }) - } -} - -#[async_trait] -impl StatusPublisher for HonoPublisher { - async fn publish_vehicle_status(&self, vehicle_status: &VehicleStatus) { - match vehicle_status.write_to_bytes() { - Ok(payload) => { - let msg = MessageBuilder::new() - .topic(TOPIC_TELEMETRY) - .payload(payload) - .finalize(); - match self.mqtt_connection.mqtt_client.publish(msg).await { - Ok(_t) => debug!( - "successfully published vehicle status to MQTT endpoint [uri: {}, topic: {}]", - self.mqtt_connection.uri, TOPIC_TELEMETRY - ), - Err(e) => { - warn!( - "error publishing vehicle status to MQTT endpoint [uri: {}, topic: {}]: {}", - self.mqtt_connection.uri, TOPIC_TELEMETRY, e - ); - } - }; - return; - } - Err(e) => warn!( - "error serializing vehicle status to protobuf message: {}", - e - ), - } - } -} diff --git a/components/fms-forwarder/src/main.rs b/components/fms-forwarder/src/main.rs index b734227..25f8d90 100644 --- a/components/fms-forwarder/src/main.rs +++ b/components/fms-forwarder/src/main.rs @@ -17,103 +17,90 @@ // // SPDX-License-Identifier: Apache-2.0 -use std::process; +use std::{str::FromStr, sync::Arc}; -use clap::Command; +use clap::{Parser, Subcommand}; use fms_proto::fms::VehicleStatus; -use hono_publisher::HonoPublisher; -use influx_client::writer::InfluxWriter; -use log::{error, info}; -use status_publishing::StatusPublisher; +use fms_util::ZenohTransportConfig; +use log::{info, warn}; use tokio::sync::mpsc; -use zenoh_publisher::ZenohPublisher; +use up_rust::{ + communication::{CallOptions, Publisher, SimplePublisher, UPayload}, + LocalUriProvider, StaticUriProvider, UTransport, UUri, +}; +use up_transport_hono_mqtt::{HonoMqttTransport, HonoMqttTransportConfig}; +use up_transport_zenoh::UPTransportZenoh; -mod hono_publisher; -mod mqtt_connection; -mod status_publishing; mod vehicle_abstraction; -mod zenoh_publisher; -const SUBCOMMAND_HONO: &str = "hono"; -const SUBCOMMAND_INFLUX: &str = "influx"; -const SUBCOMMAND_ZENOH: &str = "zenoh"; +/// Forwards FMS related VSS data points to a back end system using uProtocol. +#[derive(Parser)] +#[command(version, about, long_about = None, arg_required_else_help = true)] +struct FmsForwarderCommand { + /// The topic to publish vehicle status events to. + #[arg(long = "topic", value_name = "URI", env = "TOPIC", default_value = "up://fms-forwarder/D100/1/D100", value_parser = up_rust::UUri::from_str )] + vehicle_status_topic: UUri, + + #[command(flatten)] + databroker_connection: vehicle_abstraction::KuksaDatabrokerClientConfig, + + #[command(subcommand)] + transport: TransportType, +} + +#[derive(Subcommand)] +#[command(subcommand_required = true)] +enum TransportType { + /// Forwards VSS data via Eclipse uProtocol using Eclipse Hono based transport. + #[command(name = "hono")] + Hono(HonoMqttTransportConfig), + + /// Forwards VSS data via Eclipse uProtocol using Eclipse Zenoh based transport. + #[command(name = "zenoh")] + Zenoh(ZenohTransportConfig), +} #[tokio::main] async fn main() -> Result<(), Box> { env_logger::init(); - let version = option_env!("VERGEN_GIT_SEMVER_LIGHTWEIGHT") - .unwrap_or(option_env!("VERGEN_GIT_SHA").unwrap_or("unknown")); + let command = FmsForwarderCommand::parse(); + let uri_provider = StaticUriProvider::try_from(&command.vehicle_status_topic).map(Arc::new)?; - let mut parser = Command::new("fms-forwarder") - .arg_required_else_help(true) - .version(version) - .about("Forwards FMS related VSS data points to a back end system"); - parser = vehicle_abstraction::add_command_line_args(parser); - parser = parser - .subcommand_required(true) - .subcommand(hono_publisher::add_command_line_args( - Command::new(SUBCOMMAND_HONO).about("Forwards VSS data to Hono's MQTT adapter"), - )) - .subcommand(influx_client::connection::add_command_line_args( - Command::new(SUBCOMMAND_INFLUX).about("Forwards VSS data to an Influx DB server"), - )) - .subcommand(zenoh_publisher::add_command_line_args( - Command::new(SUBCOMMAND_ZENOH).about("Forwards VSS data to Zenoh"), - )); - - let args = parser.get_matches(); - - let publisher: Box = match args.subcommand_name() { - Some(SUBCOMMAND_HONO) => { - let hono_args = args.subcommand_matches(SUBCOMMAND_HONO).unwrap(); - match HonoPublisher::new(hono_args).await { - Ok(writer) => Box::new(writer), - Err(e) => { - error!("failed to create Hono publisher: {}", e); - process::exit(1); - } - } - } - Some(SUBCOMMAND_INFLUX) => { - let influx_args = args.subcommand_matches(SUBCOMMAND_INFLUX).unwrap(); - match InfluxWriter::new(influx_args) { - Ok(writer) => Box::new(writer), - Err(e) => { - error!("failed to create InfluxDB writer: {e}"); - process::exit(1); - } - } - } - Some(SUBCOMMAND_ZENOH) => { - let zenoh_args = args.subcommand_matches(SUBCOMMAND_ZENOH).unwrap(); - match ZenohPublisher::new(zenoh_args).await { - Ok(writer) => Box::new(writer), - Err(e) => { - error!("failed to create Zenoh Publisher: {e}"); - process::exit(1); - } - } - } - Some(_) => { - // cannot happen because subcommand is required - process::exit(1); - } - None => { - // cannot happen because subcommand is required - process::exit(1); + let transport: Arc = match command.transport { + TransportType::Hono(config) => HonoMqttTransport::new(&config).await.map(Arc::new)?, + TransportType::Zenoh(config) => { + let zenoh_config = config.try_into()?; + UPTransportZenoh::new(zenoh_config, uri_provider.get_source_uri()) + .await + .map(Arc::new)? } }; + let origin_resource_id = u16::try_from(command.vehicle_status_topic.resource_id)?; + let publisher = Arc::new(SimplePublisher::new(transport, uri_provider)); info!("starting FMS forwarder"); let (tx, mut rx) = mpsc::channel::(30); - vehicle_abstraction::init(&args, tx).await?; + vehicle_abstraction::init(&command.databroker_connection, tx).await?; while let Some(vehicle_status) = rx.recv().await { - publisher - .as_ref() - .publish_vehicle_status(&vehicle_status) - .await; + match UPayload::try_from_protobuf(vehicle_status) { + Ok(payload) => { + if let Err(e) = publisher + .publish( + origin_resource_id, + CallOptions::for_publish(None, None, None), + Some(payload), + ) + .await + { + warn!("failed to publish vehicle status event: {}", e); + } + } + Err(e) => { + warn!("failed to serialize vehicle status: {}", e); + } + } } Ok(()) } diff --git a/components/fms-forwarder/src/mqtt_connection.rs b/components/fms-forwarder/src/mqtt_connection.rs deleted file mode 100644 index 77b415e..0000000 --- a/components/fms-forwarder/src/mqtt_connection.rs +++ /dev/null @@ -1,308 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Contributors to the Eclipse Foundation -// -// See the NOTICE file(s) distributed with this work for additional -// information regarding copyright ownership. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// SPDX-License-Identifier: Apache-2.0 - -use clap::{Arg, ArgMatches, Command}; -use log::{error, info, warn}; -use mqtt::{AsyncClient, ConnectOptionsBuilder, CreateOptionsBuilder, SslOptionsBuilder}; -use paho_mqtt as mqtt; -use std::{thread, time::Duration}; - -const PARAM_CA_PATH: &str = "ca-path"; -const PARAM_DEVICE_CERT: &str = "device-cert"; -const PARAM_DEVICE_KEY: &str = "device-key"; -const PARAM_ENABLE_HOSTNAME_VERIFICATION: &str = "enable-hostname-verification"; -const PARAM_MQTT_CLIENT_ID: &str = "mqtt-client-id"; -const PARAM_MQTT_URI: &str = "mqtt-uri"; -const PARAM_MQTT_USERNAME: &str = "mqtt-username"; -const PARAM_MQTT_PASSWORD: &str = "mqtt-password"; -const PARAM_TRUST_STORE_PATH: &str = "trust-store-path"; - -/// Adds arguments to an existing command line which can be -/// used to configure the connection to an MQTT endpoint. -/// -/// The following arguments are being added: -/// -/// | Long Name | Environment Variable | Default Value | -/// |------------------------------|------------------------------|---------------| -/// | mqtt-client-id | MQTT_CLIENT_ID | - | -/// | mqtt-uri | MQTT_URI | - | -/// | mqtt-username | MQTT_USERNAME | - | -/// | mqtt-password | MQTT_PASSWORD | - | -/// | device-cert | DEVICE_CERT | - | -/// | device-key | DEVICE_KEY | - | -/// | ca-path | CA_PATH | - | -/// | trust-store-path | TRUST_STORE_PATH | - | -/// | enable-hostname-verification | ENABLE_HOSTNAME_VERIFICATION | `true` | -/// -pub fn add_command_line_args(command: Command) -> Command { - command - .arg( - Arg::new(PARAM_MQTT_CLIENT_ID) - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long(PARAM_MQTT_CLIENT_ID) - .help("The client identifier to use in the MQTT Connect Packet.") - .value_name("ID") - .required(false) - .env("MQTT_CLIENT_ID"), - ) - .arg( - Arg::new(PARAM_MQTT_URI) - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long(PARAM_MQTT_URI) - .help("The URI of the MQTT adapter to publish data to.") - .value_name("URI") - .required(true) - .env("MQTT_URI"), - ) - .arg( - Arg::new(PARAM_MQTT_USERNAME) - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long(PARAM_MQTT_USERNAME) - .help("The username to use for authenticating to the MQTT endpoint.") - .value_name("USERNAME") - .required(false) - .env("MQTT_USERNAME"), - ) - .arg( - Arg::new(PARAM_MQTT_PASSWORD) - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long(PARAM_MQTT_PASSWORD) - .help("The password to use for authenticating to the MQTT endpoint.") - .value_name("PWD") - .required(false) - .env("MQTT_PASSWORD"), - ) - .arg( - Arg::new(PARAM_DEVICE_CERT) - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long(PARAM_DEVICE_CERT) - .help("The path to a PEM file containing the X.509 certificate that the device should use for authentication.") - .value_name("PATH") - .required(false) - .env("DEVICE_CERT"), - ) - .arg( - Arg::new(PARAM_DEVICE_KEY) - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long(PARAM_DEVICE_KEY) - .help("The path to a PEM file containing the private key that the device should use for authentication.") - .value_name("PATH") - .required(false) - .env("DEVICE_KEY"), - ) - .arg( - Arg::new(PARAM_CA_PATH) - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long(PARAM_CA_PATH) - .help("The path to a folder that contains PEM files for trusted certificate authorities.") - .value_name("PATH") - .required(false) - .env("CA_PATH"), - ) - .arg( - Arg::new(PARAM_TRUST_STORE_PATH) - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long(PARAM_TRUST_STORE_PATH) - .help("The path to a file that contains PEM encoded trusted certificates.") - .value_name("PATH") - .required(false) - .env("TRUST_STORE_PATH"), - ) - .arg( - Arg::new(PARAM_ENABLE_HOSTNAME_VERIFICATION) - .value_parser(clap::builder::BoolishValueParser::new()) - .long(PARAM_ENABLE_HOSTNAME_VERIFICATION) - .help("Indicates whether server certificates should be matched against the hostname/IP address - used by a client to connect to the server.") - .value_name("FLAG") - .required(false) - .default_value("true") - .env("ENABLE_HOSTNAME_VERIFICATION"), - ) -} - -/// A connection to an MQTT endpoint. -/// -pub struct MqttConnection { - pub mqtt_client: AsyncClient, - pub uri: String, -} - -impl MqttConnection { - fn get_connect_options( - args: &ArgMatches, - ) -> Result> { - let mut ssl_options_builder = SslOptionsBuilder::new(); - if let Some(path) = args.get_one::(PARAM_CA_PATH) { - if let Err(e) = ssl_options_builder.ca_path(path) { - error!("failed to set CA path on MQTT client: {e}"); - return Err(Box::new(e)); - } - } - if let Some(path) = args.get_one::(PARAM_TRUST_STORE_PATH) { - if let Err(e) = ssl_options_builder.trust_store(path) { - error!("failed to set trust store path on MQTT client: {e}"); - return Err(Box::new(e)); - } - } - if let Some(flag) = args.get_one::(PARAM_ENABLE_HOSTNAME_VERIFICATION) { - ssl_options_builder.verify(*flag); - } - - let mut connect_options_builder = ConnectOptionsBuilder::new_v3(); - connect_options_builder.connect_timeout(Duration::from_secs(10)); - connect_options_builder - .automatic_reconnect(Duration::from_secs(1), Duration::from_secs(16)); - connect_options_builder.clean_session(true); - connect_options_builder.keep_alive_interval(Duration::from_secs(10)); - connect_options_builder.max_inflight(10); - - match ( - args.get_one::(PARAM_MQTT_USERNAME), - args.get_one::(PARAM_MQTT_PASSWORD), - args.get_one::(PARAM_DEVICE_CERT), - args.get_one::(PARAM_DEVICE_KEY), - ) { - (_, _, Some(cert_path), Some(key_path)) => { - match ssl_options_builder.key_store(cert_path) { - Ok(_builder) => (), - Err(e) => { - error!("failed to set client certificate for MQTT client: {e}"); - return Err(Box::new(e)); - } - } - match ssl_options_builder.private_key(key_path) { - Ok(_builder) => (), - Err(e) => { - error!("failed to set private key for MQTT client: {e}"); - return Err(Box::new(e)); - } - } - info!("using client certificate for authenticating to MQTT endpoint"); - } - (Some(username), Some(password), _, _) => { - connect_options_builder.user_name(username); - connect_options_builder.password(password); - info!("using username and password for authenticating to MQTT endpoint"); - } - _ => { - info!("no credentials specified, trying to connect anonymously to MQTT endpoint"); - } - } - - connect_options_builder.ssl_options(ssl_options_builder.finalize()); - Ok(connect_options_builder.finalize()) - } - - /// Creates a new connection to an MQTT endpoint. - /// - /// Expects to find parameters as defined by [`add_command_line_args`] in the passed - /// in *args*. - /// - /// The connection returned is configured to keep trying to (re-)connect to the configured - /// MQTT endpoint. - pub async fn new(args: &ArgMatches) -> Result> { - let connect_options = MqttConnection::get_connect_options(args)?; - let mqtt_uri = args.get_one::(PARAM_MQTT_URI).unwrap().to_owned(); - let client_id = args - .get_one::(PARAM_MQTT_CLIENT_ID) - .unwrap_or(&String::default()) - .to_owned(); - info!("connecting to MQTT endpoint at {}", mqtt_uri); - match CreateOptionsBuilder::new() - .server_uri(&mqtt_uri) - .max_buffered_messages(50) - .send_while_disconnected(true) - .delete_oldest_messages(true) - .client_id(client_id) - .create_client() - { - Err(e) => { - error!("failed to create MQTT client: {}", e); - Err(Box::new(e)) - } - Ok(client) => { - client.connect_with_callbacks( - connect_options, - MqttConnection::on_connect_success, - MqttConnection::on_connect_failure, - ); - Ok(MqttConnection { - mqtt_client: client, - uri: mqtt_uri, - }) - } - } - } - - fn on_connect_success(_client: &AsyncClient, _msgid: u16) { - info!("successfully connected to MQTT endpoint"); - } - - fn on_connect_failure(client: &AsyncClient, _msgid: u16, rc: i32) { - warn!( - "attempt to connect to MQTT endpoint failed with error code {}, retrying ...", - rc - ); - thread::sleep(Duration::from_secs(3)); - client.reconnect_with_callbacks( - MqttConnection::on_connect_success, - MqttConnection::on_connect_failure, - ); - } -} - -#[cfg(test)] -mod tests { - - #[test] - fn test_get_add_command_line_args_requies_uri() { - let command = super::add_command_line_args(clap::Command::new("mqtt")); - let matches = command.try_get_matches_from(vec!["mqtt"]); - assert!(matches.is_err_and(|e| e.kind() == clap::error::ErrorKind::MissingRequiredArgument)); - } - - #[test] - fn test_get_add_command_line_args_uses_defaults() { - let command = super::add_command_line_args(clap::Command::new("mqtt")); - let matches = - command.get_matches_from(vec!["mqtt", "--mqtt-uri", "mqtts://non-existing.host.io"]); - assert_eq!( - matches.get_one::(super::PARAM_MQTT_URI).unwrap(), - "mqtts://non-existing.host.io" - ); - assert!(matches - .get_one::(super::PARAM_MQTT_CLIENT_ID) - .is_none()); - assert!(matches - .get_one::(super::PARAM_MQTT_USERNAME) - .is_none()); - assert!(matches - .get_one::(super::PARAM_MQTT_PASSWORD) - .is_none()); - assert!(matches.get_one::(super::PARAM_DEVICE_KEY).is_none()); - assert!(matches - .get_one::(super::PARAM_DEVICE_CERT) - .is_none()); - assert!(matches.get_one::(super::PARAM_CA_PATH).is_none()); - assert!(matches - .get_one::(super::PARAM_ENABLE_HOSTNAME_VERIFICATION) - .unwrap()); - } -} diff --git a/components/fms-forwarder/src/status_publishing.rs b/components/fms-forwarder/src/status_publishing.rs deleted file mode 100644 index 4147ada..0000000 --- a/components/fms-forwarder/src/status_publishing.rs +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Contributors to the Eclipse Foundation -// -// See the NOTICE file(s) distributed with this work for additional -// information regarding copyright ownership. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// SPDX-License-Identifier: Apache-2.0 - -use async_trait::async_trait; -use fms_proto::fms::VehicleStatus; -use influx_client::writer::InfluxWriter; - -/// A facade for publishing Vehicle status information to a back end store. -#[async_trait] -pub trait StatusPublisher { - /// Publishes status information. - async fn publish_vehicle_status(&self, vehicle_status: &VehicleStatus); -} - -#[async_trait] -impl StatusPublisher for InfluxWriter { - async fn publish_vehicle_status(&self, vehicle_status: &VehicleStatus) { - self.write_vehicle_status(vehicle_status).await - } -} diff --git a/components/fms-forwarder/src/vehicle_abstraction.rs b/components/fms-forwarder/src/vehicle_abstraction.rs index fee97d0..112cacb 100644 --- a/components/fms-forwarder/src/vehicle_abstraction.rs +++ b/components/fms-forwarder/src/vehicle_abstraction.rs @@ -20,7 +20,7 @@ //! An abstraction of a vehicle's (current) status based on //! [Eclipse kuksa.val Databroker](https://github.com/eclipse/kuksa.val). //! -use clap::{Arg, ArgMatches, Command}; +use clap::Args; use log::{debug, error, info, warn}; use protobuf::MessageField; use tokio::sync::mpsc::Sender; @@ -80,10 +80,6 @@ const TRIGGER_VSS_PATHS: &[&str] = &[ vss::FMS_VEHICLE_TACHOGRAPH_DRIVER2_WORKINGSTATE, ]; -const PARAM_DATABROKER_URI: &str = "databroker-uri"; -const PARAM_DEFAULT_VIN: &str = "default-vin"; -const PARAM_TIMER_INTERVAL: &str = "timer-interval"; - const TELL_TALE_NAME_ECT: &str = "ENGINE_COOLANT_TEMPERATURE"; const TELL_TALE_NAME_ENGINE_OIL: &str = "ENGINE_OIL"; const TELL_TALE_NAME_ENGINE_MIL_INDICATOR: &str = "ENGINE_MIL_INDICATOR"; @@ -100,54 +96,27 @@ const TRIGGER_ENGINE_OFF: &str = "ENGINE_OFF"; const TRIGGER_TELL_TALE: &str = "TELL_TALE"; const TRIGGER_TIMER: &str = "TIMER"; +const PARAM_DATABROKER_URI: &str = "databroker-uri"; +const PARAM_DEFAULT_VIN: &str = "default-vin"; +const PARAM_TIMER_INTERVAL: &str = "timer-interval"; + mod kuksa; mod vss; -/// Adds arguments to an existing command line which can be -/// used to configure the component's behavior. -/// -/// The following arguments are being added: -/// -/// | long name | environment variable | default value | description | -/// |---------------------|-----------------------|---------------|-------------| -/// | *databroker-uri* | *KUKSA_DATABROKER_URI*| `http://127.0.0.1:55555` | The HTTP(S) URI of the kuksa.val Databroker's gRPC endpoint. | -/// | *default-vin* | *DEFAULT_VIN* | `YV2E4C3A5VB180691` | The default VIN to use if the kuksa.val Databroker does not contain the vehicle's VIN. The VIN is used as a tag on measurements written to the InfluxDB server. | -/// | *timer-interval* | *TIMER_INTERVAL* | `5s` | The time period to wait after polling FMS snapshot data from the kuksa.val Databroker, e.g 5m10s or 1h15m. | -/// -pub fn add_command_line_args(command_line: Command) -> Command { - command_line - .arg( - Arg::new(PARAM_DATABROKER_URI) - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long(PARAM_DATABROKER_URI) - .alias("uri") - .help("The HTTP(S) URI of the kuksa.val Databroker's gRPC endpoint.") - .value_name("URI") - .required(false) - .env("KUKSA_DATABROKER_URI") - .default_value("http://127.0.0.1:55555"), - ) - .arg( - Arg::new(PARAM_DEFAULT_VIN) - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long(PARAM_DEFAULT_VIN) - .help("The default VIN to use if the kuksa.val Databroker does not contain the vehicle's VIN. The VIN is used as a tag on measurements written to the InfluxDB server.") - .value_name("IDENTIFIER") - .required(false) - .env("DEFAULT_VIN") - .default_value("YV2E4C3A5VB180691"), - ) - .arg( - Arg::new(PARAM_TIMER_INTERVAL) - .value_parser(|s: &str| duration_str::parse(s)) - .long(PARAM_TIMER_INTERVAL) - .alias("timer") - .help("The time period to wait after polling FMS snapshot data from the kuksa.val Databroker, e.g 5m10s or 1h15m.") - .value_name("DURATION_SPEC") - .required(false) - .env("TIMER_INTERVAL") - .default_value("5s"), - ) +#[derive(Args)] +pub struct KuksaDatabrokerClientConfig { + /// The HTTP(S) URI of the Eclipse Kuksa Databroker's gRPC endpoint. + #[arg(long = PARAM_DATABROKER_URI, value_name = "URI", env = "KUKSA_DATABROKER_URI", default_value = "http://127.0.0.1:55555", value_parser = clap::builder::NonEmptyStringValueParser::new() )] + databroker_uri: String, + + /// The default VIN to use if the kuksa.val Databroker does not contain the vehicle's VIN. + /// The VIN is used as a tag on measurements written to the InfluxDB server. + #[arg(long = PARAM_DEFAULT_VIN, value_name = "IDENTIFIER", env = "DEFAULT_VIN", default_value = "YV2E4C3A5VB180691", value_parser = clap::builder::NonEmptyStringValueParser::new() )] + default_vin: String, + + /// The time period to wait after polling FMS snapshot data from the kuksa.val Databroker, e.g 5m10s or 1h15m. + #[arg(long = PARAM_TIMER_INTERVAL, value_name = "DURATION_SPEC", env = "TIMER_INTERVAL", default_value = "5s", value_parser = |s: &str| duration_str::parse(s) )] + timer_interval: Duration, } /// Indicates a problem while invoking a Databroker operation. @@ -331,22 +300,12 @@ struct KuksaValDatabroker { } impl KuksaValDatabroker { - async fn new(args: &ArgMatches) -> Result { - let databroker_uri = args - .get_one::(PARAM_DATABROKER_URI) - .unwrap() - .to_owned(); - - let default_vin = args - .get_one::(PARAM_DEFAULT_VIN) - .unwrap() - .to_owned(); - + async fn new(config: &KuksaDatabrokerClientConfig) -> Result { info!( - "creating client for kuksa.val Databroker at {}", - databroker_uri + "creating client for Eclipse Kuksa Databroker at {}", + config.databroker_uri ); - Endpoint::from_shared(databroker_uri.to_owned()) + Endpoint::from_shared(config.databroker_uri.to_owned()) .map_err(|e| { error!("invalid Databroker URI: {}", e); DatabrokerError { @@ -361,7 +320,7 @@ impl KuksaValDatabroker { let client = ValClient::new(channel); KuksaValDatabroker { client: Box::new(client), - default_vin, + default_vin: config.default_vin.to_owned(), } }) } @@ -476,20 +435,13 @@ impl KuksaValDatabroker { /// Sets up a connection to the Databroker and registers callbacks for /// signals that trigger the reporting of the vehicle's current status. -/// -/// Expects to find parameters as defined by [`add_command_line_args`] in the passed -/// in *args*. -/// pub async fn init( - args: &ArgMatches, + config: &KuksaDatabrokerClientConfig, status_publisher: Sender, ) -> Result<(), DatabrokerError> { - let timer_interval = args - .get_one::(PARAM_TIMER_INTERVAL) - .unwrap() - .to_owned(); + let timer_interval = config.timer_interval.to_owned(); - let mut databroker = KuksaValDatabroker::new(args).await?; + let mut databroker = KuksaValDatabroker::new(config).await?; let (tx, mut rx) = tokio::sync::mpsc::channel::(50); let _ = &databroker.register_triggers(tx.clone()).await?; diff --git a/components/fms-forwarder/src/zenoh_publisher.rs b/components/fms-forwarder/src/zenoh_publisher.rs deleted file mode 100644 index dd22855..0000000 --- a/components/fms-forwarder/src/zenoh_publisher.rs +++ /dev/null @@ -1,89 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Contributors to the Eclipse Foundation -// -// See the NOTICE file(s) distributed with this work for additional -// information regarding copyright ownership. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// SPDX-License-Identifier: Apache-2.0 - -use crate::status_publishing::StatusPublisher; -use async_trait::async_trait; -use clap::{Arg, ArgMatches, Command}; -use fms_proto::fms::VehicleStatus; -use log::{debug, warn}; -use protobuf::Message; -use zenoh::{pubsub::Publisher, Config, Session}; - -const KEY_EXPR: &str = "fms/vehicleStatus"; - -pub fn add_command_line_args(command: Command) -> Command { - command.arg( - Arg::new("config") - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long("config") - .short('c') - .help("A file to read the Zenoh configuration from") - .required(false), - ) -} - -pub fn parse_args(args: &ArgMatches) -> Result> { - if let Some(conf_file) = args.get_one::("config") { - Config::from_file(conf_file) - } else { - Ok(Config::default()) - } -} - -pub struct ZenohPublisher<'a> { - // we need to keep a reference to the Session in order to - // prevent Zenoh from closing it prematurely - _session: Session, - publisher: Publisher<'a>, -} - -impl<'a> ZenohPublisher<'a> { - pub async fn new( - args: &ArgMatches, - ) -> Result, Box> { - let config = parse_args(args)?; - let session = zenoh::open(config).await?; - let publisher = session.declare_publisher(KEY_EXPR).await?; - Ok(ZenohPublisher { - _session: session, - publisher, - }) - } -} - -#[async_trait] -impl<'a> StatusPublisher for ZenohPublisher<'a> { - async fn publish_vehicle_status(&self, vehicle_status: &VehicleStatus) { - match vehicle_status.write_to_bytes() { - Ok(payload) => { - match self.publisher.put(payload).await { - Ok(_t) => debug!("successfully published vehicle status to Zenoh",), - Err(e) => { - warn!("error publishing vehicle status to Zenoh: {}", e); - } - }; - return; - } - Err(e) => warn!( - "error serializing vehicle status to protobuf message: {}", - e - ), - } - } -} diff --git a/components/fms-server/Cargo.toml b/components/fms-server/Cargo.toml index 98f7d36..a1573c1 100644 --- a/components/fms-server/Cargo.toml +++ b/components/fms-server/Cargo.toml @@ -35,6 +35,7 @@ axum = "0.7" chrono = { workspace = true, features = ["clock", "serde"] } clap = { workspace = true, features = [ "std", + "derive", "env", "color", "help", diff --git a/components/fms-server/src/influx_reader.rs b/components/fms-server/src/influx_reader.rs index 3e8f91a..a530636 100644 --- a/components/fms-server/src/influx_reader.rs +++ b/components/fms-server/src/influx_reader.rs @@ -17,10 +17,9 @@ // // SPDX-License-Identifier: Apache-2.0 -use chrono::{DateTime, NaiveDateTime, Utc}; -use clap::ArgMatches; +use chrono::{DateTime, Utc}; use const_format::formatcp; -use influx_client::connection::InfluxConnection; +use influx_client::connection::{InfluxConnection, InfluxConnectionConfig}; use influxrs::InfluxError; use log::error; @@ -73,9 +72,7 @@ fn unpack_value_bool(value: Option<&String>) -> Option { fn unpack_time(value: Option<&String>) -> Option> { let timestamp = unpack_value_i64(value)?; - NaiveDateTime::from_timestamp_millis(timestamp)? - .and_local_timezone(Utc) - .latest() + DateTime::from_timestamp_millis(timestamp) } fn unpack_driver_working_state(value: Option<&String>) -> Option { @@ -99,7 +96,7 @@ pub struct InfluxReader { } impl InfluxReader { - pub fn new(args: &ArgMatches) -> Result> { + pub fn new(args: &InfluxConnectionConfig) -> Result> { InfluxConnection::new(args).map(|con| InfluxReader { influx_con: con }) } diff --git a/components/fms-server/src/lib.rs b/components/fms-server/src/lib.rs index c379e60..93c5d86 100644 --- a/components/fms-server/src/lib.rs +++ b/components/fms-server/src/lib.rs @@ -21,7 +21,7 @@ use axum::http::StatusCode; use axum::{routing::get, Json, Router}; use axum::extract::{Query, State}; -use clap::{ArgMatches, Command}; +use influx_client::connection::InfluxConnectionConfig; use log::{error, info}; use serde_json::json; @@ -45,8 +45,8 @@ use models::status::{ }; use query_parser::parse_query_parameters; -pub fn app(args: ArgMatches) -> Router { - let influx_reader = InfluxReader::new(&args).map_or_else( +pub fn app(influx_connection_params: &InfluxConnectionConfig) -> Router { + let influx_reader = InfluxReader::new(influx_connection_params).map_or_else( |e| { error!("failed to create InfluxDB client: {e}"); process::exit(1); @@ -62,10 +62,6 @@ pub fn app(args: ArgMatches) -> Router { .with_state(influx_reader) } -pub fn add_command_line_args(command_line: Command) -> Command { - influx_client::connection::add_command_line_args(command_line) -} - async fn root() -> &'static str { "Welcome to the rFMS server. The following endpoints are implemented: '/rfms/vehicleposition', '/rfms/vehicles', and '/rfms/vehiclestatuses'" } diff --git a/components/fms-server/src/main.rs b/components/fms-server/src/main.rs index ac31b96..eaff27e 100644 --- a/components/fms-server/src/main.rs +++ b/components/fms-server/src/main.rs @@ -17,17 +17,27 @@ // // SPDX-License-Identifier: Apache-2.0 -use clap::Command; +use clap::Parser; +use influx_client::connection::InfluxConnectionConfig; + +/// Exposes data from an InfluxDB via an rFMS API endpoint. +#[derive(Parser)] +#[command(version, about, long_about = None)] +struct FmsServerArgs { + #[command(flatten)] + influx_connection: InfluxConnectionConfig, +} #[tokio::main] async fn main() { env_logger::init(); - let mut parser = Command::new("rFMS server") - .about("Exposes data from an InfluxDB via an rFMS API endpoint."); - parser = fms_server::add_command_line_args(parser); - let args = parser.get_matches(); - let router = fms_server::app(args); + // let mut parser = Command::new("rFMS server") + // .about("Exposes data from an InfluxDB via an rFMS API endpoint."); + // parser = fms_server::add_command_line_args(parser); + // let args = parser.get_matches(); + let args = FmsServerArgs::parse(); + let router = fms_server::app(&args.influx_connection); let listener = tokio::net::TcpListener::bind("0.0.0.0:8081").await.unwrap(); axum::serve::serve(listener, router.into_make_service()) .await diff --git a/components/fms-util/Cargo.toml b/components/fms-util/Cargo.toml new file mode 100644 index 0000000..136fa17 --- /dev/null +++ b/components/fms-util/Cargo.toml @@ -0,0 +1,28 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +[package] +name = "fms-util" +publish = false +license.workspace = true +readme.workspace = true +repository.workspace = true +version.workspace = true +edition.workspace = true +documentation.workspace = true + +[dependencies] +clap = { workspace = true, features = ["derive"] } +log = { workspace = true } +zenoh = { workspace = true, features = ["transport_tcp"] } diff --git a/components/fms-util/src/lib.rs b/components/fms-util/src/lib.rs new file mode 100644 index 0000000..5199fd0 --- /dev/null +++ b/components/fms-util/src/lib.rs @@ -0,0 +1,42 @@ +// SPDX-FileCopyrightText: 2024 Contributors to the Eclipse Foundation +// +// See the NOTICE file(s) distributed with this work for additional +// information regarding copyright ownership. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: Apache-2.0 + +use std::path::PathBuf; + +use clap::Args; +use zenoh::config::Config; + +/// Parameters for configuring the connection to an Eclipse Zenoh router. +#[derive(Args)] +pub struct ZenohTransportConfig { + /// A file to read the Zenoh configuration from. + #[arg(long = "config", short)] + config_file: Option, +} + +impl TryFrom for Config { + type Error = Box; + fn try_from(value: ZenohTransportConfig) -> Result { + if let Some(path) = &value.config_file { + Config::from_file(path).map_err(|e| e as Box) + } else { + Ok(Config::default()) + } + } +} diff --git a/components/influx-client/Cargo.toml b/components/influx-client/Cargo.toml index b04a79c..01d1f4d 100644 --- a/components/influx-client/Cargo.toml +++ b/components/influx-client/Cargo.toml @@ -30,15 +30,7 @@ readme.workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -clap = { workspace = true, features = [ - "std", - "env", - "color", - "help", - "usage", - "error-context", - "suggestions", -] } +clap = { workspace = true, features = ["std", "derive", "env"] } fms-proto = { workspace = true, optional = true } protobuf = { workspace = true, optional = true } influxrs = { workspace = true, features = ["client"] } diff --git a/components/influx-client/src/connection.rs b/components/influx-client/src/connection.rs index d083f66..7dab5f3 100644 --- a/components/influx-client/src/connection.rs +++ b/components/influx-client/src/connection.rs @@ -17,7 +17,9 @@ // // SPDX-License-Identifier: Apache-2.0 -use clap::{Arg, ArgGroup, ArgMatches, Command}; +use std::path::PathBuf; + +use clap::Args; use influxrs::InfluxClient; use log::{error, info}; @@ -27,85 +29,72 @@ const PARAM_INFLUXDB_URI: &str = "influxdb-uri"; const PARAM_INFLUXDB_TOKEN: &str = "influxdb-token"; const PARAM_INFLUXDB_TOKEN_FILE: &str = "influxdb-token-file"; -/// Adds command line arguments to an existing command line which can be -/// used to configure the connection to an InfluxDB server. -/// -/// The following arguments are being added: -/// -/// | long name | environment variable | default value | -/// |---------------------|-------------------------|---------------| -/// | influxdb-bucket | INFLUXDB_BUCKET | `demo` | -/// | influxdb-org | INFLUXDB_ORG | `sdv` | -/// | influxdb-uri | INFLUXDB_URI | - | -/// | influxdb-token | INFLUXDB_TOKEN | - | -/// | influxdb-token-file | INFLUXDB_TOKEN_FILE | - | -/// -pub fn add_command_line_args(command_line: Command) -> Command { - command_line - .arg( - Arg::new(PARAM_INFLUXDB_URI) - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long(PARAM_INFLUXDB_URI) - .alias("ia") - .help("The HTTP(S) URI of the InfluxDB server to write data to.") - .value_name("URI") - .required(true) - .env("INFLUXDB_URI"), - ) - .group(ArgGroup::new("influxdb-auth-token").required(true)) - .arg( - Arg::new(PARAM_INFLUXDB_TOKEN) - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long(PARAM_INFLUXDB_TOKEN) - .alias("token") - .help("The API token to use for authenticating to the InfluxDB server.") - .group("influxdb-auth-token") - .value_name("TOKEN") - .env("INFLUXDB_TOKEN"), - ) - .arg( - Arg::new(PARAM_INFLUXDB_TOKEN_FILE) - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long(PARAM_INFLUXDB_TOKEN_FILE) - .alias("token-file") - .help("The path to a file that contains the API token to use for authenticating to the InfluxDB server.") - .group("influxdb-auth-token") - .value_name("FILE") - .conflicts_with("influxdb-token") - .env("INFLUXDB_TOKEN_FILE"), - ) - .arg( - Arg::new(PARAM_INFLUXDB_ORG) - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long(PARAM_INFLUXDB_ORG) - .alias("org") - .help("The name of the organization to connect to on the InfluxDB server.") - .value_name("NAME") - .required(false) - .default_value("sdv") - .env("INFLUXDB_ORG"), - ) - .arg( - Arg::new(PARAM_INFLUXDB_BUCKET) - .value_parser(clap::builder::NonEmptyStringValueParser::new()) - .long(PARAM_INFLUXDB_BUCKET) - .alias("bucket") - .help("The name of the bucket to write data to on the InfluxDB server.") - .value_name("NAME") - .required(false) - .default_value("demo") - .env("INFLUXDB_BUCKET"), - ) +#[derive(Args, Debug)] +#[group(required = true, multiple = false)] +struct Token { + /// The API token to use for authenticating to the InfluxDB server. + #[arg(long = PARAM_INFLUXDB_TOKEN, value_name = "NAME", env = "INFLUXDB_TOKEN", value_parser = clap::builder::NonEmptyStringValueParser::new() )] + token: Option, + + /// The path to a file that contains the API token to use for authenticating to the InfluxDB server. + #[arg(long = PARAM_INFLUXDB_TOKEN_FILE, value_name = "FILE", env = "INFLUXDB_TOKEN_FILE", value_parser = clap::builder::PathBufValueParser::new() )] + token_file: Option, } -fn read_token_from_file(filename: &str) -> std::io::Result { - info!("reading token from file {filename}"); - std::fs::read_to_string(filename) - .map(|s| s.trim().to_string()) - .map_err(|e| { - error!("failed to read token from file [{filename}]: {e}"); - e - }) +#[derive(Args, Debug)] +pub struct InfluxConnectionConfig { + /// The HTTP(S) URI of the InfluxDB server. + #[arg( + long = PARAM_INFLUXDB_URI, + value_name = "URI", + required = true, + env = "INFLUXDB_URI", + value_parser = clap::builder::NonEmptyStringValueParser::new() + )] + uri: String, + + /// The name of the organization to connect to on the InfluxDB server. + #[arg( + long = PARAM_INFLUXDB_ORG, + value_name = "URI", + required = false, + env = "INFLUXDB_ORG", + default_value = "sdv", + value_parser = clap::builder::NonEmptyStringValueParser::new() + )] + org: String, + + /// The name of the bucket to write data to on the InfluxDB server. + #[arg( + long = PARAM_INFLUXDB_BUCKET, + value_name = "URI", + required = false, + env = "INFLUXDB_BUCKET", + default_value = "demo", + value_parser = clap::builder::NonEmptyStringValueParser::new() + )] + bucket: String, + + #[command(flatten)] + token: Token, +} + +impl InfluxConnectionConfig { + fn token(&self) -> Result> { + if let Some(token) = self.token.token.as_ref() { + Ok(token.to_owned()) + } else if let Some(path) = self.token.token_file.as_ref() { + info!("reading token from file {:?}", path); + Ok(std::fs::read_to_string(path) + .map(|s| s.trim().to_string()) + .map_err(|e| { + error!("failed to read token from file: {e}"); + Box::new(e) + })?) + } else { + Err(Box::from("test")) + } + } } /// A connection to an InfluxDB server. @@ -123,59 +112,49 @@ impl InfluxConnection { /// # Examples /// /// ``` - /// use clap::Command; - /// use influx_client::connection::InfluxConnection; + /// use clap::{Args, Command, FromArgMatches}; + /// use influx_client::connection::{InfluxConnection, InfluxConnectionConfig}; /// - /// let command = influx_client::connection::add_command_line_args(Command::new("influx_client")); + /// let command = Command::new("influx_client"); + /// let command = InfluxConnectionConfig::augment_args(command); /// let matches = command.get_matches_from(vec![ /// "influx_client", /// "--influxdb-uri", "http://my-influx.io", /// "--influxdb-token", "some-token", /// "--influxdb-bucket", "the-bucket", /// ]); - /// let connection = InfluxConnection::new(&matches)?; + /// let connection_params = InfluxConnectionConfig::from_arg_matches(&matches)?; + /// let connection = InfluxConnection::new(&connection_params)?; /// assert_eq!(connection.bucket, "the-bucket".to_string()); /// # Ok::<(), Box>(()) /// ``` - pub fn new(args: &ArgMatches) -> Result> { - let influx_uri = args - .get_one::(PARAM_INFLUXDB_URI) - .unwrap() - .to_owned(); - let influx_token = match args.get_one::(PARAM_INFLUXDB_TOKEN) { - Some(token) => token.to_string(), - None => { - let file_name = args.get_one::(PARAM_INFLUXDB_TOKEN_FILE).unwrap(); - match read_token_from_file(file_name) { - Ok(token) => token, - Err(e) => return Err(Box::new(e)), - } - } - }; - let influx_org = args - .get_one::(PARAM_INFLUXDB_ORG) - .unwrap() - .to_owned(); - let influx_bucket = args - .get_one::(PARAM_INFLUXDB_BUCKET) - .unwrap() - .to_owned(); - let client = InfluxClient::builder(influx_uri, influx_token, influx_org) - .build() - .unwrap(); + pub fn new( + connection_params: &InfluxConnectionConfig, + ) -> Result> { + let client = InfluxClient::builder( + connection_params.uri.to_owned(), + connection_params.token()?, + connection_params.org.to_owned(), + ) + .build()?; Ok(InfluxConnection { client, - bucket: influx_bucket, + bucket: connection_params.bucket.to_owned(), }) } } #[cfg(test)] mod tests { + use clap::{Args, Command, FromArgMatches}; + + use super::*; + use crate::connection::InfluxConnectionConfig; #[test] fn test_command_line_uses_defaults() { - let command = crate::connection::add_command_line_args(clap::Command::new("influx_client")); + let command = Command::new("influx_client"); + let command = InfluxConnectionConfig::augment_args(command); let matches = command.get_matches_from(vec![ "influx_client", "--influxdb-uri", @@ -183,43 +162,29 @@ mod tests { "--influxdb-token", "the-token", ]); - assert_eq!( - matches - .get_one::(super::PARAM_INFLUXDB_URI) - .unwrap(), - "http://influx.io" - ); - assert_eq!( - matches - .get_one::(super::PARAM_INFLUXDB_TOKEN) - .unwrap(), - "the-token" - ); - assert_eq!( - matches - .get_one::(super::PARAM_INFLUXDB_ORG) - .unwrap(), - "sdv" - ); - assert_eq!( - matches - .get_one::(super::PARAM_INFLUXDB_BUCKET) - .unwrap(), - "demo" - ); + let connection_params = InfluxConnectionConfig::from_arg_matches(&matches) + .expect("failed to create params from command line"); + assert_eq!(connection_params.uri, *"http://influx.io"); + assert_eq!(connection_params.token.token, Some("the-token".to_string())); + assert_eq!(connection_params.org, *"sdv"); + assert_eq!(connection_params.bucket, *"demo"); } #[test] fn test_command_line_requires_uri() { - let command = crate::connection::add_command_line_args(clap::Command::new("influx_client")); + let command = Command::new("influx_client"); + let command = InfluxConnectionConfig::augment_args(command); let matches = command.try_get_matches_from(vec!["influx_client", "--influxdb-token", "the-token"]); - assert!(matches.is_err_and(|e| e.kind() == clap::error::ErrorKind::MissingRequiredArgument)); + assert!( + matches.is_err_and(|e| { e.kind() == clap::error::ErrorKind::MissingRequiredArgument }) + ); } #[test] fn test_command_line_requires_token_or_token_file() { - let command = crate::connection::add_command_line_args(clap::Command::new("influx_client")); + let command = Command::new("influx_client"); + let command = InfluxConnectionConfig::augment_args(command); let no_token_matches = command.try_get_matches_from(vec![ "influx_client", "--influxdb-uri", @@ -228,7 +193,8 @@ mod tests { assert!(no_token_matches .is_err_and(|e| e.kind() == clap::error::ErrorKind::MissingRequiredArgument)); - let command = crate::connection::add_command_line_args(clap::Command::new("influx_client")); + let command = Command::new("influx_client"); + let command = InfluxConnectionConfig::augment_args(command); let with_token_matches = command.get_matches_from(vec![ "influx_client", "--influxdb-uri", @@ -236,14 +202,13 @@ mod tests { "--influxdb-token", "the-token", ]); - assert_eq!( - with_token_matches - .get_one::(super::PARAM_INFLUXDB_TOKEN) - .unwrap(), - "the-token" - ); - let command = crate::connection::add_command_line_args(clap::Command::new("influx_client")); + let connection_params = InfluxConnectionConfig::from_arg_matches(&with_token_matches) + .expect("failed to create params from command line"); + assert_eq!(connection_params.token.token, Some("the-token".to_string())); + + let command = Command::new("influx_client"); + let command = InfluxConnectionConfig::augment_args(command); let with_token_file_matches = command.get_matches_from(vec![ "influx_client", "--influxdb-uri", @@ -251,11 +216,12 @@ mod tests { "--influxdb-token-file", "/path/to/token-file", ]); + let connection_params = InfluxConnectionConfig::from_arg_matches(&with_token_file_matches) + .expect("failed to create params from command line"); + println!("params: {:?}", connection_params); assert_eq!( - with_token_file_matches - .get_one::(super::PARAM_INFLUXDB_TOKEN_FILE) - .unwrap(), - "/path/to/token-file" + connection_params.token.token_file, + Some(PathBuf::from("/path/to/token-file")) ); } } diff --git a/components/influx-client/src/writer.rs b/components/influx-client/src/writer.rs index ea94906..3ef79e4 100644 --- a/components/influx-client/src/writer.rs +++ b/components/influx-client/src/writer.rs @@ -19,14 +19,13 @@ //! Provides means to write a Vehicle's current status properties //! to an InfluxDB as Influx *measurements*. -use clap::ArgMatches; use fms_proto::fms::VehicleStatus; use influxrs::Measurement; use log::{debug, warn}; use protobuf::well_known_types::timestamp::Timestamp; use std::time::{SystemTime, UNIX_EPOCH}; -use crate::connection::InfluxConnection; +use crate::connection::{InfluxConnection, InfluxConnectionConfig}; fn build_header_measurement( vin: &str, @@ -194,7 +193,7 @@ impl InfluxWriter { /// /// Determines the parameters necessary for creating the writer from values specified on /// the command line or via environment variables as defined by [`super::add_command_line_args`]. - pub fn new(args: &ArgMatches) -> Result> { + pub fn new(args: &InfluxConnectionConfig) -> Result> { InfluxConnection::new(args).map(|con| InfluxWriter { influx_con: con }) } @@ -206,7 +205,7 @@ impl InfluxWriter { /// This function writes the current vehicle status to InfluxDB by means of two measurements: /// /// * *header* - contains the following tags/fields: - + /// /// | Type | Name | Description | /// | ----- | --------------- | -------------------------------- | /// | tag | trigger | The type of event that triggered the reporting of the vehicle status. | @@ -219,9 +218,9 @@ impl InfluxWriter { /// | field | engineTotalFuelUsed | The total fuel the vehicle has used during its lifetime in MilliLitres. | /// | field | driver1Id | The unique identification of driver one in a Member State. | /// | field | driver1IdCardIssuer | The country alpha code of the Member State having issued driver one's card. | - + /// /// * *snapshot* - contains the following tags/fields: - + /// /// | Type | Name | Description | /// | ----- | --------------- | -------------------------------- | /// | tag | trigger | The type of event that triggered the reporting of the vehicle status. | diff --git a/components/up-transport-hono-kafka/Cargo.toml b/components/up-transport-hono-kafka/Cargo.toml new file mode 100644 index 0000000..05695c4 --- /dev/null +++ b/components/up-transport-hono-kafka/Cargo.toml @@ -0,0 +1,43 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +[package] +name = "up-transport-hono-kafka" +publish = false +license.workspace = true +readme.workspace = true +repository.workspace = true +version.workspace = true +edition.workspace = true +documentation.workspace = true + +[dependencies] +async-trait = { workspace = true } +clap = { workspace = true, features = ["std", "derive", "env"] } +fms-proto = { workspace = true } +futures = { version = "0.3" } +log = { workspace = true } +protobuf = { workspace = true } +rdkafka = { version = "0.36", default-features = false, features = [ + "libz", + "tokio", + "cmake-build", + "ssl-vendored", +] } +tokio = { workspace = true } +up-rust = { workspace = true, features = ["cloudevents", "util"] } + +[build-dependencies] +# see https://github.com/fede1024/rust-rdkafka/issues/572#issuecomment-1529316876 +openssl-src = { version = "300", features = ["force-engine"] } diff --git a/components/up-transport-hono-kafka/src/lib.rs b/components/up-transport-hono-kafka/src/lib.rs new file mode 100644 index 0000000..3a7d4d6 --- /dev/null +++ b/components/up-transport-hono-kafka/src/lib.rs @@ -0,0 +1,298 @@ +// SPDX-FileCopyrightText: 2023 Contributors to the Eclipse Foundation +// +// See the NOTICE file(s) distributed with this work for additional +// information regarding copyright ownership. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: Apache-2.0 + +use std::{ + collections::HashMap, + fs::File, + io::{BufRead, BufReader}, + path::PathBuf, + sync::Arc, + time::Duration, +}; + +use clap::Args; +use futures::TryStreamExt; +use log::{debug, error, info, trace}; +use protobuf::Message as ProtoMessage; +use rdkafka::{ + config::RDKafkaLogLevel, + consumer::{Consumer, StreamConsumer}, + message::{BorrowedHeaders, BorrowedMessage, Headers}, + ClientConfig, Message, +}; +use up_rust::{ + local_transport::LocalTransport, CloudEvent, UCode, UListener, UMessage, UStatus, UTransport, + UUri, +}; + +const HEADER_NAME_ORIG_ADDRESS: &str = "orig_address"; + +const PARAM_KAFKA_PROPERTIES_FILE: &str = "kafka-properties-file"; +const PARAM_HONO_TENANT_ID: &str = "hono-tenant-id"; + +// TODO: this should be replaced with a constant from up-rust +// see https://github.com/eclipse-uprotocol/up-rust/issues/223 +const MIME_TYPE_CLOUDEVENTS_PROTOBUF: &str = "application/cloudevents+protobuf"; + +fn add_property_bag_to_map(property_bag: String, headers: &mut HashMap) { + property_bag.split('&').for_each(|p| { + trace!("processing property: {p}"); + if let Some((key, value)) = p.split_once('=') { + if headers.contains_key(key) { + trace!("skipping property [{key}] from property bag because header with same name exists"); + } else { + trace!("adding propery [key: {key}, value: {value}] to header map"); + headers.insert(key.to_string(), value.to_string()); + } + } + }); +} + +fn get_headers_as_map(headers: &BorrowedHeaders) -> HashMap { + let mut result = HashMap::new(); + headers.iter().for_each(|header| { + match ( + header.key, + header + .value + .and_then(|v| String::from_utf8(v.to_vec()).ok()), + ) { + (HEADER_NAME_ORIG_ADDRESS, Some(value)) => { + if let Some((_topic, props)) = value.rsplit_once("/?") { + debug!("found property bag in {HEADER_NAME_ORIG_ADDRESS} header: {props}"); + add_property_bag_to_map(props.to_string(), &mut result); + } + } + (_, Some(value)) => { + result.insert(header.key.to_string(), value); + } + (_, None) => { + debug!("message contains empty header [{}]", header.key); + } + }; + }); + + result +} + +fn extract_umessage_from_cloudevent(payload: &[u8]) -> Option { + match CloudEvent::parse_from_bytes(payload) { + Ok(cloudevent) => match UMessage::try_from(cloudevent) { + Err(e) => { + info!("failed to extract payload from CloudEvent: {}", e); + None + } + Ok(msg) => Some(msg), + }, + Err(e) => { + info!("failed to deserialize CloudEvent: {}", e); + None + } + } +} + +fn extract_umessage_from_kafka_message(m: &BorrowedMessage<'_>) -> Option { + if let Some(headers) = m.headers() { + let message_properties = get_headers_as_map(headers); + + if let Some(device_id) = message_properties.get("device_id") { + debug!("received message from vehicle {}", device_id); + } else { + debug!("discarding message from unknown device"); + return None; + }; + + match ( + message_properties.get("content-type").map(String::as_str), + m.payload(), + ) { + (Some(MIME_TYPE_CLOUDEVENTS_PROTOBUF), Some(payload)) => { + debug!("received message containing CloudEvent"); + extract_umessage_from_cloudevent(payload) + } + (_, None) => { + debug!("ignoring message without payload"); + None + } + _ => None, + } + } else { + debug!("ignoring message without headers"); + None + } +} + +#[derive(Args)] +pub struct HonoKafkaTransportConfig { + /// The path to a file containing Kafka client properties for connecting to Hono's Kafka broker(s). + #[arg(long = PARAM_KAFKA_PROPERTIES_FILE, value_name = "PATH", env = "KAFKA_PROPERTIES_FILE", value_parser = clap::builder::PathBufValueParser::new())] + kafka_property_file: PathBuf, + + /// The identifier of the Hono tenant to consume messages for. + #[arg(long = PARAM_HONO_TENANT_ID, value_name = "ID", env = "HONO_TENANT_ID")] + hono_tenant_id: String, +} + +impl HonoKafkaTransportConfig { + fn read_lines(&self) -> Result>, Box> { + // Open the file in read-only mode. + match File::open(&self.kafka_property_file) { + Ok(file) => { + // Read the file line by line, and return an iterator of the lines of the file. + Ok(BufReader::new(file).lines()) + } + Err(e) => Err(Box::new(e)), + } + } + + fn get_kafka_client_config(&self) -> Result> { + self.read_lines().map(|lines| { + let mut client_config = ClientConfig::new(); + for line in lines { + match line { + Ok(property) => match property.split_once('=') { + Some((key, value)) => { + client_config.set(key, value); + } + None => { + debug!("cannot parse line into property: {}", property); + } + }, + Err(e) => { + debug!("cannot read line from file: {e}"); + } + } + } + client_config + }) + } +} + +/// A simple uProtocol transport implementation for receiving messages from Eclipse Hono's +/// Apache Kafka based messaging infrastructure. +pub struct HonoKafkaTransport { + local_transport: Arc, +} + +impl HonoKafkaTransport { + pub fn new( + config_params: HonoKafkaTransportConfig, + ) -> Result> { + let mut client_config = config_params.get_kafka_client_config()?; + + // Create the `StreamConsumer`, to receive the messages from the topic in form of a `Stream`. + let consumer = client_config + .set_log_level(RDKafkaLogLevel::Debug) + .create::()?; + + let telemetry_topic = format!("hono.telemetry.{}", config_params.hono_tenant_id); + let event_topic = format!("hono.event.{}", config_params.hono_tenant_id); + let response_topic = format!("hono.command_response.{}", config_params.hono_tenant_id); + + let topics = &[ + telemetry_topic.as_str(), + event_topic.as_str(), + response_topic.as_str(), + ]; + for topic_name in topics { + match consumer.fetch_metadata(Some(topic_name), Duration::from_secs(10)) { + Err(e) => { + error!( + "could not retrieve meta data for topic [{topic_name}] from broker: {e}" + ); + } + Ok(metadata) => match metadata + .topics() + .iter() + .find(|topic| topic.name().eq(*topic_name)) + { + Some(topic) => { + if topic.partitions().is_empty() { + error!("topic [{topic_name}] does not exist (yet)"); + } + } + None => { + error!("broker did not return meta data for topic [{topic_name}]"); + } + }, + } + } + + if let Err(e) = consumer.subscribe(topics) { + error!("failed to subscribe to topic: {}", e); + return Err(Box::new(e)); + } else { + info!("successfully subscribed to tenant's topics"); + } + + let local_transport = Arc::new(LocalTransport::default()); + let local_transport_ref = local_transport.clone(); + tokio::spawn(async move { + info!("starting message consumer"); + consumer + .stream() + .try_for_each(|borrowed_message| { + let cloned_local_transport = local_transport_ref.clone(); + async move { + if let Some(msg) = extract_umessage_from_kafka_message(&borrowed_message) { + let _ = cloned_local_transport.send(msg).await; + } + Ok(()) + } + }) + .await + .unwrap_or_else(|e| { + error!("could not start consumer for Hono topics: {}", e); + }); + }); + Ok(HonoKafkaTransport { local_transport }) + } +} + +#[async_trait::async_trait] +impl UTransport for HonoKafkaTransport { + async fn send(&self, _message: UMessage) -> Result<(), UStatus> { + Err(UStatus::fail_with_code( + UCode::UNIMPLEMENTED, + "not implemented", + )) + } + + async fn register_listener( + &self, + source_filter: &UUri, + sink_filter: Option<&UUri>, + listener: Arc, + ) -> Result<(), UStatus> { + self.local_transport + .register_listener(source_filter, sink_filter, listener) + .await + } + + async fn unregister_listener( + &self, + source_filter: &UUri, + sink_filter: Option<&UUri>, + listener: Arc, + ) -> Result<(), UStatus> { + self.local_transport + .unregister_listener(source_filter, sink_filter, listener) + .await + } +} diff --git a/components/up-transport-hono-mqtt/Cargo.toml b/components/up-transport-hono-mqtt/Cargo.toml new file mode 100644 index 0000000..21c8557 --- /dev/null +++ b/components/up-transport-hono-mqtt/Cargo.toml @@ -0,0 +1,34 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +[package] +name = "up-transport-hono-mqtt" +publish = false +license.workspace = true +readme.workspace = true +repository.workspace = true +version.workspace = true +edition.workspace = true +documentation.workspace = true + +[dependencies] +async-trait = { workspace = true } +clap = { workspace = true, features = ["std", "derive", "env"] } +log = { workspace = true } +paho-mqtt = { version = "0.12", default-features = false, features = [ + "vendored-ssl", +] } +protobuf = { workspace = true } +up-rust = { workspace = true, features = ["cloudevents"] } +url_encor = { version = "1.0.2" } diff --git a/components/up-transport-hono-mqtt/src/lib.rs b/components/up-transport-hono-mqtt/src/lib.rs new file mode 100644 index 0000000..b0da308 --- /dev/null +++ b/components/up-transport-hono-mqtt/src/lib.rs @@ -0,0 +1,98 @@ +// SPDX-FileCopyrightText: 2024 Contributors to the Eclipse Foundation +// +// See the NOTICE file(s) distributed with this work for additional +// information regarding copyright ownership. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: Apache-2.0 + +use clap::Args; +use log::{debug, warn}; +use paho_mqtt::{AsyncClient, MessageBuilder}; +use protobuf::Message; +use up_rust::{CloudEvent, UCode, UMessage, UStatus, UTransport}; +use url_encor::Encoder; + +mod mqtt_connection; + +// TODO: this should be replaced with a constant from up-rust +// see https://github.com/eclipse-uprotocol/up-rust/issues/223 +const MIME_TYPE_CLOUDEVENTS_PROTOBUF: &str = "application/cloudevents+protobuf"; + +#[derive(Args)] +pub struct HonoMqttTransportConfig { + #[command(flatten)] + mqtt_client_options: mqtt_connection::MqttClientOptions, +} + +pub struct HonoMqttTransport { + mqtt_client: AsyncClient, + topic: String, +} + +/// A simple uProtocol transport implementation for sending messages to Eclipse Hono's +/// MQTT adapter (using MQTT v3.1.1). +impl HonoMqttTransport { + /// Creates a new transport. + /// + /// Determines the parameters necessary for creating the publisher from values specified on + /// the command line or via environment variables as defined by [`add_command_line_args`]. + /// + /// The publisher returned is configured to keep trying to (re-)connect to the configured + /// MQTT endpoint using a client certificate of username/password credentials. + pub async fn new(config: &HonoMqttTransportConfig) -> Result> { + let content_type = MIME_TYPE_CLOUDEVENTS_PROTOBUF.to_string().url_encode(); + let topic = format!("telemetry/?content-type={}", content_type); + + config + .mqtt_client_options + .connect() + .await + .map(|mqtt_client| HonoMqttTransport { mqtt_client, topic }) + } +} + +#[async_trait::async_trait] +impl UTransport for HonoMqttTransport { + async fn send(&self, message: UMessage) -> Result<(), UStatus> { + let event = CloudEvent::try_from(message) + .map_err(|e| UStatus::fail_with_code(UCode::INVALID_ARGUMENT, e.to_string()))?; + let payload = event.write_to_bytes().map_err(|_e| { + UStatus::fail_with_code(UCode::INTERNAL, "failed to serialize CloudEvent to JSON") + })?; + let msg = MessageBuilder::new() + .topic(self.topic.clone()) + .payload(payload) + .finalize(); + match self.mqtt_client.publish(msg).await { + Ok(_t) => { + debug!( + "successfully published vehicle status to MQTT endpoint [uri: {}, topic: {}]", + self.mqtt_client.server_uri(), + self.topic + ); + Ok(()) + } + Err(e) => { + warn!( + "error publishing vehicle status to MQTT endpoint [uri: {}, topic: {}]: {}", + self.mqtt_client.server_uri(), + self.topic, + e + ); + Err(UStatus::fail_with_code(UCode::INTERNAL, e.to_string())) + } + } + } +} diff --git a/components/up-transport-hono-mqtt/src/mqtt_connection.rs b/components/up-transport-hono-mqtt/src/mqtt_connection.rs new file mode 100644 index 0000000..b88f705 --- /dev/null +++ b/components/up-transport-hono-mqtt/src/mqtt_connection.rs @@ -0,0 +1,264 @@ +// SPDX-FileCopyrightText: 2023 Contributors to the Eclipse Foundation +// +// See the NOTICE file(s) distributed with this work for additional +// information regarding copyright ownership. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// SPDX-License-Identifier: Apache-2.0 + +use clap::{Args, ValueEnum}; +use log::{debug, error, info, warn}; +use mqtt::{ + AsyncClient, ConnectOptionsBuilder, CreateOptionsBuilder, SslOptions, SslOptionsBuilder, +}; +use paho_mqtt as mqtt; +use std::{fmt::Display, path::PathBuf, thread, time::Duration}; + +const PARAM_CA_PATH: &str = "ca-path"; +const PARAM_DEVICE_CERT: &str = "device-cert"; +const PARAM_DEVICE_KEY: &str = "device-key"; +const PARAM_ENABLE_HOSTNAME_VERIFICATION: &str = "enable-hostname-verification"; +const PARAM_MQTT_CLIENT_ID: &str = "mqtt-client-id"; +const PARAM_MQTT_URI: &str = "mqtt-uri"; +const PARAM_MQTT_USERNAME: &str = "mqtt-username"; +const PARAM_MQTT_PASSWORD: &str = "mqtt-password"; +const PARAM_MQTT_PROTOCOL_VERSION: &str = "mqtt-protocol-version"; +const PARAM_TRUST_STORE_PATH: &str = "trust-store-path"; + +pub fn on_connect_success(_client: &AsyncClient, _msgid: u16) { + info!("successfully connected to MQTT endpoint"); +} + +pub fn on_connect_failure(client: &AsyncClient, _msgid: u16, rc: i32) { + warn!( + "attempt to connect to MQTT endpoint failed with error code {}, retrying ...", + rc + ); + thread::sleep(Duration::from_secs(3)); + client.reconnect_with_callbacks(on_connect_success, on_connect_failure); +} + +#[derive(Clone, ValueEnum)] +pub enum MqttVersion { + V3, + V5, +} + +impl Display for MqttVersion { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + MqttVersion::V3 => f.write_str("3.1.1"), + MqttVersion::V5 => f.write_str("5"), + } + } +} + +#[derive(Args)] +pub struct MqttClientOptions { + /// The client identifier to use in the MQTT Connect Packet. + #[arg(long = PARAM_MQTT_CLIENT_ID, value_name = "ID", env = "MQTT_CLIENT_ID")] + client_id: Option, + + /// The URI of the MQTT adapter to publish data to. + #[arg(long = PARAM_MQTT_URI, value_name = "URI", env = "MQTT_URI")] + server_uri: String, + + /// The username to use for authenticating to the MQTT endpoint. + #[arg(long = PARAM_MQTT_USERNAME, value_name = "USERNAME", env = "MQTT_USERNAME")] + username: Option, + + /// The password to use for authenticating to the MQTT endpoint. + #[arg(long = PARAM_MQTT_PASSWORD, value_name = "PWD", env = "MQTT_PASSWORD")] + password: Option, + + /// The path to a PEM file containing the X.509 certificate that the device should use for authentication. + #[arg(long = PARAM_DEVICE_CERT, value_name = "PATH", env = "DEVICE_CERT", value_parser = clap::builder::PathBufValueParser::new())] + cert_path: Option, + + /// The path to a PEM file containing the private key that the device should use for authentication. + #[arg(long = PARAM_DEVICE_KEY, value_name = "PATH", env = "DEVICE_KEY", value_parser = clap::builder::PathBufValueParser::new())] + key_path: Option, + + /// The path to a folder that contains PEM files for trusted certificate authorities. + #[arg(long = PARAM_CA_PATH, value_name = "PATH", env = "CA_PATH", value_parser = clap::builder::PathBufValueParser::new())] + ca_path: Option, + + /// The path to a file that contains PEM encoded trusted certificates. + #[arg(long = PARAM_TRUST_STORE_PATH, value_name = "PATH", env = "TRUST_STORE_PATH", value_parser = clap::builder::PathBufValueParser::new())] + trust_store_path: Option, + + /// Indicates whether server certificates should be matched against the + /// hostname/IP address used by a client to connect to the server. + #[arg(long = PARAM_ENABLE_HOSTNAME_VERIFICATION, value_name = "FLAG", default_value = "true", env = "ENABLE_HOSTNAME_VERIFICATION")] + enable_hostname_verification: bool, + + /// The version of the MQTT protocol to use for connecting to the broker. + #[arg( + value_enum, + long = PARAM_MQTT_PROTOCOL_VERSION, + default_value = "v3", + env = "MQTT_PROTOCOL_VERSION" + )] + protocol_version: MqttVersion, +} + +impl MqttClientOptions { + pub fn ssl_options(&self) -> Result> { + let mut ssl_options_builder = SslOptionsBuilder::new(); + match (self.cert_path.as_ref(), self.key_path.as_ref()) { + (Some(cert_path), Some(key_path)) => { + if let Err(e) = ssl_options_builder.key_store(cert_path) { + error!("failed to set client certificate for MQTT client: {}", e); + return Err(Box::from(e)); + } + if let Err(e) = ssl_options_builder.private_key(key_path) { + error!("failed to set private key for MQTT client: {}", e); + return Err(Box::from(e)); + } + info!("using client certificate for authenticating to MQTT endpoint"); + } + _ => { + debug!("no client key material specified"); + } + } + + if let Some(path) = self.ca_path.as_ref() { + if let Err(e) = ssl_options_builder.ca_path(path) { + error!("failed to set CA path on MQTT client: {}", e); + return Err(Box::from(e)); + } + } + if let Some(path) = self.trust_store_path.as_ref() { + if let Err(e) = ssl_options_builder.trust_store(path) { + error!("failed to set trust store path on MQTT client: {}", e); + return Err(Box::from(e)); + } + } + ssl_options_builder.verify(self.enable_hostname_verification); + Ok(ssl_options_builder.finalize()) + } + + fn mqtt3_connect_options( + &self, + ) -> Result> { + let mut connect_options_builder = ConnectOptionsBuilder::new_v3(); + connect_options_builder.connect_timeout(Duration::from_secs(10)); + connect_options_builder + .automatic_reconnect(Duration::from_secs(1), Duration::from_secs(16)); + connect_options_builder.clean_session(true); + connect_options_builder.keep_alive_interval(Duration::from_secs(10)); + connect_options_builder.max_inflight(10); + connect_options_builder.ssl_options(self.ssl_options()?); + + match (self.username.as_ref(), self.password.as_ref()) { + (Some(username), Some(password)) => { + connect_options_builder.user_name(username); + connect_options_builder.password(password); + info!("using username and password for authenticating to MQTT endpoint"); + } + _ => { + debug!("no credentials specified"); + } + } + Ok(connect_options_builder.finalize()) + } + + fn mqtt5_connect_options( + &self, + ) -> Result> { + let options = ConnectOptionsBuilder::new_v5() + .connect_timeout(Duration::from_secs(5)) + .automatic_reconnect(Duration::from_secs(1), Duration::from_secs(16)) + .clean_start(true) + .keep_alive_interval(Duration::from_secs(10)) + .max_inflight(10) + .finalize(); + Ok(options) + } + + pub fn create_async_client(&self) -> Result> { + CreateOptionsBuilder::new() + .server_uri(self.server_uri.as_str()) + .max_buffered_messages(50) + .send_while_disconnected(true) + .delete_oldest_messages(true) + .client_id(self.client_id.clone().unwrap_or_default()) + .create_client() + .map_err(Box::from) + } + + pub async fn connect(&self) -> Result> { + let connect_options = match self.protocol_version { + MqttVersion::V3 => self.mqtt3_connect_options()?, + MqttVersion::V5 => self.mqtt5_connect_options()?, + }; + match self.create_async_client() { + Err(e) => { + error!("failed to create MQTT client: {}", e); + Err(e) + } + Ok(client) => { + info!( + "connecting to MQTT endpoint [broker URI: {}, protocol version: {}]", + client.server_uri(), + self.protocol_version + ); + client + .connect_with_callbacks( + connect_options, + crate::mqtt_connection::on_connect_success, + crate::mqtt_connection::on_connect_failure, + ) + .await + .map(|_response| client) + .map_err(Box::from) + } + } + } +} + +impl Display for MqttClientOptions { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_fmt(format_args!( + "MQTT Client Options [server-uri: {}]", + self.server_uri + )) + } +} + +#[cfg(test)] +mod tests { + use clap::{Args, FromArgMatches}; + + use super::*; + + #[test] + fn test_command_line_uses_defaults() { + let command = clap::Command::new("mqtt"); + let command = MqttClientOptions::augment_args(command); + let matches = + command.get_matches_from(vec!["mqtt", "--mqtt-uri", "mqtts://non-existing.host.io"]); + let options = MqttClientOptions::from_arg_matches(&matches) + .expect("failed to create options from command line"); + + assert_eq!(options.server_uri, "mqtts://non-existing.host.io"); + assert!(options.client_id.is_none()); + assert!(options.username.is_none()); + assert!(options.password.is_none()); + assert!(options.cert_path.is_none()); + assert!(options.key_path.is_none()); + assert!(options.ca_path.is_none()); + assert!(options.enable_hostname_verification); + } +} diff --git a/zenoh-config-client.json5 b/config/zenoh/config-client.json5 similarity index 100% rename from zenoh-config-client.json5 rename to config/zenoh/config-client.json5 diff --git a/zenoh-config-router.json5 b/config/zenoh/config-router.json5 similarity index 100% rename from zenoh-config-router.json5 rename to config/zenoh/config-router.json5 diff --git a/create-config-functions.sh b/create-config-functions.sh index bfe71a6..a1edf10 100644 --- a/create-config-functions.sh +++ b/create-config-functions.sh @@ -90,14 +90,14 @@ create_docker_compose_env() { ENV_FILE_PATH=$1 CONSUMER_CONFIG_FOLDER=$2 CONSUMER_KAFKA_PROPERTIES_FILE_NAME=$3 - CONSUMER_KAFKA_TOPIC_NAME=$4 + CONSUMER_HONO_TENANT_ID=$4 FORWARDER_CONFIG_FOLDER=$5 FORWARDER_MQTT_ENV_FILE_PATH=$6 echo "Creating Docker Compose env file ${ENV_FILE_PATH} ..." cat < "${ENV_FILE_PATH}" FMS_CONSUMER_CONFIG_FOLDER=${CONSUMER_CONFIG_FOLDER} FMS_CONSUMER_KAFKA_PROPERTIES_FILE=${CONSUMER_KAFKA_PROPERTIES_FILE_NAME} -FMS_CONSUMER_KAFKA_TOPIC_NAME=${CONSUMER_KAFKA_TOPIC_NAME} +FMS_CONSUMER_HONO_TENANT_ID=${CONSUMER_HONO_TENANT_ID} FMS_FORWARDER_CONFIG_FOLDER=${FORWARDER_CONFIG_FOLDER} FMS_FORWARDER_MQTT_ENV_FILE=${FORWARDER_MQTT_ENV_FILE_PATH} EOF diff --git a/create-config-hono.sh b/create-config-hono.sh index 4e62b27..1350355 100755 --- a/create-config-hono.sh +++ b/create-config-hono.sh @@ -249,6 +249,7 @@ group.id=fms-demo-consumer enable.partition.eof=false session.timeout.ms=6000 enable.auto.commit=true +allow.auto.create.topics=true security.protocol=SASL_SSL sasl.mechanism=SCRAM-SHA-512 sasl.username=${HONO_KAFKA_USER} @@ -288,6 +289,6 @@ create_docker_compose_env \ "${CONFIG_DIR_BASE}/hono.env" \ "${CONFIG_DIR_FMS_CONSUMER}" \ "kafka.properties" \ - "hono.telemetry.${HONO_TENANT_ID}" \ + "${HONO_TENANT_ID}" \ "${CONFIG_DIR_FMS_FORWARDER}" \ "${MQTT_PROPS_FILE}" diff --git a/fms-blueprint-compose-hono.yaml b/fms-blueprint-compose-hono.yaml index 47c1b9d..63ccb79 100644 --- a/fms-blueprint-compose-hono.yaml +++ b/fms-blueprint-compose-hono.yaml @@ -20,32 +20,11 @@ services: fms-consumer: command: "hono" - image: "ghcr.io/eclipse-sdv-blueprints/fleet-management/fms-consumer:main" - build: - context: "./components" - dockerfile: "Dockerfile.fms-consumer" - container_name: "fms-consumer" - cap_drop: - - CAP_MKNOD - - CAP_NET_RAW - - CAP_AUDIT_WRITE - networks: - - "fms-backend" - depends_on: - influxdb: - condition: service_healthy - env_file: - - "./influxdb/fms-demo.env" environment: - INFLUXDB_TOKEN_FILE: "/tmp/fms-demo.token" + HONO_TENANT_ID: "${FMS_CONSUMER_HONO_TENANT_ID}" KAFKA_PROPERTIES_FILE: "/app/config/${FMS_CONSUMER_KAFKA_PROPERTIES_FILE:-kafka.properties}" - KAFKA_TOPIC_NAME: "${FMS_CONSUMER_KAFKA_TOPIC_NAME}" - RUST_LOG: "${FMS_CONSUMER_LOG_CONFIG:-info,fms_consumer=debug,influx_client=debug}" + RUST_LOG: "${FMS_CONSUMER_LOG_CONFIG:-info,fms_consumer=debug,influx_client=debug,up_transport_hono_kafka=info}" volumes: - - type: "volume" - source: "influxdb-auth" - target: "/tmp" - read_only: true - type: "bind" source: "${FMS_CONSUMER_CONFIG_FOLDER}" target: "/app/config" @@ -53,6 +32,9 @@ services: command: "hono" env_file: - "${FMS_FORWARDER_MQTT_ENV_FILE}" + environment: + RUST_LOG: "${FMS_FORWARDER_LOG_CONFIG:-info,fms_forwarder=info,up_transport_hono_mqtt=info}" + volumes: - type: "bind" source: "${FMS_FORWARDER_CONFIG_FOLDER}" diff --git a/fms-blueprint-compose-zenoh.yaml b/fms-blueprint-compose-zenoh.yaml index ce9a6f9..67ffd76 100644 --- a/fms-blueprint-compose-zenoh.yaml +++ b/fms-blueprint-compose-zenoh.yaml @@ -22,7 +22,7 @@ services: command: -c /zenoh-config.json5 environment: RUST_LOG: zenoh=info - image: eclipse/zenoh:1.0.0 + image: eclipse/zenoh:1.1.0 container_name: "fms-zenoh-router" networks: - "fms-backend" @@ -31,7 +31,7 @@ services: - 7447:7447/tcp restart: unless-stopped volumes: - - ./zenoh-config-router.json5:/zenoh-config.json5 + - ./config/zenoh/config-router.json5:/zenoh-config.json5 fms-forwarder: command: "zenoh -c /zenoh-config.json5" @@ -39,34 +39,14 @@ services: fms-zenoh-router: condition: service_started volumes: - - ./zenoh-config-client.json5:/zenoh-config.json5 + - ./config/zenoh/config-client.json5:/zenoh-config.json5 fms-consumer: command: "zenoh -c /zenoh-config.json5" - image: "ghcr.io/eclipse-sdv-blueprints/fleet-management/fms-consumer:main" - build: - context: "./components" - dockerfile: "Dockerfile.fms-consumer" - container_name: "fms-consumer" - cap_drop: - - CAP_MKNOD - - CAP_NET_RAW - - CAP_AUDIT_WRITE - networks: - - "fms-backend" depends_on: influxdb: condition: service_healthy fms-zenoh-router: condition: service_started - env_file: - - "./influxdb/fms-demo.env" - environment: - INFLUXDB_TOKEN_FILE: "/tmp/fms-demo.token" - RUST_LOG: "${FMS_CONSUMER_LOG_CONFIG:-info,fms_consumer=debug,influx_client=debug}" volumes: - - ./zenoh-config-client.json5:/zenoh-config.json5 - - type: "volume" - source: "influxdb-auth" - target: "/tmp" - read_only: true + - ./config/zenoh/config-client.json5:/zenoh-config.json5 diff --git a/fms-blueprint-compose.yaml b/fms-blueprint-compose.yaml index 23e54ad..2405ef4 100644 --- a/fms-blueprint-compose.yaml +++ b/fms-blueprint-compose.yaml @@ -144,6 +144,31 @@ services: RUST_LOG: "info" # for the time being, we do not use TLS secured connections to Databroker command: "--insecure" + fms-consumer: + image: "ghcr.io/eclipse-sdv-blueprints/fleet-management/fms-consumer:main" + build: + context: "./components" + dockerfile: "Dockerfile.fms-consumer" + container_name: "fms-consumer" + cap_drop: + - CAP_MKNOD + - CAP_NET_RAW + - CAP_AUDIT_WRITE + networks: + - "fms-backend" + depends_on: + influxdb: + condition: service_healthy + env_file: + - "./influxdb/fms-demo.env" + environment: + INFLUXDB_TOKEN_FILE: "/tmp/fms-demo.token" + RUST_LOG: "${FMS_CONSUMER_LOG_CONFIG:-info,fms_consumer=debug,influx_client=debug}" + volumes: + - type: "volume" + source: "influxdb-auth" + target: "/tmp" + read_only: true fms-forwarder: image: "ghcr.io/eclipse-sdv-blueprints/fleet-management/fms-forwarder:main" build: &fms-forwarder-build @@ -159,7 +184,6 @@ services: condition: service_healthy databroker: condition: service_started - command: "influx" env_file: "${FMS_FORWARDER_PROPERTIES_FILE:-./influxdb/fms-demo.env}" environment: INFLUXDB_TOKEN_FILE: "/etc/forwarder/fms-demo.token" diff --git a/img/architecture-hono.drawio.license b/img/architecture-hono.drawio.license new file mode 100644 index 0000000..59baed3 --- /dev/null +++ b/img/architecture-hono.drawio.license @@ -0,0 +1,18 @@ +# SPDX-FileCopyrightText: 2023 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 diff --git a/img/architecture-uprotocol.drawio.license b/img/architecture-uprotocol.drawio.license new file mode 100644 index 0000000..59baed3 --- /dev/null +++ b/img/architecture-uprotocol.drawio.license @@ -0,0 +1,18 @@ +# SPDX-FileCopyrightText: 2023 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 diff --git a/img/architecture-uprotocol.drawio.svg b/img/architecture-uprotocol.drawio.svg new file mode 100644 index 0000000..f0400ef --- /dev/null +++ b/img/architecture-uprotocol.drawio.svg @@ -0,0 +1,4 @@ + + + +



Databroker
Databroker...
<<uEntity>>
FMS
Forwarder
<<uEntity>>FMS...


<<get dashboard>>
<<get dashboard>>
Browser
Browser
FMS
Server
FMS...
Fleet
Management
Fleet...
Influx API 2.0
I...
rFMS
rFMS
Influx API 2.0
I...
kuksa.val.v1
kuksa.val.v1
VSS overlay
VSS overlay
In-Vehicle
In-Vehicle
Off-Vehicle
Off-Vehicle



CSV Provider
CSV Provider...
CSV recording from truck
CSV recording...
kuksa.val.v1  
kuksa.val.v1  
<<uService>>
FMS
Consumer
<<uService>>FMS...
uProtocol
uProtocol
Influx API 2.0
Influx API 2.0
Text is not SVG - cannot display
\ No newline at end of file diff --git a/img/architecture-zenoh.drawio.license b/img/architecture-zenoh.drawio.license new file mode 100644 index 0000000..59baed3 --- /dev/null +++ b/img/architecture-zenoh.drawio.license @@ -0,0 +1,18 @@ +# SPDX-FileCopyrightText: 2023 Contributors to the Eclipse Foundation +# +# See the NOTICE file(s) distributed with this work for additional +# information regarding copyright ownership. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 diff --git a/img/architecture.drawio.svg b/img/architecture.drawio.svg deleted file mode 100644 index 3dd9842..0000000 --- a/img/architecture.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -



Databroker
Databroker...
FMS
Forwarder
FMS...


<<get dashboard>>
<<get dashboard>>
Browser
Browser
FMS
Server
FMS...
Fleet
Management
Fleet...
Influx API 2.0
I...
rFMS
rFMS
Influx API 2.0
I...
kuksa.val.v1
kuksa.val.v1
VSS overlay
VSS overlay
In-Vehicle
In-Vehicle
Off-Vehicle
Off-Vehicle



CSV Provider
CSV Provider...
CSV recording from truck
CSV recording...
kuksa.val.v1  
kuksa.val.v1  
Influx
API 2.0
In...
Text is not SVG - cannot display
\ No newline at end of file