Skip to content

TLS encryption for client-agent communication - #269

Open
RiSKeD wants to merge 1 commit into
mainfrom
feat/tls-support
Open

TLS encryption for client-agent communication#269
RiSKeD wants to merge 1 commit into
mainfrom
feat/tls-support

feat!: encrypt RPC traffic with TLS by default

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

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


  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-dd3a45e) ...
Setting up dutctl (0.0.0~SNAPSHOT-dd3a45e) ...

  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:
    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


  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:
    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


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

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

  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** (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}'

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


  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:
    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


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