Skip to content

fix+docs: freshclam daemon weg, rkhunter-init hardened, install-strategie + post-v1.0.0 merge-fixes#4

Merged
MWest2020 merged 4 commits into
mainfrom
fix/freshclam-daemon-redundancy
May 26, 2026
Merged

fix+docs: freshclam daemon weg, rkhunter-init hardened, install-strategie + post-v1.0.0 merge-fixes#4
MWest2020 merged 4 commits into
mainfrom
fix/freshclam-daemon-redundancy

Conversation

@MWest2020
Copy link
Copy Markdown
Owner

Summary

  • Bug 1: clamav-freshclam.service was self-inflicted-killed by av-update.timerupdate.shfreshclam_safe (stops daemon, runs freshclam oneshot, never restarts). Result: check.sh flagged ✗ on every run since 2026-05-19, despite signatures staying fresh. Root cause: two redundant signature-update mechanisms racing on the freshclam log-lock.
  • Bug 2: check.sh flagged every inactive candidate in WS_CLAMAV_DAEMON_CANDIDATES although lib.sh comment claimed "eerste actieve wint". Also: clamav-freshclam was in the candidates list at all, but it's not a scan-daemon — it's the signature-updater we no longer use.
  • Fix: one mechanism. New disable_freshclam_daemon helper; alma/arch/ubuntu installers call it and drop clamav-freshclam from enable_clamav_services. clamav-scan.service no longer has After=clamav-freshclam.service. check.sh rewritten with early-break first-active-wins logic; max 1 error from scan-daemon section. freshclam_safe retained as defensive safety net for migrated installs.

Test plan

  • bash check.sh on Alma: exit 0, "Alles in orde" (was: exit 1, ✗ clamav-freshclam inactive)
  • shellcheck clean on all modified files
  • shfmt --check no diff
  • common/check-shell-headers.sh --all ✓ alle files conform
  • pre-commit gate (shellcheck + shfmt + gitleaks + jscpd + header-check) passed
  • Re-verify on Arch after pulling the branch
  • Re-verify on Ubuntu after pulling the branch
  • One-time migration on existing installs (documented in CHANGELOG.md):
    sudo systemctl daemon-reload && sudo systemctl disable --now clamav-freshclam.service

Audit 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

MWest2020 and others added 3 commits May 24, 2026 20:58
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>
@MWest2020 MWest2020 changed the title fix: eliminate clamav-freshclam daemon redundancy + symmetric check.sh fix+docs: freshclam daemon redundancy weg, rkhunter-init hardened, install-strategie gedocumenteerd May 26, 2026
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>
@MWest2020 MWest2020 changed the title fix+docs: freshclam daemon redundancy weg, rkhunter-init hardened, install-strategie gedocumenteerd fix+docs: freshclam daemon weg, rkhunter-init hardened, install-strategie + post-v1.0.0 merge-fixes May 26, 2026
@MWest2020 MWest2020 merged commit c92c87f into main May 26, 2026
5 of 9 checks passed
@MWest2020 MWest2020 deleted the fix/freshclam-daemon-redundancy branch May 26, 2026 12:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant