diff --git a/scripts/shell-init.sh b/scripts/shell-init.sh index e54e337..a2acf0d 100644 --- a/scripts/shell-init.sh +++ b/scripts/shell-init.sh @@ -8,72 +8,118 @@ OSVAUCO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")/.." && pwd)" ENV_FILE="${OSVAUCO_DIR}/.env" -# Last inn .env hvis den finnes +GREEN="$(tput setaf 2 2>/dev/null || true)" +RED="$(tput setaf 1 2>/dev/null || true)" +YELLOW="$(tput setaf 3 2>/dev/null || true)" +CYAN="$(tput setaf 6 2>/dev/null || true)" +BOLD="$(tput bold 2>/dev/null || true)" +DIM="\033[2m" +NC="$(tput sgr0 2>/dev/null || true)" + +clear + +cat << 'BANNER' + + ============================================================ + / _ \ / __| \ / / _ \ | | | |/ __/ _ \ + | (_) | \__ \ \ /'\V //_/ | |_| | (_| (_) | + \___/ |___/ \_/ /_/ |___/ \___\___/ + + OPAX Operator Platform // propane-will-491900-m5 + BOOT 2026-05-13 -- us-central1 + ============================================================ +BANNER + +# ── Auth-sjekk ──────────────────────────────────────────────────────────── +printf " | AUTH |\n" + +GCLOUD_OK=0 +ADC_OK=0 +ENV_OK=0 + +if gcloud auth print-access-token >/dev/null 2>&1; then + GCLOUD_OK=1 +fi + +if gcloud auth application-default print-access-token >/dev/null 2>&1; then + ADC_OK=1 +fi + if [[ -f "$ENV_FILE" ]]; then + ENV_OK=1 set -o allexport + # shellcheck disable=SC1090 source "$ENV_FILE" set +o allexport fi -# Bare kjør hvis PROJECT_ID er satt -if [[ -z "${PROJECT_ID:-}" ]]; then - return 0 +if [[ $GCLOUD_OK -eq 1 ]]; then + ACCOUNT=$(gcloud auth list --filter=status:ACTIVE --format="value(account)" 2>/dev/null || echo "ukjent") + printf " | ${GREEN}[OK]${NC} gcloud \xe2\x86\x92 %s\n" "$ACCOUNT" +else + printf " | ${RED}[XX]${NC} gcloud IKKE autentisert\n" + printf " | Kj\xc3\xb8r: gcloud auth login --no-launch-browser\n" fi -# --- Kostnadsvisning --- -YELLOW='\033[1;33m' -GREEN='\033[0;32m' -RED='\033[0;31m' -CYAN='\033[0;36m' -DIM='\033[2m' -BOLD='\033[1m' -NC='\033[0m' +if [[ $ADC_OK -eq 1 ]]; then + printf " | ${GREEN}[OK]${NC} ADC (Application Default Credentials)\n" +else + printf " | ${YELLOW}[!!]${NC} ADC mangler Run: gcloud auth application-default login\n" +fi -# Kalkuler akkumulert kost siden prosjektstart -START_EPOCH=1747144800 # 2026-05-13T14:00:00Z +if [[ $ENV_OK -eq 1 ]]; then + printf " | ${GREEN}[OK]${NC} .env lastet (PROJECT_ID=%s)\n" "${PROJECT_ID:-?}" +else + printf " | ${RED}[XX]${NC} .env MISSING Run: cp .env.example .env\n" +fi + +printf " |\n" + +# Sett gcloud-prosjekt stille +if [[ $GCLOUD_OK -eq 1 && -n "${PROJECT_ID:-}" ]]; then + gcloud config set project "${PROJECT_ID}" >/dev/null 2>&1 || true + gcloud config set compute/region "${REGION:-us-central1}" >/dev/null 2>&1 || true +fi + +# ── Kostnadsmåler ───────────────────────────────────────────────────────── +START_EPOCH=1778680800 # 2026-05-13T14:00:00Z (verifisert: date -d "2026-05-13 14:00:00 UTC" +%s) NOW_EPOCH=$(date +%s) ELAPSED_SEC=$(( NOW_EPOCH - START_EPOCH )) -ELAPSED_DAYS_INT=$(( ELAPSED_SEC / 86400 )) +if [[ $ELAPSED_SEC -lt 0 ]]; then ELAPSED_SEC=0; fi + +ELAPSED_DAYS=$(( ELAPSED_SEC / 86400 )) ELAPSED_HRS=$(( (ELAPSED_SEC % 86400) / 3600 )) ELAPSED_MIN=$(( (ELAPSED_SEC % 3600) / 60 )) -# Kost-estimat (bash bruker integer, skalert x100000) -# USD_PER_DAY = 0.03 -> 3000 (x100000) -USD_SCALED=$(( ELAPSED_SEC * 3000 / 86400 )) # i enheter av 0.00001 USD -NOK_SCALED=$(( USD_SCALED * 1062 / 100 )) # * 10.62 -> i enheter av 0.00001 NOK +# ~$0.03/dag -> skalert x100000 for integer-matte +USD_SCALED=$(( ELAPSED_SEC * 3000 / 86400 )) +NOK_SCALED=$(( USD_SCALED * 1062 / 100 )) -# Formater til lesbar tekst USD_INT=$(( USD_SCALED / 100000 )) -USD_DEC=$(( USD_SCALED % 100000 )) +USD_DEC=$(printf "%05d" $(( USD_SCALED % 100000 ))) NOK_INT=$(( NOK_SCALED / 100000 )) -NOK_DEC=$(( NOK_SCALED % 100000 )) +NOK_DEC=$(printf "%05d" $(( NOK_SCALED % 100000 ))) -printf "\n" -printf "${CYAN}${BOLD} ╔══════════════════════════════════════╗${NC}\n" -printf "${CYAN}${BOLD} ║ OSVauco · GCP Kostnadsmåler ║${NC}\n" -printf "${CYAN}${BOLD} ╠══════════════════════════════════════╣${NC}\n" -printf " ║ ${DIM}Fra: 2026-05-13 | Prosjekt: ${PROJECT_ID:0:16}${NC}${CYAN}${BOLD} ║${NC}\n" -printf "${CYAN}${BOLD} ╠══════════════════════════════════════╣${NC}\n" -printf " ║ ${YELLOW}${BOLD}NOK: kr %d.%05d${NC}%*s${CYAN}${BOLD} ║${NC}\n" \ - "$NOK_INT" "$NOK_DEC" "$(( 12 - ${#NOK_INT} - 6 ))" "" -printf " ║ ${GREEN}USD: \$%d.%05d${NC}%*s${CYAN}${BOLD} ║${NC}\n" \ - "$USD_INT" "$USD_DEC" "$(( 13 - ${#USD_INT} - 6 ))" "" -printf " ║ ${DIM}Tid: %dd %02dh %02dm${NC}%*s${CYAN}${BOLD} ║${NC}\n" \ - "$ELAPSED_DAYS_INT" "$ELAPSED_HRS" "$ELAPSED_MIN" "$(( 10 ))" "" -printf "${CYAN}${BOLD} ╠══════════════════════════════════════╣${NC}\n" +printf " | COST |\n" +printf " | ${YELLOW}${BOLD}NOK: kr %d.%s${NC}\n" "$NOK_INT" "$NOK_DEC" +printf " | ${GREEN}USD: \$%d.%s${NC}\n" "$USD_INT" "$USD_DEC" +printf " | ${DIM}Tid: %dd %02dh %02dm (fra 2026-05-13)${NC}\n" "$ELAPSED_DAYS" "$ELAPSED_HRS" "$ELAPSED_MIN" +printf " |\n" -# Hurtigsjekk: VMs og SQL (stille, bare vis hvis noe finnes) -VM_COUNT=$(gcloud compute instances list --project="${PROJECT_ID}" \ - --format='value(name)' --filter='status=RUNNING' 2>/dev/null | wc -l | tr -d ' ') -SQL_COUNT=$(gcloud sql instances list --project="${PROJECT_ID}" \ - --format='value(name)' --filter='state=RUNNABLE' 2>/dev/null | wc -l | tr -d ' ') - -if [[ "$VM_COUNT" -gt 0 || "$SQL_COUNT" -gt 0 ]]; then - printf " ║ ${RED}${BOLD}⚠ VM: %s SQL: %s — kjører!${NC}%*s${CYAN}${BOLD} ║${NC}\n" \ - "$VM_COUNT" "$SQL_COUNT" "0" "" -else - printf " ║ ${GREEN}✓ Ingen VM/SQL idle-kost${NC}%*s${CYAN}${BOLD} ║${NC}\n" "10" "" +# Rask idle-ressurs-sjekk +if [[ $GCLOUD_OK -eq 1 && -n "${PROJECT_ID:-}" ]]; then + VM_COUNT=$(gcloud compute instances list --project="${PROJECT_ID}" \ + --format='value(name)' --filter='status=RUNNING' 2>/dev/null | wc -l | tr -d ' ') + SQL_COUNT=$(gcloud sql instances list --project="${PROJECT_ID}" \ + --format='value(name)' --filter='state=RUNNABLE' 2>/dev/null | wc -l | tr -d ' ') + if [[ "$VM_COUNT" -gt 0 || "$SQL_COUNT" -gt 0 ]]; then + printf " | ${RED}${BOLD}[!!] VM: %s SQL: %s — IDLE-KOST DETEKTERT!${NC}\n" "$VM_COUNT" "$SQL_COUNT" + else + printf " | ${GREEN}[OK]${NC} Ingen VM/SQL idle-kost\n" + fi fi -printf "${CYAN}${BOLD} ╚══════════════════════════════════════╝${NC}\n" -printf " ${DIM}Full audit: bash scripts/cost-audit.sh${NC}\n\n" +printf " ----------------------------------------------------\n" +printf " ${DIM}Full audit : bash scripts/cost-audit.sh${NC}\n" +printf " ${DIM}Gemini TUI : gemini${NC}\n" +printf "\n"