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.
- 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)
- 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)
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.
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.
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.
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.
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.
**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.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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).
Tests lokal: 41/41 grün; bash -n über alle ct/install/lib/tests-Scripts sauber.
- 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)Scope-Erweiterung @
7f64b12(drei Commits):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-scopednexus-Runner — löst den dokumentierten CI-Blocker. README-Verweis aktualisiert.aa3ad2f):prompt_lxc_configfragtSSH-Root-Login erlauben? [Y/n](Default Y, env-präsetzbar viaSSH_ROOT_LOGIN, validiert über neuenis_yesno-Validator, normalisiert aufyes|no).bootstrap_install_scriptreicht 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 nachsetup_base_apt.7f64b12):setup_base_aptexportiertC.UTF-8für den Install-Lauf (glibc-built-in, greift schon beim ersten apt-Lauf), installiertlocales, generierten_US.UTF-8und setzt es perupdate-localeals 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.