Enhance logging and add policy test client
Some checks failed
Go / build (push) Has been cancelled
Go / release (push) Has been cancelled

- Refactored logOutput function to trace-log stdout and stderr lines for better debugging.
- Introduced a new policy test client in cmd/policytest/main.go to publish events and check policy responses.
- Added a script to run the policy test, ensuring proper cleanup and error handling.
- Updated policy event processing to ensure newline-terminated JSON for compatibility with shell-readers.
This commit is contained in:
2025-10-20 16:30:39 +01:00
parent 105e372712
commit 65e8ab4fbe
6 changed files with 137 additions and 17 deletions

View File

@@ -472,12 +472,28 @@ func (sm *SprocketManager) logOutput(stdout, stderr io.ReadCloser) {
defer stdout.Close() defer stdout.Close()
defer stderr.Close() defer stderr.Close()
// Trace-log stdout lines
go func() { go func() {
io.Copy(os.Stdout, stdout) scanner := bufio.NewScanner(stdout)
for scanner.Scan() {
line := scanner.Text()
if line == "" {
continue
}
log.T.F("sprocket stdout: %s", line)
}
}() }()
// Trace-log stderr lines
go func() { go func() {
io.Copy(os.Stderr, stderr) scanner := bufio.NewScanner(stderr)
for scanner.Scan() {
line := scanner.Text()
if line == "" {
continue
}
log.T.F("sprocket stderr: %s", line)
}
}() }()
} }

60
cmd/policytest/main.go Normal file
View File

@@ -0,0 +1,60 @@
package main
import (
"context"
"flag"
"fmt"
"time"
"lol.mleku.dev/chk"
"lol.mleku.dev/log"
"next.orly.dev/pkg/crypto/p256k"
"next.orly.dev/pkg/encoders/event"
"next.orly.dev/pkg/encoders/kind"
"next.orly.dev/pkg/encoders/tag"
"next.orly.dev/pkg/protocol/ws"
)
func main() {
var err error
url := flag.String("url", "ws://127.0.0.1:3334", "relay websocket URL")
timeout := flag.Duration("timeout", 20*time.Second, "publish timeout")
flag.Parse()
// Minimal client that publishes a single kind 4678 event and reports OK/err
var rl *ws.Client
if rl, err = ws.RelayConnect(context.Background(), *url); chk.E(err) {
log.E.F("connect error: %v", err)
return
}
defer rl.Close()
signer := &p256k.Signer{}
if err = signer.Generate(); chk.E(err) {
log.E.F("signer generate error: %v", err)
return
}
ev := &event.E{
CreatedAt: time.Now().Unix(),
Kind: kind.K{K: 4678}.K, // arbitrary custom kind
Tags: tag.NewS(),
Content: []byte("policy test: expect rejection"),
}
if err = ev.Sign(signer); chk.E(err) {
log.E.F("sign error: %v", err)
return
}
ctx, cancel := context.WithTimeout(context.Background(), *timeout)
defer cancel()
if err = rl.Publish(ctx, ev); err != nil {
// Expected path if policy rejects: client returns error with reason (from OK false)
fmt.Println("policy reject:", err)
return
}
log.I.Ln("publish result: accepted")
fmt.Println("ACCEPT")
}

View File

@@ -684,8 +684,8 @@ func (pm *PolicyManager) ProcessEvent(evt *PolicyEvent) (*PolicyResponse, error)
return nil, fmt.Errorf("failed to serialize event: %v", err) return nil, fmt.Errorf("failed to serialize event: %v", err)
} }
// Send the event JSON to the policy script // Send the event JSON to the policy script (newline-terminated for shell-readers)
if _, err := stdin.Write(eventJSON); chk.E(err) { if _, err := stdin.Write(append(eventJSON, '\n')); chk.E(err) {
return nil, fmt.Errorf("failed to write event to policy: %v", err) return nil, fmt.Errorf("failed to write event to policy: %v", err)
} }
@@ -734,13 +734,9 @@ func (pm *PolicyManager) readResponses() {
// logOutput logs the output from stdout and stderr // logOutput logs the output from stdout and stderr
func (pm *PolicyManager) logOutput(stdout, stderr io.ReadCloser) { func (pm *PolicyManager) logOutput(stdout, stderr io.ReadCloser) {
defer stdout.Close()
defer stderr.Close() defer stderr.Close()
go func() { // Only log stderr, stdout is used by readResponses
io.Copy(os.Stdout, stdout)
}()
go func() { go func() {
io.Copy(os.Stderr, stderr) io.Copy(os.Stderr, stderr)
}() }()

View File

@@ -374,14 +374,9 @@ func (r *Client) ConnectWithTLS(
if env, message, err = okenvelope.Parse(message); chk.E(err) { if env, message, err = okenvelope.Parse(message); chk.E(err) {
continue continue
} }
if okCallback, exist := r.okCallbacks.Load(string(env.EventID)); exist { eventIDHex := hex.Enc(env.EventID)
if okCallback, exist := r.okCallbacks.Load(eventIDHex); exist {
okCallback(env.OK, env.ReasonString()) okCallback(env.OK, env.ReasonString())
} else {
// log.I.F(
// "{%s} got an unexpected OK message for event %0x",
// r.URL,
// env.EventID,
// )
} }
} }
} }

View File

@@ -1 +1 @@
v0.17.1 v0.17.2

53
scripts/run-policy-test.sh Executable file
View File

@@ -0,0 +1,53 @@
#!/bin/bash
set -euo pipefail
# Config
PORT=${PORT:-34567}
URL=${URL:-ws://127.0.0.1:${PORT}}
LOG=/tmp/orly-policy.out
PID=/tmp/orly-policy.pid
DATADIR=$(mktemp -d)
cleanup() {
trap - EXIT
if [[ -f "$PID" ]]; then
kill -INT "$(cat "$PID")" 2>/dev/null || true
rm -f "$PID"
fi
rm -rf "$DATADIR"
}
trap cleanup EXIT
echo "Building relay and test client..."
go build -o orly .
go build -o cmd/policytest/policytest ./cmd/policytest
echo "Starting relay on ${URL} with policy enabled (data dir: ${DATADIR})..."
ORLY_DATA_DIR="$DATADIR" \
ORLY_PORT=${PORT} \
ORLY_POLICY_ENABLED=true \
ORLY_ACL_MODE=none \
ORLY_LOG_LEVEL=trace \
./orly >"$LOG" 2>&1 & echo $! >"$PID"
sleep 1
if ! ps -p "$(cat "$PID")" >/dev/null 2>&1; then
echo "Relay failed to start; logs:" >&2
sed -n '1,200p' "$LOG" >&2
exit 1
fi
echo "Running policy test against ${URL}..."
set +e
out=$(cmd/policytest/policytest -url "${URL}" 2>&1)
rc=$?
set -e
echo "$out"
# Expect rejection; return 0 if we saw REJECT, else forward exit code
if grep -q '^REJECT:' <<<"$out"; then
exit 0
fi
exit $rc