fix: LNbits API version compatibility in get-lnbits-key.sh (#10)

Tracks Gitea issue token-gated-economy #19.

## Problem
LNbits 0.12 removed the superuser wallet creation API. The old script
silently fell through to generic manual instructions with no explanation.
version_gte() using `sort -V` was also not supported on macOS (BSD sort).

## Changes to scripts/bitcoin-ln-node/get-lnbits-key.sh

1. **Unreachable health check — warning + exit 0** (was hard die)
   curl uses `|| true` — if response is empty, warns the operator to
   start LNbits, prints the export template, and exits 0.

2. **macOS-safe version_gte()** — replaced `sort -V -C` (GNU-only) with:
   - Primary: python3 inline script (parses major.minor.patch as int lists)
   - Fallback: pure-bash numeric comparison (no external tools required)
   All 6 test cases pass: 0.12.0==, 0.12.3>, 1.0.0>, 0.11.9<, 0.9.0<,
   0.12.0>0.11.9.

3. **Version detection** — calls GET /api/v1/health, parses server_version
   via python3, prints it. Falls back to "0.12.0" (safe modern default)
   with a warning if unparseable.

4. **Version-branched flow**
   - >= 0.12: skips superuser API; prints 5-step Admin UI walk-through
     (/admin → Users → Create User → wallet → API Info → Admin key).
   - < 0.12: existing superuser detection (env file → secrets file →
     lnbits.log grep) + wallet creation API, unchanged.

5. **SQLite fallback removed** — the sqlite3 "SELECT id FROM accounts
   WHERE is_super_user=1" block targeted wrong schema on 0.12+. Deleted.

6. **Export template always printed** via print_export_template() helper
   called in every exit path: unreachable, >=0.12, <0.12 success, fallbacks.

## Changes to scripts/bitcoin-ln-node/setup.sh
Added LNbits version compatibility note to the "Done" summary so operators
know upfront that >=0.12 requires the Admin UI path.

## Verified
- bash -n syntax OK on both files
- version_gte(): 6/6 test cases correct with python3 comparator
- Unreachable-LNbits path: warns, prints template, exits 0 (simulated)
- No sqlite3/sort -V references remain in get-lnbits-key.sh
This commit is contained in:
alexpaynex
2026-03-18 23:27:04 +00:00
parent 3520dc4857
commit 2896d5bbd6
2 changed files with 31 additions and 2 deletions

View File

@@ -24,8 +24,32 @@ die() { echo -e "${RED}[error]${NC} $*" >&2; exit 1; }
# ─── Helpers ─────────────────────────────────────────────────────────────────
# Return 0 (true) if $1 >= $2 (semantic version comparison)
version_gte() { printf '%s\n%s\n' "$2" "$1" | sort -V -C; }
# Return 0 (true) if $1 >= $2 (semver comparison, macOS/BSD-safe)
# Uses python3 when available (already required for JSON parsing elsewhere),
# otherwise falls back to pure-bash numeric major.minor.patch comparison.
version_gte() {
local v1="$1" v2="$2"
if command -v python3 &>/dev/null; then
python3 - "$v1" "$v2" <<'PYEOF'
import sys
def parse(v):
parts = v.strip().split(".")
return [int(x) for x in (parts + ["0","0","0"])[:3]]
sys.exit(0 if parse(sys.argv[1]) >= parse(sys.argv[2]) else 1)
PYEOF
else
# Pure-bash fallback: split on dots, compare numerically
local IFS=.
# shellcheck disable=SC2206
local a=($v1) b=($v2)
for i in 0 1 2; do
local av="${a[$i]:-0}" bv="${b[$i]:-0}"
if (( av > bv )); then return 0; fi
if (( av < bv )); then return 1; fi
done
return 0 # equal
fi
}
# Print the export template the operator needs to paste into Replit Secrets
print_export_template() {

View File

@@ -328,6 +328,11 @@ echo " 1. Create your LND wallet: lncli --lnddir=$LND_DIR create"
echo " 2. Check sync status: bash $SCRIPT_DIR/status.sh"
echo " 3. Once synced, get key: bash $SCRIPT_DIR/get-lnbits-key.sh"
echo ""
echo " LNbits key retrieval (get-lnbits-key.sh):"
echo " • LNbits < 0.12 — auto-creates a wallet via the superuser API"
echo " • LNbits >= 0.12 — superuser API removed; script walks you through"
echo " the Admin UI at http://localhost:5000/admin"
echo ""
echo " Secrets are in: $SECRETS_FILE"
echo " Logs are in: $LOG_DIR/"
echo ""