dutctl

module
v1.0.0-alpha.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 27, 2025 License: BSD-2-Clause

README

DUT Control: Unified Device Management for Open Firmware Development

dutctl stands for "Device-under-Test Control" and is an open-source command-line utility and service ecosystem for managing development and test devices in firmware environments. By providing a unified interface to interact with boards and test fixtures across platforms, dutctl eliminates the fragmentation of device management tools that has long plagued firmware workflows. The project features remote device control, command streaming, multi-architecture testing, and a flexible plugin architecture for extensibility.

GitHub Release Build StatusLicense Go Report Card


Overview

dutctl is designed for firmware developers, QA teams, and CI/CD pipelines, simplifying complex device interactions through intuitive commands, easy configuration and scalability. The platform supports both local and remote device management through its agent-server architecture, enabling efficient collaboration in distributed teams.

┌────────────┐        ┌────────────┐        ┌───────────┐
│ Client     │        │ Agent      │        │ Device-   │
│ (e.g.      │ Network│ (e.g. RPi4)│  Wired │ under-    │
│ Laptop)    │───────▶│            │───────▶│ Test      │
└────────────┘  RPC   └────────────┘        └───────────┘
                

Key features include:

  • Unified command interface for diverse devices
  • Remote device management and command streaming
  • Multi-architecture and distributed testing
  • Extensible plugin system for new hardware and protocols

For detailed information on the system architecture, see the Documentation.

Supported Client OS Recommended DUT Agent Hardware
Linux RaspberryPi 4

Getting Started

Download the latest release or use the go toolchain to install the components: go install github.com/BlindspotSoftware/dutctl/cmds/dutctl@latest github.com/BlindspotSoftware/dutctl/cmds/dutagent@latest

  1. Start the DUT Agent

    dutagent -a localhost:1024 -c ./contrib/dutagent-cfg-example.yaml
    

    Run the DUT Agent locally with an example configuration in a separate terminal session. This test configuration does not require a connected DUT.

  2. Play around with the DUT Client

    # dutctl connect to localhost:1024 by default.
    # Use 'list' to see the available devices that are managed be the agent:
    dutctl list
    
    # You can discover the available commands per device and run them. 
    # Check out the usage information to learn how:
    dutctl -h
    

Public Interfaces

With the current pre-release state, we are working towards a stable and backwards compatible v1. Therefore we identified the following public interfaces, which will become stable with the first major release:

  1. The command line interfaces of the project's apps

    • The client, see dutctl -h
    • The agent, see dutagent -h
    • The relay server (upcoming, currently PoC)
  2. The configuring the agents

  3. The RPC communication protocol for calling agents

Individual Setup

If you are ready to get your hands dirty, hook up your DUT to a singel board computer (we recomend RPi4) and launch the DUT agent on it. Below you can find the currently supported modules with example configurations. Read on here, to learn how you can adapt the agent's configuration to your needs

Modules Status
GPIO Button
GPIO Switch
IPMI Power Control
Power Distribution Unit, Intellinet
Power Distribution Unit, Delock
SPI Flasher, flashrom
SPI Flasher, flashprog
Serial Console
Shell Execution
Secure Shell (SSH)

If you have special needs, you can extend the system with your own modules. Read about the module plugin system.

DUT Control at Scale

If you have multiple devices hooked up to multiple agents at differen location, you may wounder if you can handle them without connecting to the respective agents every time. DUT server is there for the rescue: It is at proof-of-concept state right now, but you can already try it out.

Contributing

Contributions are welcome! Please see our Contributing Guide for details on how to get involved.


This project is supported by the NLnet Foundation and the Next Generation Internet (NGI) Zero Commons Fund. The NGI0 Commons Fund is made possible with financial support from the European Commission's Next Generation Internet programme.

nlnet European Union NGI0

Directories

Path Synopsis
cmds
dutagent command
dutagent is the server of the DUT Control system.
dutagent is the server of the DUT Control system.
dutctl command
dutctl is the client application of the DUT Control system.
dutctl is the client application of the DUT Control system.
exp/dutserver command
dutserver is EXPERIMENTAL! It serves as a relay for dutctl requests to multiple registered DUT agents.
dutserver is EXPERIMENTAL! It serves as a relay for dutctl requests to multiple registered DUT agents.
internal
buildinfo
Package buildinfo provides a way to read the build information embedded in a Go binary.
Package buildinfo provides a way to read the build information embedded in a Go binary.
chanio
Package chanio provides a way to use channels as io.Reader and io.Writer.
Package chanio provides a way to use channels as io.Reader and io.Writer.
dutagent
Package broker provides utilities for a dutagent service to handel the RPC requests.
Package broker provides utilities for a dutagent service to handel the RPC requests.
fsm
Package fsm provides a simple but powerful finite state machine implementation.
Package fsm provides a simple but powerful finite state machine implementation.
test/mock
The mock package provides implementations of dutctl entities that can be used for unit-testing modules.
The mock package provides implementations of dutctl entities that can be used for unit-testing modules.
pkg
dut
Package dut provides representation of the device-under-test (DUT).
Package dut provides representation of the device-under-test (DUT).
module
Package module provides a plugin system for the DUT package.
Package module provides a plugin system for the DUT package.
module/flash
Package flash provides a dutagent module that reads or writes the SPI flash on the DUT.
Package flash provides a dutagent module that reads or writes the SPI flash on the DUT.
module/gpio
The gpio package provides two modules that simulate buttons and switches respectively, using the GPIO pins of the Raspberry Pi.
The gpio package provides two modules that simulate buttons and switches respectively, using the GPIO pins of the Raspberry Pi.
module/ipmi
Package IPMI provides a dutagent module that allows IPMI commands to be sent to a DUT's BMC.
Package IPMI provides a dutagent module that allows IPMI commands to be sent to a DUT's BMC.
module/pdu
Package pdu provides a dutagent module that allows power control of a PDU via HTTP requests.
Package pdu provides a dutagent module that allows power control of a PDU via HTTP requests.
module/serial
Package serial provides a dutagent module that listens on a defined COM port.
Package serial provides a dutagent module that listens on a defined COM port.
module/shell
Package shell provides a dutagent module that executes shell commands.
Package shell provides a dutagent module that executes shell commands.
module/ssh
Package ssh provides a dutagent module that connects to the DUT via Secure Shell and executes commands that are passed to the module from the dutctl client.
Package ssh provides a dutagent module that connects to the DUT via Secure Shell and executes commands that are passed to the module from the dutctl client.
protobuf

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL