feat(secubox): Add P2P Hub backend and fix theme module
- Add P2P Hub RPCD methods for collaborative catalog sharing: - p2p_get_peers, p2p_discover, p2p_add_peer, p2p_remove_peer - p2p_get_peer_catalog, p2p_share_catalog - p2p_get_settings, p2p_set_settings - Fix crowdsec-dashboard theme.js to use baseclass.extend() instead of baseclass.singleton() for LuCI compatibility Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
9b12991c3b
commit
8317ac354f
@ -3,7 +3,7 @@
|
|||||||
'require uci';
|
'require uci';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CrowdSec Dashboard Theme Manager (Singleton)
|
* CrowdSec Dashboard Theme Manager
|
||||||
* Handles loading and switching between UI themes
|
* Handles loading and switching between UI themes
|
||||||
*
|
*
|
||||||
* Available themes:
|
* Available themes:
|
||||||
@ -16,7 +16,7 @@
|
|||||||
* Usage: theme.init().then(function() { ... });
|
* Usage: theme.init().then(function() { ... });
|
||||||
*/
|
*/
|
||||||
|
|
||||||
return baseclass.singleton({
|
return baseclass.extend({
|
||||||
// Available themes
|
// Available themes
|
||||||
themes: {
|
themes: {
|
||||||
'classic': {
|
'classic': {
|
||||||
|
|||||||
@ -325,6 +325,37 @@ case "$1" in
|
|||||||
json_add_string "filter" "string"
|
json_add_string "filter" "string"
|
||||||
json_close_object
|
json_close_object
|
||||||
|
|
||||||
|
# P2P Hub - Collaborative catalog sharing
|
||||||
|
json_add_object "p2p_get_peers"
|
||||||
|
json_close_object
|
||||||
|
|
||||||
|
json_add_object "p2p_discover"
|
||||||
|
json_close_object
|
||||||
|
|
||||||
|
json_add_object "p2p_add_peer"
|
||||||
|
json_add_string "address" "string"
|
||||||
|
json_add_string "name" "string"
|
||||||
|
json_close_object
|
||||||
|
|
||||||
|
json_add_object "p2p_remove_peer"
|
||||||
|
json_add_string "peer_id" "string"
|
||||||
|
json_close_object
|
||||||
|
|
||||||
|
json_add_object "p2p_get_peer_catalog"
|
||||||
|
json_add_string "peer_id" "string"
|
||||||
|
json_close_object
|
||||||
|
|
||||||
|
json_add_object "p2p_share_catalog"
|
||||||
|
json_add_boolean "enabled" "boolean"
|
||||||
|
json_close_object
|
||||||
|
|
||||||
|
json_add_object "p2p_get_settings"
|
||||||
|
json_close_object
|
||||||
|
|
||||||
|
json_add_object "p2p_set_settings"
|
||||||
|
json_add_object "settings"
|
||||||
|
json_close_object
|
||||||
|
|
||||||
json_dump
|
json_dump
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@ -2273,6 +2304,234 @@ PACEOF
|
|||||||
json_dump
|
json_dump
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
# P2P Hub - Collaborative catalog sharing
|
||||||
|
p2p_get_peers)
|
||||||
|
P2P_PEERS_FILE="/var/lib/secubox/p2p/peers.json"
|
||||||
|
P2P_DIR="/var/lib/secubox/p2p"
|
||||||
|
mkdir -p "$P2P_DIR"
|
||||||
|
|
||||||
|
json_init
|
||||||
|
json_add_array "peers"
|
||||||
|
|
||||||
|
if [ -f "$P2P_PEERS_FILE" ]; then
|
||||||
|
idx=0
|
||||||
|
while true; do
|
||||||
|
peer_id=$(jsonfilter -i "$P2P_PEERS_FILE" -e "@.peers[$idx].id" 2>/dev/null)
|
||||||
|
[ -z "$peer_id" ] && break
|
||||||
|
|
||||||
|
peer_name=$(jsonfilter -i "$P2P_PEERS_FILE" -e "@.peers[$idx].name" 2>/dev/null)
|
||||||
|
peer_addr=$(jsonfilter -i "$P2P_PEERS_FILE" -e "@.peers[$idx].address" 2>/dev/null)
|
||||||
|
peer_status=$(jsonfilter -i "$P2P_PEERS_FILE" -e "@.peers[$idx].status" 2>/dev/null)
|
||||||
|
last_seen=$(jsonfilter -i "$P2P_PEERS_FILE" -e "@.peers[$idx].last_seen" 2>/dev/null)
|
||||||
|
|
||||||
|
json_add_object ""
|
||||||
|
json_add_string "id" "$peer_id"
|
||||||
|
json_add_string "name" "${peer_name:-$peer_id}"
|
||||||
|
json_add_string "address" "$peer_addr"
|
||||||
|
json_add_string "status" "${peer_status:-unknown}"
|
||||||
|
json_add_string "last_seen" "$last_seen"
|
||||||
|
json_close_object
|
||||||
|
|
||||||
|
idx=$((idx + 1))
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
json_close_array
|
||||||
|
json_dump
|
||||||
|
;;
|
||||||
|
|
||||||
|
p2p_discover)
|
||||||
|
P2P_DIR="/var/lib/secubox/p2p"
|
||||||
|
mkdir -p "$P2P_DIR"
|
||||||
|
|
||||||
|
# mDNS discovery for SecuBox peers
|
||||||
|
discovered=0
|
||||||
|
json_init
|
||||||
|
json_add_array "peers"
|
||||||
|
|
||||||
|
# Try to discover using avahi-browse if available
|
||||||
|
if command -v avahi-browse >/dev/null 2>&1; then
|
||||||
|
avahi-browse -t -r _secubox._tcp 2>/dev/null | grep -E "^\+" | while read -r line; do
|
||||||
|
addr=$(echo "$line" | awk '{print $7}')
|
||||||
|
name=$(echo "$line" | awk '{print $4}')
|
||||||
|
if [ -n "$addr" ]; then
|
||||||
|
json_add_object ""
|
||||||
|
json_add_string "address" "$addr"
|
||||||
|
json_add_string "name" "$name"
|
||||||
|
json_add_string "discovered" "mdns"
|
||||||
|
json_close_object
|
||||||
|
discovered=$((discovered + 1))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
json_close_array
|
||||||
|
json_add_int "discovered" "$discovered"
|
||||||
|
json_dump
|
||||||
|
;;
|
||||||
|
|
||||||
|
p2p_add_peer)
|
||||||
|
read -r input
|
||||||
|
address=$(echo "$input" | jsonfilter -e '@.address')
|
||||||
|
name=$(echo "$input" | jsonfilter -e '@.name')
|
||||||
|
|
||||||
|
P2P_PEERS_FILE="/var/lib/secubox/p2p/peers.json"
|
||||||
|
P2P_DIR="/var/lib/secubox/p2p"
|
||||||
|
mkdir -p "$P2P_DIR"
|
||||||
|
|
||||||
|
# Generate peer ID
|
||||||
|
peer_id="peer_$(echo "$address" | md5sum | cut -c1-8)"
|
||||||
|
|
||||||
|
# Initialize file if not exists
|
||||||
|
[ ! -f "$P2P_PEERS_FILE" ] && echo '{"peers":[]}' > "$P2P_PEERS_FILE"
|
||||||
|
|
||||||
|
# Add peer using jsonfilter/sed
|
||||||
|
timestamp=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
||||||
|
tmp_file="${P2P_PEERS_FILE}.tmp"
|
||||||
|
{
|
||||||
|
echo '{"peers":['
|
||||||
|
# Existing peers
|
||||||
|
if [ -f "$P2P_PEERS_FILE" ]; then
|
||||||
|
jsonfilter -i "$P2P_PEERS_FILE" -e '@.peers[*]' 2>/dev/null | while read -r p; do
|
||||||
|
echo "$p,"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
# New peer
|
||||||
|
echo "{\"id\":\"$peer_id\",\"name\":\"$name\",\"address\":\"$address\",\"status\":\"added\",\"last_seen\":\"$timestamp\"}"
|
||||||
|
echo ']}'
|
||||||
|
} > "$tmp_file"
|
||||||
|
mv "$tmp_file" "$P2P_PEERS_FILE"
|
||||||
|
|
||||||
|
json_init
|
||||||
|
json_add_boolean "success" 1
|
||||||
|
json_add_string "peer_id" "$peer_id"
|
||||||
|
json_dump
|
||||||
|
;;
|
||||||
|
|
||||||
|
p2p_remove_peer)
|
||||||
|
read -r input
|
||||||
|
peer_id=$(echo "$input" | jsonfilter -e '@.peer_id')
|
||||||
|
|
||||||
|
P2P_PEERS_FILE="/var/lib/secubox/p2p/peers.json"
|
||||||
|
|
||||||
|
if [ -f "$P2P_PEERS_FILE" ] && [ -n "$peer_id" ]; then
|
||||||
|
# Filter out the peer
|
||||||
|
tmp_file="${P2P_PEERS_FILE}.tmp"
|
||||||
|
{
|
||||||
|
echo '{"peers":['
|
||||||
|
first=1
|
||||||
|
idx=0
|
||||||
|
while true; do
|
||||||
|
id=$(jsonfilter -i "$P2P_PEERS_FILE" -e "@.peers[$idx].id" 2>/dev/null)
|
||||||
|
[ -z "$id" ] && break
|
||||||
|
if [ "$id" != "$peer_id" ]; then
|
||||||
|
[ "$first" -eq 0 ] && echo ","
|
||||||
|
jsonfilter -i "$P2P_PEERS_FILE" -e "@.peers[$idx]" 2>/dev/null
|
||||||
|
first=0
|
||||||
|
fi
|
||||||
|
idx=$((idx + 1))
|
||||||
|
done
|
||||||
|
echo ']}'
|
||||||
|
} > "$tmp_file"
|
||||||
|
mv "$tmp_file" "$P2P_PEERS_FILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
json_init
|
||||||
|
json_add_boolean "success" 1
|
||||||
|
json_dump
|
||||||
|
;;
|
||||||
|
|
||||||
|
p2p_get_peer_catalog)
|
||||||
|
read -r input
|
||||||
|
peer_id=$(echo "$input" | jsonfilter -e '@.peer_id')
|
||||||
|
|
||||||
|
P2P_PEERS_FILE="/var/lib/secubox/p2p/peers.json"
|
||||||
|
|
||||||
|
# Get peer address
|
||||||
|
idx=0
|
||||||
|
peer_addr=""
|
||||||
|
while true; do
|
||||||
|
id=$(jsonfilter -i "$P2P_PEERS_FILE" -e "@.peers[$idx].id" 2>/dev/null)
|
||||||
|
[ -z "$id" ] && break
|
||||||
|
if [ "$id" = "$peer_id" ]; then
|
||||||
|
peer_addr=$(jsonfilter -i "$P2P_PEERS_FILE" -e "@.peers[$idx].address" 2>/dev/null)
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
idx=$((idx + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
json_init
|
||||||
|
|
||||||
|
if [ -n "$peer_addr" ]; then
|
||||||
|
# Fetch catalog from peer
|
||||||
|
catalog=$(wget -q -O - "http://${peer_addr}:8080/api/catalog" 2>/dev/null)
|
||||||
|
if [ -n "$catalog" ]; then
|
||||||
|
echo "$catalog"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
json_add_array "apps"
|
||||||
|
json_close_array
|
||||||
|
json_add_string "error" "Could not fetch catalog from peer"
|
||||||
|
json_dump
|
||||||
|
;;
|
||||||
|
|
||||||
|
p2p_share_catalog)
|
||||||
|
read -r input
|
||||||
|
enabled=$(echo "$input" | jsonfilter -e '@.enabled')
|
||||||
|
|
||||||
|
P2P_CONFIG="/var/lib/secubox/p2p/config.json"
|
||||||
|
P2P_DIR="/var/lib/secubox/p2p"
|
||||||
|
mkdir -p "$P2P_DIR"
|
||||||
|
|
||||||
|
# Update config
|
||||||
|
echo "{\"sharing_enabled\":$enabled}" > "$P2P_CONFIG"
|
||||||
|
|
||||||
|
json_init
|
||||||
|
json_add_boolean "success" 1
|
||||||
|
json_add_boolean "sharing_enabled" "$enabled"
|
||||||
|
json_dump
|
||||||
|
;;
|
||||||
|
|
||||||
|
p2p_get_settings)
|
||||||
|
P2P_CONFIG="/var/lib/secubox/p2p/config.json"
|
||||||
|
|
||||||
|
json_init
|
||||||
|
if [ -f "$P2P_CONFIG" ]; then
|
||||||
|
sharing=$(jsonfilter -i "$P2P_CONFIG" -e '@.sharing_enabled' 2>/dev/null)
|
||||||
|
json_add_boolean "sharing_enabled" "${sharing:-0}"
|
||||||
|
else
|
||||||
|
json_add_boolean "sharing_enabled" 0
|
||||||
|
fi
|
||||||
|
json_add_string "hub_version" "1.0.0"
|
||||||
|
json_add_string "protocol" "http"
|
||||||
|
json_add_int "port" 8080
|
||||||
|
json_dump
|
||||||
|
;;
|
||||||
|
|
||||||
|
p2p_set_settings)
|
||||||
|
read -r input
|
||||||
|
|
||||||
|
P2P_CONFIG="/var/lib/secubox/p2p/config.json"
|
||||||
|
P2P_DIR="/var/lib/secubox/p2p"
|
||||||
|
mkdir -p "$P2P_DIR"
|
||||||
|
|
||||||
|
# Extract settings
|
||||||
|
sharing=$(echo "$input" | jsonfilter -e '@.settings.sharing_enabled' 2>/dev/null)
|
||||||
|
|
||||||
|
# Save config
|
||||||
|
{
|
||||||
|
echo '{'
|
||||||
|
echo "\"sharing_enabled\":${sharing:-false}"
|
||||||
|
echo '}'
|
||||||
|
} > "$P2P_CONFIG"
|
||||||
|
|
||||||
|
json_init
|
||||||
|
json_add_boolean "success" 1
|
||||||
|
json_dump
|
||||||
|
;;
|
||||||
|
|
||||||
*)
|
*)
|
||||||
json_init
|
json_init
|
||||||
json_add_boolean "error" true
|
json_add_boolean "error" true
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user