Edgehog Device Runtime
Edgehog Device Runtime is a middleware written in Rust that enables remote device management via Astarte. This document serves as a developer-oriented guide for contributing to or extending the Edgehog Device Runtime.
Overview
Edgehog Device Runtime communicates with the Edgehog backend via Astarte using either:
- Astarte Device SDK Rust
- Astarte Message Hub
It implements various features like OS and hardware monitoring, network status, OTA updates, battery reporting, and more, based on Astarte interfaces defined in edgehog-astarte-interfaces.
Getting Started
Prerequisites
Make sure you have the following installed on your development machine:
- Rust: Use
rustupto install the latest stable version. - Cargo: Comes bundled with Rust.
- Git: For cloning the repository.
- Systemd: Required for service status monitoring (Linux only).
- Astarte instance: You must have access to a working Astarte backend.
Clone the Repository
git clone https://github.com/edgehog-device-manager/edgehog-device-runtime.git
cd edgehog-device-runtime
Build the Project
You can build the project in debug mode:
cargo build
For production-ready builds:
cargo build --release
To include container management support:
cargo build --features containers
Running the Runtime
Start the runtime using:
cargo run
With custom config:
cargo run -- --config path/to/edgehog-config.toml
View help options:
cargo run -- --help
Configuration
Edgehog Device Runtime supports multiple paths for configuration files in TOML format. The configuration file is searched in the following order:
- Path provided via CLI (
--config <path>) $PWD/edgehog-config.toml/etc/edgehog/config.toml
Example Configuration File
[general]
device_id = "my-device-001"
transport = "astarte-message-hub" # Options: "astarte-message-hub", "astarte-device-sdk"
[logging]
level = "info" # Options: "debug", "info", "warn", "error"
[container]
engine = "podman" # Options: "podman", "docker"
timeout_seconds = 30
Features Implemented
| Feature | Description |
|---|---|
| OS Info | Extracted from /etc/os-release |
| Hardware Info | CPU, memory, disk, and other hardware-related metadata |
| System Status | CPU load, memory usage, uptime from /proc |
| Network Interfaces | IP addresses, MAC, connection state |
| Battery Status | Read from ACPI or sysfs for battery presence and metrics |
| OTA Updates | Integrates with RAUC for secure image-based updates |
| Remote Terminal | Allows admin to start terminal sessions remotely |
| Container Management | Manage lifecycle of containers on the target device |
| Runtime Info | Displays Rust compiler version and crate version |
Communication With Astarte
Edgehog Device Runtime uses Astarte interfaces to exchange data with the backend. Interfaces define what data is collected and how it’s structured.
Astarte Device SDK
- Communicates directly with Astarte using MQTT and pairing tokens
- Lightweight and suitable for devices with reliable connectivity
Astarte Message Hub
- A local service that multiplexes device messages to Astarte
- Useful for running multiple services on one device with a shared connection
- Must be installed and running on the device
OTA Updates with RAUC
The runtime can report and trigger updates via RAUC. Configuration must include:
[ota]
backend = "rauc"
Ensure RAUC is installed and properly configured with signed bundles and active/passive slots.
Diagram:
flowchart TD
EDR[Edgehog Device Runtime]
RAUC[RAUC OTA Manager]
FLASH[Flash Partitions]
EDR -->|Triggers update| RAUC
RAUC -->|Writes image| FLASH
style EDR fill:#e0f7fa,stroke:#333,stroke-width:1.5,rx:8
style RAUC fill:#fff9c4,stroke:#333,stroke-width:1.5,rx:8
style FLASH fill:#ffe0b2,stroke:#333,stroke-width:1.5,rx:8
Remote Terminal Sessions
The runtime exposes a secure channel for initiating terminal sessions from the cloud. It supports session logs and can be integrated with audit tools.
Security recommendations:
- Ensure proper authentication on the Astarte realm
- Set up session timeout and activity tracking
Diagram:
flowchart LR
Browser[Browser]
Astarte[Astarte Backend]
Edgehog[Edgehog Device]
Browser -- "Web UI/API" --> Astarte
Astarte -- "MQTT/WebSocket" --> Edgehog
Edgehog -- "Telemetry/Control" --> Astarte
Astarte -- "Web UI/API" --> Browser
style Browser fill:#e3f2fd,stroke:#333,stroke-width:1.5,rx:8
style Astarte fill:#c8e6c9,stroke:#333,stroke-width:1.5,rx:8
style Edgehog fill:#ffe0b2,stroke:#333,stroke-width:1.5,rx:8
Container Management (Optional)
When built with the containers feature, Edgehog Device Runtime can:
- Start, stop, and monitor containers
- Pull new container images
- Report container health to Astarte
Configure in config.toml:
[container]
engine = "podman"
timeout_seconds = 30
Supported engines:
- Docker
- Podman
The container interface allows remote orchestration of edge applications.
Development Tips
Code Style
- Format code using
cargo fmt - Use idiomatic Rust patterns and error handling
Testing
Run the full test suite:
cargo test
Linting and Static Analysis
Run Clippy to detect common Rust issues:
cargo clippy
Ensure no warnings or panics exist before submitting changes.