Files
cdk/misc/regtest_helper.sh
2025-07-08 11:03:40 +01:00

422 lines
13 KiB
Bash
Executable File

#!/usr/bin/env bash
# Helper script for interacting with CDK regtest environment
# Run this after starting interactive_regtest_mprocs.sh
# Check for environment state file first, then environment variable
ENV_FILE="/tmp/cdk_regtest_env"
if [ -f "$ENV_FILE" ]; then
source "$ENV_FILE"
elif [ ! -z "$CDK_ITESTS_DIR" ]; then
# Environment variable is set, create state file for other sessions
echo "export CDK_ITESTS_DIR=\"$CDK_ITESTS_DIR\"" > "$ENV_FILE"
echo "export CDK_TEST_MINT_URL=\"$CDK_TEST_MINT_URL\"" >> "$ENV_FILE"
echo "export CDK_TEST_MINT_URL_2=\"$CDK_TEST_MINT_URL_2\"" >> "$ENV_FILE"
echo "export CDK_MINTD_PID=\"$CDK_MINTD_PID\"" >> "$ENV_FILE"
echo "export CDK_MINTD_LND_PID=\"$CDK_MINTD_LND_PID\"" >> "$ENV_FILE"
echo "export CDK_REGTEST_PID=\"$CDK_REGTEST_PID\"" >> "$ENV_FILE"
else
echo "❌ CDK regtest environment not found!"
echo "Please run './misc/interactive_regtest_mprocs.sh' or 'just regtest' first"
exit 1
fi
# Validate that the environment is actually running
if [ -z "$CDK_ITESTS_DIR" ] || [ ! -d "$CDK_ITESTS_DIR" ]; then
echo "❌ CDK regtest environment not found or directory missing!"
echo "Please run './misc/interactive_regtest_mprocs.sh' or 'just regtest' first"
[ -f "$ENV_FILE" ] && rm "$ENV_FILE" # Clean up stale state file
exit 1
fi
show_help() {
echo "CDK Regtest Environment Helper"
echo "============================="
echo
echo "Lightning Node Commands:"
echo " ln-cln1 <command> - Execute command on CLN node 1"
echo " ln-cln2 <command> - Execute command on CLN node 2"
echo " ln-lnd1 <command> - Execute command on LND node 1"
echo " ln-lnd2 <command> - Execute command on LND node 2"
echo
echo "Bitcoin Commands:"
echo " btc <command> - Execute bitcoin-cli command"
echo " btc-mine [blocks] - Mine blocks (default: 10)"
echo
echo "CDK Mint Commands:"
echo " mint-info - Show mint information"
echo " mint-test - Run integration tests"
echo " restart-mints - Stop, recompile, and restart both mints (log mode)"
echo
echo "Environment Commands:"
echo " show-env - Show environment variables"
echo " show-logs - Show recent mint logs"
echo " show-status - Show status of all components"
echo " logs - Start mprocs TUI (adapts to current mode)"
echo
echo "Environment Modes:"
echo " just regtest - Log tailing mode (mints auto-start, logs to files)"
echo " just regtest-mprocs - Direct management (mprocs controls mint processes)"
echo
echo "Examples:"
echo " $0 ln-cln1 getinfo"
echo " $0 ln-lnd1 getinfo"
echo " $0 btc getblockcount"
echo " $0 btc-mine 5"
echo " $0 mint-info"
echo " $0 restart-mints # Only works in log tailing mode"
echo " $0 logs # Start mprocs viewer"
}
# Bitcoin commands
btc_command() {
bitcoin-cli -regtest -rpcuser=testuser -rpcpassword=testpass -rpcport=18443 "$@"
}
btc_mine() {
local blocks=${1:-10}
local address=$(btc_command getnewaddress)
btc_command generatetoaddress "$blocks" "$address"
echo "Mined $blocks blocks"
}
# CLN commands
cln_command() {
local node=$1
shift
lightning-cli --rpc-file="$CDK_ITESTS_DIR/cln/$node/regtest/lightning-rpc" "$@"
}
# LND commands
lnd_command() {
local node=$1
shift
local port
case $node in
"one") port=10009 ;;
"two") port=10010 ;;
*) echo "Unknown LND node: $node"; return 1 ;;
esac
lncli --rpcserver=localhost:$port \
--tlscertpath="$CDK_ITESTS_DIR/lnd/$node/tls.cert" \
--macaroonpath="$CDK_ITESTS_DIR/lnd/$node/data/chain/bitcoin/regtest/admin.macaroon" \
"$@"
}
# Mint commands
mint_info() {
echo "CLN Mint (Port 8085):"
curl -s "$CDK_TEST_MINT_URL/v1/info" | jq . 2>/dev/null || curl -s "$CDK_TEST_MINT_URL/v1/info"
echo
echo "LND Mint (Port 8087):"
curl -s "$CDK_TEST_MINT_URL_2/v1/info" | jq . 2>/dev/null || curl -s "$CDK_TEST_MINT_URL_2/v1/info"
}
mint_test() {
echo "Running integration tests..."
cargo test -p cdk-integration-tests
}
# Environment info
show_env() {
echo "CDK Regtest Environment Variables:"
echo "================================="
echo "CDK_ITESTS_DIR=$CDK_ITESTS_DIR"
echo "CDK_TEST_MINT_URL=$CDK_TEST_MINT_URL"
echo "CDK_TEST_MINT_URL_2=$CDK_TEST_MINT_URL_2"
echo "CDK_MINTD_PID=$CDK_MINTD_PID"
echo "CDK_MINTD_LND_PID=$CDK_MINTD_LND_PID"
echo "CDK_REGTEST_PID=$CDK_REGTEST_PID"
}
show_logs() {
echo "=== Recent CLN Mint Logs ==="
if [ -f "$CDK_ITESTS_DIR/cln_mint/mintd.log" ]; then
tail -10 "$CDK_ITESTS_DIR/cln_mint/mintd.log"
else
echo "Log file not found"
fi
echo
echo "=== Recent LND Mint Logs ==="
if [ -f "$CDK_ITESTS_DIR/lnd_mint/mintd.log" ]; then
tail -10 "$CDK_ITESTS_DIR/lnd_mint/mintd.log"
else
echo "Log file not found"
fi
}
start_mprocs() {
echo "Starting mprocs log viewer..."
if ! command -v mprocs >/dev/null 2>&1; then
echo "❌ mprocs not found! Please install it with:"
echo " cargo install mprocs"
echo " or your package manager"
return 1
fi
# Check if we have the direct process management config
DIRECT_MPROCS_CONFIG="$CDK_ITESTS_DIR/mprocs.yaml"
FALLBACK_MPROCS_CONFIG="$CDK_ITESTS_DIR/mprocs_fallback.yaml"
if [ -f "$DIRECT_MPROCS_CONFIG" ]; then
echo "Using direct process management mode..."
echo "In mprocs: 's' to start, 'k' to kill, 'r' to restart processes"
cd "$CDK_ITESTS_DIR"
mprocs --config "$DIRECT_MPROCS_CONFIG"
return
fi
# Create fallback mprocs configuration for log tailing
cat > "$FALLBACK_MPROCS_CONFIG" << EOF
procs:
cln-mint:
shell: "touch $CDK_ITESTS_DIR/cln_mint/mintd.log && tail -f $CDK_ITESTS_DIR/cln_mint/mintd.log"
autostart: true
lnd-mint:
shell: "touch $CDK_ITESTS_DIR/lnd_mint/mintd.log && tail -f $CDK_ITESTS_DIR/lnd_mint/mintd.log"
autostart: true
bitcoind:
shell: "touch $CDK_ITESTS_DIR/bitcoin/regtest/debug.log && tail -f $CDK_ITESTS_DIR/bitcoin/regtest/debug.log"
autostart: true
cln-one:
shell: "while [ ! -f $CDK_ITESTS_DIR/cln/one/regtest/log ]; do sleep 1; done && tail -f $CDK_ITESTS_DIR/cln/one/regtest/log"
autostart: true
cln-two:
shell: "while [ ! -f $CDK_ITESTS_DIR/cln/two/regtest/log ]; do sleep 1; done && tail -f $CDK_ITESTS_DIR/cln/two/regtest/log"
autostart: true
lnd-one:
shell: "while [ ! -f $CDK_ITESTS_DIR/lnd/one/logs/bitcoin/regtest/lnd.log ]; do sleep 1; done && tail -f $CDK_ITESTS_DIR/lnd/one/logs/bitcoin/regtest/lnd.log"
autostart: true
lnd-two:
shell: "while [ ! -f $CDK_ITESTS_DIR/lnd/two/logs/bitcoin/regtest/lnd.log ]; do sleep 1; done && tail -f $CDK_ITESTS_DIR/lnd/two/logs/bitcoin/regtest/lnd.log"
autostart: true
settings:
mouse_scroll_speed: 3
proc_list_width: 20
hide_keymap_window: false
EOF
echo "Using log tailing mode..."
echo "Use 'q' to quit the log viewer"
cd "$CDK_ITESTS_DIR"
mprocs --config "$FALLBACK_MPROCS_CONFIG"
}
show_status() {
echo "CDK Regtest Environment Status:"
echo "==============================="
# Check processes
echo "Processes:"
if [ ! -z "$CDK_REGTEST_PID" ] && kill -0 $CDK_REGTEST_PID 2>/dev/null; then
echo " ✓ Regtest network (PID: $CDK_REGTEST_PID)"
else
echo " ❌ Regtest network"
fi
if [ ! -z "$CDK_MINTD_PID" ] && kill -0 $CDK_MINTD_PID 2>/dev/null; then
echo " ✓ CLN Mint (PID: $CDK_MINTD_PID)"
else
echo " ❌ CLN Mint"
fi
if [ ! -z "$CDK_MINTD_LND_PID" ] && kill -0 $CDK_MINTD_LND_PID 2>/dev/null; then
echo " ✓ LND Mint (PID: $CDK_MINTD_LND_PID)"
else
echo " ❌ LND Mint"
fi
echo
echo "Network connectivity:"
if curl -s "$CDK_TEST_MINT_URL/v1/info" >/dev/null 2>&1; then
echo " ✓ CLN Mint responding"
else
echo " ❌ CLN Mint not responding"
fi
if curl -s "$CDK_TEST_MINT_URL_2/v1/info" >/dev/null 2>&1; then
echo " ✓ LND Mint responding"
else
echo " ❌ LND Mint not responding"
fi
}
restart_mints() {
echo "==============================="
echo "Restarting CDK Mints"
echo "==============================="
# Stop existing mints
echo "Stopping existing mints..."
if [ ! -z "$CDK_MINTD_PID" ] && kill -0 $CDK_MINTD_PID 2>/dev/null; then
echo " Stopping CLN Mint (PID: $CDK_MINTD_PID)"
kill -2 $CDK_MINTD_PID
wait $CDK_MINTD_PID 2>/dev/null || true
fi
if [ ! -z "$CDK_MINTD_LND_PID" ] && kill -0 $CDK_MINTD_LND_PID 2>/dev/null; then
echo " Stopping LND Mint (PID: $CDK_MINTD_LND_PID)"
kill -2 $CDK_MINTD_LND_PID
wait $CDK_MINTD_LND_PID 2>/dev/null || true
fi
# Recompile
echo "Recompiling cdk-mintd..."
if ! cargo build --bin cdk-mintd; then
echo "❌ Compilation failed"
return 1
fi
echo "✓ Compilation successful"
# Restart CLN mint
echo "Starting CLN Mint..."
export CDK_MINTD_CLN_RPC_PATH="$CDK_ITESTS_DIR/cln/one/regtest/lightning-rpc"
export CDK_MINTD_URL="http://127.0.0.1:8085"
export CDK_MINTD_WORK_DIR="$CDK_ITESTS_DIR/cln_mint"
export CDK_MINTD_LISTEN_HOST="127.0.0.1"
export CDK_MINTD_LISTEN_PORT=8085
export CDK_MINTD_LN_BACKEND="cln"
export CDK_MINTD_MNEMONIC="eye survey guilt napkin crystal cup whisper salt luggage manage unveil loyal"
export RUST_BACKTRACE=1
cargo run --bin cdk-mintd > "$CDK_MINTD_WORK_DIR/mintd.log" 2>&1 &
NEW_CLN_PID=$!
# Wait for CLN mint to be ready
echo "Waiting for CLN mint to start..."
local start_time=$(date +%s)
while true; do
local current_time=$(date +%s)
local elapsed_time=$((current_time - start_time))
if [ $elapsed_time -ge 30 ]; then
echo "❌ Timeout waiting for CLN mint"
return 1
fi
if curl -s "http://127.0.0.1:8085/v1/info" >/dev/null 2>&1; then
echo "✓ CLN Mint ready"
break
fi
sleep 1
done
# Restart LND mint
echo "Starting LND Mint..."
export CDK_MINTD_LND_ADDRESS="https://localhost:10010"
export CDK_MINTD_LND_CERT_FILE="$CDK_ITESTS_DIR/lnd/two/tls.cert"
export CDK_MINTD_LND_MACAROON_FILE="$CDK_ITESTS_DIR/lnd/two/data/chain/bitcoin/regtest/admin.macaroon"
export CDK_MINTD_URL="http://127.0.0.1:8087"
export CDK_MINTD_WORK_DIR="$CDK_ITESTS_DIR/lnd_mint"
export CDK_MINTD_LISTEN_HOST="127.0.0.1"
export CDK_MINTD_LISTEN_PORT=8087
export CDK_MINTD_LN_BACKEND="lnd"
export CDK_MINTD_MNEMONIC="cattle gold bind busy sound reduce tone addict baby spend february strategy"
cargo run --bin cdk-mintd > "$CDK_MINTD_WORK_DIR/mintd.log" 2>&1 &
NEW_LND_PID=$!
# Wait for LND mint to be ready
echo "Waiting for LND mint to start..."
start_time=$(date +%s)
while true; do
current_time=$(date +%s)
elapsed_time=$((current_time - start_time))
if [ $elapsed_time -ge 30 ]; then
echo "❌ Timeout waiting for LND mint"
return 1
fi
if curl -s "http://127.0.0.1:8087/v1/info" >/dev/null 2>&1; then
echo "✓ LND Mint ready"
break
fi
sleep 1
done
# Update PIDs in state file
CDK_MINTD_PID=$NEW_CLN_PID
CDK_MINTD_LND_PID=$NEW_LND_PID
# Update state file
echo "export CDK_ITESTS_DIR=\"$CDK_ITESTS_DIR\"" > "$ENV_FILE"
echo "export CDK_TEST_MINT_URL=\"$CDK_TEST_MINT_URL\"" >> "$ENV_FILE"
echo "export CDK_TEST_MINT_URL_2=\"$CDK_TEST_MINT_URL_2\"" >> "$ENV_FILE"
echo "export CDK_MINTD_PID=\"$CDK_MINTD_PID\"" >> "$ENV_FILE"
echo "export CDK_MINTD_LND_PID=\"$CDK_MINTD_LND_PID\"" >> "$ENV_FILE"
echo "export CDK_REGTEST_PID=\"$CDK_REGTEST_PID\"" >> "$ENV_FILE"
echo
echo "✅ Mints restarted successfully!"
echo " CLN Mint: http://127.0.0.1:8085 (PID: $CDK_MINTD_PID)"
echo " LND Mint: http://127.0.0.1:8087 (PID: $CDK_MINTD_LND_PID)"
echo "==============================="
}
# Main command dispatcher
case "$1" in
"ln-cln1")
shift
cln_command "one" "$@"
;;
"ln-cln2")
shift
cln_command "two" "$@"
;;
"ln-lnd1")
shift
lnd_command "one" "$@"
;;
"ln-lnd2")
shift
lnd_command "two" "$@"
;;
"btc")
shift
btc_command "$@"
;;
"btc-mine")
shift
btc_mine "$@"
;;
"mint-info")
mint_info
;;
"mint-test")
mint_test
;;
"restart-mints")
restart_mints
;;
"show-env")
show_env
;;
"show-logs")
show_logs
;;
"show-status")
show_status
;;
"logs")
start_mprocs
;;
"help"|"-h"|"--help"|"")
show_help
;;
*)
echo "Unknown command: $1"
echo "Run '$0 help' for available commands"
exit 1
;;
esac