TLS encryption for client-agent communication - #269
Open
RiSKeD wants to merge 1 commit into
Open
Blindspot Software - Firmware CI / test-dutctl - Test dummy modules
succeeded
Jul 27, 2026 in 13s
Test dummy modules
Click here to view the job on FirmwareCI.
Details
Report for Test dummy modules
Job ID: 01KYHH18TDJNJ05YM712DBHSWJ
DUT: fwci-dutctl-tester
Status: succeeded
Started: 2026-07-27T12:13:27+02:00
Ended: 2026-07-27T12:13:37+02:00
Duration: 11s
1. Setup (succeeded)
- chmod dutctl (succeeded)
### INPUT
Parameters:
Executable: chmod
Args: [755, /tmp/dutctl]
Transport:
Proto: local
Options:
OnError: strict
### OPERATION
/usr/bin/chmod 755 /tmp/dutctl
### OUTPUT
no output
- Copy over dutctl debian package (succeeded)
### INPUT
Parameters:
DstPath: dutctl.deb
SrcPath: /tmp/dutctl_0.0.0~SNAPSHOT-dd3a45e_arm64.deb
Transport:
Proto: ssh
Options:
host: fwci-dutctl-tester.sec.9e.network
identity_file: /root/.ssh/fwci
user: root
Options:
Timeout: 1m0s
OnError: strict
### OPERATION
scp /tmp/dutctl_0.0.0~SNAPSHOT-dd3a45e_arm64.deb dutctl.deb -> target via SSH
### OUTPUT
Successfully copied /tmp/dutctl_0.0.0~SNAPSHOT-dd3a45e_arm64.deb to dutctl.deb
- Install dutctl package (succeeded)
### INPUT
Parameters:
Executable: dpkg
Args: [-i, dutctl.deb]
Transport:
Proto: ssh
Options:
host: fwci-dutctl-tester.sec.9e.network
identity_file: /root/.ssh/fwci
user: root
Options:
OnError: strict
### OPERATION
dpkg -i dutctl.deb
### OUTPUT
**Stdout** (5 lines):
Selecting previously unselected package dutctl.
(Reading database ... 79104 files and directories currently installed.)
Preparing to unpack dutctl.deb ...
Unpacking dutctl (0.0.0~SNAPSHOT-dd3a45e) ...
Setting up dutctl (0.0.0~SNAPSHOT-dd3a45e) ...
- Copy over test config file (succeeded)
### INPUT
Parameters:
DstPath: /etc/dutctl.yaml
SrcPath: /tmp/dutagent-cfg-example.yaml
Transport:
Proto: ssh
Options:
host: fwci-dutctl-tester.sec.9e.network
identity_file: /root/.ssh/fwci
user: root
Options:
Timeout: 1m0s
OnError: strict
### OPERATION
scp /tmp/dutagent-cfg-example.yaml /etc/dutctl.yaml -> target via SSH
### OUTPUT
Successfully copied /tmp/dutagent-cfg-example.yaml to /etc/dutctl.yaml
- chmod config file (succeeded)
### INPUT
Parameters:
Executable: chmod
Args: [644, /etc/dutctl.yaml]
Transport:
Proto: ssh
Options:
user: root
host: fwci-dutctl-tester.sec.9e.network
identity_file: /root/.ssh/fwci
Options:
OnError: strict
### OPERATION
chmod 644 /etc/dutctl.yaml
### OUTPUT
no output
- Reload systemctl daemon (succeeded)
### INPUT
Parameters:
Executable: systemctl
Args: [daemon-reload]
Transport:
Proto: ssh
Options:
host: fwci-dutctl-tester.sec.9e.network
identity_file: /root/.ssh/fwci
user: root
Options:
OnError: strict
### OPERATION
systemctl daemon-reload
### OUTPUT
no output
- Start systemd service (succeeded)
### INPUT
Parameters:
Executable: systemctl
Args: [start, dutagent.service]
Transport:
Proto: ssh
Options:
identity_file: /root/.ssh/fwci
user: root
host: fwci-dutctl-tester.sec.9e.network
Options:
OnError: strict
### OPERATION
systemctl start dutagent.service
### OUTPUT
no output
- Status systemd service (succeeded)
### INPUT
Parameters:
Command: systemctl status --no-pager dutagent.service
Expect:
- Regex: Active: active \(running\)
Transport:
Proto: ssh
Options:
host: fwci-dutctl-tester.sec.9e.network
identity_file: /root/.ssh/fwci
user: root
Options:
OnError: strict
### OPERATION
systemctl status --no-pager dutagent.service
### OUTPUT
**Stdout** (22 lines):
● dutagent.service - dutagent to run on devices under test
Loaded: loaded (/etc/systemd/system/dutagent.service; disabled; preset: enabled)
Drop-In: /etc/systemd/system/dutagent.service.d
└─override.conf
Active: active (running) since Mon 2026-07-27 12:13:30 CEST; 198ms ago
Docs: https://github.com/BlindspotSoftware/dutctl
Main PID: 29777 (dutagent)
Tasks: 8 (limit: 453)
CPU: 32ms
CGroup: /system.slice/dutagent.service
└─29777 /usr/bin/dutagent -a 0.0.0.0:2024 -c /etc/dutctl.yaml
Jul 27 12:13:30 fwci-dutctl-tester dutagent[29777]: 2026/07/27 12:13:30 INFO [agent] loading configuration path=/etc/dutctl.yaml
Jul 27 12:13:30 fwci-dutctl-tester dutagent[29777]: 2026/07/27 12:13:30 INFO [agent] generated self-signed TLS certificate cert=/var/lib/dutagent/tls/cert.pem key=/var/lib/dutagent/tls/key.pem
Jul 27 12:13:30 fwci-dutctl-tester dutagent[29777]: 2026/07/27 12:13:30 DEBUG [module] initializing module device=device3 command=status module=dummy-status
Jul 27 12:13:30 fwci-dutctl-tester dutagent[29777]: 2026/07/27 12:13:30 DEBUG [module] initializing module device=device3 command=file-transfer module=dummy-status
Jul 27 12:13:30 fwci-dutctl-tester dutagent[29777]: 2026/07/27 12:13:30 DEBUG [module] initializing module device=device3 command=file-transfer module=dummy-ft
Jul 27 12:13:30 fwci-dutctl-tester dutagent[29777]: 2026/07/27 12:13:30 DEBUG [module] initializing module device=device1 command=status module=dummy-status
Jul 27 12:13:30 fwci-dutctl-tester dutagent[29777]: 2026/07/27 12:13:30 DEBUG [module] initializing module device=device2 command=status module=dummy-status
Jul 27 12:13:30 fwci-dutctl-tester dutagent[29777]: 2026/07/27 12:13:30 DEBUG [module] initializing module device=device2 command=repeat module=dummy-repeat
Jul 27 12:13:30 fwci-dutctl-tester dutagent[29777]: 2026/07/27 12:13:30 INFO [agent] module initialization complete
Jul 27 12:13:30 fwci-dutctl-tester dutagent[29777]: 2026/07/27 12:13:30 INFO [agent] rpc service listening with TLS addr=0.0.0.0:2024 cert=/var/lib/dutagent/tls/cert.pem
Found the expected string for 'Expect1' in Stdout: '{Active: active \(running\)}'
- dutctl help (succeeded)
### INPUT
Parameters:
Executable: /tmp/dutctl
Args: [--help]
Transport:
Proto: local
Options:
OnError: strict
### OPERATION
/tmp/dutctl --help
### OUTPUT
**Stderr** (45 lines):
dutctl - The client application of the DUT Control system.
SYNOPSIS:
dutctl [options] [list]
dutctl [options] <device>
dutctl [options] <device> <command> [args...]
dutctl [options] <device> <command> help
dutctl [options] <device> lock [duration]
dutctl [options] <device> unlock [force]
dutctl version
If a device and a command are provided, dutctl will execute the command on the device.
The optional args are passed to the command.
To list all available devices, use the list command. If only a device is provided,
dutctl list all available commands for the device.
If a device, a command and the keyword help are provided, dutctl will show usage
information for the command.
The lock command reserves a device for the current user for an optional duration
(e.g. 30m, 2h); when omitted, the agent applies a default. The unlock command
releases it; add the force keyword to release a lock held by another user.
Locks are advisory, so reserve a device only as long as you need it.
When dutctl is run without any positional arguments, it defaults to the list command.
dutctl talks to the agent over TLS by default. The agent's certificate is not
verified, so the connection is encrypted but not authenticated. Use -insecure to
talk to an agent that was started with -insecure; both ends must agree.
OPTIONS:
-f string
Output format, text|json|yaml|oneline, default is text
-insecure
Disable TLS and talk plain HTTP/2 cleartext (h2c); for an agent started with -insecure
-log value
Client-side diagnostic logging (on stderr), debug|warn|none, default is warn (default warn)
-no-color
Disable colored output
-s string
Address and port of the dutagent to connect to in the format: address:port (default "localhost:1024")
-u string
User Identity of the user of the device, defaults to <user>@<host> (default "unknown-c1dfb74f")
-v Annotate output with connection/RPC context (metadata)
2. Test Device 1 (succeeded)
- Test status (succeeded)
### INPUT
Parameters:
Executable: /tmp/dutctl
Args: [-s, fwci-dutctl-tester:2024, device1, status]
Expect:
- Regex: Hello from dummy status module
Called with 0 arguments
Transport:
Proto: local
Options:
Timeout: 1s
OnError: strict
### OPERATION
/tmp/dutctl -s fwci-dutctl-tester:2024 device1 status
### OUTPUT
**Stdout** (2 lines):
Hello from dummy status module
Called with 0 arguments
Found the expected string for 'Expect1' in Stdout: '{Hello from dummy status module
Called with 0 arguments}'
- Test status with argument (succeeded)
### INPUT
Parameters:
Executable: /tmp/dutctl
Args: [-s, fwci-dutctl-tester:2024, device1, status, hello]
Expect:
- Regex: Hello from dummy status module
Called with 1 arguments
Arg 0: hello
Transport:
Proto: local
Options:
Timeout: 1s
OnError: strict
### OPERATION
/tmp/dutctl -s fwci-dutctl-tester:2024 device1 status hello
### OUTPUT
**Stdout** (3 lines):
Hello from dummy status module
Called with 1 arguments
Arg 0: hello
Found the expected string for 'Expect1' in Stdout: '{Hello from dummy status module
Called with 1 arguments
Arg 0: hello}'
3. Test Device 2 (succeeded)
- Test status (succeeded)
### INPUT
Parameters:
Executable: /tmp/dutctl
Args: [-s, fwci-dutctl-tester:2024, device2, status]
Expect:
- Regex: Hello from dummy status module
Called with 2 arguments
Transport:
Proto: local
Options:
Timeout: 1s
OnError: strict
### OPERATION
/tmp/dutctl -s fwci-dutctl-tester:2024 device2 status
### OUTPUT
**Stdout** (4 lines):
Hello from dummy status module
Called with 2 arguments
Arg 0: foo
Arg 1: bar
Found the expected string for 'Expect1' in Stdout: '{Hello from dummy status module
Called with 2 arguments}'
- Test repeat (succeeded)
### INPUT
Parameters:
Command: echo -e 'hello
hello world
' | /tmp/dutctl -s fwci-dutctl-tester:2024 device2 repeat
Expect:
- Regex: Hello from dummy repeat module!
Enter one word per line.
Transport:
Proto: local
Options:
Timeout: 1s
OnError: strict
### OPERATION
/bin/sh -c echo -e 'hello
hello world
' | /tmp/dutctl -s fwci-dutctl-tester:2024 device2 repeat
### OUTPUT
**Stdout** (2 lines):
Hello from dummy repeat module!
Enter one word per line. (Two words will terminate)
**Stderr** (1 line):
Oh no! Can only handle one word per line.
Found the expected string for 'Expect1' in Stdout: '{Hello from dummy repeat module!
Enter one word per line.}'
4. Test Device 3 (succeeded)
- Test status (succeeded)
### INPUT
Parameters:
Executable: /tmp/dutctl
Args: [-s, fwci-dutctl-tester:2024, device3, status]
Expect:
- Regex: Hello from dummy status module
Called with 0 arguments
Transport:
Proto: local
Options:
Timeout: 1s
OnError: strict
### OPERATION
/tmp/dutctl -s fwci-dutctl-tester:2024 device3 status
### OUTPUT
**Stdout** (2 lines):
Hello from dummy status module
Called with 0 arguments
Found the expected string for 'Expect1' in Stdout: '{Hello from dummy status module
Called with 0 arguments}'
- Create test file (succeeded)
### INPUT
Parameters:
Command: echo 'hello' > test.txt
Transport:
Proto: local
Options:
OnError: strict
### OPERATION
/bin/sh -c echo 'hello' > test.txt
### OUTPUT
no output
- Test file transfer (succeeded)
### INPUT
Parameters:
Executable: /tmp/dutctl
Args: [-s, fwci-dutctl-tester:2024, device3, file-transfer, test.txt, test2.txt]
Expect:
- Regex: Hello from dummy file transfer module
Transport:
Proto: local
Options:
Timeout: 1s
OnError: strict
### OPERATION
/tmp/dutctl -s fwci-dutctl-tester:2024 device3 file-transfer test.txt test2.txt
### OUTPUT
**Stdout** (10 lines):
Hello from dummy status module
Called with 2 arguments
Arg 0: transferring
Arg 1: test.txt
Hello from dummy file transfer module
Called with 2 arguments
Requesting file "test.txt" passed in arg[0] as input
↑ sent "test.txt" (6 B)
↓ received "test2.txt" (37 B)
File operated successfully, delivered "test2.txt" as passed in arg[1] as output
Found the expected string for 'Expect1' in Stdout: '{Hello from dummy file transfer module}'
- Read test file (succeeded)
### INPUT
Parameters:
Executable: cat
Args: [test2.txt]
Expect:
- Regex: processed by dummy.FT module
Transport:
Proto: local
Options:
OnError: strict
### OPERATION
/usr/bin/cat test2.txt
### OUTPUT
**Stdout** (4 lines):
hello
processed by dummy.FT module
Found the expected string for 'Expect1' in Stdout: '{processed by dummy.FT module}'
5. Teardown (succeeded)
- Stop remotelab-server systemd service (succeeded)
### INPUT
Parameters:
Command: systemctl stop dutagent.service || true
Transport:
Proto: ssh
Options:
host: fwci-dutctl-tester.sec.9e.network
identity_file: /root/.ssh/fwci
user: root
Options:
OnError: strict
### OPERATION
systemctl stop dutagent.service || true
### OUTPUT
no output
- Uninstall the package (succeeded)
### INPUT
Parameters:
Command: apt remove --assume-yes dutctl || true
Transport:
Proto: ssh
Options:
user: root
host: fwci-dutctl-tester.sec.9e.network
identity_file: /root/.ssh/fwci
Options:
OnError: strict
### OPERATION
apt remove --assume-yes dutctl || true
### OUTPUT
**Stdout** (9 lines):
Reading package lists...
Building dependency tree...
Reading state information...
The following packages will be REMOVED:
dutctl
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
After this operation, 24.8 MB disk space will be freed.
(Reading database ...
(Reading database ... 5%
(Reading database ... 10%
(Reading database ... 15%
(Reading database ... 20%
(Reading database ... 25%
(Reading database ... 30%
(Reading database ... 35%
(Reading database ... 40%
(Reading database ... 45%
(Reading database ... 50%
(Reading database ... 55%
(Reading database ... 60%
(Reading database ... 65%
(Reading database ... 70%
(Reading database ... 75%
(Reading database ... 80%
(Reading database ... 85%
(Reading database ... 90%
(Reading database ... 95%
(Reading database ... 100%
(Reading database ... 79109 files and directories currently installed.)
Removing dutctl (0.0.0~SNAPSHOT-dd3a45e) ...
**Stderr** (3 lines):
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
- Delete testing configuration file (succeeded)
### INPUT
Parameters:
Command: rm /etc/dutctl.yaml || true
Transport:
Proto: ssh
Options:
host: fwci-dutctl-tester.sec.9e.network
identity_file: /root/.ssh/fwci
user: root
Options:
OnError: strict
### OPERATION
rm /etc/dutctl.yaml || true
### OUTPUT
no output
- Delete package (succeeded)
### INPUT
Parameters:
Command: rm dutctl.deb || true
Transport:
Proto: ssh
Options:
identity_file: /root/.ssh/fwci
user: root
host: fwci-dutctl-tester.sec.9e.network
Options:
OnError: strict
### OPERATION
rm dutctl.deb || true
### OUTPUT
no output
- Shutdown fake serial (succeeded)
### INPUT
Parameters:
Command: pkill socat || true
Transport:
Proto: ssh
Options:
host: fwci-dutctl-tester.sec.9e.network
identity_file: /root/.ssh/fwci
user: oscar
Options:
OnError: strict
### OPERATION
pkill socat || true
### OUTPUT
no output
Loading