#!/usr/bin/env bash # bb-inject — Inject BlackBoard v2 beacon across all BlackRoad web properties # Usage: bb-inject [--dry-run] [--site dir1 dir2 ...] set -e PINK='\033[38;5;205m' AMBER='\033[38;5;214m' GREEN='\033[38;5;82m' BLUE='\033[38;5;69m' VIOLET='\033[38;5;135m' RED='\033[38;5;196m' RESET='\033[0m' BEACON='' BEACON_PATTERN='bb\.blackroad\.io/bb\.js' DRY_RUN=false INJECTED=0 SKIPPED=0 ALREADY=0 if [[ "${1:-}" == "--dry-run" ]]; then DRY_RUN=true shift echo -e "${AMBER}[DRY RUN]${RESET} No files will be modified" fi # All known Pages project directories SITES=( "$HOME/blackroad-web" "$HOME/index-blackroad" "$HOME/portal-blackroad" "$HOME/chat-blackroad" "$HOME/images-blackroad" "$HOME/thinking.blackroad.io" "$HOME/blackroad-operator/dashboard" "$HOME/blackroad-operator/websites" "$HOME/blackroad-operator/workers/blackboard/public" "$HOME/blackroad-operator/workers/mesh/public" "$HOME/blackroad-operator/orgs" "$HOME/blackroad-operator/packages" "$HOME/Desktop/templates" ) # If specific sites provided, use those instead if [[ $# -gt 0 ]]; then SITES=("$@") fi echo -e "${PINK}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}" echo -e "${PINK} BlackBoard v2 — Beacon Injection${RESET}" echo -e "${PINK}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}" echo "" inject_file() { local file="$1" local rel="${file#$HOME/}" # Skip miniflare/wrangler dev tool HTML if [[ "$file" == *"node_modules"* ]] || [[ "$file" == *".git/"* ]]; then return fi # Check if already has beacon if grep -q "$BEACON_PATTERN" "$file" 2>/dev/null; then echo -e " ${BLUE}✓${RESET} $rel ${BLUE}(already has beacon)${RESET}" ((ALREADY++)) || true return fi # Check if it has a tag to inject before if grep -q '' "$file" 2>/dev/null; then if $DRY_RUN; then echo -e " ${AMBER}→${RESET} $rel ${AMBER}(would inject before )${RESET}" else # Inject before — use perl for reliable newline handling on macOS perl -pi -e "s||${BEACON}\n|" "$file" echo -e " ${GREEN}✓${RESET} $rel ${GREEN}(injected before )${RESET}" fi ((INJECTED++)) || true return fi # Check if it has if grep -q '' "$file" 2>/dev/null; then if $DRY_RUN; then echo -e " ${AMBER}→${RESET} $rel ${AMBER}(would inject before )${RESET}" else perl -pi -e "s||${BEACON}\n|" "$file" echo -e " ${GREEN}✓${RESET} $rel ${GREEN}(injected before )${RESET}" fi ((INJECTED++)) || true return fi echo -e " ${RED}✗${RESET} $rel ${RED}(no head/body tag found)${RESET}" ((SKIPPED++)) || true } for site_dir in "${SITES[@]}"; do if [[ ! -d "$site_dir" ]]; then continue fi echo -e "\n${VIOLET}▸ Scanning: ${site_dir#$HOME/}${RESET}" # Find all HTML files, excluding node_modules and .git while IFS= read -r file; do [[ -z "$file" ]] && continue inject_file "$file" done < <(find "$site_dir" -name "*.html" -not -path "*/node_modules/*" -not -path "*/.git/*" 2>/dev/null | sort) done echo "" echo -e "${PINK}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}" echo -e " ${GREEN}Injected:${RESET} $INJECTED files" echo -e " ${BLUE}Already:${RESET} $ALREADY files" echo -e " ${RED}Skipped:${RESET} $SKIPPED files" echo -e "${PINK}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}" if $DRY_RUN; then echo -e "\n${AMBER}Run without --dry-run to apply changes${RESET}" fi