uhubctl location and port are relative to the runner/host
This commit is contained in:
parent
8bf352b965
commit
b2aa80d7c1
3 changed files with 36 additions and 22 deletions
27
README.md
27
README.md
|
@ -38,10 +38,26 @@ performing the signing action.
|
||||||
|
|
||||||
**NOTE: The action will turn off the port on the USB hub when it is done processing**
|
**NOTE: The action will turn off the port on the USB hub when it is done processing**
|
||||||
|
|
||||||
To enable this feature, use inputs uhub_location **and** uhub_port. To
|
To enable this feature, set `uhub_control` to `true`. As this is controlling
|
||||||
determine the proper values for these, it is best to consult [uhubctl
|
physical hardware, you will also need a runner set with a max concurrency of 1
|
||||||
documentation](https://github.com/mvp/uhubctl?tab=readme-ov-file#usage) and
|
and a unique label, used as the `runs-on` attribute of the build. For example:
|
||||||
run some command line tests. Updating the previous example:
|
|
||||||
|
```yaml
|
||||||
|
name: Sign
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest-with-hsm
|
||||||
|
```
|
||||||
|
|
||||||
|
The runner will also need to set environment variables `UHUB_PORT` and
|
||||||
|
`UHUB_LOCATION` as appropriate. To determine the proper values for these, it is
|
||||||
|
best to consult [uhubctl
|
||||||
|
documentation](https://github.com/mvp/uhubctl?tab=readme-ov-file#usage) and run
|
||||||
|
some command line tests. Updating the previous example:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- name: Sign
|
- name: Sign
|
||||||
|
@ -51,6 +67,5 @@ run some command line tests. Updating the previous example:
|
||||||
pin: ${{ secrets.HSM_USER_PIN }}
|
pin: ${{ secrets.HSM_USER_PIN }}
|
||||||
files: ???
|
files: ???
|
||||||
public_key: 'https://emil.lerch.org/serverpublic.pem'
|
public_key: 'https://emil.lerch.org/serverpublic.pem'
|
||||||
uhub_location: "1-1.3"
|
uhub_control: 'true'
|
||||||
uhub_port: "4"
|
|
||||||
```
|
```
|
||||||
|
|
10
action.yml
10
action.yml
|
@ -15,12 +15,10 @@ inputs:
|
||||||
public_key:
|
public_key:
|
||||||
description: 'URL to PEM format public key. Specify only if uploading to sigstore'
|
description: 'URL to PEM format public key. Specify only if uploading to sigstore'
|
||||||
required: false
|
required: false
|
||||||
uhub_location:
|
uhub_control:
|
||||||
description: 'If HSM is attached to software controlled power hub, location of hub (-l parameter of uhubctl)'
|
description: 'If HSM is attached to software controlled power hub, setting this to "true" will power on the HSM during operation'
|
||||||
required: false
|
required: true
|
||||||
uhub_port:
|
default: "false"
|
||||||
description: 'If HSM is attached to software controlled power hub, port to power on, then off (-p parameter of uhubctl)'
|
|
||||||
required: false
|
|
||||||
runs:
|
runs:
|
||||||
using: 'docker'
|
using: 'docker'
|
||||||
image: 'Dockerfile'
|
image: 'Dockerfile'
|
||||||
|
|
|
@ -1,10 +1,16 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
if [ -n "${INPUT_UHUB_LOCATION}" ] && [ -n "${INPUT_UHUB_PORT}" ]; then
|
# There is no concurrency control here. We are relying on the fact that
|
||||||
uhubctl -a off -p "${INPUT_UHUB_PORT}" -l "${INPUT_UHUB_LOCATION}" # Off seems to be reflected immediately
|
# the runner on the host is set to a max capacity of 1
|
||||||
|
if [ "${INPUT_UHUB_CONTROL}" != "false" ]; then
|
||||||
|
if [ -z "${UHUB_LOCATION}" ] || [ -z "${UHUB_PORT}" ]; then
|
||||||
|
echo "error: UHUB control requested, but runner has not been configured with UHUB_LOCATION and UHUB_PORT environment variables"
|
||||||
|
exit 255
|
||||||
|
fi
|
||||||
|
uhubctl -a off -p "${UHUB_PORT}" -l "${UHUB_LOCATION}" # Off seems to be reflected immediately
|
||||||
# Capture the number of hidraw devices with the port off
|
# Capture the number of hidraw devices with the port off
|
||||||
devs="$(find /dev -maxdepth 1 -name 'hi*' |wc -l)"
|
devs="$(find /dev -maxdepth 1 -name 'hi*' |wc -l)"
|
||||||
uhubctl -a on -p "${INPUT_UHUB_PORT}" -l "${INPUT_UHUB_LOCATION}"
|
uhubctl -a on -p "${UHUB_PORT}" -l "${UHUB_LOCATION}"
|
||||||
retries=0
|
retries=0
|
||||||
while [ "$(find /dev -maxdepth 1 -name 'hi*' |wc -l)" = "$devs" ] && [ $retries -lt 10 ]; do
|
while [ "$(find /dev -maxdepth 1 -name 'hi*' |wc -l)" = "$devs" ] && [ $retries -lt 10 ]; do
|
||||||
# Generally takes a few seconds to settle in
|
# Generally takes a few seconds to settle in
|
||||||
|
@ -16,11 +22,6 @@ if [ -n "${INPUT_UHUB_LOCATION}" ] && [ -n "${INPUT_UHUB_PORT}" ]; then
|
||||||
echo "device is not available. Aborting"
|
echo "device is not available. Aborting"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
else
|
|
||||||
if [ -n "${INPUT_UHUB_LOCATION}" ] || [ -n "${INPUT_UHUB_PORT}" ]; then
|
|
||||||
echo "if UHUB functionality is desired, both uhub_location and uhub_port must be specified"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dir="$(dirname "${INPUT_FILES}")"
|
dir="$(dirname "${INPUT_FILES}")"
|
||||||
|
@ -74,7 +75,7 @@ done <<ALLFILES_INPUT
|
||||||
$all_files
|
$all_files
|
||||||
ALLFILES_INPUT
|
ALLFILES_INPUT
|
||||||
|
|
||||||
if [ -n "${INPUT_UHUB_LOCATION}" ] && [ -n "${INPUT_UHUB_PORT}" ]; then
|
if [ "${INPUT_UHUB_CONTROL}" != "false" ]; then
|
||||||
# Turn off the port when we're done
|
# Turn off the port when we're done
|
||||||
uhubctl -a off -p "${INPUT_UHUB_PORT}" -l "${INPUT_UHUB_LOCATION}"
|
uhubctl -a off -p "${UHUB_PORT}" -l "${UHUB_LOCATION}"
|
||||||
fi
|
fi
|
||||||
|
|
Loading…
Add table
Reference in a new issue