record Monitor-side installs and dedupe config by file

This commit is contained in:
MacRimi
2026-09-11 19:54:32 +02:00
parent e2dadebda1
commit bee242afa9
11 changed files with 73 additions and 9 deletions
+37
View File
@@ -148,6 +148,43 @@ def read_object(digest: str) -> Optional[str]:
return None
def record_install(packages: str, source: str = "monitor",
function: str = "monitor") -> bool:
"""Record a package the Monitor installed on the host, so it appears in the
installed-packages section like anything the scripts install. The Monitor
is Python and cannot use the bash primitives, so it drops a spool entry in
the same shape they write; ingest() picks it up and dedupes it by package.
"""
packages = (packages or "").strip()
if not packages:
return False
entry = {
"recorded_at": int(time.time()),
"class": CLASS_INSTALLATION,
"operation": "install_package",
"source": source,
"function": function,
"function_version": "1.0",
"target": packages,
"installed": packages,
"before": "",
"after": "",
"capture": "created",
"revert": "purge",
"exactness": "none",
"result": "ok",
}
try:
SPOOL.mkdir(parents=True, exist_ok=True)
path = SPOOL / f"{entry['recorded_at']}-{os.getpid()}-{os.urandom(4).hex()}.json"
tmp = path.with_suffix(".json.tmp")
tmp.write_text(json.dumps(entry), encoding="utf-8")
os.replace(tmp, path)
return True
except OSError:
return False
def ingest(limit: int = 5000) -> int:
"""Move what the scripts wrote into the table.
+19
View File
@@ -10268,6 +10268,17 @@ def _ensure_smart_tools(install_if_missing=False):
except Exception as e:
install_errors.append(f"nvme-cli: {str(e)}")
# A package installed on the host belongs in the change journal, whoever
# installed it — here the Monitor rather than a script.
_just = [pkg for pkg, ok in (('smartmontools', installed.get('smartctl')),
('nvme-cli', installed.get('nvme'))) if ok]
if _just:
try:
import changes_journal
changes_journal.record_install(' '.join(_just), 'monitor', 'install_smart_tools')
except Exception:
pass
return {
'smartctl': has_smartctl,
'nvme': has_nvme,
@@ -11594,6 +11605,14 @@ def api_smart_tools_install():
if not success:
all_success = False
_ok = [pkg for pkg, r in results.items() if r.get('success')]
if _ok:
try:
import changes_journal
changes_journal.record_install(' '.join(_ok), 'monitor', 'install_smart_tools')
except Exception:
pass
tools = _ensure_smart_tools()
return jsonify({