bmc_hub/tmp_check_eset_machine.py

113 lines
3.4 KiB
Python
Raw Permalink Normal View History

import asyncio
import json
from app.services.eset_service import eset_service
TARGET = "ati-w11-yoga.norva24.lcl".lower()
def parse_devices(payload):
if isinstance(payload, list):
return payload
if not isinstance(payload, dict):
return []
return payload.get("devices") or payload.get("items") or payload.get("results") or payload.get("data") or []
def get_next(payload):
if not isinstance(payload, dict):
return None
return payload.get("nextPageToken") or payload.get("next_page_token") or payload.get("nextPage")
def pick(dev, *keys):
for key in keys:
val = dev.get(key)
if isinstance(val, str) and val.strip():
return val.strip()
return ""
def extract_first_str(payload, keys):
if payload is None:
return None
key_set = {k.lower() for k in keys}
stack = [payload]
while stack:
cur = stack.pop()
if isinstance(cur, dict):
for k, v in cur.items():
if k.lower() in key_set and isinstance(v, str) and v.strip():
return v.strip()
if isinstance(v, (dict, list)):
stack.append(v)
elif isinstance(cur, list):
for item in cur:
if isinstance(item, (dict, list)):
stack.append(item)
return None
async def main():
page_token = None
page_size = 200
max_pages = 50
found = None
for _ in range(max_pages):
payload = await eset_service.list_devices(page_size=page_size, page_token=page_token)
if not payload:
print("ERROR: No payload from ESET list_devices")
return
devices = parse_devices(payload)
for device in devices:
name = pick(device, "displayName", "deviceName", "name").lower()
fqdn = pick(device, "fqdn", "dnsName", "hostName", "hostname").lower()
if TARGET in {name, fqdn} or TARGET in name or TARGET in fqdn:
found = device
break
if found:
break
page_token = get_next(payload)
if not page_token or not devices:
break
if not found:
print("NOT_FOUND")
return
uuid = pick(found, "deviceUuid", "uuid", "id")
details = await eset_service.get_device_details(uuid)
if not details:
print("FOUND_BUT_NO_DETAILS")
print("uuid=", uuid)
return
software = eset_service.extract_installed_software(details)
summary = {
"device_uuid": uuid,
"device_name": extract_first_str(details, ["displayName", "deviceName", "name"]),
"user_identifier": extract_first_str(details, [
"userPrincipalName", "upn", "email", "mail", "loginName", "login", "userName", "lastLoggedInUser", "owner", "ownerUuid"
]),
"serial": extract_first_str(details, ["serialNumber", "serial", "serial_number"]),
"group": extract_first_str(details, ["parentGroup", "groupPath", "group", "path"]),
"installed_software_count": len(software),
"installed_software_first_20": software[:20],
}
out_path = "/tmp/eset_ati_w11_yoga.json"
with open(out_path, "w", encoding="utf-8") as f:
json.dump({"summary": summary, "raw": details}, f, ensure_ascii=False, indent=2)
print("FOUND")
print(json.dumps(summary, ensure_ascii=False, indent=2))
print("SAVED=", out_path)
if __name__ == "__main__":
asyncio.run(main())