warden replaces HOME and fails closed on output: resolve paths from the script, keep Go caches at the real home, document the silent invocation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Assistant: claude-code Assistant-Model: opus Assistant-Process: 5457@bnt-lap001 Assistant-Session: 792bf84a-3783-4f5d-a811-cded61dd2012
66 lines
3 KiB
Bash
Executable file
66 lines
3 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Send one prepared post (pr-hall-of-helix/posts/<file>.yaml) through a
|
|
# short-lived local adapter, then stop it.
|
|
#
|
|
# The bot token goes from OpenBao straight into the adapter's environment and
|
|
# is never printed. The adapter's store is in memory, so idempotency on post_id
|
|
# holds only within one run: do not re-run for a post that already went out.
|
|
#
|
|
# Run it yourself inside the attended OpenBao login. warden fails closed on any
|
|
# output, so redirect both streams, and use absolute paths (HOME is replaced):
|
|
#
|
|
# warden access openbao-platform-admin-login --exec -- bash -c \
|
|
# '/home/worsch/fluid-telegram/scripts/send-post.sh \
|
|
# /home/worsch/pr-hall-of-helix/posts/<post>.yaml test \
|
|
# > /home/worsch/send-post.log 2>&1'
|
|
set -euo pipefail
|
|
|
|
post=$(realpath "$1")
|
|
channel=${2:-test}
|
|
port=${PORT:-18089}
|
|
cd "$(dirname "$(realpath "$0")")/.."
|
|
spec=${SPEC:-$(realpath ../pr-hall-of-helix/presence/telegram.yaml)}
|
|
|
|
# Under `warden access ... --exec`, HOME is a throwaway session directory that
|
|
# holds the OpenBao token helper. Keep Go's caches at the real home so the
|
|
# build does not start from nothing there.
|
|
realhome=$(getent passwd "$(id -u)" | cut -d: -f6)
|
|
export GOPATH=${GOPATH:-$realhome/go}
|
|
export GOMODCACHE=${GOMODCACHE:-$GOPATH/pkg/mod}
|
|
export GOCACHE=${GOCACHE:-$realhome/.cache/go-build}
|
|
|
|
read -r want reviewed < <(python3 -c '
|
|
import sys, yaml
|
|
d = yaml.safe_load(open(sys.argv[1]))
|
|
print(d["channel"], d["request"].get("reviewed_by") or "-")' "$post")
|
|
[ "$want" = "$channel" ] || { echo "post is for channel '$want', not '$channel'" >&2; exit 2; }
|
|
[ "$reviewed" != "-" ] || { echo "request.reviewed_by is empty; a person reviews before sending" >&2; exit 2; }
|
|
|
|
TELEGRAM_CHANNEL_ID=$(go run ./cmd/provision adapter-config --spec "$spec" --channel "$channel" \
|
|
| sed -n 's/^TELEGRAM_CHANNEL_ID=//p')
|
|
[ -n "$TELEGRAM_CHANNEL_ID" ] || { echo "no chat id for channel '$channel'" >&2; exit 2; }
|
|
|
|
tmp=$(mktemp -d)
|
|
go build -o "$tmp/adapter" ./cmd/adapter
|
|
|
|
# Read the KV v2 data path directly: `bao kv get` first queries
|
|
# sys/internal/ui/mounts, which a workload-scoped token may not be allowed to.
|
|
token=$(bao read -format=json \
|
|
platform/data/workloads/infotech/fluid-telegram/hall-of-helix/bot-token \
|
|
| python3 -c 'import sys, json; print(json.load(sys.stdin)["data"]["data"]["token"])') \
|
|
|| { rm -rf "$tmp"; echo "could not read the bot token from OpenBao (logged in? read on platform/data/workloads/infotech/fluid-telegram/hall-of-helix/*?)" >&2; exit 2; }
|
|
|
|
TELEGRAM_BOT_TOKEN=$token TELEGRAM_CHANNEL_ID=$TELEGRAM_CHANNEL_ID \
|
|
ADAPTER_LISTEN_ADDR=127.0.0.1:$port "$tmp/adapter" &
|
|
pid=$!
|
|
unset token
|
|
trap 'kill $pid 2>/dev/null; rm -rf "$tmp"' EXIT
|
|
|
|
for _ in $(seq 50); do
|
|
curl -s -o /dev/null "http://127.0.0.1:$port/" && break
|
|
sleep 0.1
|
|
done
|
|
|
|
python3 -c 'import sys, yaml, json; print(json.dumps(yaml.safe_load(open(sys.argv[1]))["request"]))' "$post" \
|
|
| curl -sS -w '\nHTTP %{http_code}\n' -X POST -H 'Content-Type: application/json' \
|
|
--data-binary @- "http://127.0.0.1:$port/v1/channel-posts"
|