1
0
Files
homelab-public-context/runtime/latest.json
T
2026-09-22 14:41:08 +00:00

39 lines
16 KiB
JSON

{
"schema_version": 1,
"channel": "homelab-runtime",
"command_id": "NEWFI-260922-NEWFDOM-DR221-418-OWNER-FD-PHASE-RCA419R1",
"status": "OK",
"rc": 0,
"host": "pve01",
"mode": "read-only",
"component": "newfi-dr221-418-owner-fd-phase-rca",
"started_at_utc": "2026-09-22T14:41:07Z",
"finished_at_utc": "2026-09-22T14:41:07Z",
"reference_register_checked": true,
"reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66",
"error_register_checked": true,
"error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0",
"command_sha256": "086ee022e9b084cfd4a2a9e59bd32b52470059e7d8713bec3b59065215adf353",
"duplicate_failed_command_blocked": false,
"block_reason": null,
"execution_started": true,
"change_declared": false,
"result_contract_valid": true,
"result_contract_status": null,
"result_contract_error": null,
"command_rc": 0,
"changes_made": false,
"rollback_started": false,
"rollback_restored": null,
"mutation_outcome": "NO_MUTATION",
"sanitized": true,
"secrets_included": false,
"private_addresses_included": false,
"raw_evidence_retained_locally": true,
"raw_evidence_sha256": "ff062154f98216b8725381d01e1dd68d7dcceaa4097f2011a73103ceb6b600ad",
"sanitized_output_sha256": "ff062154f98216b8725381d01e1dd68d7dcceaa4097f2011a73103ceb6b600ad",
"output_truncated_in_json": false,
"full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt",
"output": "NEWFI419_BEGIN=true\nCOMMAND_ID=NEWFI-260922-NEWFDOM-DR221-418-OWNER-FD-PHASE-RCA419R1\nMODE=read-only\nCOMPONENT=newfi-dr221-418-owner-fd-phase-rca\nTARGET=EXACT_CURRENT_HOMELAB_BACKUP_V2_OWNER_PHASE_AND_PROGRESS\nMUTATION_BOUNDARY=NONE;PROC_AND_SOURCE_READ_ONLY;NO_SIGNAL;NO_PTRACE;NO_KILL;NO_SYSTEMD_ACTION;NO_BACKUP;NO_CLOUD_WRITE;NO_VM_WRITE;NO_GIT_WRITE\nREFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66\nERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0\nRUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\nBACKUP_WRAPPER_SHA256=5077444065c732451cb84898680f62361b21a24ef9eb4f191253e82ead524ea2\nACCEPTED_RELEASE=/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b\nACCEPTED_RELEASE_GATE=PASS\nRUNTIME_SOURCE_PHASE_HINTS_BEGIN=true\nRUNTIME_SOURCE_FILE=entry504.py|SHA256=ca6876fa9c3b1465b045344a8ad46962de16972c7dadc4ac6257c7d225047793\n1-from __future__ import annotations\n2:import hashlib, importlib, json, os, pathlib, stat, sys, types\n3-\n4-BASE=pathlib.Path('/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1')\n--\n16-\n17-def _sha(p):\n18: h=hashlib.sha256()\n19- with open(p,'rb',buffering=0) as f:\n20- while True:\n--\n41- def __setattr__(self,n,v): self._g[n]=v\n42-\n43:def _wire(wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,base=BASE):\n44- legacy_path=(pathlib.Path(base)/'legacy_engine.py').resolve()\n45- found={}\n--\n48- g=vars(value); raw=g.get('__file__')\n49- elif isinstance(value,types.FunctionType):\n50: g=value.__globals__; raw=g.get('__file__')\n51- else:\n52- continue\n--\n79- if g.get('choose_due_target') is not scheduler_wired['choose_due_target'] or g.get('write_state') is not scheduler_wired['write_state']:\n80- raise RuntimeError('SCHEDULER_ADAPTER_BIND_RESULT')\n81: return {'legacy_globals':g,'legacy':proxy,'original_capture':original,'qemu_patched_capture':qemu_patched,'patched_capture':patched,'scheduler_wired':scheduler_wired}\n82-\n83-def _load():\n--\n86- sys.path.insert(0,str(BASE))\n87- wrapper=importlib.import_module('wrapper')\n88: # Baseline accepted wrapper selftest stays the compatibility gate; no full old legacy selftest is reintroduced.\n89: wrapper.selftest()\n90- sys.path.insert(0,str(HERE))\n91- lxc_adapter=importlib.import_module('lxc_adapter')\n--\n97- return wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,wired\n98-\n99:def _target(wrapper,lid):\n100- rows=wrapper.load_targets(); hits=[x for x in rows if x.get('logical_id')==lid]\n101- if len(hits)!=1: raise RuntimeError('TARGET_CARDINALITY')\n102- return hits[0]\n103-\n104:def selftest():\n105- wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,wired=_load()\n106: if wired['legacy_globals'].get('capture_pve_guest') is not wired['patched_capture']:\n107- raise RuntimeError('PATCH_BINDING')\n108: if wired['legacy_globals'].get('choose_due_target') is not wired['scheduler_wired']['choose_due_target']:\n109- raise RuntimeError('SCHEDULER_CHOOSE_BINDING')\n110: if wired['legacy_globals'].get('write_state') is not wired['scheduler_wired']['write_state']:\n111- raise RuntimeError('SCHEDULER_WRITE_BINDING')\n112- if [scheduler_adapter.backoff_seconds(n) for n in range(1,7)]!=[1800,3600,7200,14400,21600,21600]:\n--\n119-def main(argv=None):\n120- argv=list(sys.argv[1:] if argv is None else argv)\n121: if argv==['selftest']:\n122: return selftest()\n123- wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,wired=_load()\n124- legacy=wired['legacy']\n125- if argv==['scheduler-proof']:\n126- import tempfile\n127: legacy=wired['legacy']; g=wired['legacy_globals']\n128- old_root=g.get('STATE_ROOT'); old_epoch=g.get('epoch')\n129- if old_root is None or not callable(old_epoch): raise RuntimeError('SCHEDULER_PROOF_BASE')\n--\n133- g['STATE_ROOT']=pathlib.Path(td); (g['STATE_ROOT']/'state').mkdir(mode=0o700)\n134- g['epoch']=lambda: now[0]\n135: common={'payload_sha256':'a'*64,'manifest_sha256':'b'*64,'replicas':['proof-r1','proof-r2']}\n136- legacy.write_state('proof-a','SUCCESS',generation='proof-a-good',**common)\n137- legacy.write_state('proof-b','SUCCESS',generation='proof-b-good',**common)\nRUNTIME_SOURCE_FILE=scheduler_adapter.py|SHA256=a6f67159a64067773323f028126e3109e15cf17a8142cea5e6129970f1d4da96\n35- if prior.get('result')=='SUCCESS':\n36- out={'last_success_epoch':_as_nonneg_int(prior.get('last_success_epoch'),0)}\n37: mapping=(('generation','last_success_generation'),('payload_sha256','last_success_payload_sha256'),\n38: ('manifest_sha256','last_success_manifest_sha256'),('replicas','last_success_replicas'),\n39- ('green_verified','last_success_green_verified'))\n40- for src,dst in mapping:\n--\n42- return out\n43- out={}\n44: for k in ('last_success_epoch','last_success_generation','last_success_payload_sha256',\n45: 'last_success_manifest_sha256','last_success_replicas','last_success_green_verified'):\n46- if k in prior: out[k]=prior[k]\n47- return out\n--\n53- _need(hasattr(legacy,'STATE_ROOT'),'LEGACY_STATE_ROOT_REQUIRED')\n54-\n55: def choose_due_target(targets,state,now=None):\n56- now=_as_nonneg_int(legacy.epoch() if now is None else now,0)\n57- _need(isinstance(targets,list) and isinstance(state,dict),'SCHEDULER_INPUT_SCHEMA')\nRUNTIME_SOURCE_FILE=producer_exec_helper.py|SHA256=b3b97099bcd7126670f866e81faae6a42a96d869d9989e6a67f6ea6c871c90b3\n1-from __future__ import annotations\n2:import hashlib, json, os, pathlib, sys\n3-\n4-BASE=pathlib.Path('/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411')\n--\n8-\n9-def sha_file(p:pathlib.Path)->str:\n10: h=hashlib.sha256()\n11- with open(p,'rb',buffering=0) as f:\n12- for b in iter(lambda:f.read(1<<20),b''): h.update(b)\n--\n19- p=parent/'PRODUCER_PROCESS.json'\n20- if not p.is_file() or p.is_symlink(): return None\n21: try: d=json.loads(p.read_bytes())\n22- except Exception: return {'summary_read':'FAILED'}\n23: keys=('process_started','producer_rc','capture_success','archive_bytes','stderr_bytes_observed','stderr_bytes_retained','stderr_truncated','stderr_stream_sha256','raw_stderr_exported','child_umask')\n24- return {k:d.get(k) for k in keys if k in d}\n25-\n26:def selftest()->int:\n27- if sha_file(VZDUMP)!=VZDUMP_SHA: fail('VZDUMP_IDENTITY')\n28- sys.path.insert(0,str(BASE))\n--\n33-\n34-def main()->int:\n35: if sys.argv[1:]==['selftest']: return selftest()\n36- if sys.argv[1:]: fail('ARGC')\n37- raw=sys.stdin.buffer.read(MAX_INPUT+1)\n--\n61- except Exception as e:\n62- out={'status':'FAIL','exception_class':type(e).__module__+'.'+type(e).__name__,\n63: 'exception_message_sha256':hashlib.sha256(str(e).encode()).hexdigest(),\n64- 'process':safe_process_summary(dest.parent)}\n65- print(json.dumps(out,separators=(',',':'),sort_keys=True),flush=True)\n--\n70- except Exception as e:\n71- print(json.dumps({'status':'FAIL','exception_class':type(e).__module__+'.'+type(e).__name__,\n72: 'exception_message_sha256':hashlib.sha256(str(e).encode()).hexdigest(),\n73- 'process':None},separators=(',',':'),sort_keys=True),flush=True)\n74- raise SystemExit(2)\nRUNTIME_SOURCE_PHASE_HINTS_END=true\nMainPID=335341\nResult=success\nExecMainStartTimestamp=Tue 2026-09-22 14:51:24 MSK\nExecMainExitTimestamp=\nExecMainPID=335341\nExecMainStatus=0\nLoadState=loaded\nActiveState=activating\nSubState=start\nInvocationID=124bde99379341a1bf82f318f31f9621\nOWNER_PID_START=335341\nOWNER_INVOCATION_ID=124bde99379341a1bf82f318f31f9621\nHEAVY_LOCK_START=BUSY\nCURRENT_INVOCATION_JOURNAL_LINES=1\nCURRENT_INVOCATION_JOURNAL_SHA256=25b081a572c3c2feb67855d9294cbfad87cb01cd703b722db59fce65e936bf6b\nCURRENT_INVOCATION_JOURNAL_BEGIN=true\n2026-09-22T14:51:25+03:00 pve01 homelab-backup-v2[335341]: SELFTEST_REPLACEMENT486=PASS\nCURRENT_INVOCATION_JOURNAL_END=true\nCURRENT_INVOCATION_SELFTEST_PASS=true\nCURRENT_INVOCATION_TARGET_SEEN=false\nCURRENT_INVOCATION_RESULT_SEEN=false\nCURRENT_INVOCATION_LATEST_TARGET=NONE\nPROC_SNAPSHOT_BEGIN=A\nPROC_PRESENT_A=true\n 335341 1 10152 S 0.0 0.0 homelab-backup- /usr/bin/python3 /usr/local/sbin/homelab-backup-v2 scheduled\nWCHAN_A=poll_schedule_timeout.constprop.0\nSYSCALL_A=7 [PTR] [PTR] [PTR] [PTR] [PTR] [PTR] [PTR] [PTR]\nIO_A_rchar=2172298800\nIO_A_wchar=1354968903\nIO_A_syscr=838052\nIO_A_syscw=96420\nIO_A_read_bytes=0\nIO_A_write_bytes=570032128\nSTATUS_A_STATE=S\nCTX_A_VOL=31893\nCTX_A_INVOL=288\nFD_COUNT_A=7\nFD_A|fd=0|cat=DEV|pos=0|size=0|base=null|path_sha16=fd5d32feb2d35625\nFD_A|fd=1|cat=SOCKET|pos=0|size=NA|base=NA|path_sha16=feb8f1e1f9e2ba39\nFD_A|fd=2|cat=SOCKET|pos=0|size=NA|base=NA|path_sha16=feb8f1e1f9e2ba39\nFD_A|fd=3|cat=BACKUP_RUN|pos=0|size=0|base=homelab-backup-heavy.lock|path_sha16=2642241b0beaa737\nFD_A|fd=4|cat=OTHER_FILE|pos=570032128|size=570032128|base=payload.tar.zst|path_sha16=a5bf89245089a1c8\nFD_A|fd=5|cat=PIPE|pos=0|size=NA|base=NA|path_sha16=18f487fd1dca338f\nFD_A|fd=7|cat=PIPE|pos=0|size=NA|base=NA|path_sha16=6f3886873903d4f2\nCHILDREN_A\n 903072 335341 1 S ssh /usr/bin/ssh -o BatchMode=yes -o StrictHostKeyChecking=yes root@pve02 PATH=/usr/sbin:/usr/bin:/sbin:/bin; export PATH; exec qm guest exec 160 --synchronous 1 --timeout 60 -- /usr/bin/python3 -I -B -c 'import base64,sys; p=sys.argv[1]; o=int(sys.argv[2]); n=int(sys.argv[3]); f=open(p,'\"'\"'rb'\"'\"'); f.seek(o); b=f.read(n); f.close(); sys.stdout.write(base64.b64encode(b).decode())' /tmp/homelab-v2-xf-0922T115125Z1b7415a2313b.tar.zst 570032128 131072\nSOCKETS_A\nPROC_SNAPSHOT_END=A\nPROC_SNAPSHOT_BEGIN=B\nPROC_PRESENT_B=true\n 335341 1 10167 S 0.0 0.0 homelab-backup- /usr/bin/python3 /usr/local/sbin/homelab-backup-v2 scheduled\nWCHAN_B=poll_schedule_timeout.constprop.0\nSYSCALL_B=7 [PTR] [PTR] [PTR] [PTR] [PTR] [PTR] [PTR] [PTR]\nIO_B_rchar=2175695809\nIO_B_wchar=1357149803\nIO_B_syscr=839397\nIO_B_syscw=96576\nIO_B_read_bytes=0\nIO_B_write_bytes=570949632\nSTATUS_B_STATE=S\nCTX_B_VOL=31943\nCTX_B_INVOL=288\nFD_COUNT_B=7\nFD_B|fd=0|cat=DEV|pos=0|size=0|base=null|path_sha16=fd5d32feb2d35625\nFD_B|fd=1|cat=SOCKET|pos=0|size=NA|base=NA|path_sha16=feb8f1e1f9e2ba39\nFD_B|fd=2|cat=SOCKET|pos=0|size=NA|base=NA|path_sha16=feb8f1e1f9e2ba39\nFD_B|fd=3|cat=BACKUP_RUN|pos=0|size=0|base=homelab-backup-heavy.lock|path_sha16=2642241b0beaa737\nFD_B|fd=4|cat=OTHER_FILE|pos=570949632|size=570949632|base=payload.tar.zst|path_sha16=a5bf89245089a1c8\nFD_B|fd=5|cat=PIPE|pos=0|size=NA|base=NA|path_sha16=3a74719a8d200544\nFD_B|fd=7|cat=PIPE|pos=0|size=NA|base=NA|path_sha16=27db66d36b35c3d5\nCHILDREN_B\n 903386 335341 0 S ssh /usr/bin/ssh -o BatchMode=yes -o StrictHostKeyChecking=yes root@pve02 PATH=/usr/sbin:/usr/bin:/sbin:/bin; export PATH; exec qm guest exec 160 --synchronous 1 --timeout 60 -- /usr/bin/python3 -I -B -c 'import base64,sys; p=sys.argv[1]; o=int(sys.argv[2]); n=int(sys.argv[3]); f=open(p,'\"'\"'rb'\"'\"'); f.seek(o); b=f.read(n); f.close(); sys.stdout.write(base64.b64encode(b).decode())' /tmp/homelab-v2-xf-0922T115125Z1b7415a2313b.tar.zst 570949632 131072\nSOCKETS_B\nPROC_SNAPSHOT_END=B\nPROC_SNAPSHOT_BEGIN=C\nPROC_PRESENT_C=true\n 335341 1 10182 S 0.0 0.0 homelab-backup- /usr/bin/python3 /usr/local/sbin/homelab-backup-v2 scheduled\nWCHAN_C=poll_schedule_timeout.constprop.0\nSYSCALL_C=7 [PTR] [PTR] [PTR] [PTR] [PTR] [PTR] [PTR] [PTR]\nIO_C_rchar=2178607641\nIO_C_wchar=1359019147\nIO_C_syscr=840546\nIO_C_syscw=96707\nIO_C_read_bytes=0\nIO_C_write_bytes=571736064\nSTATUS_C_STATE=S\nCTX_C_VOL=31987\nCTX_C_INVOL=288\nFD_COUNT_C=7\nFD_C|fd=0|cat=DEV|pos=0|size=0|base=null|path_sha16=fd5d32feb2d35625\nFD_C|fd=1|cat=SOCKET|pos=0|size=NA|base=NA|path_sha16=feb8f1e1f9e2ba39\nFD_C|fd=2|cat=SOCKET|pos=0|size=NA|base=NA|path_sha16=feb8f1e1f9e2ba39\nFD_C|fd=3|cat=BACKUP_RUN|pos=0|size=0|base=homelab-backup-heavy.lock|path_sha16=2642241b0beaa737\nFD_C|fd=4|cat=OTHER_FILE|pos=571736064|size=571736064|base=payload.tar.zst|path_sha16=a5bf89245089a1c8\nFD_C|fd=5|cat=PIPE|pos=0|size=NA|base=NA|path_sha16=e931a2a362f85fd8\nFD_C|fd=7|cat=PIPE|pos=0|size=NA|base=NA|path_sha16=8d16e18acde67925\nCHILDREN_C\n 903565 335341 1 S ssh /usr/bin/ssh -o BatchMode=yes -o StrictHostKeyChecking=yes root@pve02 PATH=/usr/sbin:/usr/bin:/sbin:/bin; export PATH; exec qm guest exec 160 --synchronous 1 --timeout 60 -- /usr/bin/python3 -I -B -c 'import base64,sys; p=sys.argv[1]; o=int(sys.argv[2]); n=int(sys.argv[3]); f=open(p,'\"'\"'rb'\"'\"'); f.seek(o); b=f.read(n); f.close(); sys.stdout.write(base64.b64encode(b).decode())' /tmp/homelab-v2-xf-0922T115125Z1b7415a2313b.tar.zst 571736064 131072\nSOCKETS_C\nPROC_SNAPSHOT_END=C\nOWNER_END_STATE|active=activating|sub=start|pid=335341|heavy=BUSY\nPID_STABLE=true\nDELTA_A_B_rchar=3397009\nDELTA_A_B_wchar=2180900\nDELTA_A_B_syscr=1345\nDELTA_A_B_syscw=156\nDELTA_A_B_read_bytes=0\nDELTA_A_B_write_bytes=917504\nDELTA_B_C_rchar=2911832\nDELTA_B_C_wchar=1869344\nDELTA_B_C_syscr=1149\nDELTA_B_C_syscw=131\nDELTA_B_C_read_bytes=0\nDELTA_B_C_write_bytes=786432\nDELTA_A_C_rchar=6308841\nDELTA_A_C_wchar=4050244\nDELTA_A_C_syscr=2494\nDELTA_A_C_syscw=287\nDELTA_A_C_read_bytes=0\nDELTA_A_C_write_bytes=1703936\nINTERNAL_IO_PROGRESS_30S=true\nCURRENT_INVOCATION_END_JOURNAL_LINES=1\nCURRENT_INVOCATION_END_JOURNAL_BEGIN=true\n2026-09-22T14:51:25+03:00 pve01 homelab-backup-v2[335341]: SELFTEST_REPLACEMENT486=PASS\nCURRENT_INVOCATION_END_JOURNAL_END=true\nEND_INVOCATION_SELFTEST_PASS=true\nEND_INVOCATION_TARGET_SEEN=false\nEND_INVOCATION_LATEST_TARGET=NONE\nOWNER_PHASE=ACTIVE_AFTER_SELFTEST_BEFORE_TARGET_MARKER\nDECISION=PASS_DR221_419_OWNER_PRETARGET_INTERNAL_IO_PROVEN\nNEXT_GATE=WAIT_NATURAL_OWNER_COMPLETION_THEN_REISSUE_VM210_MEMBERSHIP_AND_FRESH_BACKUP\nCHANGES_MADE_BY_419=false\nPRODUCT_MUTATION_BY_419=false\nVM_MUTATION_BY_419=false\nCLOUD_MUTATION_BY_419=false\nHOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"NEWFI-260922-NEWFDOM-DR221-418-OWNER-FD-PHASE-RCA419R1\",\"status\":\"OK\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}\nNEWFI419_END=true\n"
}