mirror of
https://github.com/bunny-lab-io/Borealis.git
synced 2025-10-27 02:01:57 -06:00
Restore agent detail ingestion and device description updates
This commit is contained in:
@@ -5,6 +5,7 @@ from __future__ import annotations
|
||||
import logging
|
||||
import sqlite3
|
||||
import time
|
||||
import uuid
|
||||
from contextlib import closing
|
||||
from typing import Any, Dict, List, Optional, Tuple
|
||||
|
||||
@@ -158,8 +159,12 @@ class SQLiteDeviceInventoryRepository:
|
||||
agent_id,
|
||||
ansible_ee_ver,
|
||||
connection_type,
|
||||
connection_endpoint
|
||||
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
|
||||
connection_endpoint,
|
||||
ssl_key_fingerprint,
|
||||
token_version,
|
||||
status,
|
||||
key_added_at
|
||||
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
|
||||
ON CONFLICT(hostname) DO UPDATE SET
|
||||
description=excluded.description,
|
||||
created_at=COALESCE({DEVICE_TABLE}.created_at, excluded.created_at),
|
||||
@@ -182,7 +187,11 @@ class SQLiteDeviceInventoryRepository:
|
||||
agent_id=COALESCE(NULLIF(excluded.agent_id, ''), {DEVICE_TABLE}.agent_id),
|
||||
ansible_ee_ver=COALESCE(NULLIF(excluded.ansible_ee_ver, ''), {DEVICE_TABLE}.ansible_ee_ver),
|
||||
connection_type=COALESCE(NULLIF(excluded.connection_type, ''), {DEVICE_TABLE}.connection_type),
|
||||
connection_endpoint=COALESCE(NULLIF(excluded.connection_endpoint, ''), {DEVICE_TABLE}.connection_endpoint)
|
||||
connection_endpoint=COALESCE(NULLIF(excluded.connection_endpoint, ''), {DEVICE_TABLE}.connection_endpoint),
|
||||
ssl_key_fingerprint=COALESCE(NULLIF(excluded.ssl_key_fingerprint, ''), {DEVICE_TABLE}.ssl_key_fingerprint),
|
||||
token_version=COALESCE(NULLIF(excluded.token_version, 0), {DEVICE_TABLE}.token_version),
|
||||
status=COALESCE(NULLIF(excluded.status, ''), {DEVICE_TABLE}.status),
|
||||
key_added_at=COALESCE(NULLIF(excluded.key_added_at, ''), {DEVICE_TABLE}.key_added_at)
|
||||
"""
|
||||
|
||||
params: List[Any] = [
|
||||
@@ -209,6 +218,10 @@ class SQLiteDeviceInventoryRepository:
|
||||
column_values.get("ansible_ee_ver"),
|
||||
column_values.get("connection_type"),
|
||||
column_values.get("connection_endpoint"),
|
||||
column_values.get("ssl_key_fingerprint"),
|
||||
column_values.get("token_version"),
|
||||
column_values.get("status"),
|
||||
column_values.get("key_added_at"),
|
||||
]
|
||||
|
||||
with closing(self._connections()) as conn:
|
||||
@@ -223,6 +236,42 @@ class SQLiteDeviceInventoryRepository:
|
||||
cur.execute(f"DELETE FROM {DEVICE_TABLE} WHERE hostname = ?", (hostname,))
|
||||
conn.commit()
|
||||
|
||||
def record_device_fingerprint(self, guid: Optional[str], fingerprint: Optional[str], added_at: str) -> None:
|
||||
normalized_guid = clean_device_str(guid)
|
||||
normalized_fp = clean_device_str(fingerprint)
|
||||
if not normalized_guid or not normalized_fp:
|
||||
return
|
||||
|
||||
with closing(self._connections()) as conn:
|
||||
cur = conn.cursor()
|
||||
cur.execute(
|
||||
"""
|
||||
INSERT OR IGNORE INTO device_keys (id, guid, ssl_key_fingerprint, added_at)
|
||||
VALUES (?, ?, ?, ?)
|
||||
""",
|
||||
(str(uuid.uuid4()), normalized_guid, normalized_fp.lower(), added_at),
|
||||
)
|
||||
cur.execute(
|
||||
"""
|
||||
UPDATE device_keys
|
||||
SET retired_at = ?
|
||||
WHERE guid = ?
|
||||
AND ssl_key_fingerprint != ?
|
||||
AND retired_at IS NULL
|
||||
""",
|
||||
(added_at, normalized_guid, normalized_fp.lower()),
|
||||
)
|
||||
cur.execute(
|
||||
"""
|
||||
UPDATE devices
|
||||
SET ssl_key_fingerprint = COALESCE(LOWER(?), ssl_key_fingerprint),
|
||||
key_added_at = COALESCE(key_added_at, ?)
|
||||
WHERE LOWER(guid) = LOWER(?)
|
||||
""",
|
||||
(normalized_fp, added_at, normalized_guid),
|
||||
)
|
||||
conn.commit()
|
||||
|
||||
def _extract_device_columns(self, details: Dict[str, Any]) -> Dict[str, Any]:
|
||||
summary = details.get("summary") or {}
|
||||
payload: Dict[str, Any] = {}
|
||||
@@ -250,4 +299,8 @@ class SQLiteDeviceInventoryRepository:
|
||||
payload["connection_endpoint"] = clean_device_str(
|
||||
summary.get("connection_endpoint") or summary.get("endpoint")
|
||||
)
|
||||
payload["ssl_key_fingerprint"] = clean_device_str(summary.get("ssl_key_fingerprint"))
|
||||
payload["token_version"] = coerce_int(summary.get("token_version")) or 0
|
||||
payload["status"] = clean_device_str(summary.get("status"))
|
||||
payload["key_added_at"] = clean_device_str(summary.get("key_added_at"))
|
||||
return payload
|
||||
|
||||
Reference in New Issue
Block a user