diff --git a/gitops_router.sh b/gitops_router.sh index bb86f72..eb1657c 100644 --- a/gitops_router.sh +++ b/gitops_router.sh @@ -1,117 +1,128 @@ #!/usr/bin/env bash set -euo pipefail -PERSON="$1" +PERSON="${1:?Missing PERSON argument}" HOST="alps:3222" PROTOCOL="http" REPO="babbarc/workspaces" BRANCH="master" - LOG_FILE="/tmp/.gitops-router-${PERSON}.log" +# ───────────────────────────────────────────── +# ANSI color codes +readonly C_RESET='\033[0m' +readonly C_INFO='\033[1;34m' # bold blue +readonly C_WARN='\033[1;33m' # bold yellow +readonly C_ERROR='\033[1;31m' # bold red + +# ───────────────────────────────────────────── +# log with emojis log() { - local level="${1^^}" # convert to uppercase + local lvl="${1^^}" shift - echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $*" | tee -a "$LOG_FILE" + local icon color + + case "$lvl" in + INFO) icon="ℹ️" color="$C_INFO" ;; + WARN) icon="⚠️" color="$C_WARN" ;; + ERROR) icon="❌" color="$C_ERROR" ;; + *) icon="🔹" color="$C_RESET" ;; + esac + + local ts + ts="$(date '+%Y-%m-%d %H:%M:%S')" + printf '%b%s [%s] [%s] %s%b\n' \ + "$color" "$icon" "$ts" "$lvl" "$*" "$C_RESET" | + tee -a "$LOG_FILE" } -log info "Received SSH_ORIGINAL_COMMAND: $SSH_ORIGINAL_COMMAND" +# ───────────────────────────────────────────── +# Build the raw URL for fetching files +geturl() { + local type="$1" file="$2" + printf '%s://%s/%s/%s/branch/%s/%s\n' \ + "$PROTOCOL" "$HOST" "$REPO" "$type" "$BRANCH" "$file" +} -# Ensure the variable is set +# ───────────────────────────────────────────── +# Run a local script +run() { + local script="$1" + "$HOME/.local/bin/$script" +} + +# ───────────────────────────────────────────── +# Download & install an artifact +# update [] +update() { + local file="$1" dir="$2" mode="$3" type="${4:-raw}" + local url out + + out="$HOME/$dir/$(basename "$file")" + url="$(geturl "$type" "$file")" + + [[ -f "$out" ]] && chmod 700 "$out" + + if curl -fsSL "$url" -o "$out"; then + log info "Downloaded $url → $out" + chmod "$mode" "$out" + else + log error "Failed to download $url" + return 1 + fi +} + +# ───────────────────────────────────────────── +# Clean up dangling podman images +clean_images() { + local dangling + dangling="$(podman images -f dangling=true -q)" + if [[ -z "$dangling" ]]; then + log info "No dangling images to remove." + else + log warn "Removing dangling images..." + echo "$dangling" | xargs podman rmi + log info "Dangling images removed." + fi +} + +# ───────────────────────────────────────────── +# Entry & command parsing if [[ -z "${SSH_ORIGINAL_COMMAND:-}" ]]; then log error "No SSH_ORIGINAL_COMMAND provided." exit 1 fi -geturl() { - echo "$PROTOCOL://$HOST/$REPO/$1/branch/$BRANCH/$2" -} +log info "SSH_ORIGINAL_COMMAND: $SSH_ORIGINAL_COMMAND" +read -r cmd arg <<<"$SSH_ORIGINAL_COMMAND" -function run() { - "$HOME"/.local/bin/"$1" -} - -function update() { - type=${4:-raw} - fname=$(basename "$1") - output_path="$HOME/$2/$fname" - url=$(geturl "$type" "$1") - - [ -f "$output_path" ] && chmod 700 "$output_path" - curl -fsSL "$url" -o "$output_path" && log info "Downloaded $url to $output_path" - chmod "$3" "$output_path" -} - -clean_images() { - # Get list of image IDs with tag (dangling images) - dangling_images=$(podman images -f "dangling=true" -q) - - if [ -z "$dangling_images" ]; then - echo "✅ No dangling images to remove." - else - echo "⚠️ Removing dangling images..." - echo "$dangling_images" | xargs podman rmi - echo "🧹 Done!" - fi -} - -# Strip arguments and parse command -read -r command args <<<"$SSH_ORIGINAL_COMMAND" - -# Define command routing -case "$command" in +# ───────────────────────────────────────────── +# Dispatch +case "$cmd" in build) - case "$args" in - base) - run build-base.sh - ;; - workspace) - run build-workspace.sh - ;; - *) - log error "Invalid arguments for build command: $args" - ;; + case "$arg" in + base) run build-base.sh ;; + workspace) run build-workspace.sh ;; + *) log error "build: invalid arg '$arg'" ;; esac ;; update) - case "$args" in - workspace) - update build-workspace.sh .local/bin 500 - ;; - base) - update build-base.sh .local/bin 500 - ;; - access) - update access.yml . 400 - ;; - ssh_router) - update ssh_router.sh .local/bin 500 - ;; - gitops_router) - update gitops_router.sh .local/bin 500 - ;; - home_tar) - update home.tar.gz . 500 media - ;; - gitconfig) - update gitconfig.template . 500 - ;; - *) - log error "Invalid arguments for update command: $args" - ;; + case "$arg" in + base) update build-base.sh .local/bin 500 ;; + workspace) update build-workspace.sh .local/bin 500 ;; + access) update access.yml . 400 ;; + ssh_router) update ssh_router.sh .local/bin 500 ;; + gitops_router) update gitops_router.sh .local/bin 500 ;; + home_tar) update home.tar.gz . 500 media ;; + gitconfig) update gitconfig.template . 500 ;; + *) log error "update: invalid arg '$arg'" ;; esac ;; -clean) - clean_images - ;; -status) - podman images - ;; -remove) - podman rm "$args" - ;; +clean) clean_images ;; +status) podman images ;; +remove) podman rm "$arg" ;; *) - log error "Unknown command: $command" + log error "Unknown command: '$cmd'" exit 127 ;; esac