diff --git a/suzieq/poller/worker/services/arpnd.py b/suzieq/poller/worker/services/arpnd.py index 95b2fe1494..909e563843 100644 --- a/suzieq/poller/worker/services/arpnd.py +++ b/suzieq/poller/worker/services/arpnd.py @@ -117,7 +117,7 @@ def _clean_panos_data(self, processed_data, _): # ARP entries are shown with status as merely a letter while # ND entries are shown with the status as a self-respecting word. # sigh - state = entry.get("state", "").lower() + state = (entry.get("state") or "").lower() if state in ["s", "static"]: entry["state"] = "permanent" elif state in ["c", "e", "stale", "reachable"]: diff --git a/suzieq/poller/worker/services/interfaces.py b/suzieq/poller/worker/services/interfaces.py index 38e118542f..7752cd99d9 100644 --- a/suzieq/poller/worker/services/interfaces.py +++ b/suzieq/poller/worker/services/interfaces.py @@ -1,7 +1,7 @@ import re from datetime import datetime from collections import defaultdict -from json import loads +from json import loads, JSONDecodeError from typing import Dict import numpy as np @@ -993,13 +993,32 @@ def _clean_panos_data(self, processed_data, _): # mtu values are collected separatly if _mtu_data: + try: + _, json_blob = _mtu_data.split(": ", 1) + except ValueError: + self.logger.warning( + "Unexpected panos MTU data format: %s", _mtu_data) + continue + # fix json so that it can be parsed - d = _mtu_data.split(": ", 1)[1].replace("'", "\"") + d = json_blob.replace("'", "\"") d = re.sub( r"([a-fA-F0-9]{2}(:[a-fA-F0-9]{2}){5})", r'"\1"', d) d = re.sub(r"(\"[\w0-9\.\/]+\": \{\s\},\s)", r"", d) - d = re.sub(r"(,\s\})", r" }", d) - j = loads(d) + d = re.sub(r"(,\s\})", r" }", d).strip() + + if not d: + self.logger.warning( + "Empty panos MTU data after cleanup: %s", _mtu_data) + continue + + try: + j = loads(d) + except JSONDecodeError: # pragma: no cover - defensive + self.logger.warning( + "Unable to parse panos MTU data: %s", d) + continue + for ifname, value in j.items(): mtu_data[ifname] = value["mtu"] continue