Generate a minimal IPK on-the-fly when a client visits the master-link landing page, so the "Download Package" step always works even without a pre-built IPK bundle. The IPK configures the peer via postinst uci commands (avoiding file conflicts with secubox-master-link), and can be installed directly via opkg install URL from SSH. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
77 lines
2.2 KiB
Bash
77 lines
2.2 KiB
Bash
#!/bin/sh
|
|
# Master-Link API - Node status & mesh info
|
|
# GET /api/master-link/status
|
|
# Auth: Public (limited) / Full (local)
|
|
|
|
echo "Content-Type: application/json"
|
|
echo "Access-Control-Allow-Origin: *"
|
|
echo "Access-Control-Allow-Methods: GET, POST, OPTIONS"
|
|
echo "Access-Control-Allow-Headers: Content-Type"
|
|
echo ""
|
|
|
|
# Handle CORS preflight
|
|
if [ "$REQUEST_METHOD" = "OPTIONS" ]; then
|
|
exit 0
|
|
fi
|
|
|
|
# Load library
|
|
. /usr/lib/secubox/master-link.sh >/dev/null 2>&1
|
|
|
|
# Handle POST for role promotion notifications from upstream
|
|
if [ "$REQUEST_METHOD" = "POST" ]; then
|
|
read -r input
|
|
action=$(echo "$input" | jsonfilter -e '@.action' 2>/dev/null)
|
|
|
|
case "$action" in
|
|
promote)
|
|
new_role=$(echo "$input" | jsonfilter -e '@.role' 2>/dev/null)
|
|
new_depth=$(echo "$input" | jsonfilter -e '@.depth' 2>/dev/null)
|
|
if [ -n "$new_role" ] && [ -n "$new_depth" ]; then
|
|
uci -q set master-link.main.role="$new_role"
|
|
uci -q set master-link.main.depth="$new_depth"
|
|
uci commit master-link
|
|
logger -t master-link "Role updated to $new_role at depth $new_depth"
|
|
echo "{\"success\":true,\"role\":\"$new_role\",\"depth\":$new_depth}"
|
|
else
|
|
echo '{"error":"missing_role_or_depth"}'
|
|
fi
|
|
;;
|
|
*)
|
|
echo '{"error":"unknown_action"}'
|
|
;;
|
|
esac
|
|
exit 0
|
|
fi
|
|
|
|
# GET - Return status
|
|
if ml_check_local_auth 2>/dev/null; then
|
|
# Full status for local requests
|
|
ml_status
|
|
else
|
|
# Limited public status
|
|
role=$(uci -q get master-link.main.role)
|
|
fp=$(factory_fingerprint 2>/dev/null)
|
|
hostname=$(uci -q get system.@system[0].hostname 2>/dev/null || hostname)
|
|
depth=$(uci -q get master-link.main.depth)
|
|
[ -z "$depth" ] && depth=0
|
|
ipk_info=$(ml_ipk_bundle_info 2>/dev/null)
|
|
ipk_available=$(echo "$ipk_info" | jsonfilter -e '@.available' 2>/dev/null)
|
|
ipk_type=$(echo "$ipk_info" | jsonfilter -e '@.type' 2>/dev/null)
|
|
|
|
# Detect master IP for IPK URL
|
|
master_ip=$(echo "${HTTP_HOST:-}" | cut -d: -f1)
|
|
[ -z "$master_ip" ] && master_ip=$(uci -q get network.lan.ipaddr)
|
|
|
|
cat <<-EOF
|
|
{
|
|
"role": "${role:-master}",
|
|
"fingerprint": "$fp",
|
|
"hostname": "$hostname",
|
|
"depth": $depth,
|
|
"ipk_available": ${ipk_available:-false},
|
|
"ipk_type": "${ipk_type:-unknown}",
|
|
"ipk_url_base": "http://${master_ip}:7331/api/master-link/ipk"
|
|
}
|
|
EOF
|
|
fi
|