0b7fdb4954
Add bin/pos-config + lib/config-ui.sh: reads the '# POS_CONFIG:' headers across tools into a unified runtime config (~/.config/linux_post_install/ <scope>.env, chmod 600). Secret masking with show/hide, digits:/num:/url: validation, '-' clears, blank keeps; '*plugins' expands entertainment plugin vars from entertainment-lib.sh. pos config with no scope opens a picker (scope list when not a TTY); completion offers scopes from the registry at runtime. gen-docs.sh now handles category-less tools (pos-config) instead of emitting pos-config-config; fix set -e/pipefail abort that truncated the header registry mid-read. install.sh ships config-ui.sh.
81 lines
2.5 KiB
Bash
Executable File
81 lines
2.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
# POS: config — Interactive editor for the tools' runtime config (reads # POS_CONFIG: registry)
|
|
|
|
source "$(dirname "$0")/../lib/common.sh" 2>/dev/null || source "$(dirname "$0")/common.sh"
|
|
source "$(dirname "$0")/../lib/config-ui.sh" 2>/dev/null || source "$(dirname "$0")/config-ui.sh"
|
|
|
|
usage() {
|
|
cat <<EOF
|
|
Usage: pos config [<scope>]
|
|
|
|
Interactive editor for the tools' runtime config. Every tool exposes its
|
|
configuration by declaring a "# POS_CONFIG:" header; pos config reads those
|
|
at runtime — the UI knows nothing about the variables themselves.
|
|
|
|
pos config Scope picker (on a TTY), otherwise the scope list
|
|
pos config <scope> Edit that scope's variables
|
|
pos config --help This help
|
|
|
|
Scopes:
|
|
$(cfg_scopes | sed 's/^/ /')
|
|
|
|
How a tool registers a scope (one "# POS_CONFIG:" header per scope):
|
|
|
|
# POS_CONFIG: <scope> | <env-file> | <KEY>=<flags>:<description> | ... | *plugins
|
|
|
|
<env-file> config file under ~/.config/linux_post_install/ (chmod 600)
|
|
<flags> secret (masked display + hidden input) | digits | num | float
|
|
*plugins also list the keys declared by installed plugins' # POS_KEYS:
|
|
headers (the entertainment scope's keys are dynamic)
|
|
|
|
Editing rules: Enter keeps the current value, "-" clears it, q quits.
|
|
Values can also be set non-interactively with each tool's 'config set KEY=VALUE'.
|
|
EOF
|
|
exit 0
|
|
}
|
|
|
|
case "${1:-}" in
|
|
-h|--help) usage ;;
|
|
esac
|
|
|
|
pick_scope() {
|
|
local scopes=() s i env
|
|
while IFS= read -r s; do
|
|
if [ -n "$s" ]; then
|
|
scopes+=("$s")
|
|
fi
|
|
done < <(cfg_scopes)
|
|
if [ ${#scopes[@]} -eq 0 ]; then
|
|
err "no config scopes found — no tool declares a '# POS_CONFIG:' header"
|
|
fi
|
|
echo
|
|
echo "pos config — pick a scope"
|
|
echo "--------------------------"
|
|
for ((i = 1; i <= ${#scopes[@]}; i++)); do
|
|
env="$(cfg_scope_envfile "${scopes[$((i - 1))]}" || true)"
|
|
printf ' %2d) %-16s %s\n' "$i" "${scopes[$((i - 1))]}" "${env:-}"
|
|
done
|
|
echo
|
|
local idx
|
|
read -rp "Scope number: " idx || { echo; exit 1; }
|
|
if ! [[ "$idx" =~ ^[0-9]+$ ]] || (( idx < 1 || idx > ${#scopes[@]} )); then
|
|
err "invalid number '$idx'"
|
|
fi
|
|
cfg_ui "${scopes[$((idx - 1))]}"
|
|
}
|
|
|
|
if [ $# -eq 0 ]; then
|
|
if [ -t 0 ]; then
|
|
pick_scope
|
|
else
|
|
usage
|
|
fi
|
|
else
|
|
scope="${1:-}"
|
|
case " $(cfg_scopes | tr '\n' ' ') " in
|
|
*" $scope "*) cfg_ui "$scope" ;;
|
|
*) err "unknown config scope '$scope' (try: $(cfg_scopes | tr '\n' ' '))" ;;
|
|
esac
|
|
fi
|