prole/etc/prole_cfg.sh

134 lines
3.8 KiB
Bash

#!/usr/bin/env bash
# Standard include for Prole etc scripts.
# - Loads environment from env.sh (if available)
# - Loads values from PROLE_CONF/prole.cfg (INI-style)
# - Does not override already-set env vars
if [[ "${_PROLE_CFG_LOADED:-}" == "1" ]]; then
return 0 2>/dev/null || true
fi
_PROLE_CFG_LOADED=1
_prole_cfg_script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
_prole_cfg_home_guess=$(cd "$_prole_cfg_script_dir/.." && pwd)
# 1. Try to load env.sh to establish base PROLE_HOME/PROLE_CONF
if [[ -n "${PROLE_HOME:-}" && -f "$PROLE_HOME/env.sh" ]]; then
# shellcheck disable=SC1090
source "$PROLE_HOME/env.sh"
elif [[ -f "$HOME/.prole/env.sh" ]]; then
# shellcheck disable=SC1090
source "$HOME/.prole/env.sh"
elif [[ -f "$_prole_cfg_home_guess/env.sh" ]]; then
# shellcheck disable=SC1090
source "$_prole_cfg_home_guess/env.sh"
fi
_prole_trim() {
local s="$1"
s="${s#"${s%%[![:space:]]*}"}"
s="${s%"${s##*[![:space:]]}"}"
printf '%s' "$s"
}
_PROLE_CFG_SET_VARS="|"
_prole_cfg_set_default() {
local key="$1" value="$2" token="|$key|"
# Only set if currently empty OR if we were the ones who set it from config previously
if [[ -z "${!key:-}" || "$_PROLE_CFG_SET_VARS" == *"$token"* ]]; then
printf -v "$key" '%s' "$value"
export "$key"
if [[ "$_PROLE_CFG_SET_VARS" != *"$token"* ]]; then
_PROLE_CFG_SET_VARS="${_PROLE_CFG_SET_VARS}${key}|"
fi
fi
}
_prole_read_cfg() {
local cfg="$1" line key value
while IFS= read -r line || [[ -n "$line" ]]; do
line="$(_prole_trim "$line")"
[[ -z "$line" ]] && continue
case "$line" in
\#*|\;*|\[*\])
continue
;;
esac
if [[ "$line" == *"="* ]]; then
key="$(_prole_trim "${line%%=*}")"
value="$(_prole_trim "${line#*=}")"
[[ -z "$key" ]] && continue
# Replace dots with underscores for shell compatibility
key="${key//./_}"
_prole_cfg_set_default "$key" "$value"
fi
done <"$cfg"
}
_prole_cfg_extract_key() {
local cfg="$1" key="$2"
local value
value=$(awk -F= -v k="$key" '
/^[[:space:]]*;/ {next}
/^[[:space:]]*#/ {next}
/^[[:space:]]*\\[/ {next}
$1 ~ "^[[:space:]]*" k "[[:space:]]*$" {
v=$2
sub(/^[[:space:]]+/, "", v)
sub(/[[:space:]]+$/, "", v)
val=v
}
END { print val }
' "$cfg" 2>/dev/null || true)
printf '%s' "$value"
}
_prole_cfg_file=""
if [[ -n "${PROLE_CONF:-}" && -f "$PROLE_CONF/prole.cfg" ]]; then
_prole_cfg_file="$PROLE_CONF/prole.cfg"
elif [[ -n "${PROLE_HOME:-}" && -f "$PROLE_HOME/conf/prole.cfg" ]]; then
_prole_cfg_file="$PROLE_HOME/conf/prole.cfg"
elif [[ -f "$_prole_cfg_home_guess/conf/prole.cfg" ]]; then
_prole_cfg_file="$_prole_cfg_home_guess/conf/prole.cfg"
fi
if [[ -n "$_prole_cfg_file" ]]; then
if [[ -z "${PROLE_CONF:-}" ]]; then
PROLE_CONF=$(cd "$(dirname "$_prole_cfg_file")" && pwd)
export PROLE_CONF
fi
_prole_read_cfg "$_prole_cfg_file"
# Prefer namespace from config unless explicitly overridden by env.
if [[ "${PROLE_NAMESPACE_PREFER_ENV:-0}" != "1" ]]; then
_cfg_ns=$(_prole_cfg_extract_key "$_prole_cfg_file" "NAMESPACE")
if [[ -n "$_cfg_ns" ]]; then
export NAMESPACE="$_cfg_ns"
fi
unset _cfg_ns
fi
fi
if [[ -z "${PROLE_HOME:-}" && -d "$_prole_cfg_home_guess" ]]; then
PROLE_HOME="$_prole_cfg_home_guess"
export PROLE_HOME
fi
# Final check for critical variables
if [[ -z "${PROLE_SERVICE:-}" && -n "${PROLE_HOME:-}" ]]; then
export PROLE_SERVICE="$PROLE_HOME/etc"
fi
# Ensure NAMESPACE is set, defaulting to 'default' if not in config/env
if [[ -z "${NAMESPACE:-}" ]]; then
# Try to detect from current context if not set anywhere
NAMESPACE=$(kubectl config view --minify --output 'jsonpath={..namespace}' 2>/dev/null)
fi
export NAMESPACE=${NAMESPACE:-default}
unset _prole_cfg_script_dir
unset _prole_cfg_home_guess
unset _prole_cfg_file
unset _PROLE_CFG_SET_VARS