#!/usr/bin/env bash set -euo pipefail ADMIN_KUBECONFIG="${KUBECONFIG:-${KUBECONFIG_PATH:-${HOME}/.kube/config}}" READONLY_NAMESPACE="${READONLY_NAMESPACE:-homelab-access}" READONLY_SERVICE_ACCOUNT="${READONLY_SERVICE_ACCOUNT:-homelab-readonly}" READONLY_KUBECONFIG="${READONLY_KUBECONFIG:-${HOME}/.kube/homelab-readonly.conf}" READONLY_TOKEN_DURATION="${READONLY_TOKEN_DURATION:-24h}" usage() { cat <<'EOF' Usage: scripts/kubeconfig-readonly Generate a separate read-only kubeconfig from the repo-managed homelab-access/homelab-readonly ServiceAccount. EOF } require_kubectl() { if ! command -v kubectl >/dev/null 2>&1; then echo "kubectl is required." >&2 exit 1 fi if [[ ! -s "${ADMIN_KUBECONFIG}" ]]; then echo "admin kubeconfig missing: ${ADMIN_KUBECONFIG}" >&2 exit 1 fi } main() { local server local cluster_name local ca_data local token local user_name="homelab-readonly" local context_name="homelab-readonly" case "${1:-}" in -h | --help | help) usage return 0 ;; esac require_kubectl kubectl --kubeconfig "${ADMIN_KUBECONFIG}" -n "${READONLY_NAMESPACE}" get serviceaccount "${READONLY_SERVICE_ACCOUNT}" >/dev/null token="$(kubectl --kubeconfig "${ADMIN_KUBECONFIG}" -n "${READONLY_NAMESPACE}" create token "${READONLY_SERVICE_ACCOUNT}" --duration="${READONLY_TOKEN_DURATION}")" server="$(kubectl --kubeconfig "${ADMIN_KUBECONFIG}" config view --minify -o jsonpath='{.clusters[0].cluster.server}')" cluster_name="$(kubectl --kubeconfig "${ADMIN_KUBECONFIG}" config view --minify -o jsonpath='{.clusters[0].name}')" ca_data="$(kubectl --kubeconfig "${ADMIN_KUBECONFIG}" config view --raw --minify -o jsonpath='{.clusters[0].cluster.certificate-authority-data}')" mkdir -p "$(dirname "${READONLY_KUBECONFIG}")" umask 077 cat >"${READONLY_KUBECONFIG}" <