From 8ffd9c7dab7f1f7cfc81da863aecdf99e03b6178 Mon Sep 17 00:00:00 2001 From: chrischristiansen-glitch Date: Sat, 23 May 2026 06:27:20 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20scripts/boot.sh=20v2=20=E2=80=94=20full?= =?UTF-8?q?=20hacker=20dashboard=20with=20auth,=20agent=20status,=20cost?= =?UTF-8?q?=20audit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/boot.sh | 205 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 163 insertions(+), 42 deletions(-) diff --git a/scripts/boot.sh b/scripts/boot.sh index a2062fe..ba3fbcc 100644 --- a/scripts/boot.sh +++ b/scripts/boot.sh @@ -1,76 +1,197 @@ #!/usr/bin/env bash -# boot.sh — OSVauco OPAX oppstartsprotokoll -# Kjøres automatisk når Cloud Shell åpnes (via ~/.bashrc) -# Manuelt: source ~/OSVauco/scripts/boot.sh +# ============================================================================= +# boot.sh — OSVauco OPAX Terminal Boot Protocol v2 +# Auto-runs on Cloud Shell startup via ~/.bashrc +# Manual: source ~/OSVauco/scripts/boot.sh +# ============================================================================= OSVAUCO_DIR="${HOME}/OSVauco" -# Ikke kjør hvis vi ikke er i et interaktivt shell +# Only run in interactive shells [[ $- != *i* ]] && return - -# Ikke kjør hvis OSVauco-mappen ikke finnes [[ ! -d "$OSVAUCO_DIR" ]] && return cd "$OSVAUCO_DIR" || return +# ────────────────────────────────────────────────────────────────────────────── +CYAN='\033[0;36m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +BLUE='\033[0;34m' +MAGENTA='\033[0;35m' +WHITE='\033[1;37m' +DIM='\033[2m' +BOLD='\033[1m' +NC='\033[0m' # No Color + +OK="${GREEN}✓${NC}" +WARN="${YELLOW}⚠️ ${NC}" +FAIL="${RED}✗${NC}" +INFO="${CYAN}→${NC}" +DOT="${DIM}•${NC}" + echo "" -echo "┌─────────────────────────────────────────────┐" -echo "│ OSVauco OPAX — Boot $(date '+%Y-%m-%d %H:%M %Z') │" -echo "└─────────────────────────────────────────────┘" +printf "${CYAN}" +echo " ██████╗███████╗██╗ ██╗█████╗ ██████╗ ██████╗ " +echo " ╚════██║╚══════╝██║ ██║██╔══██╗██╔════╝██╔════╝ " +echo " █████╔╝ ███╗ ██║ ██║██║ ██║██║ ███╗██║ " +echo " ██╔════╝ ██║ ██║ ██║██║ ██║██║ ██║██║ " +echo " ███████╗███████║╚██████╔╝╚█████╔╝╚██████╔╝╚██████╗" +echo " ╚══════╝╚══════╝ ╚═════╝ ╚════╝ ╚═════╝ ╚═════╝" +printf "${NC}" +printf "${DIM} O P A X O p e r a t o r P l a t f o r m${NC}\n" +printf "${DIM} v2 • propane-will-491900-m5 • us-central1${NC}\n" +echo "" +printf "${DIM}════════════════════════════════════════════════════════════════════${NC}\n" + +BOOT_TIME=$(date '+%Y-%m-%d %H:%M %Z') +printf " ${DIM}BOOT${NC} ${WHITE}%s${NC}\n" "$BOOT_TIME" echo "" -# 1. Last inn .env +# ============================================================================= +# SECTION 1: ENV + AUTH +# ============================================================================= +printf " ${BOLD}${BLUE}► AUTH${NC}\n" + +# Load .env if [[ -f "$OSVAUCO_DIR/.env" ]]; then source "$OSVAUCO_DIR/.env" - echo " ✓ .env lastet — PROJECT_ID=$PROJECT_ID" + printf " ${OK} .env loaded ${DIM}PROJECT_ID=${PROJECT_ID}${NC}\n" else - echo " ⚠️ .env mangler — kjør: cp .env.example .env && nano .env" + printf " ${FAIL} .env MISSING ${YELLOW}Run: cp .env.example .env && nano .env${NC}\n" + return fi -# 2. Sett gcloud-prosjekt -if [[ -n "${PROJECT_ID:-}" ]]; then - gcloud config set project "$PROJECT_ID" --quiet 2>/dev/null - echo " ✓ gcloud project = $PROJECT_ID" +# gcloud project +gcloud config set project "$PROJECT_ID" --quiet 2>/dev/null +ACTIVE_PROJ=$(gcloud config get-value project 2>/dev/null) +if [[ "$ACTIVE_PROJ" == "$PROJECT_ID" ]]; then + printf " ${OK} gcloud project ${DIM}${ACTIVE_PROJ}${NC}\n" +else + printf " ${FAIL} gcloud project MISMATCH: got ${ACTIVE_PROJ}, expected ${PROJECT_ID}\n" +fi + +# Active account +ACTIVE_ACCOUNT=$(gcloud config get-value account 2>/dev/null) +if [[ -n "$ACTIVE_ACCOUNT" ]]; then + printf " ${OK} gcloud account ${DIM}${ACTIVE_ACCOUNT}${NC}\n" +else + printf " ${FAIL} gcloud account MISSING${NC} ${YELLOW}Run: gcloud auth login${NC}\n" +fi + +# Application Default Credentials +if gcloud auth application-default print-access-token >/dev/null 2>&1; then + printf " ${OK} ADC (app-default) ${DIM}valid${NC}\n" +else + printf " ${WARN} ADC missing ${YELLOW}Run: gcloud auth application-default login${NC}\n" fi -# 3. Sjekk Memory Bank — ADVAR hvis aktive instanser finnes echo "" -echo " [Memory Bank-sjekk]" + +# ============================================================================= +# SECTION 2: CLOUD RUN SERVICES +# ============================================================================= +printf " ${BOLD}${BLUE}► CLOUD RUN${NC}\n" +CR_LIST=$(gcloud run services list \ + --project="${PROJECT_ID}" \ + --region="${REGION}" \ + --format="value(name,status.url)" 2>/dev/null || echo "") + +if [[ -z "$CR_LIST" ]]; then + printf " ${DOT} No services deployed ${DIM}(no cost)${NC}\n" +else + while IFS=$'\t' read -r NAME URL; do + printf " ${OK} %-28s ${DIM}%s${NC}\n" "$NAME" "$URL" + done <<< "$CR_LIST" +fi +echo "" + +# ============================================================================= +# SECTION 3: MEMORY BANK / REASONING ENGINES +# ============================================================================= +printf " ${BOLD}${BLUE}► MEMORY BANK${NC} ${DIM}(\$0.0994/vCPU-hr • continuous billing)${NC}\n" ENGINES=$(gcloud ai reasoning-engines list \ --project="${PROJECT_ID}" \ - --region="${REGION:-us-central1}" \ - --format="value(name)" 2>/dev/null || echo "") + --region="${REGION}" \ + --format="value(name,displayName)" 2>/dev/null || echo "") -if [[ -n "$ENGINES" ]]; then +if [[ -z "$ENGINES" ]]; then + printf " ${OK} No active instances ${DIM}(no cost)${NC}\n" +else ENGINE_COUNT=$(echo "$ENGINES" | grep -c . || true) - echo " ⚠️ $ENGINE_COUNT Memory Bank-instans(er) kjører — KOSTER PENGER!" - echo " Kjør: bash infrastructure/09-cost-check.sh for detaljer" -else - echo " ✓ Ingen aktive Memory Bank-instanser" + printf " ${RED}${BOLD}⚠️ $ENGINE_COUNT INSTANCE(S) RUNNING — COSTS MONEY CONTINUOUSLY${NC}\n" + while IFS=$'\t' read -r ENAME EDISPLAY; do + SHORT=$(echo "$ENAME" | awk -F'/' '{print $NF}') + printf " ${WARN} %-20s ${DIM}%s${NC}\n" "${EDISPLAY:-unnamed}" "id:$SHORT" + done <<< "$ENGINES" + printf " ${INFO} To delete: ${DIM}gcloud ai reasoning-engines delete ID --project=$PROJECT_ID --region=$REGION --quiet${NC}\n" fi - -# 4. Sjekk Cloud Run echo "" -echo " [Cloud Run-sjekk]" -SERVICES=$(gcloud run services list \ + +# ============================================================================= +# SECTION 4: VERTEX AI AGENTS (ADK Agent Runtimes) +# ============================================================================= +printf " ${BOLD}${BLUE}► AGENT RUNTIMES${NC}\n" +AGENT_RUNTIMES=$(gcloud ai agent-engines list \ --project="${PROJECT_ID}" \ - --region="${REGION:-us-central1}" \ - --format="value(name)" 2>/dev/null || echo "") + --region="${REGION}" \ + --format="value(name,displayName,state)" 2>/dev/null || echo "") -if [[ -n "$SERVICES" ]]; then - echo " ✓ Aktive Cloud Run-tjenester: $SERVICES" +if [[ -z "$AGENT_RUNTIMES" ]]; then + printf " ${DOT} No agent runtimes ${DIM}(no cost)${NC}\n" else - echo " — Ingen Cloud Run-tjenester deployed" + while IFS=$'\t' read -r ANAME ADISPLAY ASTATE; do + SHORT=$(echo "$ANAME" | awk -F'/' '{print $NF}') + if [[ "$ASTATE" == "ACTIVE" ]]; then + printf " ${OK} %-24s ${GREEN}%-8s${NC} ${DIM}id:$SHORT${NC}\n" "${ADISPLAY:-unnamed}" "$ASTATE" + else + printf " ${WARN} %-24s ${YELLOW}%-8s${NC} ${DIM}id:$SHORT${NC}\n" "${ADISPLAY:-unnamed}" "$ASTATE" + fi + done <<< "$AGENT_RUNTIMES" fi +echo "" -# 5. Git pull (stille) -echo "" -echo " [Git sync]" -git pull --quiet 2>/dev/null && echo " ✓ Repo oppdatert" || echo " ⚠️ git pull feilet" +# ============================================================================= +# SECTION 5: RAG CORPORA +# ============================================================================= +printf " ${BOLD}${BLUE}► RAG CORPORA${NC} ${DIM}(not deleted by teardown)${NC}\n" +RAG_LIST=$(gcloud ai rag-corpora list \ + --project="${PROJECT_ID}" \ + --region="${REGION}" \ + --format="value(name,displayName)" 2>/dev/null || echo "") +if [[ -z "$RAG_LIST" ]]; then + printf " ${DOT} No RAG corpora found\n" +else + while IFS=$'\t' read -r RNAME RDISPLAY; do + SHORT=$(echo "$RNAME" | awk -F'/' '{print $NF}') + printf " ${OK} %-28s ${DIM}id:$SHORT${NC}\n" "${RDISPLAY:-unnamed}" + done <<< "$RAG_LIST" +fi echo "" -echo " Kommandoer:" -echo " bash infrastructure/09-cost-check.sh — full kostnadssjekk" -echo " bash infrastructure/05-cloudrun-deploy.sh — deploy agent" -echo " bash infrastructure/03-teardown.sh — rydd ned (kväld)" + +# ============================================================================= +# SECTION 6: GIT SYNC +# ============================================================================= +printf " ${BOLD}${BLUE}► GIT${NC}\n" +GIT_BRANCH=$(git branch --show-current 2>/dev/null || echo "unknown") +GIT_STATUS=$(git pull --quiet 2>&1) +LAST_COMMIT=$(git log --oneline -1 2>/dev/null || echo "unknown") +printf " ${OK} Branch: ${WHITE}%-20s${NC} ${DIM}%s${NC}\n" "$GIT_BRANCH" "$LAST_COMMIT" +echo "" + +# ============================================================================= +# SECTION 7: QUICK COMMANDS +# ============================================================================= +printf "${DIM}════════════════════════════════════════════════════════════════════${NC}\n" +printf " ${BOLD}${CYAN}QUICK COMMANDS${NC}\n" +printf " ${DIM}setup ${NC}bash infrastructure/00-authcheck.sh\n" +printf " ${DIM}deploy ${NC}bash infrastructure/05-cloudrun-deploy.sh\n" +printf " ${DIM}rag ${NC}bash infrastructure/07-rag-setup.sh\n" +printf " ${DIM}memory ${NC}bash infrastructure/08-memorybank-setup.sh\n" +printf " ${DIM}cost ${NC}bash infrastructure/09-cost-check.sh\n" +printf " ${DIM}teardown ${NC}bash infrastructure/03-teardown.sh\n" +printf " ${DIM}gemini ${NC}gemini ${DIM}(OPAX-MCP TUI)${NC}\n" +printf "${DIM}════════════════════════════════════════════════════════════════════${NC}\n" echo ""