K-114: Input-Validierung in build.func + Mini-CI #5

Merged
l.kirchner merged 5 commits from k114/input-validierung-mini-ci into main 2026-06-12 16:40:38 +02:00
Owner

Cross-Repo-Karte K-114 aus nexus-hub (führend: Claude Code; Codex-Review: 7 Findings — 6 gefixt, 1 als Repo-Vertrag dokumentiert; Triage in der Karte).

  • Input-Validierung in prompt_lxc_config: alle numerischen Prompts (CTID/Disk/Cores/RAM, VLAN 1–4094), Hostname/Token, IP/CIDR/Gateway, DNS-Liste; Re-Prompt bei ungültiger Eingabe — eingebettete Steuer-/Non-UTF-8-Bytes werden NICHT still gestrippt, sondern sichtbar abgelehnt (Repro des VLAN-Vorfalls 2026-06-11 als Testfall). env-Werte werden ebenfalls validiert (Abbruch statt Loop).
  • Robustheit aus dem Review: EOF-Handling (kein Endlos-Loop), 10#-Arithmetik (keine Oktal-Fallen bei führenden Nullen), Newline-Erkennung trotz $()-Stripping, Nameref-Guards, BASH_REMATCH-Clobbering-Regression.
  • Mini-CI (erste CI dieses Repos, Runner-Label nexus): bash -n über alle Scripts, build.func-Source-Pflicht (tests/check_ct_source.sh — Negativ-Beweis via präpariertem Fixture in der Testsuite), 41 Validierungs-Unit-Tests, shellcheck falls vorhanden (sonst dokumentiert übersprungen).
  • README: Beiträge nur als PR mit Cross-Review (verbindlich).

Tests lokal: 41/41 grün; bash -n über alle ct/install/lib/tests-Scripts sauber.

Cross-Repo-Karte K-114 aus nexus-hub (führend: Claude Code; Codex-Review: 7 Findings — 6 gefixt, 1 als Repo-Vertrag dokumentiert; Triage in der Karte). - **Input-Validierung** in prompt_lxc_config: alle numerischen Prompts (CTID/Disk/Cores/RAM, VLAN 1–4094), Hostname/Token, IP/CIDR/Gateway, DNS-Liste; Re-Prompt bei ungültiger Eingabe — eingebettete Steuer-/Non-UTF-8-Bytes werden NICHT still gestrippt, sondern sichtbar abgelehnt (Repro des VLAN-Vorfalls 2026-06-11 als Testfall). env-Werte werden ebenfalls validiert (Abbruch statt Loop). - **Robustheit aus dem Review:** EOF-Handling (kein Endlos-Loop), 10#-Arithmetik (keine Oktal-Fallen bei führenden Nullen), Newline-Erkennung trotz $()-Stripping, Nameref-Guards, BASH_REMATCH-Clobbering-Regression. - **Mini-CI** (erste CI dieses Repos, Runner-Label nexus): bash -n über alle Scripts, build.func-Source-Pflicht (tests/check_ct_source.sh — Negativ-Beweis via präpariertem Fixture in der Testsuite), 41 Validierungs-Unit-Tests, shellcheck falls vorhanden (sonst dokumentiert übersprungen). - **README:** Beiträge nur als PR mit Cross-Review (verbindlich). Tests lokal: 41/41 grün; bash -n über alle ct/install/lib/tests-Scripts sauber.
l.kirchner added 2 commits 2026-06-12 03:20:49 +02:00
- validation helpers: sanitize_input trims CR/edge whitespace only;
  embedded control/non-ASCII bytes FAIL validation and re-prompt with a
  hint (2026-06-11 incident: invisible byte in a pasted VLAN tag broke
  pct create mid-run) - never silently stripped
- prompt_lxc_config: every prompt validated (uint for CTID/disk/cores/
  RAM, VLAN 1-4094, hostname/token formats, IP/CIDR/gateway, DNS list);
  env-provided values are sanitized + validated too (abort, no re-prompt
  loop in non-interactive use); helpers reusable for app prompts
- tests/test_validation.sh: 34 cases incl. the 2<0x80>0 repro, re-prompt
  simulation, BASH_REMATCH clobbering regression (is_cidr), env dry-run
  of prompt_lxc_config without PVE/TTY
- tests/check_ct_source.sh: every ct/*.sh must source build.func (bug
  shipped twice); negative proof via prepared fixture in the test suite
- .gitea/workflows/ci.yml: bash -n over all scripts, source-check,
  validation tests, shellcheck if present (documented skip otherwise)
- README: contributions via PR with cross-review (binding)
K-114: address cross-review findings
CI / Shell-Lint (bash -n, source-check, Validierungs-Tests) (pull_request) Has been cancelled
490fda2ed1
- CTID prompt re-prompts on invalid interactive input (was: abort)
- env-provided NAMESERVER is validated when non-empty ('' stays inherit)
- prompt_validated handles EOF (no infinite loop, clean abort under -e)
- 10# base forcing in vlan/cidr/ipv4 arithmetic (leading zeros are not
  octal errors); is_clean_ascii rejects embedded newline/tab explicitly
  (command substitution strips trailing newlines); is_ipv4_list checks
  the whole string before word splitting
- nameref guard against reserved variable names in prompt_validated/
  require_valid; source-check pattern documented as the repo contract
- 8 new test cases (41 total)
l.kirchner added 3 commits 2026-06-12 14:42:15 +02:00
prompt_lxc_config asks 'SSH-Root-Login erlauben? [Y/n]' (env-presettable
via SSH_ROOT_LOGIN, validated, normalized to yes|no). The bootstrap passes
the value into the container; configure_ssh_root_login writes
/etc/ssh/sshd_config.d/zz-root-login.conf (yes -> PermitRootLogin yes,
no -> prohibit-password) and reloads sshd.
K-114: set up locales in setup_base_apt (C.UTF-8 during install, en_US.UTF-8 default)
CI / Shell-Lint (bash -n, source-check, Validierungs-Tests) (pull_request) Successful in 9s
7f64b12a77
LXC templates ship without a configured locale, so every apt/perl run
warned 'Setting locale failed'. setup_base_apt now exports C.UTF-8 for
the install run itself, installs the locales package, generates
en_US.UTF-8 and sets it as the system default via update-locale.
Author
Owner

Scope-Erweiterung @ 7f64b12 (drei Commits):

  1. runs-on: homelab (5f532fe): Mini-CI läuft jetzt auf dem instanzweiten Runner aus PR #6 (ct/runner.sh, ohne Deploy-Rechte) statt auf dem repo-scoped nexus-Runner — löst den dokumentierten CI-Blocker. README-Verweis aktualisiert.
  2. SSH-Root-Login-Prompt (aa3ad2f): prompt_lxc_config fragt SSH-Root-Login erlauben? [Y/n] (Default Y, env-präsetzbar via SSH_ROOT_LOGIN, validiert über neuen is_yesno-Validator, normalisiert auf yes|no). bootstrap_install_script reicht den Wert in den Container; configure_ssh_root_login (lib/install.func) schreibt das sshd-Drop-in /etc/ssh/sshd_config.d/zz-root-login.confyesPermitRootLogin yes, noprohibit-password (Debian-Default, nur Key) — und reloaded sshd. Aufruf in allen fünf Installern nach setup_base_apt.
  3. Locale-Fix (7f64b12): setup_base_apt exportiert C.UTF-8 für den Install-Lauf (glibc-built-in, greift schon beim ersten apt-Lauf), installiert locales, generiert en_US.UTF-8 und setzt es per update-locale als System-Default — keine perl-„Setting locale failed"-Warnungen mehr.

Tests: is_yesno/normalize_yesno-Units, Prompt-Default- und 'n'-Pfad, env-Smoke prüft die Normalisierung (Jyes). Suite: 50/50 grün, bash -n + source-check grün.

**Scope-Erweiterung @ 7f64b12** (drei Commits): 1. **`runs-on: homelab`** (`5f532fe`): Mini-CI läuft jetzt auf dem instanzweiten Runner aus PR #6 (`ct/runner.sh`, ohne Deploy-Rechte) statt auf dem repo-scoped `nexus`-Runner — löst den dokumentierten CI-Blocker. README-Verweis aktualisiert. 2. **SSH-Root-Login-Prompt** (`aa3ad2f`): `prompt_lxc_config` fragt `SSH-Root-Login erlauben? [Y/n]` (Default Y, env-präsetzbar via `SSH_ROOT_LOGIN`, validiert über neuen `is_yesno`-Validator, normalisiert auf `yes|no`). `bootstrap_install_script` reicht den Wert in den Container; `configure_ssh_root_login` (lib/install.func) schreibt das sshd-Drop-in `/etc/ssh/sshd_config.d/zz-root-login.conf` — `yes` → `PermitRootLogin yes`, `no` → `prohibit-password` (Debian-Default, nur Key) — und reloaded sshd. Aufruf in allen fünf Installern nach `setup_base_apt`. 3. **Locale-Fix** (`7f64b12`): `setup_base_apt` exportiert `C.UTF-8` für den Install-Lauf (glibc-built-in, greift schon beim ersten apt-Lauf), installiert `locales`, generiert `en_US.UTF-8` und setzt es per `update-locale` als System-Default — keine perl-„Setting locale failed"-Warnungen mehr. Tests: `is_yesno`/`normalize_yesno`-Units, Prompt-Default- und 'n'-Pfad, env-Smoke prüft die Normalisierung (`J` → `yes`). Suite: **50/50 grün**, `bash -n` + source-check grün.
l.kirchner merged commit a397ade6e1 into main 2026-06-12 16:40:38 +02:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: luki-net/proxmox-scripts#5