feat: chunked file transfer protocol - #369
Open
llogen wants to merge 1 commit into
Open
Blindspot Software - Firmware CI / test-dutctl - Test dummy modules
succeeded
Jul 30, 2026 in 13s
Test dummy modules
Click here to view the job on FirmwareCI.
Details
Report for Test dummy modules
Job ID: 01KYS2P9S1HN5QTWE3EPFPAQ1Q
DUT: fwci-dutctl-tester
Status: succeeded
Started: 2026-07-30T10:36:42+02:00
Ended: 2026-07-30T10:36:53+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-a74d75d_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-a74d75d_arm64.deb dutctl.deb -> target via SSH
### OUTPUT
Successfully copied /tmp/dutctl_0.0.0~SNAPSHOT-a74d75d_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-a74d75d) ...
Setting up dutctl (0.0.0~SNAPSHOT-a74d75d) ...
- 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:
host: fwci-dutctl-tester.sec.9e.network
identity_file: /root/.ssh/fwci
user: root
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:
host: fwci-dutctl-tester.sec.9e.network
identity_file: /root/.ssh/fwci
user: root
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 Thu 2026-07-30 10:36:47 CEST; 208ms ago
Docs: https://github.com/BlindspotSoftware/dutctl
Main PID: 35808 (dutagent)
Tasks: 7 (limit: 453)
CPU: 21ms
CGroup: /system.slice/dutagent.service
└─35808 /usr/bin/dutagent -a 0.0.0.0:2024 -c /etc/dutctl.yaml
Jul 30 10:36:47 fwci-dutctl-tester systemd[1]: Started dutagent.service - dutagent to run on devices under test.
Jul 30 10:36:47 fwci-dutctl-tester dutagent[35808]: 2026/07/30 10:36:47 INFO [agent] loading configuration path=/etc/dutctl.yaml
Jul 30 10:36:47 fwci-dutctl-tester dutagent[35808]: 2026/07/30 10:36:47 DEBUG [module] initializing module device=device1 command=status module=dummy-status
Jul 30 10:36:47 fwci-dutctl-tester dutagent[35808]: 2026/07/30 10:36:47 DEBUG [module] initializing module device=device2 command=status module=dummy-status
Jul 30 10:36:47 fwci-dutctl-tester dutagent[35808]: 2026/07/30 10:36:47 DEBUG [module] initializing module device=device2 command=repeat module=dummy-repeat
Jul 30 10:36:47 fwci-dutctl-tester dutagent[35808]: 2026/07/30 10:36:47 DEBUG [module] initializing module device=device3 command=status module=dummy-status
Jul 30 10:36:47 fwci-dutctl-tester dutagent[35808]: 2026/07/30 10:36:47 DEBUG [module] initializing module device=device3 command=file-transfer module=dummy-status
Jul 30 10:36:47 fwci-dutctl-tester dutagent[35808]: 2026/07/30 10:36:47 DEBUG [module] initializing module device=device3 command=file-transfer module=dummy-ft
Jul 30 10:36:47 fwci-dutctl-tester dutagent[35808]: 2026/07/30 10:36:47 INFO [agent] module initialization complete
Jul 30 10:36:47 fwci-dutctl-tester dutagent[35808]: 2026/07/30 10:36:47 INFO [agent] rpc service listening addr=0.0.0.0:2024
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** (39 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.
OPTIONS:
-f string
Output format, text|json|yaml|oneline, default is text
-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-ebc624bb")
-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** (8 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
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:
host: fwci-dutctl-tester.sec.9e.network
identity_file: /root/.ssh/fwci
user: root
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-a74d75d) ...
**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:
host: fwci-dutctl-tester.sec.9e.network
identity_file: /root/.ssh/fwci
user: root
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:
identity_file: /root/.ssh/fwci
user: oscar
host: fwci-dutctl-tester.sec.9e.network
Options:
OnError: strict
### OPERATION
pkill socat || true
### OUTPUT
no output
Loading