Add platform docs; reposition as host security platform

Add docs/ (SPECIFICATION, ROADMAP, OPERATIONS, COMMAND_REFERENCE,
THREAT_MODEL) describing the current v0.7 agent and the phased path from
local HIDS to a host security platform. Reframe README, package metadata,
and CLI/module descriptions from "intrusion-detection daemon" to "Linux
host security platform", and surface the v0.7 signed-package verify
(pkgdb_pkgverify*) and anti-rootkit (rootcheck_*) knobs in the sample
config. Also wrap the pacman.conf read in pkgdb.siglevel_alert in a
context manager to avoid a leaked file handle.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Luna 2026-06-10 04:03:06 -07:00
parent 1de5e86fed
commit 6ff2087329
11 changed files with 930 additions and 26 deletions

View file

@ -1,9 +1,9 @@
# SPDX-License-Identifier: GPL-3.0-or-later
"""Enodia Sentinel — a host intrusion-detection daemon.
"""Enodia Sentinel — a Linux host security platform.
A poll-based HIDS that runs a set of detectors over live system state and
captures a forensic snapshot with incident-response guidance whenever a known
attack signature appears. The Python re-architecture of the bash v0 prototype.
Detection, file/package integrity, anti-rootkit checks, tamper-evidence,
forensic snapshots, and operator workflows. The Python re-architecture of the
bash v0 prototype.
"""
__version__ = "0.7.0"

View file

@ -51,7 +51,7 @@ def _cmd_check(cfg: Config) -> int:
def main(argv: list[str] | None = None) -> int:
parser = argparse.ArgumentParser(
prog="enodia-sentinel",
description="Host intrusion-detection daemon.",
description="Linux host security platform.",
)
parser.add_argument("--version", action="version",
version=f"enodia-sentinel {__version__}")

View file

@ -169,7 +169,8 @@ def siglevel_insecure(value: str) -> bool:
def siglevel_alert(conf_path: str = PACMAN_CONF) -> Alert | None:
try:
text = open(conf_path, encoding="utf-8", errors="replace").read()
with open(conf_path, encoding="utf-8", errors="replace") as fh:
text = fh.read()
except OSError:
return None
value = parse_global_siglevel(text)