diff --git a/runtime/history/SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-TRANSITIVE-STATIC-RCA-1225R1.json b/runtime/history/SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-TRANSITIVE-STATIC-RCA-1225R1.json new file mode 100644 index 00000000..87d539a2 --- /dev/null +++ b/runtime/history/SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-TRANSITIVE-STATIC-RCA-1225R1.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-TRANSITIVE-STATIC-RCA-1225R1", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "read-only", + "component": "homelab-backup-ct110-helper-transitive-static-rca", + "started_at_utc": "2026-09-27T19:10:50Z", + "finished_at_utc": "2026-09-27T19:10:50Z", + "reference_register_checked": true, + "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", + "error_register_checked": true, + "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", + "command_sha256": "6d64e36c947c6baf0c7e53d2c17497d65666c040e09535e4223e53e5c8dbfa19", + "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": "6d6b105d469ee853c1554e02708bf1d9d5be7c963d4a5f9e7ac8024b6ed2c41b", + "sanitized_output_sha256": "6d6b105d469ee853c1554e02708bf1d9d5be7c963d4a5f9e7ac8024b6ed2c41b", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "BACKUP_CT110_HELPER_TRANSITIVE_STATIC_RCA_BEGIN=true\nCOMMAND_ID=SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-TRANSITIVE-STATIC-RCA-1225R1\nMODE=read-only\nCOMPONENT=homelab-backup-ct110-helper-transitive-static-rca\nMUTATION_BOUNDARY=PURE_STATIC_AST_ONLY_NO_PROJECT_IMPORT_NO_HELPER_EXECUTION_NO_VZDUMP_NO_SYSTEMD_ACTION_NO_BACKUP_NO_AUDIT_NO_FILE_MUTATION_NO_LOCK_BREAK_NO_GIT_WRITE_NO_NETBIRD_SKLADCHIK_CHANGE\nHOST=pve01\nCLUSTER_QUORATE=Yes\nRUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\nSOURCE_1224_STATUS=OK\nSOURCE_1224_DECISION=PASS_CT110_HELPER_STATIC_RCA_COLLECTED\nSOURCE_1224_NEXT_GATE=READ_EXACT_1224_AND_DECIDE_SAFE_HELPER_REPLAY_OR_SOURCE_FIX\n=== TRANSITIVE_STATIC_AST ===\nC411_PY_COUNT=17\nC411_FILE=adapter|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/adapter.py|SHA256=18eb29cef165371b48bcb78e1a456e1939e6eff253787218133162cc89ab9fa3|BYTES=2989\nC411_FILE=guest266|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/guest266.py|SHA256=86433bc424d5fa5017c20f7a237c82874b02357a3283660d8a6b0039ef2bc868|BYTES=7385\nC411_FILE=large264|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/large264.py|SHA256=5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a|BYTES=16514\nC411_FILE=nodeplan263|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/nodeplan263.py|SHA256=db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060|BYTES=4603\nC411_FILE=pve265|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/pve265.py|SHA256=cd2f634414a8e38a3789015aeca5a9b47821f77d7d1fa61dcdbdc866172963be|BYTES=12888\nC411_FILE=pve270|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/pve270.py|SHA256=97015277a4f3f8129c0fd11eb70c06293026366f1f8232a97feeed513a2dbcef|BYTES=19595\nC411_FILE=pve282|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/pve282.py|SHA256=73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012|BYTES=6195\nC411_FILE=restore262|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/restore262.py|SHA256=56d1b961c8d5654d5e2ee2755268db46bd2202bca11e69788febf991cfaa79f1|BYTES=14701\nC411_FILE=stream263|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/stream263.py|SHA256=a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16|BYTES=8831\nC411_FILE=test_guest266|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_guest266.py|SHA256=460b950924a475ce0a28dc759512e7dbe2323ae2cc42f7ef4c6181710a2a13da|BYTES=10752\nC411_FILE=test_perl270|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_perl270.py|SHA256=50fc10865078a7b9b255dc627059824184441a47c4ede52e23f24c1186e3512f|BYTES=5441\nC411_FILE=test_producer282|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_producer282.py|SHA256=a67d927cc428935791f9eecc3acf571d089f80761162f4589b7d684fba6b8af7|BYTES=12215\nC411_FILE=test_pve265|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_pve265.py|SHA256=16a9407d01bf73db687ef38684c59205fc2e6a9223cd9cee6ec6e8dde9d38707|BYTES=11781\nC411_FILE=test_pve270|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_pve270.py|SHA256=9fccd20b490613fdd5b14b4105cf0d9fd744f204e1ed1d6893e54c9f69bf6fb4|BYTES=12077\nC411_FILE=test_pve282|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_pve282.py|SHA256=1056407aab76e17181b05e043cb42c086058545a8e0027689ab4e03eee6531c4|BYTES=5785\nC411_FILE=transport261|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/transport261.py|SHA256=b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688|BYTES=15364\nC411_FILE=v2core|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/v2core.py|SHA256=e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2|BYTES=11755\n=== ADAPTER_FULL_SOURCE_BEGIN ===\n0001:#!/usr/bin/python3\n0002:import hashlib,inspect,json,pathlib,sys\n0003:BASE=pathlib.Path(__file__).resolve().parent\n0004:EXPECTED={\n0005:'v2core.py':'e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2',\n0006:'transport261.py':'b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688',\n0007:'restore262.py':'56d1b961c8d5654d5e2ee2755268db46bd2202bca11e69788febf991cfaa79f1',\n0008:'stream263.py':'a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16',\n0009:'nodeplan263.py':'db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060',\n0010:'large264.py':'5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a',\n0011:'pve265.py':'cd2f634414a8e38a3789015aeca5a9b47821f77d7d1fa61dcdbdc866172963be',\n0012:'guest266.py':'86433bc424d5fa5017c20f7a237c82874b02357a3283660d8a6b0039ef2bc868',\n0013:'pve270.py':'97015277a4f3f8129c0fd11eb70c06293026366f1f8232a97feeed513a2dbcef',\n0014:'pve282.py':'73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012'}\n0015:def sha(p):\n0016: h=hashlib.sha256()\n0017: with open(p,'rb') as f:\n0018: for b in iter(lambda:f.read(1048576),b''):h.update(b)\n0019: return h.hexdigest()\n0020:def verify_sources():\n0021: for name,want in EXPECTED.items():\n0022: p=BASE/name\n0023: if not p.is_file() or p.is_symlink() or sha(p)!=want:raise RuntimeError('SOURCE_IDENTITY_'+name)\n0024:def load_graph():\n0025: import guest266,pve265,pve270,pve282\n0026: if hasattr(guest266,'dump_argv'):raise RuntimeError('GUEST266_UNEXPECTED_DUMP_ARGV')\n0027: if not hasattr(pve265,'dump_argv'):raise RuntimeError('PVE265_DUMP_ARGV_MISSING')\n0028: if getattr(pve270,'old',None) is not pve265:raise RuntimeError('PVE270_OLD_NOT_PVE265')\n0029: if getattr(pve282,'old',None) is not pve265:raise RuntimeError('PVE282_OLD_NOT_PVE265')\n0030: if getattr(pve282,'proven',None) is not pve270:raise RuntimeError('PVE282_PROVEN_NOT_PVE270')\n0031: for n in ('MappedScratch','capture_archive','validate_mapping'):\n0032: if not hasattr(pve270,n):raise RuntimeError('PVE270_'+n.upper()+'_MISSING')\n0033: if getattr(pve282,n,None) is not getattr(pve270,n):raise RuntimeError('PVE282_ALIAS_'+n.upper()+'_MISMATCH')\n0034: return guest266,pve265,pve270,pve282\n0035:def describe():\n0036: _,p265,p270,p282=load_graph()\n0037: funcs={'pve265.dump_argv':p265.dump_argv,'pve265.validate_job':p265.validate_job,'pve265.make_plan':p265.make_plan,'pve270.validate_mapping':p270.validate_mapping,'pve270.capture_archive':p270.capture_archive,'pve270.produce':p270.produce,'pve282.select112':p282.select112,'pve282.produce':p282.produce}\n0038: return {'schema':1,'bundle':'pve-lxc-adapter-411r1','source_sha256':EXPECTED,'signatures':{k:str(inspect.signature(v)) for k,v in funcs.items()},'owner':{'dump_argv':'pve265','MappedScratch':'pve270','capture_archive':'pve270','validate_mapping':'pve270','pve282.old':'pve265','pve282.proven':'pve270'}}\n0039:def main():\n0040: verify_sources(); mode=sys.argv[1] if len(sys.argv)>1 else 'selftest'; d=describe()\n0041: if mode not in ('selftest','describe'):raise SystemExit(2)\n0042: print(json.dumps(d,sort_keys=True,separators=(',',':')))\n0043: if mode=='selftest':print('ADAPTER_SELFTEST=PASS')\n0044:if __name__=='__main__':main()\n=== ADAPTER_FULL_SOURCE_END ===\n=== ADAPTER_FUNC_verify_sources_BEGIN ===\n0001:def verify_sources():\n0002: for name,want in EXPECTED.items():\n0003: p=BASE/name\n0004: if not p.is_file() or p.is_symlink() or sha(p)!=want:raise RuntimeError('SOURCE_IDENTITY_'+name)\n=== ADAPTER_FUNC_verify_sources_END ===\n=== ADAPTER_FUNC_load_graph_BEGIN ===\n0001:def load_graph():\n0002: import guest266,pve265,pve270,pve282\n0003: if hasattr(guest266,'dump_argv'):raise RuntimeError('GUEST266_UNEXPECTED_DUMP_ARGV')\n0004: if not hasattr(pve265,'dump_argv'):raise RuntimeError('PVE265_DUMP_ARGV_MISSING')\n0005: if getattr(pve270,'old',None) is not pve265:raise RuntimeError('PVE270_OLD_NOT_PVE265')\n0006: if getattr(pve282,'old',None) is not pve265:raise RuntimeError('PVE282_OLD_NOT_PVE265')\n0007: if getattr(pve282,'proven',None) is not pve270:raise RuntimeError('PVE282_PROVEN_NOT_PVE270')\n0008: for n in ('MappedScratch','capture_archive','validate_mapping'):\n0009: if not hasattr(pve270,n):raise RuntimeError('PVE270_'+n.upper()+'_MISSING')\n0010: if getattr(pve282,n,None) is not getattr(pve270,n):raise RuntimeError('PVE282_ALIAS_'+n.upper()+'_MISMATCH')\n0011: return guest266,pve265,pve270,pve282\n=== ADAPTER_FUNC_load_graph_END ===\nADAPTER_REACHABLE_FUNCTIONS=load_graph,sha,verify_sources\nADAPTER_REACHABLE_EDGES=[[\"verify_sources\",\"sha\"]]\nADAPTER_REACHABLE_CALLS=[{\"args\":[\"guest266\",\"'dump_argv'\"],\"func\":\"hasattr\",\"kw\":[],\"lineno\":26,\"owner\":\"load_graph\"},{\"args\":[\"'GUEST266_UNEXPECTED_DUMP_ARGV'\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":26,\"owner\":\"load_graph\"},{\"args\":[\"pve265\",\"'dump_argv'\"],\"func\":\"hasattr\",\"kw\":[],\"lineno\":27,\"owner\":\"load_graph\"},{\"args\":[\"'PVE265_DUMP_ARGV_MISSING'\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":27,\"owner\":\"load_graph\"},{\"args\":[\"pve270\",\"'old'\",\"None\"],\"func\":\"getattr\",\"kw\":[],\"lineno\":28,\"owner\":\"load_graph\"},{\"args\":[\"'PVE270_OLD_NOT_PVE265'\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":28,\"owner\":\"load_graph\"},{\"args\":[\"pve282\",\"'old'\",\"None\"],\"func\":\"getattr\",\"kw\":[],\"lineno\":29,\"owner\":\"load_graph\"},{\"args\":[\"'PVE282_OLD_NOT_PVE265'\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":29,\"owner\":\"load_graph\"},{\"args\":[\"pve282\",\"'proven'\",\"None\"],\"func\":\"getattr\",\"kw\":[],\"lineno\":30,\"owner\":\"load_graph\"},{\"args\":[\"'PVE282_PROVEN_NOT_PVE270'\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":30,\"owner\":\"load_graph\"},{\"args\":[\"pve270\",\"n\"],\"func\":\"hasattr\",\"kw\":[],\"lineno\":32,\"owner\":\"load_graph\"},{\"args\":[\"'PVE270_' + n.upper() + '_MISSING'\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":32,\"owner\":\"load_graph\"},{\"args\":[\"pve282\",\"n\",\"None\"],\"func\":\"getattr\",\"kw\":[],\"lineno\":33,\"owner\":\"load_graph\"},{\"args\":[\"pve270\",\"n\"],\"func\":\"getattr\",\"kw\":[],\"lineno\":33,\"owner\":\"load_graph\"},{\"args\":[\"'PVE282_ALIAS_' + n.upper() + '_MISMATCH'\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":33,\"owner\":\"load_graph\"},{\"args\":[],\"func\":\"n.upper\",\"kw\":[],\"lineno\":32,\"owner\":\"load_graph\"},{\"args\":[],\"func\":\"n.upper\",\"kw\":[],\"lineno\":33,\"owner\":\"load_graph\"},{\"args\":[],\"func\":\"hashlib.sha256\",\"kw\":[],\"lineno\":16,\"owner\":\"sha\"},{\"args\":[],\"func\":\"h.hexdigest\",\"kw\":[],\"lineno\":19,\"owner\":\"sha\"},{\"args\":[\"p\",\"'rb'\"],\"func\":\"open\",\"kw\":[],\"lineno\":17,\"owner\":\"sha\"},{\"args\":[\"lambda: f.read(1048576)\",\"b''\"],\"func\":\"iter\",\"kw\":[],\"lineno\":18,\"owner\":\"sha\"},{\"args\":[\"b\"],\"func\":\"h.update\",\"kw\":[],\"lineno\":18,\"owner\":\"sha\"},{\"args\":[\"1048576\"],\"func\":\"f.read\",\"kw\":[],\"lineno\":18,\"owner\":\"sha\"},{\"args\":[],\"func\":\"EXPECTED.items\",\"kw\":[],\"lineno\":21,\"owner\":\"verify_sources\"},{\"args\":[],\"func\":\"p.is_symlink\",\"kw\":[],\"lineno\":23,\"owner\":\"verify_sources\"},{\"args\":[\"'SOURCE_IDENTITY_' + name\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":23,\"owner\":\"verify_sources\"},{\"args\":[],\"func\":\"p.is_file\",\"kw\":[],\"lineno\":23,\"owner\":\"verify_sources\"},{\"args\":[\"p\"],\"func\":\"sha\",\"kw\":[],\"lineno\":23,\"owner\":\"verify_sources\"}]\nADAPTER_REACHABLE_SIDE_EFFECT_CALLS=[]\nADAPTER_REACHABLE_SIDE_EFFECT_CALL_COUNT=0\nLOCAL_IMPORT_GRAPH={\"adapter\":[]}\nLOCAL_IMPORT_GRAPH_MODULES=adapter\nMODULE_adapter_TOPLEVEL_CALLS=[{\"args\":[],\"func\":\"resolve\",\"kw\":[],\"lineno\":3},{\"args\":[\"__file__\"],\"func\":\"pathlib.Path\",\"kw\":[],\"lineno\":3},{\"args\":[],\"func\":\"main\",\"kw\":[],\"lineno\":44}]\nMODULE_adapter_TOPLEVEL_SIDE_EFFECT_CALLS=[]\nLOCAL_IMPORT_TOPLEVEL_SIDE_EFFECT_CALLS=[]\nLOCAL_IMPORT_TOPLEVEL_SIDE_EFFECT_COUNT=0\nGUEST266_FOUND=true\n=== GUEST266_NO_ACTIVE_TASKS_BEGIN ===\n0001:def no_active_tasks(rows,vmid):\n0002: t.need(type(rows) is list and len(rows)<1000,'ACTIVE_TASKS_TRUNCATED_OR_INVALID')\n0003: for task in rows:\n0004: t.need(type(task) is dict and type(task.get('type')) is str,'ACTIVE_TASK_SCHEMA')\n0005: # The active index includes completed, not-yet-archived tasks.\n0006: if type(task.get('endtime')) is int and task.get('status') not in (None,'RUNNING'):continue\n0007: kind=task['type'];target=str(task.get('id',''))\n0008: if kind in ('vncshell','vncterm','vncproxy','spiceproxy'):continue\n0009: t.need(target!=str(vmid) and not any(x in kind.lower() for x in ('dump','restore','migrat','snapshot','clone','move_disk','resize')),'COMPETING_PVE_TASK')\n=== GUEST266_NO_ACTIVE_TASKS_END ===\nGUEST266_REACHABLE_FUNCTIONS=no_active_tasks\nGUEST266_REACHABLE_EDGES=[]\nGUEST266_REACHABLE_CALLS=[{\"args\":[\"type(rows) is list and len(rows) < 1000\",\"'ACTIVE_TASKS_TRUNCATED_OR_INVALID'\"],\"func\":\"t.need\",\"kw\":[],\"lineno\":60,\"owner\":\"no_active_tasks\"},{\"args\":[\"type(task) is dict and type(task.get('type')) is str\",\"'ACTIVE_TASK_SCHEMA'\"],\"func\":\"t.need\",\"kw\":[],\"lineno\":62,\"owner\":\"no_active_tasks\"},{\"args\":[\"task.get('id', '')\"],\"func\":\"str\",\"kw\":[],\"lineno\":65,\"owner\":\"no_active_tasks\"},{\"args\":[\"target != str(vmid) and (not any((x in kind.lower() for x in ('dump', 'restore', 'migrat', 'snapshot', 'clone', 'move_disk', 'resize'))))\",\"'COMPETING_PVE_TASK'\"],\"func\":\"t.need\",\"kw\":[],\"lineno\":67,\"owner\":\"no_active_tasks\"},{\"args\":[\"'id'\",\"''\"],\"func\":\"task.get\",\"kw\":[],\"lineno\":65,\"owner\":\"no_active_tasks\"},{\"args\":[\"rows\"],\"func\":\"type\",\"kw\":[],\"lineno\":60,\"owner\":\"no_active_tasks\"},{\"args\":[\"rows\"],\"func\":\"len\",\"kw\":[],\"lineno\":60,\"owner\":\"no_active_tasks\"},{\"args\":[\"task.get('endtime')\"],\"func\":\"type\",\"kw\":[],\"lineno\":64,\"owner\":\"no_active_tasks\"},{\"args\":[\"'status'\"],\"func\":\"task.get\",\"kw\":[],\"lineno\":64,\"owner\":\"no_active_tasks\"},{\"args\":[\"task\"],\"func\":\"type\",\"kw\":[],\"lineno\":62,\"owner\":\"no_active_tasks\"},{\"args\":[\"task.get('type')\"],\"func\":\"type\",\"kw\":[],\"lineno\":62,\"owner\":\"no_active_tasks\"},{\"args\":[\"'endtime'\"],\"func\":\"task.get\",\"kw\":[],\"lineno\":64,\"owner\":\"no_active_tasks\"},{\"args\":[\"vmid\"],\"func\":\"str\",\"kw\":[],\"lineno\":67,\"owner\":\"no_active_tasks\"},{\"args\":[\"(x in kind.lower() for x in ('dump', 'restore', 'migrat', 'snapshot', 'clone', 'move_disk', 'resize'))\"],\"func\":\"any\",\"kw\":[],\"lineno\":67,\"owner\":\"no_active_tasks\"},{\"args\":[\"'type'\"],\"func\":\"task.get\",\"kw\":[],\"lineno\":62,\"owner\":\"no_active_tasks\"},{\"args\":[],\"func\":\"kind.lower\",\"kw\":[],\"lineno\":67,\"owner\":\"no_active_tasks\"}]\nGUEST266_REACHABLE_SIDE_EFFECT_CALLS=[]\nGUEST266_REACHABLE_SIDE_EFFECT_CALL_COUNT=0\nTRANSITIVE_STATIC_REPLAY_SAFE=true\nSTATIC_TRANSITIVE_ANALYSIS_COMPLETE=true\nSTATIC_TRANSITIVE_RC=0\nTRANSITIVE_STATIC_REPLAY_SAFE_SUMMARY=true\nTASK_RESULT=PASS_CT110_HELPER_TRANSITIVE_STATIC_SAFE\nDECISION=PASS_HELPER_REPLAY_STATIC_SAFETY_PROVEN\nNEXT_GATE=CONTROLLED_CT110_HELPER_REPLAY_ONLY\nHOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-TRANSITIVE-STATIC-RCA-1225R1\",\"status\":\"OK\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}\n" +} diff --git a/runtime/history/SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-TRANSITIVE-STATIC-RCA-1225R1.txt b/runtime/history/SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-TRANSITIVE-STATIC-RCA-1225R1.txt new file mode 100644 index 00000000..959a67ee --- /dev/null +++ b/runtime/history/SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-TRANSITIVE-STATIC-RCA-1225R1.txt @@ -0,0 +1,163 @@ +CHAT_OUTPUT_BEGIN +COMMAND_ID=SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-TRANSITIVE-STATIC-RCA-1225R1 +STATUS=OK +RC=0 +HOST=pve01 +MODE=read-only +COMPONENT=homelab-backup-ct110-helper-transitive-static-rca +REFERENCE_REGISTER_CHECK=OK +REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 +COMMAND_SHA256=6d64e36c947c6baf0c7e53d2c17497d65666c040e09535e4223e53e5c8dbfa19 +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=6d6b105d469ee853c1554e02708bf1d9d5be7c963d4a5f9e7ac8024b6ed2c41b +SANITIZED_OUTPUT_SHA256=6d6b105d469ee853c1554e02708bf1d9d5be7c963d4a5f9e7ac8024b6ed2c41b +OUTPUT_BEGIN +BACKUP_CT110_HELPER_TRANSITIVE_STATIC_RCA_BEGIN=true +COMMAND_ID=SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-TRANSITIVE-STATIC-RCA-1225R1 +MODE=read-only +COMPONENT=homelab-backup-ct110-helper-transitive-static-rca +MUTATION_BOUNDARY=PURE_STATIC_AST_ONLY_NO_PROJECT_IMPORT_NO_HELPER_EXECUTION_NO_VZDUMP_NO_SYSTEMD_ACTION_NO_BACKUP_NO_AUDIT_NO_FILE_MUTATION_NO_LOCK_BREAK_NO_GIT_WRITE_NO_NETBIRD_SKLADCHIK_CHANGE +HOST=pve01 +CLUSTER_QUORATE=Yes +RUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d +SOURCE_1224_STATUS=OK +SOURCE_1224_DECISION=PASS_CT110_HELPER_STATIC_RCA_COLLECTED +SOURCE_1224_NEXT_GATE=READ_EXACT_1224_AND_DECIDE_SAFE_HELPER_REPLAY_OR_SOURCE_FIX +=== TRANSITIVE_STATIC_AST === +C411_PY_COUNT=17 +C411_FILE=adapter|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/adapter.py|SHA256=18eb29cef165371b48bcb78e1a456e1939e6eff253787218133162cc89ab9fa3|BYTES=2989 +C411_FILE=guest266|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/guest266.py|SHA256=86433bc424d5fa5017c20f7a237c82874b02357a3283660d8a6b0039ef2bc868|BYTES=7385 +C411_FILE=large264|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/large264.py|SHA256=5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a|BYTES=16514 +C411_FILE=nodeplan263|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/nodeplan263.py|SHA256=db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060|BYTES=4603 +C411_FILE=pve265|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/pve265.py|SHA256=cd2f634414a8e38a3789015aeca5a9b47821f77d7d1fa61dcdbdc866172963be|BYTES=12888 +C411_FILE=pve270|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/pve270.py|SHA256=97015277a4f3f8129c0fd11eb70c06293026366f1f8232a97feeed513a2dbcef|BYTES=19595 +C411_FILE=pve282|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/pve282.py|SHA256=73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012|BYTES=6195 +C411_FILE=restore262|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/restore262.py|SHA256=56d1b961c8d5654d5e2ee2755268db46bd2202bca11e69788febf991cfaa79f1|BYTES=14701 +C411_FILE=stream263|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/stream263.py|SHA256=a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16|BYTES=8831 +C411_FILE=test_guest266|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_guest266.py|SHA256=460b950924a475ce0a28dc759512e7dbe2323ae2cc42f7ef4c6181710a2a13da|BYTES=10752 +C411_FILE=test_perl270|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_perl270.py|SHA256=50fc10865078a7b9b255dc627059824184441a47c4ede52e23f24c1186e3512f|BYTES=5441 +C411_FILE=test_producer282|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_producer282.py|SHA256=a67d927cc428935791f9eecc3acf571d089f80761162f4589b7d684fba6b8af7|BYTES=12215 +C411_FILE=test_pve265|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_pve265.py|SHA256=16a9407d01bf73db687ef38684c59205fc2e6a9223cd9cee6ec6e8dde9d38707|BYTES=11781 +C411_FILE=test_pve270|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_pve270.py|SHA256=9fccd20b490613fdd5b14b4105cf0d9fd744f204e1ed1d6893e54c9f69bf6fb4|BYTES=12077 +C411_FILE=test_pve282|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_pve282.py|SHA256=1056407aab76e17181b05e043cb42c086058545a8e0027689ab4e03eee6531c4|BYTES=5785 +C411_FILE=transport261|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/transport261.py|SHA256=b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688|BYTES=15364 +C411_FILE=v2core|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/v2core.py|SHA256=e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2|BYTES=11755 +=== ADAPTER_FULL_SOURCE_BEGIN === +0001:#!/usr/bin/python3 +0002:import hashlib,inspect,json,pathlib,sys +0003:BASE=pathlib.Path(__file__).resolve().parent +0004:EXPECTED={ +0005:'v2core.py':'e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2', +0006:'transport261.py':'b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688', +0007:'restore262.py':'56d1b961c8d5654d5e2ee2755268db46bd2202bca11e69788febf991cfaa79f1', +0008:'stream263.py':'a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16', +0009:'nodeplan263.py':'db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060', +0010:'large264.py':'5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a', +0011:'pve265.py':'cd2f634414a8e38a3789015aeca5a9b47821f77d7d1fa61dcdbdc866172963be', +0012:'guest266.py':'86433bc424d5fa5017c20f7a237c82874b02357a3283660d8a6b0039ef2bc868', +0013:'pve270.py':'97015277a4f3f8129c0fd11eb70c06293026366f1f8232a97feeed513a2dbcef', +0014:'pve282.py':'73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012'} +0015:def sha(p): +0016: h=hashlib.sha256() +0017: with open(p,'rb') as f: +0018: for b in iter(lambda:f.read(1048576),b''):h.update(b) +0019: return h.hexdigest() +0020:def verify_sources(): +0021: for name,want in EXPECTED.items(): +0022: p=BASE/name +0023: if not p.is_file() or p.is_symlink() or sha(p)!=want:raise RuntimeError('SOURCE_IDENTITY_'+name) +0024:def load_graph(): +0025: import guest266,pve265,pve270,pve282 +0026: if hasattr(guest266,'dump_argv'):raise RuntimeError('GUEST266_UNEXPECTED_DUMP_ARGV') +0027: if not hasattr(pve265,'dump_argv'):raise RuntimeError('PVE265_DUMP_ARGV_MISSING') +0028: if getattr(pve270,'old',None) is not pve265:raise RuntimeError('PVE270_OLD_NOT_PVE265') +0029: if getattr(pve282,'old',None) is not pve265:raise RuntimeError('PVE282_OLD_NOT_PVE265') +0030: if getattr(pve282,'proven',None) is not pve270:raise RuntimeError('PVE282_PROVEN_NOT_PVE270') +0031: for n in ('MappedScratch','capture_archive','validate_mapping'): +0032: if not hasattr(pve270,n):raise RuntimeError('PVE270_'+n.upper()+'_MISSING') +0033: if getattr(pve282,n,None) is not getattr(pve270,n):raise RuntimeError('PVE282_ALIAS_'+n.upper()+'_MISMATCH') +0034: return guest266,pve265,pve270,pve282 +0035:def describe(): +0036: _,p265,p270,p282=load_graph() +0037: funcs={'pve265.dump_argv':p265.dump_argv,'pve265.validate_job':p265.validate_job,'pve265.make_plan':p265.make_plan,'pve270.validate_mapping':p270.validate_mapping,'pve270.capture_archive':p270.capture_archive,'pve270.produce':p270.produce,'pve282.select112':p282.select112,'pve282.produce':p282.produce} +0038: return {'schema':1,'bundle':'pve-lxc-adapter-411r1','source_sha256':EXPECTED,'signatures':{k:str(inspect.signature(v)) for k,v in funcs.items()},'owner':{'dump_argv':'pve265','MappedScratch':'pve270','capture_archive':'pve270','validate_mapping':'pve270','pve282.old':'pve265','pve282.proven':'pve270'}} +0039:def main(): +0040: verify_sources(); mode=sys.argv[1] if len(sys.argv)>1 else 'selftest'; d=describe() +0041: if mode not in ('selftest','describe'):raise SystemExit(2) +0042: print(json.dumps(d,sort_keys=True,separators=(',',':'))) +0043: if mode=='selftest':print('ADAPTER_SELFTEST=PASS') +0044:if __name__=='__main__':main() +=== ADAPTER_FULL_SOURCE_END === +=== ADAPTER_FUNC_verify_sources_BEGIN === +0001:def verify_sources(): +0002: for name,want in EXPECTED.items(): +0003: p=BASE/name +0004: if not p.is_file() or p.is_symlink() or sha(p)!=want:raise RuntimeError('SOURCE_IDENTITY_'+name) +=== ADAPTER_FUNC_verify_sources_END === +=== ADAPTER_FUNC_load_graph_BEGIN === +0001:def load_graph(): +0002: import guest266,pve265,pve270,pve282 +0003: if hasattr(guest266,'dump_argv'):raise RuntimeError('GUEST266_UNEXPECTED_DUMP_ARGV') +0004: if not hasattr(pve265,'dump_argv'):raise RuntimeError('PVE265_DUMP_ARGV_MISSING') +0005: if getattr(pve270,'old',None) is not pve265:raise RuntimeError('PVE270_OLD_NOT_PVE265') +0006: if getattr(pve282,'old',None) is not pve265:raise RuntimeError('PVE282_OLD_NOT_PVE265') +0007: if getattr(pve282,'proven',None) is not pve270:raise RuntimeError('PVE282_PROVEN_NOT_PVE270') +0008: for n in ('MappedScratch','capture_archive','validate_mapping'): +0009: if not hasattr(pve270,n):raise RuntimeError('PVE270_'+n.upper()+'_MISSING') +0010: if getattr(pve282,n,None) is not getattr(pve270,n):raise RuntimeError('PVE282_ALIAS_'+n.upper()+'_MISMATCH') +0011: return guest266,pve265,pve270,pve282 +=== ADAPTER_FUNC_load_graph_END === +ADAPTER_REACHABLE_FUNCTIONS=load_graph,sha,verify_sources +ADAPTER_REACHABLE_EDGES=[["verify_sources","sha"]] +ADAPTER_REACHABLE_CALLS=[{"args":["guest266","'dump_argv'"],"func":"hasattr","kw":[],"lineno":26,"owner":"load_graph"},{"args":["'GUEST266_UNEXPECTED_DUMP_ARGV'"],"func":"RuntimeError","kw":[],"lineno":26,"owner":"load_graph"},{"args":["pve265","'dump_argv'"],"func":"hasattr","kw":[],"lineno":27,"owner":"load_graph"},{"args":["'PVE265_DUMP_ARGV_MISSING'"],"func":"RuntimeError","kw":[],"lineno":27,"owner":"load_graph"},{"args":["pve270","'old'","None"],"func":"getattr","kw":[],"lineno":28,"owner":"load_graph"},{"args":["'PVE270_OLD_NOT_PVE265'"],"func":"RuntimeError","kw":[],"lineno":28,"owner":"load_graph"},{"args":["pve282","'old'","None"],"func":"getattr","kw":[],"lineno":29,"owner":"load_graph"},{"args":["'PVE282_OLD_NOT_PVE265'"],"func":"RuntimeError","kw":[],"lineno":29,"owner":"load_graph"},{"args":["pve282","'proven'","None"],"func":"getattr","kw":[],"lineno":30,"owner":"load_graph"},{"args":["'PVE282_PROVEN_NOT_PVE270'"],"func":"RuntimeError","kw":[],"lineno":30,"owner":"load_graph"},{"args":["pve270","n"],"func":"hasattr","kw":[],"lineno":32,"owner":"load_graph"},{"args":["'PVE270_' + n.upper() + '_MISSING'"],"func":"RuntimeError","kw":[],"lineno":32,"owner":"load_graph"},{"args":["pve282","n","None"],"func":"getattr","kw":[],"lineno":33,"owner":"load_graph"},{"args":["pve270","n"],"func":"getattr","kw":[],"lineno":33,"owner":"load_graph"},{"args":["'PVE282_ALIAS_' + n.upper() + '_MISMATCH'"],"func":"RuntimeError","kw":[],"lineno":33,"owner":"load_graph"},{"args":[],"func":"n.upper","kw":[],"lineno":32,"owner":"load_graph"},{"args":[],"func":"n.upper","kw":[],"lineno":33,"owner":"load_graph"},{"args":[],"func":"hashlib.sha256","kw":[],"lineno":16,"owner":"sha"},{"args":[],"func":"h.hexdigest","kw":[],"lineno":19,"owner":"sha"},{"args":["p","'rb'"],"func":"open","kw":[],"lineno":17,"owner":"sha"},{"args":["lambda: f.read(1048576)","b''"],"func":"iter","kw":[],"lineno":18,"owner":"sha"},{"args":["b"],"func":"h.update","kw":[],"lineno":18,"owner":"sha"},{"args":["1048576"],"func":"f.read","kw":[],"lineno":18,"owner":"sha"},{"args":[],"func":"EXPECTED.items","kw":[],"lineno":21,"owner":"verify_sources"},{"args":[],"func":"p.is_symlink","kw":[],"lineno":23,"owner":"verify_sources"},{"args":["'SOURCE_IDENTITY_' + name"],"func":"RuntimeError","kw":[],"lineno":23,"owner":"verify_sources"},{"args":[],"func":"p.is_file","kw":[],"lineno":23,"owner":"verify_sources"},{"args":["p"],"func":"sha","kw":[],"lineno":23,"owner":"verify_sources"}] +ADAPTER_REACHABLE_SIDE_EFFECT_CALLS=[] +ADAPTER_REACHABLE_SIDE_EFFECT_CALL_COUNT=0 +LOCAL_IMPORT_GRAPH={"adapter":[]} +LOCAL_IMPORT_GRAPH_MODULES=adapter +MODULE_adapter_TOPLEVEL_CALLS=[{"args":[],"func":"resolve","kw":[],"lineno":3},{"args":["__file__"],"func":"pathlib.Path","kw":[],"lineno":3},{"args":[],"func":"main","kw":[],"lineno":44}] +MODULE_adapter_TOPLEVEL_SIDE_EFFECT_CALLS=[] +LOCAL_IMPORT_TOPLEVEL_SIDE_EFFECT_CALLS=[] +LOCAL_IMPORT_TOPLEVEL_SIDE_EFFECT_COUNT=0 +GUEST266_FOUND=true +=== GUEST266_NO_ACTIVE_TASKS_BEGIN === +0001:def no_active_tasks(rows,vmid): +0002: t.need(type(rows) is list and len(rows)<1000,'ACTIVE_TASKS_TRUNCATED_OR_INVALID') +0003: for task in rows: +0004: t.need(type(task) is dict and type(task.get('type')) is str,'ACTIVE_TASK_SCHEMA') +0005: # The active index includes completed, not-yet-archived tasks. +0006: if type(task.get('endtime')) is int and task.get('status') not in (None,'RUNNING'):continue +0007: kind=task['type'];target=str(task.get('id','')) +0008: if kind in ('vncshell','vncterm','vncproxy','spiceproxy'):continue +0009: t.need(target!=str(vmid) and not any(x in kind.lower() for x in ('dump','restore','migrat','snapshot','clone','move_disk','resize')),'COMPETING_PVE_TASK') +=== GUEST266_NO_ACTIVE_TASKS_END === +GUEST266_REACHABLE_FUNCTIONS=no_active_tasks +GUEST266_REACHABLE_EDGES=[] +GUEST266_REACHABLE_CALLS=[{"args":["type(rows) is list and len(rows) < 1000","'ACTIVE_TASKS_TRUNCATED_OR_INVALID'"],"func":"t.need","kw":[],"lineno":60,"owner":"no_active_tasks"},{"args":["type(task) is dict and type(task.get('type')) is str","'ACTIVE_TASK_SCHEMA'"],"func":"t.need","kw":[],"lineno":62,"owner":"no_active_tasks"},{"args":["task.get('id', '')"],"func":"str","kw":[],"lineno":65,"owner":"no_active_tasks"},{"args":["target != str(vmid) and (not any((x in kind.lower() for x in ('dump', 'restore', 'migrat', 'snapshot', 'clone', 'move_disk', 'resize'))))","'COMPETING_PVE_TASK'"],"func":"t.need","kw":[],"lineno":67,"owner":"no_active_tasks"},{"args":["'id'","''"],"func":"task.get","kw":[],"lineno":65,"owner":"no_active_tasks"},{"args":["rows"],"func":"type","kw":[],"lineno":60,"owner":"no_active_tasks"},{"args":["rows"],"func":"len","kw":[],"lineno":60,"owner":"no_active_tasks"},{"args":["task.get('endtime')"],"func":"type","kw":[],"lineno":64,"owner":"no_active_tasks"},{"args":["'status'"],"func":"task.get","kw":[],"lineno":64,"owner":"no_active_tasks"},{"args":["task"],"func":"type","kw":[],"lineno":62,"owner":"no_active_tasks"},{"args":["task.get('type')"],"func":"type","kw":[],"lineno":62,"owner":"no_active_tasks"},{"args":["'endtime'"],"func":"task.get","kw":[],"lineno":64,"owner":"no_active_tasks"},{"args":["vmid"],"func":"str","kw":[],"lineno":67,"owner":"no_active_tasks"},{"args":["(x in kind.lower() for x in ('dump', 'restore', 'migrat', 'snapshot', 'clone', 'move_disk', 'resize'))"],"func":"any","kw":[],"lineno":67,"owner":"no_active_tasks"},{"args":["'type'"],"func":"task.get","kw":[],"lineno":62,"owner":"no_active_tasks"},{"args":[],"func":"kind.lower","kw":[],"lineno":67,"owner":"no_active_tasks"}] +GUEST266_REACHABLE_SIDE_EFFECT_CALLS=[] +GUEST266_REACHABLE_SIDE_EFFECT_CALL_COUNT=0 +TRANSITIVE_STATIC_REPLAY_SAFE=true +STATIC_TRANSITIVE_ANALYSIS_COMPLETE=true +STATIC_TRANSITIVE_RC=0 +TRANSITIVE_STATIC_REPLAY_SAFE_SUMMARY=true +TASK_RESULT=PASS_CT110_HELPER_TRANSITIVE_STATIC_SAFE +DECISION=PASS_HELPER_REPLAY_STATIC_SAFETY_PROVEN +NEXT_GATE=CONTROLLED_CT110_HELPER_REPLAY_ONLY +HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-TRANSITIVE-STATIC-RCA-1225R1","status":"OK","changes_made":false,"rollback_started":false,"rollback_restored":null} + +OUTPUT_END +CHAT_OUTPUT_END diff --git a/runtime/latest.json b/runtime/latest.json index da732225..87d539a2 100644 --- a/runtime/latest.json +++ b/runtime/latest.json @@ -1,19 +1,19 @@ { "schema_version": 1, "channel": "homelab-runtime", - "command_id": "SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-STATIC-RCA-1224R1", + "command_id": "SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-TRANSITIVE-STATIC-RCA-1225R1", "status": "OK", "rc": 0, "host": "pve01", "mode": "read-only", - "component": "homelab-backup-ct110-helper-static-rca", - "started_at_utc": "2026-09-27T19:07:26Z", - "finished_at_utc": "2026-09-27T19:07:27Z", + "component": "homelab-backup-ct110-helper-transitive-static-rca", + "started_at_utc": "2026-09-27T19:10:50Z", + "finished_at_utc": "2026-09-27T19:10:50Z", "reference_register_checked": true, "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", "error_register_checked": true, "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", - "command_sha256": "faba4e1f6f97021372c410262f26fab58019db46970c85c6114fe565805b743c", + "command_sha256": "6d64e36c947c6baf0c7e53d2c17497d65666c040e09535e4223e53e5c8dbfa19", "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": "e993a99af1682917d2eff9792b35263a335005e41b0df60d3121979071b61d52", - "sanitized_output_sha256": "e993a99af1682917d2eff9792b35263a335005e41b0df60d3121979071b61d52", + "raw_evidence_sha256": "6d6b105d469ee853c1554e02708bf1d9d5be7c963d4a5f9e7ac8024b6ed2c41b", + "sanitized_output_sha256": "6d6b105d469ee853c1554e02708bf1d9d5be7c963d4a5f9e7ac8024b6ed2c41b", "output_truncated_in_json": false, "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", - "output": "BACKUP_CT110_HELPER_STATIC_RCA_BEGIN=true\nCOMMAND_ID=SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-STATIC-RCA-1224R1\nMODE=read-only\nCOMPONENT=homelab-backup-ct110-helper-static-rca\nMUTATION_BOUNDARY=PURE_STATIC_SOURCE_AND_AST_ANALYSIS;NO_PROJECT_MODULE_IMPORT;NO_HELPER_EXECUTION;NO_VZDUMP;NO_SYSTEMD_ACTION;NO_BACKUP;NO_AUDIT_RUN;NO_FILE_WRITE_EXCEPT_RUNNER_TEMP;NO_LOCK_BREAK;NO_GIT_WRITE;NO_NETBIRD_SKLADCHIK_CHANGE\nHOST=pve01\nCLUSTER_QUORATE=Yes\nRUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\nSOURCE_1223_STATUS=OK\nSOURCE_1223_DECISION=HOLD_HELPER_REPLAY_SAFETY_GATE\nSOURCE_1223_NEXT_GATE=READ_EXACT_1223_AND_DESIGN_NONEXECUTING_HELPER_RCA\n=== FILE_IDENTITY ===\nHELPER_EXISTS=true\nHELPER_PATH=/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/fresh_lxc_helper.py\nHELPER_SHA256=dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011\nHELPER_SHA_MATCH=true\nLXC_EXISTS=true\nLXC_PATH=/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/lxc_adapter.py\nLXC_SHA256=3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d\nLXC_SHA_MATCH=true\nPVE265_EXISTS=true\nPVE265_PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/pve265.py\nPVE265_SHA256=cd2f634414a8e38a3789015aeca5a9b47821f77d7d1fa61dcdbdc866172963be\nPVE265_SHA_MATCH=true\n=== STATIC_AST ===\nHELPER_PATH=/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/fresh_lxc_helper.py\nHELPER_SHA256=dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011\nHELPER_BYTES=2320\nHELPER_IMPORTS=[{\"kind\":\"from\",\"level\":0,\"lineno\":1,\"module\":\"__future__\",\"names\":[{\"as\":null,\"name\":\"annotations\"}]},{\"kind\":\"import\",\"lineno\":2,\"names\":[{\"as\":null,\"name\":\"base64\"},{\"as\":null,\"name\":\"hashlib\"},{\"as\":null,\"name\":\"json\"},{\"as\":null,\"name\":\"pathlib\"},{\"as\":null,\"name\":\"sys\"}]},{\"kind\":\"import\",\"lineno\":19,\"names\":[{\"as\":null,\"name\":\"adapter\"}]}]\nHELPER_ALL_CALLS=[{\"argc\":1,\"func\":\"pathlib.Path\",\"kw\":[],\"lineno\":4},{\"argc\":0,\"func\":\"hexdigest\",\"kw\":[],\"lineno\":9},{\"argc\":1,\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":12},{\"argc\":2,\"func\":\"sys.path.insert\",\"kw\":[],\"lineno\":18},{\"argc\":0,\"func\":\"adapter.verify_sources\",\"kw\":[],\"lineno\":20},{\"argc\":0,\"func\":\"adapter.load_graph\",\"kw\":[],\"lineno\":21},{\"argc\":1,\"func\":\"sys.stdin.buffer.read\",\"kw\":[],\"lineno\":22},{\"argc\":1,\"func\":\"json.loads\",\"kw\":[],\"lineno\":24},{\"argc\":1,\"func\":\"raw.get\",\"kw\":[],\"lineno\":26},{\"argc\":1,\"func\":\"raw.get\",\"kw\":[],\"lineno\":26},{\"argc\":1,\"func\":\"raw.get\",\"kw\":[],\"lineno\":26},{\"argc\":1,\"func\":\"raw.get\",\"kw\":[],\"lineno\":26},{\"argc\":6,\"func\":\"pve265.make_plan\",\"kw\":[\"node\"],\"lineno\":30},{\"argc\":2,\"func\":\"pve265.validate_job\",\"kw\":[],\"lineno\":34},{\"argc\":2,\"func\":\"guest266.no_active_tasks\",\"kw\":[],\"lineno\":37},{\"argc\":4,\"func\":\"pve265.dump_argv\",\"kw\":[],\"lineno\":38},{\"argc\":1,\"func\":\"sys.stdout.write\",\"kw\":[],\"lineno\":41},{\"argc\":1,\"func\":\"SystemExit\",\"kw\":[],\"lineno\":45},{\"argc\":1,\"func\":\"len\",\"kw\":[],\"lineno\":15},{\"argc\":1,\"func\":\"fail\",\"kw\":[],\"lineno\":15},{\"argc\":0,\"func\":\"p.is_symlink\",\"kw\":[],\"lineno\":17},{\"argc\":1,\"func\":\"fail\",\"kw\":[],\"lineno\":17},{\"argc\":1,\"func\":\"str\",\"kw\":[],\"lineno\":18},{\"argc\":1,\"func\":\"fail\",\"kw\":[],\"lineno\":23},{\"argc\":1,\"func\":\"data.decode\",\"kw\":[],\"lineno\":24},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":25},{\"argc\":1,\"func\":\"fail\",\"kw\":[],\"lineno\":25},{\"argc\":1,\"func\":\"fail\",\"kw\":[],\"lineno\":27},{\"argc\":1,\"func\":\"int\",\"kw\":[],\"lineno\":28},{\"argc\":1,\"func\":\"base64.b64decode\",\"kw\":[],\"lineno\":29},{\"argc\":1,\"func\":\"raw.get\",\"kw\":[],\"lineno\":30},{\"argc\":1,\"func\":\"raw.get\",\"kw\":[],\"lineno\":30},{\"argc\":1,\"func\":\"int\",\"kw\":[],\"lineno\":30},{\"argc\":1,\"func\":\"len\",\"kw\":[],\"lineno\":32},{\"argc\":1,\"func\":\"fail\",\"kw\":[],\"lineno\":32},{\"argc\":1,\"func\":\"fail\",\"kw\":[],\"lineno\":35},{\"argc\":1,\"func\":\"fail\",\"kw\":[],\"lineno\":36},{\"argc\":1,\"func\":\"raw.get\",\"kw\":[],\"lineno\":37},{\"argc\":0,\"func\":\"main\",\"kw\":[],\"lineno\":45},{\"argc\":1,\"func\":\"hashlib.sha256\",\"kw\":[],\"lineno\":9},{\"argc\":0,\"func\":\"p.is_file\",\"kw\":[],\"lineno\":17},{\"argc\":1,\"func\":\"sha\",\"kw\":[],\"lineno\":17},{\"argc\":1,\"func\":\"len\",\"kw\":[],\"lineno\":23},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":27},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":27},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":27},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":27},{\"argc\":2,\"func\":\"raw.get\",\"kw\":[],\"lineno\":28},{\"argc\":1,\"func\":\"raw.get\",\"kw\":[],\"lineno\":29},{\"argc\":1,\"func\":\"raw.get\",\"kw\":[],\"lineno\":30},{\"argc\":1,\"func\":\"job.get\",\"kw\":[],\"lineno\":35},{\"argc\":1,\"func\":\"job.get\",\"kw\":[],\"lineno\":35},{\"argc\":1,\"func\":\"job.get\",\"kw\":[],\"lineno\":36},{\"argc\":1,\"func\":\"job.get\",\"kw\":[],\"lineno\":36},{\"argc\":1,\"func\":\"job.get\",\"kw\":[],\"lineno\":40},{\"argc\":1,\"func\":\"json.dumps\",\"kw\":[\"separators\",\"sort_keys\"],\"lineno\":41},{\"argc\":0,\"func\":\"p.read_bytes\",\"kw\":[],\"lineno\":9},{\"argc\":1,\"func\":\"j.get\",\"kw\":[],\"lineno\":31}]\nHELPER_DANGEROUS_CALL_HITS=[]\nHELPER_DANGEROUS_LITERALS=[\"vzdump\"]\nLXC_PATH=/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/lxc_adapter.py\nLXC_SHA256=3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d\nLXC_BYTES=13825\nLXC_IMPORTS=[{\"kind\":\"from\",\"level\":0,\"lineno\":1,\"module\":\"__future__\",\"names\":[{\"as\":null,\"name\":\"annotations\"}]},{\"kind\":\"import\",\"lineno\":2,\"names\":[{\"as\":null,\"name\":\"base64\"},{\"as\":null,\"name\":\"hashlib\"},{\"as\":null,\"name\":\"json\"},{\"as\":null,\"name\":\"os\"},{\"as\":null,\"name\":\"pathlib\"},{\"as\":null,\"name\":\"re\"},{\"as\":null,\"name\":\"selectors\"},{\"as\":null,\"name\":\"shlex\"},{\"as\":null,\"name\":\"signal\"},{\"as\":null,\"name\":\"stat\"},{\"as\":null,\"name\":\"subprocess\"},{\"as\":null,\"name\":\"sys\"},{\"as\":null,\"name\":\"time\"}]}]\nLXC_ALL_CALLS=[{\"argc\":0,\"func\":\"hashlib.sha256\",\"kw\":[],\"lineno\":23},{\"argc\":0,\"func\":\"h.hexdigest\",\"kw\":[],\"lineno\":26},{\"argc\":1,\"func\":\"memoryview\",\"kw\":[],\"lineno\":29},{\"argc\":2,\"func\":\"legacy.ssh_remote\",\"kw\":[\"timeout\"],\"lineno\":36},{\"argc\":0,\"func\":\"split\",\"kw\":[],\"lineno\":37},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":38},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":42},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":43},{\"argc\":2,\"func\":\"_j\",\"kw\":[],\"lineno\":44},{\"argc\":2,\"func\":\"_j\",\"kw\":[],\"lineno\":45},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":46},{\"argc\":2,\"func\":\"_j\",\"kw\":[],\"lineno\":55},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":56},{\"argc\":2,\"func\":\"legacy.ssh_remote\",\"kw\":[\"timeout\",\"check\"],\"lineno\":57},{\"argc\":1,\"func\":\"os.statvfs\",\"kw\":[],\"lineno\":61},{\"argc\":1,\"func\":\"int\",\"kw\":[],\"lineno\":61},{\"argc\":1,\"func\":\"encode\",\"kw\":[],\"lineno\":66},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":67},{\"argc\":1,\"func\":\"subprocess.run\",\"kw\":[\"input\",\"capture_output\",\"timeout\",\"cwd\",\"env\"],\"lineno\":68},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":69},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":72},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":76},{\"argc\":1,\"func\":\"int\",\"kw\":[],\"lineno\":80},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":81},{\"argc\":1,\"func\":\"row.get\",\"kw\":[],\"lineno\":82},{\"argc\":1,\"func\":\"row.get\",\"kw\":[],\"lineno\":82},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":83},{\"argc\":2,\"func\":\"legacy._default_unprivileged_lxc\",\"kw\":[],\"lineno\":84},{\"argc\":1,\"func\":\"_helper\",\"kw\":[],\"lineno\":85},{\"argc\":1,\"func\":\"_helper\",\"kw\":[],\"lineno\":85},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":86},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":87},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":88},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":92},{\"argc\":0,\"func\":\"encode\",\"kw\":[],\"lineno\":94},{\"argc\":1,\"func\":\"subprocess.run\",\"kw\":[\"input\",\"capture_output\",\"timeout\",\"cwd\",\"env\"],\"lineno\":95},{\"argc\":2,\"func\":\"isinstance\",\"kw\":[],\"lineno\":102},{\"argc\":1,\"func\":\"out.get\",\"kw\":[],\"lineno\":104},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":104},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":105},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":118},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":119},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":120},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":121},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":122},{\"argc\":1,\"func\":\"pathlib.Path\",\"kw\":[],\"lineno\":123},{\"argc\":1,\"func\":\"os.lstat\",\"kw\":[],\"lineno\":124},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":124},{\"argc\":3,\"func\":\"os.open\",\"kw\":[],\"lineno\":126},{\"argc\":3,\"func\":\"os.open\",\"kw\":[],\"lineno\":126},{\"argc\":1,\"func\":\"os.fstat\",\"kw\":[],\"lineno\":127},{\"argc\":0,\"func\":\"hashlib.sha256\",\"kw\":[],\"lineno\":128},{\"argc\":0,\"func\":\"hashlib.sha256\",\"kw\":[],\"lineno\":128},{\"argc\":1,\"func\":\"print\",\"kw\":[\"flush\"],\"lineno\":187},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":190},{\"argc\":0,\"func\":\"resolve\",\"kw\":[],\"lineno\":6},{\"argc\":0,\"func\":\"resolve\",\"kw\":[],\"lineno\":7},{\"argc\":1,\"func\":\"__init__\",\"kw\":[],\"lineno\":13},{\"argc\":1,\"func\":\"AdapterError\",\"kw\":[],\"lineno\":16},{\"argc\":1,\"func\":\"json.loads\",\"kw\":[],\"lineno\":19},{\"argc\":2,\"func\":\"open\",\"kw\":[\"buffering\"],\"lineno\":24},{\"argc\":2,\"func\":\"iter\",\"kw\":[],\"lineno\":25},{\"argc\":2,\"func\":\"os.write\",\"kw\":[],\"lineno\":31},{\"argc\":2,\"func\":\"legacy.ssh_remote\",\"kw\":[\"timeout\"],\"lineno\":44},{\"argc\":2,\"func\":\"legacy.ssh_remote\",\"kw\":[\"timeout\"],\"lineno\":45},{\"argc\":2,\"func\":\"_j\",\"kw\":[],\"lineno\":52},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":53},{\"argc\":1,\"func\":\"configs.append\",\"kw\":[],\"lineno\":54},{\"argc\":2,\"func\":\"legacy.ssh_remote\",\"kw\":[\"timeout\"],\"lineno\":55},{\"argc\":1,\"func\":\"int\",\"kw\":[],\"lineno\":62},{\"argc\":1,\"func\":\"json.loads\",\"kw\":[],\"lineno\":70},{\"argc\":4,\"func\":\"_live_inputs\",\"kw\":[],\"lineno\":85},{\"argc\":4,\"func\":\"_live_inputs\",\"kw\":[],\"lineno\":85},{\"argc\":1,\"func\":\"str\",\"kw\":[],\"lineno\":93},{\"argc\":1,\"func\":\"int\",\"kw\":[],\"lineno\":93},{\"argc\":1,\"func\":\"int\",\"kw\":[],\"lineno\":93},{\"argc\":2,\"func\":\"ExecFailure\",\"kw\":[],\"lineno\":97},{\"argc\":1,\"func\":\"json.loads\",\"kw\":[],\"lineno\":98},{\"argc\":1,\"func\":\"out.get\",\"kw\":[],\"lineno\":101},{\"argc\":1,\"func\":\"out.get\",\"kw\":[],\"lineno\":101},{\"argc\":1,\"func\":\"out.get\",\"kw\":[],\"lineno\":102},{\"argc\":1,\"func\":\"summary.update\",\"kw\":[],\"lineno\":102},{\"argc\":2,\"func\":\"ExecFailure\",\"kw\":[],\"lineno\":103},{\"argc\":2,\"func\":\"os.killpg\",\"kw\":[],\"lineno\":109},{\"argc\":0,\"func\":\"p.wait\",\"kw\":[\"timeout\"],\"lineno\":111},{\"argc\":1,\"func\":\"shlex.join\",\"kw\":[],\"lineno\":129},{\"argc\":0,\"func\":\"time.monotonic\",\"kw\":[],\"lineno\":131},{\"argc\":1,\"func\":\"subprocess.Popen\",\"kw\":[\"stdin\",\"stdout\",\"stderr\",\"cwd\",\"env\",\"start_new_session\",\"close_fds\"],\"lineno\":133},{\"argc\":0,\"func\":\"selectors.DefaultSelector\",\"kw\":[],\"lineno\":134},{\"argc\":0,\"func\":\"sel.get_map\",\"kw\":[],\"lineno\":136},{\"argc\":0,\"func\":\"p.wait\",\"kw\":[\"timeout\"],\"lineno\":150},{\"argc\":1,\"func\":\"os.fstat\",\"kw\":[],\"lineno\":153},{\"argc\":1,\"func\":\"os.stat\",\"kw\":[\"follow_symlinks\"],\"lineno\":153},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":156},{\"argc\":2,\"func\":\"os.fchmod\",\"kw\":[],\"lineno\":157},{\"argc\":1,\"func\":\"os.fsync\",\"kw\":[],\"lineno\":157},{\"argc\":1,\"func\":\"os.fsync\",\"kw\":[],\"lineno\":157},{\"argc\":1,\"func\":\"os.close\",\"kw\":[],\"lineno\":173},{\"argc\":1,\"func\":\"os.close\",\"kw\":[],\"lineno\":173},{\"argc\":1,\"func\":\"callable\",\"kw\":[],\"lineno\":190},{\"argc\":1,\"func\":\"int\",\"kw\":[],\"lineno\":193},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":194},{\"argc\":1,\"func\":\"row.get\",\"kw\":[],\"lineno\":195},{\"argc\":1,\"func\":\"row.get\",\"kw\":[],\"lineno\":195},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":196},{\"argc\":2,\"func\":\"legacy._default_unprivileged_lxc\",\"kw\":[],\"lineno\":197},{\"argc\":2,\"func\":\"legacy.ssh_remote\",\"kw\":[\"timeout\"],\"lineno\":199},{\"argc\":2,\"func\":\"legacy.ssh_remote\",\"kw\":[\"timeout\"],\"lineno\":200},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":201},{\"argc\":1,\"func\":\"AdapterError\",\"kw\":[],\"lineno\":20},{\"argc\":1,\"func\":\"h.update\",\"kw\":[],\"lineno\":25},{\"argc\":1,\"func\":\"AdapterError\",\"kw\":[],\"lineno\":32},{\"argc\":0,\"func\":\"strip\",\"kw\":[],\"lineno\":37},{\"argc\":3,\"func\":\"_remote_sha\",\"kw\":[],\"lineno\":42},{\"argc\":3,\"func\":\"_remote_sha\",\"kw\":[],\"lineno\":43},{\"argc\":1,\"func\":\"int\",\"kw\":[],\"lineno\":50},{\"argc\":2,\"func\":\"legacy.ssh_remote\",\"kw\":[\"timeout\"],\"lineno\":52},{\"argc\":2,\"func\":\"legacy.ssh_remote\",\"kw\":[\"timeout\"],\"lineno\":59},{\"argc\":1,\"func\":\"AdapterError\",\"kw\":[],\"lineno\":60},{\"argc\":0,\"func\":\"time.time\",\"kw\":[],\"lineno\":62},{\"argc\":1,\"func\":\"decode\",\"kw\":[],\"lineno\":63},{\"argc\":1,\"func\":\"json.dumps\",\"kw\":[\"separators\",\"sort_keys\"],\"lineno\":66},{\"argc\":1,\"func\":\"len\",\"kw\":[],\"lineno\":67},{\"argc\":1,\"func\":\"str\",\"kw\":[],\"lineno\":68},{\"argc\":1,\"func\":\"AdapterError\",\"kw\":[],\"lineno\":71},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":76},{\"argc\":0,\"func\":\"job.items\",\"kw\":[],\"lineno\":77},{\"argc\":0,\"func\":\"legacy.cluster_inventory\",\"kw\":[],\"lineno\":80},{\"argc\":1,\"func\":\"len\",\"kw\":[],\"lineno\":81},{\"argc\":1,\"func\":\"t.get\",\"kw\":[],\"lineno\":83},{\"argc\":1,\"func\":\"_stable_job\",\"kw\":[],\"lineno\":86},{\"argc\":1,\"func\":\"_stable_job\",\"kw\":[],\"lineno\":86},{\"argc\":3,\"func\":\"_remote_sha\",\"kw\":[],\"lineno\":88},{\"argc\":1,\"func\":\"json.dumps\",\"kw\":[\"separators\",\"sort_keys\"],\"lineno\":94},{\"argc\":1,\"func\":\"str\",\"kw\":[],\"lineno\":95},{\"argc\":1,\"func\":\"len\",\"kw\":[],\"lineno\":96},{\"argc\":2,\"func\":\"ExecFailure\",\"kw\":[],\"lineno\":100},{\"argc\":1,\"func\":\"out.get\",\"kw\":[],\"lineno\":103},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":104},{\"argc\":0,\"func\":\"is_file\",\"kw\":[],\"lineno\":105},{\"argc\":1,\"func\":\"result.get\",\"kw\":[],\"lineno\":106},{\"argc\":0,\"func\":\"p.wait\",\"kw\":[],\"lineno\":115},{\"argc\":1,\"func\":\"all\",\"kw\":[],\"lineno\":119},{\"argc\":3,\"func\":\"_remote_sha\",\"kw\":[],\"lineno\":122},{\"argc\":1,\"func\":\"stat.S_ISDIR\",\"kw\":[],\"lineno\":124},{\"argc\":2,\"func\":\"os.set_blocking\",\"kw\":[],\"lineno\":135},{\"argc\":2,\"func\":\"sel.register\",\"kw\":[],\"lineno\":135},{\"argc\":0,\"func\":\"time.monotonic\",\"kw\":[],\"lineno\":137},{\"argc\":1,\"func\":\"sel.select\",\"kw\":[],\"lineno\":139},{\"argc\":0,\"func\":\"time.monotonic\",\"kw\":[],\"lineno\":148},{\"argc\":2,\"func\":\"ExecFailure\",\"kw\":[],\"lineno\":149},{\"argc\":2,\"func\":\"ExecFailure\",\"kw\":[],\"lineno\":151},{\"argc\":2,\"func\":\"ExecFailure\",\"kw\":[],\"lineno\":152},{\"argc\":2,\"func\":\"ExecFailure\",\"kw\":[],\"lineno\":155},{\"argc\":0,\"func\":\"digest.hexdigest\",\"kw\":[],\"lineno\":158},{\"argc\":0,\"func\":\"eh.hexdigest\",\"kw\":[],\"lineno\":159},{\"argc\":1,\"func\":\"summary.update\",\"kw\":[],\"lineno\":164},{\"argc\":2,\"func\":\"ExecFailure\",\"kw\":[],\"lineno\":164},{\"argc\":0,\"func\":\"sel.close\",\"kw\":[],\"lineno\":170},{\"argc\":1,\"func\":\"os.fsync\",\"kw\":[],\"lineno\":171},{\"argc\":1,\"func\":\"os.fsync\",\"kw\":[],\"lineno\":171},{\"argc\":0,\"func\":\"eh.hexdigest\",\"kw\":[],\"lineno\":175},{\"argc\":0,\"func\":\"encode\",\"kw\":[],\"lineno\":177},{\"argc\":3,\"func\":\"os.open\",\"kw\":[],\"lineno\":178},{\"argc\":1,\"func\":\"json.dumps\",\"kw\":[\"separators\",\"sort_keys\"],\"lineno\":187},{\"argc\":1,\"func\":\"t.get\",\"kw\":[],\"lineno\":192},{\"argc\":3,\"func\":\"original\",\"kw\":[],\"lineno\":192},{\"argc\":2,\"func\":\"legacy.mapped_scratch_probe\",\"kw\":[],\"lineno\":203},{\"argc\":3,\"func\":\"plan_only\",\"kw\":[],\"lineno\":204},{\"argc\":1,\"func\":\"int\",\"kw\":[],\"lineno\":204},{\"argc\":2,\"func\":\"_need\",\"kw\":[],\"lineno\":210},{\"argc\":2,\"func\":\"_emit_diag\",\"kw\":[],\"lineno\":211},{\"argc\":1,\"func\":\"row.get\",\"kw\":[],\"lineno\":215},{\"argc\":1,\"func\":\"pathlib.Path\",\"kw\":[],\"lineno\":6},{\"argc\":1,\"func\":\"pathlib.Path\",\"kw\":[],\"lineno\":7},{\"argc\":0,\"func\":\"super\",\"kw\":[],\"lineno\":13},{\"argc\":1,\"func\":\"f.read\",\"kw\":[],\"lineno\":25},{\"argc\":1,\"func\":\"len\",\"kw\":[],\"lineno\":38},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":46},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":46},{\"argc\":2,\"func\":\"isinstance\",\"kw\":[],\"lineno\":49},{\"argc\":1,\"func\":\"r.get\",\"kw\":[],\"lineno\":49},{\"argc\":1,\"func\":\"r.get\",\"kw\":[],\"lineno\":49},{\"argc\":1,\"func\":\"r.get\",\"kw\":[],\"lineno\":50},{\"argc\":1,\"func\":\"AdapterError\",\"kw\":[],\"lineno\":51},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":53},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":56},{\"argc\":1,\"func\":\"len\",\"kw\":[],\"lineno\":56},{\"argc\":1,\"func\":\"len\",\"kw\":[],\"lineno\":69},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":72},{\"argc\":1,\"func\":\"out.get\",\"kw\":[],\"lineno\":72},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":72},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":72},{\"argc\":1,\"func\":\"int\",\"kw\":[],\"lineno\":80},{\"argc\":0,\"func\":\"hexdigest\",\"kw\":[],\"lineno\":97},{\"argc\":1,\"func\":\"len\",\"kw\":[],\"lineno\":97},{\"argc\":1,\"func\":\"int\",\"kw\":[],\"lineno\":105},{\"argc\":2,\"func\":\"os.killpg\",\"kw\":[],\"lineno\":113},{\"argc\":2,\"func\":\"re.fullmatch\",\"kw\":[],\"lineno\":118},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":119},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":121},{\"argc\":1,\"func\":\"stat.S_ISLNK\",\"kw\":[],\"lineno\":124},{\"argc\":1,\"func\":\"stat.S_IMODE\",\"kw\":[],\"lineno\":124},{\"argc\":0,\"func\":\"pipe.fileno\",\"kw\":[],\"lineno\":135},{\"argc\":2,\"func\":\"ExecFailure\",\"kw\":[],\"lineno\":138},{\"argc\":2,\"func\":\"min\",\"kw\":[],\"lineno\":139},{\"argc\":2,\"func\":\"os.read\",\"kw\":[],\"lineno\":140},{\"argc\":3,\"func\":\"_remote_sha\",\"kw\":[],\"lineno\":156},{\"argc\":1,\"func\":\"_kill\",\"kw\":[],\"lineno\":161},{\"argc\":0,\"func\":\"eh.hexdigest\",\"kw\":[],\"lineno\":163},{\"argc\":0,\"func\":\"p.poll\",\"kw\":[],\"lineno\":167},{\"argc\":1,\"func\":\"_kill\",\"kw\":[],\"lineno\":167},{\"argc\":0,\"func\":\"p.stdout.close\",\"kw\":[],\"lineno\":168},{\"argc\":0,\"func\":\"p.stderr.close\",\"kw\":[],\"lineno\":169},{\"argc\":2,\"func\":\"_write_all\",\"kw\":[],\"lineno\":179},{\"argc\":1,\"func\":\"os.fsync\",\"kw\":[],\"lineno\":179},{\"argc\":1,\"func\":\"os.close\",\"kw\":[],\"lineno\":180},{\"argc\":0,\"func\":\"legacy.cluster_inventory\",\"kw\":[],\"lineno\":193},{\"argc\":1,\"func\":\"len\",\"kw\":[],\"lineno\":194},{\"argc\":1,\"func\":\"t.get\",\"kw\":[],\"lineno\":196},{\"argc\":0,\"func\":\"strip\",\"kw\":[],\"lineno\":201},{\"argc\":1,\"func\":\"pathlib.Path\",\"kw\":[],\"lineno\":204},{\"argc\":2,\"func\":\"legacy.ssh_remote\",\"kw\":[\"timeout\",\"check\"],\"lineno\":213},{\"argc\":2,\"func\":\"p.stdout.decode\",\"kw\":[],\"lineno\":37},{\"argc\":1,\"func\":\"base64.b64encode\",\"kw\":[],\"lineno\":63},{\"argc\":1,\"func\":\"out.get\",\"kw\":[],\"lineno\":72},{\"argc\":1,\"func\":\"out.get\",\"kw\":[],\"lineno\":72},{\"argc\":2,\"func\":\"r.get\",\"kw\":[],\"lineno\":80},{\"argc\":0,\"func\":\"hexdigest\",\"kw\":[],\"lineno\":100},{\"argc\":1,\"func\":\"len\",\"kw\":[],\"lineno\":100},{\"argc\":1,\"func\":\"pathlib.Path\",\"kw\":[],\"lineno\":105},{\"argc\":0,\"func\":\"stat\",\"kw\":[],\"lineno\":105},{\"argc\":2,\"func\":\"result.get\",\"kw\":[],\"lineno\":105},{\"argc\":1,\"func\":\"str\",\"kw\":[],\"lineno\":118},{\"argc\":2,\"func\":\"max\",\"kw\":[],\"lineno\":139},{\"argc\":0,\"func\":\"key.fileobj.fileno\",\"kw\":[],\"lineno\":140},{\"argc\":1,\"func\":\"sel.unregister\",\"kw\":[],\"lineno\":141},{\"argc\":2,\"func\":\"_write_all\",\"kw\":[],\"lineno\":144},{\"argc\":1,\"func\":\"digest.update\",\"kw\":[],\"lineno\":144},{\"argc\":1,\"func\":\"len\",\"kw\":[],\"lineno\":144},{\"argc\":1,\"func\":\"len\",\"kw\":[],\"lineno\":146},{\"argc\":1,\"func\":\"eh.update\",\"kw\":[],\"lineno\":146},{\"argc\":0,\"func\":\"p.poll\",\"kw\":[],\"lineno\":161},{\"argc\":1,\"func\":\"int\",\"kw\":[],\"lineno\":193},{\"argc\":6,\"func\":\"_execute_local\",\"kw\":[],\"lineno\":206},{\"argc\":6,\"func\":\"_execute_remote\",\"kw\":[],\"lineno\":206},{\"argc\":2,\"func\":\"_emit_diag\",\"kw\":[],\"lineno\":208},{\"argc\":1,\"func\":\"legacy.BackupError\",\"kw\":[],\"lineno\":209},{\"argc\":0,\"func\":\"local.is_file\",\"kw\":[],\"lineno\":210},{\"argc\":1,\"func\":\"hashlib.sha256\",\"kw\":[],\"lineno\":97},{\"argc\":1,\"func\":\"argv.index\",\"kw\":[],\"lineno\":120},{\"argc\":2,\"func\":\"ExecFailure\",\"kw\":[],\"lineno\":143},{\"argc\":2,\"func\":\"_write_all\",\"kw\":[],\"lineno\":147},{\"argc\":1,\"func\":\"len\",\"kw\":[],\"lineno\":147},{\"argc\":1,\"func\":\"json.dumps\",\"kw\":[\"separators\",\"sort_keys\"],\"lineno\":177},{\"argc\":2,\"func\":\"r.get\",\"kw\":[],\"lineno\":193},{\"argc\":0,\"func\":\"q.stdout.decode\",\"kw\":[],\"lineno\":201},{\"argc\":1,\"func\":\"hashlib.sha256\",\"kw\":[],\"lineno\":100},{\"argc\":1,\"func\":\"pathlib.Path\",\"kw\":[],\"lineno\":105},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":119},{\"argc\":1,\"func\":\"len\",\"kw\":[],\"lineno\":143},{\"argc\":2,\"func\":\"max\",\"kw\":[],\"lineno\":146},{\"argc\":0,\"func\":\"local.stat\",\"kw\":[],\"lineno\":210}]\nLXC_DANGEROUS_CALL_HITS=[{\"argc\":1,\"func\":\"subprocess.run\",\"kw\":[\"input\",\"capture_output\",\"timeout\",\"cwd\",\"env\"],\"lineno\":68},{\"argc\":1,\"func\":\"subprocess.run\",\"kw\":[\"input\",\"capture_output\",\"timeout\",\"cwd\",\"env\"],\"lineno\":95},{\"argc\":3,\"func\":\"os.open\",\"kw\":[],\"lineno\":126},{\"argc\":3,\"func\":\"os.open\",\"kw\":[],\"lineno\":126},{\"argc\":2,\"func\":\"open\",\"kw\":[\"buffering\"],\"lineno\":24},{\"argc\":1,\"func\":\"subprocess.Popen\",\"kw\":[\"stdin\",\"stdout\",\"stderr\",\"cwd\",\"env\",\"start_new_session\",\"close_fds\"],\"lineno\":133},{\"argc\":3,\"func\":\"os.open\",\"kw\":[],\"lineno\":178}]\nLXC_DANGEROUS_LITERALS=[\"vzdump\"]\nPVE265_PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/pve265.py\nPVE265_SHA256=cd2f634414a8e38a3789015aeca5a9b47821f77d7d1fa61dcdbdc866172963be\nPVE265_BYTES=12888\nPVE265_IMPORTS=[{\"kind\":\"import\",\"lineno\":6,\"names\":[{\"as\":null,\"name\":\"hashlib\"}]},{\"kind\":\"import\",\"lineno\":7,\"names\":[{\"as\":null,\"name\":\"os\"}]},{\"kind\":\"from\",\"level\":0,\"lineno\":8,\"module\":\"pathlib\",\"names\":[{\"as\":null,\"name\":\"Path\"}]},{\"kind\":\"import\",\"lineno\":9,\"names\":[{\"as\":null,\"name\":\"re\"}]},{\"kind\":\"import\",\"lineno\":10,\"names\":[{\"as\":null,\"name\":\"selectors\"}]},{\"kind\":\"import\",\"lineno\":11,\"names\":[{\"as\":null,\"name\":\"signal\"}]},{\"kind\":\"import\",\"lineno\":12,\"names\":[{\"as\":null,\"name\":\"stat\"}]},{\"kind\":\"import\",\"lineno\":13,\"names\":[{\"as\":null,\"name\":\"subprocess\"}]},{\"kind\":\"import\",\"lineno\":14,\"names\":[{\"as\":null,\"name\":\"time\"}]},{\"kind\":\"import\",\"lineno\":15,\"names\":[{\"as\":\"core\",\"name\":\"v2core\"}]},{\"kind\":\"import\",\"lineno\":16,\"names\":[{\"as\":\"t\",\"name\":\"transport261\"}]},{\"kind\":\"import\",\"lineno\":17,\"names\":[{\"as\":\"stream\",\"name\":\"stream263\"}]},{\"kind\":\"import\",\"lineno\":18,\"names\":[{\"as\":\"np\",\"name\":\"nodeplan263\"}]}]\nPVE265_ALL_CALLS=[{\"argc\":1,\"func\":\"re.compile\",\"kw\":[],\"lineno\":24},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":38},{\"argc\":0,\"func\":\"set\",\"kw\":[],\"lineno\":43},{\"argc\":0,\"func\":\"set\",\"kw\":[],\"lineno\":43},{\"argc\":0,\"func\":\"text.splitlines\",\"kw\":[],\"lineno\":44},{\"argc\":1,\"func\":\"sorted\",\"kw\":[],\"lineno\":55},{\"argc\":1,\"func\":\"sorted\",\"kw\":[],\"lineno\":55},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":58},{\"argc\":1,\"func\":\"dict\",\"kw\":[],\"lineno\":59},{\"argc\":0,\"func\":\"out.items\",\"kw\":[],\"lineno\":60},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":67},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":68},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":69},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":70},{\"argc\":2,\"func\":\"np.guests\",\"kw\":[],\"lineno\":71},{\"argc\":1,\"func\":\"np.storages\",\"kw\":[],\"lineno\":71},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":72},{\"argc\":1,\"func\":\"defaults_summary\",\"kw\":[],\"lineno\":73},{\"argc\":1,\"func\":\"t.sha\",\"kw\":[],\"lineno\":120},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":123},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":124},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":125},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":126},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":127},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":128},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":129},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":130},{\"argc\":2,\"func\":\"validate_job\",\"kw\":[],\"lineno\":133},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":134},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":151},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":152},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":153},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":154},{\"argc\":0,\"func\":\"check\",\"kw\":[],\"lineno\":154},{\"argc\":1,\"func\":\"Path\",\"kw\":[],\"lineno\":155},{\"argc\":1,\"func\":\"stream.private_dir\",\"kw\":[],\"lineno\":155},{\"argc\":0,\"func\":\"hashlib.sha256\",\"kw\":[],\"lineno\":156},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":193},{\"argc\":0,\"func\":\"tools.values\",\"kw\":[],\"lineno\":194},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":205},{\"argc\":0,\"func\":\"guard\",\"kw\":[],\"lineno\":205},{\"argc\":2,\"func\":\"validate_job\",\"kw\":[],\"lineno\":205},{\"argc\":1,\"func\":\"validate_tools\",\"kw\":[],\"lineno\":205},{\"argc\":1,\"func\":\"Path\",\"kw\":[],\"lineno\":206},{\"argc\":1,\"func\":\"stream.private_dir\",\"kw\":[],\"lineno\":206},{\"argc\":1,\"func\":\"t.make_dir\",\"kw\":[\"exclusive\"],\"lineno\":209},{\"argc\":0,\"func\":\"free_guard\",\"kw\":[],\"lineno\":213},{\"argc\":5,\"func\":\"capture_archive\",\"kw\":[],\"lineno\":214},{\"argc\":0,\"func\":\"guard\",\"kw\":[],\"lineno\":215},{\"argc\":1,\"func\":\"validate_tools\",\"kw\":[],\"lineno\":215},{\"argc\":4,\"func\":\"t.bounded_process\",\"kw\":[],\"lineno\":216},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":217},{\"argc\":2,\"func\":\"stream.hash_file\",\"kw\":[],\"lineno\":218},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":219},{\"argc\":0,\"func\":\"guard\",\"kw\":[],\"lineno\":220},{\"argc\":1,\"func\":\"validate_tools\",\"kw\":[],\"lineno\":220},{\"argc\":1,\"func\":\"PVEError\",\"kw\":[],\"lineno\":32},{\"argc\":2,\"func\":\"isinstance\",\"kw\":[],\"lineno\":35},{\"argc\":0,\"func\":\"is_absolute\",\"kw\":[],\"lineno\":35},{\"argc\":1,\"func\":\"all\",\"kw\":[],\"lineno\":35},{\"argc\":1,\"func\":\"raw.decode\",\"kw\":[],\"lineno\":41},{\"argc\":0,\"func\":\"line.strip\",\"kw\":[],\"lineno\":45},{\"argc\":2,\"func\":\"re.fullmatch\",\"kw\":[],\"lineno\":47},{\"argc\":0,\"func\":\"m.groups\",\"kw\":[],\"lineno\":49},{\"argc\":1,\"func\":\"seen.add\",\"kw\":[],\"lineno\":51},{\"argc\":1,\"func\":\"np.valid_id\",\"kw\":[],\"lineno\":67},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":76},{\"argc\":1,\"func\":\"normalized_config\",\"kw\":[],\"lineno\":77},{\"argc\":2,\"func\":\"np.config_summary\",\"kw\":[],\"lineno\":77},{\"argc\":1,\"func\":\"t.sha\",\"kw\":[],\"lineno\":78},{\"argc\":1,\"func\":\"any\",\"kw\":[],\"lineno\":83},{\"argc\":1,\"func\":\"sum\",\"kw\":[],\"lineno\":99},{\"argc\":2,\"func\":\"max\",\"kw\":[],\"lineno\":103},{\"argc\":2,\"func\":\"min\",\"kw\":[],\"lineno\":104},{\"argc\":1,\"func\":\"sorted\",\"kw\":[],\"lineno\":106},{\"argc\":1,\"func\":\"jobs.append\",\"kw\":[],\"lineno\":113},{\"argc\":1,\"func\":\"len\",\"kw\":[],\"lineno\":114},{\"argc\":1,\"func\":\"all\",\"kw\":[],\"lineno\":116},{\"argc\":1,\"func\":\"core.canonical_bytes\",\"kw\":[],\"lineno\":120},{\"argc\":1,\"func\":\"core.valid_hash\",\"kw\":[],\"lineno\":128},{\"argc\":1,\"func\":\"str\",\"kw\":[],\"lineno\":135},{\"argc\":1,\"func\":\"str\",\"kw\":[],\"lineno\":135},{\"argc\":1,\"func\":\"str\",\"kw\":[],\"lineno\":137},{\"argc\":2,\"func\":\"os.killpg\",\"kw\":[],\"lineno\":141},{\"argc\":0,\"func\":\"p.wait\",\"kw\":[\"timeout\"],\"lineno\":143},{\"argc\":1,\"func\":\"callable\",\"kw\":[],\"lineno\":154},{\"argc\":0,\"func\":\"time.monotonic\",\"kw\":[],\"lineno\":156},{\"argc\":3,\"func\":\"os.open\",\"kw\":[\"dir_fd\"],\"lineno\":158},{\"argc\":1,\"func\":\"os.fstat\",\"kw\":[],\"lineno\":159},{\"argc\":1,\"func\":\"subprocess.Popen\",\"kw\":[\"stdin\",\"stdout\",\"stderr\",\"env\",\"start_new_session\",\"close_fds\"],\"lineno\":160},{\"argc\":0,\"func\":\"selectors.DefaultSelector\",\"kw\":[],\"lineno\":162},{\"argc\":0,\"func\":\"sel.get_map\",\"kw\":[],\"lineno\":165},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":174},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":177},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":177},{\"argc\":0,\"func\":\"check\",\"kw\":[],\"lineno\":177},{\"argc\":1,\"func\":\"os.fstat\",\"kw\":[],\"lineno\":178},{\"argc\":1,\"func\":\"os.stat\",\"kw\":[\"dir_fd\",\"follow_symlinks\"],\"lineno\":178},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":179},{\"argc\":2,\"func\":\"os.fchmod\",\"kw\":[],\"lineno\":181},{\"argc\":1,\"func\":\"os.fsync\",\"kw\":[],\"lineno\":181},{\"argc\":1,\"func\":\"os.fsync\",\"kw\":[],\"lineno\":181},{\"argc\":1,\"func\":\"os.close\",\"kw\":[],\"lineno\":190},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":195},{\"argc\":2,\"func\":\"t.read_secure\",\"kw\":[],\"lineno\":196},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":197},{\"argc\":1,\"func\":\"callable\",\"kw\":[],\"lineno\":205},{\"argc\":1,\"func\":\"int\",\"kw\":[],\"lineno\":205},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":207},{\"argc\":1,\"func\":\"os.close\",\"kw\":[],\"lineno\":208},{\"argc\":1,\"func\":\"os.statvfs\",\"kw\":[],\"lineno\":212},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":212},{\"argc\":4,\"func\":\"dump_argv\",\"kw\":[],\"lineno\":214},{\"argc\":1,\"func\":\"dict\",\"kw\":[],\"lineno\":216},{\"argc\":2,\"func\":\"min\",\"kw\":[],\"lineno\":216},{\"argc\":1,\"func\":\"str\",\"kw\":[],\"lineno\":221},{\"argc\":1,\"func\":\"t.sha\",\"kw\":[],\"lineno\":39},{\"argc\":1,\"func\":\"line.startswith\",\"kw\":[],\"lineno\":46},{\"argc\":1,\"func\":\"block.add\",\"kw\":[],\"lineno\":48},{\"argc\":1,\"func\":\"block.add\",\"kw\":[],\"lineno\":50},{\"argc\":1,\"func\":\"block.add\",\"kw\":[],\"lineno\":52},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":58},{\"argc\":1,\"func\":\"DISK_RE.fullmatch\",\"kw\":[],\"lineno\":61},{\"argc\":1,\"func\":\"v.startswith\",\"kw\":[],\"lineno\":62},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":70},{\"argc\":1,\"func\":\"len\",\"kw\":[],\"lineno\":72},{\"argc\":1,\"func\":\"len\",\"kw\":[],\"lineno\":72},{\"argc\":1,\"func\":\"core.canonical_bytes\",\"kw\":[],\"lineno\":78},{\"argc\":1,\"func\":\"set\",\"kw\":[],\"lineno\":79},{\"argc\":1,\"func\":\"set\",\"kw\":[],\"lineno\":79},{\"argc\":1,\"func\":\"block.add\",\"kw\":[],\"lineno\":80},{\"argc\":1,\"func\":\"block.add\",\"kw\":[],\"lineno\":81},{\"argc\":1,\"func\":\"block.add\",\"kw\":[],\"lineno\":82},{\"argc\":1,\"func\":\"block.add\",\"kw\":[],\"lineno\":84},{\"argc\":1,\"func\":\"stores.get\",\"kw\":[],\"lineno\":95},{\"argc\":1,\"func\":\"block.add\",\"kw\":[],\"lineno\":100},{\"argc\":2,\"func\":\"min\",\"kw\":[],\"lineno\":102},{\"argc\":1,\"func\":\"block.add\",\"kw\":[],\"lineno\":105},{\"argc\":1,\"func\":\"bool\",\"kw\":[],\"lineno\":109},{\"argc\":1,\"func\":\"bool\",\"kw\":[],\"lineno\":110},{\"argc\":1,\"func\":\"np.valid_id\",\"kw\":[],\"lineno\":125},{\"argc\":1,\"func\":\"job.get\",\"kw\":[],\"lineno\":128},{\"argc\":1,\"func\":\"path_ok\",\"kw\":[],\"lineno\":134},{\"argc\":1,\"func\":\"path_ok\",\"kw\":[],\"lineno\":134},{\"argc\":0,\"func\":\"p.wait\",\"kw\":[],\"lineno\":147},{\"argc\":1,\"func\":\"all\",\"kw\":[],\"lineno\":151},{\"argc\":2,\"func\":\"os.set_blocking\",\"kw\":[],\"lineno\":163},{\"argc\":2,\"func\":\"sel.register\",\"kw\":[],\"lineno\":163},{\"argc\":0,\"func\":\"time.monotonic\",\"kw\":[],\"lineno\":166},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":166},{\"argc\":1,\"func\":\"sel.select\",\"kw\":[],\"lineno\":168},{\"argc\":0,\"func\":\"p.wait\",\"kw\":[\"timeout\"],\"lineno\":175},{\"argc\":0,\"func\":\"digest.hexdigest\",\"kw\":[],\"lineno\":182},{\"argc\":1,\"func\":\"list\",\"kw\":[],\"lineno\":182},{\"argc\":0,\"func\":\"p.wait\",\"kw\":[],\"lineno\":186},{\"argc\":0,\"func\":\"p.stdout.close\",\"kw\":[],\"lineno\":187},{\"argc\":0,\"func\":\"p.stderr.close\",\"kw\":[],\"lineno\":187},{\"argc\":0,\"func\":\"sel.close\",\"kw\":[],\"lineno\":188},{\"argc\":1,\"func\":\"os.close\",\"kw\":[],\"lineno\":189},{\"argc\":1,\"func\":\"Path\",\"kw\":[],\"lineno\":196},{\"argc\":0,\"func\":\"time.time\",\"kw\":[],\"lineno\":205},{\"argc\":1,\"func\":\"int\",\"kw\":[],\"lineno\":214},{\"argc\":1,\"func\":\"str\",\"kw\":[],\"lineno\":216},{\"argc\":1,\"func\":\"Path\",\"kw\":[],\"lineno\":35},{\"argc\":1,\"func\":\"Path\",\"kw\":[],\"lineno\":35},{\"argc\":1,\"func\":\"block.add\",\"kw\":[],\"lineno\":53},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":61},{\"argc\":1,\"func\":\"v.startswith\",\"kw\":[],\"lineno\":63},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":68},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":69},{\"argc\":1,\"func\":\"split\",\"kw\":[],\"lineno\":87},{\"argc\":1,\"func\":\"field.partition\",\"kw\":[],\"lineno\":88},{\"argc\":1,\"func\":\"block.add\",\"kw\":[],\"lineno\":91},{\"argc\":1,\"func\":\"block.add\",\"kw\":[],\"lineno\":96},{\"argc\":1,\"func\":\"sizes.append\",\"kw\":[],\"lineno\":98},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":123},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":123},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":124},{\"argc\":1,\"func\":\"job.get\",\"kw\":[],\"lineno\":125},{\"argc\":1,\"func\":\"job.get\",\"kw\":[],\"lineno\":125},{\"argc\":1,\"func\":\"job.get\",\"kw\":[],\"lineno\":126},{\"argc\":1,\"func\":\"job.get\",\"kw\":[],\"lineno\":126},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":127},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":129},{\"argc\":1,\"func\":\"job.get\",\"kw\":[],\"lineno\":130},{\"argc\":1,\"func\":\"job.get\",\"kw\":[],\"lineno\":130},{\"argc\":2,\"func\":\"os.killpg\",\"kw\":[],\"lineno\":145},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":151},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":152},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":153},{\"argc\":1,\"func\":\"dict\",\"kw\":[],\"lineno\":161},{\"argc\":0,\"func\":\"pipe.fileno\",\"kw\":[],\"lineno\":163},{\"argc\":0,\"func\":\"check\",\"kw\":[],\"lineno\":167},{\"argc\":2,\"func\":\"min\",\"kw\":[],\"lineno\":168},{\"argc\":2,\"func\":\"os.read\",\"kw\":[],\"lineno\":169},{\"argc\":0,\"func\":\"time.monotonic\",\"kw\":[],\"lineno\":174},{\"argc\":1,\"func\":\"PVEError\",\"kw\":[],\"lineno\":176},{\"argc\":1,\"func\":\"t.ident\",\"kw\":[],\"lineno\":182},{\"argc\":1,\"func\":\"terminate\",\"kw\":[],\"lineno\":185},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":193},{\"argc\":1,\"func\":\"set\",\"kw\":[],\"lineno\":193},{\"argc\":1,\"func\":\"path_ok\",\"kw\":[],\"lineno\":195},{\"argc\":1,\"func\":\"core.valid_hash\",\"kw\":[],\"lineno\":195},{\"argc\":1,\"func\":\"bool\",\"kw\":[],\"lineno\":197},{\"argc\":1,\"func\":\"os.listdir\",\"kw\":[],\"lineno\":207},{\"argc\":0,\"func\":\"time.time\",\"kw\":[],\"lineno\":214},{\"argc\":1,\"func\":\"list\",\"kw\":[],\"lineno\":219},{\"argc\":1,\"func\":\"ord\",\"kw\":[],\"lineno\":35},{\"argc\":1,\"func\":\"str\",\"kw\":[],\"lineno\":35},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":38},{\"argc\":1,\"func\":\"len\",\"kw\":[],\"lineno\":38},{\"argc\":1,\"func\":\"block.add\",\"kw\":[],\"lineno\":54},{\"argc\":2,\"func\":\"re.match\",\"kw\":[],\"lineno\":83},{\"argc\":1,\"func\":\"block.add\",\"kw\":[],\"lineno\":97},{\"argc\":1,\"func\":\"job.get\",\"kw\":[],\"lineno\":124},{\"argc\":1,\"func\":\"job.get\",\"kw\":[],\"lineno\":127},{\"argc\":1,\"func\":\"job.get\",\"kw\":[],\"lineno\":129},{\"argc\":2,\"func\":\"max\",\"kw\":[],\"lineno\":168},{\"argc\":0,\"func\":\"key.fileobj.fileno\",\"kw\":[],\"lineno\":169},{\"argc\":1,\"func\":\"sel.unregister\",\"kw\":[],\"lineno\":170},{\"argc\":2,\"func\":\"need\",\"kw\":[],\"lineno\":172},{\"argc\":2,\"func\":\"stream.write_all\",\"kw\":[],\"lineno\":173},{\"argc\":1,\"func\":\"digest.update\",\"kw\":[],\"lineno\":173},{\"argc\":1,\"func\":\"len\",\"kw\":[],\"lineno\":173},{\"argc\":1,\"func\":\"t.ident\",\"kw\":[],\"lineno\":179},{\"argc\":1,\"func\":\"t.ident\",\"kw\":[],\"lineno\":179},{\"argc\":1,\"func\":\"os.fstat\",\"kw\":[],\"lineno\":182},{\"argc\":0,\"func\":\"p.poll\",\"kw\":[],\"lineno\":185},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":195},{\"argc\":1,\"func\":\"set\",\"kw\":[],\"lineno\":195},{\"argc\":1,\"func\":\"t.sha\",\"kw\":[],\"lineno\":197},{\"argc\":1,\"func\":\"type\",\"kw\":[],\"lineno\":151},{\"argc\":0,\"func\":\"time.monotonic\",\"kw\":[],\"lineno\":175},{\"argc\":1,\"func\":\"len\",\"kw\":[],\"lineno\":172}]\nPVE265_DANGEROUS_CALL_HITS=[{\"argc\":3,\"func\":\"os.open\",\"kw\":[\"dir_fd\"],\"lineno\":158},{\"argc\":1,\"func\":\"subprocess.Popen\",\"kw\":[\"stdin\",\"stdout\",\"stderr\",\"env\",\"start_new_session\",\"close_fds\"],\"lineno\":160}]\nPVE265_DANGEROUS_LITERALS=[\"vzdump\"]\n=== HELPER_FULL_SOURCE_BEGIN ===\n0001:from __future__ import annotations\n0002:import base64, hashlib, json, pathlib, sys\n0003:\n0004:BASE_RELEASE=pathlib.Path('/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1')\n0005:C411=BASE_RELEASE/'candidate411'\n0006:PVE265_SHA='cd2f634414a8e38a3789015aeca5a9b47821f77d7d1fa61dcdbdc866172963be'\n0007:\n0008:def sha(p:pathlib.Path)->str:\n0009: return hashlib.sha256(p.read_bytes()).hexdigest()\n0010:\n0011:def fail(code:str):\n0012: raise RuntimeError(code)\n0013:\n0014:def main()->int:\n0015: if len(sys.argv)!=1: fail('HELPER_ARGC')\n0016: p=C411/'pve265.py'\n0017: if not p.is_file() or p.is_symlink() or sha(p)!=PVE265_SHA: fail('PVE265_IDENTITY')\n0018: sys.path.insert(0,str(C411))\n0019: import adapter\n0020: adapter.verify_sources()\n0021: guest266,pve265,_pve270,_pve282=adapter.load_graph()\n0022: data=sys.stdin.buffer.read(4_000_001)\n0023: if not data or len(data)>4_000_000: fail('INPUT_BOUND')\n0024: raw=json.loads(data.decode('utf-8'))\n0025: if type(raw) is not dict: fail('INPUT_SCHEMA')\n0026: node=raw.get('node'); vmid=raw.get('vmid'); scratch=raw.get('scratch'); now=raw.get('now')\n0027: if type(node) is not str or type(vmid) is not int or type(scratch) is not str or type(now) is not int: fail('INPUT_FIELDS')\n0028: configs={int(k):v for k,v in raw.get('configs',[])}\n0029: defaults=None if raw.get('defaults_b64') is None else base64.b64decode(raw['defaults_b64'])\n0030: plan=pve265.make_plan(raw.get('rows'),configs,raw.get('storage_rows'),defaults,int(raw.get('staging_free')),now,node=node)\n0031: jobs=[j for j in plan['jobs'] if j.get('vmid')==vmid]\n0032: if len(jobs)!=1: fail('JOB_CARDINALITY')\n0033: job=jobs[0]\n0034: pve265.validate_job(job,now)\n0035: if job.get('type')!='lxc' or job.get('node')!=node: fail('JOB_IDENTITY')\n0036: if job.get('configured_full_cycle_fits') is not True or job.get('compression_dependent') is not False: fail('JOB_CAPACITY_POLICY')\n0037: guest266.no_active_tasks(raw.get('tasks'),vmid)\n0038: argv=pve265.dump_argv(job,'/usr/bin/vzdump',scratch,now)\n0039: keep=('vmid','type','node','status','template','config_sha256','disks','configured_disk_bytes','configured_archive_bound_bytes','archive_cap_bytes','global_defaults_sha256','blockers','coverage_eligible')\n0040: out={'schema':1,'argv':argv,'job':{k:job.get(k) for k in keep}}\n0041: sys.stdout.write(json.dumps(out,separators=(',',':'),sort_keys=True)+'\\n')\n0042: return 0\n0043:\n0044:if __name__=='__main__':\n0045: raise SystemExit(main())\n=== HELPER_FULL_SOURCE_END ===\nHELPER_PVE265_CALLS=dump_argv,make_plan,validate_job\nPVE265_REACHABLE_FUNCTIONS=defaults_summary,dump_argv,make_plan,need,normalized_config,path_ok,validate_job\nPVE265_REACHABLE_EDGES=[[\"defaults_summary\",\"need\"],[\"dump_argv\",\"need\"],[\"dump_argv\",\"path_ok\"],[\"dump_argv\",\"path_ok\"],[\"dump_argv\",\"validate_job\"],[\"make_plan\",\"defaults_summary\"],[\"make_plan\",\"need\"],[\"make_plan\",\"need\"],[\"make_plan\",\"need\"],[\"make_plan\",\"need\"],[\"make_plan\",\"need\"],[\"make_plan\",\"need\"],[\"make_plan\",\"normalized_config\"],[\"normalized_config\",\"need\"],[\"validate_job\",\"need\"],[\"validate_job\",\"need\"],[\"validate_job\",\"need\"],[\"validate_job\",\"need\"],[\"validate_job\",\"need\"],[\"validate_job\",\"need\"],[\"validate_job\",\"need\"],[\"validate_job\",\"need\"]]\n=== PVE265_FUNC_defaults_summary_BEGIN ===\n0001:def defaults_summary(raw):\n0002: need(raw is None or type(raw) is bytes and len(raw)<=262144,'DEFAULTS_BOUND')\n0003: result={'present':raw is not None,'sha256':t.sha(raw) if raw is not None else None,'keys':[],'blockers':[]}\n0004: if raw is None:return result\n0005: try:text=raw.decode('utf-8-sig')\n0006: except UnicodeError:result['blockers']=['GLOBAL_DEFAULT_PARSE'];return result\n0007: seen=set();block=set()\n0008: for line in text.splitlines():\n0009: line=line.strip()\n0010: if not line or line.startswith('#'):continue\n0011: m=re.fullmatch(r'([a-z][a-z0-9_-]*)\\s*:\\s*(.*)',line)\n0012: if not m:block.add('GLOBAL_DEFAULT_PARSE');continue\n0013: key,value=m.groups()\n0014: if key in seen:block.add('GLOBAL_DEFAULT_DUPLICATE')\n0015: seen.add(key)\n0016: if key=='script':block.add('GLOBAL_DEFAULT_SCRIPT')\n0017: elif key=='exclude-path':block.add('GLOBAL_DEFAULT_EXCLUDE_PATH')\n0018: elif key not in OVERRIDDEN:block.add('GLOBAL_DEFAULT_UNREVIEWED')\n0019: result['keys']=sorted(seen);result['blockers']=sorted(block);return result\n=== PVE265_FUNC_defaults_summary_END ===\n=== PVE265_FUNC_dump_argv_BEGIN ===\n0001:def dump_argv(job,executable,tmpdir,now):\n0002: validate_job(job,now)\n0003: need(path_ok(executable) and path_ok(tmpdir),'EXECUTION_PATH')\n0004: return [str(executable),str(job['vmid']),'--node',job['node'],'--mode','snapshot','--stdout','1',\n0005: '--compress','zstd','--zstd','1','--remove','0','--prune-backups','keep-all=1',\n0006: '--stdexcludes','0','--lockwait','0','--bwlimit','32768','--ionice','7','--tmpdir',str(tmpdir)]\n=== PVE265_FUNC_dump_argv_END ===\n=== PVE265_FUNC_make_plan_BEGIN ===\n0001:def make_plan(rows,configs,storage_rows,defaults,staging_free,now,node='pve01'):\n0002: need(np.valid_id(node),'NODE_NAME')\n0003: need(type(staging_free) is int and 0<=staging_free<=2**63-1,'SPACE_VALUE')\n0004: need(type(now) is int and now>=0,'PLAN_TIME')\n0005: need(type(configs) is dict,'CONFIGS_SCHEMA')\n0006: guests=np.guests(rows,node);ss=np.storages(storage_rows)\n0007: need(len({x['storage'] for x in ss})==len(ss),'DUPLICATE_STORAGE')\n0008: stores={x['storage']:x for x in ss};global_summary=defaults_summary(defaults)\n0009: jobs=[]\n0010: for g in guests:\n0011: need(g['vmid'] in configs,'GUEST_CONFIG_MISSING')\n0012: original=configs[g['vmid']];cfg=normalized_config(original);summary=np.config_summary(cfg,g['type'])\n0013: summary['config_sha256']=t.sha(core.canonical_bytes(original))\n0014: block=set(summary['blockers'])|set(global_summary['blockers']);sizes=[]\n0015: if not summary['disks']:block.add('NO_BACKUP_DISKS')\n0016: if g['template']:block.add('TEMPLATE_REQUIRES_SEPARATE_POLICY')\n0017: if g['status']!='running':block.add('GUEST_NOT_RUNNING')\n0018: if any(k=='args' or re.match(r'hostpci\\d+|usb\\d+|virtiofs\\d+|dev\\d+|lxc\\.',k) for k in cfg):\n0019: block.add('EXTERNAL_DEVICE_OR_CUSTOM_CONFIG')\n0020: for disk in summary['disks']:\n0021: slot=disk['slot'];opts={}\n0022: for field in cfg[slot].split(',')[1:]:\n0023: k,sep,v=field.partition('=')\n0024: if sep:opts[k]=v\n0025: if 'backup' in opts and opts['backup'] not in ('0','1','yes','no','on','off','true','false'):\n0026: block.add('BACKUP_FLAG_UNKNOWN')\n0027: if disk['backup_setting']=='default_unproven':\n0028: if g['type']=='qemu':disk['backup_setting']='included_default_qemu'\n0029: elif slot=='rootfs':disk['backup_setting']='included_default_rootfs'\n0030: st=stores.get(disk['storage'])\n0031: if st is None or st['active'] is not True or st['enabled'] is not True:block.add('STORAGE_NOT_AVAILABLE')\n0032: elif g['type']=='lxc' and st['type'] not in ('lvmthin','zfspool'):block.add('LXC_SNAPSHOT_SUPPORT_UNPROVEN')\n0033: if disk['configured_size_bytes'] is not None:sizes.append(disk['configured_size_bytes'])\n0034: total=sum(sizes)\n0035: if total>stream.MAX_BYTES:block.add('GUEST_SIZE_EXCEEDS_CORE_BOUND')\n0036: # Policy ceiling, not an estimate of compression ratio. Actual byte cap is enforced at read/write.\n0037: configured_bound=min(stream.MAX_BYTES,total+(total+9)//10+64*1024**2) if total else 0\n0038: capacity=max(0,(staging_free-LOCAL_RESERVE)//4)\n0039: cap=min(configured_bound,capacity)\n0040: if cap<=0:block.add('STAGING_CAPACITY_ZERO')\n0041: summary['blockers']=sorted(block)\n0042: job={**g,**summary,'observed_at':now,'global_defaults_sha256':global_summary['sha256'],\n0043: 'configured_disk_bytes':total,'configured_archive_bound_bytes':configured_bound,\n0044: 'archive_cap_bytes':cap,'configured_full_cycle_fits':bool(configured_bound and 4*configured_bound+LOCAL_RESERVE<=staging_free),\n0045: 'compression_dependent':bool(configured_bound and cap1 else 'selftest'; d=describe()\n0041: if mode not in ('selftest','describe'):raise SystemExit(2)\n0042: print(json.dumps(d,sort_keys=True,separators=(',',':')))\n0043: if mode=='selftest':print('ADAPTER_SELFTEST=PASS')\n0044:if __name__=='__main__':main()\n=== ADAPTER_FULL_SOURCE_END ===\n=== ADAPTER_FUNC_verify_sources_BEGIN ===\n0001:def verify_sources():\n0002: for name,want in EXPECTED.items():\n0003: p=BASE/name\n0004: if not p.is_file() or p.is_symlink() or sha(p)!=want:raise RuntimeError('SOURCE_IDENTITY_'+name)\n=== ADAPTER_FUNC_verify_sources_END ===\n=== ADAPTER_FUNC_load_graph_BEGIN ===\n0001:def load_graph():\n0002: import guest266,pve265,pve270,pve282\n0003: if hasattr(guest266,'dump_argv'):raise RuntimeError('GUEST266_UNEXPECTED_DUMP_ARGV')\n0004: if not hasattr(pve265,'dump_argv'):raise RuntimeError('PVE265_DUMP_ARGV_MISSING')\n0005: if getattr(pve270,'old',None) is not pve265:raise RuntimeError('PVE270_OLD_NOT_PVE265')\n0006: if getattr(pve282,'old',None) is not pve265:raise RuntimeError('PVE282_OLD_NOT_PVE265')\n0007: if getattr(pve282,'proven',None) is not pve270:raise RuntimeError('PVE282_PROVEN_NOT_PVE270')\n0008: for n in ('MappedScratch','capture_archive','validate_mapping'):\n0009: if not hasattr(pve270,n):raise RuntimeError('PVE270_'+n.upper()+'_MISSING')\n0010: if getattr(pve282,n,None) is not getattr(pve270,n):raise RuntimeError('PVE282_ALIAS_'+n.upper()+'_MISMATCH')\n0011: return guest266,pve265,pve270,pve282\n=== ADAPTER_FUNC_load_graph_END ===\nADAPTER_REACHABLE_FUNCTIONS=load_graph,sha,verify_sources\nADAPTER_REACHABLE_EDGES=[[\"verify_sources\",\"sha\"]]\nADAPTER_REACHABLE_CALLS=[{\"args\":[\"guest266\",\"'dump_argv'\"],\"func\":\"hasattr\",\"kw\":[],\"lineno\":26,\"owner\":\"load_graph\"},{\"args\":[\"'GUEST266_UNEXPECTED_DUMP_ARGV'\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":26,\"owner\":\"load_graph\"},{\"args\":[\"pve265\",\"'dump_argv'\"],\"func\":\"hasattr\",\"kw\":[],\"lineno\":27,\"owner\":\"load_graph\"},{\"args\":[\"'PVE265_DUMP_ARGV_MISSING'\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":27,\"owner\":\"load_graph\"},{\"args\":[\"pve270\",\"'old'\",\"None\"],\"func\":\"getattr\",\"kw\":[],\"lineno\":28,\"owner\":\"load_graph\"},{\"args\":[\"'PVE270_OLD_NOT_PVE265'\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":28,\"owner\":\"load_graph\"},{\"args\":[\"pve282\",\"'old'\",\"None\"],\"func\":\"getattr\",\"kw\":[],\"lineno\":29,\"owner\":\"load_graph\"},{\"args\":[\"'PVE282_OLD_NOT_PVE265'\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":29,\"owner\":\"load_graph\"},{\"args\":[\"pve282\",\"'proven'\",\"None\"],\"func\":\"getattr\",\"kw\":[],\"lineno\":30,\"owner\":\"load_graph\"},{\"args\":[\"'PVE282_PROVEN_NOT_PVE270'\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":30,\"owner\":\"load_graph\"},{\"args\":[\"pve270\",\"n\"],\"func\":\"hasattr\",\"kw\":[],\"lineno\":32,\"owner\":\"load_graph\"},{\"args\":[\"'PVE270_' + n.upper() + '_MISSING'\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":32,\"owner\":\"load_graph\"},{\"args\":[\"pve282\",\"n\",\"None\"],\"func\":\"getattr\",\"kw\":[],\"lineno\":33,\"owner\":\"load_graph\"},{\"args\":[\"pve270\",\"n\"],\"func\":\"getattr\",\"kw\":[],\"lineno\":33,\"owner\":\"load_graph\"},{\"args\":[\"'PVE282_ALIAS_' + n.upper() + '_MISMATCH'\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":33,\"owner\":\"load_graph\"},{\"args\":[],\"func\":\"n.upper\",\"kw\":[],\"lineno\":32,\"owner\":\"load_graph\"},{\"args\":[],\"func\":\"n.upper\",\"kw\":[],\"lineno\":33,\"owner\":\"load_graph\"},{\"args\":[],\"func\":\"hashlib.sha256\",\"kw\":[],\"lineno\":16,\"owner\":\"sha\"},{\"args\":[],\"func\":\"h.hexdigest\",\"kw\":[],\"lineno\":19,\"owner\":\"sha\"},{\"args\":[\"p\",\"'rb'\"],\"func\":\"open\",\"kw\":[],\"lineno\":17,\"owner\":\"sha\"},{\"args\":[\"lambda: f.read(1048576)\",\"b''\"],\"func\":\"iter\",\"kw\":[],\"lineno\":18,\"owner\":\"sha\"},{\"args\":[\"b\"],\"func\":\"h.update\",\"kw\":[],\"lineno\":18,\"owner\":\"sha\"},{\"args\":[\"1048576\"],\"func\":\"f.read\",\"kw\":[],\"lineno\":18,\"owner\":\"sha\"},{\"args\":[],\"func\":\"EXPECTED.items\",\"kw\":[],\"lineno\":21,\"owner\":\"verify_sources\"},{\"args\":[],\"func\":\"p.is_symlink\",\"kw\":[],\"lineno\":23,\"owner\":\"verify_sources\"},{\"args\":[\"'SOURCE_IDENTITY_' + name\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":23,\"owner\":\"verify_sources\"},{\"args\":[],\"func\":\"p.is_file\",\"kw\":[],\"lineno\":23,\"owner\":\"verify_sources\"},{\"args\":[\"p\"],\"func\":\"sha\",\"kw\":[],\"lineno\":23,\"owner\":\"verify_sources\"}]\nADAPTER_REACHABLE_SIDE_EFFECT_CALLS=[]\nADAPTER_REACHABLE_SIDE_EFFECT_CALL_COUNT=0\nLOCAL_IMPORT_GRAPH={\"adapter\":[]}\nLOCAL_IMPORT_GRAPH_MODULES=adapter\nMODULE_adapter_TOPLEVEL_CALLS=[{\"args\":[],\"func\":\"resolve\",\"kw\":[],\"lineno\":3},{\"args\":[\"__file__\"],\"func\":\"pathlib.Path\",\"kw\":[],\"lineno\":3},{\"args\":[],\"func\":\"main\",\"kw\":[],\"lineno\":44}]\nMODULE_adapter_TOPLEVEL_SIDE_EFFECT_CALLS=[]\nLOCAL_IMPORT_TOPLEVEL_SIDE_EFFECT_CALLS=[]\nLOCAL_IMPORT_TOPLEVEL_SIDE_EFFECT_COUNT=0\nGUEST266_FOUND=true\n=== GUEST266_NO_ACTIVE_TASKS_BEGIN ===\n0001:def no_active_tasks(rows,vmid):\n0002: t.need(type(rows) is list and len(rows)<1000,'ACTIVE_TASKS_TRUNCATED_OR_INVALID')\n0003: for task in rows:\n0004: t.need(type(task) is dict and type(task.get('type')) is str,'ACTIVE_TASK_SCHEMA')\n0005: # The active index includes completed, not-yet-archived tasks.\n0006: if type(task.get('endtime')) is int and task.get('status') not in (None,'RUNNING'):continue\n0007: kind=task['type'];target=str(task.get('id',''))\n0008: if kind in ('vncshell','vncterm','vncproxy','spiceproxy'):continue\n0009: t.need(target!=str(vmid) and not any(x in kind.lower() for x in ('dump','restore','migrat','snapshot','clone','move_disk','resize')),'COMPETING_PVE_TASK')\n=== GUEST266_NO_ACTIVE_TASKS_END ===\nGUEST266_REACHABLE_FUNCTIONS=no_active_tasks\nGUEST266_REACHABLE_EDGES=[]\nGUEST266_REACHABLE_CALLS=[{\"args\":[\"type(rows) is list and len(rows) < 1000\",\"'ACTIVE_TASKS_TRUNCATED_OR_INVALID'\"],\"func\":\"t.need\",\"kw\":[],\"lineno\":60,\"owner\":\"no_active_tasks\"},{\"args\":[\"type(task) is dict and type(task.get('type')) is str\",\"'ACTIVE_TASK_SCHEMA'\"],\"func\":\"t.need\",\"kw\":[],\"lineno\":62,\"owner\":\"no_active_tasks\"},{\"args\":[\"task.get('id', '')\"],\"func\":\"str\",\"kw\":[],\"lineno\":65,\"owner\":\"no_active_tasks\"},{\"args\":[\"target != str(vmid) and (not any((x in kind.lower() for x in ('dump', 'restore', 'migrat', 'snapshot', 'clone', 'move_disk', 'resize'))))\",\"'COMPETING_PVE_TASK'\"],\"func\":\"t.need\",\"kw\":[],\"lineno\":67,\"owner\":\"no_active_tasks\"},{\"args\":[\"'id'\",\"''\"],\"func\":\"task.get\",\"kw\":[],\"lineno\":65,\"owner\":\"no_active_tasks\"},{\"args\":[\"rows\"],\"func\":\"type\",\"kw\":[],\"lineno\":60,\"owner\":\"no_active_tasks\"},{\"args\":[\"rows\"],\"func\":\"len\",\"kw\":[],\"lineno\":60,\"owner\":\"no_active_tasks\"},{\"args\":[\"task.get('endtime')\"],\"func\":\"type\",\"kw\":[],\"lineno\":64,\"owner\":\"no_active_tasks\"},{\"args\":[\"'status'\"],\"func\":\"task.get\",\"kw\":[],\"lineno\":64,\"owner\":\"no_active_tasks\"},{\"args\":[\"task\"],\"func\":\"type\",\"kw\":[],\"lineno\":62,\"owner\":\"no_active_tasks\"},{\"args\":[\"task.get('type')\"],\"func\":\"type\",\"kw\":[],\"lineno\":62,\"owner\":\"no_active_tasks\"},{\"args\":[\"'endtime'\"],\"func\":\"task.get\",\"kw\":[],\"lineno\":64,\"owner\":\"no_active_tasks\"},{\"args\":[\"vmid\"],\"func\":\"str\",\"kw\":[],\"lineno\":67,\"owner\":\"no_active_tasks\"},{\"args\":[\"(x in kind.lower() for x in ('dump', 'restore', 'migrat', 'snapshot', 'clone', 'move_disk', 'resize'))\"],\"func\":\"any\",\"kw\":[],\"lineno\":67,\"owner\":\"no_active_tasks\"},{\"args\":[\"'type'\"],\"func\":\"task.get\",\"kw\":[],\"lineno\":62,\"owner\":\"no_active_tasks\"},{\"args\":[],\"func\":\"kind.lower\",\"kw\":[],\"lineno\":67,\"owner\":\"no_active_tasks\"}]\nGUEST266_REACHABLE_SIDE_EFFECT_CALLS=[]\nGUEST266_REACHABLE_SIDE_EFFECT_CALL_COUNT=0\nTRANSITIVE_STATIC_REPLAY_SAFE=true\nSTATIC_TRANSITIVE_ANALYSIS_COMPLETE=true\nSTATIC_TRANSITIVE_RC=0\nTRANSITIVE_STATIC_REPLAY_SAFE_SUMMARY=true\nTASK_RESULT=PASS_CT110_HELPER_TRANSITIVE_STATIC_SAFE\nDECISION=PASS_HELPER_REPLAY_STATIC_SAFETY_PROVEN\nNEXT_GATE=CONTROLLED_CT110_HELPER_REPLAY_ONLY\nHOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-TRANSITIVE-STATIC-RCA-1225R1\",\"status\":\"OK\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}\n" } diff --git a/runtime/latest.txt b/runtime/latest.txt index 22b69868..959a67ee 100644 --- a/runtime/latest.txt +++ b/runtime/latest.txt @@ -1,15 +1,15 @@ CHAT_OUTPUT_BEGIN -COMMAND_ID=SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-STATIC-RCA-1224R1 +COMMAND_ID=SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-TRANSITIVE-STATIC-RCA-1225R1 STATUS=OK RC=0 HOST=pve01 MODE=read-only -COMPONENT=homelab-backup-ct110-helper-static-rca +COMPONENT=homelab-backup-ct110-helper-transitive-static-rca REFERENCE_REGISTER_CHECK=OK REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 ERROR_REGISTER_CHECK=OK ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 -COMMAND_SHA256=faba4e1f6f97021372c410262f26fab58019db46970c85c6114fe565805b743c +COMMAND_SHA256=6d64e36c947c6baf0c7e53d2c17497d65666c040e09535e4223e53e5c8dbfa19 DUPLICATE_FAILED_COMMAND_BLOCKED=false EXECUTION_STARTED=true CHANGE_DECLARED=false @@ -24,281 +24,140 @@ MUTATION_OUTCOME=NO_MUTATION SANITIZED=yes SECRETS_INCLUDED=no PRIVATE_ADDRESSES_INCLUDED=no -RAW_EVIDENCE_SHA256=e993a99af1682917d2eff9792b35263a335005e41b0df60d3121979071b61d52 -SANITIZED_OUTPUT_SHA256=e993a99af1682917d2eff9792b35263a335005e41b0df60d3121979071b61d52 +RAW_EVIDENCE_SHA256=6d6b105d469ee853c1554e02708bf1d9d5be7c963d4a5f9e7ac8024b6ed2c41b +SANITIZED_OUTPUT_SHA256=6d6b105d469ee853c1554e02708bf1d9d5be7c963d4a5f9e7ac8024b6ed2c41b OUTPUT_BEGIN -BACKUP_CT110_HELPER_STATIC_RCA_BEGIN=true -COMMAND_ID=SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-STATIC-RCA-1224R1 +BACKUP_CT110_HELPER_TRANSITIVE_STATIC_RCA_BEGIN=true +COMMAND_ID=SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-TRANSITIVE-STATIC-RCA-1225R1 MODE=read-only -COMPONENT=homelab-backup-ct110-helper-static-rca -MUTATION_BOUNDARY=PURE_STATIC_SOURCE_AND_AST_ANALYSIS;NO_PROJECT_MODULE_IMPORT;NO_HELPER_EXECUTION;NO_VZDUMP;NO_SYSTEMD_ACTION;NO_BACKUP;NO_AUDIT_RUN;NO_FILE_WRITE_EXCEPT_RUNNER_TEMP;NO_LOCK_BREAK;NO_GIT_WRITE;NO_NETBIRD_SKLADCHIK_CHANGE +COMPONENT=homelab-backup-ct110-helper-transitive-static-rca +MUTATION_BOUNDARY=PURE_STATIC_AST_ONLY_NO_PROJECT_IMPORT_NO_HELPER_EXECUTION_NO_VZDUMP_NO_SYSTEMD_ACTION_NO_BACKUP_NO_AUDIT_NO_FILE_MUTATION_NO_LOCK_BREAK_NO_GIT_WRITE_NO_NETBIRD_SKLADCHIK_CHANGE HOST=pve01 CLUSTER_QUORATE=Yes RUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d -SOURCE_1223_STATUS=OK -SOURCE_1223_DECISION=HOLD_HELPER_REPLAY_SAFETY_GATE -SOURCE_1223_NEXT_GATE=READ_EXACT_1223_AND_DESIGN_NONEXECUTING_HELPER_RCA -=== FILE_IDENTITY === -HELPER_EXISTS=true -HELPER_PATH=/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/fresh_lxc_helper.py -HELPER_SHA256=dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011 -HELPER_SHA_MATCH=true -LXC_EXISTS=true -LXC_PATH=/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/lxc_adapter.py -LXC_SHA256=3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d -LXC_SHA_MATCH=true -PVE265_EXISTS=true -PVE265_PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/pve265.py -PVE265_SHA256=cd2f634414a8e38a3789015aeca5a9b47821f77d7d1fa61dcdbdc866172963be -PVE265_SHA_MATCH=true -=== STATIC_AST === -HELPER_PATH=/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/fresh_lxc_helper.py -HELPER_SHA256=dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011 -HELPER_BYTES=2320 -HELPER_IMPORTS=[{"kind":"from","level":0,"lineno":1,"module":"__future__","names":[{"as":null,"name":"annotations"}]},{"kind":"import","lineno":2,"names":[{"as":null,"name":"base64"},{"as":null,"name":"hashlib"},{"as":null,"name":"json"},{"as":null,"name":"pathlib"},{"as":null,"name":"sys"}]},{"kind":"import","lineno":19,"names":[{"as":null,"name":"adapter"}]}] -HELPER_ALL_CALLS=[{"argc":1,"func":"pathlib.Path","kw":[],"lineno":4},{"argc":0,"func":"hexdigest","kw":[],"lineno":9},{"argc":1,"func":"RuntimeError","kw":[],"lineno":12},{"argc":2,"func":"sys.path.insert","kw":[],"lineno":18},{"argc":0,"func":"adapter.verify_sources","kw":[],"lineno":20},{"argc":0,"func":"adapter.load_graph","kw":[],"lineno":21},{"argc":1,"func":"sys.stdin.buffer.read","kw":[],"lineno":22},{"argc":1,"func":"json.loads","kw":[],"lineno":24},{"argc":1,"func":"raw.get","kw":[],"lineno":26},{"argc":1,"func":"raw.get","kw":[],"lineno":26},{"argc":1,"func":"raw.get","kw":[],"lineno":26},{"argc":1,"func":"raw.get","kw":[],"lineno":26},{"argc":6,"func":"pve265.make_plan","kw":["node"],"lineno":30},{"argc":2,"func":"pve265.validate_job","kw":[],"lineno":34},{"argc":2,"func":"guest266.no_active_tasks","kw":[],"lineno":37},{"argc":4,"func":"pve265.dump_argv","kw":[],"lineno":38},{"argc":1,"func":"sys.stdout.write","kw":[],"lineno":41},{"argc":1,"func":"SystemExit","kw":[],"lineno":45},{"argc":1,"func":"len","kw":[],"lineno":15},{"argc":1,"func":"fail","kw":[],"lineno":15},{"argc":0,"func":"p.is_symlink","kw":[],"lineno":17},{"argc":1,"func":"fail","kw":[],"lineno":17},{"argc":1,"func":"str","kw":[],"lineno":18},{"argc":1,"func":"fail","kw":[],"lineno":23},{"argc":1,"func":"data.decode","kw":[],"lineno":24},{"argc":1,"func":"type","kw":[],"lineno":25},{"argc":1,"func":"fail","kw":[],"lineno":25},{"argc":1,"func":"fail","kw":[],"lineno":27},{"argc":1,"func":"int","kw":[],"lineno":28},{"argc":1,"func":"base64.b64decode","kw":[],"lineno":29},{"argc":1,"func":"raw.get","kw":[],"lineno":30},{"argc":1,"func":"raw.get","kw":[],"lineno":30},{"argc":1,"func":"int","kw":[],"lineno":30},{"argc":1,"func":"len","kw":[],"lineno":32},{"argc":1,"func":"fail","kw":[],"lineno":32},{"argc":1,"func":"fail","kw":[],"lineno":35},{"argc":1,"func":"fail","kw":[],"lineno":36},{"argc":1,"func":"raw.get","kw":[],"lineno":37},{"argc":0,"func":"main","kw":[],"lineno":45},{"argc":1,"func":"hashlib.sha256","kw":[],"lineno":9},{"argc":0,"func":"p.is_file","kw":[],"lineno":17},{"argc":1,"func":"sha","kw":[],"lineno":17},{"argc":1,"func":"len","kw":[],"lineno":23},{"argc":1,"func":"type","kw":[],"lineno":27},{"argc":1,"func":"type","kw":[],"lineno":27},{"argc":1,"func":"type","kw":[],"lineno":27},{"argc":1,"func":"type","kw":[],"lineno":27},{"argc":2,"func":"raw.get","kw":[],"lineno":28},{"argc":1,"func":"raw.get","kw":[],"lineno":29},{"argc":1,"func":"raw.get","kw":[],"lineno":30},{"argc":1,"func":"job.get","kw":[],"lineno":35},{"argc":1,"func":"job.get","kw":[],"lineno":35},{"argc":1,"func":"job.get","kw":[],"lineno":36},{"argc":1,"func":"job.get","kw":[],"lineno":36},{"argc":1,"func":"job.get","kw":[],"lineno":40},{"argc":1,"func":"json.dumps","kw":["separators","sort_keys"],"lineno":41},{"argc":0,"func":"p.read_bytes","kw":[],"lineno":9},{"argc":1,"func":"j.get","kw":[],"lineno":31}] -HELPER_DANGEROUS_CALL_HITS=[] -HELPER_DANGEROUS_LITERALS=["vzdump"] -LXC_PATH=/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/lxc_adapter.py -LXC_SHA256=3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d -LXC_BYTES=13825 -LXC_IMPORTS=[{"kind":"from","level":0,"lineno":1,"module":"__future__","names":[{"as":null,"name":"annotations"}]},{"kind":"import","lineno":2,"names":[{"as":null,"name":"base64"},{"as":null,"name":"hashlib"},{"as":null,"name":"json"},{"as":null,"name":"os"},{"as":null,"name":"pathlib"},{"as":null,"name":"re"},{"as":null,"name":"selectors"},{"as":null,"name":"shlex"},{"as":null,"name":"signal"},{"as":null,"name":"stat"},{"as":null,"name":"subprocess"},{"as":null,"name":"sys"},{"as":null,"name":"time"}]}] -LXC_ALL_CALLS=[{"argc":0,"func":"hashlib.sha256","kw":[],"lineno":23},{"argc":0,"func":"h.hexdigest","kw":[],"lineno":26},{"argc":1,"func":"memoryview","kw":[],"lineno":29},{"argc":2,"func":"legacy.ssh_remote","kw":["timeout"],"lineno":36},{"argc":0,"func":"split","kw":[],"lineno":37},{"argc":2,"func":"_need","kw":[],"lineno":38},{"argc":2,"func":"_need","kw":[],"lineno":42},{"argc":2,"func":"_need","kw":[],"lineno":43},{"argc":2,"func":"_j","kw":[],"lineno":44},{"argc":2,"func":"_j","kw":[],"lineno":45},{"argc":2,"func":"_need","kw":[],"lineno":46},{"argc":2,"func":"_j","kw":[],"lineno":55},{"argc":2,"func":"_need","kw":[],"lineno":56},{"argc":2,"func":"legacy.ssh_remote","kw":["timeout","check"],"lineno":57},{"argc":1,"func":"os.statvfs","kw":[],"lineno":61},{"argc":1,"func":"int","kw":[],"lineno":61},{"argc":1,"func":"encode","kw":[],"lineno":66},{"argc":2,"func":"_need","kw":[],"lineno":67},{"argc":1,"func":"subprocess.run","kw":["input","capture_output","timeout","cwd","env"],"lineno":68},{"argc":2,"func":"_need","kw":[],"lineno":69},{"argc":2,"func":"_need","kw":[],"lineno":72},{"argc":2,"func":"_need","kw":[],"lineno":76},{"argc":1,"func":"int","kw":[],"lineno":80},{"argc":2,"func":"_need","kw":[],"lineno":81},{"argc":1,"func":"row.get","kw":[],"lineno":82},{"argc":1,"func":"row.get","kw":[],"lineno":82},{"argc":2,"func":"_need","kw":[],"lineno":83},{"argc":2,"func":"legacy._default_unprivileged_lxc","kw":[],"lineno":84},{"argc":1,"func":"_helper","kw":[],"lineno":85},{"argc":1,"func":"_helper","kw":[],"lineno":85},{"argc":2,"func":"_need","kw":[],"lineno":86},{"argc":2,"func":"_need","kw":[],"lineno":87},{"argc":2,"func":"_need","kw":[],"lineno":88},{"argc":2,"func":"_need","kw":[],"lineno":92},{"argc":0,"func":"encode","kw":[],"lineno":94},{"argc":1,"func":"subprocess.run","kw":["input","capture_output","timeout","cwd","env"],"lineno":95},{"argc":2,"func":"isinstance","kw":[],"lineno":102},{"argc":1,"func":"out.get","kw":[],"lineno":104},{"argc":2,"func":"_need","kw":[],"lineno":104},{"argc":2,"func":"_need","kw":[],"lineno":105},{"argc":2,"func":"_need","kw":[],"lineno":118},{"argc":2,"func":"_need","kw":[],"lineno":119},{"argc":2,"func":"_need","kw":[],"lineno":120},{"argc":2,"func":"_need","kw":[],"lineno":121},{"argc":2,"func":"_need","kw":[],"lineno":122},{"argc":1,"func":"pathlib.Path","kw":[],"lineno":123},{"argc":1,"func":"os.lstat","kw":[],"lineno":124},{"argc":2,"func":"_need","kw":[],"lineno":124},{"argc":3,"func":"os.open","kw":[],"lineno":126},{"argc":3,"func":"os.open","kw":[],"lineno":126},{"argc":1,"func":"os.fstat","kw":[],"lineno":127},{"argc":0,"func":"hashlib.sha256","kw":[],"lineno":128},{"argc":0,"func":"hashlib.sha256","kw":[],"lineno":128},{"argc":1,"func":"print","kw":["flush"],"lineno":187},{"argc":2,"func":"_need","kw":[],"lineno":190},{"argc":0,"func":"resolve","kw":[],"lineno":6},{"argc":0,"func":"resolve","kw":[],"lineno":7},{"argc":1,"func":"__init__","kw":[],"lineno":13},{"argc":1,"func":"AdapterError","kw":[],"lineno":16},{"argc":1,"func":"json.loads","kw":[],"lineno":19},{"argc":2,"func":"open","kw":["buffering"],"lineno":24},{"argc":2,"func":"iter","kw":[],"lineno":25},{"argc":2,"func":"os.write","kw":[],"lineno":31},{"argc":2,"func":"legacy.ssh_remote","kw":["timeout"],"lineno":44},{"argc":2,"func":"legacy.ssh_remote","kw":["timeout"],"lineno":45},{"argc":2,"func":"_j","kw":[],"lineno":52},{"argc":2,"func":"_need","kw":[],"lineno":53},{"argc":1,"func":"configs.append","kw":[],"lineno":54},{"argc":2,"func":"legacy.ssh_remote","kw":["timeout"],"lineno":55},{"argc":1,"func":"int","kw":[],"lineno":62},{"argc":1,"func":"json.loads","kw":[],"lineno":70},{"argc":4,"func":"_live_inputs","kw":[],"lineno":85},{"argc":4,"func":"_live_inputs","kw":[],"lineno":85},{"argc":1,"func":"str","kw":[],"lineno":93},{"argc":1,"func":"int","kw":[],"lineno":93},{"argc":1,"func":"int","kw":[],"lineno":93},{"argc":2,"func":"ExecFailure","kw":[],"lineno":97},{"argc":1,"func":"json.loads","kw":[],"lineno":98},{"argc":1,"func":"out.get","kw":[],"lineno":101},{"argc":1,"func":"out.get","kw":[],"lineno":101},{"argc":1,"func":"out.get","kw":[],"lineno":102},{"argc":1,"func":"summary.update","kw":[],"lineno":102},{"argc":2,"func":"ExecFailure","kw":[],"lineno":103},{"argc":2,"func":"os.killpg","kw":[],"lineno":109},{"argc":0,"func":"p.wait","kw":["timeout"],"lineno":111},{"argc":1,"func":"shlex.join","kw":[],"lineno":129},{"argc":0,"func":"time.monotonic","kw":[],"lineno":131},{"argc":1,"func":"subprocess.Popen","kw":["stdin","stdout","stderr","cwd","env","start_new_session","close_fds"],"lineno":133},{"argc":0,"func":"selectors.DefaultSelector","kw":[],"lineno":134},{"argc":0,"func":"sel.get_map","kw":[],"lineno":136},{"argc":0,"func":"p.wait","kw":["timeout"],"lineno":150},{"argc":1,"func":"os.fstat","kw":[],"lineno":153},{"argc":1,"func":"os.stat","kw":["follow_symlinks"],"lineno":153},{"argc":2,"func":"_need","kw":[],"lineno":156},{"argc":2,"func":"os.fchmod","kw":[],"lineno":157},{"argc":1,"func":"os.fsync","kw":[],"lineno":157},{"argc":1,"func":"os.fsync","kw":[],"lineno":157},{"argc":1,"func":"os.close","kw":[],"lineno":173},{"argc":1,"func":"os.close","kw":[],"lineno":173},{"argc":1,"func":"callable","kw":[],"lineno":190},{"argc":1,"func":"int","kw":[],"lineno":193},{"argc":2,"func":"_need","kw":[],"lineno":194},{"argc":1,"func":"row.get","kw":[],"lineno":195},{"argc":1,"func":"row.get","kw":[],"lineno":195},{"argc":2,"func":"_need","kw":[],"lineno":196},{"argc":2,"func":"legacy._default_unprivileged_lxc","kw":[],"lineno":197},{"argc":2,"func":"legacy.ssh_remote","kw":["timeout"],"lineno":199},{"argc":2,"func":"legacy.ssh_remote","kw":["timeout"],"lineno":200},{"argc":2,"func":"_need","kw":[],"lineno":201},{"argc":1,"func":"AdapterError","kw":[],"lineno":20},{"argc":1,"func":"h.update","kw":[],"lineno":25},{"argc":1,"func":"AdapterError","kw":[],"lineno":32},{"argc":0,"func":"strip","kw":[],"lineno":37},{"argc":3,"func":"_remote_sha","kw":[],"lineno":42},{"argc":3,"func":"_remote_sha","kw":[],"lineno":43},{"argc":1,"func":"int","kw":[],"lineno":50},{"argc":2,"func":"legacy.ssh_remote","kw":["timeout"],"lineno":52},{"argc":2,"func":"legacy.ssh_remote","kw":["timeout"],"lineno":59},{"argc":1,"func":"AdapterError","kw":[],"lineno":60},{"argc":0,"func":"time.time","kw":[],"lineno":62},{"argc":1,"func":"decode","kw":[],"lineno":63},{"argc":1,"func":"json.dumps","kw":["separators","sort_keys"],"lineno":66},{"argc":1,"func":"len","kw":[],"lineno":67},{"argc":1,"func":"str","kw":[],"lineno":68},{"argc":1,"func":"AdapterError","kw":[],"lineno":71},{"argc":1,"func":"type","kw":[],"lineno":76},{"argc":0,"func":"job.items","kw":[],"lineno":77},{"argc":0,"func":"legacy.cluster_inventory","kw":[],"lineno":80},{"argc":1,"func":"len","kw":[],"lineno":81},{"argc":1,"func":"t.get","kw":[],"lineno":83},{"argc":1,"func":"_stable_job","kw":[],"lineno":86},{"argc":1,"func":"_stable_job","kw":[],"lineno":86},{"argc":3,"func":"_remote_sha","kw":[],"lineno":88},{"argc":1,"func":"json.dumps","kw":["separators","sort_keys"],"lineno":94},{"argc":1,"func":"str","kw":[],"lineno":95},{"argc":1,"func":"len","kw":[],"lineno":96},{"argc":2,"func":"ExecFailure","kw":[],"lineno":100},{"argc":1,"func":"out.get","kw":[],"lineno":103},{"argc":1,"func":"type","kw":[],"lineno":104},{"argc":0,"func":"is_file","kw":[],"lineno":105},{"argc":1,"func":"result.get","kw":[],"lineno":106},{"argc":0,"func":"p.wait","kw":[],"lineno":115},{"argc":1,"func":"all","kw":[],"lineno":119},{"argc":3,"func":"_remote_sha","kw":[],"lineno":122},{"argc":1,"func":"stat.S_ISDIR","kw":[],"lineno":124},{"argc":2,"func":"os.set_blocking","kw":[],"lineno":135},{"argc":2,"func":"sel.register","kw":[],"lineno":135},{"argc":0,"func":"time.monotonic","kw":[],"lineno":137},{"argc":1,"func":"sel.select","kw":[],"lineno":139},{"argc":0,"func":"time.monotonic","kw":[],"lineno":148},{"argc":2,"func":"ExecFailure","kw":[],"lineno":149},{"argc":2,"func":"ExecFailure","kw":[],"lineno":151},{"argc":2,"func":"ExecFailure","kw":[],"lineno":152},{"argc":2,"func":"ExecFailure","kw":[],"lineno":155},{"argc":0,"func":"digest.hexdigest","kw":[],"lineno":158},{"argc":0,"func":"eh.hexdigest","kw":[],"lineno":159},{"argc":1,"func":"summary.update","kw":[],"lineno":164},{"argc":2,"func":"ExecFailure","kw":[],"lineno":164},{"argc":0,"func":"sel.close","kw":[],"lineno":170},{"argc":1,"func":"os.fsync","kw":[],"lineno":171},{"argc":1,"func":"os.fsync","kw":[],"lineno":171},{"argc":0,"func":"eh.hexdigest","kw":[],"lineno":175},{"argc":0,"func":"encode","kw":[],"lineno":177},{"argc":3,"func":"os.open","kw":[],"lineno":178},{"argc":1,"func":"json.dumps","kw":["separators","sort_keys"],"lineno":187},{"argc":1,"func":"t.get","kw":[],"lineno":192},{"argc":3,"func":"original","kw":[],"lineno":192},{"argc":2,"func":"legacy.mapped_scratch_probe","kw":[],"lineno":203},{"argc":3,"func":"plan_only","kw":[],"lineno":204},{"argc":1,"func":"int","kw":[],"lineno":204},{"argc":2,"func":"_need","kw":[],"lineno":210},{"argc":2,"func":"_emit_diag","kw":[],"lineno":211},{"argc":1,"func":"row.get","kw":[],"lineno":215},{"argc":1,"func":"pathlib.Path","kw":[],"lineno":6},{"argc":1,"func":"pathlib.Path","kw":[],"lineno":7},{"argc":0,"func":"super","kw":[],"lineno":13},{"argc":1,"func":"f.read","kw":[],"lineno":25},{"argc":1,"func":"len","kw":[],"lineno":38},{"argc":1,"func":"type","kw":[],"lineno":46},{"argc":1,"func":"type","kw":[],"lineno":46},{"argc":2,"func":"isinstance","kw":[],"lineno":49},{"argc":1,"func":"r.get","kw":[],"lineno":49},{"argc":1,"func":"r.get","kw":[],"lineno":49},{"argc":1,"func":"r.get","kw":[],"lineno":50},{"argc":1,"func":"AdapterError","kw":[],"lineno":51},{"argc":1,"func":"type","kw":[],"lineno":53},{"argc":1,"func":"type","kw":[],"lineno":56},{"argc":1,"func":"len","kw":[],"lineno":56},{"argc":1,"func":"len","kw":[],"lineno":69},{"argc":1,"func":"type","kw":[],"lineno":72},{"argc":1,"func":"out.get","kw":[],"lineno":72},{"argc":1,"func":"type","kw":[],"lineno":72},{"argc":1,"func":"type","kw":[],"lineno":72},{"argc":1,"func":"int","kw":[],"lineno":80},{"argc":0,"func":"hexdigest","kw":[],"lineno":97},{"argc":1,"func":"len","kw":[],"lineno":97},{"argc":1,"func":"int","kw":[],"lineno":105},{"argc":2,"func":"os.killpg","kw":[],"lineno":113},{"argc":2,"func":"re.fullmatch","kw":[],"lineno":118},{"argc":1,"func":"type","kw":[],"lineno":119},{"argc":1,"func":"type","kw":[],"lineno":121},{"argc":1,"func":"stat.S_ISLNK","kw":[],"lineno":124},{"argc":1,"func":"stat.S_IMODE","kw":[],"lineno":124},{"argc":0,"func":"pipe.fileno","kw":[],"lineno":135},{"argc":2,"func":"ExecFailure","kw":[],"lineno":138},{"argc":2,"func":"min","kw":[],"lineno":139},{"argc":2,"func":"os.read","kw":[],"lineno":140},{"argc":3,"func":"_remote_sha","kw":[],"lineno":156},{"argc":1,"func":"_kill","kw":[],"lineno":161},{"argc":0,"func":"eh.hexdigest","kw":[],"lineno":163},{"argc":0,"func":"p.poll","kw":[],"lineno":167},{"argc":1,"func":"_kill","kw":[],"lineno":167},{"argc":0,"func":"p.stdout.close","kw":[],"lineno":168},{"argc":0,"func":"p.stderr.close","kw":[],"lineno":169},{"argc":2,"func":"_write_all","kw":[],"lineno":179},{"argc":1,"func":"os.fsync","kw":[],"lineno":179},{"argc":1,"func":"os.close","kw":[],"lineno":180},{"argc":0,"func":"legacy.cluster_inventory","kw":[],"lineno":193},{"argc":1,"func":"len","kw":[],"lineno":194},{"argc":1,"func":"t.get","kw":[],"lineno":196},{"argc":0,"func":"strip","kw":[],"lineno":201},{"argc":1,"func":"pathlib.Path","kw":[],"lineno":204},{"argc":2,"func":"legacy.ssh_remote","kw":["timeout","check"],"lineno":213},{"argc":2,"func":"p.stdout.decode","kw":[],"lineno":37},{"argc":1,"func":"base64.b64encode","kw":[],"lineno":63},{"argc":1,"func":"out.get","kw":[],"lineno":72},{"argc":1,"func":"out.get","kw":[],"lineno":72},{"argc":2,"func":"r.get","kw":[],"lineno":80},{"argc":0,"func":"hexdigest","kw":[],"lineno":100},{"argc":1,"func":"len","kw":[],"lineno":100},{"argc":1,"func":"pathlib.Path","kw":[],"lineno":105},{"argc":0,"func":"stat","kw":[],"lineno":105},{"argc":2,"func":"result.get","kw":[],"lineno":105},{"argc":1,"func":"str","kw":[],"lineno":118},{"argc":2,"func":"max","kw":[],"lineno":139},{"argc":0,"func":"key.fileobj.fileno","kw":[],"lineno":140},{"argc":1,"func":"sel.unregister","kw":[],"lineno":141},{"argc":2,"func":"_write_all","kw":[],"lineno":144},{"argc":1,"func":"digest.update","kw":[],"lineno":144},{"argc":1,"func":"len","kw":[],"lineno":144},{"argc":1,"func":"len","kw":[],"lineno":146},{"argc":1,"func":"eh.update","kw":[],"lineno":146},{"argc":0,"func":"p.poll","kw":[],"lineno":161},{"argc":1,"func":"int","kw":[],"lineno":193},{"argc":6,"func":"_execute_local","kw":[],"lineno":206},{"argc":6,"func":"_execute_remote","kw":[],"lineno":206},{"argc":2,"func":"_emit_diag","kw":[],"lineno":208},{"argc":1,"func":"legacy.BackupError","kw":[],"lineno":209},{"argc":0,"func":"local.is_file","kw":[],"lineno":210},{"argc":1,"func":"hashlib.sha256","kw":[],"lineno":97},{"argc":1,"func":"argv.index","kw":[],"lineno":120},{"argc":2,"func":"ExecFailure","kw":[],"lineno":143},{"argc":2,"func":"_write_all","kw":[],"lineno":147},{"argc":1,"func":"len","kw":[],"lineno":147},{"argc":1,"func":"json.dumps","kw":["separators","sort_keys"],"lineno":177},{"argc":2,"func":"r.get","kw":[],"lineno":193},{"argc":0,"func":"q.stdout.decode","kw":[],"lineno":201},{"argc":1,"func":"hashlib.sha256","kw":[],"lineno":100},{"argc":1,"func":"pathlib.Path","kw":[],"lineno":105},{"argc":1,"func":"type","kw":[],"lineno":119},{"argc":1,"func":"len","kw":[],"lineno":143},{"argc":2,"func":"max","kw":[],"lineno":146},{"argc":0,"func":"local.stat","kw":[],"lineno":210}] -LXC_DANGEROUS_CALL_HITS=[{"argc":1,"func":"subprocess.run","kw":["input","capture_output","timeout","cwd","env"],"lineno":68},{"argc":1,"func":"subprocess.run","kw":["input","capture_output","timeout","cwd","env"],"lineno":95},{"argc":3,"func":"os.open","kw":[],"lineno":126},{"argc":3,"func":"os.open","kw":[],"lineno":126},{"argc":2,"func":"open","kw":["buffering"],"lineno":24},{"argc":1,"func":"subprocess.Popen","kw":["stdin","stdout","stderr","cwd","env","start_new_session","close_fds"],"lineno":133},{"argc":3,"func":"os.open","kw":[],"lineno":178}] -LXC_DANGEROUS_LITERALS=["vzdump"] -PVE265_PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/pve265.py -PVE265_SHA256=cd2f634414a8e38a3789015aeca5a9b47821f77d7d1fa61dcdbdc866172963be -PVE265_BYTES=12888 -PVE265_IMPORTS=[{"kind":"import","lineno":6,"names":[{"as":null,"name":"hashlib"}]},{"kind":"import","lineno":7,"names":[{"as":null,"name":"os"}]},{"kind":"from","level":0,"lineno":8,"module":"pathlib","names":[{"as":null,"name":"Path"}]},{"kind":"import","lineno":9,"names":[{"as":null,"name":"re"}]},{"kind":"import","lineno":10,"names":[{"as":null,"name":"selectors"}]},{"kind":"import","lineno":11,"names":[{"as":null,"name":"signal"}]},{"kind":"import","lineno":12,"names":[{"as":null,"name":"stat"}]},{"kind":"import","lineno":13,"names":[{"as":null,"name":"subprocess"}]},{"kind":"import","lineno":14,"names":[{"as":null,"name":"time"}]},{"kind":"import","lineno":15,"names":[{"as":"core","name":"v2core"}]},{"kind":"import","lineno":16,"names":[{"as":"t","name":"transport261"}]},{"kind":"import","lineno":17,"names":[{"as":"stream","name":"stream263"}]},{"kind":"import","lineno":18,"names":[{"as":"np","name":"nodeplan263"}]}] -PVE265_ALL_CALLS=[{"argc":1,"func":"re.compile","kw":[],"lineno":24},{"argc":2,"func":"need","kw":[],"lineno":38},{"argc":0,"func":"set","kw":[],"lineno":43},{"argc":0,"func":"set","kw":[],"lineno":43},{"argc":0,"func":"text.splitlines","kw":[],"lineno":44},{"argc":1,"func":"sorted","kw":[],"lineno":55},{"argc":1,"func":"sorted","kw":[],"lineno":55},{"argc":2,"func":"need","kw":[],"lineno":58},{"argc":1,"func":"dict","kw":[],"lineno":59},{"argc":0,"func":"out.items","kw":[],"lineno":60},{"argc":2,"func":"need","kw":[],"lineno":67},{"argc":2,"func":"need","kw":[],"lineno":68},{"argc":2,"func":"need","kw":[],"lineno":69},{"argc":2,"func":"need","kw":[],"lineno":70},{"argc":2,"func":"np.guests","kw":[],"lineno":71},{"argc":1,"func":"np.storages","kw":[],"lineno":71},{"argc":2,"func":"need","kw":[],"lineno":72},{"argc":1,"func":"defaults_summary","kw":[],"lineno":73},{"argc":1,"func":"t.sha","kw":[],"lineno":120},{"argc":2,"func":"need","kw":[],"lineno":123},{"argc":2,"func":"need","kw":[],"lineno":124},{"argc":2,"func":"need","kw":[],"lineno":125},{"argc":2,"func":"need","kw":[],"lineno":126},{"argc":2,"func":"need","kw":[],"lineno":127},{"argc":2,"func":"need","kw":[],"lineno":128},{"argc":2,"func":"need","kw":[],"lineno":129},{"argc":2,"func":"need","kw":[],"lineno":130},{"argc":2,"func":"validate_job","kw":[],"lineno":133},{"argc":2,"func":"need","kw":[],"lineno":134},{"argc":2,"func":"need","kw":[],"lineno":151},{"argc":2,"func":"need","kw":[],"lineno":152},{"argc":2,"func":"need","kw":[],"lineno":153},{"argc":2,"func":"need","kw":[],"lineno":154},{"argc":0,"func":"check","kw":[],"lineno":154},{"argc":1,"func":"Path","kw":[],"lineno":155},{"argc":1,"func":"stream.private_dir","kw":[],"lineno":155},{"argc":0,"func":"hashlib.sha256","kw":[],"lineno":156},{"argc":2,"func":"need","kw":[],"lineno":193},{"argc":0,"func":"tools.values","kw":[],"lineno":194},{"argc":2,"func":"need","kw":[],"lineno":205},{"argc":0,"func":"guard","kw":[],"lineno":205},{"argc":2,"func":"validate_job","kw":[],"lineno":205},{"argc":1,"func":"validate_tools","kw":[],"lineno":205},{"argc":1,"func":"Path","kw":[],"lineno":206},{"argc":1,"func":"stream.private_dir","kw":[],"lineno":206},{"argc":1,"func":"t.make_dir","kw":["exclusive"],"lineno":209},{"argc":0,"func":"free_guard","kw":[],"lineno":213},{"argc":5,"func":"capture_archive","kw":[],"lineno":214},{"argc":0,"func":"guard","kw":[],"lineno":215},{"argc":1,"func":"validate_tools","kw":[],"lineno":215},{"argc":4,"func":"t.bounded_process","kw":[],"lineno":216},{"argc":2,"func":"need","kw":[],"lineno":217},{"argc":2,"func":"stream.hash_file","kw":[],"lineno":218},{"argc":2,"func":"need","kw":[],"lineno":219},{"argc":0,"func":"guard","kw":[],"lineno":220},{"argc":1,"func":"validate_tools","kw":[],"lineno":220},{"argc":1,"func":"PVEError","kw":[],"lineno":32},{"argc":2,"func":"isinstance","kw":[],"lineno":35},{"argc":0,"func":"is_absolute","kw":[],"lineno":35},{"argc":1,"func":"all","kw":[],"lineno":35},{"argc":1,"func":"raw.decode","kw":[],"lineno":41},{"argc":0,"func":"line.strip","kw":[],"lineno":45},{"argc":2,"func":"re.fullmatch","kw":[],"lineno":47},{"argc":0,"func":"m.groups","kw":[],"lineno":49},{"argc":1,"func":"seen.add","kw":[],"lineno":51},{"argc":1,"func":"np.valid_id","kw":[],"lineno":67},{"argc":2,"func":"need","kw":[],"lineno":76},{"argc":1,"func":"normalized_config","kw":[],"lineno":77},{"argc":2,"func":"np.config_summary","kw":[],"lineno":77},{"argc":1,"func":"t.sha","kw":[],"lineno":78},{"argc":1,"func":"any","kw":[],"lineno":83},{"argc":1,"func":"sum","kw":[],"lineno":99},{"argc":2,"func":"max","kw":[],"lineno":103},{"argc":2,"func":"min","kw":[],"lineno":104},{"argc":1,"func":"sorted","kw":[],"lineno":106},{"argc":1,"func":"jobs.append","kw":[],"lineno":113},{"argc":1,"func":"len","kw":[],"lineno":114},{"argc":1,"func":"all","kw":[],"lineno":116},{"argc":1,"func":"core.canonical_bytes","kw":[],"lineno":120},{"argc":1,"func":"core.valid_hash","kw":[],"lineno":128},{"argc":1,"func":"str","kw":[],"lineno":135},{"argc":1,"func":"str","kw":[],"lineno":135},{"argc":1,"func":"str","kw":[],"lineno":137},{"argc":2,"func":"os.killpg","kw":[],"lineno":141},{"argc":0,"func":"p.wait","kw":["timeout"],"lineno":143},{"argc":1,"func":"callable","kw":[],"lineno":154},{"argc":0,"func":"time.monotonic","kw":[],"lineno":156},{"argc":3,"func":"os.open","kw":["dir_fd"],"lineno":158},{"argc":1,"func":"os.fstat","kw":[],"lineno":159},{"argc":1,"func":"subprocess.Popen","kw":["stdin","stdout","stderr","env","start_new_session","close_fds"],"lineno":160},{"argc":0,"func":"selectors.DefaultSelector","kw":[],"lineno":162},{"argc":0,"func":"sel.get_map","kw":[],"lineno":165},{"argc":2,"func":"need","kw":[],"lineno":174},{"argc":2,"func":"need","kw":[],"lineno":177},{"argc":2,"func":"need","kw":[],"lineno":177},{"argc":0,"func":"check","kw":[],"lineno":177},{"argc":1,"func":"os.fstat","kw":[],"lineno":178},{"argc":1,"func":"os.stat","kw":["dir_fd","follow_symlinks"],"lineno":178},{"argc":2,"func":"need","kw":[],"lineno":179},{"argc":2,"func":"os.fchmod","kw":[],"lineno":181},{"argc":1,"func":"os.fsync","kw":[],"lineno":181},{"argc":1,"func":"os.fsync","kw":[],"lineno":181},{"argc":1,"func":"os.close","kw":[],"lineno":190},{"argc":2,"func":"need","kw":[],"lineno":195},{"argc":2,"func":"t.read_secure","kw":[],"lineno":196},{"argc":2,"func":"need","kw":[],"lineno":197},{"argc":1,"func":"callable","kw":[],"lineno":205},{"argc":1,"func":"int","kw":[],"lineno":205},{"argc":2,"func":"need","kw":[],"lineno":207},{"argc":1,"func":"os.close","kw":[],"lineno":208},{"argc":1,"func":"os.statvfs","kw":[],"lineno":212},{"argc":2,"func":"need","kw":[],"lineno":212},{"argc":4,"func":"dump_argv","kw":[],"lineno":214},{"argc":1,"func":"dict","kw":[],"lineno":216},{"argc":2,"func":"min","kw":[],"lineno":216},{"argc":1,"func":"str","kw":[],"lineno":221},{"argc":1,"func":"t.sha","kw":[],"lineno":39},{"argc":1,"func":"line.startswith","kw":[],"lineno":46},{"argc":1,"func":"block.add","kw":[],"lineno":48},{"argc":1,"func":"block.add","kw":[],"lineno":50},{"argc":1,"func":"block.add","kw":[],"lineno":52},{"argc":1,"func":"type","kw":[],"lineno":58},{"argc":1,"func":"DISK_RE.fullmatch","kw":[],"lineno":61},{"argc":1,"func":"v.startswith","kw":[],"lineno":62},{"argc":1,"func":"type","kw":[],"lineno":70},{"argc":1,"func":"len","kw":[],"lineno":72},{"argc":1,"func":"len","kw":[],"lineno":72},{"argc":1,"func":"core.canonical_bytes","kw":[],"lineno":78},{"argc":1,"func":"set","kw":[],"lineno":79},{"argc":1,"func":"set","kw":[],"lineno":79},{"argc":1,"func":"block.add","kw":[],"lineno":80},{"argc":1,"func":"block.add","kw":[],"lineno":81},{"argc":1,"func":"block.add","kw":[],"lineno":82},{"argc":1,"func":"block.add","kw":[],"lineno":84},{"argc":1,"func":"stores.get","kw":[],"lineno":95},{"argc":1,"func":"block.add","kw":[],"lineno":100},{"argc":2,"func":"min","kw":[],"lineno":102},{"argc":1,"func":"block.add","kw":[],"lineno":105},{"argc":1,"func":"bool","kw":[],"lineno":109},{"argc":1,"func":"bool","kw":[],"lineno":110},{"argc":1,"func":"np.valid_id","kw":[],"lineno":125},{"argc":1,"func":"job.get","kw":[],"lineno":128},{"argc":1,"func":"path_ok","kw":[],"lineno":134},{"argc":1,"func":"path_ok","kw":[],"lineno":134},{"argc":0,"func":"p.wait","kw":[],"lineno":147},{"argc":1,"func":"all","kw":[],"lineno":151},{"argc":2,"func":"os.set_blocking","kw":[],"lineno":163},{"argc":2,"func":"sel.register","kw":[],"lineno":163},{"argc":0,"func":"time.monotonic","kw":[],"lineno":166},{"argc":2,"func":"need","kw":[],"lineno":166},{"argc":1,"func":"sel.select","kw":[],"lineno":168},{"argc":0,"func":"p.wait","kw":["timeout"],"lineno":175},{"argc":0,"func":"digest.hexdigest","kw":[],"lineno":182},{"argc":1,"func":"list","kw":[],"lineno":182},{"argc":0,"func":"p.wait","kw":[],"lineno":186},{"argc":0,"func":"p.stdout.close","kw":[],"lineno":187},{"argc":0,"func":"p.stderr.close","kw":[],"lineno":187},{"argc":0,"func":"sel.close","kw":[],"lineno":188},{"argc":1,"func":"os.close","kw":[],"lineno":189},{"argc":1,"func":"Path","kw":[],"lineno":196},{"argc":0,"func":"time.time","kw":[],"lineno":205},{"argc":1,"func":"int","kw":[],"lineno":214},{"argc":1,"func":"str","kw":[],"lineno":216},{"argc":1,"func":"Path","kw":[],"lineno":35},{"argc":1,"func":"Path","kw":[],"lineno":35},{"argc":1,"func":"block.add","kw":[],"lineno":53},{"argc":1,"func":"type","kw":[],"lineno":61},{"argc":1,"func":"v.startswith","kw":[],"lineno":63},{"argc":1,"func":"type","kw":[],"lineno":68},{"argc":1,"func":"type","kw":[],"lineno":69},{"argc":1,"func":"split","kw":[],"lineno":87},{"argc":1,"func":"field.partition","kw":[],"lineno":88},{"argc":1,"func":"block.add","kw":[],"lineno":91},{"argc":1,"func":"block.add","kw":[],"lineno":96},{"argc":1,"func":"sizes.append","kw":[],"lineno":98},{"argc":1,"func":"type","kw":[],"lineno":123},{"argc":1,"func":"type","kw":[],"lineno":123},{"argc":1,"func":"type","kw":[],"lineno":124},{"argc":1,"func":"job.get","kw":[],"lineno":125},{"argc":1,"func":"job.get","kw":[],"lineno":125},{"argc":1,"func":"job.get","kw":[],"lineno":126},{"argc":1,"func":"job.get","kw":[],"lineno":126},{"argc":1,"func":"type","kw":[],"lineno":127},{"argc":1,"func":"type","kw":[],"lineno":129},{"argc":1,"func":"job.get","kw":[],"lineno":130},{"argc":1,"func":"job.get","kw":[],"lineno":130},{"argc":2,"func":"os.killpg","kw":[],"lineno":145},{"argc":1,"func":"type","kw":[],"lineno":151},{"argc":1,"func":"type","kw":[],"lineno":152},{"argc":1,"func":"type","kw":[],"lineno":153},{"argc":1,"func":"dict","kw":[],"lineno":161},{"argc":0,"func":"pipe.fileno","kw":[],"lineno":163},{"argc":0,"func":"check","kw":[],"lineno":167},{"argc":2,"func":"min","kw":[],"lineno":168},{"argc":2,"func":"os.read","kw":[],"lineno":169},{"argc":0,"func":"time.monotonic","kw":[],"lineno":174},{"argc":1,"func":"PVEError","kw":[],"lineno":176},{"argc":1,"func":"t.ident","kw":[],"lineno":182},{"argc":1,"func":"terminate","kw":[],"lineno":185},{"argc":1,"func":"type","kw":[],"lineno":193},{"argc":1,"func":"set","kw":[],"lineno":193},{"argc":1,"func":"path_ok","kw":[],"lineno":195},{"argc":1,"func":"core.valid_hash","kw":[],"lineno":195},{"argc":1,"func":"bool","kw":[],"lineno":197},{"argc":1,"func":"os.listdir","kw":[],"lineno":207},{"argc":0,"func":"time.time","kw":[],"lineno":214},{"argc":1,"func":"list","kw":[],"lineno":219},{"argc":1,"func":"ord","kw":[],"lineno":35},{"argc":1,"func":"str","kw":[],"lineno":35},{"argc":1,"func":"type","kw":[],"lineno":38},{"argc":1,"func":"len","kw":[],"lineno":38},{"argc":1,"func":"block.add","kw":[],"lineno":54},{"argc":2,"func":"re.match","kw":[],"lineno":83},{"argc":1,"func":"block.add","kw":[],"lineno":97},{"argc":1,"func":"job.get","kw":[],"lineno":124},{"argc":1,"func":"job.get","kw":[],"lineno":127},{"argc":1,"func":"job.get","kw":[],"lineno":129},{"argc":2,"func":"max","kw":[],"lineno":168},{"argc":0,"func":"key.fileobj.fileno","kw":[],"lineno":169},{"argc":1,"func":"sel.unregister","kw":[],"lineno":170},{"argc":2,"func":"need","kw":[],"lineno":172},{"argc":2,"func":"stream.write_all","kw":[],"lineno":173},{"argc":1,"func":"digest.update","kw":[],"lineno":173},{"argc":1,"func":"len","kw":[],"lineno":173},{"argc":1,"func":"t.ident","kw":[],"lineno":179},{"argc":1,"func":"t.ident","kw":[],"lineno":179},{"argc":1,"func":"os.fstat","kw":[],"lineno":182},{"argc":0,"func":"p.poll","kw":[],"lineno":185},{"argc":1,"func":"type","kw":[],"lineno":195},{"argc":1,"func":"set","kw":[],"lineno":195},{"argc":1,"func":"t.sha","kw":[],"lineno":197},{"argc":1,"func":"type","kw":[],"lineno":151},{"argc":0,"func":"time.monotonic","kw":[],"lineno":175},{"argc":1,"func":"len","kw":[],"lineno":172}] -PVE265_DANGEROUS_CALL_HITS=[{"argc":3,"func":"os.open","kw":["dir_fd"],"lineno":158},{"argc":1,"func":"subprocess.Popen","kw":["stdin","stdout","stderr","env","start_new_session","close_fds"],"lineno":160}] -PVE265_DANGEROUS_LITERALS=["vzdump"] -=== HELPER_FULL_SOURCE_BEGIN === -0001:from __future__ import annotations -0002:import base64, hashlib, json, pathlib, sys -0003: -0004:BASE_RELEASE=pathlib.Path('/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1') -0005:C411=BASE_RELEASE/'candidate411' -0006:PVE265_SHA='cd2f634414a8e38a3789015aeca5a9b47821f77d7d1fa61dcdbdc866172963be' -0007: -0008:def sha(p:pathlib.Path)->str: -0009: return hashlib.sha256(p.read_bytes()).hexdigest() -0010: -0011:def fail(code:str): -0012: raise RuntimeError(code) -0013: -0014:def main()->int: -0015: if len(sys.argv)!=1: fail('HELPER_ARGC') -0016: p=C411/'pve265.py' -0017: if not p.is_file() or p.is_symlink() or sha(p)!=PVE265_SHA: fail('PVE265_IDENTITY') -0018: sys.path.insert(0,str(C411)) -0019: import adapter -0020: adapter.verify_sources() -0021: guest266,pve265,_pve270,_pve282=adapter.load_graph() -0022: data=sys.stdin.buffer.read(4_000_001) -0023: if not data or len(data)>4_000_000: fail('INPUT_BOUND') -0024: raw=json.loads(data.decode('utf-8')) -0025: if type(raw) is not dict: fail('INPUT_SCHEMA') -0026: node=raw.get('node'); vmid=raw.get('vmid'); scratch=raw.get('scratch'); now=raw.get('now') -0027: if type(node) is not str or type(vmid) is not int or type(scratch) is not str or type(now) is not int: fail('INPUT_FIELDS') -0028: configs={int(k):v for k,v in raw.get('configs',[])} -0029: defaults=None if raw.get('defaults_b64') is None else base64.b64decode(raw['defaults_b64']) -0030: plan=pve265.make_plan(raw.get('rows'),configs,raw.get('storage_rows'),defaults,int(raw.get('staging_free')),now,node=node) -0031: jobs=[j for j in plan['jobs'] if j.get('vmid')==vmid] -0032: if len(jobs)!=1: fail('JOB_CARDINALITY') -0033: job=jobs[0] -0034: pve265.validate_job(job,now) -0035: if job.get('type')!='lxc' or job.get('node')!=node: fail('JOB_IDENTITY') -0036: if job.get('configured_full_cycle_fits') is not True or job.get('compression_dependent') is not False: fail('JOB_CAPACITY_POLICY') -0037: guest266.no_active_tasks(raw.get('tasks'),vmid) -0038: argv=pve265.dump_argv(job,'/usr/bin/vzdump',scratch,now) -0039: keep=('vmid','type','node','status','template','config_sha256','disks','configured_disk_bytes','configured_archive_bound_bytes','archive_cap_bytes','global_defaults_sha256','blockers','coverage_eligible') -0040: out={'schema':1,'argv':argv,'job':{k:job.get(k) for k in keep}} -0041: sys.stdout.write(json.dumps(out,separators=(',',':'),sort_keys=True)+'\n') -0042: return 0 -0043: -0044:if __name__=='__main__': -0045: raise SystemExit(main()) -=== HELPER_FULL_SOURCE_END === -HELPER_PVE265_CALLS=dump_argv,make_plan,validate_job -PVE265_REACHABLE_FUNCTIONS=defaults_summary,dump_argv,make_plan,need,normalized_config,path_ok,validate_job -PVE265_REACHABLE_EDGES=[["defaults_summary","need"],["dump_argv","need"],["dump_argv","path_ok"],["dump_argv","path_ok"],["dump_argv","validate_job"],["make_plan","defaults_summary"],["make_plan","need"],["make_plan","need"],["make_plan","need"],["make_plan","need"],["make_plan","need"],["make_plan","need"],["make_plan","normalized_config"],["normalized_config","need"],["validate_job","need"],["validate_job","need"],["validate_job","need"],["validate_job","need"],["validate_job","need"],["validate_job","need"],["validate_job","need"],["validate_job","need"]] -=== PVE265_FUNC_defaults_summary_BEGIN === -0001:def defaults_summary(raw): -0002: need(raw is None or type(raw) is bytes and len(raw)<=262144,'DEFAULTS_BOUND') -0003: result={'present':raw is not None,'sha256':t.sha(raw) if raw is not None else None,'keys':[],'blockers':[]} -0004: if raw is None:return result -0005: try:text=raw.decode('utf-8-sig') -0006: except UnicodeError:result['blockers']=['GLOBAL_DEFAULT_PARSE'];return result -0007: seen=set();block=set() -0008: for line in text.splitlines(): -0009: line=line.strip() -0010: if not line or line.startswith('#'):continue -0011: m=re.fullmatch(r'([a-z][a-z0-9_-]*)\s*:\s*(.*)',line) -0012: if not m:block.add('GLOBAL_DEFAULT_PARSE');continue -0013: key,value=m.groups() -0014: if key in seen:block.add('GLOBAL_DEFAULT_DUPLICATE') -0015: seen.add(key) -0016: if key=='script':block.add('GLOBAL_DEFAULT_SCRIPT') -0017: elif key=='exclude-path':block.add('GLOBAL_DEFAULT_EXCLUDE_PATH') -0018: elif key not in OVERRIDDEN:block.add('GLOBAL_DEFAULT_UNREVIEWED') -0019: result['keys']=sorted(seen);result['blockers']=sorted(block);return result -=== PVE265_FUNC_defaults_summary_END === -=== PVE265_FUNC_dump_argv_BEGIN === -0001:def dump_argv(job,executable,tmpdir,now): -0002: validate_job(job,now) -0003: need(path_ok(executable) and path_ok(tmpdir),'EXECUTION_PATH') -0004: return [str(executable),str(job['vmid']),'--node',job['node'],'--mode','snapshot','--stdout','1', -0005: '--compress','zstd','--zstd','1','--remove','0','--prune-backups','keep-all=1', -0006: '--stdexcludes','0','--lockwait','0','--bwlimit','32768','--ionice','7','--tmpdir',str(tmpdir)] -=== PVE265_FUNC_dump_argv_END === -=== PVE265_FUNC_make_plan_BEGIN === -0001:def make_plan(rows,configs,storage_rows,defaults,staging_free,now,node='pve01'): -0002: need(np.valid_id(node),'NODE_NAME') -0003: need(type(staging_free) is int and 0<=staging_free<=2**63-1,'SPACE_VALUE') -0004: need(type(now) is int and now>=0,'PLAN_TIME') -0005: need(type(configs) is dict,'CONFIGS_SCHEMA') -0006: guests=np.guests(rows,node);ss=np.storages(storage_rows) -0007: need(len({x['storage'] for x in ss})==len(ss),'DUPLICATE_STORAGE') -0008: stores={x['storage']:x for x in ss};global_summary=defaults_summary(defaults) -0009: jobs=[] -0010: for g in guests: -0011: need(g['vmid'] in configs,'GUEST_CONFIG_MISSING') -0012: original=configs[g['vmid']];cfg=normalized_config(original);summary=np.config_summary(cfg,g['type']) -0013: summary['config_sha256']=t.sha(core.canonical_bytes(original)) -0014: block=set(summary['blockers'])|set(global_summary['blockers']);sizes=[] -0015: if not summary['disks']:block.add('NO_BACKUP_DISKS') -0016: if g['template']:block.add('TEMPLATE_REQUIRES_SEPARATE_POLICY') -0017: if g['status']!='running':block.add('GUEST_NOT_RUNNING') -0018: if any(k=='args' or re.match(r'hostpci\d+|usb\d+|virtiofs\d+|dev\d+|lxc\.',k) for k in cfg): -0019: block.add('EXTERNAL_DEVICE_OR_CUSTOM_CONFIG') -0020: for disk in summary['disks']: -0021: slot=disk['slot'];opts={} -0022: for field in cfg[slot].split(',')[1:]: -0023: k,sep,v=field.partition('=') -0024: if sep:opts[k]=v -0025: if 'backup' in opts and opts['backup'] not in ('0','1','yes','no','on','off','true','false'): -0026: block.add('BACKUP_FLAG_UNKNOWN') -0027: if disk['backup_setting']=='default_unproven': -0028: if g['type']=='qemu':disk['backup_setting']='included_default_qemu' -0029: elif slot=='rootfs':disk['backup_setting']='included_default_rootfs' -0030: st=stores.get(disk['storage']) -0031: if st is None or st['active'] is not True or st['enabled'] is not True:block.add('STORAGE_NOT_AVAILABLE') -0032: elif g['type']=='lxc' and st['type'] not in ('lvmthin','zfspool'):block.add('LXC_SNAPSHOT_SUPPORT_UNPROVEN') -0033: if disk['configured_size_bytes'] is not None:sizes.append(disk['configured_size_bytes']) -0034: total=sum(sizes) -0035: if total>stream.MAX_BYTES:block.add('GUEST_SIZE_EXCEEDS_CORE_BOUND') -0036: # Policy ceiling, not an estimate of compression ratio. Actual byte cap is enforced at read/write. -0037: configured_bound=min(stream.MAX_BYTES,total+(total+9)//10+64*1024**2) if total else 0 -0038: capacity=max(0,(staging_free-LOCAL_RESERVE)//4) -0039: cap=min(configured_bound,capacity) -0040: if cap<=0:block.add('STAGING_CAPACITY_ZERO') -0041: summary['blockers']=sorted(block) -0042: job={**g,**summary,'observed_at':now,'global_defaults_sha256':global_summary['sha256'], -0043: 'configured_disk_bytes':total,'configured_archive_bound_bytes':configured_bound, -0044: 'archive_cap_bytes':cap,'configured_full_cycle_fits':bool(configured_bound and 4*configured_bound+LOCAL_RESERVE<=staging_free), -0045: 'compression_dependent':bool(configured_bound and cap1 else 'selftest'; d=describe() +0041: if mode not in ('selftest','describe'):raise SystemExit(2) +0042: print(json.dumps(d,sort_keys=True,separators=(',',':'))) +0043: if mode=='selftest':print('ADAPTER_SELFTEST=PASS') +0044:if __name__=='__main__':main() +=== ADAPTER_FULL_SOURCE_END === +=== ADAPTER_FUNC_verify_sources_BEGIN === +0001:def verify_sources(): +0002: for name,want in EXPECTED.items(): +0003: p=BASE/name +0004: if not p.is_file() or p.is_symlink() or sha(p)!=want:raise RuntimeError('SOURCE_IDENTITY_'+name) +=== ADAPTER_FUNC_verify_sources_END === +=== ADAPTER_FUNC_load_graph_BEGIN === +0001:def load_graph(): +0002: import guest266,pve265,pve270,pve282 +0003: if hasattr(guest266,'dump_argv'):raise RuntimeError('GUEST266_UNEXPECTED_DUMP_ARGV') +0004: if not hasattr(pve265,'dump_argv'):raise RuntimeError('PVE265_DUMP_ARGV_MISSING') +0005: if getattr(pve270,'old',None) is not pve265:raise RuntimeError('PVE270_OLD_NOT_PVE265') +0006: if getattr(pve282,'old',None) is not pve265:raise RuntimeError('PVE282_OLD_NOT_PVE265') +0007: if getattr(pve282,'proven',None) is not pve270:raise RuntimeError('PVE282_PROVEN_NOT_PVE270') +0008: for n in ('MappedScratch','capture_archive','validate_mapping'): +0009: if not hasattr(pve270,n):raise RuntimeError('PVE270_'+n.upper()+'_MISSING') +0010: if getattr(pve282,n,None) is not getattr(pve270,n):raise RuntimeError('PVE282_ALIAS_'+n.upper()+'_MISMATCH') +0011: return guest266,pve265,pve270,pve282 +=== ADAPTER_FUNC_load_graph_END === +ADAPTER_REACHABLE_FUNCTIONS=load_graph,sha,verify_sources +ADAPTER_REACHABLE_EDGES=[["verify_sources","sha"]] +ADAPTER_REACHABLE_CALLS=[{"args":["guest266","'dump_argv'"],"func":"hasattr","kw":[],"lineno":26,"owner":"load_graph"},{"args":["'GUEST266_UNEXPECTED_DUMP_ARGV'"],"func":"RuntimeError","kw":[],"lineno":26,"owner":"load_graph"},{"args":["pve265","'dump_argv'"],"func":"hasattr","kw":[],"lineno":27,"owner":"load_graph"},{"args":["'PVE265_DUMP_ARGV_MISSING'"],"func":"RuntimeError","kw":[],"lineno":27,"owner":"load_graph"},{"args":["pve270","'old'","None"],"func":"getattr","kw":[],"lineno":28,"owner":"load_graph"},{"args":["'PVE270_OLD_NOT_PVE265'"],"func":"RuntimeError","kw":[],"lineno":28,"owner":"load_graph"},{"args":["pve282","'old'","None"],"func":"getattr","kw":[],"lineno":29,"owner":"load_graph"},{"args":["'PVE282_OLD_NOT_PVE265'"],"func":"RuntimeError","kw":[],"lineno":29,"owner":"load_graph"},{"args":["pve282","'proven'","None"],"func":"getattr","kw":[],"lineno":30,"owner":"load_graph"},{"args":["'PVE282_PROVEN_NOT_PVE270'"],"func":"RuntimeError","kw":[],"lineno":30,"owner":"load_graph"},{"args":["pve270","n"],"func":"hasattr","kw":[],"lineno":32,"owner":"load_graph"},{"args":["'PVE270_' + n.upper() + '_MISSING'"],"func":"RuntimeError","kw":[],"lineno":32,"owner":"load_graph"},{"args":["pve282","n","None"],"func":"getattr","kw":[],"lineno":33,"owner":"load_graph"},{"args":["pve270","n"],"func":"getattr","kw":[],"lineno":33,"owner":"load_graph"},{"args":["'PVE282_ALIAS_' + n.upper() + '_MISMATCH'"],"func":"RuntimeError","kw":[],"lineno":33,"owner":"load_graph"},{"args":[],"func":"n.upper","kw":[],"lineno":32,"owner":"load_graph"},{"args":[],"func":"n.upper","kw":[],"lineno":33,"owner":"load_graph"},{"args":[],"func":"hashlib.sha256","kw":[],"lineno":16,"owner":"sha"},{"args":[],"func":"h.hexdigest","kw":[],"lineno":19,"owner":"sha"},{"args":["p","'rb'"],"func":"open","kw":[],"lineno":17,"owner":"sha"},{"args":["lambda: f.read(1048576)","b''"],"func":"iter","kw":[],"lineno":18,"owner":"sha"},{"args":["b"],"func":"h.update","kw":[],"lineno":18,"owner":"sha"},{"args":["1048576"],"func":"f.read","kw":[],"lineno":18,"owner":"sha"},{"args":[],"func":"EXPECTED.items","kw":[],"lineno":21,"owner":"verify_sources"},{"args":[],"func":"p.is_symlink","kw":[],"lineno":23,"owner":"verify_sources"},{"args":["'SOURCE_IDENTITY_' + name"],"func":"RuntimeError","kw":[],"lineno":23,"owner":"verify_sources"},{"args":[],"func":"p.is_file","kw":[],"lineno":23,"owner":"verify_sources"},{"args":["p"],"func":"sha","kw":[],"lineno":23,"owner":"verify_sources"}] +ADAPTER_REACHABLE_SIDE_EFFECT_CALLS=[] +ADAPTER_REACHABLE_SIDE_EFFECT_CALL_COUNT=0 +LOCAL_IMPORT_GRAPH={"adapter":[]} +LOCAL_IMPORT_GRAPH_MODULES=adapter +MODULE_adapter_TOPLEVEL_CALLS=[{"args":[],"func":"resolve","kw":[],"lineno":3},{"args":["__file__"],"func":"pathlib.Path","kw":[],"lineno":3},{"args":[],"func":"main","kw":[],"lineno":44}] +MODULE_adapter_TOPLEVEL_SIDE_EFFECT_CALLS=[] +LOCAL_IMPORT_TOPLEVEL_SIDE_EFFECT_CALLS=[] +LOCAL_IMPORT_TOPLEVEL_SIDE_EFFECT_COUNT=0 +GUEST266_FOUND=true +=== GUEST266_NO_ACTIVE_TASKS_BEGIN === +0001:def no_active_tasks(rows,vmid): +0002: t.need(type(rows) is list and len(rows)<1000,'ACTIVE_TASKS_TRUNCATED_OR_INVALID') +0003: for task in rows: +0004: t.need(type(task) is dict and type(task.get('type')) is str,'ACTIVE_TASK_SCHEMA') +0005: # The active index includes completed, not-yet-archived tasks. +0006: if type(task.get('endtime')) is int and task.get('status') not in (None,'RUNNING'):continue +0007: kind=task['type'];target=str(task.get('id','')) +0008: if kind in ('vncshell','vncterm','vncproxy','spiceproxy'):continue +0009: t.need(target!=str(vmid) and not any(x in kind.lower() for x in ('dump','restore','migrat','snapshot','clone','move_disk','resize')),'COMPETING_PVE_TASK') +=== GUEST266_NO_ACTIVE_TASKS_END === +GUEST266_REACHABLE_FUNCTIONS=no_active_tasks +GUEST266_REACHABLE_EDGES=[] +GUEST266_REACHABLE_CALLS=[{"args":["type(rows) is list and len(rows) < 1000","'ACTIVE_TASKS_TRUNCATED_OR_INVALID'"],"func":"t.need","kw":[],"lineno":60,"owner":"no_active_tasks"},{"args":["type(task) is dict and type(task.get('type')) is str","'ACTIVE_TASK_SCHEMA'"],"func":"t.need","kw":[],"lineno":62,"owner":"no_active_tasks"},{"args":["task.get('id', '')"],"func":"str","kw":[],"lineno":65,"owner":"no_active_tasks"},{"args":["target != str(vmid) and (not any((x in kind.lower() for x in ('dump', 'restore', 'migrat', 'snapshot', 'clone', 'move_disk', 'resize'))))","'COMPETING_PVE_TASK'"],"func":"t.need","kw":[],"lineno":67,"owner":"no_active_tasks"},{"args":["'id'","''"],"func":"task.get","kw":[],"lineno":65,"owner":"no_active_tasks"},{"args":["rows"],"func":"type","kw":[],"lineno":60,"owner":"no_active_tasks"},{"args":["rows"],"func":"len","kw":[],"lineno":60,"owner":"no_active_tasks"},{"args":["task.get('endtime')"],"func":"type","kw":[],"lineno":64,"owner":"no_active_tasks"},{"args":["'status'"],"func":"task.get","kw":[],"lineno":64,"owner":"no_active_tasks"},{"args":["task"],"func":"type","kw":[],"lineno":62,"owner":"no_active_tasks"},{"args":["task.get('type')"],"func":"type","kw":[],"lineno":62,"owner":"no_active_tasks"},{"args":["'endtime'"],"func":"task.get","kw":[],"lineno":64,"owner":"no_active_tasks"},{"args":["vmid"],"func":"str","kw":[],"lineno":67,"owner":"no_active_tasks"},{"args":["(x in kind.lower() for x in ('dump', 'restore', 'migrat', 'snapshot', 'clone', 'move_disk', 'resize'))"],"func":"any","kw":[],"lineno":67,"owner":"no_active_tasks"},{"args":["'type'"],"func":"task.get","kw":[],"lineno":62,"owner":"no_active_tasks"},{"args":[],"func":"kind.lower","kw":[],"lineno":67,"owner":"no_active_tasks"}] +GUEST266_REACHABLE_SIDE_EFFECT_CALLS=[] +GUEST266_REACHABLE_SIDE_EFFECT_CALL_COUNT=0 +TRANSITIVE_STATIC_REPLAY_SAFE=true +STATIC_TRANSITIVE_ANALYSIS_COMPLETE=true +STATIC_TRANSITIVE_RC=0 +TRANSITIVE_STATIC_REPLAY_SAFE_SUMMARY=true +TASK_RESULT=PASS_CT110_HELPER_TRANSITIVE_STATIC_SAFE +DECISION=PASS_HELPER_REPLAY_STATIC_SAFETY_PROVEN +NEXT_GATE=CONTROLLED_CT110_HELPER_REPLAY_ONLY +HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-TRANSITIVE-STATIC-RCA-1225R1","status":"OK","changes_made":false,"rollback_started":false,"rollback_restored":null} OUTPUT_END CHAT_OUTPUT_END