toes-matter/scripts/provision-device.sh

66 lines
2.3 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
# Compatibility wrapper for the Rust host provisioning command.
# Works from Linux/macOS as long as cargo is available.
#
# SSH usage:
# toes-matter/scripts/provision-device.sh user@device-host [device-id]
#
# Serial usage:
# SERIAL_PORT=/dev/cu.usbserial-0001 toes-matter/scripts/provision-device.sh [device-id]
# SERIAL_PORT=/dev/cu.usbserial-0001 SERIAL_LOGIN=root SERIAL_PASSWORD=... toes-matter/scripts/provision-device.sh [device-id]
#
# Environment:
# CREDS_DIR Local output dir. Default: toes-matter/manufacturing/<device-id>/creds
# REMOTE_CREDS_DIR Remote creds dir. Default: /var/lib/toes-matter/creds
# REMOTE_STATE_DIR Remote Matter state dir. Default: /var/lib/toes-matter/state
# SERVICE Optional service to restart. Default: toes-matter.service
# Set SERVICE= to skip restart.
# SSH_OPTS Extra ssh/scp options, e.g. '-p 2222'
# SERIAL_PORT Serial device, e.g. /dev/cu.usbserial-0001 or /dev/tty.usbserial-0001
# SERIAL_LOGIN Optional serial login username
# SERIAL_PASSWORD Optional serial login password
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CRATE_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
if [[ -n "${SERIAL_PORT:-}" ]]; then
if [[ $# -gt 1 ]]; then
echo "Usage with SERIAL_PORT: SERIAL_PORT=/dev/cu.* $0 [device-id]" >&2
exit 2
fi
DEVICE_ID="${1:-$(date +%Y%m%d-%H%M%S)}"
TARGET_ARGS=(--serial "$SERIAL_PORT" --device-id "$DEVICE_ID")
else
if [[ $# -lt 1 || $# -gt 2 ]]; then
echo "Usage: $0 user@device-host [device-id]" >&2
echo " or: SERIAL_PORT=/dev/cu.* $0 [device-id]" >&2
exit 2
fi
TARGET="$1"
DEVICE_ID="${2:-$(date +%Y%m%d-%H%M%S)}"
TARGET_ARGS=("$TARGET" "$DEVICE_ID")
fi
CREDS_DIR="${CREDS_DIR:-$CRATE_DIR/manufacturing/$DEVICE_ID/creds}"
REMOTE_CREDS_DIR="${REMOTE_CREDS_DIR:-/var/lib/toes-matter/creds}"
REMOTE_STATE_DIR="${REMOTE_STATE_DIR:-/var/lib/toes-matter/state}"
SERVICE="${SERVICE-toes-matter.service}"
args=(
--creds-dir "$CREDS_DIR"
--remote-creds-dir "$REMOTE_CREDS_DIR"
--remote-state-dir "$REMOTE_STATE_DIR"
)
if [[ -z "$SERVICE" ]]; then
args+=(--no-restart)
else
args+=(--service "$SERVICE")
fi
exec cargo run --quiet --no-default-features --manifest-path "$CRATE_DIR/Cargo.toml" --bin toes-matter-credentials -- "${args[@]}" "${TARGET_ARGS[@]}"