39 lines
302 KiB
JSON
39 lines
302 KiB
JSON
{
|
|
"schema_version": 1,
|
|
"channel": "homelab-runtime",
|
|
"command_id": "SUPPORT-261007-BACKUP-DNS-VM130-EXACT-RESIDUAL-RCA-99787R1",
|
|
"status": "OK",
|
|
"rc": 0,
|
|
"host": "pve01",
|
|
"mode": "read-only",
|
|
"component": "backup-dns-vm130-exact-residual-rca",
|
|
"started_at_utc": "2026-10-07T16:17:25Z",
|
|
"finished_at_utc": "2026-10-07T17:19:46Z",
|
|
"reference_register_checked": true,
|
|
"reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66",
|
|
"error_register_checked": true,
|
|
"error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0",
|
|
"command_sha256": "5145bb4df345e3b74d23c708041e42e3446261b41a792d74ad7d370c5333bd46",
|
|
"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": "92efdbbbe533bbe0dc5d11d589d3584a3641633aa597ddc1595abb286bc0e18c",
|
|
"sanitized_output_sha256": "828ac34bf2bf287b3ad374796e2616c0172a5fc92d2b88fbb4401fef9f2015b6",
|
|
"output_truncated_in_json": true,
|
|
"full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt",
|
|
"output": "BACKUP_DNS_VM130_EXACT_RESIDUAL_RCA=V1\nMODE=read-only\nNO_MUTATION=true\nBACKUP_V2_ACTIVE=inactive\nBACKUP_V2_RESULT=success\nBACKUP_V2_EXEC_STATUS=0\nBACKUP_V2_START_TIMESTAMP=Wed 2026-10-07 18:52:40 MSK\nBACKUP_V2_EXIT_TIMESTAMP=Wed 2026-10-07 18:52:40 MSK\nBACKUP_LAST_RUN_LINE_COUNT=9\nREC|BACKUP_LAST_RUN|IDX=1|2026-10-07T15:17:53+03:00 pve01 systemd[1]: Starting homelab-backup-v2.service - Homelab Backup V2 manifest-driven scheduler...\nREC|BACKUP_LAST_RUN|IDX=2|2026-10-07T15:17:53+03:00 pve01 homelab-backup-v2[892625]: SELFTEST_REPLACEMENT486=PASS\nREC|BACKUP_LAST_RUN|IDX=3|2026-10-07T15:17:59+03:00 pve01 homelab-backup-v2[892625]: SCHEDULE_TARGET=guest-pve01-lxc-112\nREC|BACKUP_LAST_RUN|IDX=4|2026-10-07T15:17:59+03:00 pve01 homelab-backup-v2[892625]: SCHEDULE_RESULT=FAIL\nREC|BACKUP_LAST_RUN|IDX=5|2026-10-07T15:17:59+03:00 pve01 homelab-backup-v2[892625]: SCHEDULE_REASON=CT112_PIPELINE_FAILED\nREC|BACKUP_LAST_RUN|IDX=6|2026-10-07T15:17:59+03:00 pve01 systemd[1]: homelab-backup-v2.service: Main process exited, code=exited, status=2/INVALIDARGUMENT\nREC|BACKUP_LAST_RUN|IDX=7|2026-10-07T15:17:59+03:00 pve01 systemd[1]: homelab-backup-v2.service: Failed with result 'exit-code'.\nREC|BACKUP_LAST_RUN|IDX=8|2026-10-07T15:17:59+03:00 pve01 systemd[1]: Failed to start homelab-backup-v2.service - Homelab Backup V2 manifest-driven scheduler.\nREC|BACKUP_LAST_RUN|IDX=9|2026-10-07T15:17:59+03:00 pve01 systemd[1]: homelab-backup-v2.service: Consumed 6.058s CPU time, 160M memory peak.\nBACKUP_LAST_TARGET=guest-pve01-lxc-112\nBACKUP_V2_EXEC_BASENAME=homelab-backup-v2\nBACKUP_V2_EXEC_PATH_SHA256=6975cd3060e3ca47d095db1fbdbea19ad56480e046e87179d0c5e6fb53b03d87\nBACKUP_V2_EXEC_SHA256=894f8ea346b53a3d7846dbd6eeb5b89333957eb6d7a4f2f64fd4557cae176e1c\nREC|BACKUP_SOURCE|IDX=1|BASENAME=targets.json|PATH_SHA256=d74784d4bb12db672527be08336f7cf5b2a86dab2d05f63990aed27a1bff9e6a|SHA256=7f413e4a3bc276be668ad0d7a877a0f2b2bd64bf1dead9cb929d966b25a44e25|SIZE=7424|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|1|11: \"logical_id\": \"ct110\",\nSRC|BACKUP|1|14: \"vmid\": 110\nSRC|BACKUP|1|21: \"logical_id\": \"ct111\",\nSRC|BACKUP|1|24: \"vmid\": 111\nSRC|BACKUP|1|31: \"logical_id\": \"ct112\",\nSRC|BACKUP|1|34: \"vmid\": 112\nSRC|BACKUP|1|41: \"logical_id\": \"ct113\",\nSRC|BACKUP|1|44: \"vmid\": 113\nSRC|BACKUP|1|51: \"logical_id\": \"vm130\",\nSRC|BACKUP|1|54: \"vmid\": 130\nSRC|BACKUP|1|61: \"logical_id\": \"vm150\",\nSRC|BACKUP|1|64: \"vmid\": 150\nSRC|BACKUP|1|71: \"logical_id\": \"vm160\",\nSRC|BACKUP|1|74: \"vmid\": 160\nSRC|BACKUP|1|81: \"logical_id\": \"vm170\",\nSRC|BACKUP|1|84: \"vmid\": 170\nSRC|BACKUP|1|91: \"logical_id\": \"vm171\",\nSRC|BACKUP|1|94: \"vmid\": 171\nSRC|BACKUP|1|101: \"logical_id\": \"vm190\",\nSRC|BACKUP|1|104: \"vmid\": 190\nSRC|BACKUP|1|111: \"logical_id\": \"vm210\",\nSRC|BACKUP|1|114: \"vmid\": 210\nSRC|BACKUP|1|121: \"logical_id\": \"vm211\",\nSRC|BACKUP|1|124: \"vmid\": 211\nSRC|BACKUP|1|131: \"logical_id\": \"vm9130\",\nSRC|BACKUP|1|134: \"vmid\": 9130\nSRC|BACKUP|1|140: \"logical_id\": \"node-pve01\",\nSRC|BACKUP|1|149: \"logical_id\": \"node-pve02\",\nSRC|BACKUP|1|158: \"logical_id\": \"node-pve03\",\nSRC|BACKUP|1|169: \"logical_id\": \"md-relay\",\nSRC|BACKUP|1|181: \"logical_id\": \"spb-ingress\",\nSRC|BACKUP|1|193: \"logical_id\": \"us-netbird\",\nSRC|BACKUP|1|203: \"logical_id\": \"router-netcraze\",\nSRC|BACKUP|1|214: \"logical_id\": \"xf-codevipe\",\nSRC|BACKUP|1|219: \"vmid\": 160\nSRC|BACKUP|1|228: \"logical_id\": \"xf-dsmods\",\nSRC|BACKUP|1|233: \"vmid\": 160\nSRC|BACKUP|1|242: \"logical_id\": \"xf-kingofwolk\",\nSRC|BACKUP|1|247: \"vmid\": 160\nSRC|BACKUP|1|256: \"logical_id\": \"xf-newfi\",\nREC|BACKUP_SOURCE|IDX=2|BASENAME=adapter.py|PATH_SHA256=7b83a84a2c8dbee6051e4019d709ef29baf2c553123c82508796b55422db0cf8|SHA256=18eb29cef165371b48bcb78e1a456e1939e6eff253787218133162cc89ab9fa3|SIZE=2989|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=3|BASENAME=CONTRACT.json|PATH_SHA256=9b14e70635455d4e20315d871a3ccf513aefacbb2ee36606a5852ae7fb0740e4|SHA256=a414715f1b91b3701c52073709a80c38218f76e3961618e8af61489211e50c01|SIZE=2077|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=4|BASENAME=pve282.py|PATH_SHA256=fc0733e741ae8d1b7ac67bfa54b7d6948c676c785c84edd58d47f3eabd815756|SHA256=73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012|SIZE=6195|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|4|3:No changes to source guest configuration; no source110 backup or guest deletion.\nSRC|BACKUP|4|24: need(type(job) is dict and type(job.get('vmid')) is int and job['vmid']==TARGET_VMID and\nSRC|BACKUP|4|31: by_id={j['vmid']:j for j in previous}\nSRC|BACKUP|4|34: need({j['vmid'] for j in rows}==set(by_id),'ACCEPTED265_MEMBERSHIP_CHANGED')\nSRC|BACKUP|4|36: need(row['config_sha256']==by_id[row['vmid']]['config_sha256'],'ACCEPTED265_GUEST_CONFIG_CHANGED')\nSRC|BACKUP|4|37: selected=[j for j in rows if j['vmid']==TARGET_VMID]\nSRC|BACKUP|4|44: need(disk.get('slot')=='rootfs' and disk.get('class')=='managed-volume' and disk.get('backup_setting') in ('included','included_default_rootfs'),'CT112_MANAGED_ROOTFS_REQUIRED')\nSRC|BACKUP|4|92: return {**result,'path':str(dest),'vmid':112,'type':'lxc','node':job['node'],'config_sha256':job['config_sha256'],\nREC|BACKUP_SOURCE|IDX=5|BASENAME=test_pve282.py|PATH_SHA256=9156439be14b3f6303b25b8e60a32c9360907bc89e50cbcbdfa2cc2f4cc02454|SHA256=1056407aab76e17181b05e043cb42c086058545a8e0027689ab4e03eee6531c4|SIZE=5785|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|5|17: rows=[{'vmid':v,'type':'lxc' if v in (110,112) else 'qemu','node':'pve01','status':'running','maxdisk':8*G} for v in (110,112,150)]\nSRC|BACKUP|5|28: def test_selects_only112(self):self.assertEqual(f.select112(plan(),plan(),NOW)['vmid'],112)\nSRC|BACKUP|5|33: b=copy.deepcopy(a);self.assertEqual(f.select112(a,b,NOW)['vmid'],112)\nSRC|BACKUP|5|65: def test_marker_scope_ct112_only(self):self.assertEqual(f.TARGET_VMID,112)\nSRC|BACKUP|5|75: return {'path':str(out),'size':len(self.data),'sha256':t.sha(self.data),'identity':list(identity),'vmid':112,'node':'pve01','type':'lxc','producer_rc':0,'config_sha256':j['config_sha256'],'compression_test_ok':True}\nSRC|BACKUP|5|78: z=self.go();self.assertEqual(z['vmid'],112);self.assertEqual(len({a['account_id'] for a in z['replicas']}),2);self.assertEqual(z['local_payload_files_remaining'],0);self.assertEqual(len(self.reader.listed),13);self.assertFalse(z['guest_restore_verified']);self.assertTrue(z['archive_cloud_restore_verified'])\nREC|BACKUP_SOURCE|IDX=6|BASENAME=wrapper.py|PATH_SHA256=970c462224cb43aeb706e9349a8548ff5e1704ddd8abdab59695af2e49ac5004|SHA256=84d2da3fa7c8ab1d9e15db88b6f3835be9c8815bd50ea78022c67adff2f16056|SIZE=5055|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|6|6:CT_ID='guest-pve01-lxc-112'\nSRC|BACKUP|6|8:LOCK=Path('<PATH>')\nSRC|BACKUP|6|15:legacy=_load('_backupv2_legacy481',ROOT<PATH>'legacy_engine.py')\nSRC|BACKUP|6|16:ct112=_load('_backupv2_ct112_481',ROOT<PATH>'ct112_handler.py')\nSRC|BACKUP|6|17:driver=_load('_backupv2_driver454_479',ROOT<PATH>'representative_driver.py')\nSRC|BACKUP|6|19:_legacy_backup_target=legacy.backup_target\nSRC|BACKUP|6|25: ids=[x.get('logical_id') for x in out]\nSRC|BACKUP|6|30: xf=[x for x in rows if x.get('logical_id')=='xf-zakrutim']\nSRC|BACKUP|6|34: return {'logical_id':CT_ID,'scope':'pve01 LXC 112 full-guest archive DR','type':'pve_guest','node':'pve01','vmid':112,\nSRC|BACKUP|6|40:def backup_target(t,green_verify=False):\nSRC|BACKUP|6|41: if not isinstance(t,dict) or t.get('logical_id')!=CT_ID:\nSRC|BACKUP|6|42: return _legacy_backup_target(t,green_verify)\nSRC|BACKUP|6|44: r=ct112.run_target(t,state_writer=legacy.write_state)\nSRC|BACKUP|6|45: return {'logical_id':CT_ID,'generation':r['generation'],'result':'SUCCESS','payload_bytes':r['payload_bytes'],\nSRC|BACKUP|6|53:legacy.backup_target=backup_target\nSRC|BACKUP|6|60: want={'ct112',*LEGACY_IDS}\nSRC|BACKUP|6|61: if {t.get('logical_id') for t in d if isinstance(t,dict) and t.get('green1')}!=want: raise RuntimeError('LEGACY_DEFAULT_GREEN_SET')\nSRC|BACKUP|6|71: if len(eff)!=29 or sum(1 for x in eff if x.get('logical_id')==CT_ID)!=1: raise RuntimeError('EFFECTIVE_TARGETS')\nSRC|BACKUP|6|73: if [x['logical_id'] for x in legacy_rows]!=list(LEGACY_IDS) or ct.get('vmid')!=112: raise RuntimeError('REPRESENTATIVE_PARTITION')\nSRC|BACKUP|6|74: if ct112.selftest() is not True: raise RuntimeError('CT112_HANDLER_SELFTEST')\nREC|BACKUP_SOURCE|IDX=7|BASENAME=representative_driver.py|PATH_SHA256=573948358c3788a0956d8a925bf96ab8611c479afd1855af60c180189a64b8f2|SHA256=b3050a8f95e6d9826a4f0786cd3ca32012b6ab10486d10e4981b50b8a0affff2|SIZE=4214|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|7|25:CT112_ID='guest-pve01-lxc-112'\nSRC|BACKUP|7|33:def _logical_id(target: Mapping[str, Any]) -> str:\nSRC|BACKUP|7|34: value=target.get('logical_id') if isinstance(target, Mapping) else None\nSRC|BACKUP|7|43: logical_id=_logical_id(target)\nSRC|BACKUP|7|44: if logical_id not in wanted:\nSRC|BACKUP|7|46: if logical_id in selected:\nSRC|BACKUP|7|48: selected[logical_id]=target\nSRC|BACKUP|7|72: def write_state(logical_id,result,**kw):\nSRC|BACKUP|7|73: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|7|75: payload={'logical_id':logical_id,'result':result,'meta':kw,'schema_version':1}\nSRC|BACKUP|7|76: _atomic_json(root<PATH>'.json'),payload)\nSRC|BACKUP|7|80: logical_id=_logical_id(target)\nSRC|BACKUP|7|81: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|7|83: backup=getattr(engine,'backup_target',None)\nSRC|BACKUP|7|84: if not callable(backup):\nSRC|BACKUP|7|91: return backup(target,True)\nSRC|BACKUP|7|95:def _validate_ct112_result(result):\nSRC|BACKUP|7|98: if result.get('logical_id')!=CT112_ID or result.get('status')!='OK':\nSRC|BACKUP|7|106:def run_representative(engine, targets, ct112_callback: Callable[[Mapping[str, Any]], Any]):\nSRC|BACKUP|7|107: if not callable(ct112_callback):\nSRC|BACKUP|7|109: legacy,ct112=partition_targets(targets)\nSRC|BACKUP|7|110: results=[_validate_ct112_result(ct112_callback(ct112))]\nREC|BACKUP_SOURCE|IDX=8|BASENAME=ct112_handler.py|PATH_SHA256=c9ce1d4beda3e8569c472019224ffe500ece19d79ea538eef353b2f91100675e|SHA256=e7b027de9a53d7219dd80c9d8e05f0eae0f53db90a53363c64dfa016815c0d00|SIZE=7923|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|8|9:CT_ID='guest-pve01-lxc-112'\nSRC|BACKUP|8|49: vmid=r.get('vmid')\nSRC|BACKUP|8|50: if type(vmid) is not int:raise RuntimeError('PVE_VMID_SCHEMA')\nSRC|BACKUP|8|51: configs[vmid]=_json_cmd(f\"<PATH>'type']}<PATH>\")\nSRC|BACKUP|8|77: def __init__(self,work,entries,binding,guard,deadline,logical_id):\nSRC|BACKUP|8|78: self.work=Path(work);self.entries=entries;self.binding=binding;self.guard=guard;self.deadline=deadline;self.logical_id=logical_id\nSRC|BACKUP|8|85: self.inner=large.ReadOnlyLarge(str(RCLONE),self.snapshot,e,bind,self.guard,self.work,self.deadline,self.logical_id)\nSRC|BACKUP|8|101: if not isinstance(target,dict) or target.get('logical_id')!=CT_ID or target.get('vmid')!=112:return (_ for _ in ()).throw(RuntimeError('CT112_DESCRIPTOR'))\nSRC|BACKUP|8|113: work=STAGING<PATH>'backup-v2-'+generation);work.mkdir(mode=0o700,parents=False,exist_ok=False)\nREC|BACKUP_SOURCE|IDX=9|BASENAME=legacy_engine.py|PATH_SHA256=88ab68bf67a35e0d0b255725cf1d80a6bc6e1d39d0208f2cc2551fdaedd35b49|SHA256=b6e79f087b9f1d21dac4f77a7b46b743299bbb85bc716e80d2ea67c2e038bcd7|SIZE=59719|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|9|6:STATE_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|9|7:CONFIG_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|9|9:WORK_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|9|10:ENGINE_PATH=pathlib.Path('<PATH>')\nSRC|BACKUP|9|25:GUEST266=pathlib.Path('<PATH>')\nSRC|BACKUP|9|27:P270=pathlib.Path('<PATH>')\nSRC|BACKUP|9|29:P282=pathlib.Path('<PATH>')\nSRC|BACKUP|9|31:P265=pathlib.Path('<PATH>')\nSRC|BACKUP|9|35: (pathlib.Path('<PATH>'),'e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2'),\nSRC|BACKUP|9|36: (pathlib.Path('<PATH>'),'b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688'),\nSRC|BACKUP|9|37: (pathlib.Path('<PATH>'),'a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16'),\nSRC|BACKUP|9|38: (pathlib.Path('<PATH>'),'db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060'),\nSRC|BACKUP|9|39: (pathlib.Path('<PATH>'),'5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a'),\nSRC|BACKUP|9|46: pathlib.Path('<PATH>'),\nSRC|BACKUP|9|47: pathlib.Path('<PATH>'),\nSRC|BACKUP|9|48: pathlib.Path('<PATH>'),\nSRC|BACKUP|9|49: pathlib.Path('<PATH>'),\nSRC|BACKUP|9|50: pathlib.Path('<PATH>'),\nSRC|BACKUP|9|51: pathlib.Path('<PATH>'),\nSRC|BACKUP|9|52: pathlib.Path('<PATH>'),\nSRC|BACKUP|9|53: pathlib.Path('<PATH>'),\nSRC|BACKUP|9|54: pathlib.Path('<PATH>'),\nSRC|BACKUP|9|55: pathlib.Path('<PATH>'),\nSRC|BACKUP|9|56: pathlib.Path('<PATH>'),\nSRC|BACKUP|9|132:def remote_generation_path(scope,logical_id,generation):\nSRC|BACKUP|9|134: for x in (scope,logical_id,generation):\nSRC|BACKUP|9|136: return f'homelab-backups<PATH>'\nSRC|BACKUP|9|138:def make_manifest(scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta):\nSRC|BACKUP|9|142: return {'schema':2,'scope':scope,'logical_id':logical_id,'generation':generation,'created_at_utc':utcnow(),\nSRC|BACKUP|9|153: for vmid,typ in [(110,'lxc'),(111,'lxc'),(112,'lxc'),(113,'lxc'),(130,'qemu'),(150,'qemu'),(160,'qemu'),(170,'qemu'),(171,'qemu'),(190,'qemu'),(210,'qemu'),(211,'qemu'),(9130,'qemu')]:\nSRC|BACKUP|9|154: out.append({'logical_id':('ct' if typ=='lxc' else 'vm')+str(vmid),'scope':'pve','type':'pve_guest','vmid':vmid,'guest_type':typ,'due_seconds':d,'enabled':True,'green1':vmid==112})\nSRC|BACKUP|9|156: out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})\nSRC|BACKUP|9|158: {'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'<IP>','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|9|159: {'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'<IP>','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|9|160: {'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'<IP>','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh<PATH>','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|9|161: {'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|9|171: for slug,vmid,node,root,db,strategy in sites:\nSRC|BACKUP|9|172: out.append({'logical_id':'xf-'+slug,'scope':'xenforo','type':'xenforo','slug':slug,'vmid':vmid,'node':node,'app_root':root,'db_name':db,'dump_strategy':strategy,'due_seconds':d,'enabled':True,'green1':slug in ('codevipe','zakrutim')})\nSRC|BACKUP|9|173: out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})\nSRC|BACKUP|9|182: last=int(state.get(t['logical_id'],{}).get('last_success_epoch',0))\nREC|BACKUP_SOURCE|IDX=10|BASENAME=adapter.py|PATH_SHA256=1dcd5f3768400588c99627c664c63ce90446bd5bcaca5a519eb135c1a6722f64|SHA256=18eb29cef165371b48bcb78e1a456e1939e6eff253787218133162cc89ab9fa3|SIZE=2989|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=11|BASENAME=CONTRACT.json|PATH_SHA256=7ae49f9920b6153712ae105caade556102e12e32361c2114832c1c3c9d1eb9b3|SHA256=a414715f1b91b3701c52073709a80c38218f76e3961618e8af61489211e50c01|SIZE=2077|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=12|BASENAME=pve282.py|PATH_SHA256=4f3deeb1f84da0a2851bbe208013409179a4c09ab2ba6459670b1c2f8cc83fda|SHA256=73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012|SIZE=6195|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|12|3:No changes to source guest configuration; no source110 backup or guest deletion.\nSRC|BACKUP|12|24: need(type(job) is dict and type(job.get('vmid')) is int and job['vmid']==TARGET_VMID and\nSRC|BACKUP|12|31: by_id={j['vmid']:j for j in previous}\nSRC|BACKUP|12|34: need({j['vmid'] for j in rows}==set(by_id),'ACCEPTED265_MEMBERSHIP_CHANGED')\nSRC|BACKUP|12|36: need(row['config_sha256']==by_id[row['vmid']]['config_sha256'],'ACCEPTED265_GUEST_CONFIG_CHANGED')\nSRC|BACKUP|12|37: selected=[j for j in rows if j['vmid']==TARGET_VMID]\nSRC|BACKUP|12|44: need(disk.get('slot')=='rootfs' and disk.get('class')=='managed-volume' and disk.get('backup_setting') in ('included','included_default_rootfs'),'CT112_MANAGED_ROOTFS_REQUIRED')\nSRC|BACKUP|12|92: return {**result,'path':str(dest),'vmid':112,'type':'lxc','node':job['node'],'config_sha256':job['config_sha256'],\nREC|BACKUP_SOURCE|IDX=13|BASENAME=test_pve282.py|PATH_SHA256=f46876c3beb288acd407b4a4c3df7d4f3195ed2482cf8913b7f507a10e304819|SHA256=1056407aab76e17181b05e043cb42c086058545a8e0027689ab4e03eee6531c4|SIZE=5785|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|13|17: rows=[{'vmid':v,'type':'lxc' if v in (110,112) else 'qemu','node':'pve01','status':'running','maxdisk':8*G} for v in (110,112,150)]\nSRC|BACKUP|13|28: def test_selects_only112(self):self.assertEqual(f.select112(plan(),plan(),NOW)['vmid'],112)\nSRC|BACKUP|13|33: b=copy.deepcopy(a);self.assertEqual(f.select112(a,b,NOW)['vmid'],112)\nSRC|BACKUP|13|65: def test_marker_scope_ct112_only(self):self.assertEqual(f.TARGET_VMID,112)\nSRC|BACKUP|13|75: return {'path':str(out),'size':len(self.data),'sha256':t.sha(self.data),'identity':list(identity),'vmid':112,'node':'pve01','type':'lxc','producer_rc':0,'config_sha256':j['config_sha256'],'compression_test_ok':True}\nSRC|BACKUP|13|78: z=self.go();self.assertEqual(z['vmid'],112);self.assertEqual(len({a['account_id'] for a in z['replicas']}),2);self.assertEqual(z['local_payload_files_remaining'],0);self.assertEqual(len(self.reader.listed),13);self.assertFalse(z['guest_restore_verified']);self.assertTrue(z['archive_cloud_restore_verified'])\nREC|BACKUP_SOURCE|IDX=14|BASENAME=wrapper.py|PATH_SHA256=5343a2cb3b967ba0af47b0a4ccf37c6ef8aef6e492f483660000892ea10ac2b9|SHA256=e5b0cd618eb7925da84255a8d7e348ae513da5953937d0bce8c3a139b965c3b2|SIZE=5055|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|14|6:CT_ID='guest-pve01-lxc-112'\nSRC|BACKUP|14|8:LOCK=Path('<PATH>')\nSRC|BACKUP|14|15:legacy=_load('_backupv2_legacy482',ROOT<PATH>'legacy_engine.py')\nSRC|BACKUP|14|16:ct112=_load('_backupv2_ct112_482',ROOT<PATH>'ct112_handler.py')\nSRC|BACKUP|14|17:driver=_load('_backupv2_driver454_479',ROOT<PATH>'representative_driver.py')\nSRC|BACKUP|14|19:_legacy_backup_target=legacy.backup_target\nSRC|BACKUP|14|25: ids=[x.get('logical_id') for x in out]\nSRC|BACKUP|14|30: xf=[x for x in rows if x.get('logical_id')=='xf-zakrutim']\nSRC|BACKUP|14|34: return {'logical_id':CT_ID,'scope':'pve01 LXC 112 full-guest archive DR','type':'pve_guest','node':'pve01','vmid':112,\nSRC|BACKUP|14|40:def backup_target(t,green_verify=False):\nSRC|BACKUP|14|41: if not isinstance(t,dict) or t.get('logical_id')!=CT_ID:\nSRC|BACKUP|14|42: return _legacy_backup_target(t,green_verify)\nSRC|BACKUP|14|44: r=ct112.run_target(t,state_writer=legacy.write_state)\nSRC|BACKUP|14|45: return {'logical_id':CT_ID,'generation':r['generation'],'result':'SUCCESS','payload_bytes':r['payload_bytes'],\nSRC|BACKUP|14|53:legacy.backup_target=backup_target\nSRC|BACKUP|14|60: want={'ct112',*LEGACY_IDS}\nSRC|BACKUP|14|61: if {t.get('logical_id') for t in d if isinstance(t,dict) and t.get('green1')}!=want: raise RuntimeError('LEGACY_DEFAULT_GREEN_SET')\nSRC|BACKUP|14|71: if len(eff)!=29 or sum(1 for x in eff if x.get('logical_id')==CT_ID)!=1: raise RuntimeError('EFFECTIVE_TARGETS')\nSRC|BACKUP|14|73: if [x['logical_id'] for x in legacy_rows]!=list(LEGACY_IDS) or ct.get('vmid')!=112: raise RuntimeError('REPRESENTATIVE_PARTITION')\nSRC|BACKUP|14|74: if ct112.selftest() is not True: raise RuntimeError('CT112_HANDLER_SELFTEST')\nREC|BACKUP_SOURCE|IDX=15|BASENAME=representative_driver.py|PATH_SHA256=9e26c629b215d59fb03b3a5f1beff0cd314e90d00590665fa0b15f2766508186|SHA256=b3050a8f95e6d9826a4f0786cd3ca32012b6ab10486d10e4981b50b8a0affff2|SIZE=4214|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|15|25:CT112_ID='guest-pve01-lxc-112'\nSRC|BACKUP|15|33:def _logical_id(target: Mapping[str, Any]) -> str:\nSRC|BACKUP|15|34: value=target.get('logical_id') if isinstance(target, Mapping) else None\nSRC|BACKUP|15|43: logical_id=_logical_id(target)\nSRC|BACKUP|15|44: if logical_id not in wanted:\nSRC|BACKUP|15|46: if logical_id in selected:\nSRC|BACKUP|15|48: selected[logical_id]=target\nSRC|BACKUP|15|72: def write_state(logical_id,result,**kw):\nSRC|BACKUP|15|73: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|15|75: payload={'logical_id':logical_id,'result':result,'meta':kw,'schema_version':1}\nSRC|BACKUP|15|76: _atomic_json(root<PATH>'.json'),payload)\nSRC|BACKUP|15|80: logical_id=_logical_id(target)\nSRC|BACKUP|15|81: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|15|83: backup=getattr(engine,'backup_target',None)\nSRC|BACKUP|15|84: if not callable(backup):\nSRC|BACKUP|15|91: return backup(target,True)\nSRC|BACKUP|15|95:def _validate_ct112_result(result):\nSRC|BACKUP|15|98: if result.get('logical_id')!=CT112_ID or result.get('status')!='OK':\nSRC|BACKUP|15|106:def run_representative(engine, targets, ct112_callback: Callable[[Mapping[str, Any]], Any]):\nSRC|BACKUP|15|107: if not callable(ct112_callback):\nSRC|BACKUP|15|109: legacy,ct112=partition_targets(targets)\nSRC|BACKUP|15|110: results=[_validate_ct112_result(ct112_callback(ct112))]\nREC|BACKUP_SOURCE|IDX=16|BASENAME=ct112_handler.py|PATH_SHA256=edb685d36b5c3d5a001dd7ce8f24041cb85e35a98f561caf0073645b67f27cae|SHA256=e7b027de9a53d7219dd80c9d8e05f0eae0f53db90a53363c64dfa016815c0d00|SIZE=7923|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|16|9:CT_ID='guest-pve01-lxc-112'\nSRC|BACKUP|16|49: vmid=r.get('vmid')\nSRC|BACKUP|16|50: if type(vmid) is not int:raise RuntimeError('PVE_VMID_SCHEMA')\nSRC|BACKUP|16|51: configs[vmid]=_json_cmd(f\"<PATH>'type']}<PATH>\")\nSRC|BACKUP|16|77: def __init__(self,work,entries,binding,guard,deadline,logical_id):\nSRC|BACKUP|16|78: self.work=Path(work);self.entries=entries;self.binding=binding;self.guard=guard;self.deadline=deadline;self.logical_id=logical_id\nSRC|BACKUP|16|85: self.inner=large.ReadOnlyLarge(str(RCLONE),self.snapshot,e,bind,self.guard,self.work,self.deadline,self.logical_id)\nSRC|BACKUP|16|101: if not isinstance(target,dict) or target.get('logical_id')!=CT_ID or target.get('vmid')!=112:return (_ for _ in ()).throw(RuntimeError('CT112_DESCRIPTOR'))\nSRC|BACKUP|16|113: work=STAGING<PATH>'backup-v2-'+generation);work.mkdir(mode=0o700,parents=False,exist_ok=False)\nREC|BACKUP_SOURCE|IDX=17|BASENAME=legacy_engine.py|PATH_SHA256=ed37300bf21f40701d61084225758267688ee569a15a9a8f5e7e1f2d1d95a496|SHA256=b6e79f087b9f1d21dac4f77a7b46b743299bbb85bc716e80d2ea67c2e038bcd7|SIZE=59719|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|17|6:STATE_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|17|7:CONFIG_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|17|9:WORK_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|17|10:ENGINE_PATH=pathlib.Path('<PATH>')\nSRC|BACKUP|17|25:GUEST266=pathlib.Path('<PATH>')\nSRC|BACKUP|17|27:P270=pathlib.Path('<PATH>')\nSRC|BACKUP|17|29:P282=pathlib.Path('<PATH>')\nSRC|BACKUP|17|31:P265=pathlib.Path('<PATH>')\nSRC|BACKUP|17|35: (pathlib.Path('<PATH>'),'e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2'),\nSRC|BACKUP|17|36: (pathlib.Path('<PATH>'),'b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688'),\nSRC|BACKUP|17|37: (pathlib.Path('<PATH>'),'a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16'),\nSRC|BACKUP|17|38: (pathlib.Path('<PATH>'),'db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060'),\nSRC|BACKUP|17|39: (pathlib.Path('<PATH>'),'5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a'),\nSRC|BACKUP|17|46: pathlib.Path('<PATH>'),\nSRC|BACKUP|17|47: pathlib.Path('<PATH>'),\nSRC|BACKUP|17|48: pathlib.Path('<PATH>'),\nSRC|BACKUP|17|49: pathlib.Path('<PATH>'),\nSRC|BACKUP|17|50: pathlib.Path('<PATH>'),\nSRC|BACKUP|17|51: pathlib.Path('<PATH>'),\nSRC|BACKUP|17|52: pathlib.Path('<PATH>'),\nSRC|BACKUP|17|53: pathlib.Path('<PATH>'),\nSRC|BACKUP|17|54: pathlib.Path('<PATH>'),\nSRC|BACKUP|17|55: pathlib.Path('<PATH>'),\nSRC|BACKUP|17|56: pathlib.Path('<PATH>'),\nSRC|BACKUP|17|132:def remote_generation_path(scope,logical_id,generation):\nSRC|BACKUP|17|134: for x in (scope,logical_id,generation):\nSRC|BACKUP|17|136: return f'homelab-backups<PATH>'\nSRC|BACKUP|17|138:def make_manifest(scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta):\nSRC|BACKUP|17|142: return {'schema':2,'scope':scope,'logical_id':logical_id,'generation':generation,'created_at_utc':utcnow(),\nSRC|BACKUP|17|153: for vmid,typ in [(110,'lxc'),(111,'lxc'),(112,'lxc'),(113,'lxc'),(130,'qemu'),(150,'qemu'),(160,'qemu'),(170,'qemu'),(171,'qemu'),(190,'qemu'),(210,'qemu'),(211,'qemu'),(9130,'qemu')]:\nSRC|BACKUP|17|154: out.append({'logical_id':('ct' if typ=='lxc' else 'vm')+str(vmid),'scope':'pve','type':'pve_guest','vmid':vmid,'guest_type':typ,'due_seconds':d,'enabled':True,'green1':vmid==112})\nSRC|BACKUP|17|156: out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})\nSRC|BACKUP|17|158: {'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'<IP>','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|17|159: {'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'<IP>','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|17|160: {'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'<IP>','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh<PATH>','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|17|161: {'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|17|171: for slug,vmid,node,root,db,strategy in sites:\nSRC|BACKUP|17|172: out.append({'logical_id':'xf-'+slug,'scope':'xenforo','type':'xenforo','slug':slug,'vmid':vmid,'node':node,'app_root':root,'db_name':db,'dump_strategy':strategy,'due_seconds':d,'enabled':True,'green1':slug in ('codevipe','zakrutim')})\nSRC|BACKUP|17|173: out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})\nSRC|BACKUP|17|182: last=int(state.get(t['logical_id'],{}).get('last_success_epoch',0))\nREC|BACKUP_SOURCE|IDX=18|BASENAME=adapter.py|PATH_SHA256=f7f1e133ae3c2af246c3360a03844597b9dba8cddced7ff2fb2a41367812fbdc|SHA256=18eb29cef165371b48bcb78e1a456e1939e6eff253787218133162cc89ab9fa3|SIZE=2989|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=19|BASENAME=CONTRACT.json|PATH_SHA256=b48d18d4e534612a5e232dca282f9f3c55b62837b799f311b6489b3a3fe96329|SHA256=a414715f1b91b3701c52073709a80c38218f76e3961618e8af61489211e50c01|SIZE=2077|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=20|BASENAME=pve282.py|PATH_SHA256=8796140ef5af396cf8590b2c5159e82c8e9b6104ef7f7f7934f4e59c27e2720c|SHA256=73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012|SIZE=6195|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|20|3:No changes to source guest configuration; no source110 backup or guest deletion.\nSRC|BACKUP|20|24: need(type(job) is dict and type(job.get('vmid')) is int and job['vmid']==TARGET_VMID and\nSRC|BACKUP|20|31: by_id={j['vmid']:j for j in previous}\nSRC|BACKUP|20|34: need({j['vmid'] for j in rows}==set(by_id),'ACCEPTED265_MEMBERSHIP_CHANGED')\nSRC|BACKUP|20|36: need(row['config_sha256']==by_id[row['vmid']]['config_sha256'],'ACCEPTED265_GUEST_CONFIG_CHANGED')\nSRC|BACKUP|20|37: selected=[j for j in rows if j['vmid']==TARGET_VMID]\nSRC|BACKUP|20|44: need(disk.get('slot')=='rootfs' and disk.get('class')=='managed-volume' and disk.get('backup_setting') in ('included','included_default_rootfs'),'CT112_MANAGED_ROOTFS_REQUIRED')\nSRC|BACKUP|20|92: return {**result,'path':str(dest),'vmid':112,'type':'lxc','node':job['node'],'config_sha256':job['config_sha256'],\nREC|BACKUP_SOURCE|IDX=21|BASENAME=test_pve282.py|PATH_SHA256=029692e986363923df11409e7451c9a279ea9f0bb533310aa28cebe58bdcf836|SHA256=1056407aab76e17181b05e043cb42c086058545a8e0027689ab4e03eee6531c4|SIZE=5785|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|21|17: rows=[{'vmid':v,'type':'lxc' if v in (110,112) else 'qemu','node':'pve01','status':'running','maxdisk':8*G} for v in (110,112,150)]\nSRC|BACKUP|21|28: def test_selects_only112(self):self.assertEqual(f.select112(plan(),plan(),NOW)['vmid'],112)\nSRC|BACKUP|21|33: b=copy.deepcopy(a);self.assertEqual(f.select112(a,b,NOW)['vmid'],112)\nSRC|BACKUP|21|65: def test_marker_scope_ct112_only(self):self.assertEqual(f.TARGET_VMID,112)\nSRC|BACKUP|21|75: return {'path':str(out),'size':len(self.data),'sha256':t.sha(self.data),'identity':list(identity),'vmid':112,'node':'pve01','type':'lxc','producer_rc':0,'config_sha256':j['config_sha256'],'compression_test_ok':True}\nSRC|BACKUP|21|78: z=self.go();self.assertEqual(z['vmid'],112);self.assertEqual(len({a['account_id'] for a in z['replicas']}),2);self.assertEqual(z['local_payload_files_remaining'],0);self.assertEqual(len(self.reader.listed),13);self.assertFalse(z['guest_restore_verified']);self.assertTrue(z['archive_cloud_restore_verified'])\nREC|BACKUP_SOURCE|IDX=22|BASENAME=wrapper.py|PATH_SHA256=e7e837977fcd9f64f48321b38262fe399397d8938ce19d7a20ae3128c6c4d8b0|SHA256=d58b8bc842ac3ba3f1f9cf3dc844dd1445c196e0e93fda8ce5f4a0fd18f2e115|SIZE=5055|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|22|6:CT_ID='guest-pve01-lxc-112'\nSRC|BACKUP|22|8:LOCK=Path('<PATH>')\nSRC|BACKUP|22|15:legacy=_load('_backupv2_legacy485',ROOT<PATH>'legacy_engine.py')\nSRC|BACKUP|22|16:ct112=_load('_backupv2_ct112_485',ROOT<PATH>'ct112_handler.py')\nSRC|BACKUP|22|17:driver=_load('_backupv2_driver454_479',ROOT<PATH>'representative_driver.py')\nSRC|BACKUP|22|19:_legacy_backup_target=legacy.backup_target\nSRC|BACKUP|22|25: ids=[x.get('logical_id') for x in out]\nSRC|BACKUP|22|30: xf=[x for x in rows if x.get('logical_id')=='xf-zakrutim']\nSRC|BACKUP|22|34: return {'logical_id':CT_ID,'scope':'pve01 LXC 112 full-guest archive DR','type':'pve_guest','node':'pve01','vmid':112,\nSRC|BACKUP|22|40:def backup_target(t,green_verify=False):\nSRC|BACKUP|22|41: if not isinstance(t,dict) or t.get('logical_id')!=CT_ID:\nSRC|BACKUP|22|42: return _legacy_backup_target(t,green_verify)\nSRC|BACKUP|22|44: r=ct112.run_target(t,state_writer=legacy.write_state)\nSRC|BACKUP|22|45: return {'logical_id':CT_ID,'generation':r['generation'],'result':'SUCCESS','payload_bytes':r['payload_bytes'],\nSRC|BACKUP|22|53:legacy.backup_target=backup_target\nSRC|BACKUP|22|60: want={'ct112',*LEGACY_IDS}\nSRC|BACKUP|22|61: if {t.get('logical_id') for t in d if isinstance(t,dict) and t.get('green1')}!=want: raise RuntimeError('LEGACY_DEFAULT_GREEN_SET')\nSRC|BACKUP|22|71: if len(eff)!=29 or sum(1 for x in eff if x.get('logical_id')==CT_ID)!=1: raise RuntimeError('EFFECTIVE_TARGETS')\nSRC|BACKUP|22|73: if [x['logical_id'] for x in legacy_rows]!=list(LEGACY_IDS) or ct.get('vmid')!=112: raise RuntimeError('REPRESENTATIVE_PARTITION')\nSRC|BACKUP|22|74: if ct112.selftest() is not True: raise RuntimeError('CT112_HANDLER_SELFTEST')\nREC|BACKUP_SOURCE|IDX=23|BASENAME=representative_driver.py|PATH_SHA256=1fdeed3d8f992cdc0d64df2e2653fa8b79f25986fe9db4f94c65465d33a8c178|SHA256=b3050a8f95e6d9826a4f0786cd3ca32012b6ab10486d10e4981b50b8a0affff2|SIZE=4214|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|23|25:CT112_ID='guest-pve01-lxc-112'\nSRC|BACKUP|23|33:def _logical_id(target: Mapping[str, Any]) -> str:\nSRC|BACKUP|23|34: value=target.get('logical_id') if isinstance(target, Mapping) else None\nSRC|BACKUP|23|43: logical_id=_logical_id(target)\nSRC|BACKUP|23|44: if logical_id not in wanted:\nSRC|BACKUP|23|46: if logical_id in selected:\nSRC|BACKUP|23|48: selected[logical_id]=target\nSRC|BACKUP|23|72: def write_state(logical_id,result,**kw):\nSRC|BACKUP|23|73: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|23|75: payload={'logical_id':logical_id,'result':result,'meta':kw,'schema_version':1}\nSRC|BACKUP|23|76: _atomic_json(root<PATH>'.json'),payload)\nSRC|BACKUP|23|80: logical_id=_logical_id(target)\nSRC|BACKUP|23|81: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|23|83: backup=getattr(engine,'backup_target',None)\nSRC|BACKUP|23|84: if not callable(backup):\nSRC|BACKUP|23|91: return backup(target,True)\nSRC|BACKUP|23|95:def _validate_ct112_result(result):\nSRC|BACKUP|23|98: if result.get('logical_id')!=CT112_ID or result.get('status')!='OK':\nSRC|BACKUP|23|106:def run_representative(engine, targets, ct112_callback: Callable[[Mapping[str, Any]], Any]):\nSRC|BACKUP|23|107: if not callable(ct112_callback):\nSRC|BACKUP|23|109: legacy,ct112=partition_targets(targets)\nSRC|BACKUP|23|110: results=[_validate_ct112_result(ct112_callback(ct112))]\nREC|BACKUP_SOURCE|IDX=24|BASENAME=ct112_handler.py|PATH_SHA256=355e41038a2b1a4bd36aafd7ab5b2bdf174055ed840bde02497c65c8d4e5a8f3|SHA256=1bad56934074d19bd17ec71471d562b3f3d1d4c2d8fdfbad1897048b50c09c06|SIZE=9799|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|24|9:CT_ID='guest-pve01-lxc-112'\nSRC|BACKUP|24|49: vmid=r.get('vmid')\nSRC|BACKUP|24|50: if type(vmid) is not int:raise RuntimeError('PVE_VMID_SCHEMA')\nSRC|BACKUP|24|51: configs[vmid]=_json_cmd(f\"<PATH>'type']}<PATH>\")\nSRC|BACKUP|24|56:def _select_live_ct112(plan,now,expected_config=None):\nSRC|BACKUP|24|61: vmids=[j.get('vmid') for j in jobs if isinstance(j,dict)]\nSRC|BACKUP|24|62: if len(vmids)!=len(jobs) or len(vmids)!=len(set(vmids)):raise RuntimeError('CT112_PLAN_MEMBERSHIP')\nSRC|BACKUP|24|63: matches=[j for j in jobs if j.get('vmid')==112]\nSRC|BACKUP|24|104: def __init__(self,work,entries,binding,guard,deadline,logical_id):\nSRC|BACKUP|24|105: self.work=Path(work);self.entries=entries;self.binding=binding;self.guard=guard;self.deadline=deadline;self.logical_id=logical_id\nSRC|BACKUP|24|112: self.inner=large.ReadOnlyLarge(str(RCLONE),self.snapshot,e,bind,self.guard,self.work,self.deadline,self.logical_id)\nSRC|BACKUP|24|128: if not isinstance(target,dict) or target.get('logical_id')!=CT_ID or target.get('vmid')!=112:return (_ for _ in ()).throw(RuntimeError('CT112_DESCRIPTOR'))\nSRC|BACKUP|24|131: pvesh_sha=_sha(PVESH);now=int(time.time());current=_fresh_plan(now);job=_select_live_ct112(current,now)\nSRC|BACKUP|24|134: now2=int(time.time());fresh_plan=_fresh_plan(now2);fresh=_select_live_ct112(fresh_plan,now2,expected)\nSRC|BACKUP|24|142: work=STAGING<PATH>'backup-v2-'+generation);work.mkdir(mode=0o700,parents=False,exist_ok=False)\nREC|BACKUP_SOURCE|IDX=25|BASENAME=legacy_engine.py|PATH_SHA256=d3dc1d9e6926e695d76fba16c6c5ffa20cc3f5b80a7ffc4b826ec197468a1cd7|SHA256=b6e79f087b9f1d21dac4f77a7b46b743299bbb85bc716e80d2ea67c2e038bcd7|SIZE=59719|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|25|6:STATE_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|25|7:CONFIG_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|25|9:WORK_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|25|10:ENGINE_PATH=pathlib.Path('<PATH>')\nSRC|BACKUP|25|25:GUEST266=pathlib.Path('<PATH>')\nSRC|BACKUP|25|27:P270=pathlib.Path('<PATH>')\nSRC|BACKUP|25|29:P282=pathlib.Path('<PATH>')\nSRC|BACKUP|25|31:P265=pathlib.Path('<PATH>')\nSRC|BACKUP|25|35: (pathlib.Path('<PATH>'),'e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2'),\nSRC|BACKUP|25|36: (pathlib.Path('<PATH>'),'b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688'),\nSRC|BACKUP|25|37: (pathlib.Path('<PATH>'),'a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16'),\nSRC|BACKUP|25|38: (pathlib.Path('<PATH>'),'db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060'),\nSRC|BACKUP|25|39: (pathlib.Path('<PATH>'),'5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a'),\nSRC|BACKUP|25|46: pathlib.Path('<PATH>'),\nSRC|BACKUP|25|47: pathlib.Path('<PATH>'),\nSRC|BACKUP|25|48: pathlib.Path('<PATH>'),\nSRC|BACKUP|25|49: pathlib.Path('<PATH>'),\nSRC|BACKUP|25|50: pathlib.Path('<PATH>'),\nSRC|BACKUP|25|51: pathlib.Path('<PATH>'),\nSRC|BACKUP|25|52: pathlib.Path('<PATH>'),\nSRC|BACKUP|25|53: pathlib.Path('<PATH>'),\nSRC|BACKUP|25|54: pathlib.Path('<PATH>'),\nSRC|BACKUP|25|55: pathlib.Path('<PATH>'),\nSRC|BACKUP|25|56: pathlib.Path('<PATH>'),\nSRC|BACKUP|25|132:def remote_generation_path(scope,logical_id,generation):\nSRC|BACKUP|25|134: for x in (scope,logical_id,generation):\nSRC|BACKUP|25|136: return f'homelab-backups<PATH>'\nSRC|BACKUP|25|138:def make_manifest(scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta):\nSRC|BACKUP|25|142: return {'schema':2,'scope':scope,'logical_id':logical_id,'generation':generation,'created_at_utc':utcnow(),\nSRC|BACKUP|25|153: for vmid,typ in [(110,'lxc'),(111,'lxc'),(112,'lxc'),(113,'lxc'),(130,'qemu'),(150,'qemu'),(160,'qemu'),(170,'qemu'),(171,'qemu'),(190,'qemu'),(210,'qemu'),(211,'qemu'),(9130,'qemu')]:\nSRC|BACKUP|25|154: out.append({'logical_id':('ct' if typ=='lxc' else 'vm')+str(vmid),'scope':'pve','type':'pve_guest','vmid':vmid,'guest_type':typ,'due_seconds':d,'enabled':True,'green1':vmid==112})\nSRC|BACKUP|25|156: out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})\nSRC|BACKUP|25|158: {'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'<IP>','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|25|159: {'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'<IP>','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|25|160: {'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'<IP>','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh<PATH>','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|25|161: {'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|25|171: for slug,vmid,node,root,db,strategy in sites:\nSRC|BACKUP|25|172: out.append({'logical_id':'xf-'+slug,'scope':'xenforo','type':'xenforo','slug':slug,'vmid':vmid,'node':node,'app_root':root,'db_name':db,'dump_strategy':strategy,'due_seconds':d,'enabled':True,'green1':slug in ('codevipe','zakrutim')})\nSRC|BACKUP|25|173: out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})\nSRC|BACKUP|25|182: last=int(state.get(t['logical_id'],{}).get('last_success_epoch',0))\nREC|BACKUP_SOURCE|IDX=26|BASENAME=entry499.py|PATH_SHA256=a57cf763441990cddc6f94aa8c9ea2521e65222f9a17586674f5d46fdbf3d0a5|SHA256=45d1d34f1d29ffe3e91a3ddb94453987c0740bfbbf892b2b1f2ecbc64043adb0|SIZE=5347|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|26|4:BASE=pathlib.Path('<PATH>')\nSRC|BACKUP|26|9: 'ct112_handler.py':'8cac6e627d5e7abe5d3163cdd24911995a1e3f45c776f9373c2aa68784f5ec6c',\nSRC|BACKUP|26|62: required=('capture_pve_guest','backup_target','load_targets','cluster_inventory','ssh_remote',\nSRC|BACKUP|26|87: rows=wrapper.load_targets(); hits=[x for x in rows if x.get('logical_id')==lid]\nSRC|BACKUP|26|95: if not callable(wrapper.backup_target) or not callable(wrapper.main) or not callable(wrapper.load_targets):\nSRC|BACKUP|26|108: if t.get('guest_type')!='lxc' or t.get('logical_id')=='guest-pve01-lxc-112':\nSRC|BACKUP|26|111: print('PLAN_LXC_RESULT='+json.dumps({'logical_id':t['logical_id'],'vmid':int(t['vmid']),'node':out['job']['node'],'job':out['job']},separators=(',',':'),sort_keys=True),flush=True)\nSRC|BACKUP|26|115: if t.get('logical_id')=='guest-pve01-lxc-112':\nSRC|BACKUP|26|117: out=wrapper.backup_target(t,True)\nREC|BACKUP_SOURCE|IDX=27|BASENAME=representative_driver.py|PATH_SHA256=9b3d2ead5f1fad42dcb5fb02e89deaa371a7639d0d4399b8a7a6a6b95daedcd5|SHA256=b3050a8f95e6d9826a4f0786cd3ca32012b6ab10486d10e4981b50b8a0affff2|SIZE=4214|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|27|25:CT112_ID='guest-pve01-lxc-112'\nSRC|BACKUP|27|33:def _logical_id(target: Mapping[str, Any]) -> str:\nSRC|BACKUP|27|34: value=target.get('logical_id') if isinstance(target, Mapping) else None\nSRC|BACKUP|27|43: logical_id=_logical_id(target)\nSRC|BACKUP|27|44: if logical_id not in wanted:\nSRC|BACKUP|27|46: if logical_id in selected:\nSRC|BACKUP|27|48: selected[logical_id]=target\nSRC|BACKUP|27|72: def write_state(logical_id,result,**kw):\nSRC|BACKUP|27|73: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|27|75: payload={'logical_id':logical_id,'result':result,'meta':kw,'schema_version':1}\nSRC|BACKUP|27|76: _atomic_json(root<PATH>'.json'),payload)\nSRC|BACKUP|27|80: logical_id=_logical_id(target)\nSRC|BACKUP|27|81: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|27|83: backup=getattr(engine,'backup_target',None)\nSRC|BACKUP|27|84: if not callable(backup):\nSRC|BACKUP|27|91: return backup(target,True)\nSRC|BACKUP|27|95:def _validate_ct112_result(result):\nSRC|BACKUP|27|98: if result.get('logical_id')!=CT112_ID or result.get('status')!='OK':\nSRC|BACKUP|27|106:def run_representative(engine, targets, ct112_callback: Callable[[Mapping[str, Any]], Any]):\nSRC|BACKUP|27|107: if not callable(ct112_callback):\nSRC|BACKUP|27|109: legacy,ct112=partition_targets(targets)\nSRC|BACKUP|27|110: results=[_validate_ct112_result(ct112_callback(ct112))]\nREC|BACKUP_SOURCE|IDX=28|BASENAME=CONTRACT.json|PATH_SHA256=a55b8763a0762d3b5173ccb9619c9b5dc8dfc679471706031a61956d75014ac1|SHA256=67c0f9e228eaf5bc35213873f71d60b48a694cf04657aee695697ca434e16d0b|SIZE=2712|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|28|1:{\"candidate\":\"representative-validation-454r1\",\"candidate_411_source_sha256\":{\"adapter.py\":\"18eb29cef165371b48bcb78e1a456e1939e6eff253787218133162cc89ab9fa3\",\"guest266.py\":\"86433bc424d5fa5017c20f7a237c82874b02357a3283660d8a6b0039ef2bc868\",\"large264.py\":\"5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a\",\"nodeplan263.py\":\"db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060\",\"pve265.py\":\"cd2f634414a8e38a3789015aeca5a9b47821f77d7d1fa61dcdbdc866172963be\",\"pve270.py\":\"97015277a4f3f8129c0fd11eb70c06293026366f1f8232a97feeed513a2dbcef\",\"pve282.py\":\"73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012\",\"restore262.py\":\"56d1b961c8d5654d5e2ee2755268db46bd2202bca11e69788febf991cfaa79f1\",\"stream263.py\":\"a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16\",\"transport261.py\":\"b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688\",\"v2core.py\":\"e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2\"},\"ct112_id\":\"guest-pve01-lxc-112\",\"ct112_route\":\"explicit callback only; legacy capture_pve_guest forbidden\",\"ct112_success_contract\":{\"cloud_only_independent_restore_verified\":true,\"local_payload_files_remaining\":0,\"logical_id\":\"guest-pve01-lxc-112\",\"status\":\"OK\"},\"fail_order\":\"CT112 callback validates before any legacy lane\",\"forbidden_entrypoints\":[\"green_run\",\"scheduled_run\",\"bootstrap_vps_keys\",\"ensure_router_known_hosts\"],\"legacy_engine_function_sha256\":{\"backup_target\":\"927366d8e2e505d5eee5a479786d3c2c1a77c4366ecb3d1f81b66f8d36ec9884\",\"capture_pve_guest\":\"b747bb60b88810da9dcf02bd111c0934b33137a5d98d1fe3a9eb43959229f6e1\",\"capture_target\":\"0f272f2564b95d9f47835a5dca084651390231e53e98f6d95e589ddf92b26dab\",\"green_run\":\"f378a0673e74691c47873204df5d26df3afb395a4c38ba8674061e583e71bbf0\",\"load_targets\":\"8442fa26ab380e39c1d997cfc5b443c62ef7ac9eb5ec73ee3646d897e20ed5be\",\"write_state\":\"2a6c1429bd1a500a877dd846c5325618bd02f7a6542233aa21f3160d6d3c259f\"},\"legacy_engine_sha256\":\"b6e79f087b9f1d21dac4f77a7b46b743299bbb85bc716e80d2ea67c2e038bcd7\",\"legacy_ids\":[\"node-pve01\",\"md-relay\",\"spb-ingress\",\"us-netbird\",\"router-netcraze\",\"xf-codevipe\",\"xf-zakrutim\",\"control-bootstrap-v2\"],\"legacy_route\":\"direct backup_target(target, True) only\",\"legacy_state\":\"candidate-owned state directory derived from driver location; no caller state path parameter\",\"next_gate\":\"live read-only driver dry-run before any representative execution\",\"production_promotion\":false,\"purpose\":\"disabled representative validation orchestration only\",\"representative_order\":[\"guest-pve01-lxc-112\",\"node-pve01\",\"md-relay\",\"spb-ingress\",\"us-netbird\",\"router-netcraze\",\"xf-codevipe\",\"xf-zakrutim\",\"control-bootstrap-v2\"],\"scheduler_cutover\":false,\"schema_version\":1}\nREC|BACKUP_SOURCE|IDX=29|BASENAME=adapter.py|PATH_SHA256=db0b103511d7b731e83ecb6eb365a24158bb7c76448238f2665ab411101d1a4d|SHA256=18eb29cef165371b48bcb78e1a456e1939e6eff253787218133162cc89ab9fa3|SIZE=2989|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=30|BASENAME=CONTRACT.json|PATH_SHA256=af91afbaf9ba2ba2f5536e6f8fef228191402adaf760cbcec0e4821f1d0ce4a8|SHA256=a414715f1b91b3701c52073709a80c38218f76e3961618e8af61489211e50c01|SIZE=2077|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=31|BASENAME=pve282.py|PATH_SHA256=80df33825006c6de9450f06dc8859bc420e447a64fc9cc84cca7c4c946f17fc3|SHA256=73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012|SIZE=6195|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|31|3:No changes to source guest configuration; no source110 backup or guest deletion.\nSRC|BACKUP|31|24: need(type(job) is dict and type(job.get('vmid')) is int and job['vmid']==TARGET_VMID and\nSRC|BACKUP|31|31: by_id={j['vmid']:j for j in previous}\nSRC|BACKUP|31|34: need({j['vmid'] for j in rows}==set(by_id),'ACCEPTED265_MEMBERSHIP_CHANGED')\nSRC|BACKUP|31|36: need(row['config_sha256']==by_id[row['vmid']]['config_sha256'],'ACCEPTED265_GUEST_CONFIG_CHANGED')\nSRC|BACKUP|31|37: selected=[j for j in rows if j['vmid']==TARGET_VMID]\nSRC|BACKUP|31|44: need(disk.get('slot')=='rootfs' and disk.get('class')=='managed-volume' and disk.get('backup_setting') in ('included','included_default_rootfs'),'CT112_MANAGED_ROOTFS_REQUIRED')\nSRC|BACKUP|31|92: return {**result,'path':str(dest),'vmid':112,'type':'lxc','node':job['node'],'config_sha256':job['config_sha256'],\nREC|BACKUP_SOURCE|IDX=32|BASENAME=test_pve282.py|PATH_SHA256=6142ee7692a2d7ecfac2f8142309ae148ba4eaaaf94ef3584f91a5e360e91a16|SHA256=1056407aab76e17181b05e043cb42c086058545a8e0027689ab4e03eee6531c4|SIZE=5785|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|32|17: rows=[{'vmid':v,'type':'lxc' if v in (110,112) else 'qemu','node':'pve01','status':'running','maxdisk':8*G} for v in (110,112,150)]\nSRC|BACKUP|32|28: def test_selects_only112(self):self.assertEqual(f.select112(plan(),plan(),NOW)['vmid'],112)\nSRC|BACKUP|32|33: b=copy.deepcopy(a);self.assertEqual(f.select112(a,b,NOW)['vmid'],112)\nSRC|BACKUP|32|65: def test_marker_scope_ct112_only(self):self.assertEqual(f.TARGET_VMID,112)\nSRC|BACKUP|32|75: return {'path':str(out),'size':len(self.data),'sha256':t.sha(self.data),'identity':list(identity),'vmid':112,'node':'pve01','type':'lxc','producer_rc':0,'config_sha256':j['config_sha256'],'compression_test_ok':True}\nSRC|BACKUP|32|78: z=self.go();self.assertEqual(z['vmid'],112);self.assertEqual(len({a['account_id'] for a in z['replicas']}),2);self.assertEqual(z['local_payload_files_remaining'],0);self.assertEqual(len(self.reader.listed),13);self.assertFalse(z['guest_restore_verified']);self.assertTrue(z['archive_cloud_restore_verified'])\nREC|BACKUP_SOURCE|IDX=33|BASENAME=entry496.py|PATH_SHA256=cc7a42167369ec95173b1c46a18f64a6ae4d6d607dd74861f7f3726f729a21c4|SHA256=4931b27337b991f1c7fbc2d3e7599627b3f9304dc19e08c7196257c976bbf770|SIZE=5338|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|33|4:BASE=pathlib.Path('<PATH>')\nSRC|BACKUP|33|9: 'ct112_handler.py':'8cac6e627d5e7abe5d3163cdd24911995a1e3f45c776f9373c2aa68784f5ec6c',\nSRC|BACKUP|33|62: required=('capture_pve_guest','backup_target','load_targets','cluster_inventory','ssh_remote',\nSRC|BACKUP|33|87: rows=wrapper.load_targets(); hits=[x for x in rows if x.get('logical_id')==lid]\nSRC|BACKUP|33|95: if not callable(wrapper.backup_target) or not callable(wrapper.main) or not callable(wrapper.load_targets):\nSRC|BACKUP|33|108: if t.get('guest_type')!='lxc' or t.get('logical_id')=='guest-pve01-lxc-112':\nSRC|BACKUP|33|111: print('PLAN_LXC_RESULT='+json.dumps({'logical_id':t['logical_id'],'vmid':int(t['vmid']),'node':t['node'],'job':out['job']},separators=(',',':'),sort_keys=True),flush=True)\nSRC|BACKUP|33|115: if t.get('logical_id')=='guest-pve01-lxc-112':\nSRC|BACKUP|33|117: out=wrapper.backup_target(t,True)\nREC|BACKUP_SOURCE|IDX=34|BASENAME=adapter.py|PATH_SHA256=34ba987637844ad247a7c1782331b4eb550573ef19d35067c5d63f3ec397ca8e|SHA256=18eb29cef165371b48bcb78e1a456e1939e6eff253787218133162cc89ab9fa3|SIZE=2989|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=35|BASENAME=CONTRACT.json|PATH_SHA256=f979ecf0c3f551c2b7023839e8b192e1e8daac7162666aeb9be4f82f244fb19e|SHA256=a414715f1b91b3701c52073709a80c38218f76e3961618e8af61489211e50c01|SIZE=2077|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=36|BASENAME=pve282.py|PATH_SHA256=afe8df325541e098b462cc527d526030f98371f5764c4c7fe69e7f6cac981825|SHA256=73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012|SIZE=6195|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|36|3:No changes to source guest configuration; no source110 backup or guest deletion.\nSRC|BACKUP|36|24: need(type(job) is dict and type(job.get('vmid')) is int and job['vmid']==TARGET_VMID and\nSRC|BACKUP|36|31: by_id={j['vmid']:j for j in previous}\nSRC|BACKUP|36|34: need({j['vmid'] for j in rows}==set(by_id),'ACCEPTED265_MEMBERSHIP_CHANGED')\nSRC|BACKUP|36|36: need(row['config_sha256']==by_id[row['vmid']]['config_sha256'],'ACCEPTED265_GUEST_CONFIG_CHANGED')\nSRC|BACKUP|36|37: selected=[j for j in rows if j['vmid']==TARGET_VMID]\nSRC|BACKUP|36|44: need(disk.get('slot')=='rootfs' and disk.get('class')=='managed-volume' and disk.get('backup_setting') in ('included','included_default_rootfs'),'CT112_MANAGED_ROOTFS_REQUIRED')\nSRC|BACKUP|36|92: return {**result,'path':str(dest),'vmid':112,'type':'lxc','node':job['node'],'config_sha256':job['config_sha256'],\nREC|BACKUP_SOURCE|IDX=37|BASENAME=test_pve282.py|PATH_SHA256=cdac3273e4e923c9fa4402d95fc45e48df4892a05d959395773f03b04b2e4b99|SHA256=1056407aab76e17181b05e043cb42c086058545a8e0027689ab4e03eee6531c4|SIZE=5785|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|37|17: rows=[{'vmid':v,'type':'lxc' if v in (110,112) else 'qemu','node':'pve01','status':'running','maxdisk':8*G} for v in (110,112,150)]\nSRC|BACKUP|37|28: def test_selects_only112(self):self.assertEqual(f.select112(plan(),plan(),NOW)['vmid'],112)\nSRC|BACKUP|37|33: b=copy.deepcopy(a);self.assertEqual(f.select112(a,b,NOW)['vmid'],112)\nSRC|BACKUP|37|65: def test_marker_scope_ct112_only(self):self.assertEqual(f.TARGET_VMID,112)\nSRC|BACKUP|37|75: return {'path':str(out),'size':len(self.data),'sha256':t.sha(self.data),'identity':list(identity),'vmid':112,'node':'pve01','type':'lxc','producer_rc':0,'config_sha256':j['config_sha256'],'compression_test_ok':True}\nSRC|BACKUP|37|78: z=self.go();self.assertEqual(z['vmid'],112);self.assertEqual(len({a['account_id'] for a in z['replicas']}),2);self.assertEqual(z['local_payload_files_remaining'],0);self.assertEqual(len(self.reader.listed),13);self.assertFalse(z['guest_restore_verified']);self.assertTrue(z['archive_cloud_restore_verified'])\nREC|BACKUP_SOURCE|IDX=38|BASENAME=wrapper.py|PATH_SHA256=b19cfe8a175ebdcafd655280b269e15df30da63a9422430bfe0bf38683210a7f|SHA256=8e6ad619c39105d9c238c0a9f0bd9265dba941f65729cbe03e9f1acbd90ba6cd|SIZE=5055|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|38|6:CT_ID='guest-pve01-lxc-112'\nSRC|BACKUP|38|8:LOCK=Path('<PATH>')\nSRC|BACKUP|38|15:legacy=_load('_backupv2_legacy484',ROOT<PATH>'legacy_engine.py')\nSRC|BACKUP|38|16:ct112=_load('_backupv2_ct112_484',ROOT<PATH>'ct112_handler.py')\nSRC|BACKUP|38|17:driver=_load('_backupv2_driver454_479',ROOT<PATH>'representative_driver.py')\nSRC|BACKUP|38|19:_legacy_backup_target=legacy.backup_target\nSRC|BACKUP|38|25: ids=[x.get('logical_id') for x in out]\nSRC|BACKUP|38|30: xf=[x for x in rows if x.get('logical_id')=='xf-zakrutim']\nSRC|BACKUP|38|34: return {'logical_id':CT_ID,'scope':'pve01 LXC 112 full-guest archive DR','type':'pve_guest','node':'pve01','vmid':112,\nSRC|BACKUP|38|40:def backup_target(t,green_verify=False):\nSRC|BACKUP|38|41: if not isinstance(t,dict) or t.get('logical_id')!=CT_ID:\nSRC|BACKUP|38|42: return _legacy_backup_target(t,green_verify)\nSRC|BACKUP|38|44: r=ct112.run_target(t,state_writer=legacy.write_state)\nSRC|BACKUP|38|45: return {'logical_id':CT_ID,'generation':r['generation'],'result':'SUCCESS','payload_bytes':r['payload_bytes'],\nSRC|BACKUP|38|53:legacy.backup_target=backup_target\nSRC|BACKUP|38|60: want={'ct112',*LEGACY_IDS}\nSRC|BACKUP|38|61: if {t.get('logical_id') for t in d if isinstance(t,dict) and t.get('green1')}!=want: raise RuntimeError('LEGACY_DEFAULT_GREEN_SET')\nSRC|BACKUP|38|71: if len(eff)!=29 or sum(1 for x in eff if x.get('logical_id')==CT_ID)!=1: raise RuntimeError('EFFECTIVE_TARGETS')\nSRC|BACKUP|38|73: if [x['logical_id'] for x in legacy_rows]!=list(LEGACY_IDS) or ct.get('vmid')!=112: raise RuntimeError('REPRESENTATIVE_PARTITION')\nSRC|BACKUP|38|74: if ct112.selftest() is not True: raise RuntimeError('CT112_HANDLER_SELFTEST')\nREC|BACKUP_SOURCE|IDX=39|BASENAME=representative_driver.py|PATH_SHA256=1cc7852fddd12e5145ff4ca3af5c89f3a508c08e9ae8d0eba41fe84d236d0fca|SHA256=b3050a8f95e6d9826a4f0786cd3ca32012b6ab10486d10e4981b50b8a0affff2|SIZE=4214|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|39|25:CT112_ID='guest-pve01-lxc-112'\nSRC|BACKUP|39|33:def _logical_id(target: Mapping[str, Any]) -> str:\nSRC|BACKUP|39|34: value=target.get('logical_id') if isinstance(target, Mapping) else None\nSRC|BACKUP|39|43: logical_id=_logical_id(target)\nSRC|BACKUP|39|44: if logical_id not in wanted:\nSRC|BACKUP|39|46: if logical_id in selected:\nSRC|BACKUP|39|48: selected[logical_id]=target\nSRC|BACKUP|39|72: def write_state(logical_id,result,**kw):\nSRC|BACKUP|39|73: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|39|75: payload={'logical_id':logical_id,'result':result,'meta':kw,'schema_version':1}\nSRC|BACKUP|39|76: _atomic_json(root<PATH>'.json'),payload)\nSRC|BACKUP|39|80: logical_id=_logical_id(target)\nSRC|BACKUP|39|81: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|39|83: backup=getattr(engine,'backup_target',None)\nSRC|BACKUP|39|84: if not callable(backup):\nSRC|BACKUP|39|91: return backup(target,True)\nSRC|BACKUP|39|95:def _validate_ct112_result(result):\nSRC|BACKUP|39|98: if result.get('logical_id')!=CT112_ID or result.get('status')!='OK':\nSRC|BACKUP|39|106:def run_representative(engine, targets, ct112_callback: Callable[[Mapping[str, Any]], Any]):\nSRC|BACKUP|39|107: if not callable(ct112_callback):\nSRC|BACKUP|39|109: legacy,ct112=partition_targets(targets)\nSRC|BACKUP|39|110: results=[_validate_ct112_result(ct112_callback(ct112))]\nREC|BACKUP_SOURCE|IDX=40|BASENAME=ct112_handler.py|PATH_SHA256=2e2374c8bca13049427975dfaa054e86f05f5f1a8c119d269276b6f4d1b80c54|SHA256=5d42a45a1a21c38f71d9ae805e831d2ed8dd24b111ad5972b1fd6c01f909e689|SIZE=9461|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|40|9:CT_ID='guest-pve01-lxc-112'\nSRC|BACKUP|40|49: vmid=r.get('vmid')\nSRC|BACKUP|40|50: if type(vmid) is not int:raise RuntimeError('PVE_VMID_SCHEMA')\nSRC|BACKUP|40|51: configs[vmid]=_json_cmd(f\"<PATH>'type']}<PATH>\")\nSRC|BACKUP|40|56:def _select_live_ct112(plan,now,expected_config=None):\nSRC|BACKUP|40|61: vmids=[j.get('vmid') for j in jobs if isinstance(j,dict)]\nSRC|BACKUP|40|62: if len(vmids)!=len(jobs) or len(vmids)!=len(set(vmids)):raise RuntimeError('CT112_PLAN_MEMBERSHIP')\nSRC|BACKUP|40|63: matches=[j for j in jobs if j.get('vmid')==112]\nSRC|BACKUP|40|96: def __init__(self,work,entries,binding,guard,deadline,logical_id):\nSRC|BACKUP|40|97: self.work=Path(work);self.entries=entries;self.binding=binding;self.guard=guard;self.deadline=deadline;self.logical_id=logical_id\nSRC|BACKUP|40|104: self.inner=large.ReadOnlyLarge(str(RCLONE),self.snapshot,e,bind,self.guard,self.work,self.deadline,self.logical_id)\nSRC|BACKUP|40|120: if not isinstance(target,dict) or target.get('logical_id')!=CT_ID or target.get('vmid')!=112:return (_ for _ in ()).throw(RuntimeError('CT112_DESCRIPTOR'))\nSRC|BACKUP|40|123: pvesh_sha=_sha(PVESH);now=int(time.time());current=_fresh_plan(now);job=_select_live_ct112(current,now)\nSRC|BACKUP|40|126: now2=int(time.time());fresh_plan=_fresh_plan(now2);fresh=_select_live_ct112(fresh_plan,now2,expected)\nSRC|BACKUP|40|134: work=STAGING<PATH>'backup-v2-'+generation);work.mkdir(mode=0o700,parents=False,exist_ok=False)\nREC|BACKUP_SOURCE|IDX=41|BASENAME=legacy_engine.py|PATH_SHA256=68ed87fff22b735897acfc71beec8386ec9a7c7c5eab512d7fbb05e894955abf|SHA256=b6e79f087b9f1d21dac4f77a7b46b743299bbb85bc716e80d2ea67c2e038bcd7|SIZE=59719|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|41|6:STATE_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|41|7:CONFIG_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|41|9:WORK_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|41|10:ENGINE_PATH=pathlib.Path('<PATH>')\nSRC|BACKUP|41|25:GUEST266=pathlib.Path('<PATH>')\nSRC|BACKUP|41|27:P270=pathlib.Path('<PATH>')\nSRC|BACKUP|41|29:P282=pathlib.Path('<PATH>')\nSRC|BACKUP|41|31:P265=pathlib.Path('<PATH>')\nSRC|BACKUP|41|35: (pathlib.Path('<PATH>'),'e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2'),\nSRC|BACKUP|41|36: (pathlib.Path('<PATH>'),'b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688'),\nSRC|BACKUP|41|37: (pathlib.Path('<PATH>'),'a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16'),\nSRC|BACKUP|41|38: (pathlib.Path('<PATH>'),'db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060'),\nSRC|BACKUP|41|39: (pathlib.Path('<PATH>'),'5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a'),\nSRC|BACKUP|41|46: pathlib.Path('<PATH>'),\nSRC|BACKUP|41|47: pathlib.Path('<PATH>'),\nSRC|BACKUP|41|48: pathlib.Path('<PATH>'),\nSRC|BACKUP|41|49: pathlib.Path('<PATH>'),\nSRC|BACKUP|41|50: pathlib.Path('<PATH>'),\nSRC|BACKUP|41|51: pathlib.Path('<PATH>'),\nSRC|BACKUP|41|52: pathlib.Path('<PATH>'),\nSRC|BACKUP|41|53: pathlib.Path('<PATH>'),\nSRC|BACKUP|41|54: pathlib.Path('<PATH>'),\nSRC|BACKUP|41|55: pathlib.Path('<PATH>'),\nSRC|BACKUP|41|56: pathlib.Path('<PATH>'),\nSRC|BACKUP|41|132:def remote_generation_path(scope,logical_id,generation):\nSRC|BACKUP|41|134: for x in (scope,logical_id,generation):\nSRC|BACKUP|41|136: return f'homelab-backups<PATH>'\nSRC|BACKUP|41|138:def make_manifest(scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta):\nSRC|BACKUP|41|142: return {'schema':2,'scope':scope,'logical_id':logical_id,'generation':generation,'created_at_utc':utcnow(),\nSRC|BACKUP|41|153: for vmid,typ in [(110,'lxc'),(111,'lxc'),(112,'lxc'),(113,'lxc'),(130,'qemu'),(150,'qemu'),(160,'qemu'),(170,'qemu'),(171,'qemu'),(190,'qemu'),(210,'qemu'),(211,'qemu'),(9130,'qemu')]:\nSRC|BACKUP|41|154: out.append({'logical_id':('ct' if typ=='lxc' else 'vm')+str(vmid),'scope':'pve','type':'pve_guest','vmid':vmid,'guest_type':typ,'due_seconds':d,'enabled':True,'green1':vmid==112})\nSRC|BACKUP|41|156: out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})\nSRC|BACKUP|41|158: {'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'<IP>','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|41|159: {'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'<IP>','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|41|160: {'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'<IP>','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh<PATH>','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|41|161: {'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|41|171: for slug,vmid,node,root,db,strategy in sites:\nSRC|BACKUP|41|172: out.append({'logical_id':'xf-'+slug,'scope':'xenforo','type':'xenforo','slug':slug,'vmid':vmid,'node':node,'app_root':root,'db_name':db,'dump_strategy':strategy,'due_seconds':d,'enabled':True,'green1':slug in ('codevipe','zakrutim')})\nSRC|BACKUP|41|173: out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})\nSRC|BACKUP|41|182: last=int(state.get(t['logical_id'],{}).get('last_success_epoch',0))\nREC|BACKUP_SOURCE|IDX=42|BASENAME=adapter.py|PATH_SHA256=96feaa329526d21c2e03f45230caa4b665d426f60917e5dcd2ef0c7334b329c6|SHA256=18eb29cef165371b48bcb78e1a456e1939e6eff253787218133162cc89ab9fa3|SIZE=2989|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=43|BASENAME=CONTRACT.json|PATH_SHA256=4a976042b956a253c4109fcc8a8e3254278af40d1a8e430f068390fa953220e7|SHA256=a414715f1b91b3701c52073709a80c38218f76e3961618e8af61489211e50c01|SIZE=2077|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=44|BASENAME=pve282.py|PATH_SHA256=9bb2d2e6bd6d829300d4f1dcfff8ee839cb2c55a3f88f1ed24f78194973da87b|SHA256=73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012|SIZE=6195|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|44|3:No changes to source guest configuration; no source110 backup or guest deletion.\nSRC|BACKUP|44|24: need(type(job) is dict and type(job.get('vmid')) is int and job['vmid']==TARGET_VMID and\nSRC|BACKUP|44|31: by_id={j['vmid']:j for j in previous}\nSRC|BACKUP|44|34: need({j['vmid'] for j in rows}==set(by_id),'ACCEPTED265_MEMBERSHIP_CHANGED')\nSRC|BACKUP|44|36: need(row['config_sha256']==by_id[row['vmid']]['config_sha256'],'ACCEPTED265_GUEST_CONFIG_CHANGED')\nSRC|BACKUP|44|37: selected=[j for j in rows if j['vmid']==TARGET_VMID]\nSRC|BACKUP|44|44: need(disk.get('slot')=='rootfs' and disk.get('class')=='managed-volume' and disk.get('backup_setting') in ('included','included_default_rootfs'),'CT112_MANAGED_ROOTFS_REQUIRED')\nSRC|BACKUP|44|92: return {**result,'path':str(dest),'vmid':112,'type':'lxc','node':job['node'],'config_sha256':job['config_sha256'],\nREC|BACKUP_SOURCE|IDX=45|BASENAME=test_pve282.py|PATH_SHA256=4cc494f097968117c0a7fadb82b1315694d258507615fce84fd7f30faf5a0d45|SHA256=1056407aab76e17181b05e043cb42c086058545a8e0027689ab4e03eee6531c4|SIZE=5785|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|45|17: rows=[{'vmid':v,'type':'lxc' if v in (110,112) else 'qemu','node':'pve01','status':'running','maxdisk':8*G} for v in (110,112,150)]\nSRC|BACKUP|45|28: def test_selects_only112(self):self.assertEqual(f.select112(plan(),plan(),NOW)['vmid'],112)\nSRC|BACKUP|45|33: b=copy.deepcopy(a);self.assertEqual(f.select112(a,b,NOW)['vmid'],112)\nSRC|BACKUP|45|65: def test_marker_scope_ct112_only(self):self.assertEqual(f.TARGET_VMID,112)\nSRC|BACKUP|45|75: return {'path':str(out),'size':len(self.data),'sha256':t.sha(self.data),'identity':list(identity),'vmid':112,'node':'pve01','type':'lxc','producer_rc':0,'config_sha256':j['config_sha256'],'compression_test_ok':True}\nSRC|BACKUP|45|78: z=self.go();self.assertEqual(z['vmid'],112);self.assertEqual(len({a['account_id'] for a in z['replicas']}),2);self.assertEqual(z['local_payload_files_remaining'],0);self.assertEqual(len(self.reader.listed),13);self.assertFalse(z['guest_restore_verified']);self.assertTrue(z['archive_cloud_restore_verified'])\nREC|BACKUP_SOURCE|IDX=46|BASENAME=wrapper.py|PATH_SHA256=d1463c51c42a0558621c0f2bb3f01151d7bc3799acb08d8c24601dedd2a8f511|SHA256=ed04b2634fcba72bdf07811135aed8fd609e849afcde456d433f305be5bb956a|SIZE=4099|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|46|6:CT_ID='guest-pve01-lxc-112'\nSRC|BACKUP|46|8:LOCK=Path('<PATH>')\nSRC|BACKUP|46|15:legacy=_load('_backupv2_legacy476',ROOT<PATH>'legacy_engine.py')\nSRC|BACKUP|46|16:ct112=_load('_backupv2_ct112_476',ROOT<PATH>'ct112_handler.py')\nSRC|BACKUP|46|17:driver=_load('_backupv2_driver454_476',ROOT<PATH>'representative_driver.py')\nSRC|BACKUP|46|19:_legacy_backup_target=legacy.backup_target\nSRC|BACKUP|46|25: ids=[x.get('logical_id') for x in out]\nSRC|BACKUP|46|30: xf=[x for x in rows if x.get('logical_id')=='xf-zakrutim']\nSRC|BACKUP|46|34: return {'logical_id':CT_ID,'scope':'pve01 LXC 112 full-guest archive DR','type':'pve_guest','node':'pve01','vmid':112,\nSRC|BACKUP|46|40:def backup_target(t,green_verify=False):\nSRC|BACKUP|46|41: if not isinstance(t,dict) or t.get('logical_id')!=CT_ID:\nSRC|BACKUP|46|42: return _legacy_backup_target(t,green_verify)\nSRC|BACKUP|46|44: r=ct112.run_target(t,state_writer=legacy.write_state)\nSRC|BACKUP|46|45: return {'logical_id':CT_ID,'generation':r['generation'],'result':'SUCCESS','payload_bytes':r['payload_bytes'],\nSRC|BACKUP|46|53:legacy.backup_target=backup_target\nSRC|BACKUP|46|59: if len(eff)!=29 or sum(1 for x in eff if x.get('logical_id')==CT_ID)!=1: raise RuntimeError('EFFECTIVE_TARGETS')\nSRC|BACKUP|46|61: if [x['logical_id'] for x in legacy_rows]!=list(LEGACY_IDS) or ct.get('vmid')!=112: raise RuntimeError('REPRESENTATIVE_PARTITION')\nSRC|BACKUP|46|62: if ct112.selftest() is not True: raise RuntimeError('CT112_HANDLER_SELFTEST')\nREC|BACKUP_SOURCE|IDX=47|BASENAME=representative_driver.py|PATH_SHA256=9bfafd4d543f89cdd4d040ca8d31ebcc11deffc1dba7c9cb9005e71d2a1dae4e|SHA256=b3050a8f95e6d9826a4f0786cd3ca32012b6ab10486d10e4981b50b8a0affff2|SIZE=4214|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|47|25:CT112_ID='guest-pve01-lxc-112'\nSRC|BACKUP|47|33:def _logical_id(target: Mapping[str, Any]) -> str:\nSRC|BACKUP|47|34: value=target.get('logical_id') if isinstance(target, Mapping) else None\nSRC|BACKUP|47|43: logical_id=_logical_id(target)\nSRC|BACKUP|47|44: if logical_id not in wanted:\nSRC|BACKUP|47|46: if logical_id in selected:\nSRC|BACKUP|47|48: selected[logical_id]=target\nSRC|BACKUP|47|72: def write_state(logical_id,result,**kw):\nSRC|BACKUP|47|73: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|47|75: payload={'logical_id':logical_id,'result':result,'meta':kw,'schema_version':1}\nSRC|BACKUP|47|76: _atomic_json(root<PATH>'.json'),payload)\nSRC|BACKUP|47|80: logical_id=_logical_id(target)\nSRC|BACKUP|47|81: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|47|83: backup=getattr(engine,'backup_target',None)\nSRC|BACKUP|47|84: if not callable(backup):\nSRC|BACKUP|47|91: return backup(target,True)\nSRC|BACKUP|47|95:def _validate_ct112_result(result):\nSRC|BACKUP|47|98: if result.get('logical_id')!=CT112_ID or result.get('status')!='OK':\nSRC|BACKUP|47|106:def run_representative(engine, targets, ct112_callback: Callable[[Mapping[str, Any]], Any]):\nSRC|BACKUP|47|107: if not callable(ct112_callback):\nSRC|BACKUP|47|109: legacy,ct112=partition_targets(targets)\nSRC|BACKUP|47|110: results=[_validate_ct112_result(ct112_callback(ct112))]\nREC|BACKUP_SOURCE|IDX=48|BASENAME=ct112_handler.py|PATH_SHA256=67c03cae9afa0e9bc76b7dde46d38102df33ce78f5722a43bfc3d586f9e435d8|SHA256=e7b027de9a53d7219dd80c9d8e05f0eae0f53db90a53363c64dfa016815c0d00|SIZE=7923|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|48|9:CT_ID='guest-pve01-lxc-112'\nSRC|BACKUP|48|49: vmid=r.get('vmid')\nSRC|BACKUP|48|50: if type(vmid) is not int:raise RuntimeError('PVE_VMID_SCHEMA')\nSRC|BACKUP|48|51: configs[vmid]=_json_cmd(f\"<PATH>'type']}<PATH>\")\nSRC|BACKUP|48|77: def __init__(self,work,entries,binding,guard,deadline,logical_id):\nSRC|BACKUP|48|78: self.work=Path(work);self.entries=entries;self.binding=binding;self.guard=guard;self.deadline=deadline;self.logical_id=logical_id\nSRC|BACKUP|48|85: self.inner=large.ReadOnlyLarge(str(RCLONE),self.snapshot,e,bind,self.guard,self.work,self.deadline,self.logical_id)\nSRC|BACKUP|48|101: if not isinstance(target,dict) or target.get('logical_id')!=CT_ID or target.get('vmid')!=112:return (_ for _ in ()).throw(RuntimeError('CT112_DESCRIPTOR'))\nSRC|BACKUP|48|113: work=STAGING<PATH>'backup-v2-'+generation);work.mkdir(mode=0o700,parents=False,exist_ok=False)\nREC|BACKUP_SOURCE|IDX=49|BASENAME=legacy_engine.py|PATH_SHA256=be1f17db553b39644125195e460037d3e9426d0910681ba67d8e0ac2de00bea3|SHA256=b6e79f087b9f1d21dac4f77a7b46b743299bbb85bc716e80d2ea67c2e038bcd7|SIZE=59719|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|49|6:STATE_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|49|7:CONFIG_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|49|9:WORK_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|49|10:ENGINE_PATH=pathlib.Path('<PATH>')\nSRC|BACKUP|49|25:GUEST266=pathlib.Path('<PATH>')\nSRC|BACKUP|49|27:P270=pathlib.Path('<PATH>')\nSRC|BACKUP|49|29:P282=pathlib.Path('<PATH>')\nSRC|BACKUP|49|31:P265=pathlib.Path('<PATH>')\nSRC|BACKUP|49|35: (pathlib.Path('<PATH>'),'e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2'),\nSRC|BACKUP|49|36: (pathlib.Path('<PATH>'),'b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688'),\nSRC|BACKUP|49|37: (pathlib.Path('<PATH>'),'a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16'),\nSRC|BACKUP|49|38: (pathlib.Path('<PATH>'),'db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060'),\nSRC|BACKUP|49|39: (pathlib.Path('<PATH>'),'5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a'),\nSRC|BACKUP|49|46: pathlib.Path('<PATH>'),\nSRC|BACKUP|49|47: pathlib.Path('<PATH>'),\nSRC|BACKUP|49|48: pathlib.Path('<PATH>'),\nSRC|BACKUP|49|49: pathlib.Path('<PATH>'),\nSRC|BACKUP|49|50: pathlib.Path('<PATH>'),\nSRC|BACKUP|49|51: pathlib.Path('<PATH>'),\nSRC|BACKUP|49|52: pathlib.Path('<PATH>'),\nSRC|BACKUP|49|53: pathlib.Path('<PATH>'),\nSRC|BACKUP|49|54: pathlib.Path('<PATH>'),\nSRC|BACKUP|49|55: pathlib.Path('<PATH>'),\nSRC|BACKUP|49|56: pathlib.Path('<PATH>'),\nSRC|BACKUP|49|132:def remote_generation_path(scope,logical_id,generation):\nSRC|BACKUP|49|134: for x in (scope,logical_id,generation):\nSRC|BACKUP|49|136: return f'homelab-backups<PATH>'\nSRC|BACKUP|49|138:def make_manifest(scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta):\nSRC|BACKUP|49|142: return {'schema':2,'scope':scope,'logical_id':logical_id,'generation':generation,'created_at_utc':utcnow(),\nSRC|BACKUP|49|153: for vmid,typ in [(110,'lxc'),(111,'lxc'),(112,'lxc'),(113,'lxc'),(130,'qemu'),(150,'qemu'),(160,'qemu'),(170,'qemu'),(171,'qemu'),(190,'qemu'),(210,'qemu'),(211,'qemu'),(9130,'qemu')]:\nSRC|BACKUP|49|154: out.append({'logical_id':('ct' if typ=='lxc' else 'vm')+str(vmid),'scope':'pve','type':'pve_guest','vmid':vmid,'guest_type':typ,'due_seconds':d,'enabled':True,'green1':vmid==112})\nSRC|BACKUP|49|156: out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})\nSRC|BACKUP|49|158: {'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'<IP>','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|49|159: {'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'<IP>','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|49|160: {'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'<IP>','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh<PATH>','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|49|161: {'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|49|171: for slug,vmid,node,root,db,strategy in sites:\nSRC|BACKUP|49|172: out.append({'logical_id':'xf-'+slug,'scope':'xenforo','type':'xenforo','slug':slug,'vmid':vmid,'node':node,'app_root':root,'db_name':db,'dump_strategy':strategy,'due_seconds':d,'enabled':True,'green1':slug in ('codevipe','zakrutim')})\nSRC|BACKUP|49|173: out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})\nSRC|BACKUP|49|182: last=int(state.get(t['logical_id'],{}).get('last_success_epoch',0))\nREC|BACKUP_SOURCE|IDX=50|BASENAME=adapter.py|PATH_SHA256=c5ae1b926ae57e6359790b87145e93aee62c28e8d94b96a1938f22a865da61ec|SHA256=18eb29cef165371b48bcb78e1a456e1939e6eff253787218133162cc89ab9fa3|SIZE=2989|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=51|BASENAME=CONTRACT.json|PATH_SHA256=7f02a2748fa19d48e7321e4d32ce89aa54487469c19e4a80fe2555b038524028|SHA256=a414715f1b91b3701c52073709a80c38218f76e3961618e8af61489211e50c01|SIZE=2077|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=52|BASENAME=pve282.py|PATH_SHA256=b74fbe37c137202678401d67a28deba1a32ecc5bacecce72e89ff16704df04c0|SHA256=73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012|SIZE=6195|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|52|3:No changes to source guest configuration; no source110 backup or guest deletion.\nSRC|BACKUP|52|24: need(type(job) is dict and type(job.get('vmid')) is int and job['vmid']==TARGET_VMID and\nSRC|BACKUP|52|31: by_id={j['vmid']:j for j in previous}\nSRC|BACKUP|52|34: need({j['vmid'] for j in rows}==set(by_id),'ACCEPTED265_MEMBERSHIP_CHANGED')\nSRC|BACKUP|52|36: need(row['config_sha256']==by_id[row['vmid']]['config_sha256'],'ACCEPTED265_GUEST_CONFIG_CHANGED')\nSRC|BACKUP|52|37: selected=[j for j in rows if j['vmid']==TARGET_VMID]\nSRC|BACKUP|52|44: need(disk.get('slot')=='rootfs' and disk.get('class')=='managed-volume' and disk.get('backup_setting') in ('included','included_default_rootfs'),'CT112_MANAGED_ROOTFS_REQUIRED')\nSRC|BACKUP|52|92: return {**result,'path':str(dest),'vmid':112,'type':'lxc','node':job['node'],'config_sha256':job['config_sha256'],\nREC|BACKUP_SOURCE|IDX=53|BASENAME=test_pve282.py|PATH_SHA256=f68a22c96a53b6ca1efc4cc1b902bf09cecf3423f368497ec90439f1a1e83db7|SHA256=1056407aab76e17181b05e043cb42c086058545a8e0027689ab4e03eee6531c4|SIZE=5785|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|53|17: rows=[{'vmid':v,'type':'lxc' if v in (110,112) else 'qemu','node':'pve01','status':'running','maxdisk':8*G} for v in (110,112,150)]\nSRC|BACKUP|53|28: def test_selects_only112(self):self.assertEqual(f.select112(plan(),plan(),NOW)['vmid'],112)\nSRC|BACKUP|53|33: b=copy.deepcopy(a);self.assertEqual(f.select112(a,b,NOW)['vmid'],112)\nSRC|BACKUP|53|65: def test_marker_scope_ct112_only(self):self.assertEqual(f.TARGET_VMID,112)\nSRC|BACKUP|53|75: return {'path':str(out),'size':len(self.data),'sha256':t.sha(self.data),'identity':list(identity),'vmid':112,'node':'pve01','type':'lxc','producer_rc':0,'config_sha256':j['config_sha256'],'compression_test_ok':True}\nSRC|BACKUP|53|78: z=self.go();self.assertEqual(z['vmid'],112);self.assertEqual(len({a['account_id'] for a in z['replicas']}),2);self.assertEqual(z['local_payload_files_remaining'],0);self.assertEqual(len(self.reader.listed),13);self.assertFalse(z['guest_restore_verified']);self.assertTrue(z['archive_cloud_restore_verified'])\nREC|BACKUP_SOURCE|IDX=54|BASENAME=wrapper.py|PATH_SHA256=e7ce6a0b75464a25ea19d0711c6494feeeff445ec91ab84a1b94964efa00e9a8|SHA256=699ce999e52f15f24c63723e35dd5251992c4dfce6266073b892dd684ed3f454|SIZE=5076|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|54|6:CT_ID='guest-pve01-lxc-112'\nSRC|BACKUP|54|8:LOCK=Path('<PATH>')\nSRC|BACKUP|54|15:legacy=_load('_backupv2_legacy486',ROOT<PATH>'legacy_engine.py')\nSRC|BACKUP|54|16:ct112=_load('_backupv2_ct112_486',ROOT<PATH>'ct112_handler.py')\nSRC|BACKUP|54|17:driver=_load('_backupv2_driver454_479',ROOT<PATH>'representative_driver.py')\nSRC|BACKUP|54|19:_legacy_backup_target=legacy.backup_target\nSRC|BACKUP|54|25: ids=[x.get('logical_id') for x in out]\nSRC|BACKUP|54|30: xf=[x for x in rows if x.get('logical_id')=='xf-zakrutim']\nSRC|BACKUP|54|34: return {'logical_id':CT_ID,'scope':'pve01 LXC 112 full-guest archive DR','type':'pve_guest','node':'pve01','vmid':112,\nSRC|BACKUP|54|40:def backup_target(t,green_verify=False):\nSRC|BACKUP|54|41: if not isinstance(t,dict) or t.get('logical_id')!=CT_ID:\nSRC|BACKUP|54|42: return _legacy_backup_target(t,green_verify)\nSRC|BACKUP|54|44: r=ct112.run_target(t,state_writer=legacy.write_state)\nSRC|BACKUP|54|45: return {'logical_id':CT_ID,'generation':r['generation'],'result':'SUCCESS','payload_bytes':r['payload_bytes'],\nSRC|BACKUP|54|53:legacy.backup_target=backup_target\nSRC|BACKUP|54|60: want={'ct112',*LEGACY_IDS}\nSRC|BACKUP|54|61: if {t.get('logical_id') for t in d if isinstance(t,dict) and t.get('green1')}!=want: raise RuntimeError('LEGACY_DEFAULT_GREEN_SET')\nSRC|BACKUP|54|71: if len(eff)!=29 or sum(1 for x in eff if x.get('logical_id')==CT_ID)!=1: raise RuntimeError('EFFECTIVE_TARGETS')\nSRC|BACKUP|54|73: if [x['logical_id'] for x in legacy_rows]!=list(LEGACY_IDS) or ct.get('vmid')!=112: raise RuntimeError('REPRESENTATIVE_PARTITION')\nSRC|BACKUP|54|74: if ct112.selftest() is not True: raise RuntimeError('CT112_HANDLER_SELFTEST')\nREC|BACKUP_SOURCE|IDX=55|BASENAME=representative_driver.py|PATH_SHA256=620da4ad267f3a405815e2ff1e45ffeedcf336ee162be1bc1d4fe3f8af4188d0|SHA256=b3050a8f95e6d9826a4f0786cd3ca32012b6ab10486d10e4981b50b8a0affff2|SIZE=4214|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|55|25:CT112_ID='guest-pve01-lxc-112'\nSRC|BACKUP|55|33:def _logical_id(target: Mapping[str, Any]) -> str:\nSRC|BACKUP|55|34: value=target.get('logical_id') if isinstance(target, Mapping) else None\nSRC|BACKUP|55|43: logical_id=_logical_id(target)\nSRC|BACKUP|55|44: if logical_id not in wanted:\nSRC|BACKUP|55|46: if logical_id in selected:\nSRC|BACKUP|55|48: selected[logical_id]=target\nSRC|BACKUP|55|72: def write_state(logical_id,result,**kw):\nSRC|BACKUP|55|73: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|55|75: payload={'logical_id':logical_id,'result':result,'meta':kw,'schema_version':1}\nSRC|BACKUP|55|76: _atomic_json(root<PATH>'.json'),payload)\nSRC|BACKUP|55|80: logical_id=_logical_id(target)\nSRC|BACKUP|55|81: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|55|83: backup=getattr(engine,'backup_target',None)\nSRC|BACKUP|55|84: if not callable(backup):\nSRC|BACKUP|55|91: return backup(target,True)\nSRC|BACKUP|55|95:def _validate_ct112_result(result):\nSRC|BACKUP|55|98: if result.get('logical_id')!=CT112_ID or result.get('status')!='OK':\nSRC|BACKUP|55|106:def run_representative(engine, targets, ct112_callback: Callable[[Mapping[str, Any]], Any]):\nSRC|BACKUP|55|107: if not callable(ct112_callback):\nSRC|BACKUP|55|109: legacy,ct112=partition_targets(targets)\nSRC|BACKUP|55|110: results=[_validate_ct112_result(ct112_callback(ct112))]\nREC|BACKUP_SOURCE|IDX=56|BASENAME=ct112_handler.py|PATH_SHA256=c2912ea3b1faaa7d9eba5ff23da881c38935d44e7144f34c9317431973c58107|SHA256=8cac6e627d5e7abe5d3163cdd24911995a1e3f45c776f9373c2aa68784f5ec6c|SIZE=10955|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|56|9:CT_ID='guest-pve01-lxc-112'\nSRC|BACKUP|56|49: vmid=r.get('vmid')\nSRC|BACKUP|56|50: if type(vmid) is not int:raise RuntimeError('PVE_VMID_SCHEMA')\nSRC|BACKUP|56|51: configs[vmid]=_json_cmd(f\"<PATH>'type']}<PATH>\")\nSRC|BACKUP|56|56:def _select_live_ct112(plan,now,expected_config=None):\nSRC|BACKUP|56|61: vmids=[j.get('vmid') for j in jobs if isinstance(j,dict)]\nSRC|BACKUP|56|62: if len(vmids)!=len(jobs) or len(vmids)!=len(set(vmids)):raise RuntimeError('CT112_PLAN_MEMBERSHIP')\nSRC|BACKUP|56|63: matches=[j for j in jobs if j.get('vmid')==112]\nSRC|BACKUP|56|74:def _assert_live_state_unchanged(before,after,vmid):\nSRC|BACKUP|56|79: if any(type(x) is not dict or type(x.get('vmid')) is not int for x in rows):raise RuntimeError('CT112_STATE_SCHEMA')\nSRC|BACKUP|56|80: return sorted((x['vmid'],x.get('type'),x.get('node'),x.get('status'),x.get('template')) for x in rows)\nSRC|BACKUP|56|83: a=[j for j in old if j.get('vmid')==vmid];b=[j for j in new if j.get('vmid')==vmid]\nSRC|BACKUP|56|119: def __init__(self,work,entries,binding,guard,deadline,logical_id):\nSRC|BACKUP|56|120: self.work=Path(work);self.entries=entries;self.binding=binding;self.guard=guard;self.deadline=deadline;self.logical_id=logical_id\nSRC|BACKUP|56|127: self.inner=large.ReadOnlyLarge(str(RCLONE),self.snapshot,e,bind,self.guard,self.work,self.deadline,self.logical_id)\nSRC|BACKUP|56|143: if not isinstance(target,dict) or target.get('logical_id')!=CT_ID or target.get('vmid')!=112:return (_ for _ in ()).throw(RuntimeError('CT112_DESCRIPTOR'))\nSRC|BACKUP|56|146: pvesh_sha=_sha(PVESH);now=int(time.time());current=_fresh_plan(now);job=_select_live_ct112(current,now)\nSRC|BACKUP|56|149: now2=int(time.time());fresh_plan=_fresh_plan(now2);fresh=_select_live_ct112(fresh_plan,now2,expected)\nSRC|BACKUP|56|157: work=STAGING<PATH>'backup-v2-'+generation);work.mkdir(mode=0o700,parents=False,exist_ok=False)\nREC|BACKUP_SOURCE|IDX=57|BASENAME=legacy_engine.py|PATH_SHA256=e4ceeb7671a8cdc119c5427c862109ecbbefb90b06c59ce1dcb68b03b8e96c95|SHA256=5715651655da32530df84a5a095b772d21dc0d1f92789465e9e6b5b1ff8a16e3|SIZE=60024|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|57|6:STATE_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|57|7:CONFIG_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|57|9:WORK_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|57|10:ENGINE_PATH=pathlib.Path('<PATH>')\nSRC|BACKUP|57|25:GUEST266=pathlib.Path('<PATH>')\nSRC|BACKUP|57|27:P270=pathlib.Path('<PATH>')\nSRC|BACKUP|57|29:P282=pathlib.Path('<PATH>')\nSRC|BACKUP|57|31:P265=pathlib.Path('<PATH>')\nSRC|BACKUP|57|35: (pathlib.Path('<PATH>'),'e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2'),\nSRC|BACKUP|57|36: (pathlib.Path('<PATH>'),'b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688'),\nSRC|BACKUP|57|37: (pathlib.Path('<PATH>'),'a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16'),\nSRC|BACKUP|57|38: (pathlib.Path('<PATH>'),'db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060'),\nSRC|BACKUP|57|39: (pathlib.Path('<PATH>'),'5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a'),\nSRC|BACKUP|57|46: pathlib.Path('<PATH>'),\nSRC|BACKUP|57|47: pathlib.Path('<PATH>'),\nSRC|BACKUP|57|48: pathlib.Path('<PATH>'),\nSRC|BACKUP|57|49: pathlib.Path('<PATH>'),\nSRC|BACKUP|57|50: pathlib.Path('<PATH>'),\nSRC|BACKUP|57|51: pathlib.Path('<PATH>'),\nSRC|BACKUP|57|52: pathlib.Path('<PATH>'),\nSRC|BACKUP|57|53: pathlib.Path('<PATH>'),\nSRC|BACKUP|57|54: pathlib.Path('<PATH>'),\nSRC|BACKUP|57|55: pathlib.Path('<PATH>'),\nSRC|BACKUP|57|56: pathlib.Path('<PATH>'),\nSRC|BACKUP|57|132:def remote_generation_path(scope,logical_id,generation):\nSRC|BACKUP|57|134: for x in (scope,logical_id,generation):\nSRC|BACKUP|57|136: return f'homelab-backups<PATH>'\nSRC|BACKUP|57|138:def make_manifest(scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta):\nSRC|BACKUP|57|142: return {'schema':2,'scope':scope,'logical_id':logical_id,'generation':generation,'created_at_utc':utcnow(),\nSRC|BACKUP|57|153: for vmid,typ in [(110,'lxc'),(111,'lxc'),(112,'lxc'),(113,'lxc'),(130,'qemu'),(150,'qemu'),(160,'qemu'),(170,'qemu'),(171,'qemu'),(190,'qemu'),(210,'qemu'),(211,'qemu'),(9130,'qemu')]:\nSRC|BACKUP|57|154: out.append({'logical_id':('ct' if typ=='lxc' else 'vm')+str(vmid),'scope':'pve','type':'pve_guest','vmid':vmid,'guest_type':typ,'due_seconds':d,'enabled':True,'green1':vmid==112})\nSRC|BACKUP|57|156: out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})\nSRC|BACKUP|57|158: {'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'<IP>','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|57|159: {'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'<IP>','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|57|160: {'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'<IP>','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh<PATH>','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|57|161: {'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|57|171: for slug,vmid,node,root,db,strategy in sites:\nSRC|BACKUP|57|172: out.append({'logical_id':'xf-'+slug,'scope':'xenforo','type':'xenforo','slug':slug,'vmid':vmid,'node':node,'app_root':root,'db_name':db,'dump_strategy':strategy,'due_seconds':d,'enabled':True,'green1':slug in ('codevipe','zakrutim')})\nSRC|BACKUP|57|173: out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})\nSRC|BACKUP|57|182: last=int(state.get(t['logical_id'],{}).get('last_success_epoch',0))\nREC|BACKUP_SOURCE|IDX=58|BASENAME=adapter.py|PATH_SHA256=a658832703db0b930fbb41a6026ed3733dfb9180e67d2c4bee0999d54c32cfc4|SHA256=18eb29cef165371b48bcb78e1a456e1939e6eff253787218133162cc89ab9fa3|SIZE=2989|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=59|BASENAME=CONTRACT.json|PATH_SHA256=482b161243f5605a80750f204df664680454be9b2c7412f164ed5229fe1662fe|SHA256=a414715f1b91b3701c52073709a80c38218f76e3961618e8af61489211e50c01|SIZE=2077|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=60|BASENAME=pve282.py|PATH_SHA256=697f9652455529f214e87723b5bf4ba29ce0560cc488d671aa395a6198ec052b|SHA256=73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012|SIZE=6195|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|60|3:No changes to source guest configuration; no source110 backup or guest deletion.\nSRC|BACKUP|60|24: need(type(job) is dict and type(job.get('vmid')) is int and job['vmid']==TARGET_VMID and\nSRC|BACKUP|60|31: by_id={j['vmid']:j for j in previous}\nSRC|BACKUP|60|34: need({j['vmid'] for j in rows}==set(by_id),'ACCEPTED265_MEMBERSHIP_CHANGED')\nSRC|BACKUP|60|36: need(row['config_sha256']==by_id[row['vmid']]['config_sha256'],'ACCEPTED265_GUEST_CONFIG_CHANGED')\nSRC|BACKUP|60|37: selected=[j for j in rows if j['vmid']==TARGET_VMID]\nSRC|BACKUP|60|44: need(disk.get('slot')=='rootfs' and disk.get('class')=='managed-volume' and disk.get('backup_setting') in ('included','included_default_rootfs'),'CT112_MANAGED_ROOTFS_REQUIRED')\nSRC|BACKUP|60|92: return {**result,'path':str(dest),'vmid':112,'type':'lxc','node':job['node'],'config_sha256':job['config_sha256'],\nREC|BACKUP_SOURCE|IDX=61|BASENAME=test_pve282.py|PATH_SHA256=7089e663763d9c83e90931d0fb7b14c487e7118550ba125fddd368ffd6b673da|SHA256=1056407aab76e17181b05e043cb42c086058545a8e0027689ab4e03eee6531c4|SIZE=5785|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|61|17: rows=[{'vmid':v,'type':'lxc' if v in (110,112) else 'qemu','node':'pve01','status':'running','maxdisk':8*G} for v in (110,112,150)]\nSRC|BACKUP|61|28: def test_selects_only112(self):self.assertEqual(f.select112(plan(),plan(),NOW)['vmid'],112)\nSRC|BACKUP|61|33: b=copy.deepcopy(a);self.assertEqual(f.select112(a,b,NOW)['vmid'],112)\nSRC|BACKUP|61|65: def test_marker_scope_ct112_only(self):self.assertEqual(f.TARGET_VMID,112)\nSRC|BACKUP|61|75: return {'path':str(out),'size':len(self.data),'sha256':t.sha(self.data),'identity':list(identity),'vmid':112,'node':'pve01','type':'lxc','producer_rc':0,'config_sha256':j['config_sha256'],'compression_test_ok':True}\nSRC|BACKUP|61|78: z=self.go();self.assertEqual(z['vmid'],112);self.assertEqual(len({a['account_id'] for a in z['replicas']}),2);self.assertEqual(z['local_payload_files_remaining'],0);self.assertEqual(len(self.reader.listed),13);self.assertFalse(z['guest_restore_verified']);self.assertTrue(z['archive_cloud_restore_verified'])\nREC|BACKUP_SOURCE|IDX=62|BASENAME=wrapper.py|PATH_SHA256=6bb7090f99bbf5d715464dd8132dfe1961c09eacd937cf8d4f94d0a7c6732ccf|SHA256=2c1aea8d29cd697254a2f90a458edf9837f834b4d1f9525f478e8a8eb58cd495|SIZE=5076|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|62|6:CT_ID='guest-pve01-lxc-112'\nSRC|BACKUP|62|8:LOCK=Path('<PATH>')\nSRC|BACKUP|62|15:legacy=_load('_backupv2_legacy486',ROOT<PATH>'legacy_engine.py')\nSRC|BACKUP|62|16:ct112=_load('_backupv2_ct112_486',ROOT<PATH>'ct112_handler.py')\nSRC|BACKUP|62|17:driver=_load('_backupv2_driver454_479',ROOT<PATH>'representative_driver.py')\nSRC|BACKUP|62|19:_legacy_backup_target=legacy.backup_target\nSRC|BACKUP|62|25: ids=[x.get('logical_id') for x in out]\nSRC|BACKUP|62|30: xf=[x for x in rows if x.get('logical_id')=='xf-zakrutim']\nSRC|BACKUP|62|34: return {'logical_id':CT_ID,'scope':'pve01 LXC 112 full-guest archive DR','type':'pve_guest','node':'pve01','vmid':112,\nSRC|BACKUP|62|40:def backup_target(t,green_verify=False):\nSRC|BACKUP|62|41: if not isinstance(t,dict) or t.get('logical_id')!=CT_ID:\nSRC|BACKUP|62|42: return _legacy_backup_target(t,green_verify)\nSRC|BACKUP|62|44: r=ct112.run_target(t,state_writer=legacy.write_state)\nSRC|BACKUP|62|45: return {'logical_id':CT_ID,'generation':r['generation'],'result':'SUCCESS','payload_bytes':r['payload_bytes'],\nSRC|BACKUP|62|53:legacy.backup_target=backup_target\nSRC|BACKUP|62|60: want={'ct112',*LEGACY_IDS}\nSRC|BACKUP|62|61: if {t.get('logical_id') for t in d if isinstance(t,dict) and t.get('green1')}!=want: raise RuntimeError('LEGACY_DEFAULT_GREEN_SET')\nSRC|BACKUP|62|71: if len(eff)!=29 or sum(1 for x in eff if x.get('logical_id')==CT_ID)!=1: raise RuntimeError('EFFECTIVE_TARGETS')\nSRC|BACKUP|62|73: if [x['logical_id'] for x in legacy_rows]!=list(LEGACY_IDS) or ct.get('vmid')!=112: raise RuntimeError('REPRESENTATIVE_PARTITION')\nSRC|BACKUP|62|74: if ct112.selftest() is not True: raise RuntimeError('CT112_HANDLER_SELFTEST')\nREC|BACKUP_SOURCE|IDX=63|BASENAME=representative_driver.py|PATH_SHA256=09b19535797a61bc301fb70d6e70db72f4bd0908a2b9e69a3cac000f15d5be40|SHA256=b3050a8f95e6d9826a4f0786cd3ca32012b6ab10486d10e4981b50b8a0affff2|SIZE=4214|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|63|25:CT112_ID='guest-pve01-lxc-112'\nSRC|BACKUP|63|33:def _logical_id(target: Mapping[str, Any]) -> str:\nSRC|BACKUP|63|34: value=target.get('logical_id') if isinstance(target, Mapping) else None\nSRC|BACKUP|63|43: logical_id=_logical_id(target)\nSRC|BACKUP|63|44: if logical_id not in wanted:\nSRC|BACKUP|63|46: if logical_id in selected:\nSRC|BACKUP|63|48: selected[logical_id]=target\nSRC|BACKUP|63|72: def write_state(logical_id,result,**kw):\nSRC|BACKUP|63|73: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|63|75: payload={'logical_id':logical_id,'result':result,'meta':kw,'schema_version':1}\nSRC|BACKUP|63|76: _atomic_json(root<PATH>'.json'),payload)\nSRC|BACKUP|63|80: logical_id=_logical_id(target)\nSRC|BACKUP|63|81: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|63|83: backup=getattr(engine,'backup_target',None)\nSRC|BACKUP|63|84: if not callable(backup):\nSRC|BACKUP|63|91: return backup(target,True)\nSRC|BACKUP|63|95:def _validate_ct112_result(result):\nSRC|BACKUP|63|98: if result.get('logical_id')!=CT112_ID or result.get('status')!='OK':\nSRC|BACKUP|63|106:def run_representative(engine, targets, ct112_callback: Callable[[Mapping[str, Any]], Any]):\nSRC|BACKUP|63|107: if not callable(ct112_callback):\nSRC|BACKUP|63|109: legacy,ct112=partition_targets(targets)\nSRC|BACKUP|63|110: results=[_validate_ct112_result(ct112_callback(ct112))]\nREC|BACKUP_SOURCE|IDX=64|BASENAME=ct112_handler.py|PATH_SHA256=c8810e18214d02445685399bdc0d61bcf88414fc2ca864b1c68b535ab14ba366|SHA256=8cac6e627d5e7abe5d3163cdd24911995a1e3f45c776f9373c2aa68784f5ec6c|SIZE=10955|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|64|9:CT_ID='guest-pve01-lxc-112'\nSRC|BACKUP|64|49: vmid=r.get('vmid')\nSRC|BACKUP|64|50: if type(vmid) is not int:raise RuntimeError('PVE_VMID_SCHEMA')\nSRC|BACKUP|64|51: configs[vmid]=_json_cmd(f\"<PATH>'type']}<PATH>\")\nSRC|BACKUP|64|56:def _select_live_ct112(plan,now,expected_config=None):\nSRC|BACKUP|64|61: vmids=[j.get('vmid') for j in jobs if isinstance(j,dict)]\nSRC|BACKUP|64|62: if len(vmids)!=len(jobs) or len(vmids)!=len(set(vmids)):raise RuntimeError('CT112_PLAN_MEMBERSHIP')\nSRC|BACKUP|64|63: matches=[j for j in jobs if j.get('vmid')==112]\nSRC|BACKUP|64|74:def _assert_live_state_unchanged(before,after,vmid):\nSRC|BACKUP|64|79: if any(type(x) is not dict or type(x.get('vmid')) is not int for x in rows):raise RuntimeError('CT112_STATE_SCHEMA')\nSRC|BACKUP|64|80: return sorted((x['vmid'],x.get('type'),x.get('node'),x.get('status'),x.get('template')) for x in rows)\nSRC|BACKUP|64|83: a=[j for j in old if j.get('vmid')==vmid];b=[j for j in new if j.get('vmid')==vmid]\nSRC|BACKUP|64|119: def __init__(self,work,entries,binding,guard,deadline,logical_id):\nSRC|BACKUP|64|120: self.work=Path(work);self.entries=entries;self.binding=binding;self.guard=guard;self.deadline=deadline;self.logical_id=logical_id\nSRC|BACKUP|64|127: self.inner=large.ReadOnlyLarge(str(RCLONE),self.snapshot,e,bind,self.guard,self.work,self.deadline,self.logical_id)\nSRC|BACKUP|64|143: if not isinstance(target,dict) or target.get('logical_id')!=CT_ID or target.get('vmid')!=112:return (_ for _ in ()).throw(RuntimeError('CT112_DESCRIPTOR'))\nSRC|BACKUP|64|146: pvesh_sha=_sha(PVESH);now=int(time.time());current=_fresh_plan(now);job=_select_live_ct112(current,now)\nSRC|BACKUP|64|149: now2=int(time.time());fresh_plan=_fresh_plan(now2);fresh=_select_live_ct112(fresh_plan,now2,expected)\nSRC|BACKUP|64|157: work=STAGING<PATH>'backup-v2-'+generation);work.mkdir(mode=0o700,parents=False,exist_ok=False)\nREC|BACKUP_SOURCE|IDX=65|BASENAME=legacy_engine.py|PATH_SHA256=d01be8c91a53c39ac6295a389b40b6b216db5f0cce27d2482e8f29523278d1d9|SHA256=ff4fbf84638ab55a8a1858558b759b3fc9d979ef5feb279132a558bcef583598|SIZE=59790|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|65|6:STATE_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|65|7:CONFIG_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|65|9:WORK_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|65|10:ENGINE_PATH=pathlib.Path('<PATH>')\nSRC|BACKUP|65|25:GUEST266=pathlib.Path('<PATH>')\nSRC|BACKUP|65|27:P270=pathlib.Path('<PATH>')\nSRC|BACKUP|65|29:P282=pathlib.Path('<PATH>')\nSRC|BACKUP|65|31:P265=pathlib.Path('<PATH>')\nSRC|BACKUP|65|35: (pathlib.Path('<PATH>'),'e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2'),\nSRC|BACKUP|65|36: (pathlib.Path('<PATH>'),'b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688'),\nSRC|BACKUP|65|37: (pathlib.Path('<PATH>'),'a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16'),\nSRC|BACKUP|65|38: (pathlib.Path('<PATH>'),'db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060'),\nSRC|BACKUP|65|39: (pathlib.Path('<PATH>'),'5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a'),\nSRC|BACKUP|65|46: pathlib.Path('<PATH>'),\nSRC|BACKUP|65|47: pathlib.Path('<PATH>'),\nSRC|BACKUP|65|48: pathlib.Path('<PATH>'),\nSRC|BACKUP|65|49: pathlib.Path('<PATH>'),\nSRC|BACKUP|65|50: pathlib.Path('<PATH>'),\nSRC|BACKUP|65|51: pathlib.Path('<PATH>'),\nSRC|BACKUP|65|52: pathlib.Path('<PATH>'),\nSRC|BACKUP|65|53: pathlib.Path('<PATH>'),\nSRC|BACKUP|65|54: pathlib.Path('<PATH>'),\nSRC|BACKUP|65|55: pathlib.Path('<PATH>'),\nSRC|BACKUP|65|56: pathlib.Path('<PATH>'),\nSRC|BACKUP|65|132:def remote_generation_path(scope,logical_id,generation):\nSRC|BACKUP|65|134: for x in (scope,logical_id,generation):\nSRC|BACKUP|65|136: return f'homelab-backups<PATH>'\nSRC|BACKUP|65|138:def make_manifest(scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta):\nSRC|BACKUP|65|142: return {'schema':2,'scope':scope,'logical_id':logical_id,'generation':generation,'created_at_utc':utcnow(),\nSRC|BACKUP|65|153: for vmid,typ in [(110,'lxc'),(111,'lxc'),(112,'lxc'),(113,'lxc'),(130,'qemu'),(150,'qemu'),(160,'qemu'),(170,'qemu'),(171,'qemu'),(190,'qemu'),(210,'qemu'),(211,'qemu'),(9130,'qemu')]:\nSRC|BACKUP|65|154: out.append({'logical_id':('ct' if typ=='lxc' else 'vm')+str(vmid),'scope':'pve','type':'pve_guest','vmid':vmid,'guest_type':typ,'due_seconds':d,'enabled':True,'green1':vmid==112})\nSRC|BACKUP|65|156: out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})\nSRC|BACKUP|65|158: {'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'<IP>','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|65|159: {'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'<IP>','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|65|160: {'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'<IP>','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh<PATH>','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|65|161: {'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|65|171: for slug,vmid,node,root,db,strategy in sites:\nSRC|BACKUP|65|172: out.append({'logical_id':'xf-'+slug,'scope':'xenforo','type':'xenforo','slug':slug,'vmid':vmid,'node':node,'app_root':root,'db_name':db,'dump_strategy':strategy,'due_seconds':d,'enabled':True,'green1':slug in ('codevipe','zakrutim')})\nSRC|BACKUP|65|173: out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})\nSRC|BACKUP|65|182: last=int(state.get(t['logical_id'],{}).get('last_success_epoch',0))\nREC|BACKUP_SOURCE|IDX=66|BASENAME=adapter.py|PATH_SHA256=0597d519bb2392f2fe3ce3e7d4913b7d5ea22e8bd66ec576b1ab7b1d069628f4|SHA256=18eb29cef165371b48bcb78e1a456e1939e6eff253787218133162cc89ab9fa3|SIZE=2989|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=67|BASENAME=CONTRACT.json|PATH_SHA256=c48b07d4bca9628f28a6a37a68b8f0e14d09a3bb012399f337c236ee0f455f87|SHA256=a414715f1b91b3701c52073709a80c38218f76e3961618e8af61489211e50c01|SIZE=2077|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=68|BASENAME=pve282.py|PATH_SHA256=33a1a82895889ea63a6b310dfca8e79a7f5e44f17e2d1ed6d7653bc6c81d50e6|SHA256=73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012|SIZE=6195|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|68|3:No changes to source guest configuration; no source110 backup or guest deletion.\nSRC|BACKUP|68|24: need(type(job) is dict and type(job.get('vmid')) is int and job['vmid']==TARGET_VMID and\nSRC|BACKUP|68|31: by_id={j['vmid']:j for j in previous}\nSRC|BACKUP|68|34: need({j['vmid'] for j in rows}==set(by_id),'ACCEPTED265_MEMBERSHIP_CHANGED')\nSRC|BACKUP|68|36: need(row['config_sha256']==by_id[row['vmid']]['config_sha256'],'ACCEPTED265_GUEST_CONFIG_CHANGED')\nSRC|BACKUP|68|37: selected=[j for j in rows if j['vmid']==TARGET_VMID]\nSRC|BACKUP|68|44: need(disk.get('slot')=='rootfs' and disk.get('class')=='managed-volume' and disk.get('backup_setting') in ('included','included_default_rootfs'),'CT112_MANAGED_ROOTFS_REQUIRED')\nSRC|BACKUP|68|92: return {**result,'path':str(dest),'vmid':112,'type':'lxc','node':job['node'],'config_sha256':job['config_sha256'],\nREC|BACKUP_SOURCE|IDX=69|BASENAME=test_pve282.py|PATH_SHA256=7405d48c4039d3f91b06d2263f9e7e911ec6cfd4c48f6aa731a251007283a01e|SHA256=1056407aab76e17181b05e043cb42c086058545a8e0027689ab4e03eee6531c4|SIZE=5785|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|69|17: rows=[{'vmid':v,'type':'lxc' if v in (110,112) else 'qemu','node':'pve01','status':'running','maxdisk':8*G} for v in (110,112,150)]\nSRC|BACKUP|69|28: def test_selects_only112(self):self.assertEqual(f.select112(plan(),plan(),NOW)['vmid'],112)\nSRC|BACKUP|69|33: b=copy.deepcopy(a);self.assertEqual(f.select112(a,b,NOW)['vmid'],112)\nSRC|BACKUP|69|65: def test_marker_scope_ct112_only(self):self.assertEqual(f.TARGET_VMID,112)\nSRC|BACKUP|69|75: return {'path':str(out),'size':len(self.data),'sha256':t.sha(self.data),'identity':list(identity),'vmid':112,'node':'pve01','type':'lxc','producer_rc':0,'config_sha256':j['config_sha256'],'compression_test_ok':True}\nSRC|BACKUP|69|78: z=self.go();self.assertEqual(z['vmid'],112);self.assertEqual(len({a['account_id'] for a in z['replicas']}),2);self.assertEqual(z['local_payload_files_remaining'],0);self.assertEqual(len(self.reader.listed),13);self.assertFalse(z['guest_restore_verified']);self.assertTrue(z['archive_cloud_restore_verified'])\nREC|BACKUP_SOURCE|IDX=70|BASENAME=wrapper.py|PATH_SHA256=43c5db443685705fa4bb5e421cb1b3bbb1073be158e36ca02389b6e7ca97f966|SHA256=9a80e64ef41f0c727b10983f2d26c87588231ec7056e2c2ea7c50cf8229da6f7|SIZE=5055|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|70|6:CT_ID='guest-pve01-lxc-112'\nSRC|BACKUP|70|8:LOCK=Path('<PATH>')\nSRC|BACKUP|70|15:legacy=_load('_backupv2_legacy479',ROOT<PATH>'legacy_engine.py')\nSRC|BACKUP|70|16:ct112=_load('_backupv2_ct112_479',ROOT<PATH>'ct112_handler.py')\nSRC|BACKUP|70|17:driver=_load('_backupv2_driver454_479',ROOT<PATH>'representative_driver.py')\nSRC|BACKUP|70|19:_legacy_backup_target=legacy.backup_target\nSRC|BACKUP|70|25: ids=[x.get('logical_id') for x in out]\nSRC|BACKUP|70|30: xf=[x for x in rows if x.get('logical_id')=='xf-zakrutim']\nSRC|BACKUP|70|34: return {'logical_id':CT_ID,'scope':'pve01 LXC 112 full-guest archive DR','type':'pve_guest','node':'pve01','vmid':112,\nSRC|BACKUP|70|40:def backup_target(t,green_verify=False):\nSRC|BACKUP|70|41: if not isinstance(t,dict) or t.get('logical_id')!=CT_ID:\nSRC|BACKUP|70|42: return _legacy_backup_target(t,green_verify)\nSRC|BACKUP|70|44: r=ct112.run_target(t,state_writer=legacy.write_state)\nSRC|BACKUP|70|45: return {'logical_id':CT_ID,'generation':r['generation'],'result':'SUCCESS','payload_bytes':r['payload_bytes'],\nSRC|BACKUP|70|53:legacy.backup_target=backup_target\nSRC|BACKUP|70|60: want={'ct112',*LEGACY_IDS}\nSRC|BACKUP|70|61: if {t.get('logical_id') for t in d if isinstance(t,dict) and t.get('green1')}!=want: raise RuntimeError('LEGACY_DEFAULT_GREEN_SET')\nSRC|BACKUP|70|71: if len(eff)!=29 or sum(1 for x in eff if x.get('logical_id')==CT_ID)!=1: raise RuntimeError('EFFECTIVE_TARGETS')\nSRC|BACKUP|70|73: if [x['logical_id'] for x in legacy_rows]!=list(LEGACY_IDS) or ct.get('vmid')!=112: raise RuntimeError('REPRESENTATIVE_PARTITION')\nSRC|BACKUP|70|74: if ct112.selftest() is not True: raise RuntimeError('CT112_HANDLER_SELFTEST')\nREC|BACKUP_SOURCE|IDX=71|BASENAME=representative_driver.py|PATH_SHA256=dbd50790739b5354efacfce127f41589e12f5759ae8050674a703cf1c04b575c|SHA256=b3050a8f95e6d9826a4f0786cd3ca32012b6ab10486d10e4981b50b8a0affff2|SIZE=4214|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|71|25:CT112_ID='guest-pve01-lxc-112'\nSRC|BACKUP|71|33:def _logical_id(target: Mapping[str, Any]) -> str:\nSRC|BACKUP|71|34: value=target.get('logical_id') if isinstance(target, Mapping) else None\nSRC|BACKUP|71|43: logical_id=_logical_id(target)\nSRC|BACKUP|71|44: if logical_id not in wanted:\nSRC|BACKUP|71|46: if logical_id in selected:\nSRC|BACKUP|71|48: selected[logical_id]=target\nSRC|BACKUP|71|72: def write_state(logical_id,result,**kw):\nSRC|BACKUP|71|73: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|71|75: payload={'logical_id':logical_id,'result':result,'meta':kw,'schema_version':1}\nSRC|BACKUP|71|76: _atomic_json(root<PATH>'.json'),payload)\nSRC|BACKUP|71|80: logical_id=_logical_id(target)\nSRC|BACKUP|71|81: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|71|83: backup=getattr(engine,'backup_target',None)\nSRC|BACKUP|71|84: if not callable(backup):\nSRC|BACKUP|71|91: return backup(target,True)\nSRC|BACKUP|71|95:def _validate_ct112_result(result):\nSRC|BACKUP|71|98: if result.get('logical_id')!=CT112_ID or result.get('status')!='OK':\nSRC|BACKUP|71|106:def run_representative(engine, targets, ct112_callback: Callable[[Mapping[str, Any]], Any]):\nSRC|BACKUP|71|107: if not callable(ct112_callback):\nSRC|BACKUP|71|109: legacy,ct112=partition_targets(targets)\nSRC|BACKUP|71|110: results=[_validate_ct112_result(ct112_callback(ct112))]\nREC|BACKUP_SOURCE|IDX=72|BASENAME=ct112_handler.py|PATH_SHA256=4c34efcab9981ff7b3aacaefcfb4532cb08fa4898eb0b1e5d97698bd7d5ec1d6|SHA256=e7b027de9a53d7219dd80c9d8e05f0eae0f53db90a53363c64dfa016815c0d00|SIZE=7923|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|72|9:CT_ID='guest-pve01-lxc-112'\nSRC|BACKUP|72|49: vmid=r.get('vmid')\nSRC|BACKUP|72|50: if type(vmid) is not int:raise RuntimeError('PVE_VMID_SCHEMA')\nSRC|BACKUP|72|51: configs[vmid]=_json_cmd(f\"<PATH>'type']}<PATH>\")\nSRC|BACKUP|72|77: def __init__(self,work,entries,binding,guard,deadline,logical_id):\nSRC|BACKUP|72|78: self.work=Path(work);self.entries=entries;self.binding=binding;self.guard=guard;self.deadline=deadline;self.logical_id=logical_id\nSRC|BACKUP|72|85: self.inner=large.ReadOnlyLarge(str(RCLONE),self.snapshot,e,bind,self.guard,self.work,self.deadline,self.logical_id)\nSRC|BACKUP|72|101: if not isinstance(target,dict) or target.get('logical_id')!=CT_ID or target.get('vmid')!=112:return (_ for _ in ()).throw(RuntimeError('CT112_DESCRIPTOR'))\nSRC|BACKUP|72|113: work=STAGING<PATH>'backup-v2-'+generation);work.mkdir(mode=0o700,parents=False,exist_ok=False)\nREC|BACKUP_SOURCE|IDX=73|BASENAME=legacy_engine.py|PATH_SHA256=9a8b05902c8db1d56dc8303ffbd6fef278b3b69b41dd4eda89a767f2a3d6bd25|SHA256=b6e79f087b9f1d21dac4f77a7b46b743299bbb85bc716e80d2ea67c2e038bcd7|SIZE=59719|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|73|6:STATE_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|73|7:CONFIG_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|73|9:WORK_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|73|10:ENGINE_PATH=pathlib.Path('<PATH>')\nSRC|BACKUP|73|25:GUEST266=pathlib.Path('<PATH>')\nSRC|BACKUP|73|27:P270=pathlib.Path('<PATH>')\nSRC|BACKUP|73|29:P282=pathlib.Path('<PATH>')\nSRC|BACKUP|73|31:P265=pathlib.Path('<PATH>')\nSRC|BACKUP|73|35: (pathlib.Path('<PATH>'),'e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2'),\nSRC|BACKUP|73|36: (pathlib.Path('<PATH>'),'b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688'),\nSRC|BACKUP|73|37: (pathlib.Path('<PATH>'),'a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16'),\nSRC|BACKUP|73|38: (pathlib.Path('<PATH>'),'db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060'),\nSRC|BACKUP|73|39: (pathlib.Path('<PATH>'),'5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a'),\nSRC|BACKUP|73|46: pathlib.Path('<PATH>'),\nSRC|BACKUP|73|47: pathlib.Path('<PATH>'),\nSRC|BACKUP|73|48: pathlib.Path('<PATH>'),\nSRC|BACKUP|73|49: pathlib.Path('<PATH>'),\nSRC|BACKUP|73|50: pathlib.Path('<PATH>'),\nSRC|BACKUP|73|51: pathlib.Path('<PATH>'),\nSRC|BACKUP|73|52: pathlib.Path('<PATH>'),\nSRC|BACKUP|73|53: pathlib.Path('<PATH>'),\nSRC|BACKUP|73|54: pathlib.Path('<PATH>'),\nSRC|BACKUP|73|55: pathlib.Path('<PATH>'),\nSRC|BACKUP|73|56: pathlib.Path('<PATH>'),\nSRC|BACKUP|73|132:def remote_generation_path(scope,logical_id,generation):\nSRC|BACKUP|73|134: for x in (scope,logical_id,generation):\nSRC|BACKUP|73|136: return f'homelab-backups<PATH>'\nSRC|BACKUP|73|138:def make_manifest(scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta):\nSRC|BACKUP|73|142: return {'schema':2,'scope':scope,'logical_id':logical_id,'generation':generation,'created_at_utc':utcnow(),\nSRC|BACKUP|73|153: for vmid,typ in [(110,'lxc'),(111,'lxc'),(112,'lxc'),(113,'lxc'),(130,'qemu'),(150,'qemu'),(160,'qemu'),(170,'qemu'),(171,'qemu'),(190,'qemu'),(210,'qemu'),(211,'qemu'),(9130,'qemu')]:\nSRC|BACKUP|73|154: out.append({'logical_id':('ct' if typ=='lxc' else 'vm')+str(vmid),'scope':'pve','type':'pve_guest','vmid':vmid,'guest_type':typ,'due_seconds':d,'enabled':True,'green1':vmid==112})\nSRC|BACKUP|73|156: out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})\nSRC|BACKUP|73|158: {'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'<IP>','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|73|159: {'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'<IP>','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|73|160: {'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'<IP>','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh<PATH>','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|73|161: {'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|73|171: for slug,vmid,node,root,db,strategy in sites:\nSRC|BACKUP|73|172: out.append({'logical_id':'xf-'+slug,'scope':'xenforo','type':'xenforo','slug':slug,'vmid':vmid,'node':node,'app_root':root,'db_name':db,'dump_strategy':strategy,'due_seconds':d,'enabled':True,'green1':slug in ('codevipe','zakrutim')})\nSRC|BACKUP|73|173: out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})\nSRC|BACKUP|73|182: last=int(state.get(t['logical_id'],{}).get('last_success_epoch',0))\nREC|BACKUP_SOURCE|IDX=74|BASENAME=entry494.py|PATH_SHA256=99f2418e3b5a0c024fd31633d318c52891a022416afb72cbc6a0b16830160dfb|SHA256=e235d716e6bdf18efd0561e9aa82afefd5e9c2aff5bf077e24602fcfb9e7e0a6|SIZE=3318|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|74|4:BASE=pathlib.Path('<PATH>')\nSRC|BACKUP|74|9: 'ct112_handler.py':'8cac6e627d5e7abe5d3163cdd24911995a1e3f45c776f9373c2aa68784f5ec6c',\nSRC|BACKUP|74|41: rows=wrapper.load_targets(); hits=[x for x in rows if x.get('logical_id')==lid]\nSRC|BACKUP|74|54: if t.get('guest_type')!='lxc' or t.get('logical_id')=='guest-pve01-lxc-112': raise RuntimeError('PLAN_TARGET_NOT_LEGACY_LXC')\nSRC|BACKUP|74|56: print('PLAN_LXC_RESULT='+json.dumps({'logical_id':t['logical_id'],'vmid':int(t['vmid']),'node':t['node'],'job':out['job']},separators=(',',':'),sort_keys=True),flush=True)\nSRC|BACKUP|74|60: if t.get('logical_id')=='guest-pve01-lxc-112': raise RuntimeError('VERIFY_SYNTHETIC_CT112_FORBIDDEN')\nSRC|BACKUP|74|61: out=wrapper.backup_target(t,True)\nREC|BACKUP_SOURCE|IDX=75|BASENAME=adapter.py|PATH_SHA256=b54dd34c6daba76ea48215747709299a48e6b739b94fa67c03d0abe6ce68e8d5|SHA256=18eb29cef165371b48bcb78e1a456e1939e6eff253787218133162cc89ab9fa3|SIZE=2989|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=76|BASENAME=CONTRACT.json|PATH_SHA256=2bc9ba7e95f53bb060cad215d499fb7dfe21d3eba5689a7a81e9de60967afd5d|SHA256=a414715f1b91b3701c52073709a80c38218f76e3961618e8af61489211e50c01|SIZE=2077|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=77|BASENAME=pve282.py|PATH_SHA256=88dca45d58d8450c844fcef968c408ac80c8c3efa29870570018e41da934cd37|SHA256=73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012|SIZE=6195|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|77|3:No changes to source guest configuration; no source110 backup or guest deletion.\nSRC|BACKUP|77|24: need(type(job) is dict and type(job.get('vmid')) is int and job['vmid']==TARGET_VMID and\nSRC|BACKUP|77|31: by_id={j['vmid']:j for j in previous}\nSRC|BACKUP|77|34: need({j['vmid'] for j in rows}==set(by_id),'ACCEPTED265_MEMBERSHIP_CHANGED')\nSRC|BACKUP|77|36: need(row['config_sha256']==by_id[row['vmid']]['config_sha256'],'ACCEPTED265_GUEST_CONFIG_CHANGED')\nSRC|BACKUP|77|37: selected=[j for j in rows if j['vmid']==TARGET_VMID]\nSRC|BACKUP|77|44: need(disk.get('slot')=='rootfs' and disk.get('class')=='managed-volume' and disk.get('backup_setting') in ('included','included_default_rootfs'),'CT112_MANAGED_ROOTFS_REQUIRED')\nSRC|BACKUP|77|92: return {**result,'path':str(dest),'vmid':112,'type':'lxc','node':job['node'],'config_sha256':job['config_sha256'],\nREC|BACKUP_SOURCE|IDX=78|BASENAME=test_pve282.py|PATH_SHA256=0a74156c05121ea3aef130d2abb70d1bd782954ce3f106fbf62aa0eca51a83eb|SHA256=1056407aab76e17181b05e043cb42c086058545a8e0027689ab4e03eee6531c4|SIZE=5785|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|78|17: rows=[{'vmid':v,'type':'lxc' if v in (110,112) else 'qemu','node':'pve01','status':'running','maxdisk':8*G} for v in (110,112,150)]\nSRC|BACKUP|78|28: def test_selects_only112(self):self.assertEqual(f.select112(plan(),plan(),NOW)['vmid'],112)\nSRC|BACKUP|78|33: b=copy.deepcopy(a);self.assertEqual(f.select112(a,b,NOW)['vmid'],112)\nSRC|BACKUP|78|65: def test_marker_scope_ct112_only(self):self.assertEqual(f.TARGET_VMID,112)\nSRC|BACKUP|78|75: return {'path':str(out),'size':len(self.data),'sha256':t.sha(self.data),'identity':list(identity),'vmid':112,'node':'pve01','type':'lxc','producer_rc':0,'config_sha256':j['config_sha256'],'compression_test_ok':True}\nSRC|BACKUP|78|78: z=self.go();self.assertEqual(z['vmid'],112);self.assertEqual(len({a['account_id'] for a in z['replicas']}),2);self.assertEqual(z['local_payload_files_remaining'],0);self.assertEqual(len(self.reader.listed),13);self.assertFalse(z['guest_restore_verified']);self.assertTrue(z['archive_cloud_restore_verified'])\nREC|BACKUP_SOURCE|IDX=79|BASENAME=wrapper.py|PATH_SHA256=8115ff35840dca283c79a4cc0cbd20f5a50ed53db5e8562ece4f0c91f4852d5a|SHA256=3e16370b38f2f36d0d228fde59ffb05470ca56491e8abcbdcf65e6ee65bdb754|SIZE=5055|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|79|6:CT_ID='guest-pve01-lxc-112'\nSRC|BACKUP|79|8:LOCK=Path('<PATH>')\nSRC|BACKUP|79|15:legacy=_load('_backupv2_legacy483',ROOT<PATH>'legacy_engine.py')\nSRC|BACKUP|79|16:ct112=_load('_backupv2_ct112_483',ROOT<PATH>'ct112_handler.py')\nSRC|BACKUP|79|17:driver=_load('_backupv2_driver454_479',ROOT<PATH>'representative_driver.py')\nSRC|BACKUP|79|19:_legacy_backup_target=legacy.backup_target\nSRC|BACKUP|79|25: ids=[x.get('logical_id') for x in out]\nSRC|BACKUP|79|30: xf=[x for x in rows if x.get('logical_id')=='xf-zakrutim']\nSRC|BACKUP|79|34: return {'logical_id':CT_ID,'scope':'pve01 LXC 112 full-guest archive DR','type':'pve_guest','node':'pve01','vmid':112,\nSRC|BACKUP|79|40:def backup_target(t,green_verify=False):\nSRC|BACKUP|79|41: if not isinstance(t,dict) or t.get('logical_id')!=CT_ID:\nSRC|BACKUP|79|42: return _legacy_backup_target(t,green_verify)\nSRC|BACKUP|79|44: r=ct112.run_target(t,state_writer=legacy.write_state)\nSRC|BACKUP|79|45: return {'logical_id':CT_ID,'generation':r['generation'],'result':'SUCCESS','payload_bytes':r['payload_bytes'],\nSRC|BACKUP|79|53:legacy.backup_target=backup_target\nSRC|BACKUP|79|60: want={'ct112',*LEGACY_IDS}\nSRC|BACKUP|79|61: if {t.get('logical_id') for t in d if isinstance(t,dict) and t.get('green1')}!=want: raise RuntimeError('LEGACY_DEFAULT_GREEN_SET')\nSRC|BACKUP|79|71: if len(eff)!=29 or sum(1 for x in eff if x.get('logical_id')==CT_ID)!=1: raise RuntimeError('EFFECTIVE_TARGETS')\nSRC|BACKUP|79|73: if [x['logical_id'] for x in legacy_rows]!=list(LEGACY_IDS) or ct.get('vmid')!=112: raise RuntimeError('REPRESENTATIVE_PARTITION')\nSRC|BACKUP|79|74: if ct112.selftest() is not True: raise RuntimeError('CT112_HANDLER_SELFTEST')\nREC|BACKUP_SOURCE|IDX=80|BASENAME=representative_driver.py|PATH_SHA256=031e63461b44c8d82cfd4395d8a42d4ed41bd7cce246d918a4bdb83de38282fe|SHA256=b3050a8f95e6d9826a4f0786cd3ca32012b6ab10486d10e4981b50b8a0affff2|SIZE=4214|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|80|25:CT112_ID='guest-pve01-lxc-112'\nSRC|BACKUP|80|33:def _logical_id(target: Mapping[str, Any]) -> str:\nSRC|BACKUP|80|34: value=target.get('logical_id') if isinstance(target, Mapping) else None\nSRC|BACKUP|80|43: logical_id=_logical_id(target)\nSRC|BACKUP|80|44: if logical_id not in wanted:\nSRC|BACKUP|80|46: if logical_id in selected:\nSRC|BACKUP|80|48: selected[logical_id]=target\nSRC|BACKUP|80|72: def write_state(logical_id,result,**kw):\nSRC|BACKUP|80|73: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|80|75: payload={'logical_id':logical_id,'result':result,'meta':kw,'schema_version':1}\nSRC|BACKUP|80|76: _atomic_json(root<PATH>'.json'),payload)\nSRC|BACKUP|80|80: logical_id=_logical_id(target)\nSRC|BACKUP|80|81: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|80|83: backup=getattr(engine,'backup_target',None)\nSRC|BACKUP|80|84: if not callable(backup):\nSRC|BACKUP|80|91: return backup(target,True)\nSRC|BACKUP|80|95:def _validate_ct112_result(result):\nSRC|BACKUP|80|98: if result.get('logical_id')!=CT112_ID or result.get('status')!='OK':\nSRC|BACKUP|80|106:def run_representative(engine, targets, ct112_callback: Callable[[Mapping[str, Any]], Any]):\nSRC|BACKUP|80|107: if not callable(ct112_callback):\nSRC|BACKUP|80|109: legacy,ct112=partition_targets(targets)\nSRC|BACKUP|80|110: results=[_validate_ct112_result(ct112_callback(ct112))]\nREC|BACKUP_SOURCE|IDX=81|BASENAME=ct112_handler.py|PATH_SHA256=2f008ee94cfba105b0873924e40c8c72077600c9c614f3a86b7bf26191ca9f6c|SHA256=1694d7ae012ed2641a80fb22cbe872ef3ec972fa630708a5544b2e8d05bbf7ef|SIZE=7908|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|81|9:CT_ID='guest-pve01-lxc-112'\nSRC|BACKUP|81|49: vmid=r.get('vmid')\nSRC|BACKUP|81|50: if type(vmid) is not int:raise RuntimeError('PVE_VMID_SCHEMA')\nSRC|BACKUP|81|51: configs[vmid]=_json_cmd(f\"<PATH>'type']}<PATH>\")\nSRC|BACKUP|81|77: def __init__(self,work,entries,binding,guard,deadline,logical_id):\nSRC|BACKUP|81|78: self.work=Path(work);self.entries=entries;self.binding=binding;self.guard=guard;self.deadline=deadline;self.logical_id=logical_id\nSRC|BACKUP|81|85: self.inner=large.ReadOnlyLarge(str(RCLONE),self.snapshot,e,bind,self.guard,self.work,self.deadline,self.logical_id)\nSRC|BACKUP|81|101: if not isinstance(target,dict) or target.get('logical_id')!=CT_ID or target.get('vmid')!=112:return (_ for _ in ()).throw(RuntimeError('CT112_DESCRIPTOR'))\nSRC|BACKUP|81|113: work=STAGING<PATH>'backup-v2-'+generation);work.mkdir(mode=0o700,parents=False,exist_ok=False)\nREC|BACKUP_SOURCE|IDX=82|BASENAME=legacy_engine.py|PATH_SHA256=ada28322dd44b921f815bb2cdba360506c3f4e2a58c97f1eea9a2a6d4e384c9d|SHA256=b6e79f087b9f1d21dac4f77a7b46b743299bbb85bc716e80d2ea67c2e038bcd7|SIZE=59719|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|82|6:STATE_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|82|7:CONFIG_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|82|9:WORK_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|82|10:ENGINE_PATH=pathlib.Path('<PATH>')\nSRC|BACKUP|82|25:GUEST266=pathlib.Path('<PATH>')\nSRC|BACKUP|82|27:P270=pathlib.Path('<PATH>')\nSRC|BACKUP|82|29:P282=pathlib.Path('<PATH>')\nSRC|BACKUP|82|31:P265=pathlib.Path('<PATH>')\nSRC|BACKUP|82|35: (pathlib.Path('<PATH>'),'e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2'),\nSRC|BACKUP|82|36: (pathlib.Path('<PATH>'),'b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688'),\nSRC|BACKUP|82|37: (pathlib.Path('<PATH>'),'a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16'),\nSRC|BACKUP|82|38: (pathlib.Path('<PATH>'),'db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060'),\nSRC|BACKUP|82|39: (pathlib.Path('<PATH>'),'5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a'),\nSRC|BACKUP|82|46: pathlib.Path('<PATH>'),\nSRC|BACKUP|82|47: pathlib.Path('<PATH>'),\nSRC|BACKUP|82|48: pathlib.Path('<PATH>'),\nSRC|BACKUP|82|49: pathlib.Path('<PATH>'),\nSRC|BACKUP|82|50: pathlib.Path('<PATH>'),\nSRC|BACKUP|82|51: pathlib.Path('<PATH>'),\nSRC|BACKUP|82|52: pathlib.Path('<PATH>'),\nSRC|BACKUP|82|53: pathlib.Path('<PATH>'),\nSRC|BACKUP|82|54: pathlib.Path('<PATH>'),\nSRC|BACKUP|82|55: pathlib.Path('<PATH>'),\nSRC|BACKUP|82|56: pathlib.Path('<PATH>'),\nSRC|BACKUP|82|132:def remote_generation_path(scope,logical_id,generation):\nSRC|BACKUP|82|134: for x in (scope,logical_id,generation):\nSRC|BACKUP|82|136: return f'homelab-backups<PATH>'\nSRC|BACKUP|82|138:def make_manifest(scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta):\nSRC|BACKUP|82|142: return {'schema':2,'scope':scope,'logical_id':logical_id,'generation':generation,'created_at_utc':utcnow(),\nSRC|BACKUP|82|153: for vmid,typ in [(110,'lxc'),(111,'lxc'),(112,'lxc'),(113,'lxc'),(130,'qemu'),(150,'qemu'),(160,'qemu'),(170,'qemu'),(171,'qemu'),(190,'qemu'),(210,'qemu'),(211,'qemu'),(9130,'qemu')]:\nSRC|BACKUP|82|154: out.append({'logical_id':('ct' if typ=='lxc' else 'vm')+str(vmid),'scope':'pve','type':'pve_guest','vmid':vmid,'guest_type':typ,'due_seconds':d,'enabled':True,'green1':vmid==112})\nSRC|BACKUP|82|156: out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})\nSRC|BACKUP|82|158: {'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'<IP>','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|82|159: {'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'<IP>','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|82|160: {'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'<IP>','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh<PATH>','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|82|161: {'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|82|171: for slug,vmid,node,root,db,strategy in sites:\nSRC|BACKUP|82|172: out.append({'logical_id':'xf-'+slug,'scope':'xenforo','type':'xenforo','slug':slug,'vmid':vmid,'node':node,'app_root':root,'db_name':db,'dump_strategy':strategy,'due_seconds':d,'enabled':True,'green1':slug in ('codevipe','zakrutim')})\nSRC|BACKUP|82|173: out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})\nSRC|BACKUP|82|182: last=int(state.get(t['logical_id'],{}).get('last_success_epoch',0))\nREC|BACKUP_SOURCE|IDX=83|BASENAME=adapter.py|PATH_SHA256=49e2f0d6df3111daad4022cc5632f53d3722c6e669ae72acc1fd3ce6c504aa17|SHA256=18eb29cef165371b48bcb78e1a456e1939e6eff253787218133162cc89ab9fa3|SIZE=2989|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=84|BASENAME=CONTRACT.json|PATH_SHA256=8356a3bc5a06e8bbd89dd4787c0e39417a746aba1a89d2dd52a780e40c1fcde7|SHA256=a414715f1b91b3701c52073709a80c38218f76e3961618e8af61489211e50c01|SIZE=2077|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=85|BASENAME=pve282.py|PATH_SHA256=b17d73ebc13208d1b19b1d1b32f8aa6e76198a98eb8f904a690a5ab89f92e432|SHA256=73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012|SIZE=6195|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|85|3:No changes to source guest configuration; no source110 backup or guest deletion.\nSRC|BACKUP|85|24: need(type(job) is dict and type(job.get('vmid')) is int and job['vmid']==TARGET_VMID and\nSRC|BACKUP|85|31: by_id={j['vmid']:j for j in previous}\nSRC|BACKUP|85|34: need({j['vmid'] for j in rows}==set(by_id),'ACCEPTED265_MEMBERSHIP_CHANGED')\nSRC|BACKUP|85|36: need(row['config_sha256']==by_id[row['vmid']]['config_sha256'],'ACCEPTED265_GUEST_CONFIG_CHANGED')\nSRC|BACKUP|85|37: selected=[j for j in rows if j['vmid']==TARGET_VMID]\nSRC|BACKUP|85|44: need(disk.get('slot')=='rootfs' and disk.get('class')=='managed-volume' and disk.get('backup_setting') in ('included','included_default_rootfs'),'CT112_MANAGED_ROOTFS_REQUIRED')\nSRC|BACKUP|85|92: return {**result,'path':str(dest),'vmid':112,'type':'lxc','node':job['node'],'config_sha256':job['config_sha256'],\nREC|BACKUP_SOURCE|IDX=86|BASENAME=test_pve282.py|PATH_SHA256=784e0d98ce3211c17fd9e5fa350e570c5b0b136321406d587705474ce91a8430|SHA256=1056407aab76e17181b05e043cb42c086058545a8e0027689ab4e03eee6531c4|SIZE=5785|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|86|17: rows=[{'vmid':v,'type':'lxc' if v in (110,112) else 'qemu','node':'pve01','status':'running','maxdisk':8*G} for v in (110,112,150)]\nSRC|BACKUP|86|28: def test_selects_only112(self):self.assertEqual(f.select112(plan(),plan(),NOW)['vmid'],112)\nSRC|BACKUP|86|33: b=copy.deepcopy(a);self.assertEqual(f.select112(a,b,NOW)['vmid'],112)\nSRC|BACKUP|86|65: def test_marker_scope_ct112_only(self):self.assertEqual(f.TARGET_VMID,112)\nSRC|BACKUP|86|75: return {'path':str(out),'size':len(self.data),'sha256':t.sha(self.data),'identity':list(identity),'vmid':112,'node':'pve01','type':'lxc','producer_rc':0,'config_sha256':j['config_sha256'],'compression_test_ok':True}\nSRC|BACKUP|86|78: z=self.go();self.assertEqual(z['vmid'],112);self.assertEqual(len({a['account_id'] for a in z['replicas']}),2);self.assertEqual(z['local_payload_files_remaining'],0);self.assertEqual(len(self.reader.listed),13);self.assertFalse(z['guest_restore_verified']);self.assertTrue(z['archive_cloud_restore_verified'])\nREC|BACKUP_SOURCE|IDX=87|BASENAME=wrapper.py|PATH_SHA256=91496295122dcb0bb41cb43ce8a7e1a78a5133910adee24563f446b53f30f5c0|SHA256=dee410755a86ecae0fb921454109f48b9ea57d11724a3e1cc8001a87ea78dba5|SIZE=5076|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|87|6:CT_ID='guest-pve01-lxc-112'\nSRC|BACKUP|87|8:LOCK=Path('<PATH>')\nSRC|BACKUP|87|15:legacy=_load('_backupv2_legacy486',ROOT<PATH>'legacy_engine.py')\nSRC|BACKUP|87|16:ct112=_load('_backupv2_ct112_486',ROOT<PATH>'ct112_handler.py')\nSRC|BACKUP|87|17:driver=_load('_backupv2_driver454_479',ROOT<PATH>'representative_driver.py')\nSRC|BACKUP|87|19:_legacy_backup_target=legacy.backup_target\nSRC|BACKUP|87|25: ids=[x.get('logical_id') for x in out]\nSRC|BACKUP|87|30: xf=[x for x in rows if x.get('logical_id')=='xf-zakrutim']\nSRC|BACKUP|87|34: return {'logical_id':CT_ID,'scope':'pve01 LXC 112 full-guest archive DR','type':'pve_guest','node':'pve01','vmid':112,\nSRC|BACKUP|87|40:def backup_target(t,green_verify=False):\nSRC|BACKUP|87|41: if not isinstance(t,dict) or t.get('logical_id')!=CT_ID:\nSRC|BACKUP|87|42: return _legacy_backup_target(t,green_verify)\nSRC|BACKUP|87|44: r=ct112.run_target(t,state_writer=legacy.write_state)\nSRC|BACKUP|87|45: return {'logical_id':CT_ID,'generation':r['generation'],'result':'SUCCESS','payload_bytes':r['payload_bytes'],\nSRC|BACKUP|87|53:legacy.backup_target=backup_target\nSRC|BACKUP|87|60: want={'ct112',*LEGACY_IDS}\nSRC|BACKUP|87|61: if {t.get('logical_id') for t in d if isinstance(t,dict) and t.get('green1')}!=want: raise RuntimeError('LEGACY_DEFAULT_GREEN_SET')\nSRC|BACKUP|87|71: if len(eff)!=29 or sum(1 for x in eff if x.get('logical_id')==CT_ID)!=1: raise RuntimeError('EFFECTIVE_TARGETS')\nSRC|BACKUP|87|73: if [x['logical_id'] for x in legacy_rows]!=list(LEGACY_IDS) or ct.get('vmid')!=112: raise RuntimeError('REPRESENTATIVE_PARTITION')\nSRC|BACKUP|87|74: if ct112.selftest() is not True: raise RuntimeError('CT112_HANDLER_SELFTEST')\nREC|BACKUP_SOURCE|IDX=88|BASENAME=representative_driver.py|PATH_SHA256=e7dea74f3da085db4cc43a65d5bcd12c7569311d2e2625424f1c9c13c4f973aa|SHA256=b3050a8f95e6d9826a4f0786cd3ca32012b6ab10486d10e4981b50b8a0affff2|SIZE=4214|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|88|25:CT112_ID='guest-pve01-lxc-112'\nSRC|BACKUP|88|33:def _logical_id(target: Mapping[str, Any]) -> str:\nSRC|BACKUP|88|34: value=target.get('logical_id') if isinstance(target, Mapping) else None\nSRC|BACKUP|88|43: logical_id=_logical_id(target)\nSRC|BACKUP|88|44: if logical_id not in wanted:\nSRC|BACKUP|88|46: if logical_id in selected:\nSRC|BACKUP|88|48: selected[logical_id]=target\nSRC|BACKUP|88|72: def write_state(logical_id,result,**kw):\nSRC|BACKUP|88|73: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|88|75: payload={'logical_id':logical_id,'result':result,'meta':kw,'schema_version':1}\nSRC|BACKUP|88|76: _atomic_json(root<PATH>'.json'),payload)\nSRC|BACKUP|88|80: logical_id=_logical_id(target)\nSRC|BACKUP|88|81: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|88|83: backup=getattr(engine,'backup_target',None)\nSRC|BACKUP|88|84: if not callable(backup):\nSRC|BACKUP|88|91: return backup(target,True)\nSRC|BACKUP|88|95:def _validate_ct112_result(result):\nSRC|BACKUP|88|98: if result.get('logical_id')!=CT112_ID or result.get('status')!='OK':\nSRC|BACKUP|88|106:def run_representative(engine, targets, ct112_callback: Callable[[Mapping[str, Any]], Any]):\nSRC|BACKUP|88|107: if not callable(ct112_callback):\nSRC|BACKUP|88|109: legacy,ct112=partition_targets(targets)\nSRC|BACKUP|88|110: results=[_validate_ct112_result(ct112_callback(ct112))]\nREC|BACKUP_SOURCE|IDX=89|BASENAME=ct112_handler.py|PATH_SHA256=8bab47c07b84752b30b25cf4a60a7643c52ea238db95c45016e96bffe310110b|SHA256=8cac6e627d5e7abe5d3163cdd24911995a1e3f45c776f9373c2aa68784f5ec6c|SIZE=10955|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|89|9:CT_ID='guest-pve01-lxc-112'\nSRC|BACKUP|89|49: vmid=r.get('vmid')\nSRC|BACKUP|89|50: if type(vmid) is not int:raise RuntimeError('PVE_VMID_SCHEMA')\nSRC|BACKUP|89|51: configs[vmid]=_json_cmd(f\"<PATH>'type']}<PATH>\")\nSRC|BACKUP|89|56:def _select_live_ct112(plan,now,expected_config=None):\nSRC|BACKUP|89|61: vmids=[j.get('vmid') for j in jobs if isinstance(j,dict)]\nSRC|BACKUP|89|62: if len(vmids)!=len(jobs) or len(vmids)!=len(set(vmids)):raise RuntimeError('CT112_PLAN_MEMBERSHIP')\nSRC|BACKUP|89|63: matches=[j for j in jobs if j.get('vmid')==112]\nSRC|BACKUP|89|74:def _assert_live_state_unchanged(before,after,vmid):\nSRC|BACKUP|89|79: if any(type(x) is not dict or type(x.get('vmid')) is not int for x in rows):raise RuntimeError('CT112_STATE_SCHEMA')\nSRC|BACKUP|89|80: return sorted((x['vmid'],x.get('type'),x.get('node'),x.get('status'),x.get('template')) for x in rows)\nSRC|BACKUP|89|83: a=[j for j in old if j.get('vmid')==vmid];b=[j for j in new if j.get('vmid')==vmid]\nSRC|BACKUP|89|119: def __init__(self,work,entries,binding,guard,deadline,logical_id):\nSRC|BACKUP|89|120: self.work=Path(work);self.entries=entries;self.binding=binding;self.guard=guard;self.deadline=deadline;self.logical_id=logical_id\nSRC|BACKUP|89|127: self.inner=large.ReadOnlyLarge(str(RCLONE),self.snapshot,e,bind,self.guard,self.work,self.deadline,self.logical_id)\nSRC|BACKUP|89|143: if not isinstance(target,dict) or target.get('logical_id')!=CT_ID or target.get('vmid')!=112:return (_ for _ in ()).throw(RuntimeError('CT112_DESCRIPTOR'))\nSRC|BACKUP|89|146: pvesh_sha=_sha(PVESH);now=int(time.time());current=_fresh_plan(now);job=_select_live_ct112(current,now)\nSRC|BACKUP|89|149: now2=int(time.time());fresh_plan=_fresh_plan(now2);fresh=_select_live_ct112(fresh_plan,now2,expected)\nSRC|BACKUP|89|157: work=STAGING<PATH>'backup-v2-'+generation);work.mkdir(mode=0o700,parents=False,exist_ok=False)\nREC|BACKUP_SOURCE|IDX=90|BASENAME=legacy_engine.py|PATH_SHA256=b08598c199b979909827472414e9d774eed12f00ff61eb1534b9cf9ff4333d05|SHA256=a5f1b1701a39eb22cf2f061d7daa7afa92789320c30b108371c3ee47d57f817c|SIZE=59868|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|90|6:STATE_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|90|7:CONFIG_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|90|9:WORK_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|90|10:ENGINE_PATH=pathlib.Path('<PATH>')\nSRC|BACKUP|90|25:GUEST266=pathlib.Path('<PATH>')\nSRC|BACKUP|90|27:P270=pathlib.Path('<PATH>')\nSRC|BACKUP|90|29:P282=pathlib.Path('<PATH>')\nSRC|BACKUP|90|31:P265=pathlib.Path('<PATH>')\nSRC|BACKUP|90|35: (pathlib.Path('<PATH>'),'e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2'),\nSRC|BACKUP|90|36: (pathlib.Path('<PATH>'),'b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688'),\nSRC|BACKUP|90|37: (pathlib.Path('<PATH>'),'a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16'),\nSRC|BACKUP|90|38: (pathlib.Path('<PATH>'),'db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060'),\nSRC|BACKUP|90|39: (pathlib.Path('<PATH>'),'5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a'),\nSRC|BACKUP|90|46: pathlib.Path('<PATH>'),\nSRC|BACKUP|90|47: pathlib.Path('<PATH>'),\nSRC|BACKUP|90|48: pathlib.Path('<PATH>'),\nSRC|BACKUP|90|49: pathlib.Path('<PATH>'),\nSRC|BACKUP|90|50: pathlib.Path('<PATH>'),\nSRC|BACKUP|90|51: pathlib.Path('<PATH>'),\nSRC|BACKUP|90|52: pathlib.Path('<PATH>'),\nSRC|BACKUP|90|53: pathlib.Path('<PATH>'),\nSRC|BACKUP|90|54: pathlib.Path('<PATH>'),\nSRC|BACKUP|90|55: pathlib.Path('<PATH>'),\nSRC|BACKUP|90|56: pathlib.Path('<PATH>'),\nSRC|BACKUP|90|132:def remote_generation_path(scope,logical_id,generation):\nSRC|BACKUP|90|134: for x in (scope,logical_id,generation):\nSRC|BACKUP|90|136: return f'homelab-backups<PATH>'\nSRC|BACKUP|90|138:def make_manifest(scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta):\nSRC|BACKUP|90|142: return {'schema':2,'scope':scope,'logical_id':logical_id,'generation':generation,'created_at_utc':utcnow(),\nSRC|BACKUP|90|153: for vmid,typ in [(110,'lxc'),(111,'lxc'),(112,'lxc'),(113,'lxc'),(130,'qemu'),(150,'qemu'),(160,'qemu'),(170,'qemu'),(171,'qemu'),(190,'qemu'),(210,'qemu'),(211,'qemu'),(9130,'qemu')]:\nSRC|BACKUP|90|154: out.append({'logical_id':('ct' if typ=='lxc' else 'vm')+str(vmid),'scope':'pve','type':'pve_guest','vmid':vmid,'guest_type':typ,'due_seconds':d,'enabled':True,'green1':vmid==112})\nSRC|BACKUP|90|156: out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})\nSRC|BACKUP|90|158: {'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'<IP>','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|90|159: {'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'<IP>','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|90|160: {'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'<IP>','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh<PATH>','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|90|161: {'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|90|171: for slug,vmid,node,root,db,strategy in sites:\nSRC|BACKUP|90|172: out.append({'logical_id':'xf-'+slug,'scope':'xenforo','type':'xenforo','slug':slug,'vmid':vmid,'node':node,'app_root':root,'db_name':db,'dump_strategy':strategy,'due_seconds':d,'enabled':True,'green1':slug in ('codevipe','zakrutim')})\nSRC|BACKUP|90|173: out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})\nSRC|BACKUP|90|182: last=int(state.get(t['logical_id'],{}).get('last_success_epoch',0))\nREC|BACKUP_SOURCE|IDX=91|BASENAME=entry500.py|PATH_SHA256=1fb7ac483153d7a1d6413ff7fcdad11bf64c51da4f4378477122faae9e0a46f5|SHA256=a3964599e60c3309efb23dc3b4d9b514d8f27e73d2257359c7a2e5de764b39d9|SIZE=5347|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|91|4:BASE=pathlib.Path('<PATH>')\nSRC|BACKUP|91|9: 'ct112_handler.py':'8cac6e627d5e7abe5d3163cdd24911995a1e3f45c776f9373c2aa68784f5ec6c',\nSRC|BACKUP|91|62: required=('capture_pve_guest','backup_target','load_targets','cluster_inventory','ssh_remote',\nSRC|BACKUP|91|87: rows=wrapper.load_targets(); hits=[x for x in rows if x.get('logical_id')==lid]\nSRC|BACKUP|91|95: if not callable(wrapper.backup_target) or not callable(wrapper.main) or not callable(wrapper.load_targets):\nSRC|BACKUP|91|108: if t.get('guest_type')!='lxc' or t.get('logical_id')=='guest-pve01-lxc-112':\nSRC|BACKUP|91|111: print('PLAN_LXC_RESULT='+json.dumps({'logical_id':t['logical_id'],'vmid':int(t['vmid']),'node':out['job']['node'],'job':out['job']},separators=(',',':'),sort_keys=True),flush=True)\nSRC|BACKUP|91|115: if t.get('logical_id')=='guest-pve01-lxc-112':\nSRC|BACKUP|91|117: out=wrapper.backup_target(t,True)\nREC|BACKUP_SOURCE|IDX=92|BASENAME=entry504.py|PATH_SHA256=e45dceca404d9cd9ea4aae4f87fd13c44557fc29dc07d67b62d16021777efbaa|SHA256=ca6876fa9c3b1465b045344a8ad46962de16972c7dadc4ac6257c7d225047793|SIZE=10566|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|92|4:BASE=pathlib.Path('<PATH>')\nSRC|BACKUP|92|9: 'ct112_handler.py':'8cac6e627d5e7abe5d3163cdd24911995a1e3f45c776f9373c2aa68784f5ec6c',\nSRC|BACKUP|92|62: required=('capture_pve_guest','backup_target','load_targets','cluster_inventory','ssh_remote',\nSRC|BACKUP|92|100: rows=wrapper.load_targets(); hits=[x for x in rows if x.get('logical_id')==lid]\nSRC|BACKUP|92|114: if not callable(wrapper.backup_target) or not callable(wrapper.main) or not callable(wrapper.load_targets):\nSRC|BACKUP|92|141: targets=[{'logical_id':'proof-a','enabled':True,'due_seconds':100},{'logical_id':'proof-b','enabled':True,'due_seconds':100}]\nSRC|BACKUP|92|143: if not isinstance(first,dict) or first.get('logical_id')!='proof-b': raise RuntimeError('SCHEDULER_PROOF_PEER_NOT_SELECTED')\nSRC|BACKUP|92|149: if not isinstance(second,dict) or second.get('logical_id')!='proof-a': raise RuntimeError('SCHEDULER_PROOF_RETRY_NOT_REELIGIBLE')\nSRC|BACKUP|92|154: proof={'failed_target':'proof-a','peer_selected_during_backoff':first['logical_id'],'retry_after_epoch':retry,'last_success_preserved':preserved==1000,'retry_target_after_backoff':second['logical_id'],'success_resets_failures':True,'production_state_root_used':False}\nSRC|BACKUP|92|165: print('SCHEDULER_LIVE_SELECTION='+json.dumps({'logical_id':chosen.get('logical_id'),'due_seconds':chosen.get('due_seconds'),'enabled':chosen.get('enabled') is True},separators=(',',':'),sort_keys=True),flush=True)\nSRC|BACKUP|92|169: if t.get('guest_type')!='lxc' or t.get('logical_id')=='guest-pve01-lxc-112':\nSRC|BACKUP|92|172: print('PLAN_LXC_RESULT='+json.dumps({'logical_id':t['logical_id'],'vmid':int(t['vmid']),'node':out['job']['node'],'job':out['job']},separators=(',',':'),sort_keys=True),flush=True)\nSRC|BACKUP|92|176: if t.get('logical_id')=='guest-pve01-lxc-112':\nSRC|BACKUP|92|179: out=wrapper.backup_target(t,True)\nREC|BACKUP_SOURCE|IDX=93|BASENAME=engine394.py|PATH_SHA256=4e2dc451f7792d52e3fec3607ed4ce812a63e37f6a4db1314e1bc31c9bb6e04c|SHA256=c201145ac029a3ca43027df292fc57f91c2fa40118e2ce8225cf5c2c070a2e0d|SIZE=56245|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|93|6:STATE_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|93|7:CONFIG_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|93|9:WORK_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|93|10:ENGINE_PATH=pathlib.Path('<PATH>')\nSRC|BACKUP|93|25:GUEST266=pathlib.Path('<PATH>')\nSRC|BACKUP|93|27:P270=pathlib.Path('<PATH>')\nSRC|BACKUP|93|29:P282=pathlib.Path('<PATH>')\nSRC|BACKUP|93|89:def remote_generation_path(scope,logical_id,generation):\nSRC|BACKUP|93|91: for x in (scope,logical_id,generation):\nSRC|BACKUP|93|93: return f'homelab-backups<PATH>'\nSRC|BACKUP|93|95:def make_manifest(scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta):\nSRC|BACKUP|93|99: return {'schema':2,'scope':scope,'logical_id':logical_id,'generation':generation,'created_at_utc':utcnow(),\nSRC|BACKUP|93|110: for vmid,typ in [(110,'lxc'),(111,'lxc'),(112,'lxc'),(113,'lxc'),(130,'qemu'),(150,'qemu'),(160,'qemu'),(170,'qemu'),(171,'qemu'),(190,'qemu'),(210,'qemu'),(211,'qemu'),(9130,'qemu')]:\nSRC|BACKUP|93|111: out.append({'logical_id':('ct' if typ=='lxc' else 'vm')+str(vmid),'scope':'pve','type':'pve_guest','vmid':vmid,'guest_type':typ,'due_seconds':d,'enabled':True,'green1':vmid==112})\nSRC|BACKUP|93|113: out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})\nSRC|BACKUP|93|115: {'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'<IP>','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|93|116: {'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'<IP>','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|93|117: {'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'<IP>','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh<PATH>','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|93|118: {'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|93|128: for slug,vmid,node,root,db,strategy in sites:\nSRC|BACKUP|93|129: out.append({'logical_id':'xf-'+slug,'scope':'xenforo','type':'xenforo','slug':slug,'vmid':vmid,'node':node,'app_root':root,'db_name':db,'dump_strategy':strategy,'due_seconds':d,'enabled':True,'green1':slug in ('codevipe','zakrutim')})\nSRC|BACKUP|93|130: out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})\nSRC|BACKUP|93|139: last=int(state.get(t['logical_id'],{}).get('last_success_epoch',0))\nSRC|BACKUP|93|141: if last==0 or age>=due: c.append((-(age<PATH>'logical_id'],t))\nSRC|BACKUP|93|196: ids=[x.get('logical_id') for x in j['targets']]\nSRC|BACKUP|93|206: j=json.loads(p.read_text()); d[j['logical_id']]=j\nSRC|BACKUP|93|210:def write_state(logical_id,result,**kw):\nSRC|BACKUP|93|212: j={'schema':1,'logical_id':logical_id,'result':result,'updated_at_utc':utcnow(),**kw}\nSRC|BACKUP|93|214: atomic_write(STATE_ROOT<PATH>'state'<PATH>'.json'),canonical_json(j)+b'\\n',0o600)\nSRC|BACKUP|93|237:def remote_exists_any(scope,logical_id,generation):\nSRC|BACKUP|93|238: rel=remote_generation_path(scope,logical_id,generation)\nSRC|BACKUP|93|285:def generation_id(logical_id):\nSRC|BACKUP|93|287: return f'v2-{logical_id}-{ts}-{os.urandom(6).hex()}'\nSRC|BACKUP|93|292: gen=source_meta['generation']; rel=remote_generation_path(t['scope'],t['logical_id'],gen)\nSRC|BACKUP|93|293: if remote_exists_any(t['scope'],t['logical_id'],gen): raise BackupError('GENERATION_COLLISION')\nSRC|BACKUP|93|296: manifest=make_manifest(t['scope'],t['logical_id'],gen,n,psha,parts,reps,source_meta)\nSRC|BACKUP|93|307: seal={'schema':1,'generation':gen,'logical_id':t['logical_id'],'manifest_sha256':msha,'payload_sha256':psha,'status':'SEALED','sealed_at_utc':utcnow()}\nSRC|BACKUP|93|316: rel=remote_generation_path(manifest['scope'],manifest['logical_id'],manifest['generation'])\nSRC|BACKUP|93|351: # Green set is intentionally CT-only. Scheduled QEMU backups still get dual remote byte readback.\nSRC|BACKUP|93|382: for d in [GUEST266.parent,pathlib.Path('<PATH>'),pathlib.Path('<PATH>'),pathlib.Path('<PATH>')]:\nREC|BACKUP_SOURCE|IDX=94|BASENAME=adapter.py|PATH_SHA256=1ad2149188af73bd54ae07eb10c080ac87cf8056a6755d071fe6084c2e51b5cd|SHA256=18eb29cef165371b48bcb78e1a456e1939e6eff253787218133162cc89ab9fa3|SIZE=2989|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=95|BASENAME=CONTRACT.json|PATH_SHA256=a25dba269a0dbf67b3909048e950ced56798837e967a0f7cb0887c628b934553|SHA256=a414715f1b91b3701c52073709a80c38218f76e3961618e8af61489211e50c01|SIZE=2077|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nREC|BACKUP_SOURCE|IDX=96|BASENAME=pve282.py|PATH_SHA256=6e82b84f9418567f33ee4e4c2a06a1d6206380179189125a55de17e35d867676|SHA256=73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012|SIZE=6195|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|96|3:No changes to source guest configuration; no source110 backup or guest deletion.\nSRC|BACKUP|96|24: need(type(job) is dict and type(job.get('vmid')) is int and job['vmid']==TARGET_VMID and\nSRC|BACKUP|96|31: by_id={j['vmid']:j for j in previous}\nSRC|BACKUP|96|34: need({j['vmid'] for j in rows}==set(by_id),'ACCEPTED265_MEMBERSHIP_CHANGED')\nSRC|BACKUP|96|36: need(row['config_sha256']==by_id[row['vmid']]['config_sha256'],'ACCEPTED265_GUEST_CONFIG_CHANGED')\nSRC|BACKUP|96|37: selected=[j for j in rows if j['vmid']==TARGET_VMID]\nSRC|BACKUP|96|44: need(disk.get('slot')=='rootfs' and disk.get('class')=='managed-volume' and disk.get('backup_setting') in ('included','included_default_rootfs'),'CT112_MANAGED_ROOTFS_REQUIRED')\nSRC|BACKUP|96|92: return {**result,'path':str(dest),'vmid':112,'type':'lxc','node':job['node'],'config_sha256':job['config_sha256'],\nREC|BACKUP_SOURCE|IDX=97|BASENAME=test_pve282.py|PATH_SHA256=9cdc467041afef35889719f95e04bb27a03d690a77eaef117a57e85c49089ef9|SHA256=1056407aab76e17181b05e043cb42c086058545a8e0027689ab4e03eee6531c4|SIZE=5785|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|97|17: rows=[{'vmid':v,'type':'lxc' if v in (110,112) else 'qemu','node':'pve01','status':'running','maxdisk':8*G} for v in (110,112,150)]\nSRC|BACKUP|97|28: def test_selects_only112(self):self.assertEqual(f.select112(plan(),plan(),NOW)['vmid'],112)\nSRC|BACKUP|97|33: b=copy.deepcopy(a);self.assertEqual(f.select112(a,b,NOW)['vmid'],112)\nSRC|BACKUP|97|65: def test_marker_scope_ct112_only(self):self.assertEqual(f.TARGET_VMID,112)\nSRC|BACKUP|97|75: return {'path':str(out),'size':len(self.data),'sha256':t.sha(self.data),'identity':list(identity),'vmid':112,'node':'pve01','type':'lxc','producer_rc':0,'config_sha256':j['config_sha256'],'compression_test_ok':True}\nSRC|BACKUP|97|78: z=self.go();self.assertEqual(z['vmid'],112);self.assertEqual(len({a['account_id'] for a in z['replicas']}),2);self.assertEqual(z['local_payload_files_remaining'],0);self.assertEqual(len(self.reader.listed),13);self.assertFalse(z['guest_restore_verified']);self.assertTrue(z['archive_cloud_restore_verified'])\nREC|BACKUP_SOURCE|IDX=98|BASENAME=wrapper.py|PATH_SHA256=ef99ff36edb680baa62d54a0afc0e87b9212dd856c46fa825f32a2f9f12a814c|SHA256=2b5eb4fc0f6f466a0d3e5a007af987092b6c17baa3ff9241a6afc2c2e97df1d5|SIZE=5055|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|98|6:CT_ID='guest-pve01-lxc-112'\nSRC|BACKUP|98|8:LOCK=Path('<PATH>')\nSRC|BACKUP|98|15:legacy=_load('_backupv2_legacy486',ROOT<PATH>'legacy_engine.py')\nSRC|BACKUP|98|16:ct112=_load('_backupv2_ct112_486',ROOT<PATH>'ct112_handler.py')\nSRC|BACKUP|98|17:driver=_load('_backupv2_driver454_479',ROOT<PATH>'representative_driver.py')\nSRC|BACKUP|98|19:_legacy_backup_target=legacy.backup_target\nSRC|BACKUP|98|25: ids=[x.get('logical_id') for x in out]\nSRC|BACKUP|98|30: xf=[x for x in rows if x.get('logical_id')=='xf-zakrutim']\nSRC|BACKUP|98|34: return {'logical_id':CT_ID,'scope':'pve01 LXC 112 full-guest archive DR','type':'pve_guest','node':'pve01','vmid':112,\nSRC|BACKUP|98|40:def backup_target(t,green_verify=False):\nSRC|BACKUP|98|41: if not isinstance(t,dict) or t.get('logical_id')!=CT_ID:\nSRC|BACKUP|98|42: return _legacy_backup_target(t,green_verify)\nSRC|BACKUP|98|44: r=ct112.run_target(t,state_writer=legacy.write_state)\nSRC|BACKUP|98|45: return {'logical_id':CT_ID,'generation':r['generation'],'result':'SUCCESS','payload_bytes':r['payload_bytes'],\nSRC|BACKUP|98|53:legacy.backup_target=backup_target\nSRC|BACKUP|98|60: want={'ct112',*LEGACY_IDS}\nSRC|BACKUP|98|61: if {t.get('logical_id') for t in d if isinstance(t,dict) and t.get('green1')}!=want: raise RuntimeError('LEGACY_DEFAULT_GREEN_SET')\nSRC|BACKUP|98|71: if len(eff)!=29 or sum(1 for x in eff if x.get('logical_id')==CT_ID)!=1: raise RuntimeError('EFFECTIVE_TARGETS')\nSRC|BACKUP|98|73: if [x['logical_id'] for x in legacy_rows]!=list(LEGACY_IDS) or ct.get('vmid')!=112: raise RuntimeError('REPRESENTATIVE_PARTITION')\nSRC|BACKUP|98|74: if ct112.selftest() is not True: raise RuntimeError('CT112_HANDLER_SELFTEST')\nREC|BACKUP_SOURCE|IDX=99|BASENAME=representative_driver.py|PATH_SHA256=3e6f4fb61ea5c3d2f21d3539889e8223a04575c8cae0b69f139770f5e28a6a21|SHA256=b3050a8f95e6d9826a4f0786cd3ca32012b6ab10486d10e4981b50b8a0affff2|SIZE=4214|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|99|25:CT112_ID='guest-pve01-lxc-112'\nSRC|BACKUP|99|33:def _logical_id(target: Mapping[str, Any]) -> str:\nSRC|BACKUP|99|34: value=target.get('logical_id') if isinstance(target, Mapping) else None\nSRC|BACKUP|99|43: logical_id=_logical_id(target)\nSRC|BACKUP|99|44: if logical_id not in wanted:\nSRC|BACKUP|99|46: if logical_id in selected:\nSRC|BACKUP|99|48: selected[logical_id]=target\nSRC|BACKUP|99|72: def write_state(logical_id,result,**kw):\nSRC|BACKUP|99|73: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|99|75: payload={'logical_id':logical_id,'result':result,'meta':kw,'schema_version':1}\nSRC|BACKUP|99|76: _atomic_json(root<PATH>'.json'),payload)\nSRC|BACKUP|99|80: logical_id=_logical_id(target)\nSRC|BACKUP|99|81: if logical_id not in LEGACY_IDS:\nSRC|BACKUP|99|83: backup=getattr(engine,'backup_target',None)\nSRC|BACKUP|99|84: if not callable(backup):\nSRC|BACKUP|99|91: return backup(target,True)\nSRC|BACKUP|99|95:def _validate_ct112_result(result):\nSRC|BACKUP|99|98: if result.get('logical_id')!=CT112_ID or result.get('status')!='OK':\nSRC|BACKUP|99|106:def run_representative(engine, targets, ct112_callback: Callable[[Mapping[str, Any]], Any]):\nSRC|BACKUP|99|107: if not callable(ct112_callback):\nSRC|BACKUP|99|109: legacy,ct112=partition_targets(targets)\nSRC|BACKUP|99|110: results=[_validate_ct112_result(ct112_callback(ct112))]\nREC|BACKUP_SOURCE|IDX=100|BASENAME=ACCEPTANCE.json|PATH_SHA256=05bee05a7960c7535c642dbb4ce1af55c008b535e06f2e1e13e2415d2d0fc73e|SHA256=904dfccad43b55ad0b53cfbd29fb45fee36fd0fbfa5afa58da5c3cca0ee7153b|SIZE=517|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|100|1:{\"command_id\":\"SUPPORT-260916-INFRA-DR-BACKUPV2-FINAL-REPLACEMENT-PLAN-STABILITY-SCHEMA-RCA-FIX-VALIDATE-PROMOTE-CUTOVER-SEAL-486R1\",\"ct112_manifest_sha256\":\"1ac4f16a54bcdd8b896c9a131abef966d315256aa56da3f83ed0b30845c4fcb0\",\"ct112_payload_bytes\":223875308,\"ct112_payload_sha256\":\"d443b85e76e806830fd9c372d0a09fc5b91ca9c9d35c44fb0ad7968cc996d01d\",\"legacy_ids\":[\"node-pve01\",\"md-relay\",\"spb-ingress\",\"us-netbird\",\"router-netcraze\",\"xf-codevipe\",\"xf-zakrutim\",\"control-bootstrap-v2\"],\"representative_pass\":9,\"schema\":1}\nREC|BACKUP_SOURCE|IDX=101|BASENAME=ct112_handler.py|PATH_SHA256=d81d7593fd74c6501fc7701f48337927344b1bc391278d79c8d9b8cfd4fe348d|SHA256=8cac6e627d5e7abe5d3163cdd24911995a1e3f45c776f9373c2aa68784f5ec6c|SIZE=10955|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|101|9:CT_ID='guest-pve01-lxc-112'\nSRC|BACKUP|101|49: vmid=r.get('vmid')\nSRC|BACKUP|101|50: if type(vmid) is not int:raise RuntimeError('PVE_VMID_SCHEMA')\nSRC|BACKUP|101|51: configs[vmid]=_json_cmd(f\"<PATH>'type']}<PATH>\")\nSRC|BACKUP|101|56:def _select_live_ct112(plan,now,expected_config=None):\nSRC|BACKUP|101|61: vmids=[j.get('vmid') for j in jobs if isinstance(j,dict)]\nSRC|BACKUP|101|62: if len(vmids)!=len(jobs) or len(vmids)!=len(set(vmids)):raise RuntimeError('CT112_PLAN_MEMBERSHIP')\nSRC|BACKUP|101|63: matches=[j for j in jobs if j.get('vmid')==112]\nSRC|BACKUP|101|74:def _assert_live_state_unchanged(before,after,vmid):\nSRC|BACKUP|101|79: if any(type(x) is not dict or type(x.get('vmid')) is not int for x in rows):raise RuntimeError('CT112_STATE_SCHEMA')\nSRC|BACKUP|101|80: return sorted((x['vmid'],x.get('type'),x.get('node'),x.get('status'),x.get('template')) for x in rows)\nSRC|BACKUP|101|83: a=[j for j in old if j.get('vmid')==vmid];b=[j for j in new if j.get('vmid')==vmid]\nSRC|BACKUP|101|119: def __init__(self,work,entries,binding,guard,deadline,logical_id):\nSRC|BACKUP|101|120: self.work=Path(work);self.entries=entries;self.binding=binding;self.guard=guard;self.deadline=deadline;self.logical_id=logical_id\nSRC|BACKUP|101|127: self.inner=large.ReadOnlyLarge(str(RCLONE),self.snapshot,e,bind,self.guard,self.work,self.deadline,self.logical_id)\nSRC|BACKUP|101|143: if not isinstance(target,dict) or target.get('logical_id')!=CT_ID or target.get('vmid')!=112:return (_ for _ in ()).throw(RuntimeError('CT112_DESCRIPTOR'))\nSRC|BACKUP|101|146: pvesh_sha=_sha(PVESH);now=int(time.time());current=_fresh_plan(now);job=_select_live_ct112(current,now)\nSRC|BACKUP|101|149: now2=int(time.time());fresh_plan=_fresh_plan(now2);fresh=_select_live_ct112(fresh_plan,now2,expected)\nSRC|BACKUP|101|157: work=STAGING<PATH>'backup-v2-'+generation);work.mkdir(mode=0o700,parents=False,exist_ok=False)\nREC|BACKUP_SOURCE|IDX=102|BASENAME=RELEASE_MANIFEST.json|PATH_SHA256=56fbab6d900b9712601288cf1261cfd9ef525bef9e248f71a6fa776c1ea97a6a|SHA256=a36dd0db88592ec3d355ef43e6b218da6c9ad649e9ccf8c8f680b96eb23a156e|SIZE=3301|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|102|1:{\"files\":{\"ACCEPTANCE.json\":{\"bytes\":517,\"mode\":256,\"sha256\":\"904dfccad43b55ad0b53cfbd29fb45fee36fd0fbfa5afa58da5c3cca0ee7153b\"},\"candidate411<PATH>\":{\"bytes\":2077,\"mode\":256,\"sha256\":\"a414715f1b91b3701c52073709a80c38218f76e3961618e8af61489211e50c01\"},\"candidate411<PATH>\":{\"bytes\":7210,\"mode\":256,\"sha256\":\"8d36e82080be93a8c929a9211191fa868166b9e7b6152c4c7689fa52b6720757\"},\"candidate411<PATH>\":{\"bytes\":4310,\"mode\":256,\"sha256\":\"303f44dc8e91c8e6a675f9ea406ce4b7532ed98440a9b6807fa593ede9d33254\"},\"candidate411<PATH>\":{\"bytes\":2989,\"mode\":320,\"sha256\":\"18eb29cef165371b48bcb78e1a456e1939e6eff253787218133162cc89ab9fa3\"},\"candidate411<PATH>\":{\"bytes\":7385,\"mode\":256,\"sha256\":\"86433bc424d5fa5017c20f7a237c82874b02357a3283660d8a6b0039ef2bc868\"},\"candidate411<PATH>\":{\"bytes\":16514,\"mode\":256,\"sha256\":\"5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a\"},\"candidate411<PATH>\":{\"bytes\":4603,\"mode\":256,\"sha256\":\"db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060\"},\"candidate411<PATH>\":{\"bytes\":12888,\"mode\":256,\"sha256\":\"cd2f634414a8e38a3789015aeca5a9b47821f77d7d1fa61dcdbdc866172963be\"},\"candidate411<PATH>\":{\"bytes\":19595,\"mode\":256,\"sha256\":\"97015277a4f3f8129c0fd11eb70c06293026366f1f8232a97feeed513a2dbcef\"},\"candidate411<PATH>\":{\"bytes\":6195,\"mode\":256,\"sha256\":\"73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012\"},\"candidate411<PATH>\":{\"bytes\":14701,\"mode\":256,\"sha256\":\"56d1b961c8d5654d5e2ee2755268db46bd2202bca11e69788febf991cfaa79f1\"},\"candidate411<PATH>\":{\"bytes\":8831,\"mode\":256,\"sha256\":\"a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16\"},\"candidate411<PATH>\":{\"bytes\":10752,\"mode\":256,\"sha256\":\"460b950924a475ce0a28dc759512e7dbe2323ae2cc42f7ef4c6181710a2a13da\"},\"candidate411<PATH>\":{\"bytes\":5441,\"mode\":256,\"sha256\":\"50fc10865078a7b9b255dc627059824184441a47c4ede52e23f24c1186e3512f\"},\"candidate411<PATH>\":{\"bytes\":12215,\"mode\":256,\"sha256\":\"a67d927cc428935791f9eecc3acf571d089f80761162f4589b7d684fba6b8af7\"},\"candidate411<PATH>\":{\"bytes\":11781,\"mode\":256,\"sha256\":\"16a9407d01bf73db687ef38684c59205fc2e6a9223cd9cee6ec6e8dde9d38707\"},\"candidate411<PATH>\":{\"bytes\":12077,\"mode\":256,\"sha256\":\"9fccd20b490613fdd5b14b4105cf0d9fd744f204e1ed1d6893e54c9f69bf6fb4\"},\"candidate411<PATH>\":{\"bytes\":5785,\"mode\":256,\"sha256\":\"1056407aab76e17181b05e043cb42c086058545a8e0027689ab4e03eee6531c4\"},\"candidate411<PATH>\":{\"bytes\":15364,\"mode\":256,\"sha256\":\"b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688\"},\"candidate411<PATH>\":{\"bytes\":11755,\"mode\":256,\"sha256\":\"e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2\"},\"ct112_handler.py\":{\"bytes\":10955,\"mode\":256,\"sha256\":\"8cac6e627d5e7abe5d3163cdd24911995a1e3f45c776f9373c2aa68784f5ec6c\"},\"legacy_engine.py\":{\"bytes\":59719,\"mode\":256,\"sha256\":\"b6e79f087b9f1d21dac4f77a7b46b743299bbb85bc716e80d2ea67c2e038bcd7\"},\"representative_driver.py\":{\"bytes\":4214,\"mode\":256,\"sha256\":\"b3050a8f95e6d9826a4f0786cd3ca32012b6ab10486d10e4981b50b8a0affff2\"},\"wrapper.py\":{\"bytes\":5055,\"mode\":256,\"sha256\":\"2b5eb4fc0f6f466a0d3e5a007af987092b6c17baa3ff9241a6afc2c2e97df1d5\"}},\"release\":\"backup-v2-accepted-486r1\",\"schema\":1}\nREC|BACKUP_SOURCE|IDX=103|BASENAME=legacy_engine.py|PATH_SHA256=fa7629bf6b6d134d2701c19ee57801aca5eab13a8ed300e40fd6f4971c079350|SHA256=b6e79f087b9f1d21dac4f77a7b46b743299bbb85bc716e80d2ea67c2e038bcd7|SIZE=59719|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|103|6:STATE_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|103|7:CONFIG_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|103|9:WORK_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|103|10:ENGINE_PATH=pathlib.Path('<PATH>')\nSRC|BACKUP|103|25:GUEST266=pathlib.Path('<PATH>')\nSRC|BACKUP|103|27:P270=pathlib.Path('<PATH>')\nSRC|BACKUP|103|29:P282=pathlib.Path('<PATH>')\nSRC|BACKUP|103|31:P265=pathlib.Path('<PATH>')\nSRC|BACKUP|103|35: (pathlib.Path('<PATH>'),'e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2'),\nSRC|BACKUP|103|36: (pathlib.Path('<PATH>'),'b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688'),\nSRC|BACKUP|103|37: (pathlib.Path('<PATH>'),'a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16'),\nSRC|BACKUP|103|38: (pathlib.Path('<PATH>'),'db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060'),\nSRC|BACKUP|103|39: (pathlib.Path('<PATH>'),'5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a'),\nSRC|BACKUP|103|46: pathlib.Path('<PATH>'),\nSRC|BACKUP|103|47: pathlib.Path('<PATH>'),\nSRC|BACKUP|103|48: pathlib.Path('<PATH>'),\nSRC|BACKUP|103|49: pathlib.Path('<PATH>'),\nSRC|BACKUP|103|50: pathlib.Path('<PATH>'),\nSRC|BACKUP|103|51: pathlib.Path('<PATH>'),\nSRC|BACKUP|103|52: pathlib.Path('<PATH>'),\nSRC|BACKUP|103|53: pathlib.Path('<PATH>'),\nSRC|BACKUP|103|54: pathlib.Path('<PATH>'),\nSRC|BACKUP|103|55: pathlib.Path('<PATH>'),\nSRC|BACKUP|103|56: pathlib.Path('<PATH>'),\nSRC|BACKUP|103|132:def remote_generation_path(scope,logical_id,generation):\nSRC|BACKUP|103|134: for x in (scope,logical_id,generation):\nSRC|BACKUP|103|136: return f'homelab-backups<PATH>'\nSRC|BACKUP|103|138:def make_manifest(scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta):\nSRC|BACKUP|103|142: return {'schema':2,'scope':scope,'logical_id':logical_id,'generation':generation,'created_at_utc':utcnow(),\nSRC|BACKUP|103|153: for vmid,typ in [(110,'lxc'),(111,'lxc'),(112,'lxc'),(113,'lxc'),(130,'qemu'),(150,'qemu'),(160,'qemu'),(170,'qemu'),(171,'qemu'),(190,'qemu'),(210,'qemu'),(211,'qemu'),(9130,'qemu')]:\nSRC|BACKUP|103|154: out.append({'logical_id':('ct' if typ=='lxc' else 'vm')+str(vmid),'scope':'pve','type':'pve_guest','vmid':vmid,'guest_type':typ,'due_seconds':d,'enabled':True,'green1':vmid==112})\nSRC|BACKUP|103|156: out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})\nSRC|BACKUP|103|158: {'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'<IP>','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|103|159: {'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'<IP>','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|103|160: {'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'<IP>','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh<PATH>','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|103|161: {'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|103|171: for slug,vmid,node,root,db,strategy in sites:\nSRC|BACKUP|103|172: out.append({'logical_id':'xf-'+slug,'scope':'xenforo','type':'xenforo','slug':slug,'vmid':vmid,'node':node,'app_root':root,'db_name':db,'dump_strategy':strategy,'due_seconds':d,'enabled':True,'green1':slug in ('codevipe','zakrutim')})\nSRC|BACKUP|103|173: out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})\nSRC|BACKUP|103|182: last=int(state.get(t['logical_id'],{}).get('last_success_epoch',0))\nREC|BACKUP_SOURCE|IDX=104|BASENAME=entry502.py|PATH_SHA256=3c5cb50bed0723536c81575884ed634e72129b2608550c5407ef09d7a5c02975|SHA256=9d13ea48693554625f6a996bd8d3abbf3936642c16b56a98d752cdacd63d1f42|SIZE=5564|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|104|4:BASE=pathlib.Path('<PATH>')\nSRC|BACKUP|104|9: 'ct112_handler.py':'8cac6e627d5e7abe5d3163cdd24911995a1e3f45c776f9373c2aa68784f5ec6c',\nSRC|BACKUP|104|62: required=('capture_pve_guest','backup_target','load_targets','cluster_inventory','ssh_remote',\nSRC|BACKUP|104|87: rows=wrapper.load_targets(); hits=[x for x in rows if x.get('logical_id')==lid]\nSRC|BACKUP|104|95: if not callable(wrapper.backup_target) or not callable(wrapper.main) or not callable(wrapper.load_targets):\nSRC|BACKUP|104|108: if t.get('guest_type')!='lxc' or t.get('logical_id')=='guest-pve01-lxc-112':\nSRC|BACKUP|104|111: print('PLAN_LXC_RESULT='+json.dumps({'logical_id':t['logical_id'],'vmid':int(t['vmid']),'node':out['job']['node'],'job':out['job']},separators=(',',':'),sort_keys=True),flush=True)\nSRC|BACKUP|104|115: if t.get('logical_id')=='guest-pve01-lxc-112':\nSRC|BACKUP|104|118: out=wrapper.backup_target(t,True)\nREC|BACKUP_SOURCE|IDX=105|BASENAME=entry503.py|PATH_SHA256=2ca4e8af7419985f93372202c1768b951930f95e15035592f59da1caeefd7009|SHA256=ac51fd96ec13bbb38e5dbe5683794bf8ab43fab22383bb617c3506139ca5a0eb|SIZE=6183|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|105|4:BASE=pathlib.Path('<PATH>')\nSRC|BACKUP|105|9: 'ct112_handler.py':'8cac6e627d5e7abe5d3163cdd24911995a1e3f45c776f9373c2aa68784f5ec6c',\nSRC|BACKUP|105|62: required=('capture_pve_guest','backup_target','load_targets','cluster_inventory','ssh_remote',\nSRC|BACKUP|105|95: rows=wrapper.load_targets(); hits=[x for x in rows if x.get('logical_id')==lid]\nSRC|BACKUP|105|103: if not callable(wrapper.backup_target) or not callable(wrapper.main) or not callable(wrapper.load_targets):\nSRC|BACKUP|105|116: if t.get('guest_type')!='lxc' or t.get('logical_id')=='guest-pve01-lxc-112':\nSRC|BACKUP|105|119: print('PLAN_LXC_RESULT='+json.dumps({'logical_id':t['logical_id'],'vmid':int(t['vmid']),'node':out['job']['node'],'job':out['job']},separators=(',',':'),sort_keys=True),flush=True)\nSRC|BACKUP|105|123: if t.get('logical_id')=='guest-pve01-lxc-112':\nSRC|BACKUP|105|126: out=wrapper.backup_target(t,True)\nREC|BACKUP_SOURCE|IDX=106|BASENAME=entry501.py|PATH_SHA256=633c14fcc89b6490a7d3bc25c2ddb526bc95f21fb66abe2940cc46224968fbf7|SHA256=e55e5c8c446a397c51858063267e0a9af5d37b1bf59b258b1af0fbde934f59e9|SIZE=5362|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|106|4:BASE=pathlib.Path('<PATH>')\nSRC|BACKUP|106|9: 'ct112_handler.py':'8cac6e627d5e7abe5d3163cdd24911995a1e3f45c776f9373c2aa68784f5ec6c',\nSRC|BACKUP|106|62: required=('capture_pve_guest','backup_target','load_targets','cluster_inventory','ssh_remote',\nSRC|BACKUP|106|87: rows=wrapper.load_targets(); hits=[x for x in rows if x.get('logical_id')==lid]\nSRC|BACKUP|106|95: if not callable(wrapper.backup_target) or not callable(wrapper.main) or not callable(wrapper.load_targets):\nSRC|BACKUP|106|108: if t.get('guest_type')!='lxc' or t.get('logical_id')=='guest-pve01-lxc-112':\nSRC|BACKUP|106|111: print('PLAN_LXC_RESULT='+json.dumps({'logical_id':t['logical_id'],'vmid':int(t['vmid']),'node':out['job']['node'],'job':out['job']},separators=(',',':'),sort_keys=True),flush=True)\nSRC|BACKUP|106|115: if t.get('logical_id')=='guest-pve01-lxc-112':\nSRC|BACKUP|106|117: out=wrapper.backup_target(t,True)\nREC|BACKUP_SOURCE|IDX=107|BASENAME=engine389.py|PATH_SHA256=3a8a13358314972f0ccb46d5fd21cd314cad1787869f8e94ffe414dd53ccdee8|SHA256=f1524bf68b0495cc4a1f1036adb5ce293465547738ce35437a22b700f51cdd35|SIZE=46752|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|107|6:STATE_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|107|7:CONFIG_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|107|9:WORK_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|107|10:ENGINE_PATH=pathlib.Path('<PATH>')\nSRC|BACKUP|107|83:def remote_generation_path(scope,logical_id,generation):\nSRC|BACKUP|107|85: for x in (scope,logical_id,generation):\nSRC|BACKUP|107|87: return f'homelab-backups<PATH>'\nSRC|BACKUP|107|89:def make_manifest(scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta):\nSRC|BACKUP|107|93: return {'schema':2,'scope':scope,'logical_id':logical_id,'generation':generation,'created_at_utc':utcnow(),\nSRC|BACKUP|107|104: for vmid,typ in [(110,'lxc'),(111,'lxc'),(112,'lxc'),(113,'lxc'),(130,'qemu'),(150,'qemu'),(160,'qemu'),(170,'qemu'),(171,'qemu'),(190,'qemu'),(210,'qemu'),(211,'qemu'),(9130,'qemu')]:\nSRC|BACKUP|107|105: out.append({'logical_id':('ct' if typ=='lxc' else 'vm')+str(vmid),'scope':'pve','type':'pve_guest','vmid':vmid,'guest_type':typ,'due_seconds':d,'enabled':True,'green1':vmid==112})\nSRC|BACKUP|107|107: out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})\nSRC|BACKUP|107|109: {'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'<IP>','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|107|110: {'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'<IP>','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|107|111: {'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'<IP>','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh<PATH>','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|107|112: {'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|107|122: for slug,vmid,node,root,db,strategy in sites:\nSRC|BACKUP|107|123: out.append({'logical_id':'xf-'+slug,'scope':'xenforo','type':'xenforo','slug':slug,'vmid':vmid,'node':node,'app_root':root,'db_name':db,'dump_strategy':strategy,'due_seconds':d,'enabled':True,'green1':slug in ('codevipe','zakrutim')})\nSRC|BACKUP|107|124: out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})\nSRC|BACKUP|107|133: last=int(state.get(t['logical_id'],{}).get('last_success_epoch',0))\nSRC|BACKUP|107|135: if last==0 or age>=due: c.append((-(age<PATH>'logical_id'],t))\nSRC|BACKUP|107|190: ids=[x.get('logical_id') for x in j['targets']]\nSRC|BACKUP|107|200: j=json.loads(p.read_text()); d[j['logical_id']]=j\nSRC|BACKUP|107|204:def write_state(logical_id,result,**kw):\nSRC|BACKUP|107|206: j={'schema':1,'logical_id':logical_id,'result':result,'updated_at_utc':utcnow(),**kw}\nSRC|BACKUP|107|208: atomic_write(STATE_ROOT<PATH>'state'<PATH>'.json'),canonical_json(j)+b'\\n',0o600)\nSRC|BACKUP|107|231:def remote_exists_any(scope,logical_id,generation):\nSRC|BACKUP|107|232: rel=remote_generation_path(scope,logical_id,generation)\nSRC|BACKUP|107|279:def generation_id(logical_id):\nSRC|BACKUP|107|281: return f'v2-{logical_id}-{ts}-{os.urandom(6).hex()}'\nSRC|BACKUP|107|286: gen=source_meta['generation']; rel=remote_generation_path(t['scope'],t['logical_id'],gen)\nSRC|BACKUP|107|287: if remote_exists_any(t['scope'],t['logical_id'],gen): raise BackupError('GENERATION_COLLISION')\nSRC|BACKUP|107|290: manifest=make_manifest(t['scope'],t['logical_id'],gen,n,psha,parts,reps,source_meta)\nSRC|BACKUP|107|301: seal={'schema':1,'generation':gen,'logical_id':t['logical_id'],'manifest_sha256':msha,'payload_sha256':psha,'status':'SEALED','sealed_at_utc':utcnow()}\nSRC|BACKUP|107|310: rel=remote_generation_path(manifest['scope'],manifest['logical_id'],manifest['generation'])\nSRC|BACKUP|107|345: # Green set is intentionally CT-only. Scheduled QEMU backups still get dual remote byte readback.\nSRC|BACKUP|107|367: vmid=int(t['vmid']); rows=[r for r in cluster_inventory() if int(r.get('vmid',-1))==vmid]\nSRC|BACKUP|107|371: srcdir=f'<PATH>'\nSRC|BACKUP|107|374: ssh_remote(node,['vzdump',str(vmid),'--mode','snapshot','--compress','zstd','--dumpdir',srcdir],timeout=7200)\nSRC|BACKUP|107|386: return pathlib.Path(local),{'generation':gen,'source_class':'pve_guest','vmid':vmid,'guest_type':typ,'node':node,'status':rows[0].get('status')},cleanup\nREC|BACKUP_SOURCE|IDX=108|BASENAME=entry504.py|PATH_SHA256=bb5192d3436ecde7d3f42bb911dd293bb6694c45c84417bb88ab271b127acf31|SHA256=ca6876fa9c3b1465b045344a8ad46962de16972c7dadc4ac6257c7d225047793|SIZE=10566|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|108|4:BASE=pathlib.Path('<PATH>')\nSRC|BACKUP|108|9: 'ct112_handler.py':'8cac6e627d5e7abe5d3163cdd24911995a1e3f45c776f9373c2aa68784f5ec6c',\nSRC|BACKUP|108|62: required=('capture_pve_guest','backup_target','load_targets','cluster_inventory','ssh_remote',\nSRC|BACKUP|108|100: rows=wrapper.load_targets(); hits=[x for x in rows if x.get('logical_id')==lid]\nSRC|BACKUP|108|114: if not callable(wrapper.backup_target) or not callable(wrapper.main) or not callable(wrapper.load_targets):\nSRC|BACKUP|108|141: targets=[{'logical_id':'proof-a','enabled':True,'due_seconds':100},{'logical_id':'proof-b','enabled':True,'due_seconds':100}]\nSRC|BACKUP|108|143: if not isinstance(first,dict) or first.get('logical_id')!='proof-b': raise RuntimeError('SCHEDULER_PROOF_PEER_NOT_SELECTED')\nSRC|BACKUP|108|149: if not isinstance(second,dict) or second.get('logical_id')!='proof-a': raise RuntimeError('SCHEDULER_PROOF_RETRY_NOT_REELIGIBLE')\nSRC|BACKUP|108|154: proof={'failed_target':'proof-a','peer_selected_during_backoff':first['logical_id'],'retry_after_epoch':retry,'last_success_preserved':preserved==1000,'retry_target_after_backoff':second['logical_id'],'success_resets_failures':True,'production_state_root_used':False}\nSRC|BACKUP|108|165: print('SCHEDULER_LIVE_SELECTION='+json.dumps({'logical_id':chosen.get('logical_id'),'due_seconds':chosen.get('due_seconds'),'enabled':chosen.get('enabled') is True},separators=(',',':'),sort_keys=True),flush=True)\nSRC|BACKUP|108|169: if t.get('guest_type')!='lxc' or t.get('logical_id')=='guest-pve01-lxc-112':\nSRC|BACKUP|108|172: print('PLAN_LXC_RESULT='+json.dumps({'logical_id':t['logical_id'],'vmid':int(t['vmid']),'node':out['job']['node'],'job':out['job']},separators=(',',':'),sort_keys=True),flush=True)\nSRC|BACKUP|108|176: if t.get('logical_id')=='guest-pve01-lxc-112':\nSRC|BACKUP|108|179: out=wrapper.backup_target(t,True)\nREC|BACKUP_SOURCE|IDX=109|BASENAME=engine391.py|PATH_SHA256=80bf4cf4820d512caa587b901df2a97b93c2fda191de8fe7740cd28de7aa7888|SHA256=9f5095085be09a50e5833cae7ccfb8e70e2536dd56f352676170ec466d7019b3|SIZE=48972|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|109|6:STATE_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|109|7:CONFIG_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|109|9:WORK_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|109|10:ENGINE_PATH=pathlib.Path('<PATH>')\nSRC|BACKUP|109|83:def remote_generation_path(scope,logical_id,generation):\nSRC|BACKUP|109|85: for x in (scope,logical_id,generation):\nSRC|BACKUP|109|87: return f'homelab-backups<PATH>'\nSRC|BACKUP|109|89:def make_manifest(scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta):\nSRC|BACKUP|109|93: return {'schema':2,'scope':scope,'logical_id':logical_id,'generation':generation,'created_at_utc':utcnow(),\nSRC|BACKUP|109|104: for vmid,typ in [(110,'lxc'),(111,'lxc'),(112,'lxc'),(113,'lxc'),(130,'qemu'),(150,'qemu'),(160,'qemu'),(170,'qemu'),(171,'qemu'),(190,'qemu'),(210,'qemu'),(211,'qemu'),(9130,'qemu')]:\nSRC|BACKUP|109|105: out.append({'logical_id':('ct' if typ=='lxc' else 'vm')+str(vmid),'scope':'pve','type':'pve_guest','vmid':vmid,'guest_type':typ,'due_seconds':d,'enabled':True,'green1':vmid==112})\nSRC|BACKUP|109|107: out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})\nSRC|BACKUP|109|109: {'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'<IP>','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|109|110: {'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'<IP>','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|109|111: {'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'<IP>','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh<PATH>','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|109|112: {'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|109|122: for slug,vmid,node,root,db,strategy in sites:\nSRC|BACKUP|109|123: out.append({'logical_id':'xf-'+slug,'scope':'xenforo','type':'xenforo','slug':slug,'vmid':vmid,'node':node,'app_root':root,'db_name':db,'dump_strategy':strategy,'due_seconds':d,'enabled':True,'green1':slug in ('codevipe','zakrutim')})\nSRC|BACKUP|109|124: out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})\nSRC|BACKUP|109|133: last=int(state.get(t['logical_id'],{}).get('last_success_epoch',0))\nSRC|BACKUP|109|135: if last==0 or age>=due: c.append((-(age<PATH>'logical_id'],t))\nSRC|BACKUP|109|190: ids=[x.get('logical_id') for x in j['targets']]\nSRC|BACKUP|109|200: j=json.loads(p.read_text()); d[j['logical_id']]=j\nSRC|BACKUP|109|204:def write_state(logical_id,result,**kw):\nSRC|BACKUP|109|206: j={'schema':1,'logical_id':logical_id,'result':result,'updated_at_utc':utcnow(),**kw}\nSRC|BACKUP|109|208: atomic_write(STATE_ROOT<PATH>'state'<PATH>'.json'),canonical_json(j)+b'\\n',0o600)\nSRC|BACKUP|109|231:def remote_exists_any(scope,logical_id,generation):\nSRC|BACKUP|109|232: rel=remote_generation_path(scope,logical_id,generation)\nSRC|BACKUP|109|279:def generation_id(logical_id):\nSRC|BACKUP|109|281: return f'v2-{logical_id}-{ts}-{os.urandom(6).hex()}'\nSRC|BACKUP|109|286: gen=source_meta['generation']; rel=remote_generation_path(t['scope'],t['logical_id'],gen)\nSRC|BACKUP|109|287: if remote_exists_any(t['scope'],t['logical_id'],gen): raise BackupError('GENERATION_COLLISION')\nSRC|BACKUP|109|290: manifest=make_manifest(t['scope'],t['logical_id'],gen,n,psha,parts,reps,source_meta)\nSRC|BACKUP|109|301: seal={'schema':1,'generation':gen,'logical_id':t['logical_id'],'manifest_sha256':msha,'payload_sha256':psha,'status':'SEALED','sealed_at_utc':utcnow()}\nSRC|BACKUP|109|310: rel=remote_generation_path(manifest['scope'],manifest['logical_id'],manifest['generation'])\nSRC|BACKUP|109|345: # Green set is intentionally CT-only. Scheduled QEMU backups still get dual remote byte readback.\nSRC|BACKUP|109|372: vmid=int(t['vmid']); rows=[r for r in cluster_inventory() if int(r.get('vmid',-1))==vmid]\nSRC|BACKUP|109|376: srcdir=f'<PATH>'\nSRC|BACKUP|109|386: ssh_remote(node,['vzdump',str(vmid),'--mode','snapshot','--compress','zstd','--dumpdir',srcdir],timeout=7200)\nSRC|BACKUP|109|398: return pathlib.Path(local),{'generation':gen,'source_class':'pve_guest','vmid':vmid,'guest_type':typ,'node':node,'status':rows[0].get('status')},cleanup\nREC|BACKUP_SOURCE|IDX=110|BASENAME=pve282.py|PATH_SHA256=da0dee4dd13f6435d5c23bba253dfbdaae74b72c0a2fd02f8f0362866bd7eb77|SHA256=73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012|SIZE=6195|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|110|3:No changes to source guest configuration; no source110 backup or guest deletion.\nSRC|BACKUP|110|24: need(type(job) is dict and type(job.get('vmid')) is int and job['vmid']==TARGET_VMID and\nSRC|BACKUP|110|31: by_id={j['vmid']:j for j in previous}\nSRC|BACKUP|110|34: need({j['vmid'] for j in rows}==set(by_id),'ACCEPTED265_MEMBERSHIP_CHANGED')\nSRC|BACKUP|110|36: need(row['config_sha256']==by_id[row['vmid']]['config_sha256'],'ACCEPTED265_GUEST_CONFIG_CHANGED')\nSRC|BACKUP|110|37: selected=[j for j in rows if j['vmid']==TARGET_VMID]\nSRC|BACKUP|110|44: need(disk.get('slot')=='rootfs' and disk.get('class')=='managed-volume' and disk.get('backup_setting') in ('included','included_default_rootfs'),'CT112_MANAGED_ROOTFS_REQUIRED')\nSRC|BACKUP|110|92: return {**result,'path':str(dest),'vmid':112,'type':'lxc','node':job['node'],'config_sha256':job['config_sha256'],\nREC|BACKUP_SOURCE|IDX=111|BASENAME=test_pve282.py|PATH_SHA256=49d5cbb320335d869a028121eab913f21d7350356e28d7732cd1be68e271c3cf|SHA256=1056407aab76e17181b05e043cb42c086058545a8e0027689ab4e03eee6531c4|SIZE=5785|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|111|17: rows=[{'vmid':v,'type':'lxc' if v in (110,112) else 'qemu','node':'pve01','status':'running','maxdisk':8*G} for v in (110,112,150)]\nSRC|BACKUP|111|28: def test_selects_only112(self):self.assertEqual(f.select112(plan(),plan(),NOW)['vmid'],112)\nSRC|BACKUP|111|33: b=copy.deepcopy(a);self.assertEqual(f.select112(a,b,NOW)['vmid'],112)\nSRC|BACKUP|111|65: def test_marker_scope_ct112_only(self):self.assertEqual(f.TARGET_VMID,112)\nSRC|BACKUP|111|75: return {'path':str(out),'size':len(self.data),'sha256':t.sha(self.data),'identity':list(identity),'vmid':112,'node':'pve01','type':'lxc','producer_rc':0,'config_sha256':j['config_sha256'],'compression_test_ok':True}\nSRC|BACKUP|111|78: z=self.go();self.assertEqual(z['vmid'],112);self.assertEqual(len({a['account_id'] for a in z['replicas']}),2);self.assertEqual(z['local_payload_files_remaining'],0);self.assertEqual(len(self.reader.listed),13);self.assertFalse(z['guest_restore_verified']);self.assertTrue(z['archive_cloud_restore_verified'])\nREC|BACKUP_SOURCE|IDX=112|BASENAME=engine392.py|PATH_SHA256=31ca7bcf1ab30815fb911a00d6f9a015e02724b232a64ead7c25e99bfec8d87e|SHA256=7d96b9842de06277ea1be45e1f58e35c8a116a922425317954d339a333fe84f0|SIZE=49438|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|112|6:STATE_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|112|7:CONFIG_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|112|9:WORK_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|112|10:ENGINE_PATH=pathlib.Path('<PATH>')\nSRC|BACKUP|112|83:def remote_generation_path(scope,logical_id,generation):\nSRC|BACKUP|112|85: for x in (scope,logical_id,generation):\nSRC|BACKUP|112|87: return f'homelab-backups<PATH>'\nSRC|BACKUP|112|89:def make_manifest(scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta):\nSRC|BACKUP|112|93: return {'schema':2,'scope':scope,'logical_id':logical_id,'generation':generation,'created_at_utc':utcnow(),\nSRC|BACKUP|112|104: for vmid,typ in [(110,'lxc'),(111,'lxc'),(112,'lxc'),(113,'lxc'),(130,'qemu'),(150,'qemu'),(160,'qemu'),(170,'qemu'),(171,'qemu'),(190,'qemu'),(210,'qemu'),(211,'qemu'),(9130,'qemu')]:\nSRC|BACKUP|112|105: out.append({'logical_id':('ct' if typ=='lxc' else 'vm')+str(vmid),'scope':'pve','type':'pve_guest','vmid':vmid,'guest_type':typ,'due_seconds':d,'enabled':True,'green1':vmid==112})\nSRC|BACKUP|112|107: out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})\nSRC|BACKUP|112|109: {'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'<IP>','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|112|110: {'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'<IP>','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|112|111: {'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'<IP>','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh<PATH>','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|112|112: {'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|112|122: for slug,vmid,node,root,db,strategy in sites:\nSRC|BACKUP|112|123: out.append({'logical_id':'xf-'+slug,'scope':'xenforo','type':'xenforo','slug':slug,'vmid':vmid,'node':node,'app_root':root,'db_name':db,'dump_strategy':strategy,'due_seconds':d,'enabled':True,'green1':slug in ('codevipe','zakrutim')})\nSRC|BACKUP|112|124: out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})\nSRC|BACKUP|112|133: last=int(state.get(t['logical_id'],{}).get('last_success_epoch',0))\nSRC|BACKUP|112|135: if last==0 or age>=due: c.append((-(age<PATH>'logical_id'],t))\nSRC|BACKUP|112|190: ids=[x.get('logical_id') for x in j['targets']]\nSRC|BACKUP|112|200: j=json.loads(p.read_text()); d[j['logical_id']]=j\nSRC|BACKUP|112|204:def write_state(logical_id,result,**kw):\nSRC|BACKUP|112|206: j={'schema':1,'logical_id':logical_id,'result':result,'updated_at_utc':utcnow(),**kw}\nSRC|BACKUP|112|208: atomic_write(STATE_ROOT<PATH>'state'<PATH>'.json'),canonical_json(j)+b'\\n',0o600)\nSRC|BACKUP|112|231:def remote_exists_any(scope,logical_id,generation):\nSRC|BACKUP|112|232: rel=remote_generation_path(scope,logical_id,generation)\nSRC|BACKUP|112|279:def generation_id(logical_id):\nSRC|BACKUP|112|281: return f'v2-{logical_id}-{ts}-{os.urandom(6).hex()}'\nSRC|BACKUP|112|286: gen=source_meta['generation']; rel=remote_generation_path(t['scope'],t['logical_id'],gen)\nSRC|BACKUP|112|287: if remote_exists_any(t['scope'],t['logical_id'],gen): raise BackupError('GENERATION_COLLISION')\nSRC|BACKUP|112|290: manifest=make_manifest(t['scope'],t['logical_id'],gen,n,psha,parts,reps,source_meta)\nSRC|BACKUP|112|301: seal={'schema':1,'generation':gen,'logical_id':t['logical_id'],'manifest_sha256':msha,'payload_sha256':psha,'status':'SEALED','sealed_at_utc':utcnow()}\nSRC|BACKUP|112|310: rel=remote_generation_path(manifest['scope'],manifest['logical_id'],manifest['generation'])\nSRC|BACKUP|112|345: # Green set is intentionally CT-only. Scheduled QEMU backups still get dual remote byte readback.\nSRC|BACKUP|112|372: vmid=int(t['vmid']); rows=[r for r in cluster_inventory() if int(r.get('vmid',-1))==vmid]\nSRC|BACKUP|112|386: ssh_remote(node,['vzdump',str(vmid),'--mode','snapshot','--compress','zstd','--dumpdir',srcdir],timeout=7200)\nSRC|BACKUP|112|401: return pathlib.Path(local),{'generation':gen,'source_class':'pve_guest','vmid':vmid,'guest_type':typ,'node':node,'status':rows[0].get('status')},cleanup\nSRC|BACKUP|112|454: results[t['logical_id']]='ALREADY_OPERATOR_KEY'; continue\nREC|BACKUP_SOURCE|IDX=113|BASENAME=engine396.py|PATH_SHA256=3eb898a54af9d6804a1bbf0e8545bb6604e226a8104fc2c2054b3d86336b8bc5|SHA256=b6e79f087b9f1d21dac4f77a7b46b743299bbb85bc716e80d2ea67c2e038bcd7|SIZE=59719|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|113|6:STATE_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|113|7:CONFIG_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|113|9:WORK_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|113|10:ENGINE_PATH=pathlib.Path('<PATH>')\nSRC|BACKUP|113|25:GUEST266=pathlib.Path('<PATH>')\nSRC|BACKUP|113|27:P270=pathlib.Path('<PATH>')\nSRC|BACKUP|113|29:P282=pathlib.Path('<PATH>')\nSRC|BACKUP|113|31:P265=pathlib.Path('<PATH>')\nSRC|BACKUP|113|35: (pathlib.Path('<PATH>'),'e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2'),\nSRC|BACKUP|113|36: (pathlib.Path('<PATH>'),'b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688'),\nSRC|BACKUP|113|37: (pathlib.Path('<PATH>'),'a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16'),\nSRC|BACKUP|113|38: (pathlib.Path('<PATH>'),'db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060'),\nSRC|BACKUP|113|39: (pathlib.Path('<PATH>'),'5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a'),\nSRC|BACKUP|113|46: pathlib.Path('<PATH>'),\nSRC|BACKUP|113|47: pathlib.Path('<PATH>'),\nSRC|BACKUP|113|48: pathlib.Path('<PATH>'),\nSRC|BACKUP|113|49: pathlib.Path('<PATH>'),\nSRC|BACKUP|113|50: pathlib.Path('<PATH>'),\nSRC|BACKUP|113|51: pathlib.Path('<PATH>'),\nSRC|BACKUP|113|52: pathlib.Path('<PATH>'),\nSRC|BACKUP|113|53: pathlib.Path('<PATH>'),\nSRC|BACKUP|113|54: pathlib.Path('<PATH>'),\nSRC|BACKUP|113|55: pathlib.Path('<PATH>'),\nSRC|BACKUP|113|56: pathlib.Path('<PATH>'),\nSRC|BACKUP|113|132:def remote_generation_path(scope,logical_id,generation):\nSRC|BACKUP|113|134: for x in (scope,logical_id,generation):\nSRC|BACKUP|113|136: return f'homelab-backups<PATH>'\nSRC|BACKUP|113|138:def make_manifest(scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta):\nSRC|BACKUP|113|142: return {'schema':2,'scope':scope,'logical_id':logical_id,'generation':generation,'created_at_utc':utcnow(),\nSRC|BACKUP|113|153: for vmid,typ in [(110,'lxc'),(111,'lxc'),(112,'lxc'),(113,'lxc'),(130,'qemu'),(150,'qemu'),(160,'qemu'),(170,'qemu'),(171,'qemu'),(190,'qemu'),(210,'qemu'),(211,'qemu'),(9130,'qemu')]:\nSRC|BACKUP|113|154: out.append({'logical_id':('ct' if typ=='lxc' else 'vm')+str(vmid),'scope':'pve','type':'pve_guest','vmid':vmid,'guest_type':typ,'due_seconds':d,'enabled':True,'green1':vmid==112})\nSRC|BACKUP|113|156: out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})\nSRC|BACKUP|113|158: {'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'<IP>','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|113|159: {'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'<IP>','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|113|160: {'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'<IP>','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh<PATH>','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|113|161: {'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|113|171: for slug,vmid,node,root,db,strategy in sites:\nSRC|BACKUP|113|172: out.append({'logical_id':'xf-'+slug,'scope':'xenforo','type':'xenforo','slug':slug,'vmid':vmid,'node':node,'app_root':root,'db_name':db,'dump_strategy':strategy,'due_seconds':d,'enabled':True,'green1':slug in ('codevipe','zakrutim')})\nSRC|BACKUP|113|173: out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})\nSRC|BACKUP|113|182: last=int(state.get(t['logical_id'],{}).get('last_success_epoch',0))\nREC|BACKUP_SOURCE|IDX=114|BASENAME=task.json|PATH_SHA256=54ca4ea7caf84c49a360a995a33a1c07f33677e1d5244732f11c49f824c94c0a|SHA256=ee1b07c5e90a11701dc58d576ca6c7d4c0dbf912a3ce58b5ec3b10fdba8071e4|SIZE=5771|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|114|12: \"proxmox:cluster-backup-job:homelab-nightly-all\",\nSRC|BACKUP|114|46: \"$HOMELAB_RUN_DIR<PATH>\",\nSRC|BACKUP|114|47: \"$HOMELAB_RUN_DIR<PATH>\"\nSRC|BACKUP|114|58: \"proxmox:cluster-backup-job:homelab-nightly-all:vmid\"\nSRC|BACKUP|114|74: \"verification\": \"AdGuard proposals validate and NetBox<PATH> plans are safe\"\nSRC|BACKUP|114|79: \"verification\": \"DNS, NetBox and backup registration applied\"\nSRC|BACKUP|114|84: \"verification\": \"A<PATH> NetBox objects and backup membership exact\"\nSRC|BACKUP|114|106: \"verification\": \"DNS absent, NetBox target absent, backup VMIDs restored\"\nSRC|BACKUP|114|113: \"ct112\",\nSRC|BACKUP|114|128: \"backup\": \"homelab-nightly-all previous VMID list 110,111,112,113,130,150\",\nSRC|BACKUP|114|152: \"active_backup_restore_max\": 0\nREC|BACKUP_SOURCE|IDX=115|BASENAME=task.json|PATH_SHA256=af1e5fc4dd6143205aa16e94452ab61b9d6264b133b54c73adf58d94619f3839|SHA256=121d3735ead3a96fa5f51071e81c69274851b084d7a4df451567925cd80b563d|SIZE=5638|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|115|12: \"proxmox:cluster-backup-job:homelab-nightly-all\",\nSRC|BACKUP|115|46: \"$HOMELAB_RUN_DIR<PATH>\",\nSRC|BACKUP|115|47: \"$HOMELAB_RUN_DIR<PATH>\"\nSRC|BACKUP|115|58: \"proxmox:cluster-backup-job:homelab-nightly-all:vmid\"\nSRC|BACKUP|115|74: \"verification\": \"AdGuard proposals validate and NetBox<PATH> plans are safe\"\nSRC|BACKUP|115|79: \"verification\": \"DNS, NetBox and backup registration applied\"\nSRC|BACKUP|115|84: \"verification\": \"A<PATH> NetBox objects and backup membership exact\"\nSRC|BACKUP|115|106: \"verification\": \"DNS absent, NetBox target absent, backup VMIDs restored\"\nSRC|BACKUP|115|113: \"ct112\",\nSRC|BACKUP|115|128: \"backup\": \"homelab-nightly-all previous VMID list 110,111,112,113,130,150\",\nSRC|BACKUP|115|151: \"active_backup_restore_max\": 0\nREC|BACKUP_SOURCE|IDX=116|BASENAME=task.json|PATH_SHA256=3c7a87b3063fdad5ed21933c48306eab72dd38eb9fd94d4da62b01720338e00f|SHA256=1458a64bc17a830f65c24bd8f0b50c93e42a90a4a241e4ee6fc6ea1577c256c5|SIZE=2787|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|116|21: \"$HOMELAB_RUN_DIR<PATH>\",\nSRC|BACKUP|116|60: \"ct112\",\nSRC|BACKUP|116|64: \"backup_jobs\",\nSRC|BACKUP|116|90: \"active_backup_restore_max\": 0\nREC|BACKUP_SOURCE|IDX=117|BASENAME=task.json|PATH_SHA256=8958330a7b72fcbe8e45ad33d7cc8b82520c8a2f9fd58c763e3b9c79ca8fe8dd|SHA256=665ac47d1f9fdedf5adbbf4c2c44bb13db8eb29f15dfef60c48af4cffc03da1d|SIZE=5957|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|117|12: \"proxmox:cluster-backup-job:homelab-nightly-all\",\nSRC|BACKUP|117|46: \"$HOMELAB_RUN_DIR<PATH>\",\nSRC|BACKUP|117|47: \"$HOMELAB_RUN_DIR<PATH>\"\nSRC|BACKUP|117|58: \"proxmox:cluster-backup-job:homelab-nightly-all:vmid\"\nSRC|BACKUP|117|74: \"verification\": \"AdGuard proposals validate and NetBox<PATH> plans are safe\"\nSRC|BACKUP|117|79: \"verification\": \"DNS, NetBox and backup registration applied\"\nSRC|BACKUP|117|84: \"verification\": \"A<PATH> NetBox objects and backup membership exact\"\nSRC|BACKUP|117|106: \"verification\": \"DNS absent, NetBox target absent, backup VMIDs restored\"\nSRC|BACKUP|117|113: \"ct112\",\nSRC|BACKUP|117|128: \"backup\": \"homelab-nightly-all previous VMID list 110,111,112,113,130,150\",\nSRC|BACKUP|117|153: \"active_backup_restore_max\": 0\nREC|BACKUP_SOURCE|IDX=118|BASENAME=task.json|PATH_SHA256=1e02bbc556eba83fda313964c41e3414c913291b4b696c3db19a2a18b1fff54a|SHA256=bd0582289f6921e700c163d1c991b5c52d70918084fbed9d1c8e4cd9e613a3ca|SIZE=2812|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|118|20: \"$HOMELAB_RUN_DIR<PATH>\",\nSRC|BACKUP|118|58: \"ct112\",\nSRC|BACKUP|118|62: \"backup_jobs\",\nSRC|BACKUP|118|89: \"active_backup_restore_max\": 0\nREC|BACKUP_SOURCE|IDX=119|BASENAME=preflight.sh|PATH_SHA256=c9d35eef8d8286fdc23960b88edc39fc9eacd909d5ae6fc59ae1123352bedf68|SHA256=2750ce088f821ab4c1f534d75ed21d07fdcee15e389e25648f3631b14dacdf4a|SIZE=5774|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|119|41: homelab-backup-matrix-refresh.service|homelab-cluster-admin-pull.service|skladchik-reports-monitor-supervisor.service)\nSRC|BACKUP|119|57: map(select((.vmid <PATH> -1)==$ctid)) |\nSRC|BACKUP|119|84: map(select((.vmid <PATH> -1)==170)) |\nSRC|BACKUP|119|164: \"dns-ct112-deep.txt\",\nREC|BACKUP_SOURCE|IDX=120|BASENAME=targets.json.pre|PATH_SHA256=c035c931244b171dd07f2b069f2a9eaac902cbfb7d88a72bd9923fd94a7cd87c|SHA256=ac8fc9b95950052cd261a40992b17a485a8794dca82dbc8eb6961751fd4e9720|SIZE=7423|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|120|11: \"logical_id\": \"ct110\",\nSRC|BACKUP|120|14: \"vmid\": 110\nSRC|BACKUP|120|21: \"logical_id\": \"ct111\",\nSRC|BACKUP|120|24: \"vmid\": 111\nSRC|BACKUP|120|31: \"logical_id\": \"ct112\",\nSRC|BACKUP|120|34: \"vmid\": 112\nSRC|BACKUP|120|41: \"logical_id\": \"ct113\",\nSRC|BACKUP|120|44: \"vmid\": 113\nSRC|BACKUP|120|51: \"logical_id\": \"vm130\",\nSRC|BACKUP|120|54: \"vmid\": 130\nSRC|BACKUP|120|61: \"logical_id\": \"vm150\",\nSRC|BACKUP|120|64: \"vmid\": 150\nSRC|BACKUP|120|71: \"logical_id\": \"vm160\",\nSRC|BACKUP|120|74: \"vmid\": 160\nSRC|BACKUP|120|81: \"logical_id\": \"vm170\",\nSRC|BACKUP|120|84: \"vmid\": 170\nSRC|BACKUP|120|91: \"logical_id\": \"vm171\",\nSRC|BACKUP|120|94: \"vmid\": 171\nSRC|BACKUP|120|101: \"logical_id\": \"vm190\",\nSRC|BACKUP|120|104: \"vmid\": 190\nSRC|BACKUP|120|111: \"logical_id\": \"vm210\",\nSRC|BACKUP|120|114: \"vmid\": 210\nSRC|BACKUP|120|121: \"logical_id\": \"vm211\",\nSRC|BACKUP|120|124: \"vmid\": 211\nSRC|BACKUP|120|131: \"logical_id\": \"vm9130\",\nSRC|BACKUP|120|134: \"vmid\": 9130\nSRC|BACKUP|120|140: \"logical_id\": \"node-pve01\",\nSRC|BACKUP|120|149: \"logical_id\": \"node-pve02\",\nSRC|BACKUP|120|158: \"logical_id\": \"node-pve03\",\nSRC|BACKUP|120|169: \"logical_id\": \"md-relay\",\nSRC|BACKUP|120|181: \"logical_id\": \"spb-ingress\",\nSRC|BACKUP|120|193: \"logical_id\": \"us-netbird\",\nSRC|BACKUP|120|203: \"logical_id\": \"router-netcraze\",\nSRC|BACKUP|120|214: \"logical_id\": \"xf-codevipe\",\nSRC|BACKUP|120|219: \"vmid\": 160\nSRC|BACKUP|120|228: \"logical_id\": \"xf-dsmods\",\nSRC|BACKUP|120|233: \"vmid\": 160\nSRC|BACKUP|120|242: \"logical_id\": \"xf-kingofwolk\",\nSRC|BACKUP|120|247: \"vmid\": 160\nSRC|BACKUP|120|256: \"logical_id\": \"xf-newfi\",\nREC|BACKUP_SOURCE|IDX=121|BASENAME=v2-targets.json.pre|PATH_SHA256=3248dd24d03d241acc3d8d5150ad0f640cf7de891e9453ba0f0bd735dcb289ad|SHA256=89769a5564a8c208ac64a9edbcfa0942d516ec9c9c362595dd0120f091800989|SIZE=7416|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|121|11: \"logical_id\": \"ct110\",\nSRC|BACKUP|121|14: \"vmid\": 110\nSRC|BACKUP|121|21: \"logical_id\": \"ct111\",\nSRC|BACKUP|121|24: \"vmid\": 111\nSRC|BACKUP|121|31: \"logical_id\": \"ct112\",\nSRC|BACKUP|121|34: \"vmid\": 112\nSRC|BACKUP|121|41: \"logical_id\": \"ct113\",\nSRC|BACKUP|121|44: \"vmid\": 113\nSRC|BACKUP|121|51: \"logical_id\": \"vm130\",\nSRC|BACKUP|121|54: \"vmid\": 130\nSRC|BACKUP|121|61: \"logical_id\": \"vm150\",\nSRC|BACKUP|121|64: \"vmid\": 150\nSRC|BACKUP|121|71: \"logical_id\": \"vm160\",\nSRC|BACKUP|121|74: \"vmid\": 160\nSRC|BACKUP|121|81: \"logical_id\": \"vm170\",\nSRC|BACKUP|121|84: \"vmid\": 170\nSRC|BACKUP|121|91: \"logical_id\": \"vm171\",\nSRC|BACKUP|121|94: \"vmid\": 171\nSRC|BACKUP|121|101: \"logical_id\": \"vm190\",\nSRC|BACKUP|121|104: \"vmid\": 190\nSRC|BACKUP|121|111: \"logical_id\": \"vm210\",\nSRC|BACKUP|121|114: \"vmid\": 210\nSRC|BACKUP|121|121: \"logical_id\": \"vm211\",\nSRC|BACKUP|121|124: \"vmid\": 211\nSRC|BACKUP|121|131: \"logical_id\": \"vm9130\",\nSRC|BACKUP|121|134: \"vmid\": 9130\nSRC|BACKUP|121|140: \"logical_id\": \"node-pve01\",\nSRC|BACKUP|121|149: \"logical_id\": \"node-pve02\",\nSRC|BACKUP|121|158: \"logical_id\": \"node-pve03\",\nSRC|BACKUP|121|169: \"logical_id\": \"md-relay\",\nSRC|BACKUP|121|181: \"logical_id\": \"spb-ingress\",\nSRC|BACKUP|121|193: \"logical_id\": \"us-netbird\",\nSRC|BACKUP|121|203: \"logical_id\": \"router-netcraze\",\nSRC|BACKUP|121|214: \"logical_id\": \"xf-codevipe\",\nSRC|BACKUP|121|219: \"vmid\": 160\nSRC|BACKUP|121|228: \"logical_id\": \"xf-dsmods\",\nSRC|BACKUP|121|233: \"vmid\": 160\nSRC|BACKUP|121|242: \"logical_id\": \"xf-kingofwolk\",\nSRC|BACKUP|121|247: \"vmid\": 160\nSRC|BACKUP|121|256: \"logical_id\": \"xf-newfi\",\nREC|BACKUP_SOURCE|IDX=122|BASENAME=entry504.py|PATH_SHA256=f573b44bde9bee765262bf457af5b639eb082857a8f7bd0fbec6ec38660aae1a|SHA256=ca6876fa9c3b1465b045344a8ad46962de16972c7dadc4ac6257c7d225047793|SIZE=10566|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|122|4:BASE=pathlib.Path('<PATH>')\nSRC|BACKUP|122|9: 'ct112_handler.py':'8cac6e627d5e7abe5d3163cdd24911995a1e3f45c776f9373c2aa68784f5ec6c',\nSRC|BACKUP|122|62: required=('capture_pve_guest','backup_target','load_targets','cluster_inventory','ssh_remote',\nSRC|BACKUP|122|100: rows=wrapper.load_targets(); hits=[x for x in rows if x.get('logical_id')==lid]\nSRC|BACKUP|122|114: if not callable(wrapper.backup_target) or not callable(wrapper.main) or not callable(wrapper.load_targets):\nSRC|BACKUP|122|141: targets=[{'logical_id':'proof-a','enabled':True,'due_seconds':100},{'logical_id':'proof-b','enabled':True,'due_seconds':100}]\nSRC|BACKUP|122|143: if not isinstance(first,dict) or first.get('logical_id')!='proof-b': raise RuntimeError('SCHEDULER_PROOF_PEER_NOT_SELECTED')\nSRC|BACKUP|122|149: if not isinstance(second,dict) or second.get('logical_id')!='proof-a': raise RuntimeError('SCHEDULER_PROOF_RETRY_NOT_REELIGIBLE')\nSRC|BACKUP|122|154: proof={'failed_target':'proof-a','peer_selected_during_backoff':first['logical_id'],'retry_after_epoch':retry,'last_success_preserved':preserved==1000,'retry_target_after_backoff':second['logical_id'],'success_resets_failures':True,'production_state_root_used':False}\nSRC|BACKUP|122|165: print('SCHEDULER_LIVE_SELECTION='+json.dumps({'logical_id':chosen.get('logical_id'),'due_seconds':chosen.get('due_seconds'),'enabled':chosen.get('enabled') is True},separators=(',',':'),sort_keys=True),flush=True)\nSRC|BACKUP|122|169: if t.get('guest_type')!='lxc' or t.get('logical_id')=='guest-pve01-lxc-112':\nSRC|BACKUP|122|172: print('PLAN_LXC_RESULT='+json.dumps({'logical_id':t['logical_id'],'vmid':int(t['vmid']),'node':out['job']['node'],'job':out['job']},separators=(',',':'),sort_keys=True),flush=True)\nSRC|BACKUP|122|176: if t.get('logical_id')=='guest-pve01-lxc-112':\nSRC|BACKUP|122|179: out=wrapper.backup_target(t,True)\nREC|BACKUP_SOURCE|IDX=123|BASENAME=entry504.py|PATH_SHA256=bb0b3be55afe8c4178ff375705d94ceb34d36268d139fcc52aba24a4fbd6186d|SHA256=ca6876fa9c3b1465b045344a8ad46962de16972c7dadc4ac6257c7d225047793|SIZE=10566|HAS_ALIAS_112=true|HAS_CT112=true|HAS_LAST_TARGET=true\nSRC|BACKUP|123|4:BASE=pathlib.Path('<PATH>')\nSRC|BACKUP|123|9: 'ct112_handler.py':'8cac6e627d5e7abe5d3163cdd24911995a1e3f45c776f9373c2aa68784f5ec6c',\nSRC|BACKUP|123|62: required=('capture_pve_guest','backup_target','load_targets','cluster_inventory','ssh_remote',\nSRC|BACKUP|123|100: rows=wrapper.load_targets(); hits=[x for x in rows if x.get('logical_id')==lid]\nSRC|BACKUP|123|114: if not callable(wrapper.backup_target) or not callable(wrapper.main) or not callable(wrapper.load_targets):\nSRC|BACKUP|123|141: targets=[{'logical_id':'proof-a','enabled':True,'due_seconds':100},{'logical_id':'proof-b','enabled':True,'due_seconds':100}]\nSRC|BACKUP|123|143: if not isinstance(first,dict) or first.get('logical_id')!='proof-b': raise RuntimeError('SCHEDULER_PROOF_PEER_NOT_SELECTED')\nSRC|BACKUP|123|149: if not isinstance(second,dict) or second.get('logical_id')!='proof-a': raise RuntimeError('SCHEDULER_PROOF_RETRY_NOT_REELIGIBLE')\nSRC|BACKUP|123|154: proof={'failed_target':'proof-a','peer_selected_during_backoff':first['logical_id'],'retry_after_epoch':retry,'last_success_preserved':preserved==1000,'retry_target_after_backoff':second['logical_id'],'success_resets_failures':True,'production_state_root_used':False}\nSRC|BACKUP|123|165: print('SCHEDULER_LIVE_SELECTION='+json.dumps({'logical_id':chosen.get('logical_id'),'due_seconds':chosen.get('due_seconds'),'enabled':chosen.get('enabled') is True},separators=(',',':'),sort_keys=True),flush=True)\nSRC|BACKUP|123|169: if t.get('guest_type')!='lxc' or t.get('logical_id')=='guest-pve01-lxc-112':\nSRC|BACKUP|123|172: print('PLAN_LXC_RESULT='+json.dumps({'logical_id':t['logical_id'],'vmid':int(t['vmid']),'node':out['job']['node'],'job':out['job']},separators=(',',':'),sort_keys=True),flush=True)\nSRC|BACKUP|123|176: if t.get('logical_id')=='guest-pve01-lxc-112':\nSRC|BACKUP|123|179: out=wrapper.backup_target(t,True)\nREC|BACKUP_SOURCE|IDX=124|BASENAME=source-provenance.tsv|PATH_SHA256=f775a79180619da0b4fb467d1ea25a2794a4772fba293317edc2a92099d8ff00|SHA256=88a5e36778f92032ee8b6c71f96036cb5db397df8fd63eb27ca72db2fb33ffe1|SIZE=693|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|124|8:original_lxc_actual_boot\tct112 Cloud B\nSRC|BACKUP|124|10:new_initial_lxc_actual_boot\tct112 Cloud A current latest strict SEALED\nREC|BACKUP_SOURCE|IDX=125|BASENAME=run.sh|PATH_SHA256=a2304402cc83eb21c3651f9eca373afaa3afebf0d2ae39f800458c9d047225eb|SHA256=a05a188af1f432257ffb8a321184e5a5944187fe665f909e50db1c918581e80d|SIZE=7433|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|125|11: T=\"$W<PATH>\"\nSRC|BACKUP|125|16: SEAL=<PATH>\nSRC|BACKUP|125|28: precheck_out=\"$(HOMELAB_BOOT_DRILL_POLICY=\"$HERE<PATH>\" HOMELAB_BOOT_DRILL_STATE_EXPORTER=\"$HERE<PATH>\" PYTHONDONTWRITEBYTECODE=1 <PATH> -S -B \"$HERE<PATH>\" precheck 2>&1)\"\nSRC|BACKUP|125|53: PYTHONDONTWRITEBYTECODE=1 <PATH> -S -B -m unittest -v tests.test_repository tests.test_reg_014_015 tests.test_cr_2026_0070_target_lifecycle_registry tests.test_cr_2026_0071_backup_observability tests.test_cr_2026_0071_nounset_regression tests.test_cr_2026_0072_gfs_retention tests.test_cr_2026_0074_delete_evidence_hardening tests.test_cr_2026_0075_rotating_boot_drill\nSRC|BACKUP|125|76: HOMELAB_CONTROLLED_APPLY_CONFIRM=backup-rotating-boot-drill-escrow-freshness-v1 \"$ADMIN\" run \"$T\" apply\nSRC|BACKUP|125|83: HOMELAB_CONTROLLED_APPLY_CONFIRM=backup-rotating-boot-drill-escrow-freshness-v1 \"$ADMIN\" run \"$T\" rollback\nSRC|BACKUP|125|99: HOMELAB_CONTROLLED_APPLY_CONFIRM=backup-rotating-boot-drill-escrow-freshness-v1 \"$ADMIN\" run \"$T\" rollback\nSRC|BACKUP|125|115: HOMELAB_CONTROLLED_APPLY_CONFIRM=backup-rotating-boot-drill-escrow-freshness-v1 \"$ADMIN\" run \"$T\" rollback\nSRC|BACKUP|125|126: jq -e --arg h \"$new_head\" '.status==\"SEALED\" and .change_id==\"CR-2026-0075\" and .source_head==$h and .rotating_actual_boot_drills==true and .timer_active==true and .immediate_actual_qemu_boot_proven==true and .immediate_actual_lxc_boot_proven==true and .initial_qemu_vmid==\"180\" and .initial_lxc_vmid==\"112\" and .initial_qemu_cloud==\"B\" and .initial_lxc_cloud==\"A\" and .qemu_boot_acceptance==\"GUEST_AGENT_RESPONDED\" and .lxc_boot_acceptance==\"PCT_EXEC_TRUE\" and .escrow_freshness_coupled==true and .escrow_semantic_proof_max_age_days==90 and .physical_escrow_media_read_proven==false and .original_site_dr_seal_unchanged==true and .temporary_guest_residue==false and .cloud_writes==false and .cloud_deletes==false and .production_guest_state_unchanged==true' \"$SEAL\" ><PATH>\nSRC|BACKUP|125|129: printf 'FINAL_DR_918=OK|source_head=%s|seal_sha256=%s|rotating_boot=ACTIVE|qemu180_cloud=B_PROVEN|ct112_cloud=A_PROVEN|escrow_freshness=COUPLED_90D|temp_residue=NO|cloud_writes=NO\\n' \"$new_head\" \"$(sha256sum \"$SEAL\" | awk '{print $1}')\"\nREC|BACKUP_SOURCE|IDX=126|BASENAME=targets.before|PATH_SHA256=01a2beff6df5d77aacf3c9dcc1cfbc08d0efcdfd3806264782277e9999d539cd|SHA256=89769a5564a8c208ac64a9edbcfa0942d516ec9c9c362595dd0120f091800989|SIZE=7416|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|126|11: \"logical_id\": \"ct110\",\nSRC|BACKUP|126|14: \"vmid\": 110\nSRC|BACKUP|126|21: \"logical_id\": \"ct111\",\nSRC|BACKUP|126|24: \"vmid\": 111\nSRC|BACKUP|126|31: \"logical_id\": \"ct112\",\nSRC|BACKUP|126|34: \"vmid\": 112\nSRC|BACKUP|126|41: \"logical_id\": \"ct113\",\nSRC|BACKUP|126|44: \"vmid\": 113\nSRC|BACKUP|126|51: \"logical_id\": \"vm130\",\nSRC|BACKUP|126|54: \"vmid\": 130\nSRC|BACKUP|126|61: \"logical_id\": \"vm150\",\nSRC|BACKUP|126|64: \"vmid\": 150\nSRC|BACKUP|126|71: \"logical_id\": \"vm160\",\nSRC|BACKUP|126|74: \"vmid\": 160\nSRC|BACKUP|126|81: \"logical_id\": \"vm170\",\nSRC|BACKUP|126|84: \"vmid\": 170\nSRC|BACKUP|126|91: \"logical_id\": \"vm171\",\nSRC|BACKUP|126|94: \"vmid\": 171\nSRC|BACKUP|126|101: \"logical_id\": \"vm190\",\nSRC|BACKUP|126|104: \"vmid\": 190\nSRC|BACKUP|126|111: \"logical_id\": \"vm210\",\nSRC|BACKUP|126|114: \"vmid\": 210\nSRC|BACKUP|126|121: \"logical_id\": \"vm211\",\nSRC|BACKUP|126|124: \"vmid\": 211\nSRC|BACKUP|126|131: \"logical_id\": \"vm9130\",\nSRC|BACKUP|126|134: \"vmid\": 9130\nSRC|BACKUP|126|140: \"logical_id\": \"node-pve01\",\nSRC|BACKUP|126|149: \"logical_id\": \"node-pve02\",\nSRC|BACKUP|126|158: \"logical_id\": \"node-pve03\",\nSRC|BACKUP|126|169: \"logical_id\": \"md-relay\",\nSRC|BACKUP|126|181: \"logical_id\": \"spb-ingress\",\nSRC|BACKUP|126|193: \"logical_id\": \"us-netbird\",\nSRC|BACKUP|126|203: \"logical_id\": \"router-netcraze\",\nSRC|BACKUP|126|214: \"logical_id\": \"xf-codevipe\",\nSRC|BACKUP|126|219: \"vmid\": 160\nSRC|BACKUP|126|228: \"logical_id\": \"xf-dsmods\",\nSRC|BACKUP|126|233: \"vmid\": 160\nSRC|BACKUP|126|242: \"logical_id\": \"xf-kingofwolk\",\nSRC|BACKUP|126|247: \"vmid\": 160\nSRC|BACKUP|126|256: \"logical_id\": \"xf-newfi\",\nREC|BACKUP_SOURCE|IDX=127|BASENAME=targets.before|PATH_SHA256=9754051cea565efffa6e2e7c1ab3177743f03bab07452ecfa3f75588b03c56a9|SHA256=89769a5564a8c208ac64a9edbcfa0942d516ec9c9c362595dd0120f091800989|SIZE=7416|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|127|11: \"logical_id\": \"ct110\",\nSRC|BACKUP|127|14: \"vmid\": 110\nSRC|BACKUP|127|21: \"logical_id\": \"ct111\",\nSRC|BACKUP|127|24: \"vmid\": 111\nSRC|BACKUP|127|31: \"logical_id\": \"ct112\",\nSRC|BACKUP|127|34: \"vmid\": 112\nSRC|BACKUP|127|41: \"logical_id\": \"ct113\",\nSRC|BACKUP|127|44: \"vmid\": 113\nSRC|BACKUP|127|51: \"logical_id\": \"vm130\",\nSRC|BACKUP|127|54: \"vmid\": 130\nSRC|BACKUP|127|61: \"logical_id\": \"vm150\",\nSRC|BACKUP|127|64: \"vmid\": 150\nSRC|BACKUP|127|71: \"logical_id\": \"vm160\",\nSRC|BACKUP|127|74: \"vmid\": 160\nSRC|BACKUP|127|81: \"logical_id\": \"vm170\",\nSRC|BACKUP|127|84: \"vmid\": 170\nSRC|BACKUP|127|91: \"logical_id\": \"vm171\",\nSRC|BACKUP|127|94: \"vmid\": 171\nSRC|BACKUP|127|101: \"logical_id\": \"vm190\",\nSRC|BACKUP|127|104: \"vmid\": 190\nSRC|BACKUP|127|111: \"logical_id\": \"vm210\",\nSRC|BACKUP|127|114: \"vmid\": 210\nSRC|BACKUP|127|121: \"logical_id\": \"vm211\",\nSRC|BACKUP|127|124: \"vmid\": 211\nSRC|BACKUP|127|131: \"logical_id\": \"vm9130\",\nSRC|BACKUP|127|134: \"vmid\": 9130\nSRC|BACKUP|127|140: \"logical_id\": \"node-pve01\",\nSRC|BACKUP|127|149: \"logical_id\": \"node-pve02\",\nSRC|BACKUP|127|158: \"logical_id\": \"node-pve03\",\nSRC|BACKUP|127|169: \"logical_id\": \"md-relay\",\nSRC|BACKUP|127|181: \"logical_id\": \"spb-ingress\",\nSRC|BACKUP|127|193: \"logical_id\": \"us-netbird\",\nSRC|BACKUP|127|203: \"logical_id\": \"router-netcraze\",\nSRC|BACKUP|127|214: \"logical_id\": \"xf-codevipe\",\nSRC|BACKUP|127|219: \"vmid\": 160\nSRC|BACKUP|127|228: \"logical_id\": \"xf-dsmods\",\nSRC|BACKUP|127|233: \"vmid\": 160\nSRC|BACKUP|127|242: \"logical_id\": \"xf-kingofwolk\",\nSRC|BACKUP|127|247: \"vmid\": 160\nSRC|BACKUP|127|256: \"logical_id\": \"xf-newfi\",\nREC|BACKUP_SOURCE|IDX=128|BASENAME=engine.before|PATH_SHA256=4de8ceb580c66681c50c2b27558d441bf8bc4a7488fe67b757b40a44141b002d|SHA256=b6e79f087b9f1d21dac4f77a7b46b743299bbb85bc716e80d2ea67c2e038bcd7|SIZE=59719|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|128|6:STATE_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|128|7:CONFIG_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|128|9:WORK_ROOT=pathlib.Path('<PATH>')\nSRC|BACKUP|128|10:ENGINE_PATH=pathlib.Path('<PATH>')\nSRC|BACKUP|128|25:GUEST266=pathlib.Path('<PATH>')\nSRC|BACKUP|128|27:P270=pathlib.Path('<PATH>')\nSRC|BACKUP|128|29:P282=pathlib.Path('<PATH>')\nSRC|BACKUP|128|31:P265=pathlib.Path('<PATH>')\nSRC|BACKUP|128|35: (pathlib.Path('<PATH>'),'e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2'),\nSRC|BACKUP|128|36: (pathlib.Path('<PATH>'),'b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688'),\nSRC|BACKUP|128|37: (pathlib.Path('<PATH>'),'a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16'),\nSRC|BACKUP|128|38: (pathlib.Path('<PATH>'),'db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060'),\nSRC|BACKUP|128|39: (pathlib.Path('<PATH>'),'5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a'),\nSRC|BACKUP|128|46: pathlib.Path('<PATH>'),\nSRC|BACKUP|128|47: pathlib.Path('<PATH>'),\nSRC|BACKUP|128|48: pathlib.Path('<PATH>'),\nSRC|BACKUP|128|49: pathlib.Path('<PATH>'),\nSRC|BACKUP|128|50: pathlib.Path('<PATH>'),\nSRC|BACKUP|128|51: pathlib.Path('<PATH>'),\nSRC|BACKUP|128|52: pathlib.Path('<PATH>'),\nSRC|BACKUP|128|53: pathlib.Path('<PATH>'),\nSRC|BACKUP|128|54: pathlib.Path('<PATH>'),\nSRC|BACKUP|128|55: pathlib.Path('<PATH>'),\nSRC|BACKUP|128|56: pathlib.Path('<PATH>'),\nSRC|BACKUP|128|132:def remote_generation_path(scope,logical_id,generation):\nSRC|BACKUP|128|134: for x in (scope,logical_id,generation):\nSRC|BACKUP|128|136: return f'homelab-backups<PATH>'\nSRC|BACKUP|128|138:def make_manifest(scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta):\nSRC|BACKUP|128|142: return {'schema':2,'scope':scope,'logical_id':logical_id,'generation':generation,'created_at_utc':utcnow(),\nSRC|BACKUP|128|153: for vmid,typ in [(110,'lxc'),(111,'lxc'),(112,'lxc'),(113,'lxc'),(130,'qemu'),(150,'qemu'),(160,'qemu'),(170,'qemu'),(171,'qemu'),(190,'qemu'),(210,'qemu'),(211,'qemu'),(9130,'qemu')]:\nSRC|BACKUP|128|154: out.append({'logical_id':('ct' if typ=='lxc' else 'vm')+str(vmid),'scope':'pve','type':'pve_guest','vmid':vmid,'guest_type':typ,'due_seconds':d,'enabled':True,'green1':vmid==112})\nSRC|BACKUP|128|156: out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})\nSRC|BACKUP|128|158: {'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'<IP>','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|128|159: {'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'<IP>','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|128|160: {'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'<IP>','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh<PATH>','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|128|161: {'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},\nSRC|BACKUP|128|171: for slug,vmid,node,root,db,strategy in sites:\nSRC|BACKUP|128|172: out.append({'logical_id':'xf-'+slug,'scope':'xenforo','type':'xenforo','slug':slug,'vmid':vmid,'node':node,'app_root':root,'db_name':db,'dump_strategy':strategy,'due_seconds':d,'enabled':True,'green1':slug in ('codevipe','zakrutim')})\nSRC|BACKUP|128|173: out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})\nSRC|BACKUP|128|182: last=int(state.get(t['logical_id'],{}).get('last_success_epoch',0))\nREC|BACKUP_SOURCE|IDX=129|BASENAME=targets.before|PATH_SHA256=2d5d4de25953744b87ad3b0e0ff2d752e2c70b48193d96023f0c6834ce834fbc|SHA256=89769a5564a8c208ac64a9edbcfa0942d516ec9c9c362595dd0120f091800989|SIZE=7416|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|129|11: \"logical_id\": \"ct110\",\nSRC|BACKUP|129|14: \"vmid\": 110\nSRC|BACKUP|129|21: \"logical_id\": \"ct111\",\nSRC|BACKUP|129|24: \"vmid\": 111\nSRC|BACKUP|129|31: \"logical_id\": \"ct112\",\nSRC|BACKUP|129|34: \"vmid\": 112\nSRC|BACKUP|129|41: \"logical_id\": \"ct113\",\nSRC|BACKUP|129|44: \"vmid\": 113\nSRC|BACKUP|129|51: \"logical_id\": \"vm130\",\nSRC|BACKUP|129|54: \"vmid\": 130\nSRC|BACKUP|129|61: \"logical_id\": \"vm150\",\nSRC|BACKUP|129|64: \"vmid\": 150\nSRC|BACKUP|129|71: \"logical_id\": \"vm160\",\nSRC|BACKUP|129|74: \"vmid\": 160\nSRC|BACKUP|129|81: \"logical_id\": \"vm170\",\nSRC|BACKUP|129|84: \"vmid\": 170\nSRC|BACKUP|129|91: \"logical_id\": \"vm171\",\nSRC|BACKUP|129|94: \"vmid\": 171\nSRC|BACKUP|129|101: \"logical_id\": \"vm190\",\nSRC|BACKUP|129|104: \"vmid\": 190\nSRC|BACKUP|129|111: \"logical_id\": \"vm210\",\nSRC|BACKUP|129|114: \"vmid\": 210\nSRC|BACKUP|129|121: \"logical_id\": \"vm211\",\nSRC|BACKUP|129|124: \"vmid\": 211\nSRC|BACKUP|129|131: \"logical_id\": \"vm9130\",\nSRC|BACKUP|129|134: \"vmid\": 9130\nSRC|BACKUP|129|140: \"logical_id\": \"node-pve01\",\nSRC|BACKUP|129|149: \"logical_id\": \"node-pve02\",\nSRC|BACKUP|129|158: \"logical_id\": \"node-pve03\",\nSRC|BACKUP|129|169: \"logical_id\": \"md-relay\",\nSRC|BACKUP|129|181: \"logical_id\": \"spb-ingress\",\nSRC|BACKUP|129|193: \"logical_id\": \"us-netbird\",\nSRC|BACKUP|129|203: \"logical_id\": \"router-netcraze\",\nSRC|BACKUP|129|214: \"logical_id\": \"xf-codevipe\",\nSRC|BACKUP|129|219: \"vmid\": 160\nSRC|BACKUP|129|228: \"logical_id\": \"xf-dsmods\",\nSRC|BACKUP|129|233: \"vmid\": 160\nSRC|BACKUP|129|242: \"logical_id\": \"xf-kingofwolk\",\nSRC|BACKUP|129|247: \"vmid\": 160\nSRC|BACKUP|129|256: \"logical_id\": \"xf-newfi\",\nREC|BACKUP_SOURCE|IDX=130|BASENAME=task.json|PATH_SHA256=3da06d3e8fcd0cd7c9d55dfb3269b3679da85698d7692e9015a9704491d74b5c|SHA256=ee1b07c5e90a11701dc58d576ca6c7d4c0dbf912a3ce58b5ec3b10fdba8071e4|SIZE=5771|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|130|12: \"proxmox:cluster-backup-job:homelab-nightly-all\",\nSRC|BACKUP|130|46: \"$HOMELAB_RUN_DIR<PATH>\",\nSRC|BACKUP|130|47: \"$HOMELAB_RUN_DIR<PATH>\"\nSRC|BACKUP|130|58: \"proxmox:cluster-backup-job:homelab-nightly-all:vmid\"\nSRC|BACKUP|130|74: \"verification\": \"AdGuard proposals validate and NetBox<PATH> plans are safe\"\nSRC|BACKUP|130|79: \"verification\": \"DNS, NetBox and backup registration applied\"\nSRC|BACKUP|130|84: \"verification\": \"A<PATH> NetBox objects and backup membership exact\"\nSRC|BACKUP|130|106: \"verification\": \"DNS absent, NetBox target absent, backup VMIDs restored\"\nSRC|BACKUP|130|113: \"ct112\",\nSRC|BACKUP|130|128: \"backup\": \"homelab-nightly-all previous VMID list 110,111,112,113,130,150\",\nSRC|BACKUP|130|152: \"active_backup_restore_max\": 0\nREC|BACKUP_SOURCE|IDX=131|BASENAME=task.json|PATH_SHA256=9740e18b52e2149a1ea852177904920d62d04823a189380d867622087935bd0b|SHA256=ee1b07c5e90a11701dc58d576ca6c7d4c0dbf912a3ce58b5ec3b10fdba8071e4|SIZE=5771|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|131|12: \"proxmox:cluster-backup-job:homelab-nightly-all\",\nSRC|BACKUP|131|46: \"$HOMELAB_RUN_DIR<PATH>\",\nSRC|BACKUP|131|47: \"$HOMELAB_RUN_DIR<PATH>\"\nSRC|BACKUP|131|58: \"proxmox:cluster-backup-job:homelab-nightly-all:vmid\"\nSRC|BACKUP|131|74: \"verification\": \"AdGuard proposals validate and NetBox<PATH> plans are safe\"\nSRC|BACKUP|131|79: \"verification\": \"DNS, NetBox and backup registration applied\"\nSRC|BACKUP|131|84: \"verification\": \"A<PATH> NetBox objects and backup membership exact\"\nSRC|BACKUP|131|106: \"verification\": \"DNS absent, NetBox target absent, backup VMIDs restored\"\nSRC|BACKUP|131|113: \"ct112\",\nSRC|BACKUP|131|128: \"backup\": \"homelab-nightly-all previous VMID list 110,111,112,113,130,150\",\nSRC|BACKUP|131|152: \"active_backup_restore_max\": 0\nREC|BACKUP_SOURCE|IDX=132|BASENAME=task.json|PATH_SHA256=589bbf6e74a63de5a4375f4b79c71a2dd8bb1ead13f7b02c9718b016107ed968|SHA256=1458a64bc17a830f65c24bd8f0b50c93e42a90a4a241e4ee6fc6ea1577c256c5|SIZE=2787|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|132|21: \"$HOMELAB_RUN_DIR<PATH>\",\nSRC|BACKUP|132|60: \"ct112\",\nSRC|BACKUP|132|64: \"backup_jobs\",\nSRC|BACKUP|132|90: \"active_backup_restore_max\": 0\nREC|BACKUP_SOURCE|IDX=133|BASENAME=task.json|PATH_SHA256=1662fa28213a369121925b9809a98246c125740665502c9d3c4f613b15e2881b|SHA256=665ac47d1f9fdedf5adbbf4c2c44bb13db8eb29f15dfef60c48af4cffc03da1d|SIZE=5957|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|133|12: \"proxmox:cluster-backup-job:homelab-nightly-all\",\nSRC|BACKUP|133|46: \"$HOMELAB_RUN_DIR<PATH>\",\nSRC|BACKUP|133|47: \"$HOMELAB_RUN_DIR<PATH>\"\nSRC|BACKUP|133|58: \"proxmox:cluster-backup-job:homelab-nightly-all:vmid\"\nSRC|BACKUP|133|74: \"verification\": \"AdGuard proposals validate and NetBox<PATH> plans are safe\"\nSRC|BACKUP|133|79: \"verification\": \"DNS, NetBox and backup registration applied\"\nSRC|BACKUP|133|84: \"verification\": \"A<PATH> NetBox objects and backup membership exact\"\nSRC|BACKUP|133|106: \"verification\": \"DNS absent, NetBox target absent, backup VMIDs restored\"\nSRC|BACKUP|133|113: \"ct112\",\nSRC|BACKUP|133|128: \"backup\": \"homelab-nightly-all previous VMID list 110,111,112,113,130,150\",\nSRC|BACKUP|133|153: \"active_backup_restore_max\": 0\nREC|BACKUP_SOURCE|IDX=134|BASENAME=task.json|PATH_SHA256=856a0a6463d0a00a7644881ca5f8c39eea0557a54f934b86b185e87d0e89a070|SHA256=665ac47d1f9fdedf5adbbf4c2c44bb13db8eb29f15dfef60c48af4cffc03da1d|SIZE=5957|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|134|12: \"proxmox:cluster-backup-job:homelab-nightly-all\",\nSRC|BACKUP|134|46: \"$HOMELAB_RUN_DIR<PATH>\",\nSRC|BACKUP|134|47: \"$HOMELAB_RUN_DIR<PATH>\"\nSRC|BACKUP|134|58: \"proxmox:cluster-backup-job:homelab-nightly-all:vmid\"\nSRC|BACKUP|134|74: \"verification\": \"AdGuard proposals validate and NetBox<PATH> plans are safe\"\nSRC|BACKUP|134|79: \"verification\": \"DNS, NetBox and backup registration applied\"\nSRC|BACKUP|134|84: \"verification\": \"A<PATH> NetBox objects and backup membership exact\"\nSRC|BACKUP|134|106: \"verification\": \"DNS absent, NetBox target absent, backup VMIDs restored\"\nSRC|BACKUP|134|113: \"ct112\",\nSRC|BACKUP|134|128: \"backup\": \"homelab-nightly-all previous VMID list 110,111,112,113,130,150\",\nSRC|BACKUP|134|153: \"active_backup_restore_max\": 0\nREC|BACKUP_SOURCE|IDX=135|BASENAME=task.json|PATH_SHA256=0ef3ca65130919c52652299f8c64445422ab23a88b50ed13494571e0fa56917f|SHA256=665ac47d1f9fdedf5adbbf4c2c44bb13db8eb29f15dfef60c48af4cffc03da1d|SIZE=5957|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|135|12: \"proxmox:cluster-backup-job:homelab-nightly-all\",\nSRC|BACKUP|135|46: \"$HOMELAB_RUN_DIR<PATH>\",\nSRC|BACKUP|135|47: \"$HOMELAB_RUN_DIR<PATH>\"\nSRC|BACKUP|135|58: \"proxmox:cluster-backup-job:homelab-nightly-all:vmid\"\nSRC|BACKUP|135|74: \"verification\": \"AdGuard proposals validate and NetBox<PATH> plans are safe\"\nSRC|BACKUP|135|79: \"verification\": \"DNS, NetBox and backup registration applied\"\nSRC|BACKUP|135|84: \"verification\": \"A<PATH> NetBox objects and backup membership exact\"\nSRC|BACKUP|135|106: \"verification\": \"DNS absent, NetBox target absent, backup VMIDs restored\"\nSRC|BACKUP|135|113: \"ct112\",\nSRC|BACKUP|135|128: \"backup\": \"homelab-nightly-all previous VMID list 110,111,112,113,130,150\",\nSRC|BACKUP|135|153: \"active_backup_restore_max\": 0\nREC|BACKUP_SOURCE|IDX=136|BASENAME=task.json|PATH_SHA256=8f5551be04d83e3c27e539153f21b8ee0c3bcbc1fca03f7b58ed44cd8366e8ec|SHA256=665ac47d1f9fdedf5adbbf4c2c44bb13db8eb29f15dfef60c48af4cffc03da1d|SIZE=5957|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|136|12: \"proxmox:cluster-backup-job:homelab-nightly-all\",\nSRC|BACKUP|136|46: \"$HOMELAB_RUN_DIR<PATH>\",\nSRC|BACKUP|136|47: \"$HOMELAB_RUN_DIR<PATH>\"\nSRC|BACKUP|136|58: \"proxmox:cluster-backup-job:homelab-nightly-all:vmid\"\nSRC|BACKUP|136|74: \"verification\": \"AdGuard proposals validate and NetBox<PATH> plans are safe\"\nSRC|BACKUP|136|79: \"verification\": \"DNS, NetBox and backup registration applied\"\nSRC|BACKUP|136|84: \"verification\": \"A<PATH> NetBox objects and backup membership exact\"\nSRC|BACKUP|136|106: \"verification\": \"DNS absent, NetBox target absent, backup VMIDs restored\"\nSRC|BACKUP|136|113: \"ct112\",\nSRC|BACKUP|136|128: \"backup\": \"homelab-nightly-all previous VMID list 110,111,112,113,130,150\",\nSRC|BACKUP|136|153: \"active_backup_restore_max\": 0\nREC|BACKUP_SOURCE|IDX=137|BASENAME=task.json|PATH_SHA256=13987bddcc0125cec84e9cbf02c708f608a4c26b8c631638ba0b9132b17fe568|SHA256=665ac47d1f9fdedf5adbbf4c2c44bb13db8eb29f15dfef60c48af4cffc03da1d|SIZE=5957|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|137|12: \"proxmox:cluster-backup-job:homelab-nightly-all\",\nSRC|BACKUP|137|46: \"$HOMELAB_RUN_DIR<PATH>\",\nSRC|BACKUP|137|47: \"$HOMELAB_RUN_DIR<PATH>\"\nSRC|BACKUP|137|58: \"proxmox:cluster-backup-job:homelab-nightly-all:vmid\"\nSRC|BACKUP|137|74: \"verification\": \"AdGuard proposals validate and NetBox<PATH> plans are safe\"\nSRC|BACKUP|137|79: \"verification\": \"DNS, NetBox and backup registration applied\"\nSRC|BACKUP|137|84: \"verification\": \"A<PATH> NetBox objects and backup membership exact\"\nSRC|BACKUP|137|106: \"verification\": \"DNS absent, NetBox target absent, backup VMIDs restored\"\nSRC|BACKUP|137|113: \"ct112\",\nSRC|BACKUP|137|128: \"backup\": \"homelab-nightly-all previous VMID list 110,111,112,113,130,150\",\nSRC|BACKUP|137|153: \"active_backup_restore_max\": 0\nREC|BACKUP_SOURCE|IDX=138|BASENAME=task.json|PATH_SHA256=118c64b3a35fcbd3e92afab3f745c13812d513437c26ba78fa175db91cedab16|SHA256=665ac47d1f9fdedf5adbbf4c2c44bb13db8eb29f15dfef60c48af4cffc03da1d|SIZE=5957|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|138|12: \"proxmox:cluster-backup-job:homelab-nightly-all\",\nSRC|BACKUP|138|46: \"$HOMELAB_RUN_DIR<PATH>\",\nSRC|BACKUP|138|47: \"$HOMELAB_RUN_DIR<PATH>\"\nSRC|BACKUP|138|58: \"proxmox:cluster-backup-job:homelab-nightly-all:vmid\"\nSRC|BACKUP|138|74: \"verification\": \"AdGuard proposals validate and NetBox<PATH> plans are safe\"\nSRC|BACKUP|138|79: \"verification\": \"DNS, NetBox and backup registration applied\"\nSRC|BACKUP|138|84: \"verification\": \"A<PATH> NetBox objects and backup membership exact\"\nSRC|BACKUP|138|106: \"verification\": \"DNS absent, NetBox target absent, backup VMIDs restored\"\nSRC|BACKUP|138|113: \"ct112\",\nSRC|BACKUP|138|128: \"backup\": \"homelab-nightly-all previous VMID list 110,111,112,113,130,150\",\nSRC|BACKUP|138|153: \"active_backup_restore_max\": 0\nREC|BACKUP_SOURCE|IDX=139|BASENAME=task.json|PATH_SHA256=437f2578a2880ca084396e3a42a3d5272c4f7df87e5f3770317a5795e46c06af|SHA256=665ac47d1f9fdedf5adbbf4c2c44bb13db8eb29f15dfef60c48af4cffc03da1d|SIZE=5957|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|139|12: \"proxmox:cluster-backup-job:homelab-nightly-all\",\nSRC|BACKUP|139|46: \"$HOMELAB_RUN_DIR<PATH>\",\nSRC|BACKUP|139|47: \"$HOMELAB_RUN_DIR<PATH>\"\nSRC|BACKUP|139|58: \"proxmox:cluster-backup-job:homelab-nightly-all:vmid\"\nSRC|BACKUP|139|74: \"verification\": \"AdGuard proposals validate and NetBox<PATH> plans are safe\"\nSRC|BACKUP|139|79: \"verification\": \"DNS, NetBox and backup registration applied\"\nSRC|BACKUP|139|84: \"verification\": \"A<PATH> NetBox objects and backup membership exact\"\nSRC|BACKUP|139|106: \"verification\": \"DNS absent, NetBox target absent, backup VMIDs restored\"\nSRC|BACKUP|139|113: \"ct112\",\nSRC|BACKUP|139|128: \"backup\": \"homelab-nightly-all previous VMID list 110,111,112,113,130,150\",\nSRC|BACKUP|139|153: \"active_backup_restore_max\": 0\nREC|BACKUP_SOURCE|IDX=140|BASENAME=task.json|PATH_SHA256=e0cdb23f42c4dbf41bc522887c0c04f888034cf2a2ced18e01bd0ac036081ff2|SHA256=665ac47d1f9fdedf5adbbf4c2c44bb13db8eb29f15dfef60c48af4cffc03da1d|SIZE=5957|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|140|12: \"proxmox:cluster-backup-job:homelab-nightly-all\",\nSRC|BACKUP|140|46: \"$HOMELAB_RUN_DIR<PATH>\",\nSRC|BACKUP|140|47: \"$HOMELAB_RUN_DIR<PATH>\"\nSRC|BACKUP|140|58: \"proxmox:cluster-backup-job:homelab-nightly-all:vmid\"\nSRC|BACKUP|140|74: \"verification\": \"AdGuard proposals validate and NetBox<PATH> plans are safe\"\nSRC|BACKUP|140|79: \"verification\": \"DNS, NetBox and backup registration applied\"\nSRC|BACKUP|140|84: \"verification\": \"A<PATH> NetBox objects and backup membership exact\"\nSRC|BACKUP|140|106: \"verification\": \"DNS absent, NetBox target absent, backup VMIDs restored\"\nSRC|BACKUP|140|113: \"ct112\",\nSRC|BACKUP|140|128: \"backup\": \"homelab-nightly-all previous VMID list 110,111,112,113,130,150\",\nSRC|BACKUP|140|153: \"active_backup_restore_max\": 0\nREC|BACKUP_SOURCE|IDX=141|BASENAME=task.json|PATH_SHA256=f786d140fb026dc9dd50351805f2bdad03be50cdc665bd08cc1b0f47997147db|SHA256=bd0582289f6921e700c163d1c991b5c52d70918084fbed9d1c8e4cd9e613a3ca|SIZE=2812|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|141|20: \"$HOMELAB_RUN_DIR<PATH>\",\nSRC|BACKUP|141|58: \"ct112\",\nSRC|BACKUP|141|62: \"backup_jobs\",\nSRC|BACKUP|141|89: \"active_backup_restore_max\": 0\nREC|BACKUP_SOURCE|IDX=142|BASENAME=write-surfaces-audit.json|PATH_SHA256=0f9d71b629b3a88fec921a433e425d74bf628f64ae188e7fd3e56804eb421577|SHA256=0452de694df8bf8351a37dc2677139b2b16cc39bdfaff61dce11c20a8916e5d1|SIZE=623|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|142|13: \"dns-ct112-deep.txt\",\nREC|BACKUP_SOURCE|IDX=143|BASENAME=ct112.json|PATH_SHA256=4650ea76820591a6e992aec1b18082b7e81a1ddb2613556f7c8139c0036ec824|SHA256=64f302f9156d0fd91c340023caf8f003810b8a66c84d446dccc063cbbb01a8cd|SIZE=609|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|143|1:{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"generation\":\"v2-ct112-20261007T045109Z-ce9503fc59c5\",\"green_verified\":false,\"last_attempt_epoch\":1791348739,\"last_success_epoch\":1791348739,\"logical_id\":\"ct112\",\"manifest_sha256\":\"a471f21d07745c17e80f6f13ad196f9c4fb22d23705b96c25914f49167a71ef1\",\"payload_sha256\":\"522c9fd7e43c47a9bd6c1e39ca068dfc80fa5dce9c039a3ecb29a26a437b6ea7\",\"replicas\":[{\"crypt\":\"pve03-mail-01-crypt\",\"physical\":\"pve03-mail-01\"},{\"crypt\":\"pve02-mail-03-crypt\",\"physical\":\"pve02-mail-03\"}],\"result\":\"SUCCESS\",\"retry_after_epoch\":0,\"schema\":1,\"updated_at_utc\":\"2026-10-07T04:52:19Z\"}\nREC|BACKUP_SOURCE|IDX=144|BASENAME=guest-pve01-lxc-112.json|PATH_SHA256=5211dfc0645d177de3ac4e85db86b9e305060b84bbebcf62f0aa6aa8b88b13ca|SHA256=b737b8c81c6e16f480c8227f0645e5236e412cf22de0da6af83ff6d6dc37e4bb|SIZE=845|HAS_ALIAS_112=true|HAS_CT112=false|HAS_LAST_TARGET=true\nSRC|BACKUP|144|1:{\"consecutive_failures\":35,\"failure_backoff_seconds\":21600,\"last_attempt_epoch\":1791375479,\"last_success_epoch\":1790297001,\"last_success_generation\":\"V2-20260925T004104Z-eee9466d5b39\",\"last_success_green_verified\":true,\"last_success_manifest_sha256\":\"8c769c542e0b93ef7793f2a2b05de79364cae077bbc254f7a0c259cfebcf2076\",\"last_success_payload_sha256\":\"0ea03a3c4ea5c5ab62b2d021e668334607903ea00d7bab4f9b57d9d7a41733a3\",\"last_success_replicas\":[{\"account_id\":\"e7c8100c3ee2308a64aa763264fc0f738f30f99f19a7306fc9c2554fdd308199\",\"crypt_remote\":\"pve03-mail-04-crypt\"},{\"account_id\":\"690cb55f912672f2854c3424fe9d536beb6096dadb767e894b3f52bb8fd911bf\",\"crypt_remote\":\"pve03-mail-01-crypt\"}],\"logical_id\":\"guest-pve01-lxc-112\",\"reason\":\"CT112_PIPELINE_FAILED\",\"result\":\"FAIL\",\"retry_after_epoch\":1791397079,\"schema\":1,\"updated_at_utc\":\"2026-10-07T12:17:59Z\"}\nREC|BACKUP_SOURCE|IDX=145|BASENAME=targets.json.before|PATH_SHA256=ecf744dfee2a45565c9197154272e9a85ca4e90515d5876cdd8b942746cd3313|SHA256=decea6b876c8ede15c91cad69c8e15e46021e5e96d25d415139bf2c524e23f7b|SIZE=7414|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|145|11: \"logical_id\": \"ct110\",\nSRC|BACKUP|145|14: \"vmid\": 110\nSRC|BACKUP|145|21: \"logical_id\": \"ct111\",\nSRC|BACKUP|145|24: \"vmid\": 111\nSRC|BACKUP|145|31: \"logical_id\": \"ct112\",\nSRC|BACKUP|145|34: \"vmid\": 112\nSRC|BACKUP|145|41: \"logical_id\": \"ct113\",\nSRC|BACKUP|145|44: \"vmid\": 113\nSRC|BACKUP|145|51: \"logical_id\": \"vm130\",\nSRC|BACKUP|145|54: \"vmid\": 130\nSRC|BACKUP|145|61: \"logical_id\": \"vm150\",\nSRC|BACKUP|145|64: \"vmid\": 150\nSRC|BACKUP|145|71: \"logical_id\": \"vm160\",\nSRC|BACKUP|145|74: \"vmid\": 160\nSRC|BACKUP|145|81: \"logical_id\": \"vm170\",\nSRC|BACKUP|145|84: \"vmid\": 170\nSRC|BACKUP|145|91: \"logical_id\": \"vm171\",\nSRC|BACKUP|145|94: \"vmid\": 171\nSRC|BACKUP|145|101: \"logical_id\": \"vm190\",\nSRC|BACKUP|145|104: \"vmid\": 190\nSRC|BACKUP|145|111: \"logical_id\": \"vm210\",\nSRC|BACKUP|145|114: \"vmid\": 210\nSRC|BACKUP|145|121: \"logical_id\": \"vm211\",\nSRC|BACKUP|145|124: \"vmid\": 211\nSRC|BACKUP|145|131: \"logical_id\": \"vm9130\",\nSRC|BACKUP|145|134: \"vmid\": 9130\nSRC|BACKUP|145|140: \"logical_id\": \"node-pve01\",\nSRC|BACKUP|145|149: \"logical_id\": \"node-pve02\",\nSRC|BACKUP|145|158: \"logical_id\": \"node-pve03\",\nSRC|BACKUP|145|169: \"logical_id\": \"md-relay\",\nSRC|BACKUP|145|181: \"logical_id\": \"spb-ingress\",\nSRC|BACKUP|145|193: \"logical_id\": \"us-netbird\",\nSRC|BACKUP|145|203: \"logical_id\": \"router-netcraze\",\nSRC|BACKUP|145|214: \"logical_id\": \"xf-codevipe\",\nSRC|BACKUP|145|219: \"vmid\": 160\nSRC|BACKUP|145|228: \"logical_id\": \"xf-dsmods\",\nSRC|BACKUP|145|233: \"vmid\": 160\nSRC|BACKUP|145|242: \"logical_id\": \"xf-kingofwolk\",\nSRC|BACKUP|145|247: \"vmid\": 160\nSRC|BACKUP|145|256: \"logical_id\": \"xf-newfi\",\nREC|BACKUP_SOURCE|IDX=146|BASENAME=command-ledger.tsv|PATH_SHA256=22d64ba213483e0fdf93e34bedf0d1a540db478171d7c3cd9191e2d7e92375dd|SHA256=b42da6c29d678aa898b75a77d353ab5fe42e05c7220d85f6442a5e93c56bb45c|SIZE=788304|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|146|18:2026-07-21T07:55:39Z\tVM160-LOCAL-ROOTCAUSE-001\tabe456bec06dfed260177703a3c57c723a6d506d59a2103104a1bbae3a1523c4\t0\tOK\tvm160-backup\nSRC|BACKUP|146|58:2026-07-21T11:15:46Z\tBACKUP-AUDIT-CONTROLPLANE-054\t296f046bea8249590e7ffe412dfae412d02680898fd57d5818314ec6e662fab0\t0\tOK\tbackup-audit\nSRC|BACKUP|146|59:2026-07-21T11:21:15Z\tBACKUP-AUDIT-054-EXTRACT-055\td8ac98968d21ee94379f51058b3a5775f1ee320bab8c0f2bb2cb92b7ca4e6bcb\t0\tOK\tbackup-audit\nSRC|BACKUP|146|62:2026-07-21T11:33:10Z\tBACKUP-COVERAGE-MATRIX-058\tfe94aa788ebacd90258b858b36ebc3281bf8fac23b6891c779266673f4097044\t0\tOK\tbackup-audit\nSRC|BACKUP|146|63:2026-07-21T11:35:23Z\tBACKUP-DUAL-CLOUD-PREFLIGHT-059\tc6f4134d15a9f641ddaf67535760d0abede973dd08222a37af05612a6f580479\t1\tFAIL\tbackup-audit\nSRC|BACKUP|146|64:2026-07-21T11:38:23Z\tBACKUP-DUAL-CLOUD-RECONCILE-060\tbe39adf6237697b760f095d503f1fdb9e25eed004c8108b2b1d338318d4794a6\t0\tOK\tbackup-audit\nSRC|BACKUP|146|65:2026-07-21T11:41:34Z\tBACKUP-PIPELINE-LOGIC-061\t8cd01154fdfa3d93f159413d18952f742f79d917e9d1ae084a44f20c5a7e900c\t0\tOK\tbackup-audit\nSRC|BACKUP|146|66:2026-07-21T11:46:09Z\tBACKUP-PIPELINE-DEFINITION-AUDIT-061\t08de7a8820803f855426b27b3ecfd2e646209715ff5ac4aba48b73fa45623b28\t0\tOK\tbackup-audit\nSRC|BACKUP|146|67:2026-07-21T11:49:26Z\tBACKUP-CLUSTER-13CLOUD-TOPOLOGY-062\teca35846e7097b9c238bf8c082e02c81f0b2893473e27ddb0a5b0854d5d3703d\t0\tOK\tbackup-audit\nSRC|BACKUP|146|68:2026-07-21T11:51:50Z\tBACKUP-CLOUD-PIPELINE-MAP-063\t6354dd51dd01e331f845ee918c861a5da7d433a7a7851f62a8a1b779b72e6921\t0\tOK\tbackup-audit\nSRC|BACKUP|146|69:2026-07-21T12:18:55Z\tBACKUP-DELETE-GUARD-ANALYSIS-069\t24ced45493a6d7ee8468cc3594cdc644c67746ee73a6598380ffba9eb7f89d8c\t0\tOK\tbackup-audit\nSRC|BACKUP|146|70:2026-07-21T12:21:13Z\tBACKUP-REMEDIATION-TARGETS-070\tdccff9fba1741a41e62299cfbb57f3bb2f082b09a654d7649453becbeb1d9924\t0\tOK\tbackup-audit\nSRC|BACKUP|146|71:2026-07-21T12:25:10Z\tBACKUP-UNSAFE-SOURCE-CAPTURE-072\tf79a127b4f27e1cdf886c681d5c7257244ec31a6c903e96cd53fc75d7a1ed8d4\t0\tOK\tbackup-audit\nSRC|BACKUP|146|72:2026-07-21T12:28:26Z\tBACKUP-VM-DUMP-PIPELINE-073\tcd8291d0f14a37241e6062408603455d1ebd483091bebfa46c2b7a768f21308b\t1\tFAIL\tbackup-audit\nSRC|BACKUP|146|73:2026-07-21T12:29:40Z\tBACKUP-VM-DUMP-FINDINGS-074\tefd1c9c19be267bfead346999b4a497056f5214e7796bfecdeda451f8aa9ba10\t0\tOK\tbackup-audit\nSRC|BACKUP|146|74:2026-07-21T12:42:53Z\tBACKUP-VM-DUMP-CHANGESET-PREFLIGHT-075\ta9a8a6046441de0c40a8b13bdfe96698c53a5156b4346b7ce28dc1f2362e8936\t143\tFAIL\tbackup-audit\nSRC|BACKUP|146|75:2026-07-21T12:44:41Z\tBACKUP-VM-DUMP-DECISION-076\t79b8d619ea551eca9abbf92c24d3e8954f464302759ebb8adf24b308c705df6a\t0\tOK\tbackup-audit\nSRC|BACKUP|146|76:2026-07-21T12:47:44Z\tBACKUP-VM-DUMP-SOURCE-077\tb835d1210c5520c9d8d56eac7575cc679e5d0a22ce04f879cf8af953e2bb9b9e\t0\tOK\tbackup-audit\nSRC|BACKUP|146|77:2026-07-21T12:55:04Z\tBACKUP-VM-DUMP-CONSISTENCY-078\t876c832ac6a555af28ff29ccdceb28c79e7244a361f277e9278a8f75b65caad5\t0\tOK\tbackup-audit\nSRC|BACKUP|146|78:2026-07-21T12:56:52Z\tBACKUP-DRAIN-LOCAL-ARCHIVES-079\t531e1da7ce1681eed084b22ced7da87eb1ee8995f662dc7559f4f9dde3c0ac32\t75\tFAIL\tbackup-remediation\nSRC|BACKUP|146|79:2026-07-21T13:04:48Z\tBACKUP-FINAL-PROOF-082\t9e675a3cb621d0d1fcd8918b02278ab08c1a974f544ebef9a5639bf6578ee601\t127\tFAIL\tbackup-audit\nSRC|BACKUP|146|83:2026-07-21T13:14:27Z\tCLUSTER-BACKUP-POSTCLEAN-PROOF-086\t601958c48614dbc25cc4592b111de4dec3306e53b756b275068b81a41d42b2da\t127\tFAIL\tbackup-cleanup\nSRC|BACKUP|146|84:2026-07-21T13:15:21Z\tBACKUP-POLICY-CLOSEOUT-087\td79c1c881ebca24db09c5b4ed4b71b09a5ad338c30789c99b0644c8935072c52\t1\tFAIL\tbackup-cleanup\nSRC|BACKUP|146|85:2026-07-21T13:17:20Z\tBACKUP-CLEANUP-FINAL-CLOSEOUT-088\t5ba2893489b6f5831fc4599d3efa874d89c3fd41da7151f9c32945d11d1a23d6\t1\tFAIL\tbackup-cleanup\nSRC|BACKUP|146|193:2026-07-22T14:53:55Z\tBACKUP-OFFHOST-CURRENT-STATE-212\t5b9f985ab6daceaad18e56d2da3dde0d2dba7eefdfe7f75e83eee6bef0a0ad8a\t0\tOK\tbackup-audit\nSRC|BACKUP|146|195:2026-07-22T15:16:25Z\tBACKUP-FAILED-UNITS-ROOTCAUSE-213\tfb59f580fefab96bf42d4c9f720847f498158079695bebebca527795287c0435\t2\tFAIL\tbackup-audit\nSRC|BACKUP|146|196:2026-07-22T15:19:41Z\tBACKUP-FAILED-UNITS-ROOTCAUSE-214\t19d600f59a44903ae388de5924789d15c9dda0ede9ed5f3966600f8f808c43c1\t0\tOK\tbackup-audit\nSRC|BACKUP|146|416:2026-07-24T11:36:07Z\tHOMELAB-BACKUP-COVERAGE-INVENTORY-452\t7accfbe32793529ee8b0648740b627319b6ddcb7dfafef3750b1e3f884efaa1e\t0\tOK\tcluster-backup-audit\nSRC|BACKUP|146|417:2026-07-24T11:47:58Z\tHOMELAB-BACKUP-COVERAGE-EVIDENCE-453\tacc0e44ce9e7ad684760cc93de648adf320a5472304e538987ba26f7d2165df4\t1\tFAIL\tcluster-backup-audit\nSRC|BACKUP|146|418:2026-07-24T13:23:09Z\tHOMELAB-BACKUP-PURGE-PREFLIGHT-454\t0fbf19acd2291c7c68936a5068c76bc233f57af4da66f9098de3a565849ae29d\t0\tOK\tcluster-backup-reset\nSRC|BACKUP|146|419:2026-07-24T13:51:04Z\tHOMELAB-BACKUP-WRITERS-FREEZE-455\t249fee024853e0e57efc45f5daf64464f3288867c5301aa94e7745efbe0564e3\t1\tFAIL\tcluster-backup-reset\nSRC|BACKUP|146|420:2026-07-24T14:00:33Z\tHOMELAB-BACKUP-HOST-WRITERS-FREEZE-456\te4f078cea61f6b7336e67223b0c9e91a0b6bfeece68cdc69e659e2c488da13c4\t0\tOK\tcluster-backup-reset\nSRC|BACKUP|146|421:2026-07-24T14:13:22Z\tHOMELAB-BACKUP-GUEST-WRITERS-AUDIT-457\ta938a7073b24eee71bba3ccc2abf8abc491a4d7012998e49608b73c98015ba67\t71\tFAIL\tcluster-backup-reset\nSRC|BACKUP|146|422:2026-07-24T14:17:52Z\tHOMELAB-BACKUP-PVE02-FREEZE-CORRECTION-458\td4fb4a4c10dbf820f364b75704379477e963a9973b89b27ad80b0ec9acc5af89\t1\tFAIL\tcluster-backup-reset\nSRC|BACKUP|146|423:2026-07-24T15:03:37Z\tHOMELAB-BACKUP-CURRENT-STATE-SEAL-459\t035aca8551e77c67944c13906d92f66396f48d9ed2512f5d1e22631d5b372a3f\t1\tFAIL\tcluster-backup-reset\nSRC|BACKUP|146|424:2026-07-24T15:15:09Z\tHOMELAB-BACKUP-REENABLE-CLOUD-ROOTCAUSE-460\ta0e254341728592f4baf512d4d20205ea3ca3b09a6de757bd3432c88ffb3ee4c\t0\tOK\tcluster-backup-reset\nSRC|BACKUP|146|425:2026-07-24T15:26:56Z\tHOMELAB-BACKUP-AUTOHEAL-NEUTRALIZE-461\t6b85d9e57d976c4141fc382e98ecc4053ff017d8aa328594b8fe80af051d0710\t74\tFAIL\tcluster-backup-reset\nSRC|BACKUP|146|426:2026-07-24T17:14:32Z\tHOMELAB-BACKUP-STEP0-FINAL-SEAL-462\t13024aa488e3ba38682f37e3268d41ba559bbe7a43c272ce52e7d309aa7a0935\t1\tFAIL\tcluster-backup-reset\nSRC|BACKUP|146|427:2026-07-24T17:20:14Z\tHOMELAB-BACKUP-STEP0-CORRECTED-SEAL-463\tbe6a0ca69483a5dceaa26e72c92fd631ffa611b7c60261c20f38bf79a76226a6\t0\tOK\tcluster-backup-reset\nSRC|BACKUP|146|428:2026-07-24T17:28:16Z\tHOMELAB-BACKUP-PLAN-GITEA-PUBLISH-464\t9398a95cb64b6cdd304e3c6741225395fc598c9632043769f547fb8d13ff6120\t128\tFAIL\tcluster-backup-reset\nREC|BACKUP_SOURCE|IDX=147|BASENAME=SUPPORT-260927-HOMELAB-BACKUP-CT110-STATE-AUDIT-RECONCILE-1232R1-20260927T195108Z.log|PATH_SHA256=70a65ce59ede8652bbbda74b6b7990079594acf541bf419a82270ed1869593fc|SHA256=610fd3fad77f1c61c0a7b88bbc6a35a398461ed28081a2a3e990b23173163922|SIZE=8342|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|147|4:COMPONENT=homelab-backup-ct110-state-audit-reconcile\nSRC|BACKUP|147|26:STATE_KEYS=consecutive_failures,failure_backoff_seconds,generation,green_verified,last_attempt_epoch,last_success_epoch,logical_id,manifest_sha256,payload_sha256,replicas,result,retry_after_epoch,schema,updated_at_utc\nSRC|BACKUP|147|65:AUDIT_SCHEMA=homelab-backup-audit-v3\nSRC|BACKUP|147|77:TARGET|logical_id=app-filebrowser|kind=APP|state=FRESH|decision=BACKUP_DUE|legacy_age_seconds=48057|generation=app-filebrowser-pve01-20260927T063003Z\nSRC|BACKUP|147|78:TARGET|logical_id=app-hbarhub|kind=APP|state=FRESH|decision=BACKUP_DUE|legacy_age_seconds=47890|generation=app-hbarhub-pve01-20260927T063154Z\nSRC|BACKUP|147|79:TARGET|logical_id=app-immich|kind=APP|state=FRESH|decision=BACKUP_DUE|legacy_age_seconds=47991|generation=app-immich-pve01-20260927T063041Z\nSRC|BACKUP|147|80:TARGET|logical_id=app-skladchik-reports-monitor|kind=APP|state=FRESH|decision=BACKUP_DUE|legacy_age_seconds=48038|generation=app-skladchik-reports-monitor-pve01-20260927T063026Z\nSRC|BACKUP|147|81:TARGET|logical_id=control-bootstrap-v2|kind=CONTROL|state=STALE|age_seconds=234007|generation=control-bootstrap-v2-pve01-20260916T120057Z\nSRC|BACKUP|147|82:TARGET|logical_id=vm110|kind=VM|state=FRESH|source=V2|v2_age_seconds=366|legacy_age_seconds=2038301|replica_count=2|state_id=ct110|generation=v2-ct110-20260927T194116Z-d16fe26dbd17\nSRC|BACKUP|147|83:TARGET|logical_id=vm111|kind=VM|state=STALE|source=NONE|v2_age_seconds=283415|replica_count=2|state_id=ct111\nSRC|BACKUP|147|84:TARGET|logical_id=vm112|kind=VM|state=STALE|source=NONE|v2_age_seconds=266907|legacy_age_seconds=2076796|replica_count=2|state_id=ct112|generation=vm112-pve01-20260903T185707Z\nSRC|BACKUP|147|85:TARGET|logical_id=vm113|kind=VM|state=STALE|source=NONE|v2_age_seconds=264888|replica_count=2|state_id=ct113\nSRC|BACKUP|147|86:TARGET|logical_id=vm130|kind=VM|state=STALE|source=NONE|v2_age_seconds=259498|replica_count=2|state_id=vm130\nSRC|BACKUP|147|87:TARGET|logical_id=vm150|kind=VM|state=STALE|source=NONE|v2_age_seconds=262950|legacy_age_seconds=2038417|replica_count=2|state_id=vm150|generation=vm150-pve01-20260904T053517Z\nSRC|BACKUP|147|88:TARGET|logical_id=vm160|kind=VM|state=STALE|source=NONE|v2_age_seconds=258251|replica_count=2|state_id=vm160\nSRC|BACKUP|147|89:TARGET|logical_id=vm170|kind=VM|state=STALE|source=NONE|v2_age_seconds=235042|legacy_age_seconds=983038|replica_count=2|state_id=vm170|generation=vm170-pve01-20260916T103019Z\nSRC|BACKUP|147|90:TARGET|logical_id=vm171|kind=VM|state=STALE|source=NONE|v2_age_seconds=239472|legacy_age_seconds=1012570|replica_count=2|state_id=vm171|generation=vm171-pve01-20260916T023018Z\nSRC|BACKUP|147|91:TARGET|logical_id=vm190|kind=VM|state=STALE|source=NONE|v2_age_seconds=235640|replica_count=2|state_id=vm190\nSRC|BACKUP|147|92:TARGET|logical_id=vm9130|kind=VM|state=STALE|source=NONE|v2_age_seconds=226897|replica_count=2|state_id=vm9130\nSRC|BACKUP|147|93:ISSUE|severity=HIGH|code=RPO_BREACH|logical_id=control-bootstrap-v2|root_cause=CONTROL_STATE_NOT_FRESH\nSRC|BACKUP|147|94:ISSUE|severity=HIGH|code=RPO_BREACH|logical_id=vm111|root_cause=NO_FRESH_V2_OR_SEALED_QUORUM\nSRC|BACKUP|147|95:ISSUE|severity=HIGH|code=RPO_BREACH|logical_id=vm112|root_cause=NO_FRESH_V2_OR_SEALED_QUORUM\nSRC|BACKUP|147|96:ISSUE|severity=HIGH|code=RPO_BREACH|logical_id=vm113|root_cause=NO_FRESH_V2_OR_SEALED_QUORUM\nSRC|BACKUP|147|97:ISSUE|severity=HIGH|code=RPO_BREACH|logical_id=vm130|root_cause=NO_FRESH_V2_OR_SEALED_QUORUM\nSRC|BACKUP|147|98:ISSUE|severity=HIGH|code=RPO_BREACH|logical_id=vm150|root_cause=NO_FRESH_V2_OR_SEALED_QUORUM\nSRC|BACKUP|147|99:ISSUE|severity=HIGH|code=RPO_BREACH|logical_id=vm160|root_cause=NO_FRESH_V2_OR_SEALED_QUORUM\nSRC|BACKUP|147|100:ISSUE|severity=HIGH|code=RPO_BREACH|logical_id=vm170|root_cause=NO_FRESH_V2_OR_SEALED_QUORUM\nSRC|BACKUP|147|101:ISSUE|severity=HIGH|code=RPO_BREACH|logical_id=vm171|root_cause=NO_FRESH_V2_OR_SEALED_QUORUM\nSRC|BACKUP|147|102:ISSUE|severity=HIGH|code=RPO_BREACH|logical_id=vm190|root_cause=NO_FRESH_V2_OR_SEALED_QUORUM\nSRC|BACKUP|147|103:ISSUE|severity=HIGH|code=RPO_BREACH|logical_id=vm9130|root_cause=NO_FRESH_V2_OR_SEALED_QUORUM\nSRC|BACKUP|147|118:UNIT=homelab-backup-v2.service ACTIVE=failed ENABLED=static RESULT=exit-code MAINPID=0\nSRC|BACKUP|147|119:UNIT=homelab-backup-v2.timer ACTIVE=active ENABLED=enabled RESULT=success MAINPID=\nSRC|BACKUP|147|120:UNIT=homelab-backup-audit.service ACTIVE=failed ENABLED=static RESULT=exit-code MAINPID=0\nSRC|BACKUP|147|121:UNIT=homelab-backup-audit.timer ACTIVE=active ENABLED=enabled RESULT=success MAINPID=\nREC|BACKUP_SOURCE|IDX=148|BASENAME=SUPPORT-260927-HOMELAB-BACKUP-V2-CURRENT-FAILURE-RCA-1221R1-20260927T182259Z.log|PATH_SHA256=49fe74db053fda2ca66c37a151e0fcd33afec8ed5d9257c878a7c8f85e08405f|SHA256=de7467ab7d2c1584968349e75f34c054b7b406741bd4ab8a3a6e0e559ecf7d2a|SIZE=187332|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|148|4:COMPONENT=homelab-backup-v2-current-failure-rca\nSRC|BACKUP|148|31:● homelab-backup-audit.service loaded failed failed Homelab unified backup and DR audit\nSRC|BACKUP|148|32:● homelab-backup-v2.service loaded failed failed Homelab Backup V2 manifest-driven scheduler\nSRC|BACKUP|148|39:ExecStart={ path=<PATH> ; argv[]=<PATH> scheduled ; ignore_errors=no ; start_time=[Sun 2026-09-27 21:08:52 MSK] ; stop_time=[Sun 2026-09-27 21:08:59 MSK] ; pid=19346 ; code=exited ; status=1 }\nSRC|BACKUP|148|40:Id=homelab-backup-v2.service\nSRC|BACKUP|148|45:FragmentPath=<PATH>\nSRC|BACKUP|148|50:BACKUP_V2_FRAGMENT_PATH=<PATH>\nSRC|BACKUP|148|54:# <PATH>\nSRC|BACKUP|148|65:ExecStart=<PATH> scheduled\nSRC|BACKUP|148|70:BACKUP_V2_EXECSTART_RAW={ path=<PATH> ; argv[]=<PATH> scheduled ; ignore_errors=no ; start_time=[Sun 2026-09-27 21:08:52 MSK] ; stop_time=[Sun 2026-09-27 21:08:59 MSK] ; pid=19346 ; code=exited ; status=1 }\nSRC|BACKUP|148|71:BACKUP_V2_EXECSTART_PATH=<PATH>\nSRC|BACKUP|148|78:ACCEPTED=pathlib.Path('<PATH>')\nSRC|BACKUP|148|106:Id=homelab-backup-v2.timer\nSRC|BACKUP|148|110:FragmentPath=<PATH>\nSRC|BACKUP|148|113:BACKUP_V2_TIMER_FRAGMENT_PATH=<PATH>\nSRC|BACKUP|148|116:# <PATH>\nSRC|BACKUP|148|124:Unit=homelab-backup-v2.service\nSRC|BACKUP|148|134:ExecStart={ path=<PATH> ; argv[]=<PATH> scheduled ; ignore_errors=no ; start_time=[Sun 2026-09-27 21:05:58 MSK] ; stop_time=[Sun 2026-09-27 21:06:02 MSK] ; pid=16838 ; code=exited ; status=1 }\nSRC|BACKUP|148|135:Id=homelab-backup-audit.service\nSRC|BACKUP|148|136:Description=Homelab unified backup and DR audit\nSRC|BACKUP|148|140:FragmentPath=<PATH>\nSRC|BACKUP|148|145:BACKUP_AUDIT_FRAGMENT_PATH=<PATH>\nSRC|BACKUP|148|149:# <PATH>\nSRC|BACKUP|148|151:Description=Homelab unified backup and DR audit\nSRC|BACKUP|148|157:ExecStart=<PATH> scheduled\nSRC|BACKUP|148|164:BACKUP_AUDIT_EXECSTART_RAW={ path=<PATH> ; argv[]=<PATH> scheduled ; ignore_errors=no ; start_time=[Sun 2026-09-27 21:05:58 MSK] ; stop_time=[Sun 2026-09-27 21:06:02 MSK] ; pid=16838 ; code=exited ; status=1 }\nSRC|BACKUP|148|165:BACKUP_AUDIT_EXECSTART_PATH=<PATH>\nSRC|BACKUP|148|176: print(\"AUDIT_SCHEMA=homelab-backup-audit-v3\")\nSRC|BACKUP|148|179:REG=pathlib.Path(\"<PATH>\")\nSRC|BACKUP|148|180:STATE=pathlib.Path(\"<PATH>\")\nSRC|BACKUP|148|181:QROOT=pathlib.Path(\"<PATH>\")\nSRC|BACKUP|148|182:VMREST=pathlib.Path(\"<PATH>\")\nSRC|BACKUP|148|183:APPREST=pathlib.Path(\"<PATH>\")\nSRC|BACKUP|148|184:REGH=\"<PATH>\"\nSRC|BACKUP|148|186:GFSH=\"<PATH>\"\nSRC|BACKUP|148|187:GFSP=\"<PATH>\"\nSRC|BACKUP|148|188:RET=\"<PATH>\"\nSRC|BACKUP|148|190:BRANCH=\"cr-2026-1005-backup-v2-health-alerting-remediation\"\nSRC|BACKUP|148|192:CLOUDB_HEALTH=pathlib.Path(\"<PATH>\")\nSRC|BACKUP|148|193:HEALTHS=[pathlib.Path(\"<PATH>\"),pathlib.Path(\"<PATH>\")]\nREC|BACKUP_SOURCE|IDX=149|BASENAME=SUPPORT-260915-INFRA-DR-BACKUPV2-CT112-REAL-PRODUCER-ARCHIVE-1-WORKDIR-FIX-426R1-20260915T115220Z.log|PATH_SHA256=ca5d2964e20794677d6f252d3d81079389cb57c937d2e169a993b20dcfe1d7c5|SHA256=b61460e9ba5d0d9e7ad6dcce9eb50411a619937b14e979607930094f09907e92|SIZE=4208|HAS_ALIAS_112=true|HAS_CT112=false|HAS_LAST_TARGET=true\nSRC|BACKUP|149|14:LIVE_INPUT_SCHEMAS={\"config_keys\":[\"arch\",\"cores\",\"digest\",\"features\",\"hostname\",\"memory\",\"nameserver\",\"net0\",\"onboot\",\"ostype\",\"rootfs\",\"searchdomain\",\"startup\",\"swap\",\"unprivileged\"],\"row_keys\":[\"cpu\",\"disk\",\"diskread\",\"diskwrite\",\"id\",\"maxcpu\",\"maxdisk\",\"maxmem\",\"mem\",\"memhost\",\"name\",\"netin\",\"netout\",\"node\",\"status\",\"template\",\"type\",\"uptime\",\"vmid\"],\"storage_row_count\":2}\nSRC|BACKUP|149|20:FRESH_CT112_JOB={\"archive_cap_bytes\":9516036916,\"blockers\":[],\"config_sha256\":\"6973478281aeee0a6c19cd0ab96f5e9ebd88cf5a7e767a49d808e25806758351\",\"configured_archive_bound_bytes\":9516036916,\"configured_disk_bytes\":8589934592,\"coverage_eligible\":true,\"global_defaults_sha256\":\"cf34c8e3812547954bb1d08b50212b6e148ee9cf2b629e895a843ed49d623b38\",\"local_reserve_bytes\":4294967296,\"node\":\"pve01\",\"status\":\"running\",\"type\":\"lxc\",\"vmid\":112}\nSRC|BACKUP|149|42:LOGICAL_ID=guest-pve01-lxc-112\nSRC|BACKUP|149|52:PRODUCER_RESULT_KEYS=[\"compression_test_ok\",\"config_sha256\",\"identity\",\"local_payload_retained\",\"node\",\"path\",\"producer_rc\",\"restored\",\"sha256\",\"size\",\"state\",\"type\",\"vmid\"]\nSRC|BACKUP|149|74:WORK_DIRECTORY=<PATH>\nSRC|BACKUP|149|75:LOCAL_PAYLOAD_PATH=<PATH>\nREC|BACKUP_SOURCE|IDX=150|BASENAME=SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-FIX-REFRESH-1108R1-20260921T214841Z.log|PATH_SHA256=895c3c2e770079d2e74ae4cbe41dbe77bfb596c59dd59b2e4d7ecc7d652cbc57|SHA256=c47bdfa91624238252fdc751e1a53a4637111bfc4d66794ca15b65d122a3b87d|SIZE=10695|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|150|4:COMPONENT=homelab-backup-due-policy-fix-refresh\nSRC|BACKUP|150|13:ACTIVE_VM_CANONICAL={\"110\":\"ct110\",\"111\":\"ct111\",\"112\":\"ct112\",\"113\":\"ct113\",\"130\":\"vm130\",\"150\":\"vm150\",\"160\":\"vm160\",\"170\":\"vm170\",\"171\":\"vm171\",\"190\":\"vm190\",\"9130\":\"vm9130\"}\nSRC|BACKUP|150|14:POLICY_PATCH=[{\"after\":72000,\"before\":86400,\"logical_id\":\"ct110\"},{\"after\":72000,\"before\":86400,\"logical_id\":\"ct111\"},{\"after\":72000,\"before\":86400,\"logical_id\":\"ct112\"},{\"after\":72000,\"before\":86400,\"logical_id\":\"ct113\"},{\"after\":72000,\"before\":86400,\"logical_id\":\"vm130\"},{\"after\":72000,\"before\":86400,\"logical_id\":\"vm150\"},{\"after\":72000,\"before\":86400,\"logical_id\":\"vm160\"},{\"after\":72000,\"before\":86400,\"logical_id\":\"vm170\"},{\"after\":72000,\"before\":86400,\"logical_id\":\"vm171\"},{\"after\":72000,\"before\":86400,\"logical_id\":\"vm190\"},{\"after\":72000,\"before\":86400,\"logical_id\":\"vm9130\"}]\nSRC|BACKUP|150|16:EFFECTIVE_ACTIVE_VM_POLICY=[{\"due_seconds\":72000,\"logical_id\":\"ct110\",\"vmid\":110},{\"due_seconds\":72000,\"logical_id\":\"ct111\",\"vmid\":111},{\"due_seconds\":72000,\"logical_id\":\"ct112\",\"vmid\":112},{\"due_seconds\":72000,\"logical_id\":\"ct113\",\"vmid\":113},{\"due_seconds\":72000,\"logical_id\":\"vm130\",\"vmid\":130},{\"due_seconds\":72000,\"logical_id\":\"vm150\",\"vmid\":150},{\"due_seconds\":72000,\"logical_id\":\"vm160\",\"vmid\":160},{\"due_seconds\":72000,\"logical_id\":\"vm170\",\"vmid\":170},{\"due_seconds\":72000,\"logical_id\":\"vm171\",\"vmid\":171},{\"due_seconds\":72000,\"logical_id\":\"vm190\",\"vmid\":190},{\"due_seconds\":72000,\"logical_id\":\"vm9130\",\"vmid\":9130}]\nSRC|BACKUP|150|18:RPO_BEFORE_REFRESH=[{\"age_seconds\":86256,\"generation\":\"v2-ct112-20260920T214958Z-30e3291e1543\",\"logical_id\":\"ct112\",\"replica_count\":2,\"result\":\"SUCCESS\",\"state\":\"STALE\",\"vmid\":112},{\"age_seconds\":84091,\"generation\":\"v2-ct113-20260920T222532Z-4f4a608def82\",\"logical_id\":\"ct113\",\"replica_count\":2,\"result\":\"SUCCESS\",\"state\":\"STALE\",\"vmid\":113},{\"age_seconds\":78699,\"generation\":\"v2-vm130-20260920T233759Z-c9518c8be2c3\",\"logical_id\":\"vm130\",\"replica_count\":2,\"result\":\"SUCCESS\",\"state\":\"STALE\",\"vmid\":130},{\"age_seconds\":81985,\"generation\":\"v2-vm150-20260920T230035Z-e0880e47ea55\",\"logical_id\":\"vm150\",\"replica_count\":2,\"result\":\"SUCCESS\",\"state\":\"STALE\",\"vmid\":150},{\"age_seconds\":77232,\"generation\":\"v2-vm160-20260921T001432Z-31df1acfee7a\",\"logical_id\":\"vm160\",\"replica_count\":2,\"result\":\"SUCCESS\",\"state\":\"STALE\",\"vmid\":160},{\"age_seconds\":75455,\"generation\":\"v2-vm171-20260921T004759Z-537db1552014\",\"logical_id\":\"vm171\",\"replica_count\":2,\"result\":\"SUCCESS\",\"state\":\"STALE\",\"vmid\":171},{\"age_seconds\":73193,\"generation\":\"v2-vm190-20260921T012544Z-298b64987988\",\"logical_id\":\"vm190\",\"replica_count\":2,\"result\":\"SUCCESS\",\"state\":\"STALE\",\"vmid\":190}]\nSRC|BACKUP|150|20:RPO_SCHEDULER_ALIGNMENT_PROOF=[{\"age_seconds\":86256,\"due_seconds\":72000,\"logical_id\":\"ct112\",\"scheduler_due\":true},{\"age_seconds\":84091,\"due_seconds\":72000,\"logical_id\":\"ct113\",\"scheduler_due\":true},{\"age_seconds\":78699,\"due_seconds\":72000,\"logical_id\":\"vm130\",\"scheduler_due\":true},{\"age_seconds\":81985,\"due_seconds\":72000,\"logical_id\":\"vm150\",\"scheduler_due\":true},{\"age_seconds\":77232,\"due_seconds\":72000,\"logical_id\":\"vm160\",\"scheduler_due\":true},{\"age_seconds\":75455,\"due_seconds\":72000,\"logical_id\":\"vm171\",\"scheduler_due\":true},{\"age_seconds\":73193,\"due_seconds\":72000,\"logical_id\":\"vm190\",\"scheduler_due\":true}]\nSRC|BACKUP|150|21:TARGET_REFRESH_BEGIN={\"age_seconds\":86256,\"iteration\":1,\"logical_id\":\"ct112\",\"vmid\":112}\nSRC|BACKUP|150|23:TARGET_REFRESH_END={\"elapsed_seconds\":81,\"iteration\":1,\"result\":{\"allocator_healthy\":13,\"generation\":\"v2-ct112-20260921T214852Z-cd43a8d672fe\",\"logical_id\":\"ct112\",\"payload_bytes\":223951898,\"replicas\":2,\"result\":\"SUCCESS\"}}\nSRC|BACKUP|150|24:TARGET_REFRESH_BEGIN={\"age_seconds\":84172,\"iteration\":2,\"logical_id\":\"ct113\",\"vmid\":113}\nSRC|BACKUP|150|26:TARGET_REFRESH_END={\"elapsed_seconds\":83,\"iteration\":2,\"result\":{\"allocator_healthy\":13,\"generation\":\"v2-ct113-20260921T215013Z-af1017371806\",\"logical_id\":\"ct113\",\"payload_bytes\":221786595,\"replicas\":2,\"result\":\"SUCCESS\"}}\nSRC|BACKUP|150|27:TARGET_REFRESH_BEGIN={\"age_seconds\":82149,\"iteration\":3,\"logical_id\":\"vm150\",\"vmid\":150}\nSRC|BACKUP|150|28:QEMU_EXECUTION_DIAG={\"archive_bytes\":947103742,\"archive_selected\":true,\"node\":\"pve01\",\"producer_rc\":0,\"regular_file_count\":2,\"sidecar_count\":1,\"vmid\":150}\nSRC|BACKUP|150|29:TARGET_REFRESH_END={\"elapsed_seconds\":139,\"iteration\":3,\"result\":{\"allocator_healthy\":13,\"generation\":\"v2-vm150-20260921T215136Z-b85020c7d3e4\",\"logical_id\":\"vm150\",\"payload_bytes\":947103742,\"replicas\":2,\"result\":\"SUCCESS\"}}\nSRC|BACKUP|150|30:TARGET_REFRESH_BEGIN={\"age_seconds\":79002,\"iteration\":4,\"logical_id\":\"vm130\",\"vmid\":130}\nSRC|BACKUP|150|31:QEMU_EXECUTION_DIAG={\"archive_bytes\":10930539326,\"archive_selected\":true,\"node\":\"pve03\",\"producer_rc\":0,\"regular_file_count\":2,\"sidecar_count\":1,\"vmid\":130}\nSRC|BACKUP|150|32:TARGET_REFRESH_END={\"elapsed_seconds\":1572,\"iteration\":4,\"result\":{\"allocator_healthy\":13,\"generation\":\"v2-vm130-20260921T215355Z-2425c616d2e0\",\"logical_id\":\"vm130\",\"payload_bytes\":10930539326,\"replicas\":2,\"result\":\"SUCCESS\"}}\nSRC|BACKUP|150|33:TARGET_REFRESH_BEGIN={\"age_seconds\":79108,\"iteration\":5,\"logical_id\":\"vm160\",\"vmid\":160}\nSRC|BACKUP|150|34:QEMU_EXECUTION_DIAG={\"archive_bytes\":3761155293,\"archive_selected\":true,\"node\":\"pve02\",\"producer_rc\":0,\"regular_file_count\":2,\"sidecar_count\":1,\"vmid\":160}\nSRC|BACKUP|150|35:TARGET_REFRESH_END={\"elapsed_seconds\":568,\"iteration\":5,\"result\":{\"allocator_healthy\":13,\"generation\":\"v2-vm160-20260921T222008Z-7c82c237c154\",\"logical_id\":\"vm160\",\"payload_bytes\":3761155293,\"replicas\":2,\"result\":\"SUCCESS\"}}\nSRC|BACKUP|150|36:TARGET_REFRESH_BEGIN={\"age_seconds\":77900,\"iteration\":6,\"logical_id\":\"vm171\",\"vmid\":171}\nSRC|BACKUP|150|37:QEMU_EXECUTION_DIAG={\"archive_bytes\":2053987934,\"archive_selected\":true,\"node\":\"pve01\",\"producer_rc\":0,\"regular_file_count\":2,\"sidecar_count\":1,\"vmid\":171}\nSRC|BACKUP|150|38:TARGET_REFRESH_END={\"elapsed_seconds\":284,\"iteration\":6,\"result\":{\"allocator_healthy\":13,\"generation\":\"v2-vm171-20260921T222937Z-3e5e94c908e8\",\"logical_id\":\"vm171\",\"payload_bytes\":2053987934,\"replicas\":2,\"result\":\"SUCCESS\"}}\nSRC|BACKUP|150|39:TARGET_REFRESH_BEGIN={\"age_seconds\":75922,\"iteration\":7,\"logical_id\":\"vm190\",\"vmid\":190}\nSRC|BACKUP|150|40:QEMU_EXECUTION_DIAG={\"archive_bytes\":1632550425,\"archive_selected\":true,\"node\":\"pve03\",\"producer_rc\":0,\"regular_file_count\":2,\"sidecar_count\":1,\"vmid\":190}\nSRC|BACKUP|150|41:TARGET_REFRESH_END={\"elapsed_seconds\":235,\"iteration\":7,\"result\":{\"allocator_healthy\":13,\"generation\":\"v2-vm190-20260921T223421Z-1f4f2306e4e0\",\"logical_id\":\"vm190\",\"payload_bytes\":1632550425,\"replicas\":2,\"result\":\"SUCCESS\"}}\nSRC|BACKUP|150|44:ACTIVE_VM_STATE_AFTER=[{\"age_seconds\":7788,\"generation\":\"v2-ct110-20260921T202514Z-1c872adccfab\",\"logical_id\":\"ct110\",\"replica_count\":2,\"result\":\"SUCCESS\",\"state\":\"FRESH\",\"vmid\":110},{\"age_seconds\":7641,\"generation\":\"v2-ct111-20260921T202833Z-208ada4fafce\",\"logical_id\":\"ct111\",\"replica_count\":2,\"result\":\"SUCCESS\",\"state\":\"FRESH\",\"vmid\":111},{\"age_seconds\":2883,\"generation\":\"v2-ct112-20260921T214852Z-cd43a8d672fe\",\"logical_id\":\"ct112\",\"replica_count\":2,\"result\":\"SUCCESS\",\"state\":\"FRESH\",\"vmid\":112},{\"age_seconds\":2800,\"generation\":\"v2-ct113-20260921T215013Z-af1017371806\",\"logical_id\":\"ct113\",\"replica_count\":2,\"result\":\"SUCCESS\",\"state\":\"FRESH\",\"vmid\":113},{\"age_seconds\":1088,\"generation\":\"v2-vm130-20260921T215355Z-2425c616d2e0\",\"logical_id\":\"vm130\",\"replica_count\":2,\"result\":\"SUCCESS\",\"state\":\"FRESH\",\"vmid\":130},{\"age_seconds\":2661,\"generation\":\"v2-vm150-20260921T215136Z-b85020c7d3e4\",\"logical_id\":\"vm150\",\"replica_count\":2,\"result\":\"SUCCESS\",\"state\":\"FRESH\",\"vmid\":150},{\"age_seconds\":519,\"generation\":\"v2-vm160-20260921T222008Z-7c82c237c154\",\"logical_id\":\"vm160\",\"replica_count\":2,\"result\":\"SUCCESS\",\"state\":\"FRESH\",\"vmid\":160},{\"age_seconds\":71416,\"generation\":\"v2-vm170-20260921T023516Z-53ad6a6b10f9\",\"logical_id\":\"vm170\",\"replica_count\":2,\"result\":\"SUCCESS\",\"state\":\"FRESH\",\"vmid\":170},{\"age_seconds\":235,\"generation\":\"v2-vm171-20260921T222937Z-3e5e94c908e8\",\"logical_id\":\"vm171\",\"replica_count\":2,\"result\":\"SUCCESS\",\"state\":\"FRESH\",\"vmid\":171},{\"age_seconds\":0,\"generation\":\"v2-vm190-20260921T223421Z-1f4f2306e4e0\",\"logical_id\":\"vm190\",\"replica_count\":2,\"result\":\"SUCCESS\",\"state\":\"FRESH\",\"vmid\":190},{\"age_seconds\":64819,\"generation\":\"v2-vm9130-20260921T041152Z-ab9908f2946f\",\"logical_id\":\"vm9130\",\"replica_count\":2,\"result\":\"SUCCESS\",\"state\":\"FRESH\",\"vmid\":9130}]\nSRC|BACKUP|150|45:REFRESH_HISTORY=[{\"elapsed_seconds\":81,\"iteration\":1,\"logical_id\":\"ct112\",\"vmid\":112},{\"elapsed_seconds\":83,\"iteration\":2,\"logical_id\":\"ct113\",\"vmid\":113},{\"elapsed_seconds\":139,\"iteration\":3,\"logical_id\":\"vm150\",\"vmid\":150},{\"elapsed_seconds\":1572,\"iteration\":4,\"logical_id\":\"vm130\",\"vmid\":130},{\"elapsed_seconds\":568,\"iteration\":5,\"logical_id\":\"vm160\",\"vmid\":160},{\"elapsed_seconds\":284,\"iteration\":6,\"logical_id\":\"vm171\",\"vmid\":171},{\"elapsed_seconds\":235,\"iteration\":7,\"logical_id\":\"vm190\",\"vmid\":190}]\nREC|BACKUP_SOURCE|IDX=151|BASENAME=NEWFI-260920-NEWFDOM-MESSENGERS214-PATH206-20260920T015901Z.log|PATH_SHA256=bf9c76bf5c5ce4cf104943397affe20aa3851138d572dd09f9af17ddab7dc161|SHA256=aafd33fe0652aa7e8c8d22fa1f7665da19099cefa2f06dca88489fcd4491005d|SIZE=10331|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|151|9:FILE_1_PATH=<PATH>\nSRC|BACKUP|151|17:FILE_1_HIT_2_TEXT=ACCEPTED=pathlib.Path('<PATH>')\nSRC|BACKUP|151|20:FILE_2_PATH=<PATH>\nSRC|BACKUP|151|26:FILE_2_HIT_1_TEXT=Unit=homelab-backup-v2.service\nSRC|BACKUP|151|29:FILE_3_PATH=<PATH>\nSRC|BACKUP|151|41:FILE_3_HIT_4_TEXT=ExecStart=<PATH> scheduled\nSRC|BACKUP|151|42:FILE_4_PATH=<PATH>\nSRC|BACKUP|151|48:FILE_4_HIT_1_TEXT={\"created_by\":\"SUPPORT-260914-INFRA-DR-BACKUPV2-SHADOW-PERSISTENT-PRODUCERS-STAGE-GREEN1-389R1\",\"registry_anchor\":\"bd85b2081fb599bc2d8b7122640f372dde20d881\",\"schema\":1,\"targets\":[{\"due_seconds\":86400,\"enabled\":true,\"green1\":false,\"guest_type\":\"lxc\",\"logical_id\":\"ct110\",\"scope\":\"pve\",\"type\":\"pve_guest\",\"vmid\":110},{\"due_seconds\":86400,\"enabled\":true,\"green1\":false,\"guest_type\":\"lxc\",\"logical_id\":\"ct111\",\"scope\":\"pve\",\"type\":\"pve_guest\",\"vmid\":111},{\"due_seconds\":86400,\"enabled\":true,\"green1\":true,\"guest_type\":\"lxc\",\"logical_id\":\"ct112\",\"scope\":\"pve\",\"type\":\"pve_guest\",\"vmid\":112},{\"due_seconds\":86400,\"enabled\":true,\"green1\":false,\"guest_type\":\"lxc\",\"logical_id\":\"ct113\",\"scope\":\"pve\",\"type\":\"pve_guest\",\"vmid\":113},{\"due_seconds\":86400,\"enabled\":true,\"green1\":false,\"guest_type\":\"qemu\",\"logical_id\":\"vm130\",\"scope\":\"pve\",\"type\":\"pve_guest\",\"vmid\":130},{\"due_seconds\":86400,\"enabled\":true,\"gree...[TRUNC]\nSRC|BACKUP|151|49:FILE_5_PATH=<PATH>\nSRC|BACKUP|151|54:FILE_6_PATH=<PATH>\nSRC|BACKUP|151|59:FILE_7_PATH=<PATH>\nSRC|BACKUP|151|65:FILE_7_HIT_1_TEXT={\"accepted_at_utc\":\"2026-09-17T07:33:40Z\",\"accepted_command_id\":\"SUPPORT-260917-INFRA-DR-BACKUPV2-P0A-SCHEDULER-FAILURE-ISOLATION-REPAIR-504R1\",\"accepted_release\":\"<PATH>\",\"cloud_deletions\":0,\"command_id\":\"SUPPORT-260916-INFRA-DR-BACKUPV2-FINAL-REPLACEMENT-PLAN-STABILITY-SCHEMA-RCA-FIX-VALIDATE-PROMOTE-CUTOVER-SEAL-486R1\",\"created_at_utc\":\"2026-09-16T19:09:44Z\",\"launcher_sha256\":\"dbfd237ddae5d2199bd8567ec6880d11276631dcc45acb49967de97329524037\",\"overlay503\":{\"base_release\":\"<PATH>\",\"base_seal_sha256\":\"f508adc9b09bad9692c580e642018f5d3dbf223fc572ee62478466fd517234fa\",\"binding\":\"legacy-function-provenance-globals\",\"entry_sha256\":\"ac51fd96ec13bbb38e5dbe5683794bf8ab43fab22383bb617c3506139ca5a0eb\",\"fresh_lxc_helper_sha256\":\"dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011\",\"lxc_...[TRUNC]\nSRC|BACKUP|151|66:USA_STATE_KEYS=consecutive_failures;failure_backoff_seconds;generation;green_verified;last_attempt_epoch;last_success_epoch;logical_id;manifest_sha256;payload_sha256;replicas;result;retry_after_epoch;schema;updated_at_utc\nSRC|BACKUP|151|83:MOLDOVA_STATE_KEYS=consecutive_failures;failure_backoff_seconds;generation;last_attempt_epoch;last_success_epoch;last_success_generation;last_success_green_verified;last_success_manifest_sha256;last_success_payload_sha256;last_success_replicas;logical_id;reason;result;retry_after_epoch;schema;sealed;updated_at_utc\nSRC|BACKUP|151|109:PATH_LITERAL_2_VALUE=<PATH>\nSRC|BACKUP|151|115:PATH_LITERAL_4_VALUE=<PATH>\nSRC|BACKUP|151|133:PATH_LITERAL_10_VALUE=<PATH>\nSRC|BACKUP|151|142:PATH_LITERAL_13_VALUE=backup_execution_implementation\nSRC|BACKUP|151|145:PATH_LITERAL_14_VALUE=backup_execution_live_proof_commit\nSRC|BACKUP|151|148:PATH_LITERAL_15_VALUE=<PATH>\nSRC|BACKUP|151|151:PATH_LITERAL_16_VALUE=<PATH>\nSRC|BACKUP|151|154:PATH_LITERAL_17_VALUE=<PATH>\nSRC|BACKUP|151|157:PATH_LITERAL_18_VALUE=carried_forward_backup_execution\nREC|BACKUP_SOURCE|IDX=152|BASENAME=SUPPORT-260916-INFRA-DR-BACKUPV2-REPLACEMENT-INTEGRATION-SOURCE-CAPSULE-475R1-20260916T154619Z.log|PATH_SHA256=fbfa608e725748a4ea33353d7fbfc596f13ff56363fb488f9bb4eef3fb343963|SHA256=2e0b8f6d6f3b7feeb770c1a0fdd53230c42624d34b66e9315861459993aa04e3|SIZE=67704|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|152|2:{\"candidate411\":{\"files\":{\"adapter.py\":{\"bytes\":2989,\"sha256\":\"18eb29cef165371b48bcb78e1a456e1939e6eff253787218133162cc89ab9fa3\",\"zlib_b64\":\"eNqdVtlu20YUfddXMOgDSYRROPtQgQq4sZoaiB3DUoIWRUHMajGWKIKklBiB<PATH>\"},\"guest266.py\":{\"bytes\":7385,\"sha256\":\"86433bc424d5fa5017c20f7a237c82874b02357a3283660d8a6b0039ef2bc868\",\"zlib_b64\":\"eNqVWXtz2kgS<PATH>\"},\"large264.py\":{\"bytes\":16514,\"sha256\":\"5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a\",\"zlib_b64\":\"eNrNO2tz20aS3<PATH>\"},\"pve265.py\":{\"bytes\":12888,\"sha256\":\"cd2f634414a8e38a3789015aeca5a9b47821f77d7d1fa61dcdbdc866172963be\",\"zlib_b64\":\"eNqVO2t32zay3<PATH>\"},\"pve270.py\":{\"bytes\":19595,\"sha256\":\"97015277a4f3f8129c0fd11eb70c06293026366f1f8232a97feeed513a2dbcef\",\"zlib_b64\":\"eNrFPGmT2siS3<PATH>\"},\"pve282.py\":{\"bytes\":6195,\"sha256\":\"73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012\",\"zlib_b64\":\"eNqVWFlT40gSfvevULAPklhhjLub2TCjiRC2AG<PATH>\"},\"restore262.py\":{\"bytes\":14701,\"sha256\":\"56d1b961c8d5654d5e2ee2755268db46bd2202bca11e69788febf991cfaa79f1\",\"zlib_b64\":\"eNqtG2lz2kj2O79Cm<PATH>\"},\"stream263.py\":{\"bytes\":8831,\"sha256\":\"a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16\",\"zlib_b64\":\"eNq9WW1v28gR<PATH>\"},\"v2core.py\":{\"bytes\":11755,\"sha256\":\"e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2\",\"zlib_b64\":\"eNqlWuty27YS<PATH>\"}},\"root\":\"<PATH>\"},\"command_id\":\"SUPPORT-260916-INFRA-DR-BACKUPV2-REPLACEMENT-INTEGRATION-SOURCE-CAPSULE-475R1\",\"decision\":\"SOURCE_CAPSULE_COMPLETE_FOR_REPLACEMENT_INTEGRATION\",\"driver454\":{\"bytes\":4214,\"path\":\"representative_driver.py\",\"root\":\"<PATH>\",\"sha256\":\"b3050a8f95e6d9826a4f0786cd3ca32012b6ab10486d10e4981b50b8a0affff2\",\"zlib_b64\":\"eNqVV1tv2zYUftevYLsHSo2sJB2wAS40wLWVzKhjZ47TrkgDgZbohItMCiTl2N3633coUpbdOGtmIAh1dO78zkU<PATH>\"},\"engine\":{\"bytes\":59719,\"defs\":{\"backup_target\":{\"calls\":[\"BackupError\",\"Path\",\"bool\",\"capture_target\",\"cleanup_source\",\"control_verify\",\"ensure_dir\",\"epoch\",\"exists\",\"generation_id\",\"reconstruct_replica\",\"rmtree\",\"unlink\",\"upload_and_seal\",\"validate_payload\",\"write_state\"],\"end_lineno\":926,\"globals\":[\"BackupError\",\"WORK_ROOT\",\"capture_target\",\"cleanup_source\",\"control_verify\",\"e\",\"ensure_dir\",\"epoch\",\"generation_id\",\"pathlib\",\"reconstruct_replica\",\"shutil\",\"upload_and_seal\",\"validate_payload\",\"write_state\"],\"lineno\":903,\"sha256\":\"d7eae37028d383c842bfe35267b5088421a01713f481b4f3551a44bb2745dc65\",\"source\":\"def backup_target(t,green_verify=False):\\n if t['type']=='control': return control_verify(t)\\n gen=generation_id(t['logical_id']); work=ensure_dir(WORK_ROOT<PATH> payload=None; cleanup=None; sealed=False\\n tr<PATH> payload,meta,cleanup=capture_target(t,gen,work); meta['generation']=gen\\n manifest,msha,alloc=upload_and_seal(t,payload,meta); sealed=True\\n # SEALED-first cleanup invariant: only now remove source<PATH> payload.\\n tr<PATH> if pathlib.Path(payload).exists(): pathlib.Path(payload).unlink()\\n finally: cleanup_source(cleanup)\\n if green_verif<PATH> a=work<PATH>'verify-a.bin'; b=work<PATH>'verify-b.bin'\\n ha=reconstruct_replica(manifest,manifest['replicas'][0],a); validate_payload(t,a)\\n hb=reconstruct_replica(manifest,manifest['replicas'][1],b); validate_payload(t,b)\\n if ha!=hb or ha!=manifest['payload_sha256']: raise BackupError('GREEN_REPLICA_COMPARE')\\n a.unlink(missing_ok=True); b.unlink(missing_ok=True)\\n shutil.rmtree(work,ignore_errors=True)\\n write_state(t['logical_id'],'SUCCESS',generation=gen,payload_sha256=manifest['payload_sha256'],manifest_sha256=msha,replicas=manifest['replicas'],green_verified=bool(green_verify),last_success_epoch=epoch())\\n return {'logical_id':t['logical_id'],'generation':gen,'result':'SUCCESS','payload_bytes':manifest['payload_bytes'],'replicas':2,'allocator_healthy':alloc['healthy']}\\n except BackupError as <PATH> result='PARTIAL_VALID' if sealed else 'FAIL'\\n write_state(t['logical_id'],result,generation=gen,reason=e.code,sealed=sealed)\\n raise\"},\"capture_pve_guest\":{\"calls\":[\"BackupError\",\"Path\",\"_default_unprivileged_lxc\",\"_require_exact_source\",\"_stream_argv_to_local\",\"cluster_inventory\",\"decode\",\"get\",\"int\",\"is_file\",\"len\",\"mapped_scratch_probe\",\"proven_lxc_dump_argv\",\"run\",\"splitlines\",\"ssh_remote\",\"stat\",\"str\",\"strip\"],\"end_lineno\":541,\"globals\":[\"BackupError\",\"P270\",\"P270_SHA\",\"P282\",\"P282_SHA\",\"SCP\",\"_default_unprivileged_lxc\",\"_require_exact_source\",\"_stream_argv_to_local\",\"cluster_inventory\",\"mapped_scratch_probe\",\"pathlib\",\"proven_lxc_dump_argv\",\"run\",\"ssh_remote\"],\"lineno\":505,\"sha256\":\"c4c22625a9c6a954d0ed93dfc63f0501af0644ca9f5e6781d3b2e50a7e2563ea\",\"source\":\"def capture_pve_guest(t,gen,work):\\n vmid=int(t['vmid']); rows=[r for r in cluster_inventory() if int(r.get('vmid',-1))==vmid]\\n if len(rows)!=1: raise BackupError('PVE_GUEST_NOT_UNIQUE')\\n row=rows[0]; node=row.get('node'); typ=row.get('type')\\n if typ!=t['guest_type']: raise BackupError('PVE_GUEST_TYPE_DRIFT')\\n if typ=='lxc':\\n _require_exact_source(P270,P270_SHA,'P270_IDENTITY');_require_exact_source(P282,P282_SHA,'P282_IDENTITY')\\n _default_unprivileged_lxc(node,vmid)\\n scratch=f'<PATH>'\\n ssh_remote(node,['install','-d','-m','710','-o','0','-g','100000',scratch],timeout=30)\\n q=ssh_remote(node,['stat','-c','%a:%u:%g',scratch],timeout=30)\\n if q.stdout.decode().strip()!='710:0:100000': raise BackupError('PVE_MAPPED_SCRATCH_ACCESS_CONTRACT')\\n tr<PATH> mapped_scratch_probe(node,scratch)\\n argv,job=proven_lxc_dump_argv(t,row,node,scratch)\\n local=work<PATH>'payload.bin'\\n _stream_argv_to_local(node,argv,local,timeout=7200)\\n if local.stat().st_size>int(job['archive_cap_bytes']): raise BackupError('VZDUMP_ARCHIVE_CAP_EXCEEDED')\\n except Exceptio<PATH> ssh_remote(node,['rm','-rf','--',scratch],timeout=60,check=False);raise\\n cleanup={'kind':'pve_source_dir','node':node,'path':scratch}\\n return local,{'generation':gen,'source_class':'pve_guest','vmid':vmid,'guest_type':typ,'node':node,'status':row.get('status'),'producer_contract':'proven-270-282-stream'},cleanup\\n # QEMU path remains unchanged: bounded dedicated dumpdir with later cloud readback<PATH> srcdir=f'<PATH>'\\n ssh_remote(node,['install','-d','-m','700','-o','0','-g','0',srcdir],timeout=30)\\n tr<PATH> ssh_remote(node,['vzdump',str(vmid),'--mode','snapshot','--compress','zstd','--dumpdir',srcdir],timeout=7200)\\n p=ssh_remote(node,['find',srcdir,'-maxdepth','1','-type','f','-printf','%p\\\\n'],timeout=30)\\n files=[x for x in p.stdout.decode().splitlines() if x.strip()]\\n if len(files)!=1: raise BackupError('VZDUMP_OUTPUT_NOT_UNIQUE')\\n src=files[0];local=work<PATH>'payload.bin'\\n if node=='pve01': local=pathlib.Path(src)\\n else: run([SCP,'-q','-o','BatchMode=yes','-o','StrictHostKeyChecking=yes','root@'+node+':'+src,str(local)],timeout=7200)\\n if not pathlib.Path(local).is_file() or pathlib.Path(local).stat().st_size<=0: raise BackupError('VZDUMP_PAYLOAD_MISSING')\\n except Exceptio<PATH> ssh_remote(node,['rm','-rf','--',srcdir],timeout=60,check=False);raise\\n return pathlib.Path(local),{'generation':gen,'source_class':'pve_guest','vmid':vmid,'guest_type':typ,'node':node,'status':row.get('status')},{'kind':'pve_source_dir','node':node,'path':srcdir}\"},\"capture_target\":{\"calls\":[\"BackupError\",\"capture_node_bundle\",\"capture_pve_guest\",\"capture_router\",\"capture_vps_md\",\"capture_vps_spb\",\"capture_vps_us\",\"capture_xenforo\"],\"end_lineno\":880,\"globals\":[\"BackupError\",\"capture_node_bundle\",\"capture_pve_guest\",\"capture_router\",\"capture_vps_md\",\"capture_vps_spb\",\"capture_vps_us\",\"capture_xenforo\"],\"lineno\":871,\"sha256\":\"f52cec3a28467da247da0efaffb9523a775b1bb0cab2ce7fef1b1a5923a765bb\",\"source\":\"def capture_target(t,gen,work):\\n typ=t['type']\\n if typ=='pve_guest': return capture_pve_guest(t,gen,work)\\n if typ=='pve_node_bundle': return capture_node_bundle(t,gen,work)\\n if typ=='vps_md': return capture_vps_md(t,gen,work)\\n if typ=='vps_spb': return capture_vps_spb(t,gen,work)\\n if typ=='vps_us': return capture_vps_us(t,gen,work)\\n if typ=='router': return capture_router(t,gen,work)\\n if typ=='xenforo': return capture_xenforo(t,gen,work)\\n raise BackupError('CAPTURE_TYPE_UNKNOWN')\"},\"default_targets\":{\"calls\":[\"append\",\"str\"],\"end_lineno\":174,\"globals\":[],\"lineno\":149,\"sha256\":\"0bed1b714e8631494626410eb8791d20d33463cbbb385a680d2f032d656f4c47\",\"source\":\"def default_targets():\\n d=86400\\n out=[]\\n # PVE guests. Source node is resolved live every run.\\n for vmid,typ in [(110,'lxc'),(111,'lxc'),(112,'lxc'),(113,'lxc'),(130,'qemu'),(150,'qemu'),(160,'qemu'),(170,'qemu'),(171,'qemu'),(190,'qemu'),(210,'qemu'),(211,'qemu'),(9130,'qemu')]:\\n out.append({'logical_id':('ct' if typ=='lxc' else 'vm')+str(vmid),'scope':'pve','type':'pve_guest','vmid':vmid,'guest_type':typ,'due_seconds':d,'enabled':True,'green1':vmid==112})\\n for node in ('pve01','pve02','pve03'):\\n out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})\\n out += [\\n {'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'<IP>','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},\\n {'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'<IP>','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},\\n {'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'<IP>','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh<PATH>','due_seconds':d,'enabled':True,'green1':True},\\n {'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},\\n ]\\n sites=[\\n ('codevipe',160,'pve02','<PATH>','xf_codevipe','single_transaction'),\\n ('dsmods',160,'pve02','<PATH>','xf_dsmods','single_transaction'),\\n ('kingofwolk',160,'pve02','<PATH>','xf_kingofwolk','single_transaction'),\\n ('newfi',210,'pve01','<PATH>','xf_newfi','single_transaction'),\\n ('gamevipe',160,'pve02','<PATH>','xf_gamevipe','global_read_lock'),\\n ('hkmods',160,'pve02','<PATH>','xf_hkmods','global_read_lock'),\\n ('zakrutim',160,'pve02','<PATH>','xf_zakrutim','global_read_lock')]\\n for slug,vmid,node,root,db,strategy in site<PATH> out.append({'logical_id':'xf-'+slug,'scope':'xenforo','type':'xenforo','slug':slug,'vmid':vmid,'node':node,'app_root':root,'db_name':db,'dump_strategy':strategy,'due_seconds':d,'enabled':True,'green1':slug in ('codevipe','zakrutim')})\\n out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})\\n return out\"},\"green_run\":{\"calls\":[\"BackupError\",\"append\",\"backup_target\",\"bootstrap_vps_keys\",\"dumps\",\"ensure_router_known_hosts\",\"get\",\"join\",\"len\",\"load_targets\",\"print\",\"sub\",\"sum\",\"upper\"],\"end_lineno\":953,\"globals\":[\"BackupError\",\"backup_target\",\"bootstrap_vps_keys\",\"e\",\"ensure_router_known_hosts\",\"json\",\"load_targets\",\"re\"],\"lineno\":928,\"sha256\":\"b56b1733abaa16f96d93caa0c4dc16a868303aa6ec045acdfdd73bd7cd6e48c1\",\"source\":\"def green_run(label):\\n targets=load_targets(); chosen=[t for t in targets if t.get('green1')]\\n # Bootstrap is idempotent and only affects authorized_keys for the already-proven operator accounts.\\n boots=bootstrap_vps_keys(targets)\\n ensure_router_known_hosts()\\n print('VPS_OPERATOR_KEY_BOOTSTRAP='+json.dumps(boots,sort_keys=True,separators=(',',':')))\\n results=[]; failures=[]\\n for t in chose<PATH> key=re.sub(r'[^A-Za-z0-9]+','_',t['logical_id']).upper()\\n tr<PATH> r=backup_target(t,green_verify=(t['type']!='control'))\\n results.append(r); print(f'{label}_{key}=PASS')\\n print(f'{label}_{key}_GENERATION={r[\\\"generation\\\"]}')\\n print(f'{label}_{key}_PAYLOAD_BYTES={r.get(\\\"payload_bytes\\\",0)}')\\n print(f'{label}_{key}_REPLICAS={r.get(\\\"replicas\\\",0)}')\\n if 'allocator_healthy' in r: print(f'{label}_{key}_ALLOCATOR_HEALTHY={r[\\\"allocator_healthy\\\"]}')\\n except BackupError as <PATH> failures.append((t['logical_id'],e.code)); print(f'{label}_{key}=FAIL'); print(f'{label}_{key}_REASON={e.code}')\\n print(f'{label}_TARGET_COUNT={len(chosen)}')\\n print(f'{label}_PASS_COUNT={len(results)}')\\n print(f'{label}_FAIL_COUNT={len(failures)}')\\n print(f'{label}_CLOUD_BACKUP_TARGET_COUNT={sum(1 for t in chosen if t[\\\"type\\\"]!=\\\"control\\\")}')\\n print(f'{label}_CONTROL_VERIFY_TARGET_COUNT={sum(1 for t in chosen if t[\\\"type\\\"]==\\\"control\\\")}')\\n if failures: raise BackupError(label+'_TARGET_FAILURES',','.join(x[0] for x in failures))\\n print(f'{label}=PASS')\\n return 0\"},\"load_targets\":{\"calls\":[\"BackupError\",\"get\",\"isinstance\",\"len\",\"loads\",\"read_text\",\"set\"],\"end_lineno\":241,\"globals\":[\"BackupError\",\"TARGETS_PATH\",\"json\"],\"lineno\":236,\"sha256\":\"5eb044cbf911794272bd845409ac17191e79ef933a3875e10e057c17ac1c6787\",\"source\":\"def load_targets():\\n j=json.loads(TARGETS_PATH.read_text())\\n if j.get('schema')!=1 or not isinstance(j.get('targets'),list): raise BackupError('TARGET_MANIFEST_SCHEMA')\\n ids=[x.get('logical_id') for x in j['targets']]\\n if len(ids)!=len(set(ids)): raise BackupError('TARGET_MANIFEST_DUPLICATE')\\n return j['targets']\"},\"main\":{\"calls\":[\"discover\",\"green_run\",\"len\",\"print\",\"scheduled_run\",\"selftest\"],\"end_lineno\":1011,\"globals\":[\"discover\",\"green_run\",\"scheduled_run\",\"selftest\"],\"lineno\":1003,\"sha256\":\"ce5195c9e6a88c411449b1bb57a694c67abc63e1368c96e83fbfc2aadaa08107\",\"source\":\"def main(argv):\\n if len(argv)<2: print('USAGE'); return 64\\n cmd=argv[1]\\n if cmd=='selftest': return selftest()\\n if cmd=='green1': return green_run('GREEN1')\\n if cmd=='green2': return green_run('GREEN2')\\n if cmd=='scheduled': return scheduled_run()\\n if cmd=='discover' and len(argv)==3: return discover(argv[2])\\n print('UNKNOWN_COMMAND'); return 64\"},\"scheduled_run\":{\"calls\":[\"backup_target\",\"choose_due_target\",\"load_state_all\",\"load_targets\",\"print\"],\"end_lineno\":963,\"globals\":[\"BackupError\",\"backup_target\",\"choose_due_target\",\"e\",\"load_state_all\",\"load_targets\"],\"lineno\":955,\"sha256\":\"e082c5c8141f2c00c0dd8a74da199fd480f34792f64c591757bcbd2893b084d8\",\"source\":\"def scheduled_run():\\n targets=load_targets(); state=load_state_all(); t=choose_due_target(targets,state)\\n if t is Non<PATH> print('SCHEDULE_DECISION=DEFER_NO_DUE_TARGET'); return 0\\n print('SCHEDULE_TARGET='+t['logical_id'])\\n try: backup_target(t,green_verify=False)\\n except BackupError as <PATH> print('SCHEDULE_RESULT=FAIL'); print('SCHEDULE_REASON='+e.code); return 2\\n print('SCHEDULE_RESULT=SUCCESS'); return 0\"},\"selftest\":{\"calls\":[\"_isolated_release_graph_selftest\",\"_pve_dumpdir_spec\",\"default_targets\",\"get\",\"is_file\",\"len\",\"print\",\"proven_lxc_dump_argv\"],\"end_lineno\":1001,\"globals\":[\"GUEST266\",\"GUEST266_SHA\",\"P282_SHA\",\"PART_SIZE\",\"REMOTES\",\"_isolated_release_graph_selftest\",\"_pve_dumpdir_spec\",\"default_targets\",\"proven_lxc_dump_argv\"],\"lineno\":987,\"sha256\":\"0ed8f5298ec16a19de775b6206f592fac396dc2b0800d10ebc241b25787a40f3\",\"source\":\"def selftest():\\n assert PART_SIZE==536870912\\n assert len(REMOTES)==13 and len({p for _,p in REMOTES})==13\\n assert len(default_targets())>=28\\n assert {t['logical_id'] for t in default_targets() if t.get('green1')}=={'ct112','node-pve01','md-relay','spb-ingress','us-netbird','router-netcraze','xf-codevipe','xf-zakrutim','control-bootstrap-v2'}\\n assert _pve_dumpdir_spec('lxc')==(0o710,100000)\\n assert _pve_dumpdir_spec('qemu')==(0o700,0)\\n assert GUEST266_SHA=='86433bc424d5fa5017c20f7a237c82874b02357a3283660d8a6b0039ef2bc868'\\n assert P282_SHA=='73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012'\\n if GUEST266.is_file():\\n assert _isolated_release_graph_selftest() is True\\n av,_=proven_lxc_dump_argv({'vmid':112},{'maxdisk':8350298112,'maxmem':536870912,'status':'running','name':'unbound1'},'pve01','<PATH>')\\n assert '--stdout' in av and '--tmpdir' in av and '<PATH>' in av\\n print('SELFTEST_ENGINE396=10')\\n return 0\"},\"write_state\":{\"calls\":[\"BackupError\",\"atomic_write\",\"canonical_json\",\"epoch\",\"utcnow\"],\"end_lineno\":258,\"globals\":[\"BackupError\",\"RESULT_CLASSES\",\"STATE_ROOT\",\"atomic_write\",\"canonical_json\",\"epoch\",\"utcnow\"],\"lineno\":253,\"sha256\":\"8e436f41fb499386eb844cf0a8dfe272342e7ac4c16651c54fbbbdf3aa61a989\",\"source\":\"def write_state(logical_id,result,**kw):\\n if result not in RESULT_CLASSES: raise BackupError('RESULT_CLASS_INVALID')\\n j={'schema':1,'logical_id':logical_id,'result':result,'updated_at_utc':utcnow(),**kw}\\n if result=='SUCCESS': j['last_success_epoch']=epoch()\\n atomic_write(STATE_ROOT<PATH>'state'<PATH>'.json'),canonical_json(j)+b'\\\\n',0o600)\\n return j\"}},\"missing_optional\":[],\"path\":\"<PATH>\",\"sha256\":\"b6e79f087b9f1d21dac4f77a7b46b743299bbb85bc716e80d2ea67c2e038bcd7\"},\"scope\":\"READ_ONLY_SOURCE_CAPSULE_EXACT_CODE_ONLY_NO_CONFIG_NO_SECRET_NO_BACKUP_NO_CLOUD_NO_SYSTEMD_NO_MUTATION\"}\nREC|BACKUP_SOURCE|IDX=153|BASENAME=SUPPORT-260923-HOMELAB-MOLDOVA-RETIRE-PREFLIGHT-1130R1-20260923T205851Z.log|PATH_SHA256=956e8734b6f496472631d5127163b85b2e69ff3379127bdc63b0e60dbf1efa1c|SHA256=f75ed52bc7c1eb7c5418acf9a6f3c7d372de8ddb2bf445b6eb507958c8172cf8|SIZE=260184|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|153|21:7:5. VM160 backup-state audit.\nSRC|BACKUP|153|43:40:Canonical production backup remotes remain Mail A<PATH> Full SITE-DR is SEALED; do not rerun merely because architecture changed. Cloud.ru bucket `homelab-dr-backup`: versioning **ON** (this supersedes older OFF docs), writer<PATH> OFF, no real workload. Yandex Object Storage bucket not created; latest verified billing threshold is `-600 RUB`, target 0, support request pending. Bucket creation remains blocked until live 0 proof.\nSRC|BACKUP|153|47:23:- VM180 cluster-admin | DESTROYED | backup registry lifecycle=RETIRED_PRESERVE\nSRC|BACKUP|153|48:24:- CT200 skladchik-mod | DESTROYED | backup registry lifecycle=RETIRED_PRESERVE\nSRC|BACKUP|153|49:25:- Scrutiny | RETIRED | active service<PATH> removed | backup registry lifecycle=RETIRED_PRESERVE | historical recovery evidence preserved\nSRC|BACKUP|153|66:74:NOTE forum-prod VMID160 is not in homelab-nightly-all; it has separate local<PATH> backup chain\nSRC|BACKUP|153|67:75:NOTE edge-vm disk scsi1 backup=0 risk must be documented\nSRC|BACKUP|153|70:81:HEALTH_NOT_OK item=backup-restore-coverage-slo.txt line=STATUS=WARN\nSRC|BACKUP|153|71:82:HEALTH_NOT_OK item=backup-restore-dashboard.txt line=STATUS=WARN TS=2026-06-29T18:10:09Z ITEMS=80 NOT_OK=13\nSRC|BACKUP|153|86:UNIT|name=homelab-backup-v2.timer|load=loaded|active=active|sub=waiting|result=success|enabled=enabled\nSRC|BACKUP|153|87:UNIT|name=homelab-backup-v2.service|load=loaded|active=inactive|sub=dead|result=success|enabled=static\nSRC|BACKUP|153|88:UNIT|name=homelab-backup-audit.timer|load=loaded|active=active|sub=waiting|result=success|enabled=enabled\nSRC|BACKUP|153|89:UNIT|name=homelab-backup-audit.service|load=loaded|active=failed|sub=failed|result=exit-code|enabled=static\nSRC|BACKUP|153|90:UNIT|name=homelab-alertmanager-backup-health.timer|load=loaded|active=active|sub=waiting|result=success|enabled=enabled\nSRC|BACKUP|153|91:UNIT|name=homelab-alertmanager-backup-health.service|load=loaded|active=inactive|sub=dead|result=success|enabled=static\nSRC|BACKUP|153|95:UNIT|name=netbird-vps-backup.timer|load=not-found|active=inactive|sub=dead|result=success|enabled=not-found\nSRC|BACKUP|153|96:UNIT|name=netbird-vps-backup.service|load=not-found|active=inactive|sub=dead|result=success|enabled=not-found\nSRC|BACKUP|153|103:Sep 23 [IPV6] pve01 homelab-backup-audit[2268991]: TARGET|logical_id=app-filebrowser|kind=APP|state=FRESH|decision=SKIP_FRESH|legacy_age_seconds=14746|generation=app-filebrowser-pve01-20260923T143005Z\nSRC|BACKUP|153|104:Sep 23 [IPV6] pve01 homelab-backup-audit[2268991]: TARGET|logical_id=app-hbarhub|kind=APP|state=FRESH|decision=SKIP_FRESH|legacy_age_seconds=14574|generation=app-hbarhub-pve01-20260923T143158Z\nSRC|BACKUP|153|105:Sep 23 [IPV6] pve01 homelab-backup-audit[2268991]: TARGET|logical_id=app-immich|kind=APP|state=FRESH|decision=SKIP_FRESH|legacy_age_seconds=14674|generation=app-immich-pve01-20260923T143041Z\nSRC|BACKUP|153|106:Sep 23 [IPV6] pve01 homelab-backup-audit[2268991]: TARGET|logical_id=app-skladchik-reports-monitor|kind=APP|state=FRESH|decision=SKIP_FRESH|legacy_age_seconds=14724|generation=app-skladchik-reports-monitor-pve01-20260923T143025Z\nSRC|BACKUP|153|107:Sep 23 [IPV6] pve01 homelab-backup-audit[2268991]: TARGET|logical_id=control-bootstrap-v2|kind=CONTROL|state=FRESH|age_seconds=36576|generation=control-bootstrap-v2-pve01-20260916T120057Z\nSRC|BACKUP|153|108:Sep 23 [IPV6] pve01 homelab-backup-audit[2268991]: TARGET|logical_id=vm110|kind=VM|state=FRESH|source=V2|v2_age_seconds=20203|legacy_age_seconds=1688189|replica_count=2|state_id=ct110|generation=v2-ct110-20260923T125546Z-34408ffe4182\nSRC|BACKUP|153|109:Sep 23 [IPV6] pve01 homelab-backup-audit[2268991]: TARGET|logical_id=vm111|kind=VM|state=FRESH|source=V2|v2_age_seconds=18061|replica_count=2|state_id=ct111|generation=v2-ct111-20260923T133222Z-0d3f5fae9c35\nSRC|BACKUP|153|110:Sep 23 [IPV6] pve01 homelab-backup-audit[2268991]: TARGET|logical_id=vm112|kind=VM|state=FRESH|source=V2|v2_age_seconds=71147|legacy_age_seconds=1726684|replica_count=2|state_id=ct112|generation=v2-ct112-20260922T224902Z-8457b570052f\nSRC|BACKUP|153|111:Sep 23 [IPV6] pve01 homelab-backup-audit[2268991]: TARGET|logical_id=vm113|kind=VM|state=FRESH|source=V2|v2_age_seconds=69278|replica_count=2|state_id=ct113|generation=v2-ct113-20260922T231959Z-9fe7d084a330\nSRC|BACKUP|153|112:Sep 23 [IPV6] pve01 homelab-backup-audit[2268991]: TARGET|logical_id=vm130|kind=VM|state=FRESH|source=V2|v2_age_seconds=61252|replica_count=2|state_id=vm130|generation=v2-vm130-20260923T011558Z-c9498d37d3d7\nSRC|BACKUP|153|113:Sep 23 [IPV6] pve01 homelab-backup-audit[2268991]: TARGET|logical_id=vm150|kind=VM|state=FRESH|source=V2|v2_age_seconds=66934|legacy_age_seconds=1688305|replica_count=2|state_id=vm150|generation=v2-vm150-20260922T235842Z-71b8fcec59c9\nSRC|BACKUP|153|114:Sep 23 [IPV6] pve01 homelab-backup-audit[2268991]: TARGET|logical_id=vm160|kind=VM|state=FRESH|source=V2|v2_age_seconds=60152|replica_count=2|state_id=vm160|generation=v2-vm160-20260923T014608Z-f76d7671af5a\nSRC|BACKUP|153|115:Sep 23 [IPV6] pve01 homelab-backup-audit[2268991]: TARGET|logical_id=vm170|kind=VM|state=FRESH|source=V2|v2_age_seconds=51801|legacy_age_seconds=632926|replica_count=2|state_id=vm170|generation=v2-vm170-20260923T035958Z-923adacbc94b\nSRC|BACKUP|153|116:Sep 23 [IPV6] pve01 homelab-backup-audit[2268991]: TARGET|logical_id=vm171|kind=VM|state=FRESH|source=V2|v2_age_seconds=58355|legacy_age_seconds=662458|replica_count=2|state_id=vm171|generation=v2-vm171-20260923T021946Z-4d6e4f578075\nSRC|BACKUP|153|117:Sep 23 [IPV6] pve01 homelab-backup-audit[2268991]: TARGET|logical_id=vm190|kind=VM|state=FRESH|source=V2|v2_age_seconds=54272|replica_count=2|state_id=vm190|generation=v2-vm190-20260923T032759Z-314d9ba2ec35\nSRC|BACKUP|153|118:Sep 23 [IPV6] pve01 homelab-backup-audit[2268991]: TARGET|logical_id=vm9130|kind=VM|state=FRESH|source=V2|v2_age_seconds=39367|replica_count=2|state_id=vm9130|generation=v2-vm9130-20260923T071932Z-c0492db6535b\nSRC|BACKUP|153|119:Sep 23 [IPV6] pve01 homelab-backup-audit[2268991]: ISSUE|severity=HIGH|code=LOCK_BUSY|logical_id=<PATH>\nSRC|BACKUP|153|120:Sep 23 [IPV6] pve01 homelab-backup-audit[2268991]: SUMMARY|AUDIT_STATUS=OK|BACKUP_STATUS=RED|ACTIVE_COUNT=16|ISSUE_COUNT=1|CLOUD_A=OK|CLOUD_B=OK|CLOUD_B_DRILL=OK|DR_PROVEN=YES|SOURCE_OFFHOST=OK\nSRC|BACKUP|153|121:Sep 23 [IPV6] pve01 systemd[1]: homelab-backup-audit.service: Main process exited, code=exited, status=1<PATH>\nSRC|BACKUP|153|122:Sep 23 [IPV6] pve01 systemd[1]: homelab-backup-audit.service: Failed with result 'exit-code'.\nSRC|BACKUP|153|123:Sep 23 [IPV6] pve01 systemd[1]: Failed to start homelab-backup-audit.service - Homelab unified backup and DR audit.\nSRC|BACKUP|153|124:Sep 23 [IPV6] pve01 systemd[1]: homelab-backup-audit.service: Consumed 2.367s CPU time, 148.3M memory peak.\nSRC|BACKUP|153|125:Sep 23 [IPV6] pve01 systemd[1]: Starting homelab-backup-audit.service - Homelab unified backup and DR audit...\nREC|BACKUP_SOURCE|IDX=154|BASENAME=SUPPORT-260927-HOMELAB-BACKUP-LOCK-AWARE-RPO-RECOVERY-1235R1-20260927T200648Z.log|PATH_SHA256=0aee8b90384ade18d3b7eb6924d15c3e7c44487f4c69065119e215e9cb3f1c7e|SHA256=ec33d4b1814e274b3b42698808583b2ff788fc28ebda27f071d75672b16ab009|SIZE=23137|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|154|4:COMPONENT=homelab-backup-lock-aware-rpo-recovery\nSRC|BACKUP|154|23:SOURCE_BRANCH=cr-2026-1005-backup-v2-health-alerting-remediation\nSRC|BACKUP|154|59:VERIFY_TARGET_RESULT={\"generation\":\"control-bootstrap-v2-pve01-20260916T120057Z\",\"logical_id\":\"control-bootstrap-v2\",\"payload_bytes\":0,\"replicas\":2,\"result\":\"SUCCESS\"}\nSRC|BACKUP|154|85:VERIFY_TARGET_RESULT={\"allocator_healthy\":13,\"generation\":\"v2-ct111-20260927T200714Z-2f72200d7742\",\"logical_id\":\"ct111\",\"payload_bytes\":417826152,\"replicas\":2,\"result\":\"SUCCESS\"}\nSRC|BACKUP|154|101:TARGET_LOCK_ACQUIRED|tag=ct112|attempt=1|stamp=2614978226898\nSRC|BACKUP|154|102:TARGETED_REFRESH_BEGIN={\"iteration\":3,\"audit_label\":\"vm112\",\"verify_target\":\"ct112\",\"start_epoch\":1790539822}\nSRC|BACKUP|154|108:VERIFY_OUTPUT_BEGIN=ct112\nSRC|BACKUP|154|111:VERIFY_TARGET_RESULT={\"allocator_healthy\":13,\"generation\":\"v2-ct112-20260927T201022Z-6cdb5a555315\",\"logical_id\":\"ct112\",\"payload_bytes\":224039854,\"replicas\":2,\"result\":\"SUCCESS\"}\nSRC|BACKUP|154|112:VERIFY_OUTPUT_END=ct112\nSRC|BACKUP|154|114:VERIFY_RESULT_LOGICAL_ID=ct112\nSRC|BACKUP|154|116:VERIFY_RESULT_GENERATION=v2-ct112-20260927T201022Z-6cdb5a555315\nSRC|BACKUP|154|121:TARGETED_REFRESH_END={\"iteration\":3,\"audit_label\":\"vm112\",\"verify_target\":\"ct112\",\"elapsed_seconds\":85,\"accepted\":true}\nSRC|BACKUP|154|122:TARGET_LOCK_RELEASED|tag=ct112\nSRC|BACKUP|154|137:VERIFY_TARGET_RESULT={\"allocator_healthy\":13,\"generation\":\"v2-ct113-20260927T201155Z-87c3bfe1d555\",\"logical_id\":\"ct113\",\"payload_bytes\":221991399,\"replicas\":2,\"result\":\"SUCCESS\"}\nSRC|BACKUP|154|162:QEMU_EXECUTION_DIAG={\"archive_bytes\":912043917,\"archive_selected\":true,\"node\":\"pve01\",\"producer_rc\":0,\"regular_file_count\":2,\"sidecar_count\":1,\"vmid\":150}\nSRC|BACKUP|154|163:VERIFY_TARGET_RESULT={\"allocator_healthy\":13,\"generation\":\"v2-vm150-20260927T201335Z-2ba76459e7c5\",\"logical_id\":\"vm150\",\"payload_bytes\":912043917,\"replicas\":2,\"result\":\"SUCCESS\"}\nSRC|BACKUP|154|188:QEMU_EXECUTION_DIAG={\"archive_bytes\":1645890869,\"archive_selected\":true,\"node\":\"pve03\",\"producer_rc\":0,\"regular_file_count\":2,\"sidecar_count\":1,\"vmid\":190}\nSRC|BACKUP|154|189:VERIFY_TARGET_RESULT={\"allocator_healthy\":13,\"generation\":\"v2-vm190-20260927T201613Z-662906757ca1\",\"logical_id\":\"vm190\",\"payload_bytes\":1645890869,\"replicas\":2,\"result\":\"SUCCESS\"}\nSRC|BACKUP|154|214:QEMU_EXECUTION_DIAG={\"archive_bytes\":8232066517,\"archive_selected\":true,\"node\":\"pve01\",\"producer_rc\":0,\"regular_file_count\":2,\"sidecar_count\":1,\"vmid\":170}\nSRC|BACKUP|154|215:VERIFY_TARGET_RESULT={\"allocator_healthy\":13,\"generation\":\"v2-vm170-20260927T202054Z-1daa87a3cfbc\",\"logical_id\":\"vm170\",\"payload_bytes\":8232066517,\"replicas\":2,\"result\":\"SUCCESS\"}\nSRC|BACKUP|154|240:QEMU_EXECUTION_DIAG={\"archive_bytes\":2061491229,\"archive_selected\":true,\"node\":\"pve01\",\"producer_rc\":0,\"regular_file_count\":2,\"sidecar_count\":1,\"vmid\":171}\nSRC|BACKUP|154|241:VERIFY_TARGET_RESULT={\"allocator_healthy\":13,\"generation\":\"v2-vm171-20260927T203926Z-61ca38fe3ac5\",\"logical_id\":\"vm171\",\"payload_bytes\":2061491229,\"replicas\":2,\"result\":\"SUCCESS\"}\nSRC|BACKUP|154|266:QEMU_EXECUTION_DIAG={\"archive_bytes\":10968466823,\"archive_selected\":true,\"node\":\"pve02\",\"producer_rc\":0,\"regular_file_count\":2,\"sidecar_count\":1,\"vmid\":9130}\nSRC|BACKUP|154|267:VERIFY_TARGET_RESULT={\"allocator_healthy\":13,\"generation\":\"v2-vm9130-20260927T204452Z-91cc0cc7ecc5\",\"logical_id\":\"vm9130\",\"payload_bytes\":10968466823,\"replicas\":2,\"result\":\"SUCCESS\"}\nSRC|BACKUP|154|292:QEMU_EXECUTION_DIAG={\"archive_bytes\":3805401657,\"archive_selected\":true,\"node\":\"pve02\",\"producer_rc\":0,\"regular_file_count\":2,\"sidecar_count\":1,\"vmid\":160}\nSRC|BACKUP|154|293:VERIFY_TARGET_RESULT={\"allocator_healthy\":13,\"generation\":\"v2-vm160-20260927T211143Z-0cadc4ac0b12\",\"logical_id\":\"vm160\",\"payload_bytes\":3805401657,\"replicas\":2,\"result\":\"SUCCESS\"}\nSRC|BACKUP|154|318:QEMU_EXECUTION_DIAG={\"archive_bytes\":11053999065,\"archive_selected\":true,\"node\":\"pve03\",\"producer_rc\":0,\"regular_file_count\":2,\"sidecar_count\":1,\"vmid\":130}\nSRC|BACKUP|154|319:VERIFY_TARGET_RESULT={\"allocator_healthy\":13,\"generation\":\"v2-vm130-20260927T212128Z-0046d7efc414\",\"logical_id\":\"vm130\",\"payload_bytes\":11053999065,\"replicas\":2,\"result\":\"SUCCESS\"}\nSRC|BACKUP|154|340:TARGET|logical_id=app-filebrowser|kind=APP|state=FRESH|decision=BACKUP_DUE|legacy_age_seconds=55069|generation=app-filebrowser-pve01-20260927T063003Z\nSRC|BACKUP|154|341:TARGET|logical_id=app-hbarhub|kind=APP|state=FRESH|decision=BACKUP_DUE|legacy_age_seconds=54902|generation=app-hbarhub-pve01-20260927T063154Z\nSRC|BACKUP|154|342:TARGET|logical_id=app-immich|kind=APP|state=FRESH|decision=BACKUP_DUE|legacy_age_seconds=55003|generation=app-immich-pve01-20260927T063041Z\nSRC|BACKUP|154|343:TARGET|logical_id=app-skladchik-reports-monitor|kind=APP|state=FRESH|decision=BACKUP_DUE|legacy_age_seconds=55050|generation=app-skladchik-reports-monitor-pve01-20260927T063026Z\nSRC|BACKUP|154|344:TARGET|logical_id=control-bootstrap-v2|kind=CONTROL|state=FRESH|age_seconds=6055|generation=control-bootstrap-v2-pve01-20260916T120057Z\nSRC|BACKUP|154|345:TARGET|logical_id=vm110|kind=VM|state=FRESH|source=V2|v2_age_seconds=7378|legacy_age_seconds=2045313|replica_count=2|state_id=ct110|generation=v2-ct110-20260927T194116Z-d16fe26dbd17\nSRC|BACKUP|154|346:TARGET|logical_id=vm111|kind=VM|state=FRESH|source=V2|v2_age_seconds=5867|replica_count=2|state_id=ct111|generation=v2-ct111-20260927T200714Z-2f72200d7742\nSRC|BACKUP|154|347:TARGET|logical_id=vm112|kind=VM|state=FRESH|source=V2|v2_age_seconds=5774|legacy_age_seconds=2083808|replica_count=2|state_id=ct112|generation=v2-ct112-20260927T201022Z-6cdb5a555315\nSRC|BACKUP|154|348:TARGET|logical_id=vm113|kind=VM|state=FRESH|source=V2|v2_age_seconds=5674|replica_count=2|state_id=ct113|generation=v2-ct113-20260927T201155Z-87c3bfe1d555\nSRC|BACKUP|154|349:TARGET|logical_id=vm130|kind=VM|state=FRESH|source=V2|v2_age_seconds=3|replica_count=2|state_id=vm130|generation=v2-vm130-20260927T212128Z-0046d7efc414\nSRC|BACKUP|154|350:TARGET|logical_id=vm150|kind=VM|state=FRESH|source=V2|v2_age_seconds=5518|legacy_age_seconds=2045429|replica_count=2|state_id=vm150|generation=v2-vm150-20260927T201335Z-2ba76459e7c5\nSRC|BACKUP|154|351:TARGET|logical_id=vm160|kind=VM|state=FRESH|source=V2|v2_age_seconds=1601|replica_count=2|state_id=vm160|generation=v2-vm160-20260927T211143Z-0cadc4ac0b12\nREC|BACKUP_SOURCE|IDX=155|BASENAME=SUPPORT-260918-INFRA-PVE1-MOLDOVA-OVERLAY504-TRANSPORT-READONLY-557R3-20260918T211033Z.log|PATH_SHA256=453f07c337124544193fadf20289bd55188bcf2a3e2890dddfb0e9b768a3a879|SHA256=e28442fce699135a678d87f47199ecead0bb39ff250c5f9b54c7acbfe40c08d7|SIZE=42268|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|155|50:OVERLAY_CONTEXT_entry504_py_01_LINE_0004=BASE=pathlib.Path('<PATH>')\nSRC|BACKUP|155|55:OVERLAY_CONTEXT_entry504_py_01_LINE_0009='ct112_handler.py':'8cac6e627d5e7abe5d3163cdd24911995a1e3f45c776f9373c2aa68784f5ec6c',\nSRC|BACKUP|155|82:OVERLAY_CONTEXT_entry504_py_03_LINE_0062=required=('capture_pve_guest','backup_target','load_targets','cluster_inventory','ssh_remote',\nSRC|BACKUP|155|118:OVERLAY_CONTEXT_entry504_py_04_LINE_0100=rows=wrapper.load_targets(); hits=[x for x in rows if x.get('logical_id')==lid]\nSRC|BACKUP|155|132:OVERLAY_CONTEXT_entry504_py_04_LINE_0114=if not callable(wrapper.backup_target) or not callable(wrapper.main) or not callable(wrapper.load_targets):\nSRC|BACKUP|155|158:OVERLAY_CONTEXT_fresh_lxc_helper_py_01_LINE_0004=BASE_RELEASE=pathlib.Path('<PATH>')\nSRC|BACKUP|155|197:OVERLAY_CONTEXT_lxc_adapter_py_02_LINE_0041=def _live_inputs(legacy,node,vmid,scratch):\nSRC|BACKUP|155|206:OVERLAY_CONTEXT_lxc_adapter_py_02_LINE_0050=try: rid=int(r.get('vmid'))\nSRC|BACKUP|155|218:OVERLAY_CONTEXT_lxc_adapter_py_02_LINE_0062=return {'node':node,'vmid':vmid,'scratch':scratch,'now':int(time.time()),'rows':rows,'storage_rows':stores,'configs':configs,\nSRC|BACKUP|155|299:OVERLAY_CONTEXT_lxc_adapter_py_07_LINE_0197=legacy._default_unprivileged_lxc(node,vmid)\nSRC|BACKUP|155|317:OVERLAY_CONTEXT_lxc_adapter_py_07_LINE_0215=meta={'generation':gen,'source_class':'pve_guest','vmid':vmid,'guest_type':'lxc','node':node,'status':row.get('status'),\nSRC|BACKUP|155|329:OVERLAY_CONTEXT_producer_exec_helper_py_01_LINE_0004=BASE=pathlib.Path('<PATH>')\nSRC|BACKUP|155|366:OVERLAY_CONTEXT_qemu_adapter_py_01_LINE_0017=def _select_qemu_outputs(vmid,files):\nSRC|BACKUP|155|367:OVERLAY_CONTEXT_qemu_adapter_py_01_LINE_0018=_need(type(vmid) is int and vmid>0,'QEMU_VMID')\nSRC|BACKUP|155|377:OVERLAY_CONTEXT_qemu_adapter_py_02_LINE_0051=vp=legacy.ssh_remote(node,['vzdump',str(vmid),'--mode','snapshot','--compress','zstd','--dumpdir',srcdir],timeout=7200,check=False)\nSRC|BACKUP|155|379:OVERLAY_CONTEXT_qemu_adapter_py_02_LINE_0053=_emit_diag(vmid=vmid,node=node,producer_rc=vp.returncode,stderr_bytes=len(vp.stderr),stderr_sha256=hashlib.sha256(vp.stderr).hexdigest(),archive_selected=False)\nSRC|BACKUP|155|384:OVERLAY_CONTEXT_qemu_adapter_py_02_LINE_0058=try: src,log=_select_qemu_outputs(vmid,files)\nSRC|BACKUP|155|386:OVERLAY_CONTEXT_qemu_adapter_py_02_LINE_0060=_emit_diag(vmid=vmid,node=node,producer_rc=0,regular_file_count=len(files),archive_selected=False,selector_error=str(e))\nSRC|BACKUP|155|397:OVERLAY_CONTEXT_qemu_adapter_py_02_LINE_0071=_emit_diag(vmid=vmid,node=node,producer_rc=0,regular_file_count=len(files),sidecar_count=1 if log else 0,archive_bytes=size,archive_selected=True)\nSRC|BACKUP|155|401:OVERLAY_CONTEXT_qemu_adapter_py_02_LINE_0075=meta={'generation':gen,'source_class':'pve_guest','vmid':vmid,'guest_type':'qemu','node':node,'status':row.get('status'),\nSRC|BACKUP|155|563:OVERLAY_REF_01_PATH=<PATH>\nSRC|BACKUP|155|566:OVERLAY_REF_02_PATH=<PATH>\nREC|BACKUP_SOURCE|IDX=156|BASENAME=SUPPORT-260916-INFRA-DR-BACKUPV2-468-CANDIDATE-BUILD-FORENSIC-RCA-CHUNKED-472R1-20260916T145824Z.log|PATH_SHA256=54f4f83d31345f3f2a530d42dd2f2d0367fe2c0b1797d2f7183e93c883ee0111|SHA256=6ffa04318c791c904b1dddc3fa1874647e0756e02eadfc732a9e472ba742ee37|SIZE=7000|HAS_ALIAS_112=false|HAS_CT112=true|HAS_LAST_TARGET=false\nSRC|BACKUP|156|2:{\"baseline_identity_all_match\":true,\"candidate_trees\":[{\"expected_ct_paths\":[],\"expected_wrapper_paths\":[],\"files\":[{\"bytes\":2077,\"mode\":\"0400\",\"path\":\"CONTRACT.json\",\"sha256\":\"a414715f1b91b3701c52073709a80c38218f76e3961618e8af61489211e50c01\",\"state\":\"FILE\"},{\"bytes\":7210,\"mode\":\"0400\",\"path\":\"PLAN265_REFERENCE.json\",\"sha256\":\"8d36e82080be93a8c929a9211191fa868166b9e7b6152c4c7689fa52b6720757\",\"state\":\"FILE\"},{\"bytes\":4310,\"mode\":\"0400\",\"path\":\"PROVENANCE.json\",\"sha256\":\"303f44dc8e91c8e6a675f9ea406ce4b7532ed98440a9b6807fa593ede9d33254\",\"state\":\"FILE\"},{\"bytes\":2989,\"mode\":\"0500\",\"path\":\"adapter.py\",\"sha256\":\"18eb29cef165371b48bcb78e1a456e1939e6eff253787218133162cc89ab9fa3\",\"state\":\"FILE\"},{\"bytes\":7385,\"mode\":\"0400\",\"path\":\"guest266.py\",\"sha256\":\"86433bc424d5fa5017c20f7a237c82874b02357a3283660d8a6b0039ef2bc868\",\"state\":\"FILE\"},{\"bytes\":16514,\"mode\":\"0400\",\"path\":\"large264.py\",\"sha256\":\"5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a\",\"state\":\"FILE\"},{\"bytes\":4603,\"mode\":\"0400\",\"path\":\"nodeplan263.py\",\"sha256\":\"db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060\",\"state\":\"FILE\"},{\"bytes\":12888,\"mode\":\"0400\",\"path\":\"pve265.py\",\"sha256\":\"cd2f634414a8e38a3789015aeca5a9b47821f77d7d1fa61dcdbdc866172963be\",\"state\":\"FILE\"},{\"bytes\":19595,\"mode\":\"0400\",\"path\":\"pve270.py\",\"sha256\":\"97015277a4f3f8129c0fd11eb70c06293026366f1f8232a97feeed513a2dbcef\",\"state\":\"FILE\"},{\"bytes\":6195,\"mode\":\"0400\",\"path\":\"pve282.py\",\"sha256\":\"73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012\",\"state\":\"FILE\"},{\"bytes\":14701,\"mode\":\"0400\",\"path\":\"restore262.py\",\"sha256\":\"56d1b961c8d5654d5e2ee2755268db46bd2202bca11e69788febf991cfaa79f1\",\"state\":\"FILE\"},{\"bytes\":8831,\"mode\":\"0400\",\"path\":\"stream263.py\",\"sha256\":\"a83d03a86b93a855"
|
|
}
|