fix+docs: freshclam daemon weg, rkhunter-init hardened, install-strategie + post-v1.0.0 merge-fixes#4
Merged
Conversation
The check.sh ✗ on clamav-freshclam.service was self-inflicted: av-update.timer (04:00) runs update.sh which calls freshclam_safe, which `systemctl stop`s the daemon but never restarts it. Two mechanisms for one job (long-running daemon + oneshot-via-timer) race on the freshclam log-lock; the timer wins, daemon stays dead. Signatures stayed fresh via the timer itself, so functionally fine, but check.sh flagged it on every run and left "enabled but dead" runtime state. Fix: one mechanism. New disable_freshclam_daemon helper in install-base.sh; alma/arch/ubuntu installers call it and drop clamav-freshclam from enable_clamav_services. clamav-scan.service drops the After= dependency on the disabled unit. freshclam_safe stays as defensive safety net for migrated installs / post-pkg-update scenarios where dnf-preset re-enables the daemon. Also fixes check.sh asymmetry: lib.sh comment claimed "eerste actieve wint" but the loop flagged every inactive candidate. Removed clamav-freshclam from WS_CLAMAV_DAEMON_CANDIDATES (it's not a scan-daemon) and rewrote the loop with early-break — max 1 error from this section, behaviour now matches the comment. Migration step for existing installs (one-time, documented in CHANGELOG): sudo systemctl daemon-reload sudo systemctl disable --now clamav-freshclam.service Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Twee inhoudelijke correcties op de claims in de vorige commit, plus een kleine UX-fix die voortkwam uit een sudo-run waar `1 probleem gevonden` niet aangaf welk probleem. Inhoudelijke correcties (dingen die ik in de vorige commit te grof formuleerde): - alma/install.sh — "clamav-freshclam.service is dnf-default enabled" is feitelijk onjuist. UnitFilePreset is `disabled` (geverifieerd via systemctl show); hij stond aan doordat onze eigen installer hem enable'de. Comment herschreven om dat correct te beschrijven en expliciet te zeggen dat deze disable-call vooral voor migratie is. - common/install-base.sh — "OS-default clamav-freshclam.service" was te generiek; alleen Ubuntu/Debian zet hem via debhelper-systemd consistent aan. Comment bij disable_freshclam_daemon kreeg een "Re-enable risico per distro"-blok (Alma: nee/preset disabled; Arch: nee/geen preset; Ubuntu: ja/apt --reinstall). Comment bij freshclam_safe analoog bijgesteld. - CHANGELOG.md — "post-pakket-update scenario's waar de daemon alsnog door dnf/apt-preset wordt aangezet" overgeneralizeerde; gecorrigeerd naar specifiek Ubuntu/Debian-debhelper-systemd-pad. Migratie-blok kreeg een korte distro-noot. UX-fix in check.sh: - record_fail / record_warn helpers vervangen de drie-regelige inline pattern (ws_fail "..." + ((errors++)) || true). Failures worden ook in een `failures[]` array gecollect zodat de samenvatting onderaan ze opsomt — geen scrollen meer om "$errors probleem/problemen gevonden" te duiden. Belangrijk voor cron-mail en audit-trail. - rkhunter "niet gevonden"-message kreeg een actie-hint (`sudo rkhunter --propupd`). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ss distros Aanleiding: tijdens een `sudo bash check.sh`-run kwam aan het licht dat rkhunter wél geïnstalleerd was op deze Alma 10.1 (rkhunter-1.4.6-31.el10_2) maar dat de property-database `/var/lib/rkhunter/db/rkhunter.dat` ontbrak. Aanname "we skippen rkhunter op Alma 10" klopte niet — een halve install met onduidelijk eindplaatje is een audit-irritant. Twee dingen tegelijk: robuuster maken van het rkhunter-pad én de install-strategie expliciet documenteren. Robuuster: - common/install-base.sh::rkhunter_init wrapt nu zelf set +e/-e rond `rkhunter --update` en `rkhunter --propupd`, met aparte return-codes per call en een ws_warn + return 1 bij niet-nul. Reden: rkhunter 1.4.x leunt intern op deprecated egrep en kan --update met non-zero exit eindigen zonder dat er functioneel iets fout is. Onder `set -euo pipefail` aborteerde dat de daaropvolgende --propupd → rkhunter binary geïnstalleerd zonder .dat property-database → check.sh faalt permanent op "rkhunter database niet gevonden". Wrapper was tot nu toe alleen in arch/install.sh aanwezig met motivering "Arch-quirk", maar het is rkhunter-quirk, dus hoort in de helper. - alma/install.sh, arch/install.sh, ubuntu/install.sh: `2>/dev/null` weg van de pakket-install (EPEL/mirror/key-failures willen we zien, niet silent-skippen) en eigen set +e-wrapper rond rkhunter_init weg (Arch). Bij rkhunter_init-non-zero: installer print retry-hint (`sudo rkhunter --propupd`) zodat de gebruiker met één commando de partial state repareert. Documentatie: - docs/strategy.md (nieuw) — best-effort filosofie, per-component-status (required/optional), failure-modes, per-OS×runtime-verwachtingsmatrix, hoe check.sh-output te interpreteren bij partial install, en wat de strategie expliciet NIET probeert (geen vendoring, geen retry-loops, geen rollback). - docs/README.md — strategy.md aan de index toegevoegd. - README.md — zin over docs uitgebreid met strategy.md. - CHANGELOG.md — entry voor 2026-05-26 incl. migratie-stap voor de bestaande Alma-install (`sudo rkhunter --propupd`). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Resolves 7 content-conflicts (CHANGELOG, README, docs/README, install-base, alma/arch/ubuntu install). Main bracht sinds 2026-05-21 een v1.0.0 release met --dry-run/--version flags, ws_run_or_print helper, Python-support in install-pm-cooldown.sh en CI workflows. Branch bracht freshclam-daemon- redundancy weg + check.sh first-active-wins + record_fail-summary + rkhunter- init hardening + docs/strategy.md. Resolution per file: - README.md / docs/README.md — main's nieuwe intro & supply-chain-cooldown- doc-link behouden; strategy.md ernaast in beide docs-tabellen. - CHANGELOG.md — drie post-v1.0.0 dated subsecties onder één "Unreleased"- header (chronologisch newest-first): 2026-05-26 rkhunter-init, 2026-05-24 freshclam + check.sh, Python support, en de merge-fix. - common/install-base.sh::rkhunter_init — gecombineerd: dry-run-pad gebruikt ws_run_or_print (main's helper); real-run-pad gebruikt mijn defensive set +e/-e met aparte return-codes per call + ws_warn bij niet-nul. - alma/arch/ubuntu/install.sh — combine main's dry-run-tak met mijn retry-hint-tak op rkhunter_init non-zero exit. `2>/dev/null` weg op real-run-pad (apt/dnf/pacman-failure-reasons moet je zien). Bonus consolidatie als merge-fix: - common/install-base.sh — nieuwe ws_parse_install_args helper. Pre-v1.0.0 was de 17-regelige arg-parse-block (--dry-run / --version / unknown-flag / require_root) identiek in alma/, arch/ en ubuntu/install.sh. jscpd flagde dat op --threshold 0. De helper consolideert die block; OS-installers vervangen 'm met één regel: ws_parse_install_args "<script-hint>" "$@". - .jscpd.json (nieuw) — ignore-config voor report/ (jscpd's eigen HTML- output is zelf-referentieel) + openspec/changes/archive/ (bewuste historische duplicates van current specs). Zonder deze config faalde jscpd ook al op main alone met 13.44% duplication. - common/install-pm-cooldown.sh — shfmt-drift fix op 2 inline-comments (pre-existing op main, niet door deze branch geïntroduceerd, maar de pre-commit gate moet groen). Verificatie: - check.sh: groen, exit 0 - pre-commit run --all-files: alle hooks pass (shellcheck, shfmt, gitleaks, jscpd, shell-headers) - alma/install.sh --dry-run: print zou-uitgevoerd-zijn commando's - alma/install.sh --version: workstation-security 1.0.0 - alma/install.sh --bogus: exit 2 met heldere onbekend-flag-melding Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
clamav-freshclam.servicewas self-inflicted-killed byav-update.timer→update.sh→freshclam_safe(stops daemon, runs freshclam oneshot, never restarts). Result:check.shflagged ✗ on every run since 2026-05-19, despite signatures staying fresh. Root cause: two redundant signature-update mechanisms racing on the freshclam log-lock.check.shflagged every inactive candidate inWS_CLAMAV_DAEMON_CANDIDATESalthoughlib.shcomment claimed "eerste actieve wint". Also:clamav-freshclamwas in the candidates list at all, but it's not a scan-daemon — it's the signature-updater we no longer use.disable_freshclam_daemonhelper; alma/arch/ubuntu installers call it and dropclamav-freshclamfromenable_clamav_services.clamav-scan.serviceno longer hasAfter=clamav-freshclam.service.check.shrewritten with early-break first-active-wins logic; max 1 error from scan-daemon section.freshclam_saferetained as defensive safety net for migrated installs.Test plan
bash check.shon Alma: exit 0, "Alles in orde" (was: exit 1, ✗ clamav-freshclam inactive)shellcheckclean on all modified filesshfmt --checkno diffcommon/check-shell-headers.sh --all✓ alle files conformsudo systemctl daemon-reload && sudo systemctl disable --now clamav-freshclam.serviceAudit relevance
The flagged ✗ was cosmetic — signatures stayed 0 days old via
av-update.timer— but a check.sh that cries wolf is itself an audit smell (alarm-fatigue, like the rkhunter-on-WSL false-positives we already removed). This restores symmetry between what the check claims to verify and what the design actually relies on.🤖 Generated with Claude Code