diff --git a/runtime/history/SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-SOURCE-RCA-READONLY-1105R1.json b/runtime/history/SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-SOURCE-RCA-READONLY-1105R1.json new file mode 100644 index 00000000..997eb3d7 --- /dev/null +++ b/runtime/history/SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-SOURCE-RCA-READONLY-1105R1.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-SOURCE-RCA-READONLY-1105R1", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "read-only", + "component": "homelab-backup-due-policy-source-rca", + "started_at_utc": "2026-09-21T21:21:23Z", + "finished_at_utc": "2026-09-21T21:21:23Z", + "reference_register_checked": true, + "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", + "error_register_checked": true, + "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", + "command_sha256": "1cadad9a6c87f4c1dde8d879a103f7f85e6d2cdaa3f513448c7045a73e90beb4", + "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": "a5f6bceb256d00dacd3d15ee23e2f737b60089e6232680050e589a1f84edc3c2", + "sanitized_output_sha256": "a5f6bceb256d00dacd3d15ee23e2f737b60089e6232680050e589a1f84edc3c2", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "WORKERS2_DUE_POLICY_SOURCE_RCA_BEGIN=1\nCOMMAND_ID=SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-SOURCE-RCA-READONLY-1105R1\nMODE=read-only\nCOMPONENT=homelab-backup-due-policy-source-rca\nMUTATION_BOUNDARY=READ_ONLY_NO_BACKUP_NO_SERVICE_START_NO_TIMER_CHANGE_NO_LOCK_BREAK_NO_FILE_WRITE_OUTSIDE_TMP_NO_GIT_WRITE\nIDENTITIES={\"base\":{\"exists\":true,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1\"},\"entry504\":{\"exists\":true,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"sha256\":\"ca6876fa9c3b1465b045344a8ad46962de16972c7dadc4ac6257c7d225047793\"},\"wrapper\":{\"exists\":true,\"path\":\"/usr/local/sbin/homelab-backup-v2\",\"sha256\":\"5077444065c732451cb84898680f62361b21a24ef9eb4f191253e82ead524ea2\"}}\nSELFTEST_REPLACEMENT486=PASS\nLIVE_WRAPPER_TARGETS=[{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"ct110\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":110},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"ct111\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":111},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"ct112\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":112},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"ct113\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":113},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm130\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":130},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm150\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":150},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm160\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm170\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":170},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm171\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":171},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm190\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":190},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm210\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":210},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm211\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":211},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm9130\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":9130},{\"due_seconds\":604800,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"node-pve01\",\"node\":\"pve01\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":null},{\"due_seconds\":604800,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"node-pve02\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":null},{\"due_seconds\":604800,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"node-pve03\",\"node\":\"pve03\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":null},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-codevipe\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-dsmods\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-kingofwolk\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-newfi\",\"node\":\"pve01\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":210},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-gamevipe\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-hkmods\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-zakrutim\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"guest-pve01-lxc-112\",\"node\":\"pve01\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":112}]\nSELECTED_VM_TARGETS=[{\"count\":2,\"rows\":[{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"ct112\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":112},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"guest-pve01-lxc-112\",\"node\":\"pve01\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":112}],\"vmid\":112},{\"count\":1,\"rows\":[{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"ct113\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":113}],\"vmid\":113},{\"count\":1,\"rows\":[{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm130\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":130}],\"vmid\":130},{\"count\":1,\"rows\":[{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm150\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":150}],\"vmid\":150},{\"count\":7,\"rows\":[{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm160\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-codevipe\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-dsmods\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-kingofwolk\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-gamevipe\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-hkmods\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-zakrutim\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160}],\"vmid\":160}]\nCURRENT_SCHEDULER_SELECTION_ERROR=AttributeError:module 'wrapper' has no attribute 'load_state_all'\nLIVE_WRAPPER_FUNCTION_HITS=[{\"function\":\"load_targets\",\"line\":1,\"text\":\"def load_targets():\"},{\"function\":\"load_targets\",\"line\":2,\"text\":\"base=canonical_targets();return base+[_ct_descriptor(base)]\"},{\"function\":\"backup_target\",\"line\":1,\"text\":\"def backup_target(t,green_verify=False):\"},{\"function\":\"backup_target\",\"line\":2,\"text\":\"if not isinstance(t,dict) or t.get('logical_id')!=CT_ID:\"},{\"function\":\"backup_target\",\"line\":3,\"text\":\"return _legacy_backup_target(t,green_verify)\"},{\"function\":\"backup_target\",\"line\":5,\"text\":\"r=ct112.run_target(t,state_writer=legacy.write_state)\"},{\"function\":\"backup_target\",\"line\":6,\"text\":\"return {'logical_id':CT_ID,'generation':r['generation'],'result':'SUCCESS','payload_bytes':r['payload_bytes'],\"}]\nDUE_POLICY_SOURCE_HITS=[{\"hits\":[{\"line\":18,\"text\":\"_legacy_load_targets=legacy.load_targets\"},{\"line\":19,\"text\":\"_legacy_backup_target=legacy.backup_target\"},{\"line\":21,\"text\":\"def canonical_targets():\"},{\"line\":22,\"text\":\"rows=_legacy_load_targets()\"},{\"line\":23,\"text\":\"if not isinstance(rows,list) or len(rows)!=28: raise legacy.BackupError('TARGET_REGISTRY_COUNT')\"},{\"line\":25,\"text\":\"ids=[x.get('logical_id') for x in out]\"},{\"line\":26,\"text\":\"if len(set(ids))!=28 or CT_ID in ids: raise legacy.BackupError('TARGET_REGISTRY_IDENTITY')\"},{\"line\":30,\"text\":\"xf=[x for x in rows if x.get('logical_id')=='xf-zakrutim']\"},{\"line\":32,\"text\":\"due=xf[0].get('due_seconds')\"},{\"line\":34,\"text\":\"return {'logical_id':CT_ID,'scope':'pve01 LXC 112 full-guest archive DR','type':'pve_guest','node':'pve01','vmid':112,\"},{\"line\":35,\"text\":\"'guest_type':'lxc','due_seconds':due,'enabled':True,'green1':True}\"},{\"line\":37,\"text\":\"def load_targets():\"},{\"line\":38,\"text\":\"base=canonical_targets();return base+[_ct_descriptor(base)]\"},{\"line\":40,\"text\":\"def backup_target(t,green_verify=False):\"},{\"line\":41,\"text\":\"if not isinstance(t,dict) or t.get('logical_id')!=CT_ID:\"},{\"line\":42,\"text\":\"return _legacy_backup_target(t,green_verify)\"},{\"line\":44,\"text\":\"r=ct112.run_target(t,state_writer=legacy.write_state)\"},{\"line\":45,\"text\":\"return {'logical_id':CT_ID,'generation':r['generation'],'result':'SUCCESS','payload_bytes':r['payload_bytes'],\"},{\"line\":52,\"text\":\"legacy.load_targets=load_targets\"},{\"line\":53,\"text\":\"legacy.backup_target=backup_target\"},{\"line\":58,\"text\":\"d=legacy.default_targets()\"},{\"line\":59,\"text\":\"if not isinstance(d,list) or len(d)<28: raise RuntimeError('LEGACY_DEFAULT_TARGET_COUNT')\"},{\"line\":61,\"text\":\"if {t.get('logical_id') for t in d if isinstance(t,dict) and t.get('green1')}!=want: raise RuntimeError('LEGACY_DEFAULT_GREEN_SET')\"},{\"line\":70,\"text\":\"base=canonical_targets(); eff=load_targets()\"},{\"line\":71,\"text\":\"if len(eff)!=29 or sum(1 for x in eff if x.get('logical_id')==CT_ID)!=1: raise RuntimeError('EFFECTIVE_TARGETS')\"},{\"line\":72,\"text\":\"legacy_rows,ct=driver.partition_targets(eff)\"},{\"line\":73,\"text\":\"if [x['logical_id'] for x in legacy_rows]!=list(LEGACY_IDS) or ct.get('vmid')!=112: raise RuntimeError('REPRESENTATIVE_PARTITION')\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/wrapper.py\",\"sha256\":\"2b5eb4fc0f6f466a0d3e5a007af987092b6c17baa3ff9241a6afc2c2e97df1d5\",\"size\":5055},{\"hits\":[{\"line\":4,\"text\":\"This module does not discover credentials, modify scheduler state, or implement the\"},{\"line\":33,\"text\":\"def _logical_id(target: Mapping[str, Any]) -> str:\"},{\"line\":34,\"text\":\"value=target.get('logical_id') if isinstance(target, Mapping) else None\"},{\"line\":36,\"text\":\"raise ContractError('TARGET_LOGICAL_ID')\"},{\"line\":39,\"text\":\"def partition_targets(targets: Iterable[Mapping[str, Any]]):\"},{\"line\":42,\"text\":\"for target in targets:\"},{\"line\":43,\"text\":\"logical_id=_logical_id(target)\"},{\"line\":44,\"text\":\"if logical_id not in wanted:\"},{\"line\":46,\"text\":\"if logical_id in selected:\"},{\"line\":47,\"text\":\"raise ContractError('REPRESENTATIVE_TARGET_DUPLICATE')\"},{\"line\":48,\"text\":\"selected[logical_id]=target\"},{\"line\":51,\"text\":\"raise ContractError('REPRESENTATIVE_TARGET_MISSING')\"},{\"line\":72,\"text\":\"def write_state(logical_id,result,**kw):\"},{\"line\":73,\"text\":\"if logical_id not in LEGACY_IDS:\"},{\"line\":74,\"text\":\"raise ContractError('STATE_TARGET_FORBIDDEN')\"},{\"line\":75,\"text\":\"payload={'logical_id':logical_id,'result':result,'meta':kw,'schema_version':1}\"},{\"line\":76,\"text\":\"_atomic_json(root/(logical_id+'.json'),payload)\"},{\"line\":79,\"text\":\"def run_legacy_lane(engine, target: Mapping[str, Any]):\"},{\"line\":80,\"text\":\"logical_id=_logical_id(target)\"},{\"line\":81,\"text\":\"if logical_id not in LEGACY_IDS:\"},{\"line\":82,\"text\":\"raise ContractError('LEGACY_TARGET_FORBIDDEN')\"},{\"line\":83,\"text\":\"backup=getattr(engine,'backup_target',None)\"},{\"line\":85,\"text\":\"raise ContractError('ENGINE_BACKUP_TARGET_MISSING')\"},{\"line\":91,\"text\":\"return backup(target,True)\"},{\"line\":98,\"text\":\"if result.get('logical_id')!=CT112_ID or result.get('status')!='OK':\"},{\"line\":106,\"text\":\"def run_representative(engine, targets, ct112_callback: Callable[[Mapping[str, Any]], Any]):\"},{\"line\":109,\"text\":\"legacy,ct112=partition_targets(targets)\"},{\"line\":111,\"text\":\"for target in legacy:\"},{\"line\":112,\"text\":\"results.append(run_legacy_lane(engine,target))\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/representative_driver.py\",\"sha256\":\"b3050a8f95e6d9826a4f0786cd3ca32012b6ab10486d10e4981b50b8a0affff2\",\"size\":4214},{\"hits\":[{\"line\":49,\"text\":\"vmid=r.get('vmid')\"},{\"line\":50,\"text\":\"if type(vmid) is not int:raise RuntimeError('PVE_VMID_SCHEMA')\"},{\"line\":51,\"text\":\"configs[vmid]=_json_cmd(f\\\"/nodes/pve01/{r['type']}/{vmid}/config\\\")\"},{\"line\":61,\"text\":\"vmids=[j.get('vmid') for j in jobs if isinstance(j,dict)]\"},{\"line\":62,\"text\":\"if len(vmids)!=len(jobs) or len(vmids)!=len(set(vmids)):raise RuntimeError('CT112_PLAN_MEMBERSHIP')\"},{\"line\":63,\"text\":\"matches=[j for j in jobs if j.get('vmid')==112]\"},{\"line\":74,\"text\":\"def _assert_live_state_unchanged(before,after,vmid):\"},{\"line\":79,\"text\":\"if any(type(x) is not dict or type(x.get('vmid')) is not int for x in rows):raise RuntimeError('CT112_STATE_SCHEMA')\"},{\"line\":80,\"text\":\"return sorted((x['vmid'],x.get('type'),x.get('node'),x.get('status'),x.get('template')) for x in rows)\"},{\"line\":83,\"text\":\"a=[j for j in old if j.get('vmid')==vmid];b=[j for j in new if j.get('vmid')==vmid]\"},{\"line\":119,\"text\":\"def __init__(self,work,entries,binding,guard,deadline,logical_id):\"},{\"line\":120,\"text\":\"self.work=Path(work);self.entries=entries;self.binding=binding;self.guard=guard;self.deadline=deadline;self.logical_id=logical_id\"},{\"line\":127,\"text\":\"self.inner=large.ReadOnlyLarge(str(RCLONE),self.snapshot,e,bind,self.guard,self.work,self.deadline,self.logical_id)\"},{\"line\":142,\"text\":\"def run_target(target,state_writer=None):\"},{\"line\":143,\"text\":\"if not isinstance(target,dict) or target.get('logical_id')!=CT_ID or target.get('vmid')!=112:return (_ for _ in ()).throw(RuntimeError('CT112_DESCRIPTOR'))\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/ct112_handler.py\",\"sha256\":\"8cac6e627d5e7abe5d3163cdd24911995a1e3f45c776f9373c2aa68784f5ec6c\",\"size\":10955},{\"hits\":[{\"line\":8,\"text\":\"TARGETS_PATH=CONFIG_ROOT/'targets.json'\"},{\"line\":21,\"text\":\"ROUTER_TARGET_SHA='4f9da1283166a1e9f4e6bc7dd240c76aef85772177f717f92abb6e8e2bb8de90'\"},{\"line\":132,\"text\":\"def remote_generation_path(scope,logical_id,generation):\"},{\"line\":134,\"text\":\"for x in (scope,logical_id,generation):\"},{\"line\":136,\"text\":\"return f'homelab-backups/v2/{scope}/{logical_id}/generations/{generation}'\"},{\"line\":138,\"text\":\"def make_manifest(scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta):\"},{\"line\":142,\"text\":\"return {'schema':2,'scope':scope,'logical_id':logical_id,'generation':generation,'created_at_utc':utcnow(),\"},{\"line\":149,\"text\":\"def default_targets():\"},{\"line\":150,\"text\":\"d=86400\"},{\"line\":153,\"text\":\"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')]:\"},{\"line\":154,\"text\":\"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})\"},{\"line\":156,\"text\":\"out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})\"},{\"line\":158,\"text\":\"{'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'85.121.4.192','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},\"},{\"line\":159,\"text\":\"{'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'185.225.35.6','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},\"},{\"line\":160,\"text\":\"{'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'46.16.34.129','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh/fePUci42dfY58I6q0lFiiPHn0/M+mckypmE','due_seconds':d,'enabled':True,'green1':True},\"},{\"line\":161,\"text\":\"{'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},\"},{\"line\":171,\"text\":\"for slug,vmid,node,root,db,strategy in sites:\"},{\"line\":172,\"text\":\"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')})\"},{\"line\":173,\"text\":\"out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})\"},{\"line\":176,\"text\":\"def choose_due_target(targets,state,now=None):\"},{\"line\":179,\"text\":\"for t in targets:\"},{\"line\":180,\"text\":\"if not t.get('enabled',True): continue\"},{\"line\":181,\"text\":\"due=max(1,int(t.get('due_seconds',86400)))\"},{\"line\":182,\"text\":\"last=int(state.get(t['logical_id'],{}).get('last_success_epoch',0))\"},{\"line\":184,\"text\":\"if last==0 or age>=due: c.append((-(age/due),last,t['logical_id'],t))\"},{\"line\":236,\"text\":\"def load_targets():\"},{\"line\":237,\"text\":\"j=json.loads(TARGETS_PATH.read_text())\"},{\"line\":238,\"text\":\"if j.get('schema')!=1 or not isinstance(j.get('targets'),list): raise BackupError('TARGET_MANIFEST_SCHEMA')\"},{\"line\":239,\"text\":\"ids=[x.get('logical_id') for x in j['targets']]\"},{\"line\":240,\"text\":\"if len(ids)!=len(set(ids)): raise BackupError('TARGET_MANIFEST_DUPLICATE')\"},{\"line\":241,\"text\":\"return j['targets']\"},{\"line\":249,\"text\":\"j=json.loads(p.read_text()); d[j['logical_id']]=j\"},{\"line\":253,\"text\":\"def write_state(logical_id,result,**kw):\"},{\"line\":255,\"text\":\"j={'schema':1,'logical_id':logical_id,'result':result,'updated_at_utc':utcnow(),**kw}\"},{\"line\":257,\"text\":\"atomic_write(STATE_ROOT/'state'/(logical_id+'.json'),canonical_json(j)+b'\\\\n',0o600)\"},{\"line\":280,\"text\":\"def remote_exists_any(scope,logical_id,generation):\"},{\"line\":281,\"text\":\"rel=remote_generation_path(scope,logical_id,generation)\"},{\"line\":328,\"text\":\"def generation_id(logical_id):\"},{\"line\":330,\"text\":\"return f'v2-{logical_id}-{ts}-{os.urandom(6).hex()}'\"},{\"line\":335,\"text\":\"gen=source_meta['generation']; rel=remote_generation_path(t['scope'],t['logical_id'],gen)\"},{\"line\":336,\"text\":\"if remote_exists_any(t['scope'],t['logical_id'],gen): raise BackupError('GENERATION_COLLISION')\"},{\"line\":339,\"text\":\"manifest=make_manifest(t['scope'],t['logical_id'],gen,n,psha,parts,reps,source_meta)\"},{\"line\":350,\"text\":\"seal={'schema':1,'generation':gen,'logical_id':t['logical_id'],'manifest_sha256':msha,'payload_sha256':psha,'status':'SEALED','sealed_at_utc':utcnow()}\"},{\"line\":359,\"text\":\"rel=remote_generation_path(manifest['scope'],manifest['logical_id'],manifest['generation'])\"},{\"line\":392,\"text\":\"if t['guest_type']=='lxc': validate_tar_zst(path)\"},{\"line\":415,\"text\":\"def _pve_dumpdir_spec(guest_type):\"},{\"line\":416,\"text\":\"if guest_type=='lxc': return (0o710,100000)\"},{\"line\":417,\"text\":\"if guest_type=='qemu': return (0o700,0)\"},{\"line\":418,\"text\":\"raise BackupError('PVE_GUEST_TYPE_DRIFT')\"},{\"line\":449,\"text\":\"return {'vmid':int(t['vmid']),'id':int(t['vmid']),'type':'lxc','kind':'lxc','guest_type':'lxc','node':node,'status':row.get('status'),'name':row.get('name',''),\"},{\"line\":464,\"text\":\"if pathlib.Path(argv[0]).name!='vzdump' or str(int(t['vmid'])) not in argv: raise BackupError('PROVEN_DUMP_ARGV_TARGET')\"},{\"line\":475,\"text\":\"def _default_unprivileged_lxc(node,vmid):\"},{\"line\":476,\"text\":\"q=ssh_remote(node,['pct','config',str(vmid)],timeout=30)\"},{\"line\":506,\"text\":\"vmid=int(t['vmid']); rows=[r for r in cluster_inventory() if int(r.get('vmid',-1))==vmid]\"},{\"line\":509,\"text\":\"if typ!=t['guest_type']: raise BackupError('PVE_GUEST_TYPE_DRIFT')\"},{\"line\":512,\"text\":\"_default_unprivileged_lxc(node,vmid)\"},{\"line\":526,\"text\":\"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\"},{\"line\":531,\"text\":\"ssh_remote(node,['vzdump',str(vmid),'--mode','snapshot','--compress','zstd','--dumpdir',srcdir],timeout=7200)\"},{\"line\":541,\"text\":\"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}\"},{\"line\":565,\"text\":\"def ensure_vps_known_hosts(targets):\"},{\"line\":567,\"text\":\"for t in targets:\"},{\"line\":585,\"text\":\"def bootstrap_vps_keys(targets):\"},{\"line\":587,\"text\":\"ensure_vps_known_hosts(targets)\"},{\"line\":590,\"text\":\"for t in targets:\"},{\"line\":594,\"text\":\"results[t['logical_id']]='ALREADY_OPERATOR_KEY'; continue\"},{\"line\":601,\"text\":\"results[t['logical_id']]=tag\"},{\"line\":603,\"text\":\"us=[x for x in targets if x['type']=='vps_us'][0]\"},{\"line\":605,\"text\":\"results[us['logical_id']]='ALREADY_US_OPERATOR_KEY'\"},{\"line\":621,\"text\":\"return payload,{'generation':gen,'source_class':'vps_md','consistency':'FILESET_PRE_POST_HASH_STABILITY','hashset_sha256':pre},None\"},{\"line\":631,\"text\":\"return payload,{'generation':gen,'source_class':'vps_spb','consistency':'STATIC_CONFIG_FILESET_PRE_POST_HASH_STABILITY','tls_recovery':'REISSUE_TLS_ON_RESTORE','hashset_sha256':pre},None\"},{\"line\":666,\"text\":\"return payload,{'generation':gen,'source_class':'vps_us','consistency':'SQLITE_ONLINE_BACKUP_PLUS_NONDB_FILES','sqlite_count':4},None\"},{\"line\":742,\"text\":\"hits=[ip for ip in ips if sha256_bytes(ip.encode())==ROUTER_TARGET_SHA]\"},{\"line\":743,\"text\":\"if len(hits)!=1: raise BackupError('ROUTER_TARGET_PARSE')\"},{\"line\":744,\"text\":\"target=hits[0]\"},{\"line\":753,\"text\":\"return target,safe[0]\"},{\"line\":783,\"text\":\"target,pf=parse_router_legacy()\"},{\"line\":800,\"text\":\"return payload,{'generation':gen,'source_class':'router','config_sha256':sha256_bytes(a),'read_count':2,'recovery_policy':'IMPORT_PACKAGE_OR_SAFE_CLI_NOT_BLIND_CONFIG_REPLACE'},None\"},{\"line\":802,\"text\":\"def qga_exec(node,vmid,guest_argv,input_bytes=None,timeout=600):\"},{\"line\":803,\"text\":\"args=['qm','guest','exec',str(vmid),'--synchronous','1','--timeout',str(int(timeout))]\"},{\"line\":821,\"text\":\"out=qga_exec(t['node'],t['vmid'],['/usr/bin/python3','-I','-B','-'],xf_guest_builder(t,gen).encode(),timeout=900)\"},{\"line\":833,\"text\":\"b64=qga_exec(t['node'],t['vmid'],['/usr/bin/python3','-I','-B','-c',code,path,str(off),str(take)],None,timeout=60).strip()\"},{\"line\":841,\"text\":\"qga_exec(t['node'],t['vmid'],['/usr/bin/rm','-f',path],None,timeout=30)\"},{\"line\":846,\"text\":\"return local,{'generation':gen,'source_class':'xenforo','site':t['slug'],'vmid':t['vmid'],'node':t['node'],'dump_strategy':t['dump_strategy'],'db_dump_bytes':j.get('db_bytes')},None\"},{\"line\":869,\"text\":\"return payload,{'generation':gen,'source_class':'pve_node_bundle','node':node,'recovery_policy':'CLEAN_INSTALL_JOIN_RECONCILE_NOT_BLIND_PMXCFS_OVERWRITE','member_roots':len(paths)},None\"},{\"line\":871,\"text\":\"def capture_target(t,gen,work):\"},{\"line\":900,\"text\":\"write_state(t['logical_id'],'SUCCESS',generation=gen,verification='existing_control_engine_verify',last_success_epoch=epoch())\"},{\"line\":901,\"text\":\"return {'logical_id':t['logical_id'],'generation':gen,'result':'SUCCESS','payload_bytes':0,'replicas':2}\"},{\"line\":903,\"text\":\"def backup_target(t,green_verify=False):\"},{\"line\":905,\"text\":\"gen=generation_id(t['logical_id']); work=ensure_dir(WORK_ROOT/gen,0o700)\"},{\"line\":908,\"text\":\"payload,meta,cleanup=capture_target(t,gen,work); meta['generation']=gen\"},{\"line\":921,\"text\":\"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())\"},{\"line\":922,\"text\":\"return {'logical_id':t['logical_id'],'generation':gen,'result':'SUCCESS','payload_bytes':manifest['payload_bytes'],'replicas':2,'allocator_healthy':alloc['healthy']}\"},{\"line\":925,\"text\":\"write_state(t['logical_id'],result,generation=gen,reason=e.code,sealed=sealed)\"},{\"line\":929,\"text\":\"targets=load_targets(); chosen=[t for t in targets if t.get('green1')]\"},{\"line\":931,\"text\":\"boots=bootstrap_vps_keys(targets)\"},{\"line\":936,\"text\":\"key=re.sub(r'[^A-Za-z0-9]+','_',t['logical_id']).upper()\"},{\"line\":938,\"text\":\"r=backup_target(t,green_verify=(t['type']!='control'))\"},{\"line\":945,\"text\":\"failures.append((t['logical_id'],e.code)); print(f'{label}_{key}=FAIL'); print(f'{label}_{key}_REASON={e.code}')\"},{\"line\":946,\"text\":\"print(f'{label}_TARGET_COUNT={len(chosen)}')\"},{\"line\":949,\"text\":\"print(f'{label}_CLOUD_BACKUP_TARGET_COUNT={sum(1 for t in chosen if t[\\\"type\\\"]!=\\\"control\\\")}')\"},{\"line\":950,\"text\":\"print(f'{label}_CONTROL_VERIFY_TARGET_COUNT={sum(1 for t in chosen if t[\\\"type\\\"]==\\\"control\\\")}')\"},{\"line\":951,\"text\":\"if failures: raise BackupError(label+'_TARGET_FAILURES',','.join(x[0] for x in failures))\"},{\"line\":956,\"text\":\"targets=load_targets(); state=load_state_all(); t=choose_due_target(targets,state)\"},{\"line\":958,\"text\":\"print('SCHEDULE_DECISION=DEFER_NO_DUE_TARGET'); return 0\"},{\"line\":959,\"text\":\"print('SCHEDULE_TARGET='+t['logical_id'])\"},{\"line\":960,\"text\":\"try: backup_target(t,green_verify=False)\"},{\"line\":965,\"text\":\"def discover(logical_id):\"},{\"line\":966,\"text\":\"targets=load_targets(); m={t['logical_id']:t for t in targets}\"},{\"line\":967,\"text\":\"if logical_id not in m: raise BackupError('DISCOVER_UNKNOWN_TARGET')\"},{\"line\":968,\"text\":\"t=m[logical_id]; prefix=f'homelab-backups/v2/{t[\\\"scope\\\"]}/{logical_id}/generations'\"},{\"line\":983,\"text\":\"print('DISCOVER_LOGICAL_ID='+logical_id); print('DISCOVER_TWO_PHYSICAL_SEALED_COUNT='+str(len(good)))\"},{\"line\":990,\"text\":\"assert len(default_targets())>=28\"},{\"line\":991,\"text\":\"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'}\"},{\"line\":998,\"text\":\"av,_=proven_lxc_dump_argv({'vmid':112},{'maxdisk':8350298112,'maxmem':536870912,'status':'running','name':'unbound1'},'pve01','/var/tmp/homelab-vzdump-selftest')\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/legacy_engine.py\",\"sha256\":\"b6e79f087b9f1d21dac4f77a7b46b743299bbb85bc716e80d2ea67c2e038bcd7\",\"size\":59719},{\"hits\":[{\"line\":76,\"text\":\"need(g['vmid'] in configs,'GUEST_CONFIG_MISSING')\"},{\"line\":77,\"text\":\"original=configs[g['vmid']];cfg=normalized_config(original);summary=np.config_summary(cfg,g['type'])\"},{\"line\":96,\"text\":\"if st is None or st['active'] is not True or st['enabled'] is not True:block.add('STORAGE_NOT_AVAILABLE')\"},{\"line\":124,\"text\":\"need(type(job.get('vmid')) is int and 100<=job['vmid']<=999999999,'VMID')\"},{\"line\":135,\"text\":\"return [str(executable),str(job['vmid']),'--node',job['node'],'--mode','snapshot','--stdout','1',\"},{\"line\":153,\"text\":\"need(type(seconds) in (int,float) and 00,'QEMU_VMID')\"},{\"line\":21,\"text\":\"pat=re.compile(r'^vzdump-qemu-'+re.escape(str(vmid))+r'-(\\\\d{4}_\\\\d{2}_\\\\d{2}-\\\\d{2}_\\\\d{2}_\\\\d{2})\\\\.vma\\\\.zst$')\"},{\"line\":29,\"text\":\"expected_log=parent/f'vzdump-qemu-{vmid}-{stamp}.log'\"},{\"line\":42,\"text\":\"if t.get('guest_type')!='qemu': return original(t,gen,work)\"},{\"line\":43,\"text\":\"vmid=int(t['vmid']); rows=[r for r in legacy.cluster_inventory() if int(r.get('vmid',-1))==vmid]\"},{\"line\":46,\"text\":\"_need(typ==t.get('guest_type')=='qemu','PVE_GUEST_TYPE_DRIFT')\"},{\"line\":51,\"text\":\"vp=legacy.ssh_remote(node,['vzdump',str(vmid),'--mode','snapshot','--compress','zstd','--dumpdir',srcdir],timeout=7200,check=False)\"},{\"line\":53,\"text\":\"_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)\"},{\"line\":58,\"text\":\"try: src,log=_select_qemu_outputs(vmid,files)\"},{\"line\":60,\"text\":\"_emit_diag(vmid=vmid,node=node,producer_rc=0,regular_file_count=len(files),archive_selected=False,selector_error=str(e))\"},{\"line\":71,\"text\":\"_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)\"},{\"line\":75,\"text\":\"meta={'generation':gen,'source_class':'pve_guest','vmid':vmid,'guest_type':'qemu','node':node,'status':row.get('status'),\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"sha256\":\"1906db42bd34bbe85eb46fd9797b3572d46e0a41c29d1c29be5f9df5e448f15b\",\"size\":4627},{\"hits\":[{\"line\":47,\"text\":\"if not (type(seconds) is int and 00,'SCHEDULER_TARGET_SCHEMA')\"},{\"line\":75,\"text\":\"def write_state(logical_id,result,**kw):\"},{\"line\":77,\"text\":\"prior=_read_prior(legacy,logical_id)\"},{\"line\":81,\"text\":\"return original_write(logical_id,result,**clean)\"},{\"line\":88,\"text\":\"return original_write(logical_id,result,**clean)\"},{\"line\":90,\"text\":\"legacy.choose_due_target=choose_due_target\"},{\"line\":92,\"text\":\"return {'choose_due_target':choose_due_target,'write_state':write_state,\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"sha256\":\"a6f67159a64067773323f028126e3109e15cf17a8142cea5e6129970f1d4da96\",\"size\":4097}]\nRPO_SCHEDULER_POLICY_MISMATCH=[{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"ct112\",\"vmid\":112},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"guest-pve01-lxc-112\",\"vmid\":112},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"ct113\",\"vmid\":113},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"vm130\",\"vmid\":130},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"vm150\",\"vmid\":150},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"vm160\",\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"xf-codevipe\",\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"xf-dsmods\",\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"xf-kingofwolk\",\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"xf-gamevipe\",\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"xf-hkmods\",\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"xf-zakrutim\",\"vmid\":160}]\nDECISION=TARGET_CARDINALITY_OR_MODEL_DRIFT\nNO_MUTATION=true\nTASK_RESULT=PASS_HOMELAB_BACKUP_DUE_POLICY_SOURCE_RCA_READONLY\nHOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-SOURCE-RCA-READONLY-1105R1\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\nWORKERS2_DUE_POLICY_SOURCE_RCA_END=1\n" +} diff --git a/runtime/history/SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-SOURCE-RCA-READONLY-1105R1.txt b/runtime/history/SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-SOURCE-RCA-READONLY-1105R1.txt new file mode 100644 index 00000000..ee030493 --- /dev/null +++ b/runtime/history/SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-SOURCE-RCA-READONLY-1105R1.txt @@ -0,0 +1,50 @@ +CHAT_OUTPUT_BEGIN +COMMAND_ID=SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-SOURCE-RCA-READONLY-1105R1 +STATUS=OK +RC=0 +HOST=pve01 +MODE=read-only +COMPONENT=homelab-backup-due-policy-source-rca +REFERENCE_REGISTER_CHECK=OK +REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 +COMMAND_SHA256=1cadad9a6c87f4c1dde8d879a103f7f85e6d2cdaa3f513448c7045a73e90beb4 +DUPLICATE_FAILED_COMMAND_BLOCKED=false +EXECUTION_STARTED=true +CHANGE_DECLARED=false +RESULT_CONTRACT_VALID=true +RESULT_CONTRACT_STATUS=NOT_APPLICABLE +RESULT_CONTRACT_ERROR=NONE +COMMAND_RC=0 +CHANGES_MADE=false +ROLLBACK_STARTED=false +ROLLBACK_RESTORED=null +MUTATION_OUTCOME=NO_MUTATION +SANITIZED=yes +SECRETS_INCLUDED=no +PRIVATE_ADDRESSES_INCLUDED=no +RAW_EVIDENCE_SHA256=a5f6bceb256d00dacd3d15ee23e2f737b60089e6232680050e589a1f84edc3c2 +SANITIZED_OUTPUT_SHA256=a5f6bceb256d00dacd3d15ee23e2f737b60089e6232680050e589a1f84edc3c2 +OUTPUT_BEGIN +WORKERS2_DUE_POLICY_SOURCE_RCA_BEGIN=1 +COMMAND_ID=SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-SOURCE-RCA-READONLY-1105R1 +MODE=read-only +COMPONENT=homelab-backup-due-policy-source-rca +MUTATION_BOUNDARY=READ_ONLY_NO_BACKUP_NO_SERVICE_START_NO_TIMER_CHANGE_NO_LOCK_BREAK_NO_FILE_WRITE_OUTSIDE_TMP_NO_GIT_WRITE +IDENTITIES={"base":{"exists":true,"path":"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1"},"entry504":{"exists":true,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","sha256":"ca6876fa9c3b1465b045344a8ad46962de16972c7dadc4ac6257c7d225047793"},"wrapper":{"exists":true,"path":"/usr/local/sbin/homelab-backup-v2","sha256":"5077444065c732451cb84898680f62361b21a24ef9eb4f191253e82ead524ea2"}} +SELFTEST_REPLACEMENT486=PASS +LIVE_WRAPPER_TARGETS=[{"due_seconds":86400,"enabled":true,"guest_type":"lxc","kind":null,"lifecycle":null,"logical_id":"ct110","node":null,"owner":null,"source_class":null,"status":null,"vmid":110},{"due_seconds":86400,"enabled":true,"guest_type":"lxc","kind":null,"lifecycle":null,"logical_id":"ct111","node":null,"owner":null,"source_class":null,"status":null,"vmid":111},{"due_seconds":86400,"enabled":true,"guest_type":"lxc","kind":null,"lifecycle":null,"logical_id":"ct112","node":null,"owner":null,"source_class":null,"status":null,"vmid":112},{"due_seconds":86400,"enabled":true,"guest_type":"lxc","kind":null,"lifecycle":null,"logical_id":"ct113","node":null,"owner":null,"source_class":null,"status":null,"vmid":113},{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm130","node":null,"owner":null,"source_class":null,"status":null,"vmid":130},{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm150","node":null,"owner":null,"source_class":null,"status":null,"vmid":150},{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm160","node":null,"owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm170","node":null,"owner":null,"source_class":null,"status":null,"vmid":170},{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm171","node":null,"owner":null,"source_class":null,"status":null,"vmid":171},{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm190","node":null,"owner":null,"source_class":null,"status":null,"vmid":190},{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm210","node":null,"owner":null,"source_class":null,"status":null,"vmid":210},{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm211","node":null,"owner":null,"source_class":null,"status":null,"vmid":211},{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm9130","node":null,"owner":null,"source_class":null,"status":null,"vmid":9130},{"due_seconds":604800,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"node-pve01","node":"pve01","owner":null,"source_class":null,"status":null,"vmid":null},{"due_seconds":604800,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"node-pve02","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":null},{"due_seconds":604800,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"node-pve03","node":"pve03","owner":null,"source_class":null,"status":null,"vmid":null},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-codevipe","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-dsmods","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-kingofwolk","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-newfi","node":"pve01","owner":null,"source_class":null,"status":null,"vmid":210},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-gamevipe","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-hkmods","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-zakrutim","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":"lxc","kind":null,"lifecycle":null,"logical_id":"guest-pve01-lxc-112","node":"pve01","owner":null,"source_class":null,"status":null,"vmid":112}] +SELECTED_VM_TARGETS=[{"count":2,"rows":[{"due_seconds":86400,"enabled":true,"guest_type":"lxc","kind":null,"lifecycle":null,"logical_id":"ct112","node":null,"owner":null,"source_class":null,"status":null,"vmid":112},{"due_seconds":86400,"enabled":true,"guest_type":"lxc","kind":null,"lifecycle":null,"logical_id":"guest-pve01-lxc-112","node":"pve01","owner":null,"source_class":null,"status":null,"vmid":112}],"vmid":112},{"count":1,"rows":[{"due_seconds":86400,"enabled":true,"guest_type":"lxc","kind":null,"lifecycle":null,"logical_id":"ct113","node":null,"owner":null,"source_class":null,"status":null,"vmid":113}],"vmid":113},{"count":1,"rows":[{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm130","node":null,"owner":null,"source_class":null,"status":null,"vmid":130}],"vmid":130},{"count":1,"rows":[{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm150","node":null,"owner":null,"source_class":null,"status":null,"vmid":150}],"vmid":150},{"count":7,"rows":[{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm160","node":null,"owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-codevipe","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-dsmods","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-kingofwolk","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-gamevipe","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-hkmods","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-zakrutim","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160}],"vmid":160}] +CURRENT_SCHEDULER_SELECTION_ERROR=AttributeError:module 'wrapper' has no attribute 'load_state_all' +LIVE_WRAPPER_FUNCTION_HITS=[{"function":"load_targets","line":1,"text":"def load_targets():"},{"function":"load_targets","line":2,"text":"base=canonical_targets();return base+[_ct_descriptor(base)]"},{"function":"backup_target","line":1,"text":"def backup_target(t,green_verify=False):"},{"function":"backup_target","line":2,"text":"if not isinstance(t,dict) or t.get('logical_id')!=CT_ID:"},{"function":"backup_target","line":3,"text":"return _legacy_backup_target(t,green_verify)"},{"function":"backup_target","line":5,"text":"r=ct112.run_target(t,state_writer=legacy.write_state)"},{"function":"backup_target","line":6,"text":"return {'logical_id':CT_ID,'generation':r['generation'],'result':'SUCCESS','payload_bytes':r['payload_bytes'],"}] +DUE_POLICY_SOURCE_HITS=[{"hits":[{"line":18,"text":"_legacy_load_targets=legacy.load_targets"},{"line":19,"text":"_legacy_backup_target=legacy.backup_target"},{"line":21,"text":"def canonical_targets():"},{"line":22,"text":"rows=_legacy_load_targets()"},{"line":23,"text":"if not isinstance(rows,list) or len(rows)!=28: raise legacy.BackupError('TARGET_REGISTRY_COUNT')"},{"line":25,"text":"ids=[x.get('logical_id') for x in out]"},{"line":26,"text":"if len(set(ids))!=28 or CT_ID in ids: raise legacy.BackupError('TARGET_REGISTRY_IDENTITY')"},{"line":30,"text":"xf=[x for x in rows if x.get('logical_id')=='xf-zakrutim']"},{"line":32,"text":"due=xf[0].get('due_seconds')"},{"line":34,"text":"return {'logical_id':CT_ID,'scope':'pve01 LXC 112 full-guest archive DR','type':'pve_guest','node':'pve01','vmid':112,"},{"line":35,"text":"'guest_type':'lxc','due_seconds':due,'enabled':True,'green1':True}"},{"line":37,"text":"def load_targets():"},{"line":38,"text":"base=canonical_targets();return base+[_ct_descriptor(base)]"},{"line":40,"text":"def backup_target(t,green_verify=False):"},{"line":41,"text":"if not isinstance(t,dict) or t.get('logical_id')!=CT_ID:"},{"line":42,"text":"return _legacy_backup_target(t,green_verify)"},{"line":44,"text":"r=ct112.run_target(t,state_writer=legacy.write_state)"},{"line":45,"text":"return {'logical_id':CT_ID,'generation':r['generation'],'result':'SUCCESS','payload_bytes':r['payload_bytes'],"},{"line":52,"text":"legacy.load_targets=load_targets"},{"line":53,"text":"legacy.backup_target=backup_target"},{"line":58,"text":"d=legacy.default_targets()"},{"line":59,"text":"if not isinstance(d,list) or len(d)<28: raise RuntimeError('LEGACY_DEFAULT_TARGET_COUNT')"},{"line":61,"text":"if {t.get('logical_id') for t in d if isinstance(t,dict) and t.get('green1')}!=want: raise RuntimeError('LEGACY_DEFAULT_GREEN_SET')"},{"line":70,"text":"base=canonical_targets(); eff=load_targets()"},{"line":71,"text":"if len(eff)!=29 or sum(1 for x in eff if x.get('logical_id')==CT_ID)!=1: raise RuntimeError('EFFECTIVE_TARGETS')"},{"line":72,"text":"legacy_rows,ct=driver.partition_targets(eff)"},{"line":73,"text":"if [x['logical_id'] for x in legacy_rows]!=list(LEGACY_IDS) or ct.get('vmid')!=112: raise RuntimeError('REPRESENTATIVE_PARTITION')"}],"path":"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/wrapper.py","sha256":"2b5eb4fc0f6f466a0d3e5a007af987092b6c17baa3ff9241a6afc2c2e97df1d5","size":5055},{"hits":[{"line":4,"text":"This module does not discover credentials, modify scheduler state, or implement the"},{"line":33,"text":"def _logical_id(target: Mapping[str, Any]) -> str:"},{"line":34,"text":"value=target.get('logical_id') if isinstance(target, Mapping) else None"},{"line":36,"text":"raise ContractError('TARGET_LOGICAL_ID')"},{"line":39,"text":"def partition_targets(targets: Iterable[Mapping[str, Any]]):"},{"line":42,"text":"for target in targets:"},{"line":43,"text":"logical_id=_logical_id(target)"},{"line":44,"text":"if logical_id not in wanted:"},{"line":46,"text":"if logical_id in selected:"},{"line":47,"text":"raise ContractError('REPRESENTATIVE_TARGET_DUPLICATE')"},{"line":48,"text":"selected[logical_id]=target"},{"line":51,"text":"raise ContractError('REPRESENTATIVE_TARGET_MISSING')"},{"line":72,"text":"def write_state(logical_id,result,**kw):"},{"line":73,"text":"if logical_id not in LEGACY_IDS:"},{"line":74,"text":"raise ContractError('STATE_TARGET_FORBIDDEN')"},{"line":75,"text":"payload={'logical_id':logical_id,'result':result,'meta':kw,'schema_version':1}"},{"line":76,"text":"_atomic_json(root/(logical_id+'.json'),payload)"},{"line":79,"text":"def run_legacy_lane(engine, target: Mapping[str, Any]):"},{"line":80,"text":"logical_id=_logical_id(target)"},{"line":81,"text":"if logical_id not in LEGACY_IDS:"},{"line":82,"text":"raise ContractError('LEGACY_TARGET_FORBIDDEN')"},{"line":83,"text":"backup=getattr(engine,'backup_target',None)"},{"line":85,"text":"raise ContractError('ENGINE_BACKUP_TARGET_MISSING')"},{"line":91,"text":"return backup(target,True)"},{"line":98,"text":"if result.get('logical_id')!=CT112_ID or result.get('status')!='OK':"},{"line":106,"text":"def run_representative(engine, targets, ct112_callback: Callable[[Mapping[str, Any]], Any]):"},{"line":109,"text":"legacy,ct112=partition_targets(targets)"},{"line":111,"text":"for target in legacy:"},{"line":112,"text":"results.append(run_legacy_lane(engine,target))"}],"path":"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/representative_driver.py","sha256":"b3050a8f95e6d9826a4f0786cd3ca32012b6ab10486d10e4981b50b8a0affff2","size":4214},{"hits":[{"line":49,"text":"vmid=r.get('vmid')"},{"line":50,"text":"if type(vmid) is not int:raise RuntimeError('PVE_VMID_SCHEMA')"},{"line":51,"text":"configs[vmid]=_json_cmd(f\"/nodes/pve01/{r['type']}/{vmid}/config\")"},{"line":61,"text":"vmids=[j.get('vmid') for j in jobs if isinstance(j,dict)]"},{"line":62,"text":"if len(vmids)!=len(jobs) or len(vmids)!=len(set(vmids)):raise RuntimeError('CT112_PLAN_MEMBERSHIP')"},{"line":63,"text":"matches=[j for j in jobs if j.get('vmid')==112]"},{"line":74,"text":"def _assert_live_state_unchanged(before,after,vmid):"},{"line":79,"text":"if any(type(x) is not dict or type(x.get('vmid')) is not int for x in rows):raise RuntimeError('CT112_STATE_SCHEMA')"},{"line":80,"text":"return sorted((x['vmid'],x.get('type'),x.get('node'),x.get('status'),x.get('template')) for x in rows)"},{"line":83,"text":"a=[j for j in old if j.get('vmid')==vmid];b=[j for j in new if j.get('vmid')==vmid]"},{"line":119,"text":"def __init__(self,work,entries,binding,guard,deadline,logical_id):"},{"line":120,"text":"self.work=Path(work);self.entries=entries;self.binding=binding;self.guard=guard;self.deadline=deadline;self.logical_id=logical_id"},{"line":127,"text":"self.inner=large.ReadOnlyLarge(str(RCLONE),self.snapshot,e,bind,self.guard,self.work,self.deadline,self.logical_id)"},{"line":142,"text":"def run_target(target,state_writer=None):"},{"line":143,"text":"if not isinstance(target,dict) or target.get('logical_id')!=CT_ID or target.get('vmid')!=112:return (_ for _ in ()).throw(RuntimeError('CT112_DESCRIPTOR'))"}],"path":"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/ct112_handler.py","sha256":"8cac6e627d5e7abe5d3163cdd24911995a1e3f45c776f9373c2aa68784f5ec6c","size":10955},{"hits":[{"line":8,"text":"TARGETS_PATH=CONFIG_ROOT/'targets.json'"},{"line":21,"text":"ROUTER_TARGET_SHA='4f9da1283166a1e9f4e6bc7dd240c76aef85772177f717f92abb6e8e2bb8de90'"},{"line":132,"text":"def remote_generation_path(scope,logical_id,generation):"},{"line":134,"text":"for x in (scope,logical_id,generation):"},{"line":136,"text":"return f'homelab-backups/v2/{scope}/{logical_id}/generations/{generation}'"},{"line":138,"text":"def make_manifest(scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta):"},{"line":142,"text":"return {'schema':2,'scope':scope,'logical_id':logical_id,'generation':generation,'created_at_utc':utcnow(),"},{"line":149,"text":"def default_targets():"},{"line":150,"text":"d=86400"},{"line":153,"text":"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')]:"},{"line":154,"text":"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})"},{"line":156,"text":"out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})"},{"line":158,"text":"{'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'85.121.4.192','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},"},{"line":159,"text":"{'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'185.225.35.6','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},"},{"line":160,"text":"{'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'46.16.34.129','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh/fePUci42dfY58I6q0lFiiPHn0/M+mckypmE','due_seconds':d,'enabled':True,'green1':True},"},{"line":161,"text":"{'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},"},{"line":171,"text":"for slug,vmid,node,root,db,strategy in sites:"},{"line":172,"text":"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')})"},{"line":173,"text":"out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})"},{"line":176,"text":"def choose_due_target(targets,state,now=None):"},{"line":179,"text":"for t in targets:"},{"line":180,"text":"if not t.get('enabled',True): continue"},{"line":181,"text":"due=max(1,int(t.get('due_seconds',86400)))"},{"line":182,"text":"last=int(state.get(t['logical_id'],{}).get('last_success_epoch',0))"},{"line":184,"text":"if last==0 or age>=due: c.append((-(age/due),last,t['logical_id'],t))"},{"line":236,"text":"def load_targets():"},{"line":237,"text":"j=json.loads(TARGETS_PATH.read_text())"},{"line":238,"text":"if j.get('schema')!=1 or not isinstance(j.get('targets'),list): raise BackupError('TARGET_MANIFEST_SCHEMA')"},{"line":239,"text":"ids=[x.get('logical_id') for x in j['targets']]"},{"line":240,"text":"if len(ids)!=len(set(ids)): raise BackupError('TARGET_MANIFEST_DUPLICATE')"},{"line":241,"text":"return j['targets']"},{"line":249,"text":"j=json.loads(p.read_text()); d[j['logical_id']]=j"},{"line":253,"text":"def write_state(logical_id,result,**kw):"},{"line":255,"text":"j={'schema':1,'logical_id':logical_id,'result':result,'updated_at_utc':utcnow(),**kw}"},{"line":257,"text":"atomic_write(STATE_ROOT/'state'/(logical_id+'.json'),canonical_json(j)+b'\\n',0o600)"},{"line":280,"text":"def remote_exists_any(scope,logical_id,generation):"},{"line":281,"text":"rel=remote_generation_path(scope,logical_id,generation)"},{"line":328,"text":"def generation_id(logical_id):"},{"line":330,"text":"return f'v2-{logical_id}-{ts}-{os.urandom(6).hex()}'"},{"line":335,"text":"gen=source_meta['generation']; rel=remote_generation_path(t['scope'],t['logical_id'],gen)"},{"line":336,"text":"if remote_exists_any(t['scope'],t['logical_id'],gen): raise BackupError('GENERATION_COLLISION')"},{"line":339,"text":"manifest=make_manifest(t['scope'],t['logical_id'],gen,n,psha,parts,reps,source_meta)"},{"line":350,"text":"seal={'schema':1,'generation':gen,'logical_id':t['logical_id'],'manifest_sha256':msha,'payload_sha256':psha,'status':'SEALED','sealed_at_utc':utcnow()}"},{"line":359,"text":"rel=remote_generation_path(manifest['scope'],manifest['logical_id'],manifest['generation'])"},{"line":392,"text":"if t['guest_type']=='lxc': validate_tar_zst(path)"},{"line":415,"text":"def _pve_dumpdir_spec(guest_type):"},{"line":416,"text":"if guest_type=='lxc': return (0o710,100000)"},{"line":417,"text":"if guest_type=='qemu': return (0o700,0)"},{"line":418,"text":"raise BackupError('PVE_GUEST_TYPE_DRIFT')"},{"line":449,"text":"return {'vmid':int(t['vmid']),'id':int(t['vmid']),'type':'lxc','kind':'lxc','guest_type':'lxc','node':node,'status':row.get('status'),'name':row.get('name',''),"},{"line":464,"text":"if pathlib.Path(argv[0]).name!='vzdump' or str(int(t['vmid'])) not in argv: raise BackupError('PROVEN_DUMP_ARGV_TARGET')"},{"line":475,"text":"def _default_unprivileged_lxc(node,vmid):"},{"line":476,"text":"q=ssh_remote(node,['pct','config',str(vmid)],timeout=30)"},{"line":506,"text":"vmid=int(t['vmid']); rows=[r for r in cluster_inventory() if int(r.get('vmid',-1))==vmid]"},{"line":509,"text":"if typ!=t['guest_type']: raise BackupError('PVE_GUEST_TYPE_DRIFT')"},{"line":512,"text":"_default_unprivileged_lxc(node,vmid)"},{"line":526,"text":"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"},{"line":531,"text":"ssh_remote(node,['vzdump',str(vmid),'--mode','snapshot','--compress','zstd','--dumpdir',srcdir],timeout=7200)"},{"line":541,"text":"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}"},{"line":565,"text":"def ensure_vps_known_hosts(targets):"},{"line":567,"text":"for t in targets:"},{"line":585,"text":"def bootstrap_vps_keys(targets):"},{"line":587,"text":"ensure_vps_known_hosts(targets)"},{"line":590,"text":"for t in targets:"},{"line":594,"text":"results[t['logical_id']]='ALREADY_OPERATOR_KEY'; continue"},{"line":601,"text":"results[t['logical_id']]=tag"},{"line":603,"text":"us=[x for x in targets if x['type']=='vps_us'][0]"},{"line":605,"text":"results[us['logical_id']]='ALREADY_US_OPERATOR_KEY'"},{"line":621,"text":"return payload,{'generation':gen,'source_class':'vps_md','consistency':'FILESET_PRE_POST_HASH_STABILITY','hashset_sha256':pre},None"},{"line":631,"text":"return payload,{'generation':gen,'source_class':'vps_spb','consistency':'STATIC_CONFIG_FILESET_PRE_POST_HASH_STABILITY','tls_recovery':'REISSUE_TLS_ON_RESTORE','hashset_sha256':pre},None"},{"line":666,"text":"return payload,{'generation':gen,'source_class':'vps_us','consistency':'SQLITE_ONLINE_BACKUP_PLUS_NONDB_FILES','sqlite_count':4},None"},{"line":742,"text":"hits=[ip for ip in ips if sha256_bytes(ip.encode())==ROUTER_TARGET_SHA]"},{"line":743,"text":"if len(hits)!=1: raise BackupError('ROUTER_TARGET_PARSE')"},{"line":744,"text":"target=hits[0]"},{"line":753,"text":"return target,safe[0]"},{"line":783,"text":"target,pf=parse_router_legacy()"},{"line":800,"text":"return payload,{'generation':gen,'source_class':'router','config_sha256':sha256_bytes(a),'read_count':2,'recovery_policy':'IMPORT_PACKAGE_OR_SAFE_CLI_NOT_BLIND_CONFIG_REPLACE'},None"},{"line":802,"text":"def qga_exec(node,vmid,guest_argv,input_bytes=None,timeout=600):"},{"line":803,"text":"args=['qm','guest','exec',str(vmid),'--synchronous','1','--timeout',str(int(timeout))]"},{"line":821,"text":"out=qga_exec(t['node'],t['vmid'],['/usr/bin/python3','-I','-B','-'],xf_guest_builder(t,gen).encode(),timeout=900)"},{"line":833,"text":"b64=qga_exec(t['node'],t['vmid'],['/usr/bin/python3','-I','-B','-c',code,path,str(off),str(take)],None,timeout=60).strip()"},{"line":841,"text":"qga_exec(t['node'],t['vmid'],['/usr/bin/rm','-f',path],None,timeout=30)"},{"line":846,"text":"return local,{'generation':gen,'source_class':'xenforo','site':t['slug'],'vmid':t['vmid'],'node':t['node'],'dump_strategy':t['dump_strategy'],'db_dump_bytes':j.get('db_bytes')},None"},{"line":869,"text":"return payload,{'generation':gen,'source_class':'pve_node_bundle','node':node,'recovery_policy':'CLEAN_INSTALL_JOIN_RECONCILE_NOT_BLIND_PMXCFS_OVERWRITE','member_roots':len(paths)},None"},{"line":871,"text":"def capture_target(t,gen,work):"},{"line":900,"text":"write_state(t['logical_id'],'SUCCESS',generation=gen,verification='existing_control_engine_verify',last_success_epoch=epoch())"},{"line":901,"text":"return {'logical_id':t['logical_id'],'generation':gen,'result':'SUCCESS','payload_bytes':0,'replicas':2}"},{"line":903,"text":"def backup_target(t,green_verify=False):"},{"line":905,"text":"gen=generation_id(t['logical_id']); work=ensure_dir(WORK_ROOT/gen,0o700)"},{"line":908,"text":"payload,meta,cleanup=capture_target(t,gen,work); meta['generation']=gen"},{"line":921,"text":"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())"},{"line":922,"text":"return {'logical_id':t['logical_id'],'generation':gen,'result':'SUCCESS','payload_bytes':manifest['payload_bytes'],'replicas':2,'allocator_healthy':alloc['healthy']}"},{"line":925,"text":"write_state(t['logical_id'],result,generation=gen,reason=e.code,sealed=sealed)"},{"line":929,"text":"targets=load_targets(); chosen=[t for t in targets if t.get('green1')]"},{"line":931,"text":"boots=bootstrap_vps_keys(targets)"},{"line":936,"text":"key=re.sub(r'[^A-Za-z0-9]+','_',t['logical_id']).upper()"},{"line":938,"text":"r=backup_target(t,green_verify=(t['type']!='control'))"},{"line":945,"text":"failures.append((t['logical_id'],e.code)); print(f'{label}_{key}=FAIL'); print(f'{label}_{key}_REASON={e.code}')"},{"line":946,"text":"print(f'{label}_TARGET_COUNT={len(chosen)}')"},{"line":949,"text":"print(f'{label}_CLOUD_BACKUP_TARGET_COUNT={sum(1 for t in chosen if t[\"type\"]!=\"control\")}')"},{"line":950,"text":"print(f'{label}_CONTROL_VERIFY_TARGET_COUNT={sum(1 for t in chosen if t[\"type\"]==\"control\")}')"},{"line":951,"text":"if failures: raise BackupError(label+'_TARGET_FAILURES',','.join(x[0] for x in failures))"},{"line":956,"text":"targets=load_targets(); state=load_state_all(); t=choose_due_target(targets,state)"},{"line":958,"text":"print('SCHEDULE_DECISION=DEFER_NO_DUE_TARGET'); return 0"},{"line":959,"text":"print('SCHEDULE_TARGET='+t['logical_id'])"},{"line":960,"text":"try: backup_target(t,green_verify=False)"},{"line":965,"text":"def discover(logical_id):"},{"line":966,"text":"targets=load_targets(); m={t['logical_id']:t for t in targets}"},{"line":967,"text":"if logical_id not in m: raise BackupError('DISCOVER_UNKNOWN_TARGET')"},{"line":968,"text":"t=m[logical_id]; prefix=f'homelab-backups/v2/{t[\"scope\"]}/{logical_id}/generations'"},{"line":983,"text":"print('DISCOVER_LOGICAL_ID='+logical_id); print('DISCOVER_TWO_PHYSICAL_SEALED_COUNT='+str(len(good)))"},{"line":990,"text":"assert len(default_targets())>=28"},{"line":991,"text":"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'}"},{"line":998,"text":"av,_=proven_lxc_dump_argv({'vmid':112},{'maxdisk':8350298112,'maxmem':536870912,'status':'running','name':'unbound1'},'pve01','/var/tmp/homelab-vzdump-selftest')"}],"path":"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/legacy_engine.py","sha256":"b6e79f087b9f1d21dac4f77a7b46b743299bbb85bc716e80d2ea67c2e038bcd7","size":59719},{"hits":[{"line":76,"text":"need(g['vmid'] in configs,'GUEST_CONFIG_MISSING')"},{"line":77,"text":"original=configs[g['vmid']];cfg=normalized_config(original);summary=np.config_summary(cfg,g['type'])"},{"line":96,"text":"if st is None or st['active'] is not True or st['enabled'] is not True:block.add('STORAGE_NOT_AVAILABLE')"},{"line":124,"text":"need(type(job.get('vmid')) is int and 100<=job['vmid']<=999999999,'VMID')"},{"line":135,"text":"return [str(executable),str(job['vmid']),'--node',job['node'],'--mode','snapshot','--stdout','1',"},{"line":153,"text":"need(type(seconds) in (int,float) and 00,'QEMU_VMID')"},{"line":21,"text":"pat=re.compile(r'^vzdump-qemu-'+re.escape(str(vmid))+r'-(\\d{4}_\\d{2}_\\d{2}-\\d{2}_\\d{2}_\\d{2})\\.vma\\.zst$')"},{"line":29,"text":"expected_log=parent/f'vzdump-qemu-{vmid}-{stamp}.log'"},{"line":42,"text":"if t.get('guest_type')!='qemu': return original(t,gen,work)"},{"line":43,"text":"vmid=int(t['vmid']); rows=[r for r in legacy.cluster_inventory() if int(r.get('vmid',-1))==vmid]"},{"line":46,"text":"_need(typ==t.get('guest_type')=='qemu','PVE_GUEST_TYPE_DRIFT')"},{"line":51,"text":"vp=legacy.ssh_remote(node,['vzdump',str(vmid),'--mode','snapshot','--compress','zstd','--dumpdir',srcdir],timeout=7200,check=False)"},{"line":53,"text":"_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)"},{"line":58,"text":"try: src,log=_select_qemu_outputs(vmid,files)"},{"line":60,"text":"_emit_diag(vmid=vmid,node=node,producer_rc=0,regular_file_count=len(files),archive_selected=False,selector_error=str(e))"},{"line":71,"text":"_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)"},{"line":75,"text":"meta={'generation':gen,'source_class':'pve_guest','vmid':vmid,'guest_type':'qemu','node':node,'status':row.get('status'),"}],"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","sha256":"1906db42bd34bbe85eb46fd9797b3572d46e0a41c29d1c29be5f9df5e448f15b","size":4627},{"hits":[{"line":47,"text":"if not (type(seconds) is int and 00,'SCHEDULER_TARGET_SCHEMA')"},{"line":75,"text":"def write_state(logical_id,result,**kw):"},{"line":77,"text":"prior=_read_prior(legacy,logical_id)"},{"line":81,"text":"return original_write(logical_id,result,**clean)"},{"line":88,"text":"return original_write(logical_id,result,**clean)"},{"line":90,"text":"legacy.choose_due_target=choose_due_target"},{"line":92,"text":"return {'choose_due_target':choose_due_target,'write_state':write_state,"}],"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","sha256":"a6f67159a64067773323f028126e3109e15cf17a8142cea5e6129970f1d4da96","size":4097}] +RPO_SCHEDULER_POLICY_MISMATCH=[{"due_seconds":86400,"enabled":true,"logical_id":"ct112","vmid":112},{"due_seconds":86400,"enabled":true,"logical_id":"guest-pve01-lxc-112","vmid":112},{"due_seconds":86400,"enabled":true,"logical_id":"ct113","vmid":113},{"due_seconds":86400,"enabled":true,"logical_id":"vm130","vmid":130},{"due_seconds":86400,"enabled":true,"logical_id":"vm150","vmid":150},{"due_seconds":86400,"enabled":true,"logical_id":"vm160","vmid":160},{"due_seconds":86400,"enabled":true,"logical_id":"xf-codevipe","vmid":160},{"due_seconds":86400,"enabled":true,"logical_id":"xf-dsmods","vmid":160},{"due_seconds":86400,"enabled":true,"logical_id":"xf-kingofwolk","vmid":160},{"due_seconds":86400,"enabled":true,"logical_id":"xf-gamevipe","vmid":160},{"due_seconds":86400,"enabled":true,"logical_id":"xf-hkmods","vmid":160},{"due_seconds":86400,"enabled":true,"logical_id":"xf-zakrutim","vmid":160}] +DECISION=TARGET_CARDINALITY_OR_MODEL_DRIFT +NO_MUTATION=true +TASK_RESULT=PASS_HOMELAB_BACKUP_DUE_POLICY_SOURCE_RCA_READONLY +HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-SOURCE-RCA-READONLY-1105R1","rollback_restored":null,"rollback_started":false,"status":"OK","version":1} +WORKERS2_DUE_POLICY_SOURCE_RCA_END=1 + +OUTPUT_END +CHAT_OUTPUT_END diff --git a/runtime/latest.json b/runtime/latest.json index bc0acdca..997eb3d7 100644 --- a/runtime/latest.json +++ b/runtime/latest.json @@ -1,19 +1,19 @@ { "schema_version": 1, "channel": "homelab-runtime", - "command_id": "SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-PARAGRAPH-NORMALIZATION-READONLY-897R1", + "command_id": "SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-SOURCE-RCA-READONLY-1105R1", "status": "OK", "rc": 0, "host": "pve01", "mode": "read-only", - "component": "pvepro-editorial-batch-c-paragraph-normalization", - "started_at_utc": "2026-09-21T21:20:47Z", - "finished_at_utc": "2026-09-21T21:20:49Z", + "component": "homelab-backup-due-policy-source-rca", + "started_at_utc": "2026-09-21T21:21:23Z", + "finished_at_utc": "2026-09-21T21:21:23Z", "reference_register_checked": true, "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", "error_register_checked": true, "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", - "command_sha256": "863dd1d794de111a15f821aff91c8dafb24a18cb058087aa8d40d6e60cbca713", + "command_sha256": "1cadad9a6c87f4c1dde8d879a103f7f85e6d2cdaa3f513448c7045a73e90beb4", "duplicate_failed_command_blocked": false, "block_reason": null, "execution_started": true, @@ -30,9 +30,9 @@ "secrets_included": false, "private_addresses_included": false, "raw_evidence_retained_locally": true, - "raw_evidence_sha256": "79503e32fa2e02c3692b8c45f1c6254a337dc472303d03fb28b006d97131fda4", - "sanitized_output_sha256": "79503e32fa2e02c3692b8c45f1c6254a337dc472303d03fb28b006d97131fda4", + "raw_evidence_sha256": "a5f6bceb256d00dacd3d15ee23e2f737b60089e6232680050e589a1f84edc3c2", + "sanitized_output_sha256": "a5f6bceb256d00dacd3d15ee23e2f737b60089e6232680050e589a1f84edc3c2", "output_truncated_in_json": false, "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", - "output": "PVEPRO897_BEGIN=true\nCOMMAND_ID=SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-PARAGRAPH-NORMALIZATION-READONLY-897R1\nSCOPE=READ_ONLY_BATCH_C_PARAGRAPH_NORMALIZATION_PROVENANCE\nAUTHORITY={\"ERROR_REGISTER\":{\"bytes\":302058,\"expected_sha256\":\"3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0\",\"match\":true,\"sha256\":\"3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0\"},\"REFERENCE\":{\"bytes\":201129,\"expected_sha256\":\"5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66\",\"match\":true,\"sha256\":\"5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66\"}}\nPRODUCTION_HOST={\"name\":\"pvepro-prod\",\"node\":\"pve01\",\"status\":\"running\",\"vmid\":100}\nQGA_TRANSPORT={\"rc\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"}\nQGA_CONTRACT={\"err_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"err_truncated\":null,\"exitcode\":0,\"exited\":1,\"out_truncated\":0}\nPARAGRAPH_NORMALIZATION_RECONCILE={\"blank_line_count_6of9\":true,\"compact_chars_match_9of9\":true,\"compact_hash_match_9of9\":false,\"compact_words_match_9of9\":true,\"reason\":\"PARAGRAPH_STRUCTURE_PROVEN_HASH_SEMANTICS_UNRESOLVED\",\"result\":\"HOLD\",\"target_ids\":[31,32,33,34,35,36,37,38,39],\"targets\":[{\"blank_line_count\":6,\"collapse_chars\":731,\"collapse_chars_match\":true,\"collapse_hash_match\":false,\"collapse_sha256\":\"1c8ce8fa9161190951ce20e702317728479bfc6b7bca5f9a9be0a7eaacbd9d7a\",\"compact_chars\":731,\"compact_chars_match\":true,\"compact_hash_match\":false,\"compact_sha256\":\"1c8ce8fa9161190951ce20e702317728479bfc6b7bca5f9a9be0a7eaacbd9d7a\",\"compact_words\":83,\"compact_words_match\":true,\"first_post_id\":31,\"forum\":\"PVEPro AI Lab\",\"historical_719\":{\"chars\":731,\"sha256\":\"aba65fce05dad18fd302c9486d96c5845ede9e883b6c9138fcf4896ba7d59145\",\"words\":83},\"line_count\":19,\"node_id\":15,\"nonblank_line_count\":13,\"raw_chars\":737,\"raw_sha256\":\"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f\",\"raw_words\":83,\"reply_count\":0,\"sticky\":0,\"thread_id\":31,\"title\":\"[Private AI] RAG \\u043f\\u043e \\u0432\\u043d\\u0443\\u0442\\u0440\\u0435\\u043d\\u043d\\u0438\\u043c \\u0440\\u0435\\u0433\\u043b\\u0430\\u043c\\u0435\\u043d\\u0442\\u0430\\u043c\"},{\"blank_line_count\":6,\"collapse_chars\":717,\"collapse_chars_match\":true,\"collapse_hash_match\":false,\"collapse_sha256\":\"1147d25667b076000930cddbd0712af742d786638763f773dd92eb6337125af6\",\"compact_chars\":717,\"compact_chars_match\":true,\"compact_hash_match\":false,\"compact_sha256\":\"1147d25667b076000930cddbd0712af742d786638763f773dd92eb6337125af6\",\"compact_words\":84,\"compact_words_match\":true,\"first_post_id\":32,\"forum\":\"PVEPro AI Lab\",\"historical_719\":{\"chars\":717,\"sha256\":\"66329dfcce09a3f655f25f67045a5528b838614eb43ad29b88f3288602e21fcb\",\"words\":84},\"line_count\":19,\"node_id\":15,\"nonblank_line_count\":13,\"raw_chars\":723,\"raw_sha256\":\"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a\",\"raw_words\":84,\"reply_count\":0,\"sticky\":0,\"thread_id\":32,\"title\":\"[Private AI] \\u041b\\u043e\\u043a\\u0430\\u043b\\u044c\\u043d\\u0430\\u044f \\u0442\\u0440\\u0430\\u043d\\u0441\\u043a\\u0440\\u0438\\u0431\\u0430\\u0446\\u0438\\u044f \\u0432\\u0441\\u0442\\u0440\\u0435\\u0447\"},{\"blank_line_count\":6,\"collapse_chars\":750,\"collapse_chars_match\":true,\"collapse_hash_match\":false,\"collapse_sha256\":\"621bbb0409e7fc5f9d2977e262984ac62a224825ba13e2abf109a449043dcdc5\",\"compact_chars\":750,\"compact_chars_match\":true,\"compact_hash_match\":false,\"compact_sha256\":\"621bbb0409e7fc5f9d2977e262984ac62a224825ba13e2abf109a449043dcdc5\",\"compact_words\":91,\"compact_words_match\":true,\"first_post_id\":33,\"forum\":\"PVEPro AI Lab\",\"historical_719\":{\"chars\":750,\"sha256\":\"ade466868849f37253f6eb05e1c71f7466e6c26a3db05119ab56c73a580202a6\",\"words\":91},\"line_count\":19,\"node_id\":15,\"nonblank_line_count\":13,\"raw_chars\":756,\"raw_sha256\":\"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10\",\"raw_words\":91,\"reply_count\":0,\"sticky\":0,\"thread_id\":33,\"title\":\"[Private AI] \\u0410\\u0433\\u0435\\u043d\\u0442 \\u0441 \\u0434\\u043e\\u0441\\u0442\\u0443\\u043f\\u043e\\u043c \\u043a CRM\"},{\"blank_line_count\":6,\"collapse_chars\":701,\"collapse_chars_match\":true,\"collapse_hash_match\":false,\"collapse_sha256\":\"5a9dc36fbe84435f916dfd4a6e04671ab33876cf65c9c587fc82ccd99938be52\",\"compact_chars\":701,\"compact_chars_match\":true,\"compact_hash_match\":false,\"compact_sha256\":\"5a9dc36fbe84435f916dfd4a6e04671ab33876cf65c9c587fc82ccd99938be52\",\"compact_words\":81,\"compact_words_match\":true,\"first_post_id\":34,\"forum\":\"\\u0416\\u0435\\u043b\\u0435\\u0437\\u043e \\u0438 \\u043f\\u043b\\u043e\\u0449\\u0430\\u0434\\u043a\\u0438\",\"historical_719\":{\"chars\":701,\"sha256\":\"31accb654aa518f680f9dca2f043342094d2158ddf4704f4233cef35f43c5cda\",\"words\":81},\"line_count\":19,\"node_id\":16,\"nonblank_line_count\":13,\"raw_chars\":707,\"raw_sha256\":\"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade\",\"raw_words\":81,\"reply_count\":0,\"sticky\":0,\"thread_id\":34,\"title\":\"[\\u041f\\u043b\\u043e\\u0449\\u0430\\u0434\\u043a\\u0430] Mini-PC cluster vs tower server\"},{\"blank_line_count\":6,\"collapse_chars\":673,\"collapse_chars_match\":true,\"collapse_hash_match\":false,\"collapse_sha256\":\"3be1a7d2307536637c531a35184b2dfd5e81296a1da3690c0bff0d1a47c45403\",\"compact_chars\":673,\"compact_chars_match\":true,\"compact_hash_match\":false,\"compact_sha256\":\"3be1a7d2307536637c531a35184b2dfd5e81296a1da3690c0bff0d1a47c45403\",\"compact_words\":77,\"compact_words_match\":true,\"first_post_id\":35,\"forum\":\"\\u0416\\u0435\\u043b\\u0435\\u0437\\u043e \\u0438 \\u043f\\u043b\\u043e\\u0449\\u0430\\u0434\\u043a\\u0438\",\"historical_719\":{\"chars\":673,\"sha256\":\"c8a1a0db8103ad40279d271c8006e3d1dadee6507730ba30155cc97dbe96383d\",\"words\":77},\"line_count\":19,\"node_id\":16,\"nonblank_line_count\":13,\"raw_chars\":679,\"raw_sha256\":\"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6\",\"raw_words\":77,\"reply_count\":0,\"sticky\":0,\"thread_id\":35,\"title\":\"[\\u041f\\u043b\\u043e\\u0449\\u0430\\u0434\\u043a\\u0430] NVMe mirror vs RAIDZ\"},{\"blank_line_count\":6,\"collapse_chars\":754,\"collapse_chars_match\":true,\"collapse_hash_match\":false,\"collapse_sha256\":\"f7b9faef776bdb02cc683c62bcd38f521cac4c823adca1dfa4a25ee009d8c134\",\"compact_chars\":754,\"compact_chars_match\":true,\"compact_hash_match\":false,\"compact_sha256\":\"f7b9faef776bdb02cc683c62bcd38f521cac4c823adca1dfa4a25ee009d8c134\",\"compact_words\":84,\"compact_words_match\":true,\"first_post_id\":36,\"forum\":\"\\u0416\\u0435\\u043b\\u0435\\u0437\\u043e \\u0438 \\u043f\\u043b\\u043e\\u0449\\u0430\\u0434\\u043a\\u0438\",\"historical_719\":{\"chars\":754,\"sha256\":\"e90d204f73c7ee5ad1ffb7f227f1cdd64bad69f5fa978f078b79ac89045ae287\",\"words\":84},\"line_count\":19,\"node_id\":16,\"nonblank_line_count\":13,\"raw_chars\":760,\"raw_sha256\":\"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26\",\"raw_words\":84,\"reply_count\":0,\"sticky\":0,\"thread_id\":36,\"title\":\"[\\u041f\\u043b\\u043e\\u0449\\u0430\\u0434\\u043a\\u0430] \\u041f\\u0435\\u0440\\u0435\\u043d\\u043e\\u0441\\u0438\\u043c\\u043e\\u0441\\u0442\\u044c home-lab \\u2192 hosting/cloud\"},{\"blank_line_count\":6,\"collapse_chars\":737,\"collapse_chars_match\":true,\"collapse_hash_match\":false,\"collapse_sha256\":\"8cc9eb49bde332044bf49cc65b46253c806ef6f9b8c96f87a0e007069e9e1424\",\"compact_chars\":737,\"compact_chars_match\":true,\"compact_hash_match\":false,\"compact_sha256\":\"8cc9eb49bde332044bf49cc65b46253c806ef6f9b8c96f87a0e007069e9e1424\",\"compact_words\":85,\"compact_words_match\":true,\"first_post_id\":37,\"forum\":\"\\u0417\\u0430\\u043f\\u0440\\u043e\\u0441\\u044b \\u043d\\u0430 \\u0432\\u043d\\u0435\\u0434\\u0440\\u0435\\u043d\\u0438\\u0435\",\"historical_719\":{\"chars\":737,\"sha256\":\"17c2a8f3e11adff49fdd2c2184b0286796dca4dde755b06b9ee75f1ede52e3c1\",\"words\":85},\"line_count\":19,\"node_id\":17,\"nonblank_line_count\":13,\"raw_chars\":743,\"raw_sha256\":\"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d\",\"raw_words\":85,\"reply_count\":0,\"sticky\":0,\"thread_id\":37,\"title\":\"[\\u041f\\u0440\\u0438\\u043c\\u0435\\u0440 \\u0437\\u0430\\u043f\\u0440\\u043e\\u0441\\u0430] \\u0410\\u0443\\u0434\\u0438\\u0442 backup \\u0437\\u0430 \\u043e\\u0434\\u0438\\u043d \\u0440\\u0430\\u0431\\u043e\\u0447\\u0438\\u0439 \\u0434\\u0435\\u043d\\u044c\"},{\"blank_line_count\":6,\"collapse_chars\":714,\"collapse_chars_match\":true,\"collapse_hash_match\":false,\"collapse_sha256\":\"88b7fd7e56be026eeb6a8469b272b0da73b9bdb30ce360176b44b22cd5f4e6ff\",\"compact_chars\":714,\"compact_chars_match\":true,\"compact_hash_match\":false,\"compact_sha256\":\"88b7fd7e56be026eeb6a8469b272b0da73b9bdb30ce360176b44b22cd5f4e6ff\",\"compact_words\":82,\"compact_words_match\":true,\"first_post_id\":38,\"forum\":\"\\u0417\\u0430\\u043f\\u0440\\u043e\\u0441\\u044b \\u043d\\u0430 \\u0432\\u043d\\u0435\\u0434\\u0440\\u0435\\u043d\\u0438\\u0435\",\"historical_719\":{\"chars\":714,\"sha256\":\"7b86c826cf409f59d38de25ad742d7c14bcfbdf567410e5087aacc3cd91b603a\",\"words\":82},\"line_count\":19,\"node_id\":17,\"nonblank_line_count\":13,\"raw_chars\":720,\"raw_sha256\":\"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55\",\"raw_words\":82,\"reply_count\":0,\"sticky\":0,\"thread_id\":38,\"title\":\"[\\u041f\\u0440\\u0438\\u043c\\u0435\\u0440 \\u0437\\u0430\\u043f\\u0440\\u043e\\u0441\\u0430] Private AI \\u0434\\u043b\\u044f 20 \\u0441\\u043e\\u0442\\u0440\\u0443\\u0434\\u043d\\u0438\\u043a\\u043e\\u0432\"},{\"blank_line_count\":6,\"collapse_chars\":690,\"collapse_chars_match\":true,\"collapse_hash_match\":false,\"collapse_sha256\":\"2b75f9a49ec648c40aeb4d0cfdf3ee9a43689243bcbd06695927eabc629be12b\",\"compact_chars\":690,\"compact_chars_match\":true,\"compact_hash_match\":false,\"compact_sha256\":\"2b75f9a49ec648c40aeb4d0cfdf3ee9a43689243bcbd06695927eabc629be12b\",\"compact_words\":78,\"compact_words_match\":true,\"first_post_id\":39,\"forum\":\"\\u042d\\u043a\\u0441\\u043f\\u0435\\u0440\\u0442\\u044b PVEPro\",\"historical_719\":{\"chars\":690,\"sha256\":\"f9fe92236122229693a8fe5f10b7c0810079c4bb74ed7f82a44182e7faa64036\",\"words\":78},\"line_count\":19,\"node_id\":18,\"nonblank_line_count\":13,\"raw_chars\":696,\"raw_sha256\":\"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82\",\"raw_words\":78,\"reply_count\":0,\"sticky\":0,\"thread_id\":39,\"title\":\"[\\u042d\\u043a\\u0441\\u043f\\u0435\\u0440\\u0442] \\u041a\\u0430\\u043a \\u043e\\u043f\\u0438\\u0441\\u044b\\u0432\\u0430\\u0442\\u044c \\u043a\\u043e\\u043c\\u043f\\u0435\\u0442\\u0435\\u043d\\u0446\\u0438\\u0438 \\u0431\\u0435\\u0437 \\u0441\\u043f\\u0438\\u0441\\u043a\\u0430 \\u043b\\u043e\\u0433\\u043e\\u0442\\u0438\\u043f\\u043e\\u0432\"}]}\nPRODUCT_CHECKPOINTS_REMAINING=8\nCHECKPOINTS13_14_REMAIN_OPEN=true\nTASK_RESULT=HOLD_PVEPRO897_HASH_SEMANTICS_UNRESOLVED\nDECISION=HOLD_PVEPRO897_HASH_SEMANTICS_UNRESOLVED\nNEXT_GATE=RECONCILE_ONLY_PVEPRO719_BODY_SHA_SEMANTICS\nCHANGES_MADE_BY_897=false\nPRODUCT_MUTATION_BY_897=false\nVM_MUTATION_BY_897=false\nHOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-PARAGRAPH-NORMALIZATION-READONLY-897R1\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\nPVEPRO897_END=true\n" + "output": "WORKERS2_DUE_POLICY_SOURCE_RCA_BEGIN=1\nCOMMAND_ID=SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-SOURCE-RCA-READONLY-1105R1\nMODE=read-only\nCOMPONENT=homelab-backup-due-policy-source-rca\nMUTATION_BOUNDARY=READ_ONLY_NO_BACKUP_NO_SERVICE_START_NO_TIMER_CHANGE_NO_LOCK_BREAK_NO_FILE_WRITE_OUTSIDE_TMP_NO_GIT_WRITE\nIDENTITIES={\"base\":{\"exists\":true,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1\"},\"entry504\":{\"exists\":true,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"sha256\":\"ca6876fa9c3b1465b045344a8ad46962de16972c7dadc4ac6257c7d225047793\"},\"wrapper\":{\"exists\":true,\"path\":\"/usr/local/sbin/homelab-backup-v2\",\"sha256\":\"5077444065c732451cb84898680f62361b21a24ef9eb4f191253e82ead524ea2\"}}\nSELFTEST_REPLACEMENT486=PASS\nLIVE_WRAPPER_TARGETS=[{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"ct110\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":110},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"ct111\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":111},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"ct112\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":112},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"ct113\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":113},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm130\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":130},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm150\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":150},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm160\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm170\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":170},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm171\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":171},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm190\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":190},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm210\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":210},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm211\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":211},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm9130\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":9130},{\"due_seconds\":604800,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"node-pve01\",\"node\":\"pve01\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":null},{\"due_seconds\":604800,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"node-pve02\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":null},{\"due_seconds\":604800,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"node-pve03\",\"node\":\"pve03\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":null},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-codevipe\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-dsmods\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-kingofwolk\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-newfi\",\"node\":\"pve01\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":210},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-gamevipe\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-hkmods\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-zakrutim\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"guest-pve01-lxc-112\",\"node\":\"pve01\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":112}]\nSELECTED_VM_TARGETS=[{\"count\":2,\"rows\":[{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"ct112\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":112},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"guest-pve01-lxc-112\",\"node\":\"pve01\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":112}],\"vmid\":112},{\"count\":1,\"rows\":[{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"ct113\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":113}],\"vmid\":113},{\"count\":1,\"rows\":[{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm130\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":130}],\"vmid\":130},{\"count\":1,\"rows\":[{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm150\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":150}],\"vmid\":150},{\"count\":7,\"rows\":[{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm160\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-codevipe\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-dsmods\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-kingofwolk\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-gamevipe\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-hkmods\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-zakrutim\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160}],\"vmid\":160}]\nCURRENT_SCHEDULER_SELECTION_ERROR=AttributeError:module 'wrapper' has no attribute 'load_state_all'\nLIVE_WRAPPER_FUNCTION_HITS=[{\"function\":\"load_targets\",\"line\":1,\"text\":\"def load_targets():\"},{\"function\":\"load_targets\",\"line\":2,\"text\":\"base=canonical_targets();return base+[_ct_descriptor(base)]\"},{\"function\":\"backup_target\",\"line\":1,\"text\":\"def backup_target(t,green_verify=False):\"},{\"function\":\"backup_target\",\"line\":2,\"text\":\"if not isinstance(t,dict) or t.get('logical_id')!=CT_ID:\"},{\"function\":\"backup_target\",\"line\":3,\"text\":\"return _legacy_backup_target(t,green_verify)\"},{\"function\":\"backup_target\",\"line\":5,\"text\":\"r=ct112.run_target(t,state_writer=legacy.write_state)\"},{\"function\":\"backup_target\",\"line\":6,\"text\":\"return {'logical_id':CT_ID,'generation':r['generation'],'result':'SUCCESS','payload_bytes':r['payload_bytes'],\"}]\nDUE_POLICY_SOURCE_HITS=[{\"hits\":[{\"line\":18,\"text\":\"_legacy_load_targets=legacy.load_targets\"},{\"line\":19,\"text\":\"_legacy_backup_target=legacy.backup_target\"},{\"line\":21,\"text\":\"def canonical_targets():\"},{\"line\":22,\"text\":\"rows=_legacy_load_targets()\"},{\"line\":23,\"text\":\"if not isinstance(rows,list) or len(rows)!=28: raise legacy.BackupError('TARGET_REGISTRY_COUNT')\"},{\"line\":25,\"text\":\"ids=[x.get('logical_id') for x in out]\"},{\"line\":26,\"text\":\"if len(set(ids))!=28 or CT_ID in ids: raise legacy.BackupError('TARGET_REGISTRY_IDENTITY')\"},{\"line\":30,\"text\":\"xf=[x for x in rows if x.get('logical_id')=='xf-zakrutim']\"},{\"line\":32,\"text\":\"due=xf[0].get('due_seconds')\"},{\"line\":34,\"text\":\"return {'logical_id':CT_ID,'scope':'pve01 LXC 112 full-guest archive DR','type':'pve_guest','node':'pve01','vmid':112,\"},{\"line\":35,\"text\":\"'guest_type':'lxc','due_seconds':due,'enabled':True,'green1':True}\"},{\"line\":37,\"text\":\"def load_targets():\"},{\"line\":38,\"text\":\"base=canonical_targets();return base+[_ct_descriptor(base)]\"},{\"line\":40,\"text\":\"def backup_target(t,green_verify=False):\"},{\"line\":41,\"text\":\"if not isinstance(t,dict) or t.get('logical_id')!=CT_ID:\"},{\"line\":42,\"text\":\"return _legacy_backup_target(t,green_verify)\"},{\"line\":44,\"text\":\"r=ct112.run_target(t,state_writer=legacy.write_state)\"},{\"line\":45,\"text\":\"return {'logical_id':CT_ID,'generation':r['generation'],'result':'SUCCESS','payload_bytes':r['payload_bytes'],\"},{\"line\":52,\"text\":\"legacy.load_targets=load_targets\"},{\"line\":53,\"text\":\"legacy.backup_target=backup_target\"},{\"line\":58,\"text\":\"d=legacy.default_targets()\"},{\"line\":59,\"text\":\"if not isinstance(d,list) or len(d)<28: raise RuntimeError('LEGACY_DEFAULT_TARGET_COUNT')\"},{\"line\":61,\"text\":\"if {t.get('logical_id') for t in d if isinstance(t,dict) and t.get('green1')}!=want: raise RuntimeError('LEGACY_DEFAULT_GREEN_SET')\"},{\"line\":70,\"text\":\"base=canonical_targets(); eff=load_targets()\"},{\"line\":71,\"text\":\"if len(eff)!=29 or sum(1 for x in eff if x.get('logical_id')==CT_ID)!=1: raise RuntimeError('EFFECTIVE_TARGETS')\"},{\"line\":72,\"text\":\"legacy_rows,ct=driver.partition_targets(eff)\"},{\"line\":73,\"text\":\"if [x['logical_id'] for x in legacy_rows]!=list(LEGACY_IDS) or ct.get('vmid')!=112: raise RuntimeError('REPRESENTATIVE_PARTITION')\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/wrapper.py\",\"sha256\":\"2b5eb4fc0f6f466a0d3e5a007af987092b6c17baa3ff9241a6afc2c2e97df1d5\",\"size\":5055},{\"hits\":[{\"line\":4,\"text\":\"This module does not discover credentials, modify scheduler state, or implement the\"},{\"line\":33,\"text\":\"def _logical_id(target: Mapping[str, Any]) -> str:\"},{\"line\":34,\"text\":\"value=target.get('logical_id') if isinstance(target, Mapping) else None\"},{\"line\":36,\"text\":\"raise ContractError('TARGET_LOGICAL_ID')\"},{\"line\":39,\"text\":\"def partition_targets(targets: Iterable[Mapping[str, Any]]):\"},{\"line\":42,\"text\":\"for target in targets:\"},{\"line\":43,\"text\":\"logical_id=_logical_id(target)\"},{\"line\":44,\"text\":\"if logical_id not in wanted:\"},{\"line\":46,\"text\":\"if logical_id in selected:\"},{\"line\":47,\"text\":\"raise ContractError('REPRESENTATIVE_TARGET_DUPLICATE')\"},{\"line\":48,\"text\":\"selected[logical_id]=target\"},{\"line\":51,\"text\":\"raise ContractError('REPRESENTATIVE_TARGET_MISSING')\"},{\"line\":72,\"text\":\"def write_state(logical_id,result,**kw):\"},{\"line\":73,\"text\":\"if logical_id not in LEGACY_IDS:\"},{\"line\":74,\"text\":\"raise ContractError('STATE_TARGET_FORBIDDEN')\"},{\"line\":75,\"text\":\"payload={'logical_id':logical_id,'result':result,'meta':kw,'schema_version':1}\"},{\"line\":76,\"text\":\"_atomic_json(root/(logical_id+'.json'),payload)\"},{\"line\":79,\"text\":\"def run_legacy_lane(engine, target: Mapping[str, Any]):\"},{\"line\":80,\"text\":\"logical_id=_logical_id(target)\"},{\"line\":81,\"text\":\"if logical_id not in LEGACY_IDS:\"},{\"line\":82,\"text\":\"raise ContractError('LEGACY_TARGET_FORBIDDEN')\"},{\"line\":83,\"text\":\"backup=getattr(engine,'backup_target',None)\"},{\"line\":85,\"text\":\"raise ContractError('ENGINE_BACKUP_TARGET_MISSING')\"},{\"line\":91,\"text\":\"return backup(target,True)\"},{\"line\":98,\"text\":\"if result.get('logical_id')!=CT112_ID or result.get('status')!='OK':\"},{\"line\":106,\"text\":\"def run_representative(engine, targets, ct112_callback: Callable[[Mapping[str, Any]], Any]):\"},{\"line\":109,\"text\":\"legacy,ct112=partition_targets(targets)\"},{\"line\":111,\"text\":\"for target in legacy:\"},{\"line\":112,\"text\":\"results.append(run_legacy_lane(engine,target))\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/representative_driver.py\",\"sha256\":\"b3050a8f95e6d9826a4f0786cd3ca32012b6ab10486d10e4981b50b8a0affff2\",\"size\":4214},{\"hits\":[{\"line\":49,\"text\":\"vmid=r.get('vmid')\"},{\"line\":50,\"text\":\"if type(vmid) is not int:raise RuntimeError('PVE_VMID_SCHEMA')\"},{\"line\":51,\"text\":\"configs[vmid]=_json_cmd(f\\\"/nodes/pve01/{r['type']}/{vmid}/config\\\")\"},{\"line\":61,\"text\":\"vmids=[j.get('vmid') for j in jobs if isinstance(j,dict)]\"},{\"line\":62,\"text\":\"if len(vmids)!=len(jobs) or len(vmids)!=len(set(vmids)):raise RuntimeError('CT112_PLAN_MEMBERSHIP')\"},{\"line\":63,\"text\":\"matches=[j for j in jobs if j.get('vmid')==112]\"},{\"line\":74,\"text\":\"def _assert_live_state_unchanged(before,after,vmid):\"},{\"line\":79,\"text\":\"if any(type(x) is not dict or type(x.get('vmid')) is not int for x in rows):raise RuntimeError('CT112_STATE_SCHEMA')\"},{\"line\":80,\"text\":\"return sorted((x['vmid'],x.get('type'),x.get('node'),x.get('status'),x.get('template')) for x in rows)\"},{\"line\":83,\"text\":\"a=[j for j in old if j.get('vmid')==vmid];b=[j for j in new if j.get('vmid')==vmid]\"},{\"line\":119,\"text\":\"def __init__(self,work,entries,binding,guard,deadline,logical_id):\"},{\"line\":120,\"text\":\"self.work=Path(work);self.entries=entries;self.binding=binding;self.guard=guard;self.deadline=deadline;self.logical_id=logical_id\"},{\"line\":127,\"text\":\"self.inner=large.ReadOnlyLarge(str(RCLONE),self.snapshot,e,bind,self.guard,self.work,self.deadline,self.logical_id)\"},{\"line\":142,\"text\":\"def run_target(target,state_writer=None):\"},{\"line\":143,\"text\":\"if not isinstance(target,dict) or target.get('logical_id')!=CT_ID or target.get('vmid')!=112:return (_ for _ in ()).throw(RuntimeError('CT112_DESCRIPTOR'))\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/ct112_handler.py\",\"sha256\":\"8cac6e627d5e7abe5d3163cdd24911995a1e3f45c776f9373c2aa68784f5ec6c\",\"size\":10955},{\"hits\":[{\"line\":8,\"text\":\"TARGETS_PATH=CONFIG_ROOT/'targets.json'\"},{\"line\":21,\"text\":\"ROUTER_TARGET_SHA='4f9da1283166a1e9f4e6bc7dd240c76aef85772177f717f92abb6e8e2bb8de90'\"},{\"line\":132,\"text\":\"def remote_generation_path(scope,logical_id,generation):\"},{\"line\":134,\"text\":\"for x in (scope,logical_id,generation):\"},{\"line\":136,\"text\":\"return f'homelab-backups/v2/{scope}/{logical_id}/generations/{generation}'\"},{\"line\":138,\"text\":\"def make_manifest(scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta):\"},{\"line\":142,\"text\":\"return {'schema':2,'scope':scope,'logical_id':logical_id,'generation':generation,'created_at_utc':utcnow(),\"},{\"line\":149,\"text\":\"def default_targets():\"},{\"line\":150,\"text\":\"d=86400\"},{\"line\":153,\"text\":\"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')]:\"},{\"line\":154,\"text\":\"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})\"},{\"line\":156,\"text\":\"out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})\"},{\"line\":158,\"text\":\"{'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'85.121.4.192','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},\"},{\"line\":159,\"text\":\"{'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'185.225.35.6','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},\"},{\"line\":160,\"text\":\"{'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'46.16.34.129','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh/fePUci42dfY58I6q0lFiiPHn0/M+mckypmE','due_seconds':d,'enabled':True,'green1':True},\"},{\"line\":161,\"text\":\"{'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},\"},{\"line\":171,\"text\":\"for slug,vmid,node,root,db,strategy in sites:\"},{\"line\":172,\"text\":\"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')})\"},{\"line\":173,\"text\":\"out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})\"},{\"line\":176,\"text\":\"def choose_due_target(targets,state,now=None):\"},{\"line\":179,\"text\":\"for t in targets:\"},{\"line\":180,\"text\":\"if not t.get('enabled',True): continue\"},{\"line\":181,\"text\":\"due=max(1,int(t.get('due_seconds',86400)))\"},{\"line\":182,\"text\":\"last=int(state.get(t['logical_id'],{}).get('last_success_epoch',0))\"},{\"line\":184,\"text\":\"if last==0 or age>=due: c.append((-(age/due),last,t['logical_id'],t))\"},{\"line\":236,\"text\":\"def load_targets():\"},{\"line\":237,\"text\":\"j=json.loads(TARGETS_PATH.read_text())\"},{\"line\":238,\"text\":\"if j.get('schema')!=1 or not isinstance(j.get('targets'),list): raise BackupError('TARGET_MANIFEST_SCHEMA')\"},{\"line\":239,\"text\":\"ids=[x.get('logical_id') for x in j['targets']]\"},{\"line\":240,\"text\":\"if len(ids)!=len(set(ids)): raise BackupError('TARGET_MANIFEST_DUPLICATE')\"},{\"line\":241,\"text\":\"return j['targets']\"},{\"line\":249,\"text\":\"j=json.loads(p.read_text()); d[j['logical_id']]=j\"},{\"line\":253,\"text\":\"def write_state(logical_id,result,**kw):\"},{\"line\":255,\"text\":\"j={'schema':1,'logical_id':logical_id,'result':result,'updated_at_utc':utcnow(),**kw}\"},{\"line\":257,\"text\":\"atomic_write(STATE_ROOT/'state'/(logical_id+'.json'),canonical_json(j)+b'\\\\n',0o600)\"},{\"line\":280,\"text\":\"def remote_exists_any(scope,logical_id,generation):\"},{\"line\":281,\"text\":\"rel=remote_generation_path(scope,logical_id,generation)\"},{\"line\":328,\"text\":\"def generation_id(logical_id):\"},{\"line\":330,\"text\":\"return f'v2-{logical_id}-{ts}-{os.urandom(6).hex()}'\"},{\"line\":335,\"text\":\"gen=source_meta['generation']; rel=remote_generation_path(t['scope'],t['logical_id'],gen)\"},{\"line\":336,\"text\":\"if remote_exists_any(t['scope'],t['logical_id'],gen): raise BackupError('GENERATION_COLLISION')\"},{\"line\":339,\"text\":\"manifest=make_manifest(t['scope'],t['logical_id'],gen,n,psha,parts,reps,source_meta)\"},{\"line\":350,\"text\":\"seal={'schema':1,'generation':gen,'logical_id':t['logical_id'],'manifest_sha256':msha,'payload_sha256':psha,'status':'SEALED','sealed_at_utc':utcnow()}\"},{\"line\":359,\"text\":\"rel=remote_generation_path(manifest['scope'],manifest['logical_id'],manifest['generation'])\"},{\"line\":392,\"text\":\"if t['guest_type']=='lxc': validate_tar_zst(path)\"},{\"line\":415,\"text\":\"def _pve_dumpdir_spec(guest_type):\"},{\"line\":416,\"text\":\"if guest_type=='lxc': return (0o710,100000)\"},{\"line\":417,\"text\":\"if guest_type=='qemu': return (0o700,0)\"},{\"line\":418,\"text\":\"raise BackupError('PVE_GUEST_TYPE_DRIFT')\"},{\"line\":449,\"text\":\"return {'vmid':int(t['vmid']),'id':int(t['vmid']),'type':'lxc','kind':'lxc','guest_type':'lxc','node':node,'status':row.get('status'),'name':row.get('name',''),\"},{\"line\":464,\"text\":\"if pathlib.Path(argv[0]).name!='vzdump' or str(int(t['vmid'])) not in argv: raise BackupError('PROVEN_DUMP_ARGV_TARGET')\"},{\"line\":475,\"text\":\"def _default_unprivileged_lxc(node,vmid):\"},{\"line\":476,\"text\":\"q=ssh_remote(node,['pct','config',str(vmid)],timeout=30)\"},{\"line\":506,\"text\":\"vmid=int(t['vmid']); rows=[r for r in cluster_inventory() if int(r.get('vmid',-1))==vmid]\"},{\"line\":509,\"text\":\"if typ!=t['guest_type']: raise BackupError('PVE_GUEST_TYPE_DRIFT')\"},{\"line\":512,\"text\":\"_default_unprivileged_lxc(node,vmid)\"},{\"line\":526,\"text\":\"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\"},{\"line\":531,\"text\":\"ssh_remote(node,['vzdump',str(vmid),'--mode','snapshot','--compress','zstd','--dumpdir',srcdir],timeout=7200)\"},{\"line\":541,\"text\":\"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}\"},{\"line\":565,\"text\":\"def ensure_vps_known_hosts(targets):\"},{\"line\":567,\"text\":\"for t in targets:\"},{\"line\":585,\"text\":\"def bootstrap_vps_keys(targets):\"},{\"line\":587,\"text\":\"ensure_vps_known_hosts(targets)\"},{\"line\":590,\"text\":\"for t in targets:\"},{\"line\":594,\"text\":\"results[t['logical_id']]='ALREADY_OPERATOR_KEY'; continue\"},{\"line\":601,\"text\":\"results[t['logical_id']]=tag\"},{\"line\":603,\"text\":\"us=[x for x in targets if x['type']=='vps_us'][0]\"},{\"line\":605,\"text\":\"results[us['logical_id']]='ALREADY_US_OPERATOR_KEY'\"},{\"line\":621,\"text\":\"return payload,{'generation':gen,'source_class':'vps_md','consistency':'FILESET_PRE_POST_HASH_STABILITY','hashset_sha256':pre},None\"},{\"line\":631,\"text\":\"return payload,{'generation':gen,'source_class':'vps_spb','consistency':'STATIC_CONFIG_FILESET_PRE_POST_HASH_STABILITY','tls_recovery':'REISSUE_TLS_ON_RESTORE','hashset_sha256':pre},None\"},{\"line\":666,\"text\":\"return payload,{'generation':gen,'source_class':'vps_us','consistency':'SQLITE_ONLINE_BACKUP_PLUS_NONDB_FILES','sqlite_count':4},None\"},{\"line\":742,\"text\":\"hits=[ip for ip in ips if sha256_bytes(ip.encode())==ROUTER_TARGET_SHA]\"},{\"line\":743,\"text\":\"if len(hits)!=1: raise BackupError('ROUTER_TARGET_PARSE')\"},{\"line\":744,\"text\":\"target=hits[0]\"},{\"line\":753,\"text\":\"return target,safe[0]\"},{\"line\":783,\"text\":\"target,pf=parse_router_legacy()\"},{\"line\":800,\"text\":\"return payload,{'generation':gen,'source_class':'router','config_sha256':sha256_bytes(a),'read_count':2,'recovery_policy':'IMPORT_PACKAGE_OR_SAFE_CLI_NOT_BLIND_CONFIG_REPLACE'},None\"},{\"line\":802,\"text\":\"def qga_exec(node,vmid,guest_argv,input_bytes=None,timeout=600):\"},{\"line\":803,\"text\":\"args=['qm','guest','exec',str(vmid),'--synchronous','1','--timeout',str(int(timeout))]\"},{\"line\":821,\"text\":\"out=qga_exec(t['node'],t['vmid'],['/usr/bin/python3','-I','-B','-'],xf_guest_builder(t,gen).encode(),timeout=900)\"},{\"line\":833,\"text\":\"b64=qga_exec(t['node'],t['vmid'],['/usr/bin/python3','-I','-B','-c',code,path,str(off),str(take)],None,timeout=60).strip()\"},{\"line\":841,\"text\":\"qga_exec(t['node'],t['vmid'],['/usr/bin/rm','-f',path],None,timeout=30)\"},{\"line\":846,\"text\":\"return local,{'generation':gen,'source_class':'xenforo','site':t['slug'],'vmid':t['vmid'],'node':t['node'],'dump_strategy':t['dump_strategy'],'db_dump_bytes':j.get('db_bytes')},None\"},{\"line\":869,\"text\":\"return payload,{'generation':gen,'source_class':'pve_node_bundle','node':node,'recovery_policy':'CLEAN_INSTALL_JOIN_RECONCILE_NOT_BLIND_PMXCFS_OVERWRITE','member_roots':len(paths)},None\"},{\"line\":871,\"text\":\"def capture_target(t,gen,work):\"},{\"line\":900,\"text\":\"write_state(t['logical_id'],'SUCCESS',generation=gen,verification='existing_control_engine_verify',last_success_epoch=epoch())\"},{\"line\":901,\"text\":\"return {'logical_id':t['logical_id'],'generation':gen,'result':'SUCCESS','payload_bytes':0,'replicas':2}\"},{\"line\":903,\"text\":\"def backup_target(t,green_verify=False):\"},{\"line\":905,\"text\":\"gen=generation_id(t['logical_id']); work=ensure_dir(WORK_ROOT/gen,0o700)\"},{\"line\":908,\"text\":\"payload,meta,cleanup=capture_target(t,gen,work); meta['generation']=gen\"},{\"line\":921,\"text\":\"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())\"},{\"line\":922,\"text\":\"return {'logical_id':t['logical_id'],'generation':gen,'result':'SUCCESS','payload_bytes':manifest['payload_bytes'],'replicas':2,'allocator_healthy':alloc['healthy']}\"},{\"line\":925,\"text\":\"write_state(t['logical_id'],result,generation=gen,reason=e.code,sealed=sealed)\"},{\"line\":929,\"text\":\"targets=load_targets(); chosen=[t for t in targets if t.get('green1')]\"},{\"line\":931,\"text\":\"boots=bootstrap_vps_keys(targets)\"},{\"line\":936,\"text\":\"key=re.sub(r'[^A-Za-z0-9]+','_',t['logical_id']).upper()\"},{\"line\":938,\"text\":\"r=backup_target(t,green_verify=(t['type']!='control'))\"},{\"line\":945,\"text\":\"failures.append((t['logical_id'],e.code)); print(f'{label}_{key}=FAIL'); print(f'{label}_{key}_REASON={e.code}')\"},{\"line\":946,\"text\":\"print(f'{label}_TARGET_COUNT={len(chosen)}')\"},{\"line\":949,\"text\":\"print(f'{label}_CLOUD_BACKUP_TARGET_COUNT={sum(1 for t in chosen if t[\\\"type\\\"]!=\\\"control\\\")}')\"},{\"line\":950,\"text\":\"print(f'{label}_CONTROL_VERIFY_TARGET_COUNT={sum(1 for t in chosen if t[\\\"type\\\"]==\\\"control\\\")}')\"},{\"line\":951,\"text\":\"if failures: raise BackupError(label+'_TARGET_FAILURES',','.join(x[0] for x in failures))\"},{\"line\":956,\"text\":\"targets=load_targets(); state=load_state_all(); t=choose_due_target(targets,state)\"},{\"line\":958,\"text\":\"print('SCHEDULE_DECISION=DEFER_NO_DUE_TARGET'); return 0\"},{\"line\":959,\"text\":\"print('SCHEDULE_TARGET='+t['logical_id'])\"},{\"line\":960,\"text\":\"try: backup_target(t,green_verify=False)\"},{\"line\":965,\"text\":\"def discover(logical_id):\"},{\"line\":966,\"text\":\"targets=load_targets(); m={t['logical_id']:t for t in targets}\"},{\"line\":967,\"text\":\"if logical_id not in m: raise BackupError('DISCOVER_UNKNOWN_TARGET')\"},{\"line\":968,\"text\":\"t=m[logical_id]; prefix=f'homelab-backups/v2/{t[\\\"scope\\\"]}/{logical_id}/generations'\"},{\"line\":983,\"text\":\"print('DISCOVER_LOGICAL_ID='+logical_id); print('DISCOVER_TWO_PHYSICAL_SEALED_COUNT='+str(len(good)))\"},{\"line\":990,\"text\":\"assert len(default_targets())>=28\"},{\"line\":991,\"text\":\"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'}\"},{\"line\":998,\"text\":\"av,_=proven_lxc_dump_argv({'vmid':112},{'maxdisk':8350298112,'maxmem':536870912,'status':'running','name':'unbound1'},'pve01','/var/tmp/homelab-vzdump-selftest')\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/legacy_engine.py\",\"sha256\":\"b6e79f087b9f1d21dac4f77a7b46b743299bbb85bc716e80d2ea67c2e038bcd7\",\"size\":59719},{\"hits\":[{\"line\":76,\"text\":\"need(g['vmid'] in configs,'GUEST_CONFIG_MISSING')\"},{\"line\":77,\"text\":\"original=configs[g['vmid']];cfg=normalized_config(original);summary=np.config_summary(cfg,g['type'])\"},{\"line\":96,\"text\":\"if st is None or st['active'] is not True or st['enabled'] is not True:block.add('STORAGE_NOT_AVAILABLE')\"},{\"line\":124,\"text\":\"need(type(job.get('vmid')) is int and 100<=job['vmid']<=999999999,'VMID')\"},{\"line\":135,\"text\":\"return [str(executable),str(job['vmid']),'--node',job['node'],'--mode','snapshot','--stdout','1',\"},{\"line\":153,\"text\":\"need(type(seconds) in (int,float) and 00,'QEMU_VMID')\"},{\"line\":21,\"text\":\"pat=re.compile(r'^vzdump-qemu-'+re.escape(str(vmid))+r'-(\\\\d{4}_\\\\d{2}_\\\\d{2}-\\\\d{2}_\\\\d{2}_\\\\d{2})\\\\.vma\\\\.zst$')\"},{\"line\":29,\"text\":\"expected_log=parent/f'vzdump-qemu-{vmid}-{stamp}.log'\"},{\"line\":42,\"text\":\"if t.get('guest_type')!='qemu': return original(t,gen,work)\"},{\"line\":43,\"text\":\"vmid=int(t['vmid']); rows=[r for r in legacy.cluster_inventory() if int(r.get('vmid',-1))==vmid]\"},{\"line\":46,\"text\":\"_need(typ==t.get('guest_type')=='qemu','PVE_GUEST_TYPE_DRIFT')\"},{\"line\":51,\"text\":\"vp=legacy.ssh_remote(node,['vzdump',str(vmid),'--mode','snapshot','--compress','zstd','--dumpdir',srcdir],timeout=7200,check=False)\"},{\"line\":53,\"text\":\"_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)\"},{\"line\":58,\"text\":\"try: src,log=_select_qemu_outputs(vmid,files)\"},{\"line\":60,\"text\":\"_emit_diag(vmid=vmid,node=node,producer_rc=0,regular_file_count=len(files),archive_selected=False,selector_error=str(e))\"},{\"line\":71,\"text\":\"_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)\"},{\"line\":75,\"text\":\"meta={'generation':gen,'source_class':'pve_guest','vmid':vmid,'guest_type':'qemu','node':node,'status':row.get('status'),\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"sha256\":\"1906db42bd34bbe85eb46fd9797b3572d46e0a41c29d1c29be5f9df5e448f15b\",\"size\":4627},{\"hits\":[{\"line\":47,\"text\":\"if not (type(seconds) is int and 00,'SCHEDULER_TARGET_SCHEMA')\"},{\"line\":75,\"text\":\"def write_state(logical_id,result,**kw):\"},{\"line\":77,\"text\":\"prior=_read_prior(legacy,logical_id)\"},{\"line\":81,\"text\":\"return original_write(logical_id,result,**clean)\"},{\"line\":88,\"text\":\"return original_write(logical_id,result,**clean)\"},{\"line\":90,\"text\":\"legacy.choose_due_target=choose_due_target\"},{\"line\":92,\"text\":\"return {'choose_due_target':choose_due_target,'write_state':write_state,\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"sha256\":\"a6f67159a64067773323f028126e3109e15cf17a8142cea5e6129970f1d4da96\",\"size\":4097}]\nRPO_SCHEDULER_POLICY_MISMATCH=[{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"ct112\",\"vmid\":112},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"guest-pve01-lxc-112\",\"vmid\":112},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"ct113\",\"vmid\":113},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"vm130\",\"vmid\":130},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"vm150\",\"vmid\":150},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"vm160\",\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"xf-codevipe\",\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"xf-dsmods\",\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"xf-kingofwolk\",\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"xf-gamevipe\",\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"xf-hkmods\",\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"xf-zakrutim\",\"vmid\":160}]\nDECISION=TARGET_CARDINALITY_OR_MODEL_DRIFT\nNO_MUTATION=true\nTASK_RESULT=PASS_HOMELAB_BACKUP_DUE_POLICY_SOURCE_RCA_READONLY\nHOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-SOURCE-RCA-READONLY-1105R1\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\nWORKERS2_DUE_POLICY_SOURCE_RCA_END=1\n" } diff --git a/runtime/latest.txt b/runtime/latest.txt index d9a07785..ee030493 100644 --- a/runtime/latest.txt +++ b/runtime/latest.txt @@ -1,15 +1,15 @@ CHAT_OUTPUT_BEGIN -COMMAND_ID=SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-PARAGRAPH-NORMALIZATION-READONLY-897R1 +COMMAND_ID=SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-SOURCE-RCA-READONLY-1105R1 STATUS=OK RC=0 HOST=pve01 MODE=read-only -COMPONENT=pvepro-editorial-batch-c-paragraph-normalization +COMPONENT=homelab-backup-due-policy-source-rca REFERENCE_REGISTER_CHECK=OK REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 ERROR_REGISTER_CHECK=OK ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 -COMMAND_SHA256=863dd1d794de111a15f821aff91c8dafb24a18cb058087aa8d40d6e60cbca713 +COMMAND_SHA256=1cadad9a6c87f4c1dde8d879a103f7f85e6d2cdaa3f513448c7045a73e90beb4 DUPLICATE_FAILED_COMMAND_BLOCKED=false EXECUTION_STARTED=true CHANGE_DECLARED=false @@ -24,27 +24,27 @@ MUTATION_OUTCOME=NO_MUTATION SANITIZED=yes SECRETS_INCLUDED=no PRIVATE_ADDRESSES_INCLUDED=no -RAW_EVIDENCE_SHA256=79503e32fa2e02c3692b8c45f1c6254a337dc472303d03fb28b006d97131fda4 -SANITIZED_OUTPUT_SHA256=79503e32fa2e02c3692b8c45f1c6254a337dc472303d03fb28b006d97131fda4 +RAW_EVIDENCE_SHA256=a5f6bceb256d00dacd3d15ee23e2f737b60089e6232680050e589a1f84edc3c2 +SANITIZED_OUTPUT_SHA256=a5f6bceb256d00dacd3d15ee23e2f737b60089e6232680050e589a1f84edc3c2 OUTPUT_BEGIN -PVEPRO897_BEGIN=true -COMMAND_ID=SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-PARAGRAPH-NORMALIZATION-READONLY-897R1 -SCOPE=READ_ONLY_BATCH_C_PARAGRAPH_NORMALIZATION_PROVENANCE -AUTHORITY={"ERROR_REGISTER":{"bytes":302058,"expected_sha256":"3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0","match":true,"sha256":"3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0"},"REFERENCE":{"bytes":201129,"expected_sha256":"5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66","match":true,"sha256":"5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66"}} -PRODUCTION_HOST={"name":"pvepro-prod","node":"pve01","status":"running","vmid":100} -QGA_TRANSPORT={"rc":0,"stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} -QGA_CONTRACT={"err_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","err_truncated":null,"exitcode":0,"exited":1,"out_truncated":0} -PARAGRAPH_NORMALIZATION_RECONCILE={"blank_line_count_6of9":true,"compact_chars_match_9of9":true,"compact_hash_match_9of9":false,"compact_words_match_9of9":true,"reason":"PARAGRAPH_STRUCTURE_PROVEN_HASH_SEMANTICS_UNRESOLVED","result":"HOLD","target_ids":[31,32,33,34,35,36,37,38,39],"targets":[{"blank_line_count":6,"collapse_chars":731,"collapse_chars_match":true,"collapse_hash_match":false,"collapse_sha256":"1c8ce8fa9161190951ce20e702317728479bfc6b7bca5f9a9be0a7eaacbd9d7a","compact_chars":731,"compact_chars_match":true,"compact_hash_match":false,"compact_sha256":"1c8ce8fa9161190951ce20e702317728479bfc6b7bca5f9a9be0a7eaacbd9d7a","compact_words":83,"compact_words_match":true,"first_post_id":31,"forum":"PVEPro AI Lab","historical_719":{"chars":731,"sha256":"aba65fce05dad18fd302c9486d96c5845ede9e883b6c9138fcf4896ba7d59145","words":83},"line_count":19,"node_id":15,"nonblank_line_count":13,"raw_chars":737,"raw_sha256":"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f","raw_words":83,"reply_count":0,"sticky":0,"thread_id":31,"title":"[Private AI] RAG \u043f\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u0440\u0435\u0433\u043b\u0430\u043c\u0435\u043d\u0442\u0430\u043c"},{"blank_line_count":6,"collapse_chars":717,"collapse_chars_match":true,"collapse_hash_match":false,"collapse_sha256":"1147d25667b076000930cddbd0712af742d786638763f773dd92eb6337125af6","compact_chars":717,"compact_chars_match":true,"compact_hash_match":false,"compact_sha256":"1147d25667b076000930cddbd0712af742d786638763f773dd92eb6337125af6","compact_words":84,"compact_words_match":true,"first_post_id":32,"forum":"PVEPro AI Lab","historical_719":{"chars":717,"sha256":"66329dfcce09a3f655f25f67045a5528b838614eb43ad29b88f3288602e21fcb","words":84},"line_count":19,"node_id":15,"nonblank_line_count":13,"raw_chars":723,"raw_sha256":"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a","raw_words":84,"reply_count":0,"sticky":0,"thread_id":32,"title":"[Private AI] \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u0431\u0430\u0446\u0438\u044f \u0432\u0441\u0442\u0440\u0435\u0447"},{"blank_line_count":6,"collapse_chars":750,"collapse_chars_match":true,"collapse_hash_match":false,"collapse_sha256":"621bbb0409e7fc5f9d2977e262984ac62a224825ba13e2abf109a449043dcdc5","compact_chars":750,"compact_chars_match":true,"compact_hash_match":false,"compact_sha256":"621bbb0409e7fc5f9d2977e262984ac62a224825ba13e2abf109a449043dcdc5","compact_words":91,"compact_words_match":true,"first_post_id":33,"forum":"PVEPro AI Lab","historical_719":{"chars":750,"sha256":"ade466868849f37253f6eb05e1c71f7466e6c26a3db05119ab56c73a580202a6","words":91},"line_count":19,"node_id":15,"nonblank_line_count":13,"raw_chars":756,"raw_sha256":"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10","raw_words":91,"reply_count":0,"sticky":0,"thread_id":33,"title":"[Private AI] \u0410\u0433\u0435\u043d\u0442 \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a CRM"},{"blank_line_count":6,"collapse_chars":701,"collapse_chars_match":true,"collapse_hash_match":false,"collapse_sha256":"5a9dc36fbe84435f916dfd4a6e04671ab33876cf65c9c587fc82ccd99938be52","compact_chars":701,"compact_chars_match":true,"compact_hash_match":false,"compact_sha256":"5a9dc36fbe84435f916dfd4a6e04671ab33876cf65c9c587fc82ccd99938be52","compact_words":81,"compact_words_match":true,"first_post_id":34,"forum":"\u0416\u0435\u043b\u0435\u0437\u043e \u0438 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0438","historical_719":{"chars":701,"sha256":"31accb654aa518f680f9dca2f043342094d2158ddf4704f4233cef35f43c5cda","words":81},"line_count":19,"node_id":16,"nonblank_line_count":13,"raw_chars":707,"raw_sha256":"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade","raw_words":81,"reply_count":0,"sticky":0,"thread_id":34,"title":"[\u041f\u043b\u043e\u0449\u0430\u0434\u043a\u0430] Mini-PC cluster vs tower server"},{"blank_line_count":6,"collapse_chars":673,"collapse_chars_match":true,"collapse_hash_match":false,"collapse_sha256":"3be1a7d2307536637c531a35184b2dfd5e81296a1da3690c0bff0d1a47c45403","compact_chars":673,"compact_chars_match":true,"compact_hash_match":false,"compact_sha256":"3be1a7d2307536637c531a35184b2dfd5e81296a1da3690c0bff0d1a47c45403","compact_words":77,"compact_words_match":true,"first_post_id":35,"forum":"\u0416\u0435\u043b\u0435\u0437\u043e \u0438 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0438","historical_719":{"chars":673,"sha256":"c8a1a0db8103ad40279d271c8006e3d1dadee6507730ba30155cc97dbe96383d","words":77},"line_count":19,"node_id":16,"nonblank_line_count":13,"raw_chars":679,"raw_sha256":"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6","raw_words":77,"reply_count":0,"sticky":0,"thread_id":35,"title":"[\u041f\u043b\u043e\u0449\u0430\u0434\u043a\u0430] NVMe mirror vs RAIDZ"},{"blank_line_count":6,"collapse_chars":754,"collapse_chars_match":true,"collapse_hash_match":false,"collapse_sha256":"f7b9faef776bdb02cc683c62bcd38f521cac4c823adca1dfa4a25ee009d8c134","compact_chars":754,"compact_chars_match":true,"compact_hash_match":false,"compact_sha256":"f7b9faef776bdb02cc683c62bcd38f521cac4c823adca1dfa4a25ee009d8c134","compact_words":84,"compact_words_match":true,"first_post_id":36,"forum":"\u0416\u0435\u043b\u0435\u0437\u043e \u0438 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0438","historical_719":{"chars":754,"sha256":"e90d204f73c7ee5ad1ffb7f227f1cdd64bad69f5fa978f078b79ac89045ae287","words":84},"line_count":19,"node_id":16,"nonblank_line_count":13,"raw_chars":760,"raw_sha256":"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26","raw_words":84,"reply_count":0,"sticky":0,"thread_id":36,"title":"[\u041f\u043b\u043e\u0449\u0430\u0434\u043a\u0430] \u041f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0441\u0442\u044c home-lab \u2192 hosting/cloud"},{"blank_line_count":6,"collapse_chars":737,"collapse_chars_match":true,"collapse_hash_match":false,"collapse_sha256":"8cc9eb49bde332044bf49cc65b46253c806ef6f9b8c96f87a0e007069e9e1424","compact_chars":737,"compact_chars_match":true,"compact_hash_match":false,"compact_sha256":"8cc9eb49bde332044bf49cc65b46253c806ef6f9b8c96f87a0e007069e9e1424","compact_words":85,"compact_words_match":true,"first_post_id":37,"forum":"\u0417\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435","historical_719":{"chars":737,"sha256":"17c2a8f3e11adff49fdd2c2184b0286796dca4dde755b06b9ee75f1ede52e3c1","words":85},"line_count":19,"node_id":17,"nonblank_line_count":13,"raw_chars":743,"raw_sha256":"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d","raw_words":85,"reply_count":0,"sticky":0,"thread_id":37,"title":"[\u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0440\u043e\u0441\u0430] \u0410\u0443\u0434\u0438\u0442 backup \u0437\u0430 \u043e\u0434\u0438\u043d \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0434\u0435\u043d\u044c"},{"blank_line_count":6,"collapse_chars":714,"collapse_chars_match":true,"collapse_hash_match":false,"collapse_sha256":"88b7fd7e56be026eeb6a8469b272b0da73b9bdb30ce360176b44b22cd5f4e6ff","compact_chars":714,"compact_chars_match":true,"compact_hash_match":false,"compact_sha256":"88b7fd7e56be026eeb6a8469b272b0da73b9bdb30ce360176b44b22cd5f4e6ff","compact_words":82,"compact_words_match":true,"first_post_id":38,"forum":"\u0417\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435","historical_719":{"chars":714,"sha256":"7b86c826cf409f59d38de25ad742d7c14bcfbdf567410e5087aacc3cd91b603a","words":82},"line_count":19,"node_id":17,"nonblank_line_count":13,"raw_chars":720,"raw_sha256":"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55","raw_words":82,"reply_count":0,"sticky":0,"thread_id":38,"title":"[\u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0440\u043e\u0441\u0430] Private AI \u0434\u043b\u044f 20 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432"},{"blank_line_count":6,"collapse_chars":690,"collapse_chars_match":true,"collapse_hash_match":false,"collapse_sha256":"2b75f9a49ec648c40aeb4d0cfdf3ee9a43689243bcbd06695927eabc629be12b","compact_chars":690,"compact_chars_match":true,"compact_hash_match":false,"compact_sha256":"2b75f9a49ec648c40aeb4d0cfdf3ee9a43689243bcbd06695927eabc629be12b","compact_words":78,"compact_words_match":true,"first_post_id":39,"forum":"\u042d\u043a\u0441\u043f\u0435\u0440\u0442\u044b PVEPro","historical_719":{"chars":690,"sha256":"f9fe92236122229693a8fe5f10b7c0810079c4bb74ed7f82a44182e7faa64036","words":78},"line_count":19,"node_id":18,"nonblank_line_count":13,"raw_chars":696,"raw_sha256":"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82","raw_words":78,"reply_count":0,"sticky":0,"thread_id":39,"title":"[\u042d\u043a\u0441\u043f\u0435\u0440\u0442] \u041a\u0430\u043a \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u0435\u0442\u0435\u043d\u0446\u0438\u0438 \u0431\u0435\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043b\u043e\u0433\u043e\u0442\u0438\u043f\u043e\u0432"}]} -PRODUCT_CHECKPOINTS_REMAINING=8 -CHECKPOINTS13_14_REMAIN_OPEN=true -TASK_RESULT=HOLD_PVEPRO897_HASH_SEMANTICS_UNRESOLVED -DECISION=HOLD_PVEPRO897_HASH_SEMANTICS_UNRESOLVED -NEXT_GATE=RECONCILE_ONLY_PVEPRO719_BODY_SHA_SEMANTICS -CHANGES_MADE_BY_897=false -PRODUCT_MUTATION_BY_897=false -VM_MUTATION_BY_897=false -HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-PARAGRAPH-NORMALIZATION-READONLY-897R1","rollback_restored":null,"rollback_started":false,"status":"OK","version":1} -PVEPRO897_END=true +WORKERS2_DUE_POLICY_SOURCE_RCA_BEGIN=1 +COMMAND_ID=SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-SOURCE-RCA-READONLY-1105R1 +MODE=read-only +COMPONENT=homelab-backup-due-policy-source-rca +MUTATION_BOUNDARY=READ_ONLY_NO_BACKUP_NO_SERVICE_START_NO_TIMER_CHANGE_NO_LOCK_BREAK_NO_FILE_WRITE_OUTSIDE_TMP_NO_GIT_WRITE +IDENTITIES={"base":{"exists":true,"path":"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1"},"entry504":{"exists":true,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","sha256":"ca6876fa9c3b1465b045344a8ad46962de16972c7dadc4ac6257c7d225047793"},"wrapper":{"exists":true,"path":"/usr/local/sbin/homelab-backup-v2","sha256":"5077444065c732451cb84898680f62361b21a24ef9eb4f191253e82ead524ea2"}} +SELFTEST_REPLACEMENT486=PASS +LIVE_WRAPPER_TARGETS=[{"due_seconds":86400,"enabled":true,"guest_type":"lxc","kind":null,"lifecycle":null,"logical_id":"ct110","node":null,"owner":null,"source_class":null,"status":null,"vmid":110},{"due_seconds":86400,"enabled":true,"guest_type":"lxc","kind":null,"lifecycle":null,"logical_id":"ct111","node":null,"owner":null,"source_class":null,"status":null,"vmid":111},{"due_seconds":86400,"enabled":true,"guest_type":"lxc","kind":null,"lifecycle":null,"logical_id":"ct112","node":null,"owner":null,"source_class":null,"status":null,"vmid":112},{"due_seconds":86400,"enabled":true,"guest_type":"lxc","kind":null,"lifecycle":null,"logical_id":"ct113","node":null,"owner":null,"source_class":null,"status":null,"vmid":113},{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm130","node":null,"owner":null,"source_class":null,"status":null,"vmid":130},{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm150","node":null,"owner":null,"source_class":null,"status":null,"vmid":150},{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm160","node":null,"owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm170","node":null,"owner":null,"source_class":null,"status":null,"vmid":170},{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm171","node":null,"owner":null,"source_class":null,"status":null,"vmid":171},{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm190","node":null,"owner":null,"source_class":null,"status":null,"vmid":190},{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm210","node":null,"owner":null,"source_class":null,"status":null,"vmid":210},{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm211","node":null,"owner":null,"source_class":null,"status":null,"vmid":211},{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm9130","node":null,"owner":null,"source_class":null,"status":null,"vmid":9130},{"due_seconds":604800,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"node-pve01","node":"pve01","owner":null,"source_class":null,"status":null,"vmid":null},{"due_seconds":604800,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"node-pve02","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":null},{"due_seconds":604800,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"node-pve03","node":"pve03","owner":null,"source_class":null,"status":null,"vmid":null},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-codevipe","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-dsmods","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-kingofwolk","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-newfi","node":"pve01","owner":null,"source_class":null,"status":null,"vmid":210},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-gamevipe","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-hkmods","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-zakrutim","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":"lxc","kind":null,"lifecycle":null,"logical_id":"guest-pve01-lxc-112","node":"pve01","owner":null,"source_class":null,"status":null,"vmid":112}] +SELECTED_VM_TARGETS=[{"count":2,"rows":[{"due_seconds":86400,"enabled":true,"guest_type":"lxc","kind":null,"lifecycle":null,"logical_id":"ct112","node":null,"owner":null,"source_class":null,"status":null,"vmid":112},{"due_seconds":86400,"enabled":true,"guest_type":"lxc","kind":null,"lifecycle":null,"logical_id":"guest-pve01-lxc-112","node":"pve01","owner":null,"source_class":null,"status":null,"vmid":112}],"vmid":112},{"count":1,"rows":[{"due_seconds":86400,"enabled":true,"guest_type":"lxc","kind":null,"lifecycle":null,"logical_id":"ct113","node":null,"owner":null,"source_class":null,"status":null,"vmid":113}],"vmid":113},{"count":1,"rows":[{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm130","node":null,"owner":null,"source_class":null,"status":null,"vmid":130}],"vmid":130},{"count":1,"rows":[{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm150","node":null,"owner":null,"source_class":null,"status":null,"vmid":150}],"vmid":150},{"count":7,"rows":[{"due_seconds":86400,"enabled":true,"guest_type":"qemu","kind":null,"lifecycle":null,"logical_id":"vm160","node":null,"owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-codevipe","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-dsmods","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-kingofwolk","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-gamevipe","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-hkmods","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160},{"due_seconds":86400,"enabled":true,"guest_type":null,"kind":null,"lifecycle":null,"logical_id":"xf-zakrutim","node":"pve02","owner":null,"source_class":null,"status":null,"vmid":160}],"vmid":160}] +CURRENT_SCHEDULER_SELECTION_ERROR=AttributeError:module 'wrapper' has no attribute 'load_state_all' +LIVE_WRAPPER_FUNCTION_HITS=[{"function":"load_targets","line":1,"text":"def load_targets():"},{"function":"load_targets","line":2,"text":"base=canonical_targets();return base+[_ct_descriptor(base)]"},{"function":"backup_target","line":1,"text":"def backup_target(t,green_verify=False):"},{"function":"backup_target","line":2,"text":"if not isinstance(t,dict) or t.get('logical_id')!=CT_ID:"},{"function":"backup_target","line":3,"text":"return _legacy_backup_target(t,green_verify)"},{"function":"backup_target","line":5,"text":"r=ct112.run_target(t,state_writer=legacy.write_state)"},{"function":"backup_target","line":6,"text":"return {'logical_id':CT_ID,'generation':r['generation'],'result':'SUCCESS','payload_bytes':r['payload_bytes'],"}] +DUE_POLICY_SOURCE_HITS=[{"hits":[{"line":18,"text":"_legacy_load_targets=legacy.load_targets"},{"line":19,"text":"_legacy_backup_target=legacy.backup_target"},{"line":21,"text":"def canonical_targets():"},{"line":22,"text":"rows=_legacy_load_targets()"},{"line":23,"text":"if not isinstance(rows,list) or len(rows)!=28: raise legacy.BackupError('TARGET_REGISTRY_COUNT')"},{"line":25,"text":"ids=[x.get('logical_id') for x in out]"},{"line":26,"text":"if len(set(ids))!=28 or CT_ID in ids: raise legacy.BackupError('TARGET_REGISTRY_IDENTITY')"},{"line":30,"text":"xf=[x for x in rows if x.get('logical_id')=='xf-zakrutim']"},{"line":32,"text":"due=xf[0].get('due_seconds')"},{"line":34,"text":"return {'logical_id':CT_ID,'scope':'pve01 LXC 112 full-guest archive DR','type':'pve_guest','node':'pve01','vmid':112,"},{"line":35,"text":"'guest_type':'lxc','due_seconds':due,'enabled':True,'green1':True}"},{"line":37,"text":"def load_targets():"},{"line":38,"text":"base=canonical_targets();return base+[_ct_descriptor(base)]"},{"line":40,"text":"def backup_target(t,green_verify=False):"},{"line":41,"text":"if not isinstance(t,dict) or t.get('logical_id')!=CT_ID:"},{"line":42,"text":"return _legacy_backup_target(t,green_verify)"},{"line":44,"text":"r=ct112.run_target(t,state_writer=legacy.write_state)"},{"line":45,"text":"return {'logical_id':CT_ID,'generation':r['generation'],'result':'SUCCESS','payload_bytes':r['payload_bytes'],"},{"line":52,"text":"legacy.load_targets=load_targets"},{"line":53,"text":"legacy.backup_target=backup_target"},{"line":58,"text":"d=legacy.default_targets()"},{"line":59,"text":"if not isinstance(d,list) or len(d)<28: raise RuntimeError('LEGACY_DEFAULT_TARGET_COUNT')"},{"line":61,"text":"if {t.get('logical_id') for t in d if isinstance(t,dict) and t.get('green1')}!=want: raise RuntimeError('LEGACY_DEFAULT_GREEN_SET')"},{"line":70,"text":"base=canonical_targets(); eff=load_targets()"},{"line":71,"text":"if len(eff)!=29 or sum(1 for x in eff if x.get('logical_id')==CT_ID)!=1: raise RuntimeError('EFFECTIVE_TARGETS')"},{"line":72,"text":"legacy_rows,ct=driver.partition_targets(eff)"},{"line":73,"text":"if [x['logical_id'] for x in legacy_rows]!=list(LEGACY_IDS) or ct.get('vmid')!=112: raise RuntimeError('REPRESENTATIVE_PARTITION')"}],"path":"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/wrapper.py","sha256":"2b5eb4fc0f6f466a0d3e5a007af987092b6c17baa3ff9241a6afc2c2e97df1d5","size":5055},{"hits":[{"line":4,"text":"This module does not discover credentials, modify scheduler state, or implement the"},{"line":33,"text":"def _logical_id(target: Mapping[str, Any]) -> str:"},{"line":34,"text":"value=target.get('logical_id') if isinstance(target, Mapping) else None"},{"line":36,"text":"raise ContractError('TARGET_LOGICAL_ID')"},{"line":39,"text":"def partition_targets(targets: Iterable[Mapping[str, Any]]):"},{"line":42,"text":"for target in targets:"},{"line":43,"text":"logical_id=_logical_id(target)"},{"line":44,"text":"if logical_id not in wanted:"},{"line":46,"text":"if logical_id in selected:"},{"line":47,"text":"raise ContractError('REPRESENTATIVE_TARGET_DUPLICATE')"},{"line":48,"text":"selected[logical_id]=target"},{"line":51,"text":"raise ContractError('REPRESENTATIVE_TARGET_MISSING')"},{"line":72,"text":"def write_state(logical_id,result,**kw):"},{"line":73,"text":"if logical_id not in LEGACY_IDS:"},{"line":74,"text":"raise ContractError('STATE_TARGET_FORBIDDEN')"},{"line":75,"text":"payload={'logical_id':logical_id,'result':result,'meta':kw,'schema_version':1}"},{"line":76,"text":"_atomic_json(root/(logical_id+'.json'),payload)"},{"line":79,"text":"def run_legacy_lane(engine, target: Mapping[str, Any]):"},{"line":80,"text":"logical_id=_logical_id(target)"},{"line":81,"text":"if logical_id not in LEGACY_IDS:"},{"line":82,"text":"raise ContractError('LEGACY_TARGET_FORBIDDEN')"},{"line":83,"text":"backup=getattr(engine,'backup_target',None)"},{"line":85,"text":"raise ContractError('ENGINE_BACKUP_TARGET_MISSING')"},{"line":91,"text":"return backup(target,True)"},{"line":98,"text":"if result.get('logical_id')!=CT112_ID or result.get('status')!='OK':"},{"line":106,"text":"def run_representative(engine, targets, ct112_callback: Callable[[Mapping[str, Any]], Any]):"},{"line":109,"text":"legacy,ct112=partition_targets(targets)"},{"line":111,"text":"for target in legacy:"},{"line":112,"text":"results.append(run_legacy_lane(engine,target))"}],"path":"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/representative_driver.py","sha256":"b3050a8f95e6d9826a4f0786cd3ca32012b6ab10486d10e4981b50b8a0affff2","size":4214},{"hits":[{"line":49,"text":"vmid=r.get('vmid')"},{"line":50,"text":"if type(vmid) is not int:raise RuntimeError('PVE_VMID_SCHEMA')"},{"line":51,"text":"configs[vmid]=_json_cmd(f\"/nodes/pve01/{r['type']}/{vmid}/config\")"},{"line":61,"text":"vmids=[j.get('vmid') for j in jobs if isinstance(j,dict)]"},{"line":62,"text":"if len(vmids)!=len(jobs) or len(vmids)!=len(set(vmids)):raise RuntimeError('CT112_PLAN_MEMBERSHIP')"},{"line":63,"text":"matches=[j for j in jobs if j.get('vmid')==112]"},{"line":74,"text":"def _assert_live_state_unchanged(before,after,vmid):"},{"line":79,"text":"if any(type(x) is not dict or type(x.get('vmid')) is not int for x in rows):raise RuntimeError('CT112_STATE_SCHEMA')"},{"line":80,"text":"return sorted((x['vmid'],x.get('type'),x.get('node'),x.get('status'),x.get('template')) for x in rows)"},{"line":83,"text":"a=[j for j in old if j.get('vmid')==vmid];b=[j for j in new if j.get('vmid')==vmid]"},{"line":119,"text":"def __init__(self,work,entries,binding,guard,deadline,logical_id):"},{"line":120,"text":"self.work=Path(work);self.entries=entries;self.binding=binding;self.guard=guard;self.deadline=deadline;self.logical_id=logical_id"},{"line":127,"text":"self.inner=large.ReadOnlyLarge(str(RCLONE),self.snapshot,e,bind,self.guard,self.work,self.deadline,self.logical_id)"},{"line":142,"text":"def run_target(target,state_writer=None):"},{"line":143,"text":"if not isinstance(target,dict) or target.get('logical_id')!=CT_ID or target.get('vmid')!=112:return (_ for _ in ()).throw(RuntimeError('CT112_DESCRIPTOR'))"}],"path":"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/ct112_handler.py","sha256":"8cac6e627d5e7abe5d3163cdd24911995a1e3f45c776f9373c2aa68784f5ec6c","size":10955},{"hits":[{"line":8,"text":"TARGETS_PATH=CONFIG_ROOT/'targets.json'"},{"line":21,"text":"ROUTER_TARGET_SHA='4f9da1283166a1e9f4e6bc7dd240c76aef85772177f717f92abb6e8e2bb8de90'"},{"line":132,"text":"def remote_generation_path(scope,logical_id,generation):"},{"line":134,"text":"for x in (scope,logical_id,generation):"},{"line":136,"text":"return f'homelab-backups/v2/{scope}/{logical_id}/generations/{generation}'"},{"line":138,"text":"def make_manifest(scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta):"},{"line":142,"text":"return {'schema':2,'scope':scope,'logical_id':logical_id,'generation':generation,'created_at_utc':utcnow(),"},{"line":149,"text":"def default_targets():"},{"line":150,"text":"d=86400"},{"line":153,"text":"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')]:"},{"line":154,"text":"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})"},{"line":156,"text":"out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})"},{"line":158,"text":"{'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'85.121.4.192','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},"},{"line":159,"text":"{'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'185.225.35.6','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},"},{"line":160,"text":"{'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'46.16.34.129','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh/fePUci42dfY58I6q0lFiiPHn0/M+mckypmE','due_seconds':d,'enabled':True,'green1':True},"},{"line":161,"text":"{'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},"},{"line":171,"text":"for slug,vmid,node,root,db,strategy in sites:"},{"line":172,"text":"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')})"},{"line":173,"text":"out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})"},{"line":176,"text":"def choose_due_target(targets,state,now=None):"},{"line":179,"text":"for t in targets:"},{"line":180,"text":"if not t.get('enabled',True): continue"},{"line":181,"text":"due=max(1,int(t.get('due_seconds',86400)))"},{"line":182,"text":"last=int(state.get(t['logical_id'],{}).get('last_success_epoch',0))"},{"line":184,"text":"if last==0 or age>=due: c.append((-(age/due),last,t['logical_id'],t))"},{"line":236,"text":"def load_targets():"},{"line":237,"text":"j=json.loads(TARGETS_PATH.read_text())"},{"line":238,"text":"if j.get('schema')!=1 or not isinstance(j.get('targets'),list): raise BackupError('TARGET_MANIFEST_SCHEMA')"},{"line":239,"text":"ids=[x.get('logical_id') for x in j['targets']]"},{"line":240,"text":"if len(ids)!=len(set(ids)): raise BackupError('TARGET_MANIFEST_DUPLICATE')"},{"line":241,"text":"return j['targets']"},{"line":249,"text":"j=json.loads(p.read_text()); d[j['logical_id']]=j"},{"line":253,"text":"def write_state(logical_id,result,**kw):"},{"line":255,"text":"j={'schema':1,'logical_id':logical_id,'result':result,'updated_at_utc':utcnow(),**kw}"},{"line":257,"text":"atomic_write(STATE_ROOT/'state'/(logical_id+'.json'),canonical_json(j)+b'\\n',0o600)"},{"line":280,"text":"def remote_exists_any(scope,logical_id,generation):"},{"line":281,"text":"rel=remote_generation_path(scope,logical_id,generation)"},{"line":328,"text":"def generation_id(logical_id):"},{"line":330,"text":"return f'v2-{logical_id}-{ts}-{os.urandom(6).hex()}'"},{"line":335,"text":"gen=source_meta['generation']; rel=remote_generation_path(t['scope'],t['logical_id'],gen)"},{"line":336,"text":"if remote_exists_any(t['scope'],t['logical_id'],gen): raise BackupError('GENERATION_COLLISION')"},{"line":339,"text":"manifest=make_manifest(t['scope'],t['logical_id'],gen,n,psha,parts,reps,source_meta)"},{"line":350,"text":"seal={'schema':1,'generation':gen,'logical_id':t['logical_id'],'manifest_sha256':msha,'payload_sha256':psha,'status':'SEALED','sealed_at_utc':utcnow()}"},{"line":359,"text":"rel=remote_generation_path(manifest['scope'],manifest['logical_id'],manifest['generation'])"},{"line":392,"text":"if t['guest_type']=='lxc': validate_tar_zst(path)"},{"line":415,"text":"def _pve_dumpdir_spec(guest_type):"},{"line":416,"text":"if guest_type=='lxc': return (0o710,100000)"},{"line":417,"text":"if guest_type=='qemu': return (0o700,0)"},{"line":418,"text":"raise BackupError('PVE_GUEST_TYPE_DRIFT')"},{"line":449,"text":"return {'vmid':int(t['vmid']),'id':int(t['vmid']),'type':'lxc','kind':'lxc','guest_type':'lxc','node':node,'status':row.get('status'),'name':row.get('name',''),"},{"line":464,"text":"if pathlib.Path(argv[0]).name!='vzdump' or str(int(t['vmid'])) not in argv: raise BackupError('PROVEN_DUMP_ARGV_TARGET')"},{"line":475,"text":"def _default_unprivileged_lxc(node,vmid):"},{"line":476,"text":"q=ssh_remote(node,['pct','config',str(vmid)],timeout=30)"},{"line":506,"text":"vmid=int(t['vmid']); rows=[r for r in cluster_inventory() if int(r.get('vmid',-1))==vmid]"},{"line":509,"text":"if typ!=t['guest_type']: raise BackupError('PVE_GUEST_TYPE_DRIFT')"},{"line":512,"text":"_default_unprivileged_lxc(node,vmid)"},{"line":526,"text":"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"},{"line":531,"text":"ssh_remote(node,['vzdump',str(vmid),'--mode','snapshot','--compress','zstd','--dumpdir',srcdir],timeout=7200)"},{"line":541,"text":"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}"},{"line":565,"text":"def ensure_vps_known_hosts(targets):"},{"line":567,"text":"for t in targets:"},{"line":585,"text":"def bootstrap_vps_keys(targets):"},{"line":587,"text":"ensure_vps_known_hosts(targets)"},{"line":590,"text":"for t in targets:"},{"line":594,"text":"results[t['logical_id']]='ALREADY_OPERATOR_KEY'; continue"},{"line":601,"text":"results[t['logical_id']]=tag"},{"line":603,"text":"us=[x for x in targets if x['type']=='vps_us'][0]"},{"line":605,"text":"results[us['logical_id']]='ALREADY_US_OPERATOR_KEY'"},{"line":621,"text":"return payload,{'generation':gen,'source_class':'vps_md','consistency':'FILESET_PRE_POST_HASH_STABILITY','hashset_sha256':pre},None"},{"line":631,"text":"return payload,{'generation':gen,'source_class':'vps_spb','consistency':'STATIC_CONFIG_FILESET_PRE_POST_HASH_STABILITY','tls_recovery':'REISSUE_TLS_ON_RESTORE','hashset_sha256':pre},None"},{"line":666,"text":"return payload,{'generation':gen,'source_class':'vps_us','consistency':'SQLITE_ONLINE_BACKUP_PLUS_NONDB_FILES','sqlite_count':4},None"},{"line":742,"text":"hits=[ip for ip in ips if sha256_bytes(ip.encode())==ROUTER_TARGET_SHA]"},{"line":743,"text":"if len(hits)!=1: raise BackupError('ROUTER_TARGET_PARSE')"},{"line":744,"text":"target=hits[0]"},{"line":753,"text":"return target,safe[0]"},{"line":783,"text":"target,pf=parse_router_legacy()"},{"line":800,"text":"return payload,{'generation':gen,'source_class':'router','config_sha256':sha256_bytes(a),'read_count':2,'recovery_policy':'IMPORT_PACKAGE_OR_SAFE_CLI_NOT_BLIND_CONFIG_REPLACE'},None"},{"line":802,"text":"def qga_exec(node,vmid,guest_argv,input_bytes=None,timeout=600):"},{"line":803,"text":"args=['qm','guest','exec',str(vmid),'--synchronous','1','--timeout',str(int(timeout))]"},{"line":821,"text":"out=qga_exec(t['node'],t['vmid'],['/usr/bin/python3','-I','-B','-'],xf_guest_builder(t,gen).encode(),timeout=900)"},{"line":833,"text":"b64=qga_exec(t['node'],t['vmid'],['/usr/bin/python3','-I','-B','-c',code,path,str(off),str(take)],None,timeout=60).strip()"},{"line":841,"text":"qga_exec(t['node'],t['vmid'],['/usr/bin/rm','-f',path],None,timeout=30)"},{"line":846,"text":"return local,{'generation':gen,'source_class':'xenforo','site':t['slug'],'vmid':t['vmid'],'node':t['node'],'dump_strategy':t['dump_strategy'],'db_dump_bytes':j.get('db_bytes')},None"},{"line":869,"text":"return payload,{'generation':gen,'source_class':'pve_node_bundle','node':node,'recovery_policy':'CLEAN_INSTALL_JOIN_RECONCILE_NOT_BLIND_PMXCFS_OVERWRITE','member_roots':len(paths)},None"},{"line":871,"text":"def capture_target(t,gen,work):"},{"line":900,"text":"write_state(t['logical_id'],'SUCCESS',generation=gen,verification='existing_control_engine_verify',last_success_epoch=epoch())"},{"line":901,"text":"return {'logical_id':t['logical_id'],'generation':gen,'result':'SUCCESS','payload_bytes':0,'replicas':2}"},{"line":903,"text":"def backup_target(t,green_verify=False):"},{"line":905,"text":"gen=generation_id(t['logical_id']); work=ensure_dir(WORK_ROOT/gen,0o700)"},{"line":908,"text":"payload,meta,cleanup=capture_target(t,gen,work); meta['generation']=gen"},{"line":921,"text":"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())"},{"line":922,"text":"return {'logical_id':t['logical_id'],'generation':gen,'result':'SUCCESS','payload_bytes':manifest['payload_bytes'],'replicas':2,'allocator_healthy':alloc['healthy']}"},{"line":925,"text":"write_state(t['logical_id'],result,generation=gen,reason=e.code,sealed=sealed)"},{"line":929,"text":"targets=load_targets(); chosen=[t for t in targets if t.get('green1')]"},{"line":931,"text":"boots=bootstrap_vps_keys(targets)"},{"line":936,"text":"key=re.sub(r'[^A-Za-z0-9]+','_',t['logical_id']).upper()"},{"line":938,"text":"r=backup_target(t,green_verify=(t['type']!='control'))"},{"line":945,"text":"failures.append((t['logical_id'],e.code)); print(f'{label}_{key}=FAIL'); print(f'{label}_{key}_REASON={e.code}')"},{"line":946,"text":"print(f'{label}_TARGET_COUNT={len(chosen)}')"},{"line":949,"text":"print(f'{label}_CLOUD_BACKUP_TARGET_COUNT={sum(1 for t in chosen if t[\"type\"]!=\"control\")}')"},{"line":950,"text":"print(f'{label}_CONTROL_VERIFY_TARGET_COUNT={sum(1 for t in chosen if t[\"type\"]==\"control\")}')"},{"line":951,"text":"if failures: raise BackupError(label+'_TARGET_FAILURES',','.join(x[0] for x in failures))"},{"line":956,"text":"targets=load_targets(); state=load_state_all(); t=choose_due_target(targets,state)"},{"line":958,"text":"print('SCHEDULE_DECISION=DEFER_NO_DUE_TARGET'); return 0"},{"line":959,"text":"print('SCHEDULE_TARGET='+t['logical_id'])"},{"line":960,"text":"try: backup_target(t,green_verify=False)"},{"line":965,"text":"def discover(logical_id):"},{"line":966,"text":"targets=load_targets(); m={t['logical_id']:t for t in targets}"},{"line":967,"text":"if logical_id not in m: raise BackupError('DISCOVER_UNKNOWN_TARGET')"},{"line":968,"text":"t=m[logical_id]; prefix=f'homelab-backups/v2/{t[\"scope\"]}/{logical_id}/generations'"},{"line":983,"text":"print('DISCOVER_LOGICAL_ID='+logical_id); print('DISCOVER_TWO_PHYSICAL_SEALED_COUNT='+str(len(good)))"},{"line":990,"text":"assert len(default_targets())>=28"},{"line":991,"text":"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'}"},{"line":998,"text":"av,_=proven_lxc_dump_argv({'vmid':112},{'maxdisk':8350298112,'maxmem':536870912,'status':'running','name':'unbound1'},'pve01','/var/tmp/homelab-vzdump-selftest')"}],"path":"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/legacy_engine.py","sha256":"b6e79f087b9f1d21dac4f77a7b46b743299bbb85bc716e80d2ea67c2e038bcd7","size":59719},{"hits":[{"line":76,"text":"need(g['vmid'] in configs,'GUEST_CONFIG_MISSING')"},{"line":77,"text":"original=configs[g['vmid']];cfg=normalized_config(original);summary=np.config_summary(cfg,g['type'])"},{"line":96,"text":"if st is None or st['active'] is not True or st['enabled'] is not True:block.add('STORAGE_NOT_AVAILABLE')"},{"line":124,"text":"need(type(job.get('vmid')) is int and 100<=job['vmid']<=999999999,'VMID')"},{"line":135,"text":"return [str(executable),str(job['vmid']),'--node',job['node'],'--mode','snapshot','--stdout','1',"},{"line":153,"text":"need(type(seconds) in (int,float) and 00,'QEMU_VMID')"},{"line":21,"text":"pat=re.compile(r'^vzdump-qemu-'+re.escape(str(vmid))+r'-(\\d{4}_\\d{2}_\\d{2}-\\d{2}_\\d{2}_\\d{2})\\.vma\\.zst$')"},{"line":29,"text":"expected_log=parent/f'vzdump-qemu-{vmid}-{stamp}.log'"},{"line":42,"text":"if t.get('guest_type')!='qemu': return original(t,gen,work)"},{"line":43,"text":"vmid=int(t['vmid']); rows=[r for r in legacy.cluster_inventory() if int(r.get('vmid',-1))==vmid]"},{"line":46,"text":"_need(typ==t.get('guest_type')=='qemu','PVE_GUEST_TYPE_DRIFT')"},{"line":51,"text":"vp=legacy.ssh_remote(node,['vzdump',str(vmid),'--mode','snapshot','--compress','zstd','--dumpdir',srcdir],timeout=7200,check=False)"},{"line":53,"text":"_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)"},{"line":58,"text":"try: src,log=_select_qemu_outputs(vmid,files)"},{"line":60,"text":"_emit_diag(vmid=vmid,node=node,producer_rc=0,regular_file_count=len(files),archive_selected=False,selector_error=str(e))"},{"line":71,"text":"_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)"},{"line":75,"text":"meta={'generation':gen,'source_class':'pve_guest','vmid':vmid,'guest_type':'qemu','node':node,'status':row.get('status'),"}],"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","sha256":"1906db42bd34bbe85eb46fd9797b3572d46e0a41c29d1c29be5f9df5e448f15b","size":4627},{"hits":[{"line":47,"text":"if not (type(seconds) is int and 00,'SCHEDULER_TARGET_SCHEMA')"},{"line":75,"text":"def write_state(logical_id,result,**kw):"},{"line":77,"text":"prior=_read_prior(legacy,logical_id)"},{"line":81,"text":"return original_write(logical_id,result,**clean)"},{"line":88,"text":"return original_write(logical_id,result,**clean)"},{"line":90,"text":"legacy.choose_due_target=choose_due_target"},{"line":92,"text":"return {'choose_due_target':choose_due_target,'write_state':write_state,"}],"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","sha256":"a6f67159a64067773323f028126e3109e15cf17a8142cea5e6129970f1d4da96","size":4097}] +RPO_SCHEDULER_POLICY_MISMATCH=[{"due_seconds":86400,"enabled":true,"logical_id":"ct112","vmid":112},{"due_seconds":86400,"enabled":true,"logical_id":"guest-pve01-lxc-112","vmid":112},{"due_seconds":86400,"enabled":true,"logical_id":"ct113","vmid":113},{"due_seconds":86400,"enabled":true,"logical_id":"vm130","vmid":130},{"due_seconds":86400,"enabled":true,"logical_id":"vm150","vmid":150},{"due_seconds":86400,"enabled":true,"logical_id":"vm160","vmid":160},{"due_seconds":86400,"enabled":true,"logical_id":"xf-codevipe","vmid":160},{"due_seconds":86400,"enabled":true,"logical_id":"xf-dsmods","vmid":160},{"due_seconds":86400,"enabled":true,"logical_id":"xf-kingofwolk","vmid":160},{"due_seconds":86400,"enabled":true,"logical_id":"xf-gamevipe","vmid":160},{"due_seconds":86400,"enabled":true,"logical_id":"xf-hkmods","vmid":160},{"due_seconds":86400,"enabled":true,"logical_id":"xf-zakrutim","vmid":160}] +DECISION=TARGET_CARDINALITY_OR_MODEL_DRIFT +NO_MUTATION=true +TASK_RESULT=PASS_HOMELAB_BACKUP_DUE_POLICY_SOURCE_RCA_READONLY +HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-SOURCE-RCA-READONLY-1105R1","rollback_restored":null,"rollback_started":false,"status":"OK","version":1} +WORKERS2_DUE_POLICY_SOURCE_RCA_END=1 OUTPUT_END CHAT_OUTPUT_END