Skip to content

feat: chunked file transfer protocol - #369

Open
llogen wants to merge 1 commit into
mainfrom
feat/chunked-file-transfer
Open

feat: chunked file transfer protocol#369
llogen wants to merge 1 commit into
mainfrom
feat/chunked-file-transfer

feat: chunked file transfer protocol

8babdbe
Select commit
Loading
Failed to load commit list.
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)

  1. 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


  1. 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


  1. 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) ...

  1. 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


  1. 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


  1. 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


  1. 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


  1. 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\)}'

  1. 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)

  1. 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}'

  1. 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)

  1. 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}'

  1. 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)

  1. 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}'

  1. 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


  1. 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}'

  1. 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)

  1. 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


  1. 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.


  1. 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


  1. 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


  1. 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