├── .github └── workflows │ ├── coverage-template.yaml │ ├── documentation.yaml │ └── release.yaml ├── .gitignore ├── .gitmodules ├── .goreleaser.yaml ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── NOTICE.md ├── README.md ├── SECURITY.md ├── build ├── 80-kanto.preset ├── postinst ├── postinst_rpm ├── postrm ├── postrm_rpm ├── prerm ├── prerm_rpm └── suite-connector.conf ├── integration ├── c2e-setup │ ├── go.mod │ ├── go.sum │ ├── main.go │ └── payload.go └── util │ ├── common.go │ ├── config.go │ ├── go.mod │ ├── go.sum │ ├── mqtt_client.go │ ├── registry.go │ ├── suite.go │ └── web.go ├── logo ├── kanto.svg └── kanto_v1.svg ├── quickstart ├── hono_commands.py ├── hono_commands_fb.py ├── hono_commands_fu.py ├── hono_commands_ldt.py ├── hono_commands_sm.py ├── hono_commands_su.py ├── hono_commands_um.py ├── hono_events.py ├── hono_provisioning.sh ├── install_ctrd.sh ├── install_hello.sh └── requirements.txt └── web ├── .gitignore ├── README.md ├── build-site.sh ├── netlify.toml └── site ├── assets ├── icons │ ├── connected.svg │ ├── containerized.svg │ ├── flexible.svg │ ├── lightweight.svg │ ├── logo.svg │ ├── note.svg │ ├── tip.svg │ └── warn.svg └── scss │ ├── _alerts.scss │ ├── _alignments.scss │ ├── _backgrounds.scss │ ├── _borders.scss │ ├── _buttons.scss │ ├── _code.scss │ ├── _colors.scss │ ├── _images.scss │ ├── _links.scss │ ├── _logo.scss │ ├── _nav.scss │ ├── _screen.scss │ ├── _styles_project.scss │ └── _variables_project.scss ├── content ├── _index.html ├── about │ ├── _index.html │ ├── features.md │ ├── motivation.md │ └── overview.md ├── community │ └── _index.md ├── docs │ ├── _index.md │ ├── concepts │ │ ├── _index.md │ │ ├── aws-connector.md │ │ ├── container-management.md │ │ ├── file-upload.md │ │ ├── local-digital-twins.md │ │ ├── software-update.md │ │ ├── suite-connector.md │ │ └── update-manager.md │ ├── getting-started │ │ ├── _index.md │ │ ├── hono.md │ │ └── install.md │ ├── how-to-guides │ │ ├── _index.md │ │ ├── backup-restore-files.md │ │ ├── build-yocto-image-raspberry-pi.md │ │ ├── monitor-system-metrics.md │ │ ├── offline-edge-device.md │ │ ├── update-software-um.md │ │ ├── update-software.md │ │ ├── upload-files.md │ │ └── verify-signed-container-images.md │ └── references │ │ ├── _index.md │ │ ├── connectivity │ │ ├── _index.md │ │ ├── aws-connector-config.md │ │ ├── azure-connector-config.md │ │ ├── local-digital-twins-config.md │ │ └── suite-connector-config.md │ │ ├── containers │ │ ├── _index.md │ │ ├── api-reference │ │ │ ├── _index.md │ │ │ ├── container-factory.md │ │ │ ├── container.md │ │ │ ├── metrics.md │ │ │ └── software-updatable.md │ │ ├── container-component-config.md │ │ ├── container-config.md │ │ └── container-manager-config.md │ │ ├── file-backup │ │ ├── _index.md │ │ ├── file-backup-api.md │ │ └── file-backup-config.md │ │ ├── file-upload │ │ ├── _index.md │ │ ├── file-upload-api.md │ │ └── file-upload-config.md │ │ ├── software-updatable │ │ ├── _index.md │ │ ├── software-updatable-api.md │ │ └── software-update-config.md │ │ ├── system-metrics │ │ ├── _index.md │ │ ├── system-metrics-api.md │ │ └── system-metrics-config.md │ │ └── update-manager │ │ ├── _index.md │ │ ├── update-manager-api.md │ │ └── update-manager-config.md ├── kanto_background.png └── search.md ├── go.mod ├── go.sum ├── hugo.toml ├── layouts ├── 404.html ├── home.html ├── partials │ ├── architecture.html │ ├── community_links.html │ ├── footer.html │ ├── hooks │ │ └── body-end.html │ ├── kanto-container.html │ ├── navbar.html │ ├── page-meta-lastmod.html │ ├── page-meta-links.html │ ├── pager.html │ └── toc.html └── shortcodes │ ├── blocks │ ├── cover.html │ └── section.html │ ├── home-about.html │ ├── home-component-list.html │ ├── home-component.html │ ├── include.html │ ├── note.html │ ├── page.html │ ├── refn.html │ ├── relrefn.html │ ├── tip.html │ └── warn.html ├── package-lock.json ├── package.json └── static ├── css └── prism.css ├── favicons ├── _head.html ├── apple-touch-icon.png ├── favicon-16x16.png ├── favicon-32x32.png └── favicon.ico ├── googlef3e6aa07fecc4b79.html ├── images ├── docs │ ├── concepts │ │ ├── aws-connector.odg │ │ ├── aws-connector.png │ │ ├── container-management.odg │ │ ├── container-management.png │ │ ├── file-upload.odg │ │ ├── file-upload.png │ │ ├── local-digital-twins.odg │ │ ├── local-digital-twins.png │ │ ├── software-update.odg │ │ ├── software-update.png │ │ ├── suite-connector.odg │ │ ├── suite-connector.png │ │ ├── update-manager.odg │ │ └── update-manager.png │ └── how-to-guides │ │ ├── login_page.png │ │ ├── runqemu_qemuarm64.png │ │ └── verify_kanto_components.png ├── home │ ├── eclipse-kanto-long.odg │ └── eclipse-kanto-long.png └── logos │ ├── eclipse │ ├── eclipse_incubation_horizontal.svg │ └── new_iot_logo_clr -white.svg │ └── kanto.png └── js └── prism.js /.github/workflows/coverage-template.yaml: -------------------------------------------------------------------------------- 1 | on: 2 | workflow_call: 3 | inputs: 4 | coverage-command: 5 | required: true 6 | type: string 7 | 8 | jobs: 9 | coverage: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v2 13 | - uses: actions/setup-go@v2 14 | with: 15 | go-version: '1.21.0' 16 | - name: Generate coverage profile 17 | run: ${{ inputs.coverage-command }} 18 | - name: Update coverage report 19 | uses: ncruces/go-coverage-report@v0 20 | with: 21 | coverage-file: coverage.out 22 | report: false 23 | chart: false 24 | amend: true 25 | reuse-go: true -------------------------------------------------------------------------------- /.github/workflows/documentation.yaml: -------------------------------------------------------------------------------- 1 | name: Documentation 2 | 3 | on: 4 | issues: 5 | types: 6 | - closed 7 | 8 | env: 9 | WEBSITE_CONTENT_DIR: hugo-public-dist 10 | WEBSITE_SOURCES_DIR: web/site 11 | WEBSITE_REF: website 12 | 13 | jobs: 14 | build: 15 | runs-on: ubuntu-latest 16 | concurrency: 17 | group: ${{ github.workflow }}-${{ github.ref }} 18 | if: contains( github.event.issue.labels.*.name, 'documentation') 19 | steps: 20 | - uses: actions/checkout@v3 21 | with: 22 | submodules: recursive 23 | fetch-depth: 0 24 | - name: Checkout website content 25 | uses: actions/checkout@v3 26 | with: 27 | ref: ${{ env.WEBSITE_REF }} 28 | token: ${{ secrets.GITHUB_TOKEN }} 29 | path: ${{ env.WEBSITE_CONTENT_DIR }} 30 | 31 | - name: Setup Go 32 | uses: actions/setup-go@v2 33 | with: 34 | go-version: 1.21.9 35 | 36 | - name: Setup Hugo 37 | uses: peaceiris/actions-hugo@v2 38 | with: 39 | hugo-version: '0.122.0' 40 | extended: true 41 | 42 | - name: Setup Node 43 | uses: actions/setup-node@v3 44 | with: 45 | node-version: '18' 46 | 47 | - name: Cache dependencies 48 | uses: actions/cache@v2 49 | with: 50 | path: ~/.npm 51 | key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} 52 | restore-keys: | 53 | ${{ runner.os }}-node- 54 | 55 | - name: Install NPM dependencies 56 | working-directory: ${{ env.WEBSITE_SOURCES_DIR }} 57 | run: npm ci 58 | 59 | - name: Prune current content 60 | working-directory: ${{ env.WEBSITE_CONTENT_DIR }} 61 | run: git rm -rf * 62 | 63 | - name: Build website 64 | working-directory: ${{ env.WEBSITE_SOURCES_DIR }} 65 | run: hugo --minify -d ${{ github.workspace }}/${{ env.WEBSITE_CONTENT_DIR }} 66 | 67 | - name: Check for content changes 68 | id: git-check 69 | working-directory: ${{ env.WEBSITE_CONTENT_DIR }} 70 | run: | 71 | git add -A 72 | echo ::set-output name=modified::$(if git diff --cached --exit-code --quiet; then echo "false"; else echo "true"; fi) 73 | 74 | - name: Push content changes 75 | if: steps.git-check.outputs.modified == 'true' 76 | working-directory: ${{ env.WEBSITE_CONTENT_DIR }} 77 | run: | 78 | git config user.name github-actions 79 | git config user.email github-actions@github.com 80 | git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }} 81 | git commit -am "[#${{ github.event.issue.number }}] Automated content build" 82 | git push origin ${{ env.WEBSITE_REF }} 83 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .vscode/ 3 | build-tmp/ 4 | dist/ 5 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "web/site/themes/docsy"] 2 | path = web/site/themes/docsy 3 | url = https://github.com/google/docsy 4 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Community Code of Conduct 2 | 3 | **Version 1.2 4 | August 19, 2020** 5 | 6 | ## Our Pledge 7 | 8 | In the interest of fostering an open and welcoming environment, we as community members, contributors, committers, and project leaders pledge to make participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. 9 | 10 | ## Our Standards 11 | 12 | Examples of behavior that contributes to creating a positive environment include: 13 | 14 | * Using welcoming and inclusive language 15 | * Being respectful of differing viewpoints and experiences 16 | * Gracefully accepting constructive criticism 17 | * Focusing on what is best for the community 18 | * Showing empathy towards other community members 19 | 20 | Examples of unacceptable behavior by participants include: 21 | 22 | * The use of sexualized language or imagery and unwelcome sexual attention or advances 23 | * Trolling, insulting/derogatory comments, and personal or political attacks 24 | * Public or private harassment 25 | * Publishing others' private information, such as a physical or electronic address, without explicit permission 26 | * Other conduct which could reasonably be considered inappropriate in a professional setting 27 | 28 | ## Our Responsibilities 29 | 30 | With the support of the Eclipse Foundation staff (the “Staff”), project committers and leaders are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. 31 | 32 | Project committers and leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 33 | 34 | ## Scope 35 | 36 | This Code of Conduct applies within all project spaces, and it also applies when an individual is representing the Eclipse Foundation project or its community in public spaces. Examples of representing a project or community include posting via an official social media account, or acting as a project representative at an online or offline event. Representation of a project may be further defined and clarified by project committers, leaders, or the EMO. 37 | 38 | ## Enforcement 39 | 40 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the Staff at codeofconduct@eclipse.org. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The Staff is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. 41 | 42 | Project committers or leaders who do not follow the Code of Conduct in good faith may face temporary or permanent repercussions as determined by the Staff. 43 | 44 | ## Attribution 45 | 46 | This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org) , version 1.4, available at [https://www.contributor-covenant.org/version/1/4/code-of-conduct.html](https://www.contributor-covenant.org/version/1/4/code-of-conduct/) 47 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How to Contribute to Eclipse Kanto 2 | 3 | First of all, thanks for considering to contribute to Eclipse Kanto. We really 4 | appreciate the time and effort you want to spend helping to improve things around here. 5 | 6 | In order to get you started as fast as possible we need to go through some organizational issues first, though. 7 | 8 | ## Eclipse Contributor Agreement 9 | 10 | Before your contribution can be accepted by the project team contributors must 11 | electronically sign the Eclipse Contributor Agreement (ECA). 12 | 13 | * http://www.eclipse.org/legal/ECA.php 14 | 15 | Commits that are provided by non-committers must have a Signed-off-by field in 16 | the footer indicating that the author is aware of the terms by which the 17 | contribution has been provided to the project. The non-committer must 18 | additionally have an Eclipse Foundation account and must have a signed Eclipse 19 | Contributor Agreement (ECA) on file. 20 | 21 | For more information, please see the Eclipse Committer Handbook: 22 | https://www.eclipse.org/projects/handbook/#resources-commit 23 | 24 | ## Code Style Guide 25 | 26 | * Keep the code well-formatted through: `gofmt` 27 | * Keep the code error-free through: `go vet` and `golint` 28 | * Avoid common mistakes and pitfalls following: [Go Code Review Comments](https://github.com/golang/go/wiki/CodeReviewComments) 29 | 30 | ## Making Your Changes 31 | 32 | * Fork the repository on GitHub. 33 | * Create a new branch for your changes. 34 | * Make your changes following the code style guide (see Code Style Guide section above). 35 | * When you create new files make sure you include a proper license header at the top of the file (see License Header section below). 36 | * Make sure you include test cases for non-trivial features. 37 | * Make sure test cases provide sufficient code coverage (see GitHub actions for minimal accepted coverage). 38 | * Make sure the test suite passes after your changes. 39 | * Commit your changes into that branch. 40 | * Use descriptive and meaningful commit messages. Start the first line of the commit message with the issue number and titile e.g. `[#9865] Add token based authentication`. 41 | * Squash multiple commits that are related to each other semantically into a single one. 42 | * Make sure you use the `-s` flag when committing as explained above. 43 | * Push your changes to your branch in your forked repository. 44 | 45 | ## License Header 46 | 47 | Please make sure any file you newly create contains a proper license header like this: 48 | 49 | Adjusted for Go files: 50 | ```go 51 | // Copyright (c) {year} Contributors to the Eclipse Foundation 52 | // 53 | // See the NOTICE file(s) distributed with this work for additional 54 | // information regarding copyright ownership. 55 | // 56 | // This program and the accompanying materials are made available under the 57 | // terms of the Eclipse Public License 2.0 which is available at 58 | // https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 59 | // which is available at https://www.apache.org/licenses/LICENSE-2.0. 60 | // 61 | // SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 62 | ``` 63 | 64 | ## Submitting the Changes 65 | 66 | Submit a pull request via the normal GitHub UI. 67 | 68 | ## After Submitting 69 | 70 | * Do not use your branch for any other development, otherwise further changes that you make will be visible in the PR. 71 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Kanto logo](https://github.com/eclipse-kanto/kanto/raw/main/logo/kanto.svg)](https://eclipse.dev/kanto/) 2 | 3 | # Eclipse Kanto 4 | 5 | The Eclipse Kanto project brings cloud-native technologies like containerization 6 | and control planes at the edge, to seamlessly manage diverse software on 7 | constrained edge devices like vehicle computers, connected building gateways, 8 | connected appliance and equipment, machines and more. 9 | 10 | Eclipse Kanto is implemented in Go to naturally integrate with existing 11 | technologies, frameworks and ecosystems, meet footprint and (near) real-time 12 | constraints, leverage modern development toolchains and ensure optimal learning 13 | curve for IoT and open source developers. As Eclipse Kanto is modular by nature, 14 | new components can also be implemented in other languages like Rust, C/C++ 15 | depending on the use cases and problems they solve. Whatever the language, 16 | everyone is more than welcome onboard to learn, collaborate and contribute on 17 | each and every step on the way forward. 18 | 19 | ## Community 20 | 21 | * [GitHub Issues](https://github.com/eclipse-kanto/kanto/issues) 22 | * [Mailing List](https://accounts.eclipse.org/mailing-list/kanto-dev) 23 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | This project implements the Eclipse Foundation Security Policy 4 | 5 | * https://www.eclipse.org/security 6 | 7 | ## Reporting a Vulnerability 8 | 9 | Please report vulnerabilities to the Eclipse Foundation Security Team at 10 | security@eclipse.org 11 | -------------------------------------------------------------------------------- /build/80-kanto.preset: -------------------------------------------------------------------------------- 1 | # Enable all Kanto-related services 2 | 3 | # Enable containerd and mosquitto 4 | enable containerd.service 5 | enable mosquitto.service 6 | 7 | # Enable the Kanto services 8 | enable suite-connector.service 9 | enable container-management.service 10 | enable file-upload.service 11 | enable software-update.service 12 | enable file-backup.service 13 | enable system-metrics.service 14 | enable kanto-update-manager.service -------------------------------------------------------------------------------- /build/postinst_rpm: -------------------------------------------------------------------------------- 1 | if [ $1 -eq 1 ] && [ -x "/usr/lib/systemd/systemd-update-helper" ]; then 2 | # Initial installation 3 | 4 | # Handle dependent services installation and start up 5 | /usr/lib/systemd/systemd-update-helper install-system-units mosquitto.service || : 6 | /usr/lib/systemd/systemd-update-helper install-system-units containerd.service || : 7 | 8 | # Configure Mosquitto to look for the suite-connector config file 9 | echo "include_dir /etc/mosquitto/conf.d" >> /etc/mosquitto/mosquitto.conf || : 10 | /usr/lib/systemd/systemd-update-helper mark-restart-system-units mosquitto.service || : 11 | 12 | # Install the Kanto services 13 | /usr/lib/systemd/systemd-update-helper install-system-units suite-connector.service || : 14 | /usr/lib/systemd/systemd-update-helper install-system-units azure-connector.service || : 15 | /usr/lib/systemd/systemd-update-helper install-system-units aws-connector.service || : 16 | /usr/lib/systemd/systemd-update-helper install-system-units local-digital-twins.service || : 17 | /usr/lib/systemd/systemd-update-helper install-system-units container-management.service || : 18 | /usr/lib/systemd/systemd-update-helper install-system-units file-upload.service || : 19 | /usr/lib/systemd/systemd-update-helper install-system-units software-update.service || : 20 | /usr/lib/systemd/systemd-update-helper install-system-units file-backup.service || : 21 | /usr/lib/systemd/systemd-update-helper install-system-units system-metrics.service || : 22 | /usr/lib/systemd/systemd-update-helper install-system-units kanto-update-manager.service || : 23 | 24 | # Start the Kanto services if enabled 25 | if [ -d /run/systemd/system ]; then 26 | systemctl is-enabled -q suite-connector.service && systemctl start suite-connector.service >/dev/null || : 27 | systemctl is-enabled -q azure-connector.service && systemctl start azure-connector.service >/dev/null || : 28 | systemctl is-enabled -q aws-connector.service && systemctl start aws-connector.service >/dev/null || : 29 | systemctl is-enabled -q local-digital-twins.service && systemctl start local-digital-twins.service >/dev/null || : 30 | systemctl is-enabled -q container-management.service && systemctl start container-management.service >/dev/null || : 31 | systemctl is-enabled -q file-upload.service && systemctl start file-upload.service >/dev/null || : 32 | systemctl is-enabled -q software-update.service && systemctl start software-update.service >/dev/null || : 33 | systemctl is-enabled -q file-backup.service && systemctl start file-backup.service >/dev/null || : 34 | systemctl is-enabled -q system-metrics.service && systemctl start system-metrics.service >/dev/null || : 35 | systemctl is-enabled -q kanto-update-manager.service && systemctl start kanto-update-manager.service >/dev/null || : 36 | fi 37 | fi 38 | -------------------------------------------------------------------------------- /build/postrm: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Automatically added by dh_systemd_start/12.1.1bv2019.0b1 3 | if [ -d /run/systemd/system ]; then 4 | systemctl --system daemon-reload >/dev/null || true 5 | fi 6 | # End automatically added section 7 | # Automatically added by dh_systemd_enable/12.1.1bv2019.0b1 8 | if [ "$1" = "remove" ]; then 9 | if [ -x "/usr/bin/deb-systemd-helper" ]; then 10 | deb-systemd-helper mask 'kanto-update-manager.service' >/dev/null || true 11 | deb-systemd-helper mask 'system-metrics.service' >/dev/null || true 12 | deb-systemd-helper mask 'file-backup.service' >/dev/null || true 13 | deb-systemd-helper mask 'software-update.service' >/dev/null || true 14 | deb-systemd-helper mask 'file-upload.service' >/dev/null || true 15 | deb-systemd-helper mask 'container-management.service' >/dev/null || true 16 | deb-systemd-helper mask 'local-digital-twins.service' >/dev/null || true 17 | deb-systemd-helper mask 'aws-connector.service' >/dev/null || true 18 | deb-systemd-helper mask 'azure-connector.service' >/dev/null || true 19 | deb-systemd-helper mask 'suite-connector.service' >/dev/null || true 20 | fi 21 | fi 22 | 23 | if [ "$1" = "purge" ]; then 24 | if [ -x "/usr/bin/deb-systemd-helper" ]; then 25 | deb-systemd-helper purge 'kanto-update-manager.service' >/dev/null || true 26 | deb-systemd-helper unmask 'kanto-update-manager.service' >/dev/null || true 27 | deb-systemd-helper purge 'system-metrics.service' >/dev/null || true 28 | deb-systemd-helper unmask 'system-metrics.service' >/dev/null || true 29 | deb-systemd-helper purge 'file-backup.service' >/dev/null || true 30 | deb-systemd-helper unmask 'file-backup.service' >/dev/null || true 31 | deb-systemd-helper purge 'software-update.service' >/dev/null || true 32 | deb-systemd-helper unmask 'software-update.service' >/dev/null || true 33 | deb-systemd-helper purge 'file-upload.service' >/dev/null || true 34 | deb-systemd-helper unmask 'file-upload.service' >/dev/null || true 35 | deb-systemd-helper purge 'container-management.service' >/dev/null || true 36 | deb-systemd-helper unmask 'container-management.service' >/dev/null || true 37 | deb-systemd-helper purge 'local-digital-twins.service' >/dev/null || true 38 | deb-systemd-helper unmask 'local-digital-twins.service' >/dev/null || true 39 | deb-systemd-helper purge 'aws-connector.service' >/dev/null || true 40 | deb-systemd-helper unmask 'aws-connector.service' >/dev/null || true 41 | deb-systemd-helper purge 'azure-connector.service' >/dev/null || true 42 | deb-systemd-helper unmask 'azure-connector.service' >/dev/null || true 43 | deb-systemd-helper purge 'suite-connector.service' >/dev/null || true 44 | deb-systemd-helper unmask 'suite-connector.service' >/dev/null || true 45 | fi 46 | fi 47 | if [ "$1" = "remove" ] || [ "$1" = "purge" ]; then 48 | deb-systemd-invoke restart 'mosquitto.service' >/dev/null || true 49 | fi 50 | # End automatically added section 51 | -------------------------------------------------------------------------------- /build/postrm_rpm: -------------------------------------------------------------------------------- 1 | if [ $1 -ge 1 ] && [ -x "/usr/lib/systemd/systemd-update-helper" ]; then 2 | # Package upgrade, not uninstall 3 | 4 | # Mark the Kanto services for restart, including ones that are usually disabled by default 5 | /usr/lib/systemd/systemd-update-helper mark-restart-system-units suite-connector.service || : 6 | /usr/lib/systemd/systemd-update-helper mark-restart-system-units azure-connector.service || : 7 | /usr/lib/systemd/systemd-update-helper mark-restart-system-units aws-connector.service || : 8 | /usr/lib/systemd/systemd-update-helper mark-restart-system-units local-digital-twins.service || : 9 | /usr/lib/systemd/systemd-update-helper mark-restart-system-units container-management.service || : 10 | /usr/lib/systemd/systemd-update-helper mark-restart-system-units file-upload.service || : 11 | /usr/lib/systemd/systemd-update-helper mark-restart-system-units software-update.service || : 12 | /usr/lib/systemd/systemd-update-helper mark-restart-system-units file-backup.service || : 13 | /usr/lib/systemd/systemd-update-helper mark-restart-system-units system-metrics.service || : 14 | /usr/lib/systemd/systemd-update-helper mark-restart-system-units kanto-update-manager.service || : 15 | fi 16 | 17 | if [ $1 -eq 0 ] && [ -x "/usr/lib/systemd/systemd-update-helper" ]; then 18 | # Package uninstall, not upgrade 19 | 20 | # If mosquitto is already running, mark it for restarting to pick up the fact that our configs have been removed 21 | /usr/lib/systemd/systemd-update-helper mark-restart-system-units mosquitto.service || : 22 | fi -------------------------------------------------------------------------------- /build/prerm: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | if [ -d /run/systemd/system ] && [ "$1" = remove ]; then 3 | deb-systemd-invoke stop 'kanto-update-manager.service' >/dev/null || true 4 | deb-systemd-invoke stop 'system-metrics.service' >/dev/null || true 5 | deb-systemd-invoke stop 'file-backup.service' >/dev/null || true 6 | deb-systemd-invoke stop 'software-update.service' >/dev/null || true 7 | deb-systemd-invoke stop 'file-upload.service' >/dev/null || true 8 | deb-systemd-invoke stop 'container-management.service' >/dev/null || true 9 | deb-systemd-invoke stop 'local-digital-twins.service' >/dev/null || true 10 | deb-systemd-invoke stop 'azure-connector.service' >/dev/null || true 11 | deb-systemd-invoke stop 'aws-connector.service' >/dev/null || true 12 | deb-systemd-invoke stop 'suite-connector.service' >/dev/null || true 13 | fi -------------------------------------------------------------------------------- /build/prerm_rpm: -------------------------------------------------------------------------------- 1 | if [ $1 -eq 0 ] && [ -x "/usr/lib/systemd/systemd-update-helper" ]; then 2 | # Package removal, not upgrade 3 | 4 | # Remove the Kanto services, including ones that are usually disabled by default 5 | /usr/lib/systemd/systemd-update-helper remove-system-units kanto-update-manager.service || : 6 | /usr/lib/systemd/systemd-update-helper remove-system-units system-metrics.service || : 7 | /usr/lib/systemd/systemd-update-helper remove-system-units file-backup.service || : 8 | /usr/lib/systemd/systemd-update-helper remove-system-units software-update.service || : 9 | /usr/lib/systemd/systemd-update-helper remove-system-units file-upload.service || : 10 | /usr/lib/systemd/systemd-update-helper remove-system-units container-management.service || : 11 | /usr/lib/systemd/systemd-update-helper remove-system-units local-digital-twins.service || : 12 | /usr/lib/systemd/systemd-update-helper remove-system-units azure-connector.service || : 13 | /usr/lib/systemd/systemd-update-helper remove-system-units aws-connector.service || : 14 | /usr/lib/systemd/systemd-update-helper remove-system-units suite-connector.service || : 15 | 16 | # Reload systemd 17 | /usr/lib/systemd/systemd-update-helper system-reload || : 18 | fi 19 | -------------------------------------------------------------------------------- /build/suite-connector.conf: -------------------------------------------------------------------------------- 1 | log_dest topic 2 | log_type notice 3 | log_type subscribe 4 | log_type unsubscribe 5 | -------------------------------------------------------------------------------- /integration/c2e-setup/go.mod: -------------------------------------------------------------------------------- 1 | module github.com/eclipse-kanto/kanto/integration/c2e-setup 2 | 3 | go 1.17 4 | 5 | require ( 6 | github.com/caarlos0/env/v6 v6.10.1 7 | github.com/eclipse-kanto/kanto/integration/util v0.0.0-20240201094116-d9d28a339764 8 | ) 9 | 10 | require ( 11 | github.com/davecgh/go-spew v1.1.1 // indirect 12 | github.com/eclipse/ditto-clients-golang v0.0.0-20220225085802-cf3b306280d3 // indirect 13 | github.com/eclipse/paho.mqtt.golang v1.4.3 // indirect 14 | github.com/google/uuid v1.6.0 // indirect 15 | github.com/gorilla/websocket v1.5.1 // indirect 16 | github.com/pmezard/go-difflib v1.0.0 // indirect 17 | github.com/stretchr/testify v1.8.4 // indirect 18 | golang.org/x/net v0.25.0 // indirect 19 | golang.org/x/sync v0.7.0 // indirect 20 | gopkg.in/yaml.v3 v3.0.1 // indirect 21 | ) 22 | -------------------------------------------------------------------------------- /integration/c2e-setup/payload.go: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2022 Contributors to the Eclipse Foundation 2 | // 3 | // See the NOTICE file(s) distributed with this work for additional 4 | // information regarding copyright ownership. 5 | // 6 | // This program and the accompanying materials are made available under the 7 | // terms of the Eclipse Public License 2.0 which is available at 8 | // https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 9 | // which is available at https://www.apache.org/licenses/LICENSE-2.0. 10 | // 11 | // SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 12 | 13 | package main 14 | 15 | const ( 16 | deviceJSON = `{"authorities":["auto-provisioning-enabled"]}` 17 | 18 | authJSON = `[{ 19 | "type": "hashed-password", 20 | "auth-id": "%s", 21 | "secrets": [{ 22 | "pwd-plain": "%s" 23 | }] 24 | }]` 25 | 26 | thingJSON = `{"policyId": "%s"}` 27 | ) 28 | -------------------------------------------------------------------------------- /integration/util/common.go: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2022 Contributors to the Eclipse Foundation 2 | // 3 | // See the NOTICE file(s) distributed with this work for additional 4 | // information regarding copyright ownership. 5 | // 6 | // This program and the accompanying materials are made available under the 7 | // terms of the Eclipse Public License 2.0 which is available at 8 | // https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 9 | // which is available at https://www.apache.org/licenses/LICENSE-2.0. 10 | // 11 | // SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 12 | 13 | package util 14 | 15 | import ( 16 | "encoding/json" 17 | "fmt" 18 | "os" 19 | ) 20 | 21 | const configDefaultMode = 0666 22 | 23 | // Convert marshals an object(e.g. map) to a JSON payload and unmarshals it to the given structure 24 | func Convert(from interface{}, to interface{}) error { 25 | jsonValue, err := json.Marshal(from) 26 | if err != nil { 27 | return err 28 | } 29 | return json.Unmarshal(jsonValue, to) 30 | } 31 | 32 | // CombineErrors combine multiple errors in one error. 33 | func CombineErrors(errors []error) error { 34 | if errors != nil { 35 | return fmt.Errorf("%s", errors) 36 | } 37 | return nil 38 | } 39 | 40 | // WriteConfigFile writes interface data to the path file, creating it if necessary. 41 | func WriteConfigFile(path string, cfg interface{}) error { 42 | jsonContents, err := json.MarshalIndent(cfg, "", "\t") 43 | if err != nil { 44 | return fmt.Errorf("unable to marshal to json: %v", err) 45 | } 46 | 47 | // Preserve the file mode if the file already exists 48 | mode := getFileModeOrDefault(path, configDefaultMode) 49 | if err = os.WriteFile(path, jsonContents, mode); err != nil { 50 | return fmt.Errorf("unable to save file %s: %v", path, err) 51 | } 52 | return nil 53 | } 54 | 55 | func getFileModeOrDefault(path string, defaultMode os.FileMode) os.FileMode { 56 | fileInfo, err := os.Stat(path) 57 | if err != nil { 58 | return defaultMode 59 | } 60 | return fileInfo.Mode() 61 | } 62 | 63 | // CopyFile copies source file to the destination. 64 | func CopyFile(src, dst string) error { 65 | data, err := os.ReadFile(src) 66 | if err != nil { 67 | return err 68 | } 69 | // If the destination file exists, preserve its file mode. 70 | // If the destination file doesn't exist, use the file mode of the source file or default. 71 | srcMode := getFileModeOrDefault(src, configDefaultMode) 72 | mode := srcMode 73 | if srcMode < configDefaultMode { 74 | mode = configDefaultMode 75 | } 76 | dstMode := getFileModeOrDefault(dst, mode) 77 | err = os.WriteFile(dst, data, dstMode) 78 | if err != nil && mode != srcMode { 79 | return os.Chmod(dst, srcMode) 80 | } 81 | return err 82 | } 83 | -------------------------------------------------------------------------------- /integration/util/config.go: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2022 Contributors to the Eclipse Foundation 2 | // 3 | // See the NOTICE file(s) distributed with this work for additional 4 | // information regarding copyright ownership. 5 | // 6 | // This program and the accompanying materials are made available under the 7 | // terms of the Eclipse Public License 2.0 which is available at 8 | // https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 9 | // which is available at https://www.apache.org/licenses/LICENSE-2.0. 10 | // 11 | // SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 12 | 13 | package util 14 | 15 | import ( 16 | "time" 17 | ) 18 | 19 | // TestConfiguration is a common integration test configuration 20 | type TestConfiguration struct { 21 | LocalBroker string `env:"LOCAL_BROKER" envDefault:"tcp://localhost:1883"` 22 | MQTTQuiesceMS int `env:"MQTT_QUIESCE_MS" envDefault:"500"` 23 | MQTTAcknowledgeTimeoutMS int `env:"MQTT_ACKNOWLEDGE_TIMEOUT_MS" envDefault:"3000"` 24 | MQTTConnectMS int `env:"MQTT_CONNECT_TIMEOUT_MS" envDefault:"30000"` 25 | 26 | DigitalTwinAPIAddress string `env:"DIGITAL_TWIN_API_ADDRESS"` 27 | DigitalTwinAPIUsername string `env:"DIGITAL_TWIN_API_USERNAME" envDefault:"ditto"` 28 | DigitalTwinAPIPassword string `env:"DIGITAL_TWIN_API_PASSWORD" envDefault:"ditto"` 29 | 30 | WSEventTimeoutMS int `env:"WS_EVENT_TIMEOUT_MS" envDefault:"30000"` 31 | } 32 | 33 | // MillisToDuration converts milliseconds to Duration 34 | func MillisToDuration(millis int) time.Duration { 35 | return time.Duration(millis) * time.Millisecond 36 | } 37 | -------------------------------------------------------------------------------- /integration/util/go.mod: -------------------------------------------------------------------------------- 1 | module github.com/eclipse-kanto/kanto/integration/util 2 | 3 | go 1.17 4 | 5 | require ( 6 | github.com/caarlos0/env/v6 v6.10.1 7 | github.com/eclipse/ditto-clients-golang v0.0.0-20220225085802-cf3b306280d3 8 | github.com/eclipse/paho.mqtt.golang v1.4.1 9 | github.com/google/uuid v1.3.0 10 | github.com/stretchr/testify v1.8.1 11 | golang.org/x/net v0.25.0 12 | ) 13 | 14 | require ( 15 | github.com/davecgh/go-spew v1.1.1 // indirect 16 | github.com/gorilla/websocket v1.4.2 // indirect 17 | github.com/pmezard/go-difflib v1.0.0 // indirect 18 | golang.org/x/sync v0.7.0 // indirect 19 | gopkg.in/yaml.v3 v3.0.1 // indirect 20 | ) 21 | -------------------------------------------------------------------------------- /integration/util/mqtt_client.go: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2022 Contributors to the Eclipse Foundation 2 | // 3 | // See the NOTICE file(s) distributed with this work for additional 4 | // information regarding copyright ownership. 5 | // 6 | // This program and the accompanying materials are made available under the 7 | // terms of the Eclipse Public License 2.0 which is available at 8 | // https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 9 | // which is available at https://www.apache.org/licenses/LICENSE-2.0. 10 | // 11 | // SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 12 | 13 | package util 14 | 15 | import ( 16 | "encoding/json" 17 | "errors" 18 | "fmt" 19 | "time" 20 | 21 | "github.com/google/uuid" 22 | 23 | MQTT "github.com/eclipse/paho.mqtt.golang" 24 | ) 25 | 26 | const ( 27 | topicThingCfgRequest = "edge/thing/request" 28 | 29 | topicThingCfgResponse = "edge/thing/response" 30 | 31 | keepAliveTimeout = 20 * time.Second 32 | ) 33 | 34 | // NewMQTTClient creates a new MQTT client and connects it to the broker from the test configuration 35 | func NewMQTTClient(cfg *TestConfiguration) (MQTT.Client, error) { 36 | opts := MQTT.NewClientOptions(). 37 | AddBroker(cfg.LocalBroker). 38 | SetClientID(uuid.New().String()). 39 | SetConnectTimeout(MillisToDuration(cfg.MQTTConnectMS)). 40 | SetKeepAlive(keepAliveTimeout). 41 | SetCleanSession(true). 42 | SetAutoReconnect(true) 43 | 44 | mqttClient := MQTT.NewClient(opts) 45 | 46 | if token := mqttClient.Connect(); token.Wait() && token.Error() != nil { 47 | return nil, token.Error() 48 | } 49 | 50 | return mqttClient, nil 51 | } 52 | 53 | // SendMQTTMessage sends a message to a topic using specified client. The message is serialized to JSON format. 54 | func SendMQTTMessage(cfg *TestConfiguration, client MQTT.Client, topic string, message interface{}) error { 55 | payload, err := json.Marshal(message) 56 | if err != nil { 57 | return err 58 | } 59 | token := client.Publish(topic, 1, false, payload) 60 | timeout := MillisToDuration(cfg.MQTTAcknowledgeTimeoutMS) 61 | if !token.WaitTimeout(timeout) { 62 | return errors.New("timeout while sending MQTT message") 63 | } 64 | return token.Error() 65 | } 66 | 67 | // ThingConfiguration represents information about the configured thing 68 | type ThingConfiguration struct { 69 | DeviceID string `json:"deviceId"` 70 | TenantID string `json:"tenantId"` 71 | PolicyID string `json:"policyId"` 72 | } 73 | 74 | // GetThingConfiguration retrieves information about the configured thing 75 | func GetThingConfiguration(cfg *TestConfiguration, mqttClient MQTT.Client) (*ThingConfiguration, error) { 76 | type result struct { 77 | cfg *ThingConfiguration 78 | err error 79 | } 80 | 81 | ch := make(chan result) 82 | 83 | token := mqttClient.Subscribe(topicThingCfgResponse, 1, func(client MQTT.Client, message MQTT.Message) { 84 | var cfg ThingConfiguration 85 | if err := json.Unmarshal(message.Payload(), &cfg); err != nil { 86 | ch <- result{nil, err} 87 | } 88 | ch <- result{&cfg, nil} 89 | }) 90 | if !token.WaitTimeout(MillisToDuration(cfg.MQTTAcknowledgeTimeoutMS)) { 91 | return nil, errors.New("timeout subscribing to thing configuration response") 92 | } 93 | if token.Error() != nil { 94 | return nil, token.Error() 95 | } 96 | 97 | defer mqttClient.Unsubscribe(topicThingCfgResponse) 98 | 99 | token = mqttClient.Publish(topicThingCfgRequest, 1, false, "") 100 | if !token.WaitTimeout(MillisToDuration(cfg.MQTTAcknowledgeTimeoutMS)) { 101 | return nil, errors.New("timeout publishing thing configuration request") 102 | } 103 | if token.Error() != nil { 104 | return nil, token.Error() 105 | } 106 | 107 | timeout := 5 * time.Second 108 | select { 109 | case result := <-ch: 110 | return result.cfg, result.err 111 | case <-time.After(timeout): 112 | return nil, fmt.Errorf("thing config not received in %v", timeout) 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /integration/util/suite.go: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2022 Contributors to the Eclipse Foundation 2 | // 3 | // See the NOTICE file(s) distributed with this work for additional 4 | // information regarding copyright ownership. 5 | // 6 | // This program and the accompanying materials are made available under the 7 | // terms of the Eclipse Public License 2.0 which is available at 8 | // https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 9 | // which is available at https://www.apache.org/licenses/LICENSE-2.0. 10 | // 11 | // SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 12 | 13 | package util 14 | 15 | import ( 16 | "testing" 17 | 18 | "github.com/caarlos0/env/v6" 19 | 20 | "github.com/eclipse/ditto-clients-golang" 21 | 22 | MQTT "github.com/eclipse/paho.mqtt.golang" 23 | 24 | "github.com/stretchr/testify/require" 25 | ) 26 | 27 | // SuiteInitializer is testify Suite initialization helper 28 | type SuiteInitializer struct { 29 | Cfg *TestConfiguration 30 | 31 | ThingCfg *ThingConfiguration 32 | 33 | DittoClient *ditto.Client 34 | MQTTClient MQTT.Client 35 | } 36 | 37 | // Setup establishes connections to the local MQTT broker and Ditto 38 | func (suite *SuiteInitializer) Setup(t *testing.T) { 39 | cfg := &TestConfiguration{} 40 | 41 | opts := env.Options{RequiredIfNoDef: true} 42 | require.NoError(t, env.Parse(cfg, opts), "failed to process environment variables") 43 | 44 | t.Logf("%#v\n", cfg) 45 | 46 | mqttClient, err := NewMQTTClient(cfg) 47 | require.NoError(t, err, "connect to MQTT broker") 48 | 49 | dittoClient, err := ditto.NewClientMQTT(mqttClient, ditto.NewConfiguration()) 50 | if err == nil { 51 | err = dittoClient.Connect() 52 | } 53 | 54 | if err != nil { 55 | mqttClient.Disconnect(uint(cfg.MQTTQuiesceMS)) 56 | require.NoError(t, err, "initialize ditto client") 57 | } 58 | 59 | suite.Cfg = cfg 60 | suite.DittoClient = dittoClient 61 | suite.MQTTClient = mqttClient 62 | suite.ThingCfg, err = GetThingConfiguration(cfg, mqttClient) 63 | if err != nil { 64 | defer suite.TearDown() 65 | require.NoError(t, err, "cannot get thing configuration") 66 | } 67 | } 68 | 69 | // TearDown closes all connections 70 | func (suite *SuiteInitializer) TearDown() { 71 | suite.DittoClient.Disconnect() 72 | suite.MQTTClient.Disconnect(uint(suite.Cfg.MQTTQuiesceMS)) 73 | } 74 | -------------------------------------------------------------------------------- /logo/kanto.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /logo/kanto_v1.svg: -------------------------------------------------------------------------------- 1 | 2 | 11 | 13 | 15 | 22 | 26 | 30 | 31 | 32 | 35 | 41 | 46 | 51 | 56 | 57 | 60 | 64 | 68 | 72 | 76 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /quickstart/hono_commands_ldt.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024 Contributors to the Eclipse Foundation 2 | # 3 | # See the NOTICE file(s) distributed with this work for additional 4 | # information regarding copyright ownership. 5 | # 6 | # This program and the accompanying materials are made available under the 7 | # terms of the Eclipse Public License 2.0 which is available at 8 | # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 9 | # which is available at https://www.apache.org/licenses/LICENSE-2.0. 10 | # 11 | # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 12 | 13 | import getopt 14 | import json 15 | import os 16 | import signal 17 | import sys 18 | import time 19 | import uuid 20 | from string import Template 21 | import paho.mqtt.client as mqtt 22 | 23 | retrieve_things_template = Template(""" 24 | { 25 | "topic": "_/_/things/twin/commands/retrieve", 26 | "headers": { 27 | "correlation-id": "$correlation_id", 28 | "reply-to": "command/$tenant_id", 29 | "response-required": true 30 | }, 31 | "path": "/", 32 | "value": { 33 | "thingIds": [ 34 | "$namespace:$name", 35 | "$namespace:$name:edge:containers" 36 | ] 37 | } 38 | } 39 | """) 40 | 41 | class MQTTClient(mqtt.Client): 42 | 43 | def on_connect(self, mqttc, obj, flags, rc): 44 | print('[client connected]') 45 | self.subscribe("command//+/req/#") 46 | 47 | def on_message(self, mqttc, obj, msg): 48 | print('[got response]') 49 | payload = str(msg.payload.decode("utf-8")) 50 | print(json.dumps(json.loads(payload), indent=2)) 51 | 52 | def run(self): 53 | self.connect("localhost") 54 | self.loop_start() 55 | time.sleep(2) 56 | namespaced_id = device_id.split(':', 1) 57 | payload = retrieve_things_template.substitute( 58 | namespace=namespaced_id[0], name=namespaced_id[1], 59 | tenant_id=tenant_id, correlation_id=str(uuid.uuid4())) 60 | pub_topic = 'event/{}/{}'.format(tenant_id, device_id) 61 | self.publish(pub_topic, payload) 62 | time.sleep(1) 63 | self.loop_stop() 64 | 65 | # Parse command line args 66 | options, reminder = getopt.getopt(sys.argv[1:], 't:d:') 67 | opts_dict = dict(options) 68 | tenant_id = opts_dict.get('-t') or os.environ["TENANT"] 69 | device_id = opts_dict.get('-d') or os.environ["DEVICE_ID"] 70 | 71 | uri = 'localhost' 72 | print('[starting] demo local digital twins app for tenant [{}], device [{}] at [{}]'.format(tenant_id, device_id, uri)) 73 | 74 | def handler(signum, frame): 75 | print('[stopping] demo local digital twins app for tenant [{}], device [{}] at [{}]'.format(tenant_id, device_id, uri)) 76 | mqttc.loop_stop() 77 | print('[stopped]') 78 | exit(0) 79 | 80 | signal.signal(signal.SIGINT, handler) 81 | mqttc = MQTTClient() 82 | mqttc.run() 83 | print('[stopped] demo local digital twins app for tenant [{}], device [{}] at [{}]'.format(tenant_id, device_id, uri)) -------------------------------------------------------------------------------- /quickstart/hono_events.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022 Contributors to the Eclipse Foundation 2 | # 3 | # See the NOTICE file(s) distributed with this work for additional 4 | # information regarding copyright ownership. 5 | # 6 | # This program and the accompanying materials are made available under the 7 | # terms of the Eclipse Public License 2.0 which is available at 8 | # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 9 | # which is available at https://www.apache.org/licenses/LICENSE-2.0. 10 | # 11 | # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 12 | 13 | import getopt 14 | import json 15 | import os 16 | import signal 17 | import sys 18 | import threading 19 | 20 | from proton.handlers import MessagingHandler 21 | from proton.reactor import Container, AtLeastOnce 22 | 23 | class EventsHandler(MessagingHandler): 24 | def __init__(self, server, address): 25 | super(EventsHandler, self).__init__() 26 | self.server = server 27 | self.address = address 28 | 29 | def on_start(self, event): 30 | conn = event.container.connect(self.server, user="consumer@HONO", password="verysecret") 31 | event.container.create_receiver(conn, source=self.address, options=[AtLeastOnce()]) 32 | print('[connected]') 33 | 34 | def on_message(self, event): 35 | if event.message.body is not None: 36 | body = json.loads(event.message.body) 37 | if topic_filter != "" and topic_filter != body['topic']: 38 | return 39 | print('[event received]') 40 | print(json.dumps(body, indent=2)) 41 | else: 42 | print('[empty event received]') 43 | 44 | 45 | # Parse command line args 46 | options, reminder = getopt.getopt(sys.argv[1:], 't:f:') 47 | opts_dict = dict(options) 48 | tenant_id = os.environ.get("TENANT") or opts_dict['-t'] 49 | if '-f' in opts_dict: 50 | topic_filter = opts_dict['-f'] 51 | else: 52 | topic_filter = "" 53 | 54 | uri = 'amqps://hono.eclipseprojects.io:15671' 55 | address = 'event/{}'.format(tenant_id) 56 | 57 | print('[starting] demo events handler for tenant [{}] at [{}]'.format(tenant_id, uri)) 58 | 59 | events_handler = Container(EventsHandler(uri, address)) 60 | thread = threading.Thread(target=lambda: events_handler.run(), daemon=True) 61 | thread.start() 62 | 63 | 64 | def handler(signum, frame): 65 | print('[stopping] demo events handler for tenant [{}] at [{}]'.format(tenant_id, uri)) 66 | events_handler.stop() 67 | thread.join(timeout=5) 68 | print('[stopped]') 69 | exit(0) 70 | 71 | 72 | signal.signal(signal.SIGINT, handler) 73 | while True: 74 | pass 75 | -------------------------------------------------------------------------------- /quickstart/hono_provisioning.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # Copyright (c) 2022 Contributors to the Eclipse Foundation 4 | # 5 | # See the NOTICE file(s) distributed with this work for additional 6 | # information regarding copyright ownership. 7 | # 8 | # This program and the accompanying materials are made available under the 9 | # terms of the Eclipse Public License 2.0 which is available at 10 | # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 11 | # which is available at https://www.apache.org/licenses/LICENSE-2.0. 12 | # 13 | # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 14 | 15 | # The Hono endpoint to connect to 16 | export HONO_EP=https://hono.eclipseprojects.io:28443 17 | 18 | # The Hono tenant to be created 19 | export TENANT= 20 | # The identifier of the device on the tenant 21 | # Note! It's important for the ID to follow the convention namespace:name (e.g. edge:device) 22 | export DEVICE_ID= 23 | # The authentication identifier of the device 24 | export AUTH_ID= 25 | # A password for the device to authenticate with 26 | export PWD= 27 | 28 | curl -i -X POST $HONO_EP/v1/tenants/$TENANT -H 'accept: application/json' -H 'Content-Type: application/json' --data-binary '{"ext": {"messaging-type": "amqp"}}' 29 | curl -i -X POST $HONO_EP/v1/devices/$TENANT/$DEVICE_ID -H 'Content-Type: application/json' --data-binary '{"authorities":["auto-provisioning-enabled"]}' 30 | curl -i -X PUT -H 'Content-Type: application/json' --data-binary '[{ 31 | "type": "hashed-password", 32 | "auth-id": "'$AUTH_ID'", 33 | "secrets": [{ 34 | "pwd-plain": "'$PWD'" 35 | }] 36 | }]' $HONO_EP/v1/credentials/$TENANT/$DEVICE_ID 37 | -------------------------------------------------------------------------------- /quickstart/install_hello.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Copyright (c) 2022 Contributors to the Eclipse Foundation 4 | # 5 | # See the NOTICE file(s) distributed with this work for additional 6 | # information regarding copyright ownership. 7 | # 8 | # This program and the accompanying materials are made available under the 9 | # terms of the Eclipse Public License 2.0 which is available at 10 | # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 11 | # which is available at https://www.apache.org/licenses/LICENSE-2.0. 12 | # 13 | # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 14 | 15 | apt install hello 16 | -------------------------------------------------------------------------------- /quickstart/requirements.txt: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022 Contributors to the Eclipse Foundation 2 | # 3 | # See the NOTICE file(s) distributed with this work for additional 4 | # information regarding copyright ownership. 5 | # 6 | # This program and the accompanying materials are made available under the 7 | # terms of the Eclipse Public License 2.0 which is available at 8 | # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 9 | # which is available at https://www.apache.org/licenses/LICENSE-2.0. 10 | # 11 | # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 12 | 13 | python-qpid-proton==0.36.0 14 | paho-mqtt==1.6.1 15 | -------------------------------------------------------------------------------- /web/.gitignore: -------------------------------------------------------------------------------- 1 | public/ 2 | node_modules 3 | resources/ 4 | .hugo_build.lock -------------------------------------------------------------------------------- /web/README.md: -------------------------------------------------------------------------------- 1 | [![Kanto logo](https://github.com/eclipse-kanto/kanto/raw/main/logo/kanto.svg)](https://eclipse.dev/kanto/) 2 | 3 | # Eclipse Kanto Site and Documentation 4 | 5 | This is the repository used to build and publish the official Eclipse Kanto [website](https://eclipse.org/kanto/). 6 | 7 | ## Quick start 8 | 9 | We use [Hugo](https://gohugo.io/) and the [Docsy theme](https://docsy.dev/) 10 | to build and render the site. You will need the “extended” 11 | Sass/SCSS version of the Hugo binary to work on this site. We recommend 12 | to use Hugo 0.122.0 or higher. 13 | 14 | Steps needed to have this working locally and work on it: 15 | 16 | - Follow the [Install Hugo](https://www.docsy.dev/docs/get-started/docsy-as-module/) instructions from Docsy 17 | - Clone this repository 18 | - Run `cd site` 19 | - Run `hugo server` 20 | -------------------------------------------------------------------------------- /web/build-site.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Exit on error 3 | set -e 4 | 5 | if [[ -z "${DEPLOY_PRIME_URL}" ]]; then 6 | USE_BASE_URL_SITE="" 7 | else 8 | echo -e "\033[0;32mNetlify DEPLOY_PRIME_URL detected, this seems to be a PR, deployment happening at ${DEPLOY_PRIME_URL}...\033[0m" 9 | USE_BASE_URL_SITE="--baseURL ${DEPLOY_PRIME_URL}" 10 | fi 11 | 12 | echo -e "\033[0;32mDeleting Hugo previously generated directories...\033[0m" 13 | rm -rf site/public 14 | 15 | echo -e "\033[0;32mSwitching to Docsy theme directory...\033[0m" 16 | cd site && npm install 17 | 18 | echo -e "\033[0;32mGenerating Hugo site for website...\033[0m" 19 | hugo --minify ${USE_BASE_URL_SITE} 20 | 21 | echo -e "\033[0;32mDone building site!\033[0m" 22 | -------------------------------------------------------------------------------- /web/netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | publish = "site/public" 3 | command = "chmod +x build-site.sh && ./build-site.sh" 4 | 5 | [build.environment] 6 | GO_VERSION = "1.21.4" 7 | 8 | [context.production.environment] 9 | HUGO_VERSION = "0.122.0" 10 | HUGO_ENV = "production" 11 | 12 | [context.deploy-preview] 13 | command = "chmod +x build-site.sh && ./build-site.sh" 14 | 15 | [context.deploy-preview.environment] 16 | HUGO_VERSION = "0.122.0" 17 | 18 | [context.branch-deploy] 19 | command = "chmod +x build-site.sh && ./build-site.sh" 20 | 21 | [context.branch-deploy.environment] 22 | HUGO_VERSION = "0.122.0" -------------------------------------------------------------------------------- /web/site/assets/icons/connected.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cloud Connected 6 | 7 | 10 | -------------------------------------------------------------------------------- /web/site/assets/icons/containerized.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Containerized 6 | 7 | 10 | -------------------------------------------------------------------------------- /web/site/assets/icons/flexible.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Flexible 7 | 8 | 11 | -------------------------------------------------------------------------------- /web/site/assets/icons/lightweight.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Lightweight 6 | 7 | 10 | -------------------------------------------------------------------------------- /web/site/assets/icons/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/site/assets/icons/note.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Note 6 | 7 | -------------------------------------------------------------------------------- /web/site/assets/icons/tip.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Tip 6 | 7 | -------------------------------------------------------------------------------- /web/site/assets/icons/warn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Warning 6 | 7 | -------------------------------------------------------------------------------- /web/site/assets/scss/_alerts.scss: -------------------------------------------------------------------------------- 1 | .alert-primary { 2 | border-style: solid !important; 3 | border-color: $primary !important; 4 | border-width: 0 0 0 4px !important; 5 | .alert-heading { 6 | color: $primary !important; 7 | } 8 | } 9 | 10 | .alert-dark { 11 | border-style: solid !important; 12 | border-color: $kanto-feature-color !important; 13 | border-width: 0 0 0 4px !important; 14 | .alert-heading { 15 | color: $kanto-feature-color !important; 16 | } 17 | } 18 | 19 | .alert-mid { 20 | border-style: solid !important; 21 | border-color: $kanto-mid-color !important; 22 | border-width: 0 0 0 4px !important; 23 | .alert-heading { 24 | color: $kanto-mid-color !important; 25 | } 26 | } 27 | 28 | .alert-light { 29 | border-style: solid !important; 30 | border-color: $kanto-gold-color !important; 31 | border-width: 0 0 0 4px !important; 32 | .alert-heading { 33 | color: $kanto-gold-color !important; 34 | } 35 | } 36 | 37 | .alert-docs-pic { 38 | float: left; 39 | margin: 0px 5px 0px 0px; 40 | vertical-align: top; 41 | width: 25px; 42 | } 43 | 44 | .alert-docs-container { 45 | display: flex; 46 | padding-left: 10px !important; 47 | } -------------------------------------------------------------------------------- /web/site/assets/scss/_alignments.scss: -------------------------------------------------------------------------------- 1 | .td-search__input { 2 | max-width: 90%; 3 | border-radius: 1rem; 4 | width: 360px; 5 | } 6 | 7 | .td-navbar .navbar-nav { 8 | padding-bottom: 0rem; 9 | padding-top: 0rem; 10 | } 11 | 12 | .block-center { 13 | max-width: 1200px; 14 | margin: 0 auto; 15 | } 16 | 17 | .block-before-ref { 18 | &:before { 19 | display: inline-block; 20 | text-rendering: auto; 21 | padding-top: 2rem; 22 | content: " "; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /web/site/assets/scss/_backgrounds.scss: -------------------------------------------------------------------------------- 1 | #td-cover-block-0 { 2 | background-image: url("/kanto/kanto_background.png"); 3 | } 4 | 5 | .-bg-kanto-primary { 6 | background-attachment: fixed; 7 | background-size: cover; 8 | background-color: $primary; 9 | color: $white; 10 | resize: both; 11 | } 12 | 13 | .-bg-kanto-arch { 14 | background-color: $kanto-arch-color; 15 | background-attachment: fixed; 16 | background-size: cover; 17 | } 18 | 19 | .bg-dark { 20 | background-color: $bg-dark !important; 21 | } 22 | -------------------------------------------------------------------------------- /web/site/assets/scss/_borders.scss: -------------------------------------------------------------------------------- 1 | .border-bottom-light { 2 | border-color: $kanto-gold-color !important; 3 | border-bottom: 1px solid $kanto-gold-color !important; 4 | width: fit-content; 5 | } 6 | 7 | .border-bottom-dark { 8 | border-color: $primary !important; 9 | border-bottom: 1px solid $primary !important; 10 | width: fit-content; 11 | } 12 | -------------------------------------------------------------------------------- /web/site/assets/scss/_buttons.scss: -------------------------------------------------------------------------------- 1 | .title-section { 2 | height: 100px; 3 | display: flex; 4 | justify-content: center; 5 | align-items: center; 6 | color: $primary; 7 | } 8 | 9 | .kanto-button-container { 10 | height: 100px; 11 | width: 100%; 12 | display: flex; 13 | justify-content: center; 14 | align-items: center; 15 | } 16 | 17 | .kanto-button-container a { 18 | text-decoration: none; 19 | } 20 | 21 | .kanto-button { 22 | height: 50px; 23 | width: 170px; 24 | display: flex; 25 | justify-content: center; 26 | align-items: center; 27 | transition: 0.3s; 28 | border-bottom: 1px !important; 29 | border-style: none none solid none !important; 30 | } 31 | 32 | .kanto-button:hover { 33 | border-radius: 0.2rem !important; 34 | } 35 | 36 | .kanto-button.kanto { 37 | color: $primary !important; 38 | border-color: $primary !important; 39 | } 40 | 41 | .kanto-button.kanto:hover { 42 | color: $white !important; 43 | transform: translate(10px,0px); 44 | } 45 | 46 | .kanto-button.kanto-feature { 47 | color: $kanto-feature-color !important; 48 | border-color: $kanto-feature-color !important; 49 | } 50 | 51 | .kanto-button.kanto-feature:hover { 52 | color: $white !important; 53 | background-color: $kanto-arch-color !important; 54 | } 55 | 56 | .kanto-button.kanto-white-arch { 57 | color: $white !important; 58 | background-color: $kanto-arch-color !important; 59 | } 60 | 61 | .kanto-button.kanto-white-arch:hover { 62 | color: $kanto-arch-color !important; 63 | background-color: $white !important; 64 | } 65 | 66 | button[aria-expanded=true] .show-collapsed { 67 | display: none; 68 | } 69 | 70 | button[aria-expanded=false] .show-expanded { 71 | display: none; 72 | } 73 | 74 | // Extra small devices (portrait phones, less than 576px) 75 | @include media-breakpoint-down(sm) { 76 | .kanto-button { 77 | height: 35px; 78 | width: 130px; 79 | font-size: 0.7rem; 80 | border-style: solid; 81 | display: flex; 82 | justify-content: center; 83 | align-items: center; 84 | transition: 0.2s; 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /web/site/assets/scss/_code.scss: -------------------------------------------------------------------------------- 1 | .td-content { 2 | // Inline code 3 | p code, li > code, table code { 4 | color: rgba($color: black, $alpha: 0.6); 5 | } 6 | } 7 | 8 | .td-content > blockquote { 9 | // Quote 10 | background-color: rgba($color: white, $alpha: 0.8); 11 | border-left: 3px solid $secondary; 12 | } 13 | -------------------------------------------------------------------------------- /web/site/assets/scss/_colors.scss: -------------------------------------------------------------------------------- 1 | .kanto, 2 | h2, 3 | h3 { 4 | color: $primary; 5 | } 6 | 7 | h1, .h1 { 8 | font-size: 2.5rem; 9 | font-weight: 200; 10 | } 11 | 12 | display-1, .display-1 { 13 | font-size: 3rem; 14 | width: max-content; 15 | } 16 | 17 | display-2, .display-2 { 18 | font-size: 2.5rem; 19 | } 20 | 21 | .h1 .display-1 .mt-0 .mt-md-2 .pb-3 .border-bottom { 22 | width: max-content; 23 | } 24 | 25 | display-5, .display-5 { 26 | font-size: 1.5rem; 27 | font-weight: 500; 28 | } 29 | 30 | .td-box .row { 31 | padding-left: 5vw; 32 | padding-right: 5vw; 33 | width: auto; 34 | } 35 | 36 | .td-box--100 { 37 | color: #2a4d14; 38 | } 39 | 40 | .row > * { 41 | flex-shrink: 1; 42 | } 43 | .alert-primary { 44 | background-color: #fff; 45 | } 46 | 47 | .alert-secondary { 48 | background-color: #fff; 49 | color: #2a4d14; 50 | border-style: solid; 51 | border-color: #a19f20; 52 | border-width: 0 0 0 4px 53 | } 54 | 55 | .kanto-feature { 56 | color: $kanto-feature-color; 57 | } 58 | 59 | .kanto-highlight { 60 | color: $kanto-mid-color; 61 | font-weight: 600; 62 | font-size: 1.6rem; 63 | } 64 | 65 | .white { 66 | color: $white; 67 | } 68 | 69 | .tooltip-inner { 70 | background-color: $primary-dark; 71 | } 72 | 73 | .td-toc #TableOfContents a { 74 | color: rgba($color: black, $alpha: 0.7); 75 | } 76 | 77 | .td-search-input:not(:focus) { 78 | color: rgba($color: white, $alpha: 0.5); 79 | } 80 | 81 | .text-footer-menu { 82 | color: rgba($color: white, $alpha: 0.7); 83 | } 84 | 85 | a.text-footer-menu:hover, a.text-footer-menu:focus { 86 | color: $kanto-menu-hover; 87 | } 88 | -------------------------------------------------------------------------------- /web/site/assets/scss/_images.scss: -------------------------------------------------------------------------------- 1 | img { 2 | object-fit: cover; 3 | } 4 | 5 | // Small devices (landscape phones, 576px and up) 6 | @include media-breakpoint-up(sm) { 7 | .wide-photo-container { 8 | height: 100% !important; 9 | } 10 | .wide-photo-container > img { 11 | height: 100% !important; 12 | } 13 | } 14 | 15 | // Extra small devices (portrait phones, less than 576px) 16 | @include media-breakpoint-down(sm) { 17 | .wide-photo-container { 18 | width: 100%; 19 | height: 500px; 20 | box-sizing: none; 21 | margin: unset; 22 | } 23 | .wide-photo-container > img { 24 | width: 100%; 25 | height: 100%; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /web/site/assets/scss/_links.scss: -------------------------------------------------------------------------------- 1 | .kanto-link { 2 | color: $primary; 3 | transition: 0.2s; 4 | } 5 | 6 | .kanto-link:hover { 7 | color: $white; 8 | } 9 | 10 | p > a, main a { 11 | color:$primary-light !important; 12 | font-weight: 600; 13 | transition: 0.2s; 14 | } 15 | 16 | p > a:hover, main a:hover { 17 | color: $kanto-gold-color !important; 18 | } 19 | 20 | .td-page-meta > a { 21 | color: #616013; 22 | } 23 | 24 | .td-page-meta > a:hover { 25 | color: #212107; 26 | } 27 | 28 | .td-navbar .nav-link{ 29 | transition: 0.3s; 30 | font-size: larger; 31 | font-weight: 400; 32 | text-shadow: none; 33 | } 34 | 35 | .navbar-color .navbar-nav .nav-link { 36 | color:$white; 37 | :hover { 38 | color: $kanto-menu-hover; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /web/site/assets/scss/_logo.scss: -------------------------------------------------------------------------------- 1 | 2 | .kanto-logo { 3 | display: inline-block; 4 | margin: 0px 10px; 5 | width: 85px; 6 | } 7 | 8 | #kanto_logo { 9 | overflow: visible; 10 | } 11 | 12 | .eclipse-incubation-logo { 13 | width: 200px; 14 | } 15 | 16 | .eclipse-iot-logo { 17 | height: 40px; 18 | } 19 | 20 | footer { 21 | min-height: 200px; 22 | 23 | @include media-breakpoint-down(sm) { 24 | min-height: 200px; 25 | } 26 | 27 | @include media-breakpoint-down(md) { 28 | min-height: 210px; 29 | } 30 | 31 | @include media-breakpoint-down(xl) { 32 | min-height: 260px; 33 | } 34 | } -------------------------------------------------------------------------------- /web/site/assets/scss/_nav.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Main navbar 3 | // 4 | .td-navbar-cover { 5 | @include media-breakpoint-up(md) { 6 | background: transparent !important; 7 | .nav-link { 8 | text-shadow: 1px 1px 2px $dark; 9 | } 10 | } 11 | 12 | &.navbar-bg-onscroll .nav-link { 13 | text-shadow: none; 14 | } 15 | } 16 | 17 | .navbar-bg-onscroll { 18 | background: $primary !important; 19 | opacity: inherit; 20 | } 21 | 22 | .td-navbar { 23 | @extend .navbar; 24 | 25 | background: $primary; 26 | min-height: 4rem; 27 | margin: 0; 28 | z-index: 32; 29 | 30 | .navbar-brand { 31 | text-transform: none; 32 | &__name { 33 | font-weight: $font-weight-bold; 34 | } 35 | 36 | svg { 37 | display: inline-block; 38 | margin: 0 10px; 39 | height: 30px; 40 | } 41 | } 42 | 43 | .navbar-nav { 44 | padding-top: $spacer * 0.5; 45 | white-space: nowrap; 46 | } 47 | 48 | .nav-link { 49 | text-transform: none; 50 | font-weight: $font-weight-bold; 51 | } 52 | 53 | // For .td-search__input styling, see _search.scss 54 | 55 | .dropdown { 56 | min-width: 100px; 57 | } 58 | 59 | @include media-breakpoint-up(md) { 60 | position: fixed; 61 | top: 0; 62 | width: 100%; 63 | 64 | .nav-item { 65 | padding-inline-end: $spacer * 0.5; 66 | } 67 | 68 | .navbar-nav { 69 | padding-top: 0 !important; 70 | } 71 | } 72 | 73 | @include media-breakpoint-down(lg) { 74 | .td-navbar-nav-scroll { 75 | max-width: 100%; 76 | height: 2.5rem; 77 | overflow: hidden; 78 | font-size: 0.9rem; 79 | } 80 | 81 | .navbar-brand { 82 | margin-right: 0; 83 | } 84 | 85 | .navbar-nav { 86 | padding-bottom: 2rem; 87 | overflow-x: auto; 88 | } 89 | } 90 | } 91 | 92 | // Icons 93 | #main_navbar { 94 | li i { 95 | padding-right: 0.5em; 96 | 97 | &:before { 98 | display: inline-block; 99 | text-align: center; 100 | min-width: 1em; 101 | } 102 | } 103 | .alert { 104 | background-color: inherit; 105 | padding: 0; 106 | color: $secondary; 107 | border: 0; 108 | font-weight: inherit; 109 | 110 | &:before { 111 | display: inline-block; 112 | font-style: normal; 113 | font-variant: normal; 114 | text-rendering: auto; 115 | -webkit-font-smoothing: antialiased; 116 | font-family: $font-awesome-font-name; 117 | font-weight: 900; 118 | content: "\f0d9"; 119 | padding-left: 0.5em; 120 | padding-right: 0.5em; 121 | } 122 | } 123 | } 124 | 125 | // Foldable sidebar menu 126 | nav.foldable-nav { 127 | &#td-section-nav { 128 | position: relative; 129 | } 130 | 131 | &#td-section-nav label { 132 | margin-bottom: 0; 133 | width: 100%; 134 | } 135 | 136 | .td-sidebar-nav__section, 137 | .with-child ul { 138 | list-style: none; 139 | padding: 0; 140 | margin: 0; 141 | } 142 | 143 | .ul-1 > li { 144 | padding-left: 1.5em; 145 | } 146 | 147 | ul.foldable { 148 | display: none; 149 | } 150 | 151 | input:checked ~ ul.foldable { 152 | display: block; 153 | } 154 | 155 | input[type="checkbox"] { 156 | display: none; 157 | } 158 | 159 | .with-child, 160 | .without-child { 161 | position: relative; 162 | padding-left: 1.5em; 163 | } 164 | 165 | .ul-1 .with-child > label:before { 166 | display: inline-block; 167 | font-style: normal; 168 | font-variant: normal; 169 | text-rendering: auto; 170 | -webkit-font-smoothing: antialiased; 171 | font-family: $font-awesome-font-name; 172 | font-weight: 900; 173 | content: "\f0da"; 174 | position: absolute; 175 | left: 0.1em; 176 | padding-left: 0.4em; 177 | padding-right: 0.4em; 178 | font-size: 1em; 179 | color: $gray-900; 180 | transition: all 0.5s; 181 | &:hover { 182 | transform: rotate(90deg); 183 | } 184 | } 185 | 186 | .ul-1 .with-child > input:checked ~ label:before { 187 | color: $primary; 188 | transform: rotate(90deg); 189 | transition: transform 0.5s; 190 | } 191 | 192 | .with-child ul { 193 | margin-top: 0.1em; 194 | } 195 | } 196 | 197 | @media (hover: hover) and (pointer: fine) { 198 | nav.foldable-nav { 199 | .ul-1 .with-child > label:hover:before { 200 | color: $primary; 201 | transition: color 0.3s; 202 | } 203 | 204 | .ul-1 .with-child > input:checked ~ label:hover:before { 205 | color: $primary; 206 | transition: color 0.3s; 207 | } 208 | } 209 | } -------------------------------------------------------------------------------- /web/site/assets/scss/_screen.scss: -------------------------------------------------------------------------------- 1 | // Large devices (desktops, 992px and up) 2 | @include media-breakpoint-up(lg) { 3 | .w-lg-75 { 4 | width: 75% !important; 5 | } 6 | } 7 | 8 | // Sets the content width in blog and docs 9 | .td-max-width-on-larger-screens { 10 | max-width: 100% !important; 11 | } 12 | 13 | // Overwriting height and padding used for cover blocks 14 | .td-cover-block-home { 15 | padding-top: 10rem !important; 16 | padding-bottom: 2rem !important; 17 | padding-left: 4rem !important; 18 | } 19 | 20 | .td-cover-block-inner { 21 | padding-bottom: 0rem !important; 22 | padding-left: 4rem !important; 23 | } 24 | 25 | .td-cover-block--height-min { 26 | min-height: 300px !important; 27 | } 28 | 29 | .td-cover-block--height-med { 30 | min-height: 400px !important; 31 | } 32 | 33 | .td-cover-block--height-max { 34 | min-height: 500px !important; 35 | } 36 | 37 | .td-cover-block--height-full { 38 | min-height: 100vh !important; 39 | } 40 | 41 | // Medium devices (tablets, 768px and up) 42 | @include media-breakpoint-up(md) { 43 | .td-cover-block--height-min { 44 | min-height: 300px !important; 45 | } 46 | 47 | .td-cover-block--height-med { 48 | min-height: 500px !important; 49 | } 50 | 51 | .td-cover-block--height-max { 52 | min-height: 650px !important; 53 | } 54 | } 55 | 56 | .no-focus { 57 | box-shadow: none !important; 58 | } 59 | 60 | .pagination { 61 | justify-content: center; 62 | } 63 | -------------------------------------------------------------------------------- /web/site/assets/scss/_styles_project.scss: -------------------------------------------------------------------------------- 1 | @import url("https://www.eclipse.org/eclipse.org-common/themes/solstice/public/stylesheets/vendor/cookieconsent/cookieconsent.min.css"); 2 | 3 | @import "alerts"; 4 | @import "alignments"; 5 | @import "backgrounds"; 6 | @import "borders"; 7 | @import "buttons"; 8 | @import "code"; 9 | @import "colors"; 10 | @import "images"; 11 | @import "links"; 12 | @import "logo"; 13 | @import "screen"; 14 | 15 | html { 16 | overflow-y: scroll; 17 | } 18 | -------------------------------------------------------------------------------- /web/site/assets/scss/_variables_project.scss: -------------------------------------------------------------------------------- 1 | $google_font_name: "Kumbh Sans" !default; 2 | $google_font_family: "Kumbh+Sans:300,300i,400,400i,600,600i" !default; 3 | $web-font-path: "https://fonts.googleapis.com/css?family=#{$google_font_family}&display=swap"; 4 | 5 | $font-weight-bold: 600; 6 | $fw-bold: 600; 7 | 8 | $display-font-weight: 600; 9 | $font-size: 3rem; 10 | $body-text-align: left; 11 | $spacer: 1rem; 12 | 13 | 14 | // green-gold palette 15 | $color1:#476e40; 16 | $color2:#5e9e56; 17 | $color3:#a19f20; 18 | $color4:#ace79a; 19 | 20 | $primary: $color1; 21 | $primary-light: #58a718; 22 | $primary-dark: #2a4d14; 23 | 24 | $white: #ffffff; 25 | $blue: #0b29bd; 26 | 27 | // Home page component 28 | $kanto-feature-color: $color3; 29 | $kanto-gold-color: $color3; 30 | $kanto-mid-color: $color2; 31 | $kanto-menu-hover: $color4; 32 | 33 | // Home page architecture background 34 | $kanto-arch-color:#809b73; 35 | 36 | // Override theme colors with Kanto ones 37 | $body-bg: #ececeb; 38 | $gray-900: $primary-dark; 39 | $gray-100: $body-bg; 40 | $secondary: $kanto-gold-color; 41 | 42 | // Override documentation links color 43 | $blue: $color3; 44 | 45 | // Footer background color 46 | $bg-dark:$primary; -------------------------------------------------------------------------------- /web/site/content/_index.html: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Home" 3 | linkTitle: "Home" 4 | menu: 5 | main: 6 | weight: 1 7 | --- 8 | 9 | {{< blocks/cover title="Eclipse Kanto" subtitle="Essential IoT enablement for edge devices" 10 | image_anchor="top" height="auto" type="home" color="kanto-primary" >}} 11 |
12 |

13 | cloud connectivity | local communication | software update | container management 14 |

15 |
16 | {{< /blocks/cover >}} 17 | 18 | {{< home-about color="100" height="auto" title="">}} 19 |
20 |

21 | Eclipse Kanto™ is a modular IoT edge software that enables devices for 22 | IoT with all essentials like cloud connectivity, digital twins, local communication, container management, 23 | and software updates - all configurable and remotely manageable by an IoT cloud ecosystem of choice. 24 |

25 | {{< /home-about >}} 26 | 27 | 28 | {{< home-component-list color="100" height="auto" title="Benefits">}} 29 | 30 | {{% home-component icon="icons/lightweight.svg" title="Lightweight" color="kanto-feature" url="about/#features" url_text="Read more" %}} 31 | Run Eclipse Kanto on various constrained edge devices with ranging hardware capabilities to scale hardware and enable a seamlessly integrated and harmonized IoT edge landscape. 32 | {{% /home-component %}} 33 | 34 | {{% home-component icon="icons/containerized.svg" title="Containerized" color="kanto-feature" url="about/#lightweight-container-management" url_text="Read more" %}} 35 | Develop edge applications by using most fit-for-purpose languages, reliably deploy and manage them as containers leveraging cloud-native technology at the edge. 36 | {{% /home-component %}} 37 | 38 | {{% home-component icon="icons/connected.svg" title="Connected" color="kanto-feature" url="about/#cloud-connectivity" url_text="Read more" %}} 39 | Connect devices to most fit-for-purpose IoT cloud ecosystems to manage devices and device data remotely with minimum customization and prototype quickly. 40 | {{% /home-component %}} 41 | 42 | {{% home-component icon="icons/flexible.svg" title="Flexible" color="kanto-feature" url="about/#flexible-deployment" url_text="Read more" %}} 43 | Choose and combine Eclipse Kanto's reusable, configurable and interoperable building blocks to bring the right IoT edge capabilities depending on the hardware and use case. 44 | {{% /home-component %}} 45 | 46 | {{< /home-component-list >}} 47 | -------------------------------------------------------------------------------- /web/site/content/about/_index.html: -------------------------------------------------------------------------------- 1 | --- 2 | title: "About" 3 | linkTitle: "About" 4 | menu: 5 | main: 6 | weight: 2 7 | description: > 8 | About Eclipse Kanto features. 9 | aliases: ["/about/"] 10 | --- 11 | 12 | {{< blocks/cover title="About Eclipse Kanto" image_anchor="top" height="min" color="kanto-primary">}} 13 |

motivation | overview | features

14 | {{< /blocks/cover >}} 15 | 16 |
17 | {{% include file="about/motivation.md" title="Motivation" ref="motivation" %}} 18 | {{% include file="about/overview.md" title="Overview" ref="overview" %}} 19 | {{% include file="about/features.md" title="Features" ref="features" %}} 20 |
21 | -------------------------------------------------------------------------------- /web/site/content/about/features.md: -------------------------------------------------------------------------------- 1 | ### Cloud connectivity 2 | 3 | {{% alert color="primary" %}} 4 | Connect devices to the Bosch IoT Suite cloud services, powered by Eclipse Hono™: 5 | 6 | * Basic and certificate-based device authentication 7 | * Auto-registration of edge devices using certificates 8 | * Device telemetry data and operations handling 9 | * Configurable connectivity recovery mechanisms 10 | * Messages-based synchronization on connectivity recovered 11 | 12 | {{% /alert %}} 13 | 14 |    15 | 16 | ### Digital twins 17 | 18 | {{% alert color="secondary" %}} 19 | Represent connected edge devices and semantically model their capabilities, powered by Eclipse Ditto™ and Eclipse Vorto™: 20 | 21 | * Device state, data and operations handling via Eclipse Ditto™ digital twins 22 | * Ready-to-use pre-defined Eclipse Vorto™ semantic models for all Eclipse Kanto features 23 | * Out-of-the box support for existing and customized device capability modelled via Eclipse Vorto 24 | 25 | {{% /alert %}} 26 | 27 |    28 | 29 | ### Local communication 30 | 31 | {{% alert color="primary" %}} 32 | Develop loosely coupled event-driven applications that exchange messages over Eclipse Mosquitto™ as a local MQTT broker: 33 | 34 | * MQTT broker access control via local basic authentication support 35 | * Мessages forwarding between applications running on the edge device and to the cloud 36 | * Access and manage connected IoT devices, IoT device data and services in cloud and at the edge via Eclipse Ditto protocol 37 | 38 | {{% /alert %}} 39 | 40 |    41 | 42 | ### Lightweight container management 43 | 44 | {{% alert color="secondary" %}} 45 | Pluggable container management optimized for edge use cases to enable a secured, isolated and reliable 46 | deployment mechanism and runtime for edge applications: 47 | 48 | * Lightweight management layer that integrates with a container technology of choice - containerd, podman, Docker, LXC and more 49 | * Uniform API for containers lifecycle, state, networking, host resources access and usage management 50 | * Pluggable architecture enabling transparent container management components exchange and customizations on different levels 51 | * Remote deployment and management of containers via Eclipse Ditto digital twins and Eclipse Vorto models 52 | * Working with private and public secured container image registries 53 | 54 | {{% /alert %}} 55 | 56 |    57 | 58 | ### Flexible software updates 59 | 60 | {{% alert color="primary" %}} 61 | Deploy and manage various software artifacts at the edge by using open and generic software update model, powered by Eclipse Vorto and Eclipse hawkBit™: 62 | 63 | * Extensible and configurable software download and installation flows to enable update of any software 64 | * Ready-to-use script-based software updates to easily implement specific download and install operations, progress tracking, artifact 65 | validation, on start up resume and more 66 | 67 | {{% /alert %}} 68 | 69 |    70 | 71 | ### Flexible file uploads 72 | 73 | {{% alert color="secondary" %}} 74 | Upload files like logs, configurations, diagnostics, backups and more using backend storage of choice: 75 | 76 | * Ready-to-use integrations with Azure Cloud Storage and AWS S3 buckets 77 | * Configuration for periodic uploads or explicitly trigger file upload from the device and more 78 | 79 | {{% /alert %}} 80 | 81 |    82 | 83 | ### Flexible deployment 84 | 85 | {{% alert color="primary" %}} 86 | Choose and combine configurable building blocks deployable on wide range of edge platforms: 87 | 88 | * Specifically optimized for constrained devices to offer compact footprint and optimal utilization of resources 89 | * Configurable features to allow additional resources allocation fine tuning 90 | * Ready-to-use builds for Linux ARM, Linux ARM64, Linux x86_64 91 | * Integrated with open hardware platforms like Raspberry Pi 92 | 93 | {{% /alert %}} 94 | -------------------------------------------------------------------------------- /web/site/content/about/motivation.md: -------------------------------------------------------------------------------- 1 | We are living in an era of digitization, in which companies are reshaping their operations and innovating their business models by offering next generation connected products and digital services. Machines, consumer goods and vehicles are transforming into complex connected IoT devices with advanced software features, collecting and reacting on user insights and data in real-time in secure and safe way. 2 | 3 | Edge computing is shifting from hardware to software focusing on intelligent devices, edge platforms, edge applications and services. New connected products continuously increase in complexity to benefit AIoT – be it built into the products or empowering the production lines. Building the products of the future such as connected vehicles and in vehicle cross-domain applications, connected appliances, smart buildings and connected manufacturing is becoming more and more complex and companies are losing time and money to build the common technologies by themselves, sometimes even lacking the right skills and expertise. 4 | 5 | We bring our knowledge and 20+ years of IoT and edge experience in the open source to enable true collaboration, technology co-development and co-innovation! We address the sheer complexity of edge software and hardware via open technology and ecosystem approach ensuring freedom of choice with vendor-neutral, independent jointly-developed software that goes at the heart of manufactured devices. 6 | -------------------------------------------------------------------------------- /web/site/content/about/overview.md: -------------------------------------------------------------------------------- 1 | Eclipse Kanto™ is a modular IoT edge software that enables devices for IoT with all essentials like cloud connectivity, digital twins, local communication, container management, and software updates - all configurable and remotely manageable by an IoT cloud ecosystem of choice. 2 | 3 | 4 | Eclipse Kanto makes it possible to deploy intelligence on the device so companies can get more value from diverse edge assets, process and act on IoT data right on the device and manage devices from the cloud. Device manufacturers can add new revenue streams with connected products and ensure agile development for hardware and software. 5 | 6 | 7 | Using Eclipse Kanto, technology teams take advantage of configurable and reusable building blocks to connect the unconnected or build the edge applications for the next generation connected products and services. 8 | 9 | 10 | Eclipse Kanto is specifically optimized for complex IoT devices facing limited hardware resources, (near) real-time requirements, diverse device software, heterogeneous data sources and the ability to operate without connection. This makes it a perfect technology for emerging paradigms such as software-defined vehicles, connected machines and connected manufacturing, smart appliances, smart buildings and more. 11 | -------------------------------------------------------------------------------- /web/site/content/community/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Community" 3 | linkTitle: "Community" 4 | type: community 5 | menu: 6 | main: 7 | weight: 4 8 | --- 9 | -------------------------------------------------------------------------------- /web/site/content/docs/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | linkTitle: "Documentation" 3 | type: docs 4 | menu: 5 | main: 6 | weight: 3 7 | --- 8 | 9 | -------------------------------------------------------------------------------- /web/site/content/docs/concepts/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Concepts" 3 | type: docs 4 | weight: 3 5 | description: > 6 | Explore key essentials of Eclipse Kanto. 7 | --- -------------------------------------------------------------------------------- /web/site/content/docs/concepts/aws-connector.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "AWS Connector" 3 | type: docs 4 | description: > 5 | Empower the edge device with a remote connectivity. 6 | weight: 1 7 | --- 8 | 9 | AWS Connector enables the remote connectivity to an AWS IoT cloud ecosystem. It provides the following use cases: 10 | 11 | * **Enriched remote connection** 12 | * **Optimized** - to pass the messages via a single underlying connection 13 | * **Secured** - to protect the edge identity and data via TLS with basic and certificate-based authentication 14 | * **Maintained** - with a reconnect exponential backoff algorithm 15 | * **Synchronized** - on a connectivity recovering via a message buffering 16 | * **Application protection** - AWS Connector is the only one component with a remote connectivity i.e. all local applications are protected from exposure to the public network 17 | * **Offline mode** - local applications don't need to care about the status of the remote connection, they can stay fully operable in offline mode 18 | * **Device Shadow** - messages sent to the [Twin Channel](https://eclipse.dev/ditto/protocol-twinlive.html#twin) are converted to messages more suitable for [AWS Device Shadow](https://docs.aws.amazon.com/iot/latest/developerguide/device-shadow-document.html) service and sent to it. 19 | 20 | ![AWS Connector](/kanto/images/docs/concepts/aws-connector.png) 21 | 22 | ### How it works 23 | 24 | The AWS Connector plays a key role in two communication aspects - local and remote. 25 | 26 | #### Cloud connectivity 27 | 28 | To initiate its connection, the edge has to be manually or automatically provisioned. The result of this operation is different parameters and identifiers. Currently, AWS Connector supports MQTT transport as a connection-oriented and requiring less resources in comparison to AMQP. Once established, the connection is used as a channel to pass the edge telemetry and event messages. The IoT cloud can control the edge via commands and responses. 29 | 30 | In case of a connection interruption, the AWS Connector will switch to offline mode. The message buffer mechanism will be activated to ensure that there is no data loss. Reconnect exponential backoff algorithm will be started to guarantee that no excessive load will be generated to the IoT cloud. All local applications are not affected and can continue to operate as normal. Once the remote connection is restored, all buffered messages will be sent and the edge will be fully restored to online mode. 31 | 32 | #### Local communication 33 | 34 | Ensuring that local applications are loosely coupled, Eclipse Hono™ MQTT definitions are in use. The event-driven local messages exchange is done via a MQTT message broker - Eclipse Mosquitto™. The AWS Connector takes the responsibility to forward these messages to the IoT cloud and vice versa. 35 | 36 | Monitoring of the remote connection status is also enabled locally as well, along with details like the last known state of the connection, timestamp and a predefined connect/disconnect reason. 37 | -------------------------------------------------------------------------------- /web/site/content/docs/concepts/container-management.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Container management" 3 | type: docs 4 | description: > 5 | Empower the edge device for containerized applications. 6 | weight: 2 7 | --- 8 | 9 | Container management enables a lightweight standard runtime which is capable to run containerized applications with all advantages of the technology: isolation, portability and efficiency. The deployment and management are available both locally and remotely via an IoT cloud ecosystem of choice. The following use cases are provided: 10 | 11 | * **Standardized approach** - with OCI (Open Container Initiative) compliant container images and runtime 12 | * **Lightweight runtime** - with a default integration of {{% refn "https://containerd.io/" %}}`containerd`{{% /refn %}} and a possibility for another container technology of choice like podman, LXC and more 13 | * **Isolation** - with a default isolation from other containerized applications and the host system 14 | * **Portability** - with an option to run one and the same containerized application on different platforms 15 | * **Pluggable architecture** - with extension points on different levels 16 | 17 | ![Container management](/kanto/images/docs/concepts/container-management.png) 18 | 19 | ### How it works 20 | 21 | A container image packs the application executable along with all its needed dependencies into a single artifact that can be built by a tooling of choice. 22 | The built image is made available for usage by being pushed to a container image registry where the runtime can refer it to. 23 | 24 | To create a new container instance, the container management uses such an image reference and a configuration for it to produce a fully functional container. 25 | The container lifecycle (start, update, stop, remove) and environment (memory constraints, restart policy, etc.) are also handled by the runtime. 26 | The container management continuously ensures the applications availability via state awareness and restart policies, provides monitoring via flexible logging and fine-grained resources management. 27 | All of that is achieved on top of an underlying runtime of choice ({{% refn "https://containerd.io/" %}}`containerd`{{% /refn %}} by default) that takes care of the low-level isolation mechanisms. 28 | -------------------------------------------------------------------------------- /web/site/content/docs/concepts/file-upload.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "File upload" 3 | type: docs 4 | description: > 5 | Empower the edge device to upload files to various storage providers. 6 | weight: 7 7 | --- 8 | 9 | File upload enables sending of files to a backend storage of choice. It can be used both locally and remotely via a desired IoT cloud ecosystem. The following use cases are provided: 10 | 11 | * **Storage diversity** - with ready to use integrations with Azure Blob Storage, Amazon S3 and standard HTTP upload 12 | * **Automatic uploads** - with periodically triggered uploads at a specified interval in a given time frame 13 | * **Data integrity** - with an option to calculate and send the integrity check required information 14 | * **Operation monitoring** - with a status reporting of the upload operation 15 | 16 | ![File upload](/kanto/images/docs/concepts/file-upload.png) 17 | 18 | ### How it works 19 | 20 | It's not always possible to inline all the data into exchanged messages. For example, large log files or large diagnostic files cannot be sent as a telemetry message. In such scenarios, file upload can assist enabling massive amount of data to be stored to the backend storage. 21 | 22 | There are different triggers which can initiate the upload operation: periodic or explicit. Once initiated, the request will be sent to the IoT cloud for confirmation or cancellation transferred back to the edge. If starting is confirmed, the files 23 | to upload will be selected according to the specified configuration, their integrity check information can be calculated and the transfer of the binary content will begin. A status report is announced on each step of the upload process 24 | enabling its transparent monitoring. 25 | 26 | ### What's next 27 | 28 | [How to upload files]({{< relref "upload-files" >}}) -------------------------------------------------------------------------------- /web/site/content/docs/concepts/local-digital-twins.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Local digital twins" 3 | type: docs 4 | description: > 5 | Empower the edge device with local digital twins for more advanced offline scenarios. 6 | weight: 6 7 | --- 8 | 9 | Local digital twins enables the digital twin state on a local level even in offline scenarios. It provides the following use cases: 10 | 11 | * **Mirrors the applications** 12 | * **Persistency** - digital twins are stored locally 13 | * **Cloud connectivity** - provide connectivity to the cloud (similar to [Suite connector]({{< relref "suite-connector" >}})) 14 | * **Offline scenarios** - local applications stay fully operable as if the connection with the cloud is not interrupted 15 | **Synchronization** - when connection to the cloud is established the last known digital twin state is synchronized 16 | 17 | ![Local Digital Twins](/kanto/images/docs/concepts/local-digital-twins.png) 18 | 19 | ### How it works 20 | 21 | Similar to the [Suite connector]({{< relref "suite-connector" >}}) service the **local digital twins** service needs to establish a connection to the cloud. To do this this the edge has to be manually or automatically provisioned. This connection is then used as a channel to pass the edge telemetry and event messages. Once a connection is established the device can be operated via commands. 22 | 23 | To ensure that the digital twin state is available on a local level even in offline mode (no matter of the connection state) the **local digital twins** service persist all changes locally. Such capabilities were implemented to support offline scenarios and advanced edge computing involving synchronization with the cloud after disruptions or outages. The synchronization mechanisms were also designed in a way to significantly reduce data traffic, and efficiently prevent data loss due to long-lasting disruptions. 24 | 25 | Upon reconnection, the **local digital twins** will notify the cloud of any changes during the offline mode and synchronize the digital twins state. 26 | 27 | The synchronization works in both directions: 28 | * Cloud -> Local digital twins - desired properties are updated if such changes are requested from the cloud. 29 | * Local digital twins -> Cloud - local digital twins state is sent to the cloud (e.g. all current features, their reported properties values, and any removed features while there was no connection). 30 | 31 | ### What's next 32 | 33 | [How to receive offline the structure of your edge device.]({{< relref "../how-to-guides/offline-edge-device" >}}) -------------------------------------------------------------------------------- /web/site/content/docs/concepts/software-update.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Software update" 3 | type: docs 4 | description: > 5 | Empower the edge device to handle diverse software updates. 6 | weight: 3 7 | --- 8 | 9 | Software update enables the deployment and management of various software artifacts, both locally and remotely via an IoT cloud ecosystem of choice. It provides the following use cases: 10 | 11 | * **Robust download** - with a retry and resume mechanism when the network connection is interrupted 12 | * **Artifact validation** - with an integrity validation of every downloaded artifact 13 | * **Universal installation** - with customizable install scripts to handle any kind of software 14 | * **Operation monitoring** - with a status reporting of the download and install operations 15 | 16 | ![Software update](/kanto/images/docs/concepts/software-update.png) 17 | 18 | ### How it works 19 | 20 | When the install operation is received at the edge, the download process is initiated. Retrieving the artifacts will continue until they are stored at the edge or their size threshold is reached. If successful, the artifacts are validated for integrity and further processed by the configured script. It is responsible to apply the new software and finish the operation. A status report is announced on each step of the process enabling its transparent monitoring. 21 | 22 | On start up, if there have been any ongoing operations, they will be automatically resumed as the operation state is persistently stored. 23 | 24 | ### What's next 25 | 26 | [How to update software]({{< relref "update-software" >}}) 27 | -------------------------------------------------------------------------------- /web/site/content/docs/concepts/suite-connector.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Suite connector" 3 | type: docs 4 | description: > 5 | Empower the edge device with a remote connectivity. 6 | weight: 5 7 | --- 8 | 9 | Suite connector enables the remote connectivity to an IoT cloud ecosystem of choice, powered by Eclipse Hono™ (e.g. {{% refn "https://www.eclipse.org/packages/packages/cloud2edge" %}}Eclipse Cloud2Edge{{% /refn %}} and Bosch IoT Suite). It provides the following use cases: 10 | 11 | * **Enriched remote connection** 12 | * **Optimized** - to pass the messages via a single underlying connection 13 | * **Secured** - to protect the edge identity and data via TLS with basic and certificate-based authentication 14 | * **Maintained** - with a reconnect exponential backoff algorithm 15 | * **Synchronized** - on a connectivity recovering via a message buffering 16 | * **Application protection** - suite connector is the only one component with a remote connectivity i.e. all local applications are protected from exposure to the public network 17 | * **Offline mode** - local applications don't need to care about the status of the remote connection, they can stay fully operable in offline mode 18 | 19 | ![Suite connector](/kanto/images/docs/concepts/suite-connector.png) 20 | 21 | ### How it works 22 | 23 | The suite connector plays a key role in two communication aspects - local and remote. 24 | 25 | #### Cloud connectivity 26 | 27 | To initiate its connection, the edge has to be manually or automatically provisioned. The result of this operation is different parameters and identifiers. Currently, suite connector supports MQTT transport as a connection-oriented and requiring less resources in comparison to AMQP. Once established, the connection is used as a channel to pass the edge telemetry and event messages. The IoT cloud can control the edge via commands and responses. 28 | 29 | In case of a connection interruption, the suite connector will switch to offline mode. The message buffer mechanism will be activated to ensure that there is no data loss. Reconnect exponential backoff algorithm will be started to guarantee that no excessive load will be generated to the IoT cloud. All local applications are not affected and can continue to operate as normal. Once the remote connection is restored, all buffered messages will be sent and the edge will be fully restored to online mode. 30 | 31 | #### Local communication 32 | 33 | Ensuring that local applications are loosely coupled, Eclipse Hono™ MQTT definitions are in use. The event-driven local messages exchange is done via a MQTT message broker - Eclipse Mosquitto™. The suite connector takes the responsibility to forward these messages to the IoT cloud and vice versa. 34 | 35 | The provisioning information used to establish the remote communication is available locally both on request via a predefined message and on update populated via an announcement. Applications that would like to extend the edge functionality can further use it in Eclipse Hono™ and Eclipse Ditto™ definitions. 36 | 37 | Monitoring of the remote connection status is also enabled locally as well, along with details like the last known state of the connection, timestamp and a predefined connect/disconnect reason. 38 | -------------------------------------------------------------------------------- /web/site/content/docs/concepts/update-manager.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Update manager" 3 | type: docs 4 | description: > 5 | Empower the edge device for OTA updates. 6 | weight: 4 7 | --- 8 | 9 | Update manager enables a lightweight core component which is capable to easily perform complex OTA update scenarios on a target device. The following capabilities are provided: 10 | 11 | * **Lightweight** - consists of a single core component which orchestrates the update process 12 | * **Flexible deployment** - supports different deployment models - natively, as an executable or container 13 | * **Unified API** - all domain agents utilize a unified Update Agent API for interacting with the Update Manager 14 | * **MQTT Connectivity** - the connectivity and communication between the Update Manager and domain agent is MQTT-based 15 | * **Multi-domain integration** - easily integrates, scales and performs complex update operations across multiple domains 16 | * **Default update agents** - integrates with the Kanto provided out-of-the box domain update agent implementation for deployment of container into the Kanto container management 17 | * **Pluggable architecture** - provides an extensible model for plug-in custom orchestration logic 18 | * **Asynchronous updates** - asynchronous and independent update process across the different domains 19 | * **Multi-staged updates** - the update process is organized into different stages 20 | * **Configurable** - offers a variety of configuration options for connectivity, supported domains, message reporting and etc 21 | 22 | ![Update manager](/kanto/images/docs/concepts/update-manager.png) 23 | 24 | ### How it works 25 | 26 | The update process is initiated by sending the desired state specification as an MQTT message towards the device, which is handled by the Update Manager component. 27 | 28 | The desired state specification in the scope of the Update Manager is a JSON-based document, which consists of multiple component definitions per domain, representing the desired state to be applied on the target device. 29 | A component in the same context means a single, atomic and updatable unit, for example, OCI-compliant container, software application or firmware image. 30 | 31 | Each domain agent is a separate and independent software component, which implements the Update Agent API for interaction with the Update Manager and manages the update logic for concrete domain. For example - container management. 32 | 33 | The Update Manager, operating as a coordinator, is responsible for processing the desired state specification, distributing the split specification across the different domain agents, orchestrating the update process via MQTT-based commands, collecting and consolidating the feedback responses from the domain update agents, and reporting the final result of the update campaign to the backend. 34 | 35 | As extra features and capabilities, the Update Manager enables reboot of the host after the update process is completed and reporting of the current state of the system to the backend. -------------------------------------------------------------------------------- /web/site/content/docs/getting-started/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Getting started" 3 | type: docs 4 | description: > 5 | Explore different ways to connect and manage your edge device remotely using Eclipse Kanto. 6 | weight: 2 7 | --- 8 | -------------------------------------------------------------------------------- /web/site/content/docs/getting-started/install.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Install Eclipse Kanto" 3 | type: docs 4 | description: > 5 | Run Eclipse Kanto on your edge device. 6 | weight: 1 7 | --- 8 | 9 | ### Before you begin 10 | 11 | The `containerd` Debian package is required. You can install it manually or run: 12 | 13 | ```shell 14 | curl -fsSL https://github.com/eclipse-kanto/kanto/raw/main/quickstart/install_ctrd.sh | sh 15 | ``` 16 | 17 | ### Install Eclipse Kanto 18 | 19 | Choose the Eclipse Kanto Debian package for your target device architecture from the ones available 20 | at the project's GitHub Releases page. 21 | Download and install it via executing the following (adjusted to your package name): 22 | 23 | ```shell 24 | wget https://github.com/eclipse-kanto/kanto/releases/download/v1.0.0/kanto_1.0.0_linux_x86_64.deb && \ 25 | sudo apt install ./kanto_1.0.0_linux_x86_64.deb 26 | ``` 27 | 28 | ### Verify 29 | 30 | It's important to check if all the services provided by the Eclipse Kanto package are up and running successfully. You 31 | can quickly do that via executing: 32 | 33 | ```shell 34 | systemctl status \ 35 | suite-connector.service \ 36 | container-management.service \ 37 | software-update.service \ 38 | file-upload.service \ 39 | file-backup.service \ 40 | system-metrics.service \ 41 | kanto-update-manager.service 42 | ``` 43 | 44 | All listed services must be in an active running state. 45 | 46 | ### What's next 47 | 48 | [Explore via Eclipse Hono]({{< relref "hono" >}}) 49 | -------------------------------------------------------------------------------- /web/site/content/docs/how-to-guides/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "How-to guides" 3 | type: docs 4 | weight: 4 5 | description: > 6 | Explore the functionalities of Eclipse Kanto. 7 | --- -------------------------------------------------------------------------------- /web/site/content/docs/how-to-guides/backup-restore-files.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Back up and restore files" 3 | type: docs 4 | description: > 5 | Back up and restore a file from and to your edge device. 6 | weight: 3 7 | --- 8 | 9 | By following the steps below you will back up a simple text file to an HTTP file server 10 | and then restore it back via a publicly available Eclipse Hono sandbox using Eclipse Kanto. 11 | A simple Eclipse Hono northbound business application written in Python is 12 | provided to explore the capabilities for remotely backing up and restoring files. 13 | 14 | ### Before you begin 15 | 16 | To ensure that all steps in this guide can be executed, you need: 17 | 18 | * {{% refn "https://github.com/sebageek/servefile/" %}}`servefile`{{% /refn %}} installed 19 | 20 | This is a small Python HTTP server used in the example to serve the uploads and downloads. 21 | It does not have to be running on your edge device, but it has to be accessible from there. 22 | You can install it by executing: 23 | 24 | ```shell 25 | pip3 install servefile 26 | ``` 27 | 28 | * If you don't have an installed and running Eclipse Kanto on your edge device, 29 | follow {{% relrefn "install" %}} Install Eclipse Kanto {{% /relrefn %}} 30 | * If you don't have a connected Eclipse Kanto to Eclipse Hono sandbox, 31 | follow {{% relrefn "hono" %}} Explore via Eclipse Hono {{% /relrefn %}} 32 | 33 | * The {{% refn "https://github.com/eclipse-kanto/kanto/blob/main/quickstart/hono_commands_fb.py" %}} 34 | file backup and restore application {{% /refn %}} 35 | 36 | Navigate to the `quickstart` folder where the resources from the {{% relrefn "hono" %}} Explore via Eclipse Hono 37 | {{% /relrefn %}} guide are located and execute the following script: 38 | 39 | ```shell 40 | wget https://github.com/eclipse-kanto/kanto/raw/main/quickstart/hono_commands_fb.py 41 | ``` 42 | 43 | ### Back up 44 | 45 | By default, all directories in `/var/tmp/file-backup/` or the directory itself can be backed up. 46 | For this example, create a file `data.txt` which will be later backed up: 47 | 48 | ```shell 49 | sudo mkdir -p /var/tmp/file-backup && sudo echo "This is the first line in the file!" >> /var/tmp/file-backup/data.txt 50 | ``` 51 | 52 | You can verify that the file was successfully created by executing the following command: 53 | 54 | ```shell 55 | cat /var/tmp/file-backup/data.txt 56 | ``` 57 | 58 | This should produce `This is the first line in the file!` as an output. 59 | 60 | Choose a directory where the text file will be uploaded, open a new terminal there and run `servefile` 61 | with the flag `-u` to enable a file upload: 62 | 63 | ```shell 64 | servefile -u . 65 | ``` 66 | 67 | To explore the file backup, we will use a Python script to request and monitor the operation. 68 | The location where the Python application will run does not have to be your edge device as it communicates remotely 69 | with Eclipse Hono only. 70 | 71 | Now we are ready to request the text file backup from the edge via executing the application that requires the command 72 | to execute (`backup`), Eclipse Hono tenant (`-t`), the device identifier (`-d`) and the host where the backup will 73 | be uploaded to: 74 | 75 | ```shell 76 | python3 hono_commands_fb.py backup -t demo -d demo:device -h localhost 77 | ``` 78 | 79 | You can check out that the backup file `data.zip` is on your HTTP file server by 80 | listing the content of the `servefile` working directory. 81 | 82 | ### Restore 83 | 84 | To explore the restore capabilities you will first modify the `data.txt` file, and then you will restore it to 85 | the version before the changes by using the backup, that was created earlier. 86 | 87 | You can modify the `data.txt` file with the following command: 88 | 89 | ```shell 90 | sudo echo "This is the second line in the file!" >> /var/tmp/file-backup/data.txt 91 | ``` 92 | 93 | You can verify that the file was successfully updated by executing the following command: 94 | 95 | ```shell 96 | cat /var/tmp/file-backup/data.txt 97 | ``` 98 | 99 | This output should be: 100 | ```text 101 | This is the first line in the file! 102 | This is the second line in the file! 103 | ``` 104 | 105 | Navigate to the terminal where `servefile` was started and terminate it. 106 | Start it again with the flag `-l` to enable a file download: 107 | 108 | ```shell 109 | servefile -l . 110 | ``` 111 | 112 | To explore the file restore, we will use a Python script to request and monitor the operation. 113 | The location where the Python application will run does not have to be your edge device as it communicates remotely 114 | with Eclipse Hono only. 115 | 116 | Now we are ready to request the text file restore from the edge via executing the application that requires the command 117 | to execute (`restore`), Eclipse Hono tenant (`-t`), the device identifier (`-d`) and the host where the backup file 118 | will be downloaded from: 119 | 120 | ```shell 121 | python3 hono_commands_fb.py restore -t demo -d demo:device -h localhost 122 | ``` 123 | 124 | ### Verify 125 | 126 | You can check out that the original file is restored by executing the following command: 127 | 128 | ```shell 129 | cat /var/tmp/file-backup/data.txt 130 | ``` 131 | 132 | This should produce `This is the first line in the file!` as an output. 133 | 134 | ### Clean up 135 | 136 | Stop `servefile` and clean up its working directory. 137 | Remove the `data.txt` file from the `/var/tmp/file-backup` directory. 138 | -------------------------------------------------------------------------------- /web/site/content/docs/how-to-guides/monitor-system-metrics.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Monitor system metrics" 3 | type: docs 4 | description: > 5 | Monitor system metrics from your edge device. 6 | weight: 4 7 | --- 8 | 9 | By following the steps below you will be able to monitor the system metrics from your edge device 10 | via a publicly available Eclipse Hono sandbox using Eclipse Kanto. A simple Eclipse Hono 11 | northbound business application written in Python is provided to explore the capabilities 12 | for remotely monitoring the CPU and memory utilization. 13 | 14 | ### Before you begin 15 | 16 | To ensure that all steps in this guide can be executed, you need: 17 | 18 | * {{% refn "https://plotly.com/" %}}`Plotly`{{% /refn %}} and 19 | {{% refn "https://plotly.com/dash/" %}}`Dash`{{% /refn %}} installed 20 | 21 | {{% refn "https://plotly.com/" %}}`Plotly`{{% /refn %}} is an open-source plotting library and 22 | {{% refn "https://plotly.com/dash/" %}}`Dash`{{% /refn %}} is a framework for building data application in Python. 23 | They are used in this example to run a simple HTTP server and visualize the incoming system metrics data 24 | in real time, and they do not have to be running on your edge device. 25 | You can install them by executing: 26 | 27 | ```shell 28 | pip3 install plotly dash 29 | ``` 30 | 31 | * If you don't have an installed and running Eclipse Kanto on your edge device, 32 | follow {{% relrefn "install" %}} Install Eclipse Kanto {{% /relrefn %}} 33 | * If you don't have a connected Eclipse Kanto to Eclipse Hono sandbox, 34 | follow {{% relrefn "hono" %}} Explore via Eclipse Hono {{% /relrefn %}} 35 | 36 | * The {{% refn "https://github.com/eclipse-kanto/kanto/blob/main/quickstart/hono_commands_sm.py" %}} 37 | system metrics application {{% /refn %}} 38 | 39 | Navigate to the `quickstart` folder where the resources from the {{% relrefn "hono" %}} Explore via Eclipse Hono 40 | {{% /relrefn %}} guide are located and execute the following script: 41 | 42 | ```shell 43 | wget https://github.com/eclipse-kanto/kanto/raw/main/quickstart/hono_commands_sm.py 44 | ``` 45 | 46 | ### Monitor system metrics 47 | 48 | To explore the system metrics, we will use a Python script to request and monitor the 49 | CPU and memory utilization. The location where the Python application will run does 50 | not have to be your edge device as it communicates remotely with Eclipse Hono only. 51 | 52 | Now we are ready to request the system metrics from the edge via executing the application 53 | that requires the Eclipse Hono tenant (`-t`) and the device identifier (`-d`): 54 | 55 | ```shell 56 | python3 hono_commands_sm.py -t demo -d demo:device 57 | ``` 58 | 59 | ### Verify 60 | 61 | You can check out that the CPU and memory utilization metrics are properly received and displayed 62 | by checking out the application dashboard (by default - {{% refn "http://127.0.0.1:8050" %}}http://127.0.0.1:8050{{% /refn %}}). 63 | -------------------------------------------------------------------------------- /web/site/content/docs/how-to-guides/offline-edge-device.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Offline explore edge device" 3 | type: docs 4 | description: > 5 | Offline receive the structure of your edge device. 6 | weight: 6 7 | --- 8 | 9 | By following the steps below, you will get the structure of the edge digital twins with all its features and properties using Eclipse Kanto. 10 | A simple Eclipse Hono northbound business application written in Python is provided to display the things' and their features' structure. 11 | 12 | ### Before you begin 13 | 14 | To ensure that your edge device is capable to execute the steps in this guide, you need: 15 | 16 | * If you don't have an installed and running Eclipse Kanto on your edge device, 17 | follow {{% relrefn "install" %}} Install Eclipse Kanto {{% /relrefn %}} 18 | 19 | * If you don't have a connected Eclipse Kanto to Eclipse Hono sandbox, 20 | follow {{% relrefn "hono" %}} Explore via Eclipse Hono {{% /relrefn %}} 21 | 22 | * Stop `suite-connector.service`. The local digital twins service is a replacement for the suite connector service, that is why either one of the services must be running. 23 | 24 | ```shell 25 | sudo systemctl stop suite-connector.service 26 | ``` 27 | 28 | * The {{% refn "https://github.com/eclipse-kanto/kanto/blob/main/quickstart/hono_commands_ldt.py" %}} offline explore application {{% /refn %}} 29 | 30 | Navigate to the `quickstart` folder where the resources from the {{% relrefn "hono" %}} Explore via Eclipse Hono {{% /relrefn %}} guide are located and execute the following script: 31 | 32 | ```shell 33 | wget https://github.com/eclipse-kanto/kanto/raw/main/quickstart/hono_commands_ldt.py 34 | ``` 35 | 36 | ### Configure Local digital twins 37 | 38 | Open file `/etc/suite-connector/config.json`, copy `tenantId`, `deviceId`, `authId` and `password`. 39 | ```json 40 | { 41 | ... 42 | "tenantId": "demo", 43 | "deviceId": "demo:device", 44 | "authId": "demo_device", 45 | "password": "secret" 46 | ... 47 | } 48 | ``` 49 | The local digital twins service uses the `/etc/local-digital-twins/config.json` to acquire all the remote communication, identification and 50 | authentication data to establish the remote connection. Update the configuration as shown below and 51 | replace `tenantId`, `deviceId`, `authId` and `password` with the settings that you copied in the previous step. 52 | 53 | ```json 54 | { 55 | "logFile": "/var/log/local-digital-twins/local-digital-twins.log", 56 | "caCert": "/etc/local-digital-twins/iothub.crt", 57 | "thingsDb": "/var/lib/local-digital-twins/thing.db", 58 | "tenantId": "demo", 59 | "deviceId": "demo:device", 60 | "authId": "demo_device", 61 | "password": "secret" 62 | } 63 | ``` 64 | 65 | Save the configuration and start the local digital twins service using the following command: 66 | 67 | ```shell 68 | sudo systemctl start local-digital-twins.service 69 | ``` 70 | 71 | ### Receive the structure of the edge device 72 | 73 | Now we are ready to request the structure of the edge digital twins via executing the offline explore application that requires the local digital twins tenant (`-t`) and the device identifier (`-d`): 74 | 75 | ```shell 76 | python3 hono_commands_ldt.py -t demo -d demo:device 77 | ``` 78 | 79 | ### Verify 80 | 81 | On the shell there will be output of the structure of the edge digital twins with all its features and properties. Things with the following identifiers will be presented: 82 | * demo:device 83 | * demo:device:edge:containers 84 | 85 | ### Clean up 86 | 87 | Stop the local digital twins service and start suite connector service by executing: 88 | ```shell 89 | sudo systemctl stop local-digital-twins.service && \ 90 | sudo systemctl restart suite-connector.service 91 | ``` -------------------------------------------------------------------------------- /web/site/content/docs/how-to-guides/update-software.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Update software" 3 | type: docs 4 | description: > 5 | Install a Debian package on your edge device. 6 | weight: 1 7 | --- 8 | 9 | By following the steps below you will install a{{% refn "https://www.gnu.org/software/hello/" %}}`hello`{{% /refn %}} 10 | Debian package via a publicly available Eclipse Hono sandbox using Eclipse Kanto. 11 | A couple of simple Eclipse Hono northbound business applications written in Python are provided to explore 12 | the capabilities for remotely installing and monitoring. 13 | On the edge side, a basic 14 | {{% refn "https://github.com/eclipse-kanto/kanto/blob/main/quickstart/install_hello.sh" %}}`install_hello.sh`{{% /refn %}} 15 | script will be downloaded and executed. 16 | 17 | ### Before you begin 18 | 19 | To ensure that your edge device is capable to execute the steps in this guide, you need: 20 | 21 | * Debian-based linux distribution and the `apt` command line tool 22 | * If you don't have an installed and running Eclipse Kanto, follow {{% relrefn "install" %}} Install Eclipse Kanto {{% /relrefn %}} 23 | * If you don't have a connected Eclipse Kanto to Eclipse Hono sandbox, 24 | follow {{% relrefn "hono" %}} Explore via Eclipse Hono {{% /relrefn %}} 25 | 26 | * The {{% refn "https://github.com/eclipse-kanto/kanto/blob/main/quickstart/hono_commands_su.py" %}} 27 | software update application {{% /refn %}} 28 | 29 | Navigate to the `quickstart` folder where the resources from the {{% relrefn "hono" %}} Explore via Eclipse Hono {{% /relrefn %}} 30 | guide are located and execute the following script: 31 | 32 | ```shell 33 | wget https://github.com/eclipse-kanto/kanto/raw/main/quickstart/hono_commands_su.py 34 | ``` 35 | * Executing `hello` in the terminal will return that the command is not found 36 | 37 | ### Install Debian package 38 | 39 | To explore the software management, we will use two Python scripts to install and monitor the `hello` Debian package. 40 | The location where the Python applications will run does not have to be your edge device as they communicate remotely 41 | with Eclipse Hono only. 42 | 43 | First, start the monitoring application that requires the configured Eclipse Hono tenant (`-t`) and will print all 44 | received events triggered by the device: 45 | 46 | ```shell 47 | python3 hono_events.py -t demo 48 | ``` 49 | 50 | In another terminal, we are ready to spin up a `hello` Debian package at the edge via executing the second application 51 | that requires the Eclipse Hono tenant (`-t`) and the device identifier (`-d`): 52 | 53 | ```shell 54 | python3 hono_commands_su.py -t demo -d demo:device 55 | ``` 56 | 57 | ### Verify 58 | 59 | You can check out that the new package is installed on your edge device via executing: 60 | 61 | ```shell 62 | hello 63 | ``` 64 | 65 | The command now displays: `Hello, world!` 66 | 67 | ### Clean up 68 | 69 | The installed `hello` Debian package can be removed via executing: 70 | 71 | ```shell 72 | sudo apt remove hello 73 | ``` 74 | -------------------------------------------------------------------------------- /web/site/content/docs/how-to-guides/upload-files.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Upload files" 3 | type: docs 4 | description: > 5 | Upload a log file from your edge device. 6 | weight: 2 7 | --- 8 | 9 | By following the steps below you will upload an example log file to your HTTP file server 10 | via a publicly available Eclipse Hono sandbox using Eclipse Kanto. 11 | A simple Eclipse Hono northbound business application written in Python is 12 | provided to explore the capabilities for remotely uploading and monitoring. 13 | 14 | ### Before you begin 15 | 16 | To ensure that all steps in this guide can be executed, you need: 17 | 18 | * {{% refn "https://github.com/sebageek/servefile/" %}}`servefile`{{% /refn %}} installed 19 | 20 | This is a small Python HTTP server used in the example to serve the uploads. 21 | It does not have to be running on your edge device but it has to be accessible from there. 22 | You can install it by executing: 23 | 24 | ```shell 25 | pip3 install servefile 26 | ``` 27 | 28 | * If you don't have an installed and running Eclipse Kanto on your edge device, 29 | follow {{% relrefn "install" %}} Install Eclipse Kanto {{% /relrefn %}} 30 | * If you don't have a connected Eclipse Kanto to Eclipse Hono sandbox, 31 | follow {{% relrefn "hono" %}} Explore via Eclipse Hono {{% /relrefn %}} 32 | 33 | * The {{% refn "https://github.com/eclipse-kanto/kanto/blob/main/quickstart/hono_commands_fu.py" %}} 34 | file upload application {{% /refn %}} 35 | 36 | Navigate to the `quickstart` folder where the resources from the {{% relrefn "hono" %}} Explore via Eclipse Hono 37 | {{% /relrefn %}} guide are located and execute the following script: 38 | 39 | ```shell 40 | wget https://github.com/eclipse-kanto/kanto/raw/main/quickstart/hono_commands_fu.py 41 | ``` 42 | 43 | ### Upload log file 44 | 45 | By default, all files in `/var/tmp/file-upload/` directory can be uploaded. 46 | For example, grab the suite connector log file and place it in the directory via executing: 47 | 48 | ```shell 49 | mkdir -p /var/tmp/file-upload/ && sudo cp /var/log/suite-connector/suite-connector.log /var/tmp/file-upload/ 50 | ``` 51 | 52 | Choose a directory where the log file will be uploaded, open a new terminal there and run `servefile`: 53 | 54 | ```shell 55 | servefile -u . 56 | ``` 57 | 58 | To explore the file upload, we will use a Python script to request and monitor the operation. 59 | The location where the Python application will run does not have to be your edge device as it communicates remotely 60 | with Eclipse Hono only. 61 | 62 | Now we are ready to request the log file upload from the edge via executing the application 63 | that requires the Eclipse Hono tenant (`-t`) and the device identifier (`-d`): 64 | 65 | ```shell 66 | python3 hono_commands_fu.py -t demo -d demo:device 67 | ``` 68 | 69 | ### Verify 70 | 71 | You can check out that the log file is on your HTTP file server by listing the content of `servefile` working directory. 72 | 73 | ### Clean up 74 | 75 | Stop `servefile` and clean up its working directory. 76 | -------------------------------------------------------------------------------- /web/site/content/docs/references/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "References" 3 | type: docs 4 | description: > 5 | Explore customization of Eclipse Kanto. 6 | weight: 5 7 | --- 8 | -------------------------------------------------------------------------------- /web/site/content/docs/references/connectivity/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Remote connectivity configuration" 3 | type: docs 4 | description: > 5 | Customize the remote connectivity and automatic provisioning. 6 | weight: 1 7 | --- -------------------------------------------------------------------------------- /web/site/content/docs/references/connectivity/aws-connector-config.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "AWS Connector configuration" 3 | type: docs 4 | description: > 5 | Customize the remote connectivity. 6 | weight: 1 7 | --- 8 | 9 | ### Properties 10 | 11 | To control all aspects of the aws connector behavior. 12 | 13 | | Property | Type | Default | Description | 14 | | - | - | - | - | 15 | | topicFilter | string ​| | Regex filter used to block incoming messages by their topic | 16 | | payloadFilters | string ​| | Regex filters used to exclude parts of the incoming messages payload | 17 | | **Remote connectivity** | | | | 18 | | address | string | | Address of the MQTT endpoint that the connector will connect for the remote communication, the format is: `scheme://host:port` | 19 | | tenantId | string | default-tenant-id | Tenant unique identifier that the device belongs to | 20 | | clientId | string | | MQTT client unique identifier | 21 | | **Remote connectivity - TLS** | | | | 22 | | alpn | string[] | | TLS application layer protocol negotiation options space separated for cloud access | 23 | | caCert | string | aws.crt | PEM encoded CA certificates file | 24 | | cert | string | | PEM encoded certificate file to authenticate to the MQTT endpoint | 25 | | key | string | | PEM encoded unencrypted private key file to authenticate to the MQTT endpoint | 26 | | **Remote connectivity - TLS over TPM** | | | | 27 | | tpmDevice | string | | Path to the device file or the unix socket to access the TPM 2.0 | 28 | | tpmHandle | int | | TPM 2.0 storage root key handle, the type is unsigned 64-bit integer | 29 | | tpmKeyPub | string | | File path to the public part of the TPM 2.0 key | 30 | | tpmKey | string | | File path to the private part of the TPM 2.0 key | 31 | | **Local connectivity** | | | | 32 | | localAddress | string | tcp://localhost:1883 | Address of the MQTT server/broker that the aws connector will connect for the local communication, the format is: `scheme://host:port` | 33 | | localUsername | string | | Username that is a part of the credentials | 34 | | localPassword | string | | Password that is a part of the credentials | 35 | | **Local connectivity - TLS** | | | | 36 | | localCACert | string | | PEM encoded CA certificates file | 37 | | localCert | string | | PEM encoded certificate file to authenticate to the MQTT server/broker | 38 | | localKey | string | | PEM encoded unencrypted private key file to authenticate to the MQTT server/broker | 39 | | **Logging** | | | | 40 | | logFile | string | logs/aws-connector.log | Path to the file where log messages are written | 41 | | logLevel | string | INFO | All log messages at this or a higher level will be logged, the log levels in descending order are: ERROR, WARN, INFO, DEBUG and TRACE | 42 | | logFileCount | int | 5 | Log file maximum rotations count | 43 | | logFileMaxAge | int | 28 | Log file rotations maximum age in days, use 0 to not remove old log files | 44 | | logFileSize | int | 2 | Log file size in MB before it gets rotated | 45 | 46 | ### Example 47 | 48 | The minimal required configuration to connect. 49 | 50 | ```json 51 | { 52 | "address": "tls://:8883", 53 | "caCert": "AmazonRootCA1.pem", 54 | "cert": "example-device.crt", 55 | "key": "example-device.key", 56 | "clientId": "org.eclipse.kanto:exampleDevice", 57 | "logFile": "/var/log/aws-connector/aws-connector.log" 58 | } 59 | ``` 60 | 61 | ### Template 62 | 63 | The configuration can be further adjusted according to the use case. 64 | The following template illustrates all possible properties with their default values. 65 | 66 | {{% warn %}} 67 | Be aware that some combinations may be incompatible 68 | {{% /warn %}} 69 | 70 | ```json 71 | { 72 | "topicFilter": "", 73 | "payloadFilters": [], 74 | "address": "", 75 | "tenantId": "default-tenant-id", 76 | "clientId": "", 77 | "alpn" : [], 78 | "caCert": "aws.crt", 79 | "cert": "", 80 | "key": "", 81 | "tpmDevice": "", 82 | "tpmHandle": 0, 83 | "tpmKeyPub": "", 84 | "tpmKey": "", 85 | "localAddress": "tcp://localhost:1883", 86 | "localUsername": "", 87 | "localPassword": "", 88 | "localCACert": "", 89 | "localCert": "", 90 | "localKey": "", 91 | "logFile": "logs/aws-connector.log", 92 | "logLevel": "INFO", 93 | "logFileCount": 5, 94 | "logFileMaxAge": 28, 95 | "logFileSize": 2 96 | } 97 | ``` 98 | -------------------------------------------------------------------------------- /web/site/content/docs/references/connectivity/azure-connector-config.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Azure Connector configuration" 3 | type: docs 4 | description: > 5 | Customize the remote connectivity. 6 | weight: 2 7 | --- 8 | 9 | ### Properties 10 | 11 | To control all aspects of the azure connector behavior. 12 | 13 | | Property | Type | Default | Description | 14 | | - | - | - | - | 15 | | tenantId | string | defaultTenant | Tenant unique identifier that the device belongs to | 16 | | connectionString | string ​| | The connection string for connectivity to Azure IoT Hub, the format is: `"HostName=newHostName.azure-devices.net;DeviceId=deviceId;SharedAccessKey=accessKey"` | 17 | | sasTokenValidity | string | 1h | The validity period for the generated SAS token for device authentication. Positive integer number followed by a unit suffix, such as '300m', '1h', etc., time units are: m, h, d | 18 | | idScope | string | | ID scope for Azure Device Provisioning service | 19 | | **Remote connectivity - TLS** | | | | 20 | | alpn | string[] | | TLS application layer protocol negotiation options space separated for cloud access | 21 | | caCert | string | iothub.crt | PEM encoded CA certificates file | 22 | | cert | string | | PEM encoded certificate file to authenticate to the MQTT endpoint | 23 | | key | string | | PEM encoded unencrypted private key file to authenticate to the MQTT endpoint | 24 | | **Remote connectivity - TLS over TPM** | | | | 25 | | tpmDevice | string | | Path to the device file or the unix socket to access the TPM 2.0 | 26 | | tpmHandle | int | | TPM 2.0 storage root key handle, the type is unsigned 64-bit integer | 27 | | tpmKeyPub | string | | File path to the public part of the TPM 2.0 key | 28 | | tpmKey | string | | File path to the private part of the TPM 2.0 key | 29 | | **Local connectivity** | | | | 30 | | localAddress | string | tcp://localhost:1883 | Address of the MQTT server/broker that the azure connector will connect for the local communication, the format is: `scheme://host:port` | 31 | | localUsername | string | | Username that is a part of the credentials | 32 | | localPassword | string | | Password that is a part of the credentials | 33 | | **Local connectivity - TLS** | | | | 34 | | localCACert | string | | PEM encoded CA certificates file | 35 | | localCert | string | | PEM encoded certificate file to authenticate to the MQTT server/broker | 36 | | localKey | string | | PEM encoded unencrypted private key file to authenticate to the MQTT server/broker | 37 | | **Logging** | | | | 38 | | logFile | string | logs/azure-connector.log | Path to the file where log messages are written | 39 | | logLevel | string | INFO | All log messages at this or a higher level will be logged, the log levels in descending order are: ERROR, WARN, INFO, DEBUG and TRACE | 40 | | logFileCount | int | 5 | Log file maximum rotations count | 41 | | logFileMaxAge | int | 28 | Log file rotations maximum age in days, use 0 to not remove old log files | 42 | | logFileSize | int | 2 | Log file size in MB before it gets rotated | 43 | 44 | ### Example 45 | 46 | The minimal required configuration to connect. 47 | 48 | ```json 49 | { 50 | "connectionString": "HostName=hostName.azure-devices.net;DeviceId=deviceId;SharedAccessKey=cGFzc3AvcKQ=", 51 | "caCert": "/etc/azure-connector/iothub.crt", 52 | "logFile": "/var/log/azure-connector/azure-connector.log" 53 | } 54 | ``` 55 | 56 | ### Template 57 | 58 | The configuration can be further adjusted according to the use case. 59 | The following template illustrates all possible properties with their default values. 60 | 61 | {{% warn %}} 62 | Be aware that some combinations may be incompatible 63 | {{% /warn %}} 64 | 65 | ```json 66 | { 67 | "tenantId": "defaultTenant", 68 | "connectionString": "", 69 | "sasTokenValidity": "1h", 70 | "idScope": "", 71 | "alpn" : [], 72 | "caCert": "iothub.crt", 73 | "cert": "", 74 | "key": "", 75 | "tpmDevice": "", 76 | "tpmHandle": 0, 77 | "tpmKeyPub": "", 78 | "tpmKey": "", 79 | "localAddress": "tcp://localhost:1883", 80 | "localUsername": "", 81 | "localPassword": "", 82 | "localCACert": "", 83 | "localCert": "", 84 | "localKey": "", 85 | "logFile": "logs/azure-connector.log", 86 | "logLevel": "INFO", 87 | "logFileCount": 5, 88 | "logFileMaxAge": 28, 89 | "logFileSize": 2 90 | } 91 | ``` 92 | -------------------------------------------------------------------------------- /web/site/content/docs/references/connectivity/local-digital-twins-config.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Local digital twins configuration" 3 | type: docs 4 | description: > 5 | Customize the local digital twins persistency, access and synchronization. 6 | weight: 4 7 | --- 8 | 9 | ### Properties 10 | 11 | To control all aspects of the local digital twins behavior. 12 | 13 | | Property | Type | Default | Description | 14 | | - | - | - | - | 15 | | thingsDb | string | things.db | Path to the file where digital twins will be stored | 16 | | **Remote connectivity** | | | | 17 | | address | string | mqtts://mqtt.bosch-iot-hub.com:8883 | Address of the MQTT endpoint that the local digital twins will connect for the remote communication, the format is: `scheme://host:port` | 18 | | deviceId | string | | Device unique identifier | 19 | | authId | string | | Authentication unique identifier that is a part of the credentials | 20 | | tenantId | string | | Tenant unique identifier that the device belongs to | 21 | | password | string | | Password that is a part of the credentials | 22 | | clientId | string | | MQTT client unique identifier | 23 | | policyId | string | | Policy unique identifier of the digital twin | 24 | | **Remote connectivity - TLS** | | | | 25 | | caCert | string | iothub.crt | PEM encoded CA certificates file | 26 | | cert | string | | PEM encoded certificate file to authenticate to the MQTT endpoint | 27 | | key | string | | PEM encoded unencrypted private key file to authenticate to the MQTT endpoint | 28 | | deviceIdPattern | string | | Pattern to generate the device identifier, `{{subject-dn}}` and `{{subject-cn}}` placeholders can be part of it | 29 | | **Remote connectivity - TLS over TPM** | | | | 30 | | tpmDevice | string | | Path to the device file or the unix socket to access the TPM 2.0 | 31 | | tpmHandle | int | | TPM 2.0 storage root key handle, the type is unsigned 64-bit integer | 32 | | tpmKeyPub | string | | File path to the public part of the TPM 2.0 key | 33 | | tpmKey | string | | File path to the private part of the TPM 2.0 key | 34 | | **Local connectivity** | | | | 35 | | localAddress | string | tcp://localhost:1883 | Address of the MQTT server/broker that the local digital twins will connect for the local communication, the format is: `scheme://host:port` | 36 | | localUsername | string | | Username that is a part of the credentials | 37 | | localPassword | string | | Password that is a part of the credentials | 38 | | **Local connectivity - TLS** | | | | 39 | | localCACert | string | | PEM encoded CA certificates file | 40 | | localCert | string | | PEM encoded certificate file to authenticate to the MQTT server/broker | 41 | | localKey | string | | PEM encoded unencrypted private key file to authenticate to the MQTT server/broker | 42 | | **Logging** | | | | 43 | | logFile | string | log/local-digital-twins.log | Path to the file where log messages are written | 44 | | logLevel | string | INFO | All log messages at this or a higher level will be logged, the log levels in descending order are: ERROR, WARN, INFO, DEBUG and TRACE | 45 | | logFileCount | int | 5 | Log file maximum rotations count | 46 | | logFileMaxAge | int | 28 | Log file rotations maximum age in days, use 0 to not remove old log files | 47 | | logFileSize | int | 2 | Log file size in MB before it gets rotated | 48 | 49 | ### Example 50 | 51 | The minimal required configuration to enable the local digital twins and their synchronization with the publicly available {{% refn "https://www.eclipse.org/hono/sandbox/" %}}Eclipse Hono sandbox{{% /refn %}}. 52 | 53 | ```json 54 | { 55 | "address": "hono.eclipseprojects.io:1883", 56 | "caCert": "/etc/local-digital-twins/iothub.crt", 57 | "tenantId": "org.eclipse.kanto", 58 | "deviceId": "org.eclipse.kanto:exampleDevice", 59 | "authId": "org.eclipse.kanto_example", 60 | "password": "secret", 61 | "thingsDb": "/var/lib/local-digital-twins/thing.db", 62 | "logFile": "/var/log/local-digital-twins/local-digital-twins.log" 63 | } 64 | ``` 65 | 66 | ### Template 67 | 68 | The configuration can be further adjusted according to the use case. 69 | The following template illustrates all possible properties with their default values. 70 | 71 | {{% warn %}} 72 | Be aware that some combinations may be incompatible 73 | {{% /warn %}} 74 | 75 | ```json 76 | { 77 | "thingsDb": "things.db", 78 | "address": "mqtts://mqtt.bosch-iot-hub.com:8883", 79 | "deviceId": "", 80 | "authId": "", 81 | "tenantId": "", 82 | "password": "", 83 | "clientId": "", 84 | "policyId": "", 85 | "caCert": "iothub.crt", 86 | "cert": "", 87 | "key": "", 88 | "deviceIdPattern": "", 89 | "tpmDevice": "", 90 | "tpmHandle": 0, 91 | "tpmKeyPub": "", 92 | "tpmKey": "", 93 | "localAddress": "tcp://localhost:1883", 94 | "localUsername": "", 95 | "localPassword": "", 96 | "localCACert": "", 97 | "localCert": "", 98 | "localKey": "", 99 | "logFile": "log/local-digital-twins.log", 100 | "logLevel": "INFO", 101 | "logFileCount": 5, 102 | "logFileMaxAge": 28, 103 | "logFileSize": 2 104 | } 105 | ``` -------------------------------------------------------------------------------- /web/site/content/docs/references/connectivity/suite-connector-config.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Suite connector configuration" 3 | type: docs 4 | description: > 5 | Customize the remote connectivity. 6 | weight: 3 7 | --- 8 | 9 | ### Properties 10 | 11 | To control all aspects of the suite connector behavior. 12 | 13 | | Property | Type | Default | Description | 14 | | - | - | - | - | 15 | | **Remote connectivity** | | | | 16 | | address | string | mqtts://mqtt.bosch-iot-hub.com:8883 | Address of the MQTT endpoint that the suite connector will connect for the remote communication, the format is: `scheme://host:port` | 17 | | deviceId | string | | Device unique identifier | 18 | | authId | string | | Authentication unique identifier that is a part of the credentials | 19 | | tenantId | string | | Tenant unique identifier that the device belongs to | 20 | | username | string | | MQTT username that is a part of the credentials. This parameter takes precedence over authId and tenantId | 21 | | password | string | | Password that is a part of the credentials | 22 | | clientId | string | | MQTT client unique identifier | 23 | | policyId | string | | Policy unique identifier of the digital twin | 24 | | generic | bool | | Force use of modified topics for cloud access | 25 | | **Remote connectivity - TLS** | | | | 26 | | alpn | string[] | | TLS application layer protocol negotiation options space separated for cloud access | 27 | | caCert | string | iothub.crt | PEM encoded CA certificates file | 28 | | cert | string | | PEM encoded certificate file to authenticate to the MQTT endpoint | 29 | | key | string | | PEM encoded unencrypted private key file to authenticate to the MQTT endpoint | 30 | | deviceIdPattern | string | | Pattern to generate the device identifier, `{{subject-dn}}` and `{{subject-cn}}` placeholders can be part of it | 31 | | **Remote connectivity - TLS over TPM** | | | | 32 | | tpmDevice | string | | Path to the device file or the unix socket to access the TPM 2.0 | 33 | | tpmHandle | int | | TPM 2.0 storage root key handle, the type is unsigned 64-bit integer | 34 | | tpmKeyPub | string | | File path to the public part of the TPM 2.0 key | 35 | | tpmKey | string | | File path to the private part of the TPM 2.0 key | 36 | | **Local connectivity** | | | | 37 | | localAddress | string | tcp://localhost:1883 | Address of the MQTT server/broker that the suite connector will connect for the local communication, the format is: `scheme://host:port` | 38 | | localUsername | string | | Username that is a part of the credentials | 39 | | localPassword | string | | Password that is a part of the credentials | 40 | | **Local connectivity - TLS** | | | | 41 | | localCACert | string | | PEM encoded CA certificates file | 42 | | localCert | string | | PEM encoded certificate file to authenticate to the MQTT server/broker | 43 | | localKey | string | | PEM encoded unencrypted private key file to authenticate to the MQTT server/broker | 44 | | **Logging** | | | | 45 | | logFile | string | log/suite-connector.log | Path to the file where log messages are written | 46 | | logLevel | string | INFO | All log messages at this or a higher level will be logged, the log levels in descending order are: ERROR, WARN, INFO, DEBUG and TRACE | 47 | | logFileCount | int | 5 | Log file maximum rotations count | 48 | | logFileMaxAge | int | 28 | Log file rotations maximum age in days, use 0 to not remove old log files | 49 | | logFileSize | int | 2 | Log file size in MB before it gets rotated | 50 | 51 | ### Example 52 | 53 | The minimal required configuration to connect the publicly available 54 | {{% refn "https://www.eclipse.org/hono/sandbox/" %}}Eclipse Hono sandbox{{% /refn %}}. 55 | 56 | ```json 57 | { 58 | "address": "hono.eclipseprojects.io:1883", 59 | "caCert": "/etc/suite-connector/iothub.crt", 60 | "tenantId": "org.eclipse.kanto", 61 | "deviceId": "org.eclipse.kanto:exampleDevice", 62 | "authId": "org.eclipse.kanto_example", 63 | "password": "secret", 64 | "logFile": "/var/log/suite-connector/suite-connector.log" 65 | } 66 | ``` 67 | 68 | ### Template 69 | 70 | The configuration can be further adjusted according to the use case. 71 | The following template illustrates all possible properties with their default values. 72 | 73 | {{% warn %}} 74 | Be aware that some combinations may be incompatible 75 | {{% /warn %}} 76 | 77 | ```json 78 | { 79 | "address": "mqtts://mqtt.bosch-iot-hub.com:8883", 80 | "deviceId": "", 81 | "authId": "", 82 | "tenantId": "", 83 | "username": "", 84 | "password": "", 85 | "clientId": "", 86 | "policyId": "", 87 | "generic": false, 88 | "alpn" : [], 89 | "caCert": "iothub.crt", 90 | "cert": "", 91 | "key": "", 92 | "deviceIdPattern": "", 93 | "tpmDevice": "", 94 | "tpmHandle": 0, 95 | "tpmKeyPub": "", 96 | "tpmKey": "", 97 | "localAddress": "tcp://localhost:1883", 98 | "localUsername": "", 99 | "localPassword": "", 100 | "localCACert": "", 101 | "localCert": "", 102 | "localKey": "", 103 | "logFile": "log/suite-connector.log", 104 | "logLevel": "INFO", 105 | "logFileCount": 5, 106 | "logFileMaxAge": 28, 107 | "logFileSize": 2 108 | } 109 | ``` 110 | -------------------------------------------------------------------------------- /web/site/content/docs/references/containers/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Container management configuration" 3 | type: docs 4 | description: > 5 | Customize the deployment and management of containers. 6 | weight: 3 7 | --- 8 | -------------------------------------------------------------------------------- /web/site/content/docs/references/containers/api-reference/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "API Reference" 3 | type: docs 4 | description: > 5 | API Reference for the Container Management Things service. 6 | weight: 3 7 | --- 8 | -------------------------------------------------------------------------------- /web/site/content/docs/references/file-backup/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "File Backup" 3 | type: docs 4 | description: > 5 | Customize the files backup and restore to and from a backend storage. 6 | weight: 6 7 | --- 8 | -------------------------------------------------------------------------------- /web/site/content/docs/references/file-backup/file-backup-config.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "File backup configuration" 3 | type: docs 4 | description: > 5 | Customize the files backup and restore to and from a backend storage. 6 | weight: 3 7 | --- 8 | 9 | ### Properties 10 | 11 | To control all aspects of the file backup behavior. 12 | 13 | | Property | Type | Default | Description | 14 | | - | - | - | - | 15 | | featureId | string | BackupAndRestore | Feature unique identifier in the scope of the edge digital twin | 16 | | type | string | file | Type of the files that are backed up by this feature | 17 | | context | string | edge | Context of the files backed up by this feature, unique in the scope of the `type` | 18 | | dir | string | | Directory to be backed up | 19 | | mode | string | strict | Restriction on directories that can be dynamically selected for a backup, the supported modes are: strict, lax and scoped | 20 | | backupCmd | string | | Command to be executed before the backup is done | 21 | | restoreCmd | string | | Command to be executed after the restore | 22 | | singleUpload | bool | false | Forbid triggering of new backups when there is a backup in progress | 23 | | checksum | bool | false | Send MD5 checksum for backed up files to ensure data integrity | 24 | | stopTimeout | string | 30s | Time to wait for running backups to finish as a sequence of decimal numbers, each with optional fraction and a unit suffix, such as: 300ms, 1.5h, 10m30s, etc., time units are: ns, us (or µs), ms, s, m, h | 25 | | keepUploaded | bool | false | Keep successfully uploaded backups locally | 26 | | storage | string | ./storage | Directory where backups and downloads will be stored | 27 | | **Upload/Download - TLS** | | | | 28 | | serverCert| string | | PEM encoded certificate file for secure uploads and downloads | 29 | | **Auto backup** | | | | 30 | | active | bool | false | Activate periodic backups | 31 | | activeFrom | string | | Time from which periodic backups should be active, in RFC 3339 format, if omitted (and `active` flag is set) current time will be used as start of the periodic backups | 32 | | activeTill | string | | Time till which periodic backups should be active, in RFC 3339 format, if omitted (and `active` flag is set) periodic backups will be active indefinitely | 33 | | period | string | 10h| Backup period as a sequence of decimal numbers, each with optional fraction and a unit suffix, such as: 300ms, 1.5h, 10m30s, etc., time units are: ns, us (or µs), ms, s, m, h | 34 | | **Local connectivity** | | | | 35 | | broker | string | tcp://localhost:1883 | Address of the MQTT server/broker that the file backup will connect for the local communication, the format is: `scheme://host:port` | 36 | | username | string | | Username that is a part of the credentials | 37 | | password | string | | Password that is a part of the credentials | 38 | | **Local connectivity - TLS** | | | | 39 | | caCert | string | | PEM encoded CA certificates file | 40 | | cert | string | | PEM encoded certificate file to authenticate to the MQTT server/broker | 41 | | key | string | | PEM encoded unencrypted private key file to authenticate to the MQTT server/broker | 42 | | **Logging** | | | | 43 | | logFile | string | log/file-backup.log | Path to the file where log messages are written | 44 | | logLevel | string | INFO | All log messages at this or a higher level will be logged, the log levels in descending order are: ERROR, WARN, INFO, DEBUG and TRACE | 45 | | logFileCount | int | 5 | Log file maximum rotations count | 46 | | logFileMaxAge | int | 28 | Log file rotations maximum age in days, use 0 to not remove old log files | 47 | | logFileSize | int | 2 | Log file size in MB before it gets rotated | 48 | 49 | ### Example 50 | 51 | The minimal required configuration that enables backing up a directory and sets the file type to config. 52 | 53 | ```json 54 | { 55 | "type": "config", 56 | "dir": "/var/tmp/file-backup", 57 | "mode": "scoped", 58 | "storage": "/var/lib/file-backup", 59 | "logFile": "/var/log/file-backup/file-backup.log" 60 | } 61 | ``` 62 | 63 | ### Template 64 | 65 | The configuration can be further adjusted according to the use case. 66 | The following template illustrates all possible properties with their default values. 67 | 68 | {{% warn %}} 69 | Be aware that some combinations may be incompatible. 70 | {{% /warn %}} 71 | 72 | ```json 73 | { 74 | "featureId": "BackupAndRestore", 75 | "type": "file", 76 | "context": "edge", 77 | "dir": "", 78 | "mode": "strict", 79 | "backupCmd": "", 80 | "restoreCmd": "", 81 | "singleUpload": false, 82 | "checksum": false, 83 | "stopTimeout": "30s", 84 | "keepUploaded": false, 85 | "storage": "./storage", 86 | "serverCert": "", 87 | "active": false, 88 | "activeFrom": "", 89 | "activeTill": "", 90 | "period": "10h", 91 | "broker": "tcp://localhost:1883", 92 | "username": "", 93 | "password": "", 94 | "caCert": "", 95 | "cert": "", 96 | "key": "", 97 | "logFile": "log/file-backup.log", 98 | "logLevel": "INFO", 99 | "logFileCount": 5, 100 | "logFileMaxAge": 28, 101 | "logFileSize": 2 102 | } 103 | ``` 104 | -------------------------------------------------------------------------------- /web/site/content/docs/references/file-upload/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "File Upload" 3 | type: docs 4 | description: > 5 | Customize the files transfer to a backend storage. 6 | weight: 5 7 | --- 8 | -------------------------------------------------------------------------------- /web/site/content/docs/references/file-upload/file-upload-config.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "File upload configuration" 3 | type: docs 4 | description: > 5 | Customize the files transfer to a backend storage. 6 | weight: 3 7 | --- 8 | 9 | ### Properties 10 | 11 | To control all aspects of the file upload behavior. 12 | 13 | | Property | Type | Default | Description | 14 | | - | - | - | - | 15 | | featureId | string | AutoUploadable | Feature unique identifier in the scope of the edge digital twin | 16 | | type | string | file | Type of the files that are uploaded by this feature | 17 | | context | string | edge | Context of the files that are uploaded by this feature, unique in the scope of the `type` | 18 | | files | string | | Glob pattern to select the files for upload | 19 | | mode | string | strict | Restriction on files that can be dynamically selected for an upload, the supported modes are: strict, lax and scoped | 20 | | singleUpload | bool | false | Forbid triggering of new uploads when there is an upload in progress | 21 | | checksum | bool | false | Send MD5 checksum for uploaded files to ensure data integrity | 22 | | stopTimeout | string | 30s | Time to wait for running uploads to finish as a sequence of decimal numbers, each with optional fraction and a unit suffix, such as: 300ms, 1.5h, 10m30s, etc., time units are: ns, us (or µs), ms, s, m, h | 23 | | delete | bool | false | Delete successfully uploaded files | 24 | | **Upload - TLS** | | | | 25 | | serverCert| string | | PEM encoded certificate file for secure uploads | 26 | | **Auto upload** | | | | 27 | | active | bool | false | Activate periodic uploads | 28 | | activeFrom | string | | Time from which periodic uploads should be active, in RFC 3339 format, if omitted (and `active` flag is set) current time will be used as start of the periodic uploads | 29 | | activeTill | string | | Time till which periodic uploads should be active, in RFC 3339 format, if omitted (and `active` flag is set) periodic uploads will be active indefinitely | 30 | | period | string | 10h | Upload period as a sequence of decimal numbers, each with optional fraction and a unit suffix, such as: 300ms, 1.5h, 10m30s, etc., time units are: ns, us (or µs), ms, s, m, h | 31 | | **Local connectivity** | | | | 32 | | broker | string | tcp://localhost:1883 | Address of the MQTT server/broker that the file upload will connect for the local communication, the format is: `scheme://host:port` | 33 | | username | string | | Username that is a part of the credentials | 34 | | password | string | | Password that is a part of the credentials | 35 | | **Local connectivity - TLS** | | | | 36 | | caCert | string | | PEM encoded CA certificates file | 37 | | cert | string | | PEM encoded certificate file to authenticate to the MQTT server/broker | 38 | | key | string | | PEM encoded unencrypted private key file to authenticate to the MQTT server/broker | 39 | | **Logging** | | | | 40 | | logFile | string | log/file-upload.log | Path to the file where log messages are written | 41 | | logLevel | string | INFO | All log messages at this or higher level will be logged, the log levels in descending order are: ERROR, WARN, INFO, DEBUG and TRACE | 42 | | logFileCount | int | 5 | Log file maximum rotations count | 43 | | logFileMaxAge | int | 28 | Log file rotations maximum age in days, use 0 to not remove old log files | 44 | | logFileSize | int | 2 | Log file size in MB before it gets rotated | 45 | 46 | ### Example 47 | 48 | The minimal required configuration that sets the file type to log. 49 | 50 | ```json 51 | { 52 | "type": "log", 53 | "files": "/var/tmp/file-upload/*.*", 54 | "logFile": "/var/log/file-upload/file-upload.log" 55 | } 56 | ``` 57 | 58 | ### Template 59 | 60 | The configuration can be further adjusted according to the use case. 61 | The following template illustrates all possible properties with their default values. 62 | 63 | ```json 64 | { 65 | "featureId": "AutoUploadable", 66 | "type": "file", 67 | "context": "edge", 68 | "files": "", 69 | "mode": "strict", 70 | "singleUpload": false, 71 | "checksum": false, 72 | "stopTimeout": "30s", 73 | "delete": false, 74 | "serverCert": "", 75 | "active": false, 76 | "activeFrom": "", 77 | "activeTill": "", 78 | "period": "10h", 79 | "broker": "tcp://localhost:1883", 80 | "username": "", 81 | "password": "", 82 | "caCert": "", 83 | "cert": "", 84 | "key": "", 85 | "logFile": "log/file-upload.log", 86 | "logLevel": "INFO", 87 | "logFileCount": 5, 88 | "logFileMaxAge": 28, 89 | "logFileSize": 2 90 | } 91 | ``` 92 | -------------------------------------------------------------------------------- /web/site/content/docs/references/software-updatable/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Software Updatable" 3 | type: docs 4 | description: > 5 | Customize the deployment and management of software artifacts. 6 | weight: 4 7 | --- 8 | -------------------------------------------------------------------------------- /web/site/content/docs/references/software-updatable/software-update-config.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Software update configuration" 3 | type: docs 4 | description: > 5 | Customize the deployment and management of software artifacts. 6 | weight: 3 7 | --- 8 | 9 | ### Properties 10 | 11 | To control all aspects of the software update behavior. 12 | 13 | | Property | Type | Default | Description | 14 | | - | - | - | - | 15 | | featureId | string | SoftwareUpdatable | Feature unique identifier in the scope of the edge digital twin | 16 | | moduleType | string | software | Type of the software that is managed by this feature | 17 | | artifactType | string | archive | Type of the artifact that is to be processed: archive or plain | 18 | | install | string[] | | Absolute path to the install script/command and an optional sequence of additional flags/parameters | 19 | | storageLocation | string | ./ | Path to the storage directory where the working files are stored | 20 | | installDirs | string[] | | File system directories where the local artifacts are stored | 21 | | mode | string | strict | Restriction where the local artifacts can be stored on the file system, the supported modes are: strict, lax and scope | 22 | | **Download** | | | | 23 | | downloadRetryCount | int| 0 | Number of retries, in case of a failed download | 24 | | downloadRetryInterval | string | 5s | Interval between retries, in case of a failed download as a sequence of decimal numbers, each with optional fraction and a unit suffix, such as: 300ms, 1.5h, 10m30s, etc., time units are: ns, us (or µs), ms, s, m, h | 25 | | **Download - TLS** | | | | 26 | | serverCert | string | | PEM encoded certificate file for secure downloads | 27 | | **Local connectivity** | | | | 28 | | broker | string | tcp://localhost:1883 | Address of the MQTT server/broker that the software update will connect for the local communication, the format is: `scheme://host:port` | 29 | | username | string | | Username that is a part of the credentials | 30 | | password | string | | Password that is a part of the credentials | 31 | | **Local connectivity - TLS** | | | | 32 | | caCert | string | | PEM encoded CA certificates file | 33 | | cert | string | | PEM encoded certificate file to authenticate to the MQTT server/broker | 34 | | key | string | | PEM encoded unencrypted private key file to authenticate to the MQTT server/broker | 35 | | **Logging** | | | | 36 | | logFile | string | log/software-update.log | Path to the file where log messages are written | 37 | | logLevel | string | INFO | All log messages at this or higher level will be logged, the log levels in descending order are: ERROR, WARN, INFO, DEBUG and TRACE | 38 | | logFileCount | int | 5 | Log file maximum rotations count | 39 | | logFileMaxAge | int | 28 | Log file rotations maximum age in days, use 0 to not remove old log files | 40 | | logFileSize | int | 2 | Log file size in MB before it gets rotated | 41 | 42 | ### Example 43 | 44 | The minimal required configuration that sets the software type to firmware. 45 | 46 | ```json 47 | { 48 | "moduleType": "firmware", 49 | "storageLocation": "/var/lib/software-update", 50 | "logFile": "/var/log/software-update/software-update.log" 51 | } 52 | ``` 53 | 54 | ### Template 55 | 56 | The configuration can be further adjusted according to the use case. 57 | The following template illustrates all possible properties with their default values. 58 | 59 | ```json 60 | { 61 | "featureId": "SoftwareUpdatable", 62 | "moduleType": "software", 63 | "artifactType": "archive", 64 | "install": [], 65 | "storageLocation": "./", 66 | "installDirs": [], 67 | "mode": "strict", 68 | "downloadRetryCount": 0, 69 | "downloadRetryInterval": "5s", 70 | "serverCert": "", 71 | "broker": "tcp://localhost:1883", 72 | "username": "", 73 | "password": "", 74 | "caCert": "", 75 | "cert": "", 76 | "key": "", 77 | "logFile": "log/software-update.log", 78 | "logLevel": "INFO", 79 | "logFileCount": 5, 80 | "logFileMaxAge": 28, 81 | "logFileSize": 2 82 | } 83 | ``` 84 | -------------------------------------------------------------------------------- /web/site/content/docs/references/system-metrics/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "System Metrics" 3 | type: docs 4 | description: > 5 | Customize the reporting of system metrics. 6 | weight: 7 7 | --- 8 | -------------------------------------------------------------------------------- /web/site/content/docs/references/system-metrics/system-metrics-config.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "System metrics configuration" 3 | type: docs 4 | description: > 5 | Customize the reporting of system metrics. 6 | weight: 3 7 | --- 8 | 9 | ### Properties 10 | 11 | To control all aspects of the system metrics behavior. 12 | 13 | | Property | Type | Default | Description | 14 | | - | - | - | - | 15 | | frequency | string | | Initial system metrics reporting frequency as a sequence of decimal numbers, each with optional fraction and a unit suffix, such as: 300ms, 1.5h, 10m30s, etc., time units are: ns, us (or µs), ms, s, m, h | 16 | | **Local connectivity** | | | | 17 | | broker | string | tcp://localhost:1883 | Address of the MQTT server/broker that the system metrics will connect for the local communication, the format is: `scheme://host:port` | 18 | | username | string | | Username that is a part of the credentials | 19 | | password | string | | Password that is a part of the credentials | 20 | | **Local connectivity - TLS** | | | | 21 | | caCert | string | | PEM encoded CA certificates file | 22 | | clientCert | string | | PEM encoded certificate file to authenticate to the MQTT server/broker | 23 | | clientKey | string | | PEM encoded unencrypted private key file to authenticate to the MQTT server/broker | 24 | | **Logging** | | | | 25 | | logFile | string | log/system-metrics.log | Path to the file where log messages are written | 26 | | logLevel | string | INFO | All log messages at this or higher level will be logged, the log levels in descending order are: ERROR, WARN, INFO, DEBUG and TRACE | 27 | | logFileCount | int | 5 | Log file maximum rotations count | 28 | | logFileMaxAge | int | 28 | Log file rotations maximum age in days, use 0 to not remove old log files | 29 | | logFileSize | int | 2 | Log file size in MB before it gets rotated | 30 | 31 | ### Example 32 | 33 | The minimal required configuration that enables the auto reporting of system metrics. 34 | 35 | ```json 36 | { 37 | "frequency": "60s", 38 | "logFile": "/var/log/system-metrics/system-metrics.log" 39 | } 40 | ``` 41 | 42 | ### Template 43 | 44 | The configuration can be further adjusted according to the use case. 45 | The following template illustrates all possible properties with their default values. 46 | 47 | ```json 48 | { 49 | "frequency" : "", 50 | "broker": "tcp://localhost:1883", 51 | "username": "", 52 | "password": "", 53 | "caCert": "", 54 | "clientCert": "", 55 | "cleintKey": "", 56 | "logFile": "log/system-metrics.log", 57 | "logLevel": "INFO", 58 | "logFileCount": 5, 59 | "logFileMaxAge": 28, 60 | "logFileSize": 2 61 | } 62 | ``` 63 | -------------------------------------------------------------------------------- /web/site/content/docs/references/update-manager/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Update Manager" 3 | type: docs 4 | description: > 5 | The kanto update manager service provides orchestration of OTA Updates towards a target device in a smart way. 6 | weight: 8 7 | --- 8 | -------------------------------------------------------------------------------- /web/site/content/docs/references/update-manager/update-manager-config.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Update manager configuration" 3 | type: docs 4 | description: > 5 | Customize the update manager. 6 | weight: 6 7 | --- 8 | 9 | ### Properties 10 | 11 | To control all aspects of the update manager. 12 | 13 | | Property | Type | Default | Description | 14 | | - | - | - | - | 15 | | **General** | | | | 16 | | domain | string | device | The domain of the update manager, used as MQTT topic prefix | 17 | | domains | string | containers| A comma-separated list of domains handled by the update manager. This configuration option is available only as a flag, but not inside the JSON config file. In JSON config file, the keys inside the Domain agents structure serve as domain names. | 18 | | phaseTimeout | string | 10m | Timeout as duration string for completing an Update Orchestration phase | 19 | | rebootAfter | string | 30s | Time period as duration string to wait before a reboot process is initiated after successful update operation | 20 | | rebootEnabled | bool | true | Enable the reboot process after successful update operation | 21 | | reportFeedbackInterval | string | 1m | Time interval as duration string for reporting intermediate desired state feedback messages during an active update operation | 22 | | currentStateDelay | string | 30s | Time interval as duration string for reporting current state messages | 23 | | thingsEnabled | bool | true | Enable the Update Manager to behave as a thing's feature | 24 | | ownerConsentCommands | []string | | List of commands for which an owner consent should be granted. Possible values are: 'DOWNLOAD', 'UPDATE', 'ACTIVATE' | 25 | | ownerConsentTimeout | string | 30m | Timeout as duration string to wait for owner consent" | 26 | | **Domain agents** | | | Holds a map structure (_agents_) with update agent configurations where each map key is treated as domain name | 27 | | readTimeout | string | 1m | Timeout as duration string for reading the current state for the domain | 28 | | rebootRequired | bool | false | Require a reboot for the domain after successful update | 29 | | **Local connectivity** | | | | 30 | | broker | string | tcp://localhost:1883 | Address of the MQTT server/broker that the container manager will connect for the local communication, the format is: `scheme://host:port` | 31 | | keepAlive | string | 20s | Keep alive duration for the MQTT requests as duration string | 32 | | disconnectTimeout | string | 250ms | Disconnect timeout for the MQTT server/broker as duration string | 33 | | username | string | | Username that is a part of the credentials | 34 | | password | string | | Password that is a part of the credentials | 35 | | acknowledgeTimeout | string | 15s | Acknowledge timeout for the MQTT requests as duration string | 36 | | connectTimeout | string | 30s | Connect timeout for the MQTT server/broker as duration string | 37 | | subscribeTimeout | string | 15s | Subscribe timeout for the MQTT requests as duration string | 38 | | unsubscribeTimeout | string | 5s | Unsubscribe timeout for the MQTT requests as duration string | 39 | | **Logging** | | | | 40 | | logFile | string | | Path to the file where the update manager’s log messages are written | 41 | | logLevel | string | INFO | All log messages at this or a higher level will be logged, the log levels in descending order are: ERROR, WARN, INFO, DEBUG and TRACE | 42 | | logFileCount | int | 5 | Log file maximum rotations count | 43 | | logFileMaxAge | int | 28 | Log file rotations maximum age in days, use 0 to not remove old log files | 44 | | logFileSize | int | 2 | Log file size in MB before it gets rotated | 45 | 46 | ### Example 47 | 48 | An example for configuring the update manager with two domains - `containers` and `custom-domain`, report feedback interval at 30 seconds, and log, written to custom log file `update-manager.log` with 49 | log level `DEBUG`. 50 | 51 | ```json 52 | { 53 | "log": { 54 | "logFile": "update-manager.log", 55 | "logLevel": "DEBUG" 56 | }, 57 | "agents": { 58 | "containers": { 59 | "readTimeout": "30s" 60 | }, 61 | "custom-domain": { 62 | "rebootRequired": true 63 | } 64 | }, 65 | "reportFeedbackInterval": "30s" 66 | } 67 | ``` 68 | 69 | ### Template 70 | 71 | The configuration can be further adjusted according to the use case. 72 | The following template illustrates all possible properties with their default values. 73 | 74 | ```json 75 | { 76 | "domain": "device", 77 | "agents": { 78 | "containers": { 79 | "rebootRequired": false, 80 | "readTimeout": "1m" 81 | } 82 | }, 83 | "log": { 84 | "logFile": "", 85 | "logLevel": "INFO", 86 | "logFileCount": 5, 87 | "logFileMaxAge": 28, 88 | "logFileSize": 2 89 | }, 90 | "connection": { 91 | "broker": "tcp://localhost:1883", 92 | "keepAlive": "20s", 93 | "acknowledgeTimeout": "15s", 94 | "username": "", 95 | "password": "", 96 | "connectTimeout": "30a", 97 | "disconnectTimeout": "250ms", 98 | "subscribeTimeout": "15s", 99 | "unsubscribeTimeout": "5s" 100 | }, 101 | "phaseTimeout": "10m", 102 | "rebootAfter": "30s", 103 | "rebootEnabled": true, 104 | "reportFeedbackInterval": "1m", 105 | "currentStateDelay": "30s", 106 | "thingsEnabled": true, 107 | "ownerConsentCommands": ["DOWNLOAD"] 108 | } 109 | ``` 110 | -------------------------------------------------------------------------------- /web/site/content/kanto_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/content/kanto_background.png -------------------------------------------------------------------------------- /web/site/content/search.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Search Results 3 | layout: search 4 | --- 5 | -------------------------------------------------------------------------------- /web/site/go.mod: -------------------------------------------------------------------------------- 1 | module github.com/eclipse-kanto/kanto 2 | 3 | go 1.21.9 4 | 5 | require ( 6 | github.com/google/docsy v0.8.0 // indirect 7 | github.com/google/docsy/dependencies v0.7.2 // indirect 8 | ) 9 | -------------------------------------------------------------------------------- /web/site/go.sum: -------------------------------------------------------------------------------- 1 | github.com/FortAwesome/Font-Awesome v0.0.0-20210804190922-7d3d774145ac/go.mod h1:IUgezN/MFpCDIlFezw3L8j83oeiIuYoj28Miwr/KUYo= 2 | github.com/FortAwesome/Font-Awesome v0.0.0-20220831210243-d3a7818c253f/go.mod h1:IUgezN/MFpCDIlFezw3L8j83oeiIuYoj28Miwr/KUYo= 3 | github.com/FortAwesome/Font-Awesome v0.0.0-20230327165841-0698449d50f2/go.mod h1:IUgezN/MFpCDIlFezw3L8j83oeiIuYoj28Miwr/KUYo= 4 | github.com/google/docsy v0.4.0 h1:Eyt2aiDC1fnw/Qq/9xnIqUU5n5Yyk4c8gX3nBDdTv/4= 5 | github.com/google/docsy v0.4.0/go.mod h1:vJjGkHNaw9bO42gpFTWwAUzHZWZEVlK46Kx7ikY5c7Y= 6 | github.com/google/docsy v0.5.0 h1:ND+6sYJD1VYEEM8olBdJLPIyQrPDeDkC0PhzuZTVZMs= 7 | github.com/google/docsy v0.5.0/go.mod h1:RKikAcSUR3b/40oqYfweD9uiNYTUirEKaCgLiEXMbQo= 8 | github.com/google/docsy v0.6.0 h1:43bVF18t2JihAamelQjjGzx1vO2ljCilVrBgetCA8oI= 9 | github.com/google/docsy v0.6.0/go.mod h1:VKKLqD8PQ7AglJc98yBorATfW7GrNVsn0kGXVYF6G+M= 10 | github.com/google/docsy v0.7.0 h1:JaeZ0/KufX/BJ3SyATb/fmZa1DFI7o5d9KU+i6+lLJY= 11 | github.com/google/docsy v0.7.0/go.mod h1:5WhIFchr5BfH6agjcInhpLRz7U7map0bcmKSpcrg6BE= 12 | github.com/google/docsy v0.7.1 h1:DUriA7Nr3lJjNi9Ulev1SfiG1sUYmvyDeU4nTp7uDxY= 13 | github.com/google/docsy v0.7.1/go.mod h1:JCmE+c+izhE0Rvzv3y+AzHhz1KdwlA9Oj5YBMklJcfc= 14 | github.com/google/docsy v0.8.0 h1:RgHyKRTo8YwScMThrf01Ky2yCGpUS1hpkspwNv6szT4= 15 | github.com/google/docsy v0.8.0/go.mod h1:FqTNN2T7pWEGW8dc+v5hQ5VF29W5uaL00PQ1LdVw5F8= 16 | github.com/google/docsy/dependencies v0.4.0/go.mod h1:2zZxHF+2qvkyXhLZtsbnqMotxMukJXLaf8fAZER48oo= 17 | github.com/google/docsy/dependencies v0.5.0/go.mod h1:2zZxHF+2qvkyXhLZtsbnqMotxMukJXLaf8fAZER48oo= 18 | github.com/google/docsy/dependencies v0.6.0/go.mod h1:EDGc2znMbGUw0RW5kWwy2oGgLt0iVXBmoq4UOqstuNE= 19 | github.com/google/docsy/dependencies v0.7.0/go.mod h1:gihhs5gmgeO+wuoay4FwOzob+jYJVyQbNaQOh788lD4= 20 | github.com/google/docsy/dependencies v0.7.1/go.mod h1:gihhs5gmgeO+wuoay4FwOzob+jYJVyQbNaQOh788lD4= 21 | github.com/google/docsy/dependencies v0.7.2 h1:+t5ufoADQAj4XneFphz4A+UU0ICAxmNaRHVWtMYXPSI= 22 | github.com/google/docsy/dependencies v0.7.2/go.mod h1:gihhs5gmgeO+wuoay4FwOzob+jYJVyQbNaQOh788lD4= 23 | github.com/twbs/bootstrap v4.6.1+incompatible/go.mod h1:fZTSrkpSf0/HkL0IIJzvVspTt1r9zuf7XlZau8kpcY0= 24 | github.com/twbs/bootstrap v4.6.2+incompatible/go.mod h1:fZTSrkpSf0/HkL0IIJzvVspTt1r9zuf7XlZau8kpcY0= 25 | github.com/twbs/bootstrap v5.2.3+incompatible/go.mod h1:fZTSrkpSf0/HkL0IIJzvVspTt1r9zuf7XlZau8kpcY0= 26 | -------------------------------------------------------------------------------- /web/site/layouts/404.html: -------------------------------------------------------------------------------- 1 | {{ define "main"}} 2 |
3 |
4 |
5 |
6 |

Element not found

7 |

The web address you entered is not a functioning page on our site.

8 |
9 | 17 |
18 |
19 |
20 | {{ end }} 21 | -------------------------------------------------------------------------------- /web/site/layouts/home.html: -------------------------------------------------------------------------------- 1 | {{ define "main" }} 2 | {{ with .Content }} 3 | {{ . }} 4 | 5 | {{ partial "architecture.html" (dict "regular_pages" $.Site.RegularPages "color_bg" "bg-white")}} 6 | {{ end }} 7 | {{ end }} 8 | -------------------------------------------------------------------------------- /web/site/layouts/partials/architecture.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Architecture

4 |
5 | 6 |
7 |

8 | Eclipse Kanto is based on lightweight native components, open protocols 9 | and standard containers that ensure availability on hardware, minimum 10 | integration work, reduced complexity and scalable edge applications.

11 |
12 | 13 |
14 | Eclipse Kanto Architecture 16 |
17 | 18 |
19 | 24 |
25 |
26 | 27 | -------------------------------------------------------------------------------- /web/site/layouts/partials/community_links.html: -------------------------------------------------------------------------------- 1 | {{ $links := .Site.Params.links }} 2 | 3 | 20 | 21 | {{ define "community-links-list" }} 22 | 30 | {{ end }} 31 | -------------------------------------------------------------------------------- /web/site/layouts/partials/footer.html: -------------------------------------------------------------------------------- 1 | {{ $links := .Site.Params.links }} 2 |
3 |
4 |
5 |
6 | {{ with $links }} 7 | {{ with index . "user"}} 8 | {{ template "footer-links-block" . }} 9 | {{ end }} 10 | {{ end }} 11 |
12 |
13 | {{ with $links }} 14 | {{ with index . "developer"}} 15 | {{ template "footer-links-block" . }} 16 | {{ end }} 17 | {{ end }} 18 |
19 |
20 | {{ with .Site.Params.copyright }}© {{ now.Year}} {{ .}}. {{ T "footer_all_rights_reserved" }}.{{ end }} 21 | {{ with .Site.Params.privacy_policy }}{{ T "footer_privacy_policy" }}{{ end }} 22 | {{ if not .Site.Params.ui.footer_about_disable }} 23 | {{ with .Site.GetPage "about" }}

{{ .Title }}

{{ end }} 24 | {{ end }} 25 |
26 |
27 |
28 | 36 |
37 |
38 |
39 | {{ with $links }} 40 | {{ with index . "eclipse"}} 41 | {{ template "footer-links-block-text" . }} 42 | {{ end }} 43 | {{ end }} 44 |
45 |
46 |
47 | {{ define "footer-links-block" }} 48 | 57 | {{ end }} 58 | {{ define "footer-links-block-text" }} 59 | 70 | {{ end }} 71 | -------------------------------------------------------------------------------- /web/site/layouts/partials/hooks/body-end.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /web/site/layouts/partials/kanto-container.html: -------------------------------------------------------------------------------- 1 | {{ $col_bg := .color_bg }} 2 | {{ $col_button := .color_btn }} 3 | {{ $button_text := .btn_text }} 4 |
5 |
6 |
7 |

8 | {{ if eq .Page.File.Ext "md" }} 9 | {{ .title | markdownify }} 10 | {{ else }} 11 | {{ .title | htmlUnescape | safeHTML }} 12 | {{ end }} 13 |

14 |

15 | {{ if eq .Page.File.Ext "md" }} 16 | {{ .text | markdownify }} 17 | {{ else }} 18 | {{ .text | htmlUnescape | safeHTML }} 19 | {{ end }} 20 |

21 | 31 |
32 |
33 |
34 | -------------------------------------------------------------------------------- /web/site/layouts/partials/navbar.html: -------------------------------------------------------------------------------- 1 | {{ $cover := .HasShortcode "blocks/cover" }} 2 | 56 | -------------------------------------------------------------------------------- /web/site/layouts/partials/page-meta-lastmod.html: -------------------------------------------------------------------------------- 1 | {{ if and (.GitInfo) (.Site.Params.github_repo) -}} 2 |
3 | {{ T "post_last_mod" }} {{ .Lastmod.Format .Site.Params.time_format_default -}} 4 |
5 | {{ end -}} 6 | -------------------------------------------------------------------------------- /web/site/layouts/partials/page-meta-links.html: -------------------------------------------------------------------------------- 1 | {{ if .Path }} 2 | {{ $pathFormatted := replace .Path "\\" "/" }} 3 | {{ $gh_repo := ($.Param "github_repo") }} 4 | {{ $gh_url := ($.Param "github_url") }} 5 | {{ $gh_subdir := ($.Param "github_subdir") }} 6 | {{ $gh_project_repo := ($.Param "github_project_repo") }} 7 | {{ $gh_branch := (default "main" ($.Param "github_branch")) }} 8 |
9 | {{ if $gh_url }} 10 | {{ T "post_edit_this" }} 11 | {{ else if $gh_repo }} 12 | {{ $gh_repo_path := printf "%s/content/%s" $gh_branch $pathFormatted }} 13 | {{ if ($gh_subdir) }} 14 | {{ $gh_repo_path = printf "%s/web/%s/content/%s" $gh_branch $gh_subdir $pathFormatted }} 15 | {{ end }} 16 | {{ $editURL := printf "%s/edit/%s" $gh_repo $gh_repo_path }} 17 | {{ $createURL := printf "%s/edit/%s" $gh_repo $gh_repo_path }} 18 | {{ $issuesURL := printf "%s/issues/new?title=%s" $gh_repo (safeURL $.Title )}} 19 | {{ $newPageStub := resources.Get "stubs/new-page-template.md" }} 20 | {{ $newPageQS := querify "value" $newPageStub.Content "filename" "change-me.md" | safeURL }} 21 | {{ $newPageURL := printf "%s/new/%s?%s" $gh_repo $gh_repo_path $newPageQS }} 22 | 23 | {{ T "post_edit_this" }} 24 | {{ T "post_create_issue" }} 25 | {{ if $gh_repo }} 26 | {{ $project_issueURL := printf "%s/issues/new" $gh_repo }} 27 | {{ T "post_create_project_issue" }} 28 | {{ end }} 29 | 30 | {{ end }} 31 | {{ with .CurrentSection.AlternativeOutputFormats.Get "print" }} 32 | {{ T "print_entire_section" }} 33 | {{ end }} 34 |
35 | {{ end }} 36 | -------------------------------------------------------------------------------- /web/site/layouts/partials/pager.html: -------------------------------------------------------------------------------- 1 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /web/site/layouts/partials/toc.html: -------------------------------------------------------------------------------- 1 | {{ if not .Params.notoc }} 2 | {{ with .TableOfContents }} 3 | {{ if ge (len .) 100 }} 4 |
{{ . }}
5 | {{ end }} 6 | {{ end }} 7 | {{ end }} -------------------------------------------------------------------------------- /web/site/layouts/shortcodes/blocks/cover.html: -------------------------------------------------------------------------------- 1 | {{ $_hugo_config := `{ "version": 1 }` }} 2 | {{ $blockID := printf "td-cover-block-%d" .Ordinal }} 3 | {{ $promo_image := (.Page.Resources.ByType "image").GetMatch "**background*" }} 4 | {{ $logo_image := (.Page.Resources.ByType "image").GetMatch "**logo*" }} 5 | {{ $col_id := .Get "color" | default "dark" }} 6 | {{ $image_anchor := .Get "image_anchor" | default "smart" }} 7 | {{ $logo_anchor := .Get "logo_anchor" | default "smart" }} 8 | {{ $type := .Get "type" | default "inner" }} 9 | {{/* Height can be one of: auto, min, med, max, full. */}} 10 | {{ $height := .Get "height" | default "max" }} 11 | {{ $byline := .Get "byline" | default "" }} 12 | {{ with $promo_image }} 13 | {{ $promo_image_big := (.Fill (printf "1920x1080 %s" $image_anchor)) }} 14 | {{ $promo_image_small := (.Fill (printf "960x540 %s" $image_anchor)) }} 15 | 16 | 17 | 27 | {{ end }} 28 |
29 | 30 |
31 |
32 | 33 | 34 | {{ with .Get "title" }}

35 | {{ $title := . }}{{ with $logo_image }} 36 | {{ $logo_image_resized := (.Fit (printf "70x70 %s" $logo_anchor)) }} 37 | {{ end }}{{ $title | html }}

39 | {{ end }} 40 | {{ with .Get "subtitle" }}

{{ . | html }}

{{ end }} 41 |
42 | {{ if eq .Page.File.Ext "md" }} 43 | {{ .Inner | markdownify }} 44 | {{ else }} 45 | {{ .Inner | htmlUnescape | safeHTML }} 46 | {{ end }} 47 |
48 | 49 |
50 | 51 |
52 | {{ if $byline }} 53 | 56 | {{ end }} 57 |
58 | -------------------------------------------------------------------------------- /web/site/layouts/shortcodes/blocks/section.html: -------------------------------------------------------------------------------- 1 | {{ $_hugo_config := `{ "version": 1 }` }} 2 | {{ $col_id := .Get "color" | default .Ordinal }} 3 | {{ $height := .Get "height" | default "auto" }} 4 | {{ $type := .Get "type" | default "" }} 5 | 6 |
7 |
8 |
9 | {{ if eq .Page.File.Ext "md" }} 10 | {{ .Inner | markdownify }} 11 | {{ else }} 12 | {{ .Inner | htmlUnescape | safeHTML }} 13 | {{ end }} 14 |
15 |
16 |
17 | -------------------------------------------------------------------------------- /web/site/layouts/shortcodes/home-about.html: -------------------------------------------------------------------------------- 1 | {{ $_hugo_config := `{ "version": 1 }` }} 2 | {{ $col_id := .Get "color" | default .Ordinal }} 3 | {{ $height := .Get "height" | default "auto" }} 4 | {{ $type := .Get "type" | default "" }} 5 | 6 |
7 |
8 | Eclipse Kanto 10 | {{ with .Get "title" }} 11 |
12 |

{{ . }}

13 |
14 | {{ end }} 15 |
16 | {{ if eq .Page.File.Ext "md" }} 17 | {{ .Inner | markdownify }} 18 | {{ else }} 19 | {{ .Inner | htmlUnescape | safeHTML }} 20 | {{ end }} 21 |
22 |
23 |
24 | 29 | 34 |
35 |
36 | -------------------------------------------------------------------------------- /web/site/layouts/shortcodes/home-component-list.html: -------------------------------------------------------------------------------- 1 | {{ $_hugo_config := `{ "version": 1 }` }} 2 | {{ $col_id := .Get "color" | default .Ordinal }} 3 | {{ $height := .Get "height" | default "auto" }} 4 | {{ $type := .Get "type" | default "" }} 5 | 6 | {{ with .Get "title" }} 7 |
8 |

{{ . }}

9 |
10 | {{ end }} 11 |
12 |
13 |
14 | {{ if eq .Page.File.Ext "md" }} 15 | {{ .Inner | markdownify }} 16 | {{ else }} 17 | {{ .Inner | htmlUnescape | safeHTML }} 18 | {{ end }} 19 |
20 |
21 |
22 | -------------------------------------------------------------------------------- /web/site/layouts/shortcodes/home-component.html: -------------------------------------------------------------------------------- 1 | {{ $icon := .Get "icon" }} 2 | {{ $col_id := .Get "color" | default "dark" }} 3 | {{ $url_text := .Get "url_text" }} 4 |
5 |
6 |
7 |
8 | 9 |
10 |

11 | {{ if eq .Page.File.Ext "md" }} 12 | {{ .Get "title" | markdownify }} 13 | {{ else }} 14 | {{ .Get "title" | htmlUnescape | safeHTML }} 15 | {{ end }} 16 |

17 |

18 | {{ if eq .Page.File.Ext "md" }} 19 | {{ .Inner | markdownify }} 20 | {{ else }} 21 | {{ .Inner | htmlUnescape | safeHTML }} 22 | {{ end }} 23 |

24 |
25 | 35 |
36 |
37 | -------------------------------------------------------------------------------- /web/site/layouts/shortcodes/include.html: -------------------------------------------------------------------------------- 1 | {{ $_hugo_config := `{ "version": 1 }` }} 2 | {{ $file := .Get "file" | default "" }} 3 | {{ $col_id := .Get "color" | default .Ordinal }} 4 | {{ $height := .Get "height" | default "auto" }} 5 | {{ $ref := .Get "ref" | default "" }} 6 |
7 |
8 | {{ with .Get "title" }} 9 |
10 |

{{ . | safeHTML }}

11 |
12 | {{ end }} 13 |
14 |
15 | {{ $page := .Site.GetPage $file }} 16 | {{ with $page }} 17 | {{ .Content }} 18 | {{ end }} 19 |
20 |
21 | -------------------------------------------------------------------------------- /web/site/layouts/shortcodes/note.html: -------------------------------------------------------------------------------- 1 | {{ $_hugo_config := `{ "version": 1 }` }} 2 | -------------------------------------------------------------------------------- /web/site/layouts/shortcodes/page.html: -------------------------------------------------------------------------------- 1 | {{ $_hugo_config := `{ "version": 1 }` }} 2 | {{ $col_id := .Get "color" | default .Ordinal }} 3 | {{ $height := .Get "height" | default "auto" }} 4 | {{ $type := .Get "type" | default "" }} 5 | 6 | {{ with .Get "title" }} 7 |
8 | 9 |

{{ . }}

10 |
11 | {{ end }} 12 |
13 |
14 | 15 |
16 |

KANTO

17 |
18 |
19 |
20 | {{ if eq .Page.File.Ext "md" }} 21 | {{ .Inner | markdownify }} 22 | {{ else }} 23 | {{ .Inner | htmlUnescape | safeHTML }} 24 | {{ end }} 25 |
26 |
27 |
28 | -------------------------------------------------------------------------------- /web/site/layouts/shortcodes/refn.html: -------------------------------------------------------------------------------- 1 | {{ $_hugo_config := `{ "version": 1 }` }} 2 | {{- "" -}}{{if eq .Page.File.Ext "md"}}{{.Inner|markdownify}}{{else}}{{.Inner|htmlUnescape|safeHTML}}{{end}}{{- "" -}} -------------------------------------------------------------------------------- /web/site/layouts/shortcodes/relrefn.html: -------------------------------------------------------------------------------- 1 | {{ $_hugo_config := `{ "version": 1 }` }} 2 | {{- "" -}}{{if eq .Page.File.Ext "md"}}{{.Inner|markdownify}}{{else}}{{.Inner|htmlUnescape|safeHTML}}{{end}}{{- "" -}} -------------------------------------------------------------------------------- /web/site/layouts/shortcodes/tip.html: -------------------------------------------------------------------------------- 1 | {{ $_hugo_config := `{ "version": 1 }` }} 2 | 12 | -------------------------------------------------------------------------------- /web/site/layouts/shortcodes/warn.html: -------------------------------------------------------------------------------- 1 | {{ $_hugo_config := `{ "version": 1 }` }} 2 | -------------------------------------------------------------------------------- /web/site/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "website_source_files", 3 | "version": "0.0.1", 4 | "description": "Eclipse Kanto website & documentation", 5 | "author": "Eclipse Kanto", 6 | "main": "index.js", 7 | "scripts": { 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "license": "Apache-2.0", 11 | "devDependencies": { 12 | "autoprefixer": "^10.2.6", 13 | "postcss": "^8.4.35", 14 | "postcss-cli": "^8.3.1" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /web/site/static/css/prism.css: -------------------------------------------------------------------------------- 1 | /* PrismJS 1.25.0 2 | https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+bash+csharp+css-extras+docker+go+java+json+kotlin+markdown+python+ruby+toml+typescript+yaml&plugins=toolbar+copy-to-clipboard */ 3 | code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:rgb(84, 124, 2)}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help} 4 | div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;top:.3em;right:.2em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,.2);box-shadow:0 2px 0 0 rgba(0,0,0,.2);border-radius:.5em}div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover{color:inherit;text-decoration:none} 5 | -------------------------------------------------------------------------------- /web/site/static/favicons/_head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /web/site/static/favicons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/favicons/apple-touch-icon.png -------------------------------------------------------------------------------- /web/site/static/favicons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/favicons/favicon-16x16.png -------------------------------------------------------------------------------- /web/site/static/favicons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/favicons/favicon-32x32.png -------------------------------------------------------------------------------- /web/site/static/favicons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/favicons/favicon.ico -------------------------------------------------------------------------------- /web/site/static/googlef3e6aa07fecc4b79.html: -------------------------------------------------------------------------------- 1 | google-site-verification: googlef3e6aa07fecc4b79.html -------------------------------------------------------------------------------- /web/site/static/images/docs/concepts/aws-connector.odg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/images/docs/concepts/aws-connector.odg -------------------------------------------------------------------------------- /web/site/static/images/docs/concepts/aws-connector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/images/docs/concepts/aws-connector.png -------------------------------------------------------------------------------- /web/site/static/images/docs/concepts/container-management.odg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/images/docs/concepts/container-management.odg -------------------------------------------------------------------------------- /web/site/static/images/docs/concepts/container-management.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/images/docs/concepts/container-management.png -------------------------------------------------------------------------------- /web/site/static/images/docs/concepts/file-upload.odg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/images/docs/concepts/file-upload.odg -------------------------------------------------------------------------------- /web/site/static/images/docs/concepts/file-upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/images/docs/concepts/file-upload.png -------------------------------------------------------------------------------- /web/site/static/images/docs/concepts/local-digital-twins.odg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/images/docs/concepts/local-digital-twins.odg -------------------------------------------------------------------------------- /web/site/static/images/docs/concepts/local-digital-twins.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/images/docs/concepts/local-digital-twins.png -------------------------------------------------------------------------------- /web/site/static/images/docs/concepts/software-update.odg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/images/docs/concepts/software-update.odg -------------------------------------------------------------------------------- /web/site/static/images/docs/concepts/software-update.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/images/docs/concepts/software-update.png -------------------------------------------------------------------------------- /web/site/static/images/docs/concepts/suite-connector.odg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/images/docs/concepts/suite-connector.odg -------------------------------------------------------------------------------- /web/site/static/images/docs/concepts/suite-connector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/images/docs/concepts/suite-connector.png -------------------------------------------------------------------------------- /web/site/static/images/docs/concepts/update-manager.odg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/images/docs/concepts/update-manager.odg -------------------------------------------------------------------------------- /web/site/static/images/docs/concepts/update-manager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/images/docs/concepts/update-manager.png -------------------------------------------------------------------------------- /web/site/static/images/docs/how-to-guides/login_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/images/docs/how-to-guides/login_page.png -------------------------------------------------------------------------------- /web/site/static/images/docs/how-to-guides/runqemu_qemuarm64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/images/docs/how-to-guides/runqemu_qemuarm64.png -------------------------------------------------------------------------------- /web/site/static/images/docs/how-to-guides/verify_kanto_components.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/images/docs/how-to-guides/verify_kanto_components.png -------------------------------------------------------------------------------- /web/site/static/images/home/eclipse-kanto-long.odg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/images/home/eclipse-kanto-long.odg -------------------------------------------------------------------------------- /web/site/static/images/home/eclipse-kanto-long.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/images/home/eclipse-kanto-long.png -------------------------------------------------------------------------------- /web/site/static/images/logos/eclipse/new_iot_logo_clr -white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 12 | 14 | 17 | 18 | 21 | 23 | 24 | 25 | 28 | 31 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /web/site/static/images/logos/kanto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eclipse-kanto/kanto/73498a5d1993d44badfec098187a0d42e78c3bca/web/site/static/images/logos/kanto.png --------------------------------------------------------------------------------