CHAT_OUTPUT_BEGIN
COMMAND_ID=CLUSTER-REFERENCE-CORE-INVENTORY-161
STATUS=FAIL
RC=1
HOST=pve01
MODE=change
COMPONENT=reference-update
REFERENCE_REGISTER_CHECK=OK
REFERENCE_SHA256=5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e
ERROR_REGISTER_CHECK=OK
ERROR_REGISTER_SHA256=08b3a769b8e38eaa1acec915352fb328180d70caa7ff6cd9d1ec0da426262752
COMMAND_SHA256=9f9a4398c63fdddddd53865e69da2f8af6ff9c9c69398ec28d530d5449d7296e
DUPLICATE_FAILED_COMMAND_BLOCKED=false
EXECUTION_STARTED=true
CHANGES_MADE=true
SANITIZED=yes
SECRETS_INCLUDED=no
PRIVATE_ADDRESSES_INCLUDED=no
RAW_EVIDENCE_SHA256=45b8d84f9e819bf717f6a1d7cf029f793f6f32c545ac2a017f9af091da4c2152
SANITIZED_OUTPUT_SHA256=45b8d84f9e819bf717f6a1d7cf029f793f6f32c545ac2a017f9af091da4c2152
OUTPUT_BEGIN
  File "<string>", line 1
    import datetime,json,os,pathlib,re,shutil,socket,subprocess,urllib.request;root=pathlib.Path("/etc/homelab/reference");assert (root/"manifest.json").is_file() and (root/"state/current.json").is_file();u="https://git.gram1.ru/homelab-admin/homelab-public-context/raw/commit/321a330f9e5c8696e6e8bf1e147ce5386f3de352/runtime/history/CLUSTER-REFERENCE-CORE-INVENTORY-156.json";prev=json.load(urllib.request.urlopen(urllib.request.Request(u,headers={"User-Agent":"homelab-reference/3"}),timeout=60));assert prev.get("command_id")=="CLUSTER-REFERENCE-CORE-INVENTORY-156" and prev.get("status")=="FAIL" and int(prev.get("rc"))==1 and "SyntaxError" in str(prev.get("output",""));manifest=json.loads((root/"manifest.json").read_text(encoding="utf-8"));now=datetime.datetime.now(datetime.timezone.utc).replace(microsecond=0);now_s=now.isoformat();sections=["cluster","nodes",".json").read_text(encoding="utf-8"));now=datetime.datetime.now(datetimeguests","containers","storage","networks","dns"];snap=root/"snapshots"/("core-"+now.strftime("%Y%m%dT%H%M%SZ"));snap.mkdir(parents=True,exist_ok=False);[(shutil.copy2(root/"observed"/(s+".json"),snap/(s+".json"))) for s in sections if (root/"observed"/(s+".json")).is_file()];out=lambda a:subprocess.check_output(a,text=True,stderr=subprocess.STDOUT,timeout=90);txt=lambda a:(lambda r:r.stdout+r.stderr)(subprocess.run(a,stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True,timeout=90,check=False));nodes=json.loads(out(["pvesh","get","/nodes","--output-format","json"]));guests=json.loads(out(["pvesh","get","/cluster/resources","--type","vm","--output-format","json"]));storage=json.loads(out(["pvesh","get","/storage","--output-format","json"]));addresses=json.loads(out(["ip","-j","address"]));routes=json.loads(out(["ip","-j","route","show","table","all"]));slug=lambda v:re.sub("[^a-z0-9._-]+","-",str(v).lower()).strip("-") or "unknown";fresh=lambda s:(now+datetime.timedelta(seconds=int(manifest.get("freshness_seconds",{}).get(s,3600)))).isoformat();decorate=lambda s,x:{**x,"observed_at":now_s,"fresh_until":fresh(s),"source":"core-internal-collector"};resolv=pathlib.Path("/etc/resolv.conf");records={"cluster":[decorate("cluster",{"id":"cluster-homelab","hostname":socket.gethostname(),"kernel":os.uname().release,"pve_version":txt(["pveversion","--verbose"]),"quorum_status":txt(["pvecm","status"])})],"nodes":[decorate("nodes",{**x,"id":"node-"+slug(x.get("node") or x.get("id"))}) for x in nodes],"guests":[decorate("guests",{"id":"guest-"+slug(x.get("vmid")),"vmid":x.get("vmid"),"name":x.get("name"),"type":x.get("type"),"node":x.get("node"),"status":x.get("status"),"template":x.get("template"),"uptime":x.get("uptime"),"cpus":x.get("maxcpu"),"memory_bytes":x.get("maxmem"),"disk_bytes":x.get("maxdisk"),"tags":x.get("tags")}) for x in guests],"containers":[decorate("containers",{"id":"container-"+slug(x.get("vmid")),"vmid":x.get("vmid"),"name":x.get("name"),"node":x.get("node"),"status":x.get("status"),"uptime":x.get("uptime"),"cpus":x.get("maxcpu"),"memory_bytes":x.get("maxmem"),"disk_bytes":x.get("maxdisk"),"tags":x.get("tags")}) for x in guests if x.get("type")=="lxc"],"storage":[decorate("storage",{**x,"id":"storage-"+slug(x.get("storage") or x.get("id"))}) for x in storage],"networks":[decorate("networks",{"id":"network-state-"+slug(socket.gethostname()),"hostname":socket.gethostname(),"interfaces":addresses,"routes":routes})],"dns":[decorate("dns",{"id":"resolver-state-"+slug(socket.gethostname()),"hostname":socket.gethostname(),"resolv_conf":resolv.read_text(encoding="utf-8",errors="replace").splitlines() if resolv.is_file() else []})]};[(root/"observed"/(s+".json")).write_text(json.dumps({"schema_version":2,"section":s,"layer":"observed","updated_at":now_s,"source":"core-internal-collector","records":v},ensure_ascii=False,indent=2)+"\n",encoding="utf-8") for s,v in records.items()];state=json.loads((root/"state/current.json").read_text(encoding="utf-8"));state.update({"schema_version":2,"status":"CORE_INTERNAL_INVENTORY_READY","updated_at":now_s,"last_snapshot":str(snap),"core_internal_counts":{s:len(v) for s,v in records.items()},"previous_command_id":"CLUSTER-REFERENCE-CORE-INVENTORY-156","previous_immutable_commit":"321a330f9e5c8696e6e8bf1e147ce5386f3de352"});(root/"state/current.json").write_text(json.dumps(state,ensure_ascii=False,indent=2)+"\n",encoding="utf-8");[json.loads(p.read_text(encoding="utf-8")) for p in root.rglob("*.json")];[os.chmod(p,0o750 if p.is_dir() else 0o640) for p in [root,*root.rglob("*")]];print("PREVIOUS_FAILURE=CONFIRMED");print("REFERENCE_SNAPSHOT="+str(snap));print("CORE_INTERNAL_SECTIONS="+str(len(records)));print("CORE_INTERNAL_RECORDS="+str(sum(len(v) for v in records.values())));print("REFERENCE_STATUS=CORE_INTERNAL_INVENTORY_READY);print("CLUSTER_REFERENCE_CORE_INVENTORY=COMPLETE")
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            ^
SyntaxError: closing parenthesis ')' does not match opening parenthesis '['

OUTPUT_END
CHAT_OUTPUT_END
