bin/ 230 CLI tools (ask-*, br-*, agent-*, roadid, carpool) scripts/ 99 automation scripts fleet/ Node configs and deployment workers/ Cloudflare Worker sources (roadpay, road-search, squad webhooks) roadc/ RoadC programming language roadnet/ Mesh network (5 APs, WireGuard) operator/ Memory system scripts config/ System configs dotfiles/ Shell configs docs/ Documentation BlackRoad OS — Pave Tomorrow. RoadChain-SHA2048: d1a24f55318d338b RoadChain-Identity: alexa@sovereign RoadChain-Full: d1a24f55318d338b24b60bad7be39286379c76ae5470817482100cb0ddbbcb97e147d07ac7243da0a9f0363e4e5c833d612b9c0df3a3cd20802465420278ef74875a5b77f55af6fe42a931b8b635b3d0d0b6bde9abf33dc42eea52bc03c951406d8cbe49f1a3d29b26a94dade05e9477f34a7d4d4c6ec4005c3c2ac54e73a68440c512c8e83fd9b1fe234750b898ef8f4032c23db173961fe225e67a0432b5293a9714f76c5c57ed5fdf35b9fb40fd73c03ebf88b7253c6a0575f5afb6a6b49b3bda310602fb1ef676859962dad2aebbb2875814b30eee0a8ba195e482d4cbc91d8819e7f38f6db53e8063401649c77bb994371473cabfb917fb53e8cbe73d60
134 lines
4.8 KiB
Bash
Executable File
134 lines
4.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# BLACKROAD PI MESH - DISTRIBUTED SOVEREIGNTY
|
|
# No one can bring us down - data replicated across the fleet!
|
|
|
|
PINK='\033[38;5;205m'
|
|
AMBER='\033[38;5;214m'
|
|
GREEN='\033[38;5;82m'
|
|
BLUE='\033[38;5;69m'
|
|
RESET='\033[0m'
|
|
|
|
# Pi Fleet - simple arrays (bash 3 compatible)
|
|
PI_NAMES="cecilia lucidia"
|
|
PI_CECILIA_HOST="blackroad@192.168.4.89"
|
|
PI_CECILIA_PATH="/home/blackroad/claude"
|
|
PI_LUCIDIA_HOST="pi@192.168.4.81"
|
|
PI_LUCIDIA_PATH="/mnt/nvme/blackroad/claude"
|
|
|
|
echo -e "${PINK}"
|
|
cat << 'BANNER'
|
|
╔══════════════════════════════════════════════════════════════╗
|
|
║ ____ _ _ ____ _ ║
|
|
║ | __ )| | __ _ ___| | _| _ \ ___ __ _ __| | ║
|
|
║ | _ \| |/ _` |/ __| |/ / |_) / _ \ / _` |/ _` | ║
|
|
║ | |_) | | (_| | (__| <| _ < (_) | (_| | (_| | ║
|
|
║ |____/|_|\__,_|\___|_|\_\_| \_\___/ \__,_|\__,_| ║
|
|
║ ║
|
|
║ P I M E S H - N O O N E C A N ║
|
|
║ B R I N G U S D O W N ║
|
|
╚══════════════════════════════════════════════════════════════╝
|
|
BANNER
|
|
echo -e "${RESET}"
|
|
|
|
get_host() {
|
|
case "$1" in
|
|
cecilia) echo "$PI_CECILIA_HOST" ;;
|
|
lucidia) echo "$PI_LUCIDIA_HOST" ;;
|
|
esac
|
|
}
|
|
|
|
get_path() {
|
|
case "$1" in
|
|
cecilia) echo "$PI_CECILIA_PATH" ;;
|
|
lucidia) echo "$PI_LUCIDIA_PATH" ;;
|
|
esac
|
|
}
|
|
|
|
check_nodes() {
|
|
echo -e "${AMBER}Checking Pi Fleet Status...${RESET}"
|
|
for node in $PI_NAMES; do
|
|
host=$(get_host "$node")
|
|
if ssh -o ConnectTimeout=2 -o BatchMode=yes "$host" "echo ok" &>/dev/null; then
|
|
echo -e " ${GREEN}●${RESET} $node - ONLINE"
|
|
else
|
|
echo -e " ${PINK}○${RESET} $node - offline"
|
|
fi
|
|
done
|
|
echo
|
|
}
|
|
|
|
sync_all() {
|
|
echo -e "${AMBER}Syncing to ALL Pi nodes...${RESET}"
|
|
|
|
for node in $PI_NAMES; do
|
|
host=$(get_host "$node")
|
|
path=$(get_path "$node")
|
|
|
|
echo -e "${BLUE}→ Syncing to $node...${RESET}"
|
|
if ssh -o ConnectTimeout=2 -o BatchMode=yes "$host" "echo ok" &>/dev/null; then
|
|
rsync -avz --delete ~/.claude/ "$host:$path/config/" 2>/dev/null
|
|
rsync -avz ~/.blackroad/memory/ "$host:$path/time/memory/" 2>/dev/null
|
|
echo -e " ${GREEN}✓${RESET} $node synced"
|
|
else
|
|
echo -e " ${PINK}✗${RESET} $node unreachable"
|
|
fi
|
|
done
|
|
|
|
# Cross-sync between Pis
|
|
echo -e "${BLUE}→ Cross-syncing cecilia ↔ lucidia...${RESET}"
|
|
ssh -o ConnectTimeout=3 "$PI_CECILIA_HOST" \
|
|
"rsync -avz $PI_CECILIA_PATH/time/ $PI_LUCIDIA_HOST:$PI_LUCIDIA_PATH/time/ 2>/dev/null" && \
|
|
echo -e " ${GREEN}✓${RESET} Cross-sync complete" || \
|
|
echo -e " ${PINK}✗${RESET} Cross-sync skipped"
|
|
|
|
echo -e "\n${GREEN}═══ MESH SYNC COMPLETE ═══${RESET}"
|
|
}
|
|
|
|
status() {
|
|
echo -e "${AMBER}Pi Fleet Storage Status:${RESET}\n"
|
|
for node in $PI_NAMES; do
|
|
host=$(get_host "$node")
|
|
path=$(get_path "$node")
|
|
|
|
echo -e "${BLUE}$node:${RESET}"
|
|
ssh -o ConnectTimeout=2 -o BatchMode=yes "$host" \
|
|
"du -sh $path/* 2>/dev/null; echo; df -h \$(dirname $path) | tail -1" 2>/dev/null || echo " (offline)"
|
|
echo
|
|
done
|
|
}
|
|
|
|
broadcast_time() {
|
|
local action="$1"
|
|
local entity="$2"
|
|
local details="$3"
|
|
local ts=$(date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
local entry="{\"ts\":\"$ts\",\"agent\":\"${MY_CLAUDE:-mesh}\",\"action\":\"$action\",\"entity\":\"$entity\",\"details\":\"$details\",\"mesh\":true}"
|
|
|
|
echo -e "${AMBER}Broadcasting to all nodes...${RESET}"
|
|
for node in $PI_NAMES; do
|
|
host=$(get_host "$node")
|
|
path=$(get_path "$node")
|
|
|
|
if ssh -o ConnectTimeout=2 -o BatchMode=yes "$host" "echo '$entry' >> $path/time/journals/master-time.jsonl" 2>/dev/null; then
|
|
echo -e " ${GREEN}✓${RESET} $node"
|
|
else
|
|
echo -e " ${PINK}✗${RESET} $node"
|
|
fi
|
|
done
|
|
echo -e "${GREEN}Broadcast complete${RESET}"
|
|
}
|
|
|
|
case "${1:-status}" in
|
|
check) check_nodes ;;
|
|
sync) sync_all ;;
|
|
status) status ;;
|
|
broadcast) shift; broadcast_time "$@" ;;
|
|
*)
|
|
echo "Usage: blackroad-pi-mesh-sync.sh [check|sync|status|broadcast]"
|
|
echo " check - Check which Pis are online"
|
|
echo " sync - Sync to ALL online Pis + cross-sync"
|
|
echo " status - Show storage on all Pis"
|
|
echo " broadcast - Log to ALL time journals"
|
|
;;
|
|
esac
|