workspaces/gitops_router.sh

129 lines
3.8 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
set -euo pipefail
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 <level> <message...> with emojis
log() {
local lvl="${1^^}"
shift
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"
}
# ─────────────────────────────────────────────
# 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"
}
# ─────────────────────────────────────────────
# Run a local script
run() {
local script="$1"
"$HOME/.local/bin/$script"
}
# ─────────────────────────────────────────────
# Download & install an artifact
# update <file> <target-dir> <mode> [<type>]
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
log info "SSH_ORIGINAL_COMMAND: $SSH_ORIGINAL_COMMAND"
read -r cmd arg <<<"$SSH_ORIGINAL_COMMAND"
# ─────────────────────────────────────────────
# Dispatch
case "$cmd" in
build)
case "$arg" in
base) run build-base.sh ;;
workspace) run build-workspace.sh ;;
*) log error "build: invalid arg '$arg'" ;;
esac
;;
update)
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 "$arg" ;;
*)
log error "Unknown command: '$cmd'"
exit 127
;;
esac