diff --git a/runtime/history/SUPPORT-261005-SKLADCHIK-DURABILITY-BACKUP-PRODUCER-RCA-99578R1.json b/runtime/history/SUPPORT-261005-SKLADCHIK-DURABILITY-BACKUP-PRODUCER-RCA-99578R1.json new file mode 100644 index 00000000..af2186db --- /dev/null +++ b/runtime/history/SUPPORT-261005-SKLADCHIK-DURABILITY-BACKUP-PRODUCER-RCA-99578R1.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "SUPPORT-261005-SKLADCHIK-DURABILITY-BACKUP-PRODUCER-RCA-99578R1", + "status": "FAIL", + "rc": 43, + "host": "pve01", + "mode": "read-only", + "component": "skladchik-durability-backup-producer-rca", + "started_at_utc": "2026-10-05T06:43:36Z", + "finished_at_utc": "2026-10-05T06:44:06Z", + "reference_register_checked": true, + "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", + "error_register_checked": true, + "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", + "command_sha256": "6d4e000caabe0b4f15d31ba419f9633c5004c1b83d9c535098b8901ae634bb59", + "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": 43, + "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": "16ba01850d81f6abbd81c5322dfb90ebe83f2780ce7f91f057ae10bce56216b0", + "sanitized_output_sha256": "16ba01850d81f6abbd81c5322dfb90ebe83f2780ce7f91f057ae10bce56216b0", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "SKLADCHIK_DURABILITY_BACKUP_PRODUCER_RCA=V1\nNO_MAIL_SEND=true\nNO_SERVICE_RESTART=true\nNO_TIMER_MUTATION=true\nNO_NETWORK_MUTATION=true\nNO_SOURCE_MUTATION=true\nNO_BACKUP_MUTATION=true\nNO_GIT_PUSH=true\nMODE=read-only\nHOST_PVE01=true\nPRODUCER_VM170_QM_RC=0\nPRODUCER_VM170_STDERR_PRESENT=false\nPRODUCER_VM170_JSON=true\nPRODUCER_VM170_GUEST_EXITCODE=0\nVM170_MONITOR_SHA=19123e359f2f7b9a2d373fd7e4464dd426d31b91cabc567c252e70cad40d77c8\nVM170_TIMER_ACTIVE=active\nVM170_TIMER_ENABLED=enabled\nVM170_SERVICE_RESULT=success\nVM170_HEALTH_STATUS=OK\\nVM170_HEALTH_TS=2026-10-05T06:43:23Z\\nVM170_HEALTH_REPORTS=22\\nVM170_HEALTH_OPEN=13\\nVM170_HEALTH_RESOLVED=9\\n\nVM170_BASELINE_OK=false\nSUPERVISOR_PRESENT=true\nSUPERVISOR_SHA=3a9bf9f3f9c28dbf670300f0851a5b7f86eb41fa41cdf44d0935337ae8ef02a2\nSUPERVISOR_BASENAME=skladchik-reports-monitor-supervisor\nSUPERVISOR_AST_OK=true\nSUPERVISOR_FUNCTION_COUNT=16\nSUPERVISOR_FUNCTIONS=now,iso,log,run,parse_env_text,read_env_file,age_seconds_from_ts,ssh_edge,edge_mail,systemctl_props,gather,render_body,write_health,read_state,write_state,main\nSUPERVISOR_CLI_OPTION_COUNT=0\nSUPERVISOR_CLI_OPTIONS=NONE\nSUPERVISOR_ENV_NAME_COUNT=5\nSUPERVISOR_ENV_NAMES=SKLADCHIK_BACKUP_HEALTH_MAX_SECONDS,SKLADCHIK_COOKIE_EXPIRY_WARN_SECONDS,SKLADCHIK_EDGE,SKLADCHIK_MONITOR_HEALTH_MAX_SECONDS,SKLADCHIK_RESTORE_HEALTH_MAX_SECONDS\nSUPERVISOR_RELEVANT_FUNCTION_COUNT=4\nSUPERVISOR_FUNC_1_NAME=parse_env_text\nSUPERVISOR_FUNC_1_LINENO=51\nSUPERVISOR_FUNC_1_ENDLINENO=58\nSUPERVISOR_FUNC_1_NAMES=d,k,line,split,splitlines,startswith,strip,text,v\nSUPERVISOR_FUNC_1_AST_BEGIN\nFunctionDef(\n name='parse_env_text',\n args=arguments(\n args=[\n arg(arg='text')]),\n body=[\n Assign(\n targets=[\n Name(id='d', ctx=Store())],\n value=Dict()),\n For(\n target=Name(id='line', ctx=Store()),\n iter=Call(\n func=Attribute(\n value=BoolOp(\n op=Or(),\n values=[\n Name(id='text', ctx=Load()),\n Constant(value='')]),\n attr='splitlines',\n ctx=Load())),\n body=[\n If(\n test=BoolOp(\n op=Or(),\n values=[\n UnaryOp(\n op=Not(),\n operand=Name(id='line', ctx=Load())),\n Call(\n func=Attribute(\n value=Name(id='line', ctx=Load()),\n attr='startswith',\n ctx=Load()),\n args=[\n Constant(value='#')]),\n Compare(\n left=Constant(value='='),\n ops=[\n NotIn()],\n comparators=[\n Name(id='line', ctx=Load())])]),\n body=[\n Continue()]),\n Assign(\n targets=[\n Tuple(\n elts=[\n Name(id='k', ctx=Store()),\n Name(id='v', ctx=Store())],\n ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='line', ctx=Load()),\n attr='split',\n ctx=Load()),\n args=[\n Constant(value='='),\n Constant(value=1)])),\n Assign(\n targets=[\n Subscript(\n value=Name(id='d', ctx=Load()),\n slice=Call(\n func=Attribute(\n value=Name(id='k', ctx=Load()),\n attr='strip',\n ctx=Load())),\n ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='v', ctx=Load()),\n attr='strip',\n ctx=Load())))]),\n Return(\n value=Name(id='d', ctx=Load()))])\nSUPERVISOR_FUNC_1_AST_END\nSUPERVISOR_FUNC_2_NAME=gather\nSUPERVISOR_FUNC_2_LINENO=110\nSUPERVISOR_FUNC_2_ENDLINENO=347\nSUPERVISOR_FUNC_2_NAMES=APP_FRESHNESS_PROBE,Exception,M,MONITOR_HEALTH_AGE_MAX,Path,S,age_seconds_from_ts,append,base,core_cmd,facts,files,get,group,health_age,int,items,k,local_units,m,mon,name,opened,out,p,parse_env_text,probe,probe_out,probe_rc,problems,props,quote,rc,re,read_text,reg_cmd,reg_out,reg_rc,registry_source,replace,reports,resolved,route,route_lines,run,search,section,shlex,splitlines,ssh_edge,startswith,str,strip,systemctl_props,timer_active,timer_enabled,timers_text,u,wm,worker_path,worker_target,worker_text\nSUPERVISOR_FUNC_2_AST_BEGIN\nFunctionDef(\n name='gather',\n args=arguments(),\n body=[\n Assign(\n targets=[\n Name(id='facts', ctx=Store())],\n value=Dict()),\n Assign(\n targets=[\n Name(id='problems', ctx=Store())],\n value=List(ctx=Load())),\n Assign(\n targets=[\n Name(id='core_cmd', ctx=Store())],\n value=Constant(value='')),\n Assign(\n targets=[\n Tuple(\n elts=[\n Name(id='rc', ctx=Store()),\n Name(id='out', ctx=Store())],\n ctx=Store())],\n value=Call(\n func=Name(id='ssh_edge', ctx=Load()),\n args=[\n Name(id='core_cmd', ctx=Load())],\n keywords=[\n keyword(\n arg='timeout',\n value=Constant(value=45))])),\n Assign(\n targets=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='core_ssh_rc'),\n ctx=Store())],\n value=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Name(id='rc', ctx=Load())])),\n If(\n test=Compare(\n left=Name(id='rc', ctx=Load()),\n ops=[\n NotEq()],\n comparators=[\n Constant(value=0)]),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='core_ssh_failed')]))]),\n FunctionDef(\n name='section',\n args=arguments(\n args=[\n arg(arg='name')]),\n body=[\n Assign(\n targets=[\n Name(id='m', ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='re', ctx=Load()),\n attr='search',\n ctx=Load()),\n args=[\n JoinedStr(\n values=[\n Constant(value='__'),\n FormattedValue(\n value=Name(id='name', ctx=Load()),\n conversion=-1),\n Constant(value='_BEGIN__\\\\n(.*?)\\\\n__'),\n FormattedValue(\n value=Name(id='name', ctx=Load()),\n conversion=-1),\n Constant(value='_END__')]),\n Name(id='out', ctx=Load()),\n Attribute(\n value=Name(id='re', ctx=Load()),\n attr='S',\n ctx=Load())])),\n Return(\n value=IfExp(\n test=Name(id='m', ctx=Load()),\n body=Call(\n func=Attribute(\n value=Call(\n func=Attribute(\n value=Name(id='m', ctx=Load()),\n attr='group',\n ctx=Load()),\n args=[\n Constant(value=1)]),\n attr='strip',\n ctx=Load())),\n orelse=Constant(value='')))]),\n Assign(\n targets=[\n Name(id='mon', ctx=Store())],\n value=Call(\n func=Name(id='parse_env_text', ctx=Load()),\n args=[\n Call(\n func=Name(id='section', ctx=Load()),\n args=[\n Constant(value='MONITOR_HEALTH')])])),\n Assign(\n targets=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_status'),\n ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='mon', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='STATUS'),\n Constant(value='MISSING')])),\n Assign(\n targets=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_reports'),\n ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='mon', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='reports'),\n Constant(value='')])),\n Assign(\n targets=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_open'),\n ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='mon', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='open'),\n Constant(value='')])),\n Assign(\n targets=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_resolved'),\n ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='mon', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='resolved'),\n Constant(value='')])),\n Assign(\n targets=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_smtp_configured'),\n ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='mon', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='smtp_configured'),\n Constant(value='')])),\n Assign(\n targets=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_health_age_seconds'),\n ctx=Store())],\n value=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Call(\n func=Name(id='age_seconds_from_ts', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='mon', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='TS')])])])),\n If(\n test=Compare(\n left=Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_status'),\n ctx=Load()),\n ops=[\n NotEq()],\n comparators=[\n Constant(value='OK')]),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='monitor_status_not_ok')]))]),\n Try(\n body=[\n Assign(\n targets=[\n Name(id='health_age', ctx=Store())],\n value=Call(\n func=Name(id='int', ctx=Load()),\n args=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_health_age_seconds'),\n ctx=Load())])),\n If(\n test=Compare(\n left=Name(id='health_age', ctx=Load()),\n ops=[\n Gt()],\n comparators=[\n Name(id='MONITOR_HEALTH_AGE_MAX', ctx=Load())]),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='monitor_health_stale')]))])],\n handlers=[\n ExceptHandler(\n type=Name(id='Exception', ctx=Load()),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='monitor_health_age_invalid')]))])]),\n Try(\n body=[\n Assign(\n targets=[\n Name(id='reports', ctx=Store())],\n value=Call(\n func=Name(id='int', ctx=Load()),\n args=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_reports'),\n ctx=Load())])),\n Assign(\n targets=[\n Name(id='opened', ctx=Store())],\n value=Call(\n func=Name(id='int', ctx=Load()),\n args=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_open'),\n ctx=Load())])),\n Assign(\n targets=[\n Name(id='resolved', ctx=Store())],\n value=Call(\n func=Name(id='int', ctx=Load()),\n args=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_resolved'),\n ctx=Load())])),\n If(\n test=Compare(\n left=Name(id='reports', ctx=Load()),\n ops=[\n LtE()],\n comparators=[\n Constant(value=0)]),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='monitor_reports_zero_or_missing')]))]),\n If(\n test=BoolOp(\n op=Or(),\n values=[\n Compare(\n left=Name(id='opened', ctx=Load()),\n ops=[\n Lt()],\n comparators=[\n Constant(value=0)]),\n Compare(\n left=Name(id='resolved', ctx=Load()),\n ops=[\n Lt()],\n comparators=[\n Constant(value=0)]),\n Compare(\n left=BinOp(\n left=Name(id='opened', ctx=Load()),\n op=Add(),\n right=Name(id='resolved', ctx=Load())),\n ops=[\n NotEq()],\n comparators=[\n Name(id='reports', ctx=Load())])]),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='monitor_counts_invalid')]))])],\n handlers=[\n ExceptHandler(\n type=Name(id='Exception', ctx=Load()),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='monitor_counts_missing')]))])]),\n If(\n test=Compare(\n left=Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_smtp_configured'),\n ctx=Load()),\n ops=[\n NotEq()],\n comparators=[\n Constant(value='yes')]),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='monitor_smtp_not_configured')]))]),\n Assign(\n targets=[\n Name(id='timers_text', ctx=Store())],\n value=Call(\n func=Name(id='section', ctx=Load()),\n args=[\n Constant(value='TIMERS')])),\n Assign(\n targets=[\n Name(id='m', ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='re', ctx=Load()),\n attr='search',\n ctx=Load()),\n args=[\n Constant(value='skladchik-reports-monitor\\\\.timer\\\\s+enabled=([^\\\\s]+)\\\\s+active=([^\\\\s]+)'),\n Name(id='timers_text', ctx=Load())])),\n Assign(\n targets=[\n Name(id='timer_enabled', ctx=Store())],\n value=IfExp(\n test=Name(id='m', ctx=Load()),\n body=Call(\n func=Attribute(\n value=Name(id='m', ctx=Load()),\n attr='group',\n ctx=Load()),\n args=[\n Constant(value=1)]),\n orelse=Constant(value='missing'))),\n Assign(\n targets=[\n Name(id='timer_active', ctx=Store())],\n value=IfExp(\n test=Name(id='m', ctx=Load()),\n body=Call(\n func=Attribute(\n value=Name(id='m', ctx=Load()),\n attr='group',\n ctx=Load()),\n args=[\n Constant(value=2)]),\n orelse=Constant(value='missing'))),\n Assign(\n targets=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_timer_enabled'),\n ctx=Store())],\n value=Name(id='timer_enabled', ctx=Load())),\n Assign(\n targets=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_timer_active'),\n ctx=Store())],\n value=Name(id='timer_active', ctx=Load())),\n If(\n test=Compare(\n left=Name(id='timer_enabled', ctx=Load()),\n ops=[\n NotEq()],\n comparators=[\n Constant(value='enabled')]),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='monitor_timer_not_enabled')]))]),\n If(\n test=Compare(\n left=Name(id='timer_active', ctx=Load()),\n ops=[\n NotEq()],\n comparators=[\n Constant(value='active')]),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='monitor_timer_not_active')]))]),\n Assign(\n targets=[\n Name(id='route_lines', ctx=Store())],\n value=Call(\n func=Attribute(\n value=Call(\n func=Name(id='section', ctx=Load()),\n args=[\n Constant(value='ROUTE')]),\n att\n\nSUPERVISOR_FUNC_2_AST_END\nSUPERVISOR_FUNC_3_NAME=render_body\nSUPERVISOR_FUNC_3_LINENO=349\nSUPERVISOR_FUNC_3_ENDLINENO=378\nSUPERVISOR_FUNC_3_NAMES=facts,get,join,lines,none_text,problems,status,str\nSUPERVISOR_FUNC_3_AST_BEGIN\nFunctionDef(\n name='render_body',\n args=arguments(\n args=[\n arg(arg='status'),\n arg(arg='facts'),\n arg(arg='problems'),\n arg(arg='mode')]),\n body=[\n Assign(\n targets=[\n Name(id='none_text', ctx=Store())],\n value=Constant(value='нет')),\n Assign(\n targets=[\n Name(id='lines', ctx=Store())],\n value=List(\n elts=[\n Constant(value='Надзор мониторинга жалоб Складчика'),\n Constant(value=''),\n BinOp(\n left=Constant(value='Статус: '),\n op=Add(),\n right=Name(id='status', ctx=Load())),\n BinOp(\n left=Constant(value='Проблемы: '),\n op=Add(),\n right=IfExp(\n test=Name(id='problems', ctx=Load()),\n body=Call(\n func=Attribute(\n value=Constant(value=', '),\n attr='join',\n ctx=Load()),\n args=[\n Name(id='problems', ctx=Load())]),\n orelse=Name(id='none_text', ctx=Load()))),\n Constant(value=''),\n Constant(value='Основной монитор:'),\n Constant(value=''),\n BinOp(\n left=Constant(value='- status: '),\n op=Add(),\n right=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='monitor_status'),\n Constant(value='')])])),\n BinOp(\n left=Constant(value='- reports: '),\n op=Add(),\n right=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='monitor_reports'),\n Constant(value='')])])),\n BinOp(\n left=Constant(value='- open: '),\n op=Add(),\n right=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='monitor_open'),\n Constant(value='')])])),\n BinOp(\n left=Constant(value='- resolved: '),\n op=Add(),\n right=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='monitor_resolved'),\n Constant(value='')])])),\n BinOp(\n left=Constant(value='- route: '),\n op=Add(),\n right=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='netbird_route'),\n Constant(value='')])])),\n Constant(value=''),\n Constant(value='Canonical backup:'),\n BinOp(\n left=Constant(value='- decision: '),\n op=Add(),\n right=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='canonical_backup_decision'),\n Constant(value='')])])),\n BinOp(\n left=Constant(value='- generation: '),\n op=Add(),\n right=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='canonical_backup_generation'),\n Constant(value='')])])),\n BinOp(\n left=Constant(value='- registry source: '),\n op=Add(),\n right=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='registry_source'),\n Constant(value='')])])),\n BinOp(\n left=Constant(value='- worker target: '),\n op=Add(),\n right=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='worker_target'),\n Constant(value='')])]))],\n ctx=Load())),\n Return(\n value=Call(\n func=Attribute(\n value=Constant(value='\\n'),\n attr='join',\n ctx=Load()),\n args=[\n Name(id='lines', ctx=Load())]))])\nSUPERVISOR_FUNC_3_AST_END\nSUPERVISOR_FUNC_4_NAME=main\nSUPERVISOR_FUNC_4_LINENO=395\nSUPERVISOR_FUNC_4_ENDLINENO=515\nSUPERVISOR_FUNC_4_NAMES=append,argv,edge_mail,facts,gather,get,join,len,log,mail_sent,mode,old,old_status,print,problems,read_state,render_body,status,stderr,subject,sys,write_health,write_state\nSUPERVISOR_FUNC_4_AST_BEGIN\nFunctionDef(\n name='main',\n args=arguments(),\n body=[\n Assign(\n targets=[\n Name(id='mode', ctx=Store())],\n value=IfExp(\n test=Compare(\n left=Call(\n func=Name(id='len', ctx=Load()),\n args=[\n Attribute(\n value=Name(id='sys', ctx=Load()),\n attr='argv',\n ctx=Load())]),\n ops=[\n Gt()],\n comparators=[\n Constant(value=1)]),\n body=Subscript(\n value=Attribute(\n value=Name(id='sys', ctx=Load()),\n attr='argv',\n ctx=Load()),\n slice=Constant(value=1),\n ctx=Load()),\n orelse=Constant(value='check'))),\n If(\n test=Compare(\n left=Name(id='mode', ctx=Load()),\n ops=[\n NotIn()],\n comparators=[\n Tuple(\n elts=[\n Constant(value='check'),\n Constant(value='test')],\n ctx=Load())]),\n body=[\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n Constant(value='usage: skladchik-reports-monitor-supervisor [check|test]')],\n keywords=[\n keyword(\n arg='file',\n value=Attribute(\n value=Name(id='sys', ctx=Load()),\n attr='stderr',\n ctx=Load()))])),\n Return(\n value=Constant(value=2))]),\n Assign(\n targets=[\n Tuple(\n elts=[\n Name(id='facts', ctx=Store()),\n Name(id='problems', ctx=Store())],\n ctx=Store())],\n value=Call(\n func=Name(id='gather', ctx=Load()))),\n Assign(\n targets=[\n Name(id='status', ctx=Store())],\n value=IfExp(\n test=UnaryOp(\n op=Not(),\n operand=Name(id='problems', ctx=Load())),\n body=Constant(value='OK'),\n orelse=Constant(value='FAIL'))),\n If(\n test=Compare(\n left=Name(id='mode', ctx=Load()),\n ops=[\n Eq()],\n comparators=[\n Constant(value='test')]),\n body=[\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n JoinedStr(\n values=[\n Constant(value='SUPERVISOR_STATUS='),\n FormattedValue(\n value=Name(id='status', ctx=Load()),\n conversion=-1)])])),\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n BinOp(\n left=Constant(value='SUPERVISOR_PROBLEMS='),\n op=Add(),\n right=IfExp(\n test=Name(id='problems', ctx=Load()),\n body=Call(\n func=Attribute(\n value=Constant(value=','),\n attr='join',\n ctx=Load()),\n args=[\n Name(id='problems', ctx=Load())]),\n orelse=Constant(value='none')))])),\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n JoinedStr(\n values=[\n Constant(value='MONITOR='),\n FormattedValue(\n value=Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='monitor_status')]),\n conversion=-1),\n Constant(value=' reports='),\n FormattedValue(\n value=Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='monitor_reports')]),\n conversion=-1),\n Constant(value=' open='),\n FormattedValue(\n value=Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='monitor_open')]),\n conversion=-1),\n Constant(value=' resolved='),\n FormattedValue(\n value=Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='monitor_resolved')]),\n conversion=-1)])])),\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n JoinedStr(\n values=[\n Constant(value='CANONICAL_BACKUP='),\n FormattedValue(\n value=Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='canonical_backup_decision')]),\n conversion=-1),\n Constant(value=' generation='),\n FormattedValue(\n value=Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='canonical_backup_generation')]),\n conversion=-1)])])),\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n JoinedStr(\n values=[\n Constant(value='REGISTRY_SOURCE='),\n FormattedValue(\n value=Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='registry_source')]),\n conversion=-1)])])),\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n JoinedStr(\n values=[\n Constant(value='WORKER_TARGET='),\n FormattedValue(\n value=Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='worker_target')]),\n conversion=-1)])])),\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n JoinedStr(\n values=[\n Constant(value='NETBIRD_ROUTE='),\n FormattedValue(\n value=Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='netbird_route')]),\n conversion=-1)])])),\n Return(\n value=IfExp(\n test=Compare(\n left=Name(id='status', ctx=Load()),\n ops=[\n Eq()],\n comparators=[\n Constant(value='OK')]),\n body=Constant(value=0),\n orelse=Constant(value=1)))]),\n Assign(\n targets=[\n Name(id='old', ctx=Store())],\n value=Call(\n func=Name(id='read_state', ctx=Load()))),\n Assign(\n targets=[\n Name(id='old_status', ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='old', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='LAST_STATUS'),\n Constant(value='')])),\n Assign(\n targets=[\n Name(id='mail_sent', ctx=Store())],\n value=Constant(value=False)),\n If(\n test=BoolOp(\n op=And(),\n values=[\n Compare(\n left=Name(id='status', ctx=Load()),\n ops=[\n NotEq()],\n comparators=[\n Constant(value='OK')]),\n Compare(\n left=Name(id='old_status', ctx=Load()),\n ops=[\n NotEq()],\n comparators=[\n Constant(value='FAIL')])]),\n body=[\n Assign(\n targets=[\n Name(id='subject', ctx=Store())],\n value=Constant(value='[Складчик] ТРЕВОГА: мониторинг жалоб')),\n Assign(\n targets=[\n Name(id='mail_sent', ctx=Store())],\n value=Call(\n func=Name(id='edge_mail', ctx=Load()),\n args=[\n Name(id='subject', ctx=Load()),\n Call(\n func=Name(id='render_body', ctx=Load()),\n args=[\n Name(id='status', ctx=Load()),\n Name(id='facts', ctx=Load()),\n Name(id='problems', ctx=Load()),\n Name(id='mode', ctx=Load())])])),\n If(\n test=UnaryOp(\n op=Not(),\n operand=Name(id='mail_sent', ctx=Load())),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='supervisor_mail_send_failed')])),\n Assign(\n targets=[\n Name(id='status', ctx=Store())],\n value=Constant(value='FAIL'))])],\n orelse=[\n If(\n test=BoolOp(\n op=And(),\n values=[\n Compare(\n left=Name(id='status', ctx=Load()),\n ops=[\n Eq()],\n comparators=[\n Constant(value='OK')]),\n Compare(\n left=Name(id='old_status', ctx=Load()),\n ops=[\n Eq()],\n comparators=[\n Constant(value='FAIL')])]),\n body=[\n Assign(\n targets=[\n Name(id='subject', ctx=Store())],\n value=Constant(value='[Складчик] ВОССТАНОВЛЕНО: мониторинг жалоб и backup снова OK')),\n Assign(\n targets=[\n Name(id='mail_sent', ctx=Store())],\n value=Call(\n func=Name(id='edge_mail', ctx=Load()),\n args=[\n Name(id='subject', ctx=Load()),\n Call(\n func=Name(id='render_body', ctx=Load()),\n args=[\n Name(id='status', ctx=Load()),\n Name(id='facts', ctx=Load()),\n Name(id='problems', ctx=Load()),\n Name(id='mode', ctx=Load())])])),\n If(\n test=UnaryOp(\n op=Not(),\n operand=Name(id='mail_sent', ctx=Load())),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='supervisor_mail_send_failed')])),\n Assign(\n targets=[\n Name(id='status', ctx=Store())],\n value=Constant(value='FAIL'))])])]),\n Expr(\n value=Call(\n func=Name(id='write_health', ctx=Load()),\n args=[\n Name(id='status', ctx=Load()),\n Name(id='facts', ctx=Load()),\n Name(id='problems', ctx=Load()),\n Name(id='mail_sent', ctx=Load())])),\n Expr(\n value=Call(\n func=Name(id='write_state', ctx=Load()),\n args=[\n Name(id='status', ctx=Load()),\n Name(id='problems', ctx=Load())])),\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n JoinedStr(\n values=[\n Constant(value='SUPERVISOR_STATUS='),\n FormattedValue(\n value=Name(id='status', ctx=Load()),\n conversion=-1)])])),\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n JoinedStr(\n values=[\n Constant(value='SUPERVISOR_MAIL_SENT='),\n FormattedValue(\n value=IfExp(\n test=Name(id='mail_sent', ctx=Load()),\n body=Constant(value='yes'),\n orelse=Constant(value='no')),\n conversion=-1)])])),\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n BinOp(\n left=Constant(value='SUPERVISOR_PROBLEMS='),\n op=Add(),\n right=IfExp(\n test=Name(id='problems', ctx=Load()),\n body=Call(\n func=Attribute(\n value=Constant(value=','),\n attr='join',\n ctx=Load()),\n args=[\n Name(id='problems', ctx=Load())]),\n orelse=Constant(value='none')))])),\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n JoinedStr(\n values=[\n Constant(value='MONITOR='),\n FormattedValue(\n value=Call(\n \n\nSUPERVISOR_FUNC_4_AST_END\nBACKUP_AUDIT_PRESENT=true\nBACKUP_AUDIT_SHA=1c2cd8a00859492c010ed35baf5eb67f4278544809de8c2563421a6f3e356ed3\nBACKUP_AUDIT_BASENAME=homelab-backup-audit\nBACKUP_AUDIT_AST_OK=true\nBACKUP_AUDIT_FUNCTION_COUNT=7\nBACKUP_AUDIT_FUNCTIONS=run,collect,parse_epoch,latest_legacy,unit_ok,parse_app_plan,expected_v2_heavy_lock_owner\nBACKUP_AUDIT_CLI_OPTION_COUNT=0\nBACKUP_AUDIT_CLI_OPTIONS=NONE\nBACKUP_AUDIT_ENV_NAME_COUNT=0\nBACKUP_AUDIT_ENV_NAMES=NONE\nBACKUP_AUDIT_RELEVANT_FUNCTION_COUNT=4\nBACKUP_AUDIT_FUNC_1_NAME=collect\nBACKUP_AUDIT_FUNC_1_LINENO=34\nBACKUP_AUDIT_FUNC_1_ENDLINENO=39\nBACKUP_AUDIT_FUNC_1_NAMES=append,collect,dict,get,isinstance,list,obj,out,str,v,values\nBACKUP_AUDIT_FUNC_1_AST_BEGIN\nFunctionDef(\n name='collect',\n args=arguments(\n args=[\n arg(arg='obj'),\n arg(arg='out')]),\n body=[\n If(\n test=Call(\n func=Name(id='isinstance', ctx=Load()),\n args=[\n Name(id='obj', ctx=Load()),\n Name(id='dict', ctx=Load())]),\n body=[\n If(\n test=Call(\n func=Name(id='isinstance', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='obj', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='logical_id')]),\n Name(id='str', ctx=Load())]),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='out', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Name(id='obj', ctx=Load())]))]),\n For(\n target=Name(id='v', ctx=Store()),\n iter=Call(\n func=Attribute(\n value=Name(id='obj', ctx=Load()),\n attr='values',\n ctx=Load())),\n body=[\n Expr(\n value=Call(\n func=Name(id='collect', ctx=Load()),\n args=[\n Name(id='v', ctx=Load()),\n Name(id='out', ctx=Load())]))])],\n orelse=[\n If(\n test=Call(\n func=Name(id='isinstance', ctx=Load()),\n args=[\n Name(id='obj', ctx=Load()),\n Name(id='list', ctx=Load())]),\n body=[\n For(\n target=Name(id='v', ctx=Store()),\n iter=Name(id='obj', ctx=Load()),\n body=[\n Expr(\n value=Call(\n func=Name(id='collect', ctx=Load()),\n args=[\n Name(id='v', ctx=Load()),\n Name(id='out', ctx=Load())]))])])])])\nBACKUP_AUDIT_FUNC_1_AST_END\nBACKUP_AUDIT_FUNC_2_NAME=latest_legacy\nBACKUP_AUDIT_FUNC_2_LINENO=53\nBACKUP_AUDIT_FUNC_2_ENDLINENO=77\nBACKUP_AUDIT_FUNC_2_NAMES=APPREST,Exception,QROOT,VMREST,age,best,best_epoch,d,epoch,gen,get,glob,int,is_dir,is_file,json,kind,loads,logical,max,obj,p,parse_epoch,read_text,restore,rev,rj,rroot,score,st_mtime,stat,str,strict,time\nBACKUP_AUDIT_FUNC_2_AST_BEGIN\nFunctionDef(\n name='latest_legacy',\n args=arguments(\n args=[\n arg(arg='logical'),\n arg(arg='kind')]),\n body=[\n Assign(\n targets=[\n Name(id='d', ctx=Store())],\n value=BinOp(\n left=Name(id='QROOT', ctx=Load()),\n op=Div(),\n right=Name(id='logical', ctx=Load()))),\n Assign(\n targets=[\n Name(id='best', ctx=Store())],\n value=Constant(value=None)),\n Assign(\n targets=[\n Name(id='best_epoch', ctx=Store())],\n value=UnaryOp(\n op=USub(),\n operand=Constant(value=1))),\n If(\n test=UnaryOp(\n op=Not(),\n operand=Call(\n func=Attribute(\n value=Name(id='d', ctx=Load()),\n attr='is_dir',\n ctx=Load()))),\n body=[\n Return(\n value=Constant(value=None))]),\n For(\n target=Name(id='p', ctx=Store()),\n iter=Call(\n func=Attribute(\n value=Name(id='d', ctx=Load()),\n attr='glob',\n ctx=Load()),\n args=[\n Constant(value='*.json')]),\n body=[\n Try(\n body=[\n Assign(\n targets=[\n Name(id='obj', ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='json', ctx=Load()),\n attr='loads',\n ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='p', ctx=Load()),\n attr='read_text',\n ctx=Load()),\n keywords=[\n keyword(\n arg='encoding',\n value=Constant(value='utf-8'))])]))],\n handlers=[\n ExceptHandler(\n type=Name(id='Exception', ctx=Load()),\n body=[\n Continue()])]),\n Assign(\n targets=[\n Name(id='epoch', ctx=Store())],\n value=Call(\n func=Name(id='parse_epoch', ctx=Load()),\n args=[\n Name(id='obj', ctx=Load())])),\n Assign(\n targets=[\n Name(id='score', ctx=Store())],\n value=IfExp(\n test=Compare(\n left=Name(id='epoch', ctx=Load()),\n ops=[\n IsNot()],\n comparators=[\n Constant(value=None)]),\n body=Name(id='epoch', ctx=Load()),\n orelse=Call(\n func=Name(id='int', ctx=Load()),\n args=[\n Attribute(\n value=Call(\n func=Attribute(\n value=Name(id='p', ctx=Load()),\n attr='stat',\n ctx=Load())),\n attr='st_mtime',\n ctx=Load())]))),\n If(\n test=Compare(\n left=Name(id='score', ctx=Load()),\n ops=[\n Gt()],\n comparators=[\n Name(id='best_epoch', ctx=Load())]),\n body=[\n Assign(\n targets=[\n Name(id='best_epoch', ctx=Store())],\n value=Name(id='score', ctx=Load())),\n Assign(\n targets=[\n Name(id='best', ctx=Store())],\n value=Tuple(\n elts=[\n Name(id='p', ctx=Load()),\n Name(id='obj', ctx=Load()),\n Name(id='score', ctx=Load())],\n ctx=Load()))])]),\n If(\n test=UnaryOp(\n op=Not(),\n operand=Name(id='best', ctx=Load())),\n body=[\n Return(\n value=Constant(value=None))]),\n Assign(\n targets=[\n Tuple(\n elts=[\n Name(id='p', ctx=Store()),\n Name(id='obj', ctx=Store()),\n Name(id='epoch', ctx=Store())],\n ctx=Store())],\n value=Name(id='best', ctx=Load())),\n Assign(\n targets=[\n Name(id='gen', ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='obj', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='generation')])),\n Assign(\n targets=[\n Name(id='strict', ctx=Store())],\n value=BoolOp(\n op=And(),\n values=[\n Compare(\n left=Call(\n func=Attribute(\n value=Name(id='obj', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='status')]),\n ops=[\n Eq()],\n comparators=[\n Constant(value='SEALED')]),\n Compare(\n left=Call(\n func=Attribute(\n value=Name(id='obj', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='cloud_quorum')]),\n ops=[\n Eq()],\n comparators=[\n Constant(value=2)]),\n Compare(\n left=Call(\n func=Attribute(\n value=Name(id='obj', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='cloud_a_verified')]),\n ops=[\n Is()],\n comparators=[\n Constant(value=True)]),\n Compare(\n left=Call(\n func=Attribute(\n value=Name(id='obj', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='cloud_b_verified')]),\n ops=[\n Is()],\n comparators=[\n Constant(value=True)]),\n Compare(\n left=Call(\n func=Attribute(\n value=Name(id='obj', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='part_hashes_verified')]),\n ops=[\n Is()],\n comparators=[\n Constant(value=True)]),\n Compare(\n left=Call(\n func=Attribute(\n value=Name(id='obj', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='seal_written')]),\n ops=[\n Is()],\n comparators=[\n Constant(value=True)]),\n Compare(\n left=Call(\n func=Attribute(\n value=Name(id='obj', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='local_payload_present')]),\n ops=[\n Is()],\n comparators=[\n Constant(value=False)]),\n Compare(\n left=Call(\n func=Attribute(\n value=Name(id='obj', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='local_cleanup')]),\n ops=[\n Eq()],\n comparators=[\n Constant(value='OK')])])),\n Assign(\n targets=[\n Name(id='rroot', ctx=Store())],\n value=IfExp(\n test=Compare(\n left=Name(id='kind', ctx=Load()),\n ops=[\n Eq()],\n comparators=[\n Constant(value='VM')]),\n body=Name(id='VMREST', ctx=Load()),\n orelse=Name(id='APPREST', ctx=Load()))),\n Assign(\n targets=[\n Name(id='rev', ctx=Store())],\n value=IfExp(\n test=Name(id='gen', ctx=Load()),\n body=BinOp(\n left=BinOp(\n left=Name(id='rroot', ctx=Load()),\n op=Div(),\n right=Name(id='logical', ctx=Load())),\n op=Div(),\n right=BinOp(\n left=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Name(id='gen', ctx=Load())]),\n op=Add(),\n right=Constant(value='.json'))),\n orelse=Constant(value=None))),\n Assign(\n targets=[\n Name(id='restore', ctx=Store())],\n value=Constant(value=False)),\n If(\n test=BoolOp(\n op=And(),\n values=[\n Name(id='rev', ctx=Load()),\n Call(\n func=Attribute(\n value=Name(id='rev', ctx=Load()),\n attr='is_file',\n ctx=Load()))]),\n body=[\n Try(\n body=[\n Assign(\n targets=[\n Name(id='rj', ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='json', ctx=Load()),\n attr='loads',\n ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='rev', ctx=Load()),\n attr='read_text',\n ctx=Load()),\n keywords=[\n keyword(\n arg='encoding',\n value=Constant(value='utf-8'))])])),\n Assign(\n targets=[\n Name(id='restore', ctx=Store())],\n value=Compare(\n left=Call(\n func=Attribute(\n value=Name(id='rj', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='result')]),\n ops=[\n Eq()],\n comparators=[\n Constant(value='OK')]))],\n handlers=[\n ExceptHandler(\n type=Name(id='Exception', ctx=Load()),\n body=[\n Pass()])])]),\n Assign(\n targets=[\n Name(id='age', ctx=Store())],\n value=IfExp(\n test=Name(id='epoch', ctx=Load()),\n body=Call(\n func=Name(id='max', ctx=Load()),\n args=[\n Constant(value=0),\n Call(\n func=Name(id='int', ctx=Load()),\n args=[\n BinOp(\n left=Call(\n func=Attribute(\n value=Name(id='time', ctx=Load()),\n attr='time',\n ctx=Load())),\n op=Sub(),\n right=Name(id='epoch', ctx=Load()))])]),\n orelse=Constant(value=None))),\n Return(\n value=Dict(\n keys=[\n Constant(value='generation'),\n Constant(value='strict'),\n Constant(value='restore_ok'),\n Constant(value='age_seconds'),\n Constant(value='state_file'),\n Constant(value='obj')],\n values=[\n Name(id='gen', ctx=Load()),\n Name(id='strict', ctx=Load()),\n Name(id='restore', ctx=Load()),\n Name(id='age', ctx=Load()),\n Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Name(id='p', ctx=Load())]),\n Name(id='obj', ctx=Load())]))])\nBACKUP_AUDIT_FUNC_2_AST_END\nBACKUP_AUDIT_FUNC_3_NAME=parse_app_plan\nBACKUP_AUDIT_FUNC_3_LINENO=84\nBACKUP_AUDIT_FUNC_3_ENDLINENO=93\nBACKUP_AUDIT_FUNC_3_NAMES=d,get,k,line,r,split,splitlines,startswith,tok,txt,v\nBACKUP_AUDIT_FUNC_3_AST_BEGIN\nFunctionDef(\n name='parse_app_plan',\n args=arguments(\n args=[\n arg(arg='txt')]),\n body=[\n Assign(\n targets=[\n Name(id='d', ctx=Store())],\n value=Dict()),\n For(\n target=Name(id='line', ctx=Store()),\n iter=Call(\n func=Attribute(\n value=Name(id='txt', ctx=Load()),\n attr='splitlines',\n ctx=Load())),\n body=[\n If(\n test=Call(\n func=Attribute(\n value=Name(id='line', ctx=Load()),\n attr='startswith',\n ctx=Load()),\n args=[\n Constant(value='QUEUE_FRESHNESS_PLAN APP=')]),\n body=[\n Assign(\n targets=[\n Name(id='r', ctx=Store())],\n value=Dict()),\n For(\n target=Name(id='tok', ctx=Store()),\n iter=Subscript(\n value=Call(\n func=Attribute(\n value=Name(id='line', ctx=Load()),\n attr='split',\n ctx=Load())),\n slice=Slice(\n lower=Constant(value=1)),\n ctx=Load()),\n body=[\n If(\n test=Compare(\n left=Constant(value='='),\n ops=[\n In()],\n comparators=[\n Name(id='tok', ctx=Load())]),\n body=[\n Assign(\n targets=[\n Tuple(\n elts=[\n Name(id='k', ctx=Store()),\n Name(id='v', ctx=Store())],\n ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='tok', ctx=Load()),\n attr='split',\n ctx=Load()),\n args=[\n Constant(value='='),\n Constant(value=1)])),\n Assign(\n targets=[\n Subscript(\n value=Name(id='r', ctx=Load()),\n slice=Name(id='k', ctx=Load()),\n ctx=Store())],\n value=Name(id='v', ctx=Load()))])]),\n If(\n test=Call(\n func=Attribute(\n value=Name(id='r', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='APP')]),\n body=[\n Assign(\n targets=[\n Subscript(\n value=Name(id='d', ctx=Load()),\n slice=Subscript(\n value=Name(id='r', ctx=Load()),\n slice=Constant(value='APP'),\n ctx=Load()),\n ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='r', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='DECISION')]))])])]),\n Return(\n value=Name(id='d', ctx=Load()))])\nBACKUP_AUDIT_FUNC_3_AST_END\nBACKUP_AUDIT_FUNC_4_NAME=expected_v2_heavy_lock_owner\nBACKUP_AUDIT_FUNC_4_LINENO=188\nBACKUP_AUDIT_FUNC_4_ENDLINENO=200\nBACKUP_AUDIT_FUNC_4_NAMES=Exception,_,a,add,arc,fe,fo,frc,int,isdigit,owners,pid,pid_text,prc,replace,run,set,split,strip,tok\nBACKUP_AUDIT_FUNC_4_AST_BEGIN\nFunctionDef(\n name='expected_v2_heavy_lock_owner',\n args=arguments(),\n body=[\n Assign(\n targets=[\n Tuple(\n elts=[\n Name(id='arc', ctx=Store()),\n Name(id='a', ctx=Store()),\n Name(id='_', ctx=Store())],\n ctx=Store())],\n value=Call(\n func=Name(id='run', ctx=Load()),\n args=[\n List(\n elts=[\n Constant(value='systemctl'),\n Constant(value='show'),\n Constant(value='homelab-backup-v2.service'),\n Constant(value='-p'),\n Constant(value='ActiveState'),\n Constant(value='--value')],\n ctx=Load()),\n Constant(value=10)])),\n Assign(\n targets=[\n Tuple(\n elts=[\n Name(id='prc', ctx=Store()),\n Name(id='pid_text', ctx=Store()),\n Name(id='_', ctx=Store())],\n ctx=Store())],\n value=Call(\n func=Name(id='run', ctx=Load()),\n args=[\n List(\n elts=[\n Constant(value='systemctl'),\n Constant(value='show'),\n Constant(value='homelab-backup-v2.service'),\n Constant(value='-p'),\n Constant(value='MainPID'),\n Constant(value='--value')],\n ctx=Load()),\n Constant(value=10)])),\n If(\n test=BoolOp(\n op=Or(),\n values=[\n Compare(\n left=Name(id='arc', ctx=Load()),\n ops=[\n NotEq()],\n comparators=[\n Constant(value=0)]),\n Compare(\n left=Name(id='prc', ctx=Load()),\n ops=[\n NotEq()],\n comparators=[\n Constant(value=0)]),\n Compare(\n left=Call(\n func=Attribute(\n value=Name(id='a', ctx=Load()),\n attr='strip',\n ctx=Load())),\n ops=[\n NotIn()],\n comparators=[\n Tuple(\n elts=[\n Constant(value='active'),\n Constant(value='activating')],\n ctx=Load())])]),\n body=[\n Return(\n value=Constant(value=False))]),\n Try(\n body=[\n Assign(\n targets=[\n Name(id='pid', ctx=Store())],\n value=Call(\n func=Name(id='int', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='pid_text', ctx=Load()),\n attr='strip',\n ctx=Load()))]))],\n handlers=[\n ExceptHandler(\n type=Name(id='Exception', ctx=Load()),\n body=[\n Return(\n value=Constant(value=False))])]),\n If(\n test=Compare(\n left=Name(id='pid', ctx=Load()),\n ops=[\n LtE()],\n comparators=[\n Constant(value=0)]),\n body=[\n Return(\n value=Constant(value=False))]),\n Assign(\n targets=[\n Tuple(\n elts=[\n Name(id='frc', ctx=Store()),\n Name(id='fo', ctx=Store()),\n Name(id='fe', ctx=Store())],\n ctx=Store())],\n value=Call(\n func=Name(id='run', ctx=Load()),\n args=[\n List(\n elts=[\n Constant(value='fuser'),\n Constant(value='/run/homelab-backup-heavy.lock')],\n ctx=Load()),\n Constant(value=10)])),\n Assign(\n targets=[\n Name(id='owners', ctx=Store())],\n value=Call(\n func=Name(id='set', ctx=Load()))),\n For(\n target=Name(id='tok', ctx=Store()),\n iter=Call(\n func=Attribute(\n value=Call(\n func=Attribute(\n value=BinOp(\n left=BinOp(\n left=Name(id='fo', ctx=Load()),\n op=Add(),\n right=Constant(value=' ')),\n op=Add(),\n right=Name(id='fe', ctx=Load())),\n attr='replace',\n ctx=Load()),\n args=[\n Constant(value=':'),\n Constant(value=' ')]),\n attr='split',\n ctx=Load())),\n body=[\n If(\n test=Call(\n func=Attribute(\n value=Name(id='tok', ctx=Load()),\n attr='isdigit',\n ctx=Load())),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='owners', ctx=Load()),\n attr='add',\n ctx=Load()),\n args=[\n Call(\n func=Name(id='int', ctx=Load()),\n args=[\n Name(id='tok', ctx=Load())])]))])]),\n Return(\n value=BoolOp(\n op=And(),\n values=[\n Compare(\n left=Name(id='frc', ctx=Load()),\n ops=[\n Eq()],\n comparators=[\n Constant(value=0)]),\n Compare(\n left=Name(id='owners', ctx=Load()),\n ops=[\n Eq()],\n comparators=[\n Set(\n elts=[\n Name(id='pid', ctx=Load())])])]))])\nBACKUP_AUDIT_FUNC_4_AST_END\nQUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_PRESENT=true\nQUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_SHA=1f959049cca2710a2cb820cc1f6acab16399c6b6711b9e4522e0ecd49e0e4650\nQUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_BASENAME=homelab-app-cloud-quorum-queue\nQUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_AST_OK=false\nQUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_AST_ERROR=SyntaxError\nQUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_HELP_RC=64\nQUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_HELP_SHA=53bc0423b5ea9142a7be1f687f1572975bc52349a1fd28f97d6c0748b2b445e1\nQUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_HELP_BEGIN\n\nAPP_QUORUM_QUEUE_ERROR=ACTION_INVALID\nQUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_HELP_END\nPRODUCER_SCRIPT_COUNT=3\nPRODUCER_UNIT_COUNT=4\nPRODUCER_UNIT_1_NAME=homelab-app-cloud-quorum-queue.service\nPRODUCER_UNIT_1_SHOW_RC=0\nPRODUCER_UNIT_1_LOADSTATE=loaded\nPRODUCER_UNIT_1_ACTIVESTATE=inactive\nPRODUCER_UNIT_1_UNITFILESTATE=static\nPRODUCER_UNIT_1_RESULT=success\nPRODUCER_UNIT_1_EXECMAINSTATUS=0\nPRODUCER_UNIT_1_FRAGMENT_BASENAME=homelab-app-cloud-quorum-queue.service\nPRODUCER_UNIT_1_FRAGMENT_SHA=afaa997bd85dafdb29d2cd2b53527996171c21fd5e80ae559f8f2bee0dcbbf1a\nPRODUCER_UNIT_1_EXECSTART_SHA=22094bb14d8dc5f7399744e183b096583a9c9625527a2f00981f2ec5cd8e1713\nPRODUCER_UNIT_1_EXEC_COMPONENTS=NONE\nPRODUCER_UNIT_1_ENVFILES_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nPRODUCER_UNIT_2_NAME=homelab-app-cloud-quorum-queue.timer\nPRODUCER_UNIT_2_SHOW_RC=0\nPRODUCER_UNIT_2_LOADSTATE=loaded\nPRODUCER_UNIT_2_ACTIVESTATE=active\nPRODUCER_UNIT_2_UNITFILESTATE=enabled\nPRODUCER_UNIT_2_RESULT=success\nPRODUCER_UNIT_2_EXECMAINSTATUS=\nPRODUCER_UNIT_2_FRAGMENT_BASENAME=homelab-app-cloud-quorum-queue.timer\nPRODUCER_UNIT_2_FRAGMENT_SHA=af2eedce3df53029b591d31715a3f3e6688ddb997b4823f487e70c339ce88078\nPRODUCER_UNIT_2_EXECSTART_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nPRODUCER_UNIT_2_EXEC_COMPONENTS=NONE\nPRODUCER_UNIT_2_ENVFILES_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nPRODUCER_UNIT_3_NAME=skladchik-reports-monitor-supervisor.service\nPRODUCER_UNIT_3_SHOW_RC=0\nPRODUCER_UNIT_3_LOADSTATE=loaded\nPRODUCER_UNIT_3_ACTIVESTATE=inactive\nPRODUCER_UNIT_3_UNITFILESTATE=static\nPRODUCER_UNIT_3_RESULT=success\nPRODUCER_UNIT_3_EXECMAINSTATUS=0\nPRODUCER_UNIT_3_FRAGMENT_BASENAME=skladchik-reports-monitor-supervisor.service\nPRODUCER_UNIT_3_FRAGMENT_SHA=e874fb03573b76181f3eb812c7285848e60705923c172a2f102504a7b9100ef7\nPRODUCER_UNIT_3_EXECSTART_SHA=27a2477643cbfc4f8676fd88ebc5cff23e471bc80f89094941123fa62e3edc5f\nPRODUCER_UNIT_3_EXEC_COMPONENTS=skladchik-reports-monitor-supervisor\nPRODUCER_UNIT_3_ENVFILES_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nPRODUCER_UNIT_4_NAME=skladchik-reports-monitor-supervisor.timer\nPRODUCER_UNIT_4_SHOW_RC=0\nPRODUCER_UNIT_4_LOADSTATE=loaded\nPRODUCER_UNIT_4_ACTIVESTATE=active\nPRODUCER_UNIT_4_UNITFILESTATE=enabled\nPRODUCER_UNIT_4_RESULT=success\nPRODUCER_UNIT_4_EXECMAINSTATUS=\nPRODUCER_UNIT_4_FRAGMENT_BASENAME=skladchik-reports-monitor-supervisor.timer\nPRODUCER_UNIT_4_FRAGMENT_SHA=3c3e38a40b3dfbfaa77d99a1c2bea4b58009130eac7a5197356dead1137a5ef6\nPRODUCER_UNIT_4_EXECSTART_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nPRODUCER_UNIT_4_EXEC_COMPONENTS=NONE\nPRODUCER_UNIT_4_ENVFILES_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nAPPID_CONFIG_MATCH_COUNT=565\nAPPID_CONFIG_1_BASENAME=targets.json\nAPPID_CONFIG_1_PATH_HINT=//etc/homelab-backup/targets.json\nAPPID_CONFIG_1_SHA=2f526330152d49461ff66f50adab57d1a195ea5d1b4c292945d523411b8a68a8\nAPPID_CONFIG_1_LINE_NOS=115\nAPPID_CONFIG_2_BASENAME=targets.json.before-skladchik-core-apps-20261003T205612Z.bak\nAPPID_CONFIG_2_PATH_HINT=//etc/homelab-backup/targets.json.before-skladchik-core-apps-20261003T205612Z.bak\nAPPID_CONFIG_2_SHA=6ecf034ca03b52a1e6beceeae81d86a623885462c095d50b133aea4048a4626e\nAPPID_CONFIG_2_LINE_NOS=115\nAPPID_CONFIG_3_BASENAME=task.json\nAPPID_CONFIG_3_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T192441Z-1666483-preflight/task.json\nAPPID_CONFIG_3_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb\nAPPID_CONFIG_3_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_4_BASENAME=task.json\nAPPID_CONFIG_4_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T192627Z-1668009-prepare/task.json\nAPPID_CONFIG_4_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb\nAPPID_CONFIG_4_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_5_BASENAME=task.json\nAPPID_CONFIG_5_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T192843Z-1681558-dry-run/task.json\nAPPID_CONFIG_5_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb\nAPPID_CONFIG_5_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_6_BASENAME=task.json\nAPPID_CONFIG_6_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T193210Z-1692269-apply/task.json\nAPPID_CONFIG_6_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb\nAPPID_CONFIG_6_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_7_BASENAME=task.json\nAPPID_CONFIG_7_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T193950Z-1722753-preflight/task.json\nAPPID_CONFIG_7_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb\nAPPID_CONFIG_7_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_8_BASENAME=task.json\nAPPID_CONFIG_8_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T193952Z-1722941-prepare/task.json\nAPPID_CONFIG_8_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb\nAPPID_CONFIG_8_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_9_BASENAME=task.json\nAPPID_CONFIG_9_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T193952Z-1723022-dry-run/task.json\nAPPID_CONFIG_9_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb\nAPPID_CONFIG_9_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_10_BASENAME=task.json\nAPPID_CONFIG_10_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T194508Z-1738655-apply/task.json\nAPPID_CONFIG_10_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb\nAPPID_CONFIG_10_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_11_BASENAME=task.json\nAPPID_CONFIG_11_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T200841Z-1818714-preflight/task.json\nAPPID_CONFIG_11_SHA=8741a7407c135ebe5303056da44186d280b410efbca3714054a990d0f0340aec\nAPPID_CONFIG_11_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_12_BASENAME=task.json\nAPPID_CONFIG_12_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T200843Z-1818903-prepare/task.json\nAPPID_CONFIG_12_SHA=8741a7407c135ebe5303056da44186d280b410efbca3714054a990d0f0340aec\nAPPID_CONFIG_12_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_13_BASENAME=task.json\nAPPID_CONFIG_13_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T200843Z-1818980-dry-run/task.json\nAPPID_CONFIG_13_SHA=8741a7407c135ebe5303056da44186d280b410efbca3714054a990d0f0340aec\nAPPID_CONFIG_13_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_14_BASENAME=task.json\nAPPID_CONFIG_14_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T201139Z-1833098-apply/task.json\nAPPID_CONFIG_14_SHA=8741a7407c135ebe5303056da44186d280b410efbca3714054a990d0f0340aec\nAPPID_CONFIG_14_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_15_BASENAME=task.json\nAPPID_CONFIG_15_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T201939Z-1860663-preflight/task.json\nAPPID_CONFIG_15_SHA=c121d768f5aaf7dc111cf176f890bbd7508650813760b99ed97aa19613c94e68\nAPPID_CONFIG_15_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_16_BASENAME=task.json\nAPPID_CONFIG_16_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T201941Z-1860857-prepare/task.json\nAPPID_CONFIG_16_SHA=c121d768f5aaf7dc111cf176f890bbd7508650813760b99ed97aa19613c94e68\nAPPID_CONFIG_16_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_17_BASENAME=task.json\nAPPID_CONFIG_17_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T201941Z-1860933-dry-run/task.json\nAPPID_CONFIG_17_SHA=c121d768f5aaf7dc111cf176f890bbd7508650813760b99ed97aa19613c94e68\nAPPID_CONFIG_17_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_18_BASENAME=task.json\nAPPID_CONFIG_18_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T202241Z-1874939-apply/task.json\nAPPID_CONFIG_18_SHA=c121d768f5aaf7dc111cf176f890bbd7508650813760b99ed97aa19613c94e68\nAPPID_CONFIG_18_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_19_BASENAME=task.json\nAPPID_CONFIG_19_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T204310Z-1946040-preflight/task.json\nAPPID_CONFIG_19_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2\nAPPID_CONFIG_19_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_20_BASENAME=task.json\nAPPID_CONFIG_20_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T204311Z-1946265-prepare/task.json\nAPPID_CONFIG_20_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2\nAPPID_CONFIG_20_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_21_BASENAME=task.json\nAPPID_CONFIG_21_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T204311Z-1946345-dry-run/task.json\nAPPID_CONFIG_21_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2\nAPPID_CONFIG_21_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_22_BASENAME=task.json\nAPPID_CONFIG_22_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T204533Z-1956057-apply/task.json\nAPPID_CONFIG_22_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2\nAPPID_CONFIG_22_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_23_BASENAME=task.json\nAPPID_CONFIG_23_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T205721Z-1989628-preflight/task.json\nAPPID_CONFIG_23_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2\nAPPID_CONFIG_23_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_24_BASENAME=task.json\nAPPID_CONFIG_24_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T205722Z-1989815-prepare/task.json\nAPPID_CONFIG_24_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2\nAPPID_CONFIG_24_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_25_BASENAME=task.json\nAPPID_CONFIG_25_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T205722Z-1989891-dry-run/task.json\nAPPID_CONFIG_25_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2\nAPPID_CONFIG_25_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_26_BASENAME=stderr.log\nAPPID_CONFIG_26_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T210034Z-2011730-apply/stderr.log\nAPPID_CONFIG_26_SHA=bbc5b7b614a73219147a06614942e2c67176375af10bcb85aeac5565cb8c2532\nAPPID_CONFIG_26_LINE_NOS=7,8\nAPPID_CONFIG_27_BASENAME=stdout.log\nAPPID_CONFIG_27_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T210034Z-2011730-apply/stdout.log\nAPPID_CONFIG_27_SHA=cdf49d288d7b019b1a5f5099fe8b3e4f5ed1432294051a3c2020a4369c4afd41\nAPPID_CONFIG_27_LINE_NOS=24,31,32,35\nAPPID_CONFIG_28_BASENAME=task.json\nAPPID_CONFIG_28_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T210034Z-2011730-apply/task.json\nAPPID_CONFIG_28_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2\nAPPID_CONFIG_28_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_29_BASENAME=task.json\nAPPID_CONFIG_29_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T211239Z-2049968-preflight/task.json\nAPPID_CONFIG_29_SHA=4d850b025c6a9ad347015321775f9d0466149fb9d5a70212f91b6535adc3c0e3\nAPPID_CONFIG_29_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_30_BASENAME=task.json\nAPPID_CONFIG_30_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T213313Z-2127686-preflight/task.json\nAPPID_CONFIG_30_SHA=d98bdf83ab6a9fda0d864e3ccac4a0d01e7813fec9f1173a6d4d5e8712c8e238\nAPPID_CONFIG_30_LINE_NOS=44,55,56,81,86\nGEN_JOURNAL_MATCH_COUNT=3\nGEN_JOURNAL_1_UNIT=skladchik-reports-monitor-supervisor.service\nGEN_JOURNAL_1_IDENT=skladchik-reports-monitor-supervisor\nGEN_JOURNAL_1_EXE_BASENAME=python3.13\nGEN_JOURNAL_1_PID=932988\nGEN_JOURNAL_1_MESSAGE_SHA=93a0f7b08cf701cc4f77f2d02c659932db4ca849640cbbe55327693c1e4365eb\nGEN_JOURNAL_1_FLAGS=generation,backup,sealed\nGEN_JOURNAL_2_UNIT=homelab-backup-audit.service\nGEN_JOURNAL_2_IDENT=homelab-backup-audit\nGEN_JOURNAL_2_EXE_BASENAME=python3.13\nGEN_JOURNAL_2_PID=966882\nGEN_JOURNAL_2_MESSAGE_SHA=c8c9e905543f63dbee767d26e1c1824c99e7a23094405dba984b18361a36527f\nGEN_JOURNAL_2_FLAGS=generation,fresh,skip_fresh\nGEN_JOURNAL_3_UNIT=skladchik-reports-monitor-supervisor.service\nGEN_JOURNAL_3_IDENT=skladchik-reports-monitor-supervisor\nGEN_JOURNAL_3_EXE_BASENAME=python3.13\nGEN_JOURNAL_3_PID=968339\nGEN_JOURNAL_3_MESSAGE_SHA=93a0f7b08cf701cc4f77f2d02c659932db4ca849640cbbe55327693c1e4365eb\nGEN_JOURNAL_3_FLAGS=generation,backup,sealed\nQUORUM_SCRIPT_READY=false\nQUORUM_UNIT_READY=true\nAPPID_CONFIG_READY=true\nBACKUP_PRODUCER_TOPOLOGY_READY=false\nMAIL_SENT_BY_COMMAND=false\nCHANGES_MADE=false\nROLLBACK_STARTED=false\nROLLBACK_RESTORED=null\nMUTATION_OUTCOME=NO_MUTATION\nDECISION=HOLD_BACKUP_PRODUCER_RCA\nNEXT_GATE=BACKUP_PRODUCER_RECONCILE\nTASK_RESULT=SKLADCHIK_DURABILITY_BACKUP_PRODUCER_RCA\n" +} diff --git a/runtime/history/SUPPORT-261005-SKLADCHIK-DURABILITY-BACKUP-PRODUCER-RCA-99578R1.txt b/runtime/history/SUPPORT-261005-SKLADCHIK-DURABILITY-BACKUP-PRODUCER-RCA-99578R1.txt new file mode 100644 index 00000000..01211539 --- /dev/null +++ b/runtime/history/SUPPORT-261005-SKLADCHIK-DURABILITY-BACKUP-PRODUCER-RCA-99578R1.txt @@ -0,0 +1,2218 @@ +CHAT_OUTPUT_BEGIN +COMMAND_ID=SUPPORT-261005-SKLADCHIK-DURABILITY-BACKUP-PRODUCER-RCA-99578R1 +STATUS=FAIL +RC=43 +HOST=pve01 +MODE=read-only +COMPONENT=skladchik-durability-backup-producer-rca +REFERENCE_REGISTER_CHECK=OK +REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 +COMMAND_SHA256=6d4e000caabe0b4f15d31ba419f9633c5004c1b83d9c535098b8901ae634bb59 +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=43 +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=16ba01850d81f6abbd81c5322dfb90ebe83f2780ce7f91f057ae10bce56216b0 +SANITIZED_OUTPUT_SHA256=16ba01850d81f6abbd81c5322dfb90ebe83f2780ce7f91f057ae10bce56216b0 +OUTPUT_BEGIN +SKLADCHIK_DURABILITY_BACKUP_PRODUCER_RCA=V1 +NO_MAIL_SEND=true +NO_SERVICE_RESTART=true +NO_TIMER_MUTATION=true +NO_NETWORK_MUTATION=true +NO_SOURCE_MUTATION=true +NO_BACKUP_MUTATION=true +NO_GIT_PUSH=true +MODE=read-only +HOST_PVE01=true +PRODUCER_VM170_QM_RC=0 +PRODUCER_VM170_STDERR_PRESENT=false +PRODUCER_VM170_JSON=true +PRODUCER_VM170_GUEST_EXITCODE=0 +VM170_MONITOR_SHA=19123e359f2f7b9a2d373fd7e4464dd426d31b91cabc567c252e70cad40d77c8 +VM170_TIMER_ACTIVE=active +VM170_TIMER_ENABLED=enabled +VM170_SERVICE_RESULT=success +VM170_HEALTH_STATUS=OK\nVM170_HEALTH_TS=2026-10-05T06:43:23Z\nVM170_HEALTH_REPORTS=22\nVM170_HEALTH_OPEN=13\nVM170_HEALTH_RESOLVED=9\n +VM170_BASELINE_OK=false +SUPERVISOR_PRESENT=true +SUPERVISOR_SHA=3a9bf9f3f9c28dbf670300f0851a5b7f86eb41fa41cdf44d0935337ae8ef02a2 +SUPERVISOR_BASENAME=skladchik-reports-monitor-supervisor +SUPERVISOR_AST_OK=true +SUPERVISOR_FUNCTION_COUNT=16 +SUPERVISOR_FUNCTIONS=now,iso,log,run,parse_env_text,read_env_file,age_seconds_from_ts,ssh_edge,edge_mail,systemctl_props,gather,render_body,write_health,read_state,write_state,main +SUPERVISOR_CLI_OPTION_COUNT=0 +SUPERVISOR_CLI_OPTIONS=NONE +SUPERVISOR_ENV_NAME_COUNT=5 +SUPERVISOR_ENV_NAMES=SKLADCHIK_BACKUP_HEALTH_MAX_SECONDS,SKLADCHIK_COOKIE_EXPIRY_WARN_SECONDS,SKLADCHIK_EDGE,SKLADCHIK_MONITOR_HEALTH_MAX_SECONDS,SKLADCHIK_RESTORE_HEALTH_MAX_SECONDS +SUPERVISOR_RELEVANT_FUNCTION_COUNT=4 +SUPERVISOR_FUNC_1_NAME=parse_env_text +SUPERVISOR_FUNC_1_LINENO=51 +SUPERVISOR_FUNC_1_ENDLINENO=58 +SUPERVISOR_FUNC_1_NAMES=d,k,line,split,splitlines,startswith,strip,text,v +SUPERVISOR_FUNC_1_AST_BEGIN +FunctionDef( + name='parse_env_text', + args=arguments( + args=[ + arg(arg='text')]), + body=[ + Assign( + targets=[ + Name(id='d', ctx=Store())], + value=Dict()), + For( + target=Name(id='line', ctx=Store()), + iter=Call( + func=Attribute( + value=BoolOp( + op=Or(), + values=[ + Name(id='text', ctx=Load()), + Constant(value='')]), + attr='splitlines', + ctx=Load())), + body=[ + If( + test=BoolOp( + op=Or(), + values=[ + UnaryOp( + op=Not(), + operand=Name(id='line', ctx=Load())), + Call( + func=Attribute( + value=Name(id='line', ctx=Load()), + attr='startswith', + ctx=Load()), + args=[ + Constant(value='#')]), + Compare( + left=Constant(value='='), + ops=[ + NotIn()], + comparators=[ + Name(id='line', ctx=Load())])]), + body=[ + Continue()]), + Assign( + targets=[ + Tuple( + elts=[ + Name(id='k', ctx=Store()), + Name(id='v', ctx=Store())], + ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='line', ctx=Load()), + attr='split', + ctx=Load()), + args=[ + Constant(value='='), + Constant(value=1)])), + Assign( + targets=[ + Subscript( + value=Name(id='d', ctx=Load()), + slice=Call( + func=Attribute( + value=Name(id='k', ctx=Load()), + attr='strip', + ctx=Load())), + ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='v', ctx=Load()), + attr='strip', + ctx=Load())))]), + Return( + value=Name(id='d', ctx=Load()))]) +SUPERVISOR_FUNC_1_AST_END +SUPERVISOR_FUNC_2_NAME=gather +SUPERVISOR_FUNC_2_LINENO=110 +SUPERVISOR_FUNC_2_ENDLINENO=347 +SUPERVISOR_FUNC_2_NAMES=APP_FRESHNESS_PROBE,Exception,M,MONITOR_HEALTH_AGE_MAX,Path,S,age_seconds_from_ts,append,base,core_cmd,facts,files,get,group,health_age,int,items,k,local_units,m,mon,name,opened,out,p,parse_env_text,probe,probe_out,probe_rc,problems,props,quote,rc,re,read_text,reg_cmd,reg_out,reg_rc,registry_source,replace,reports,resolved,route,route_lines,run,search,section,shlex,splitlines,ssh_edge,startswith,str,strip,systemctl_props,timer_active,timer_enabled,timers_text,u,wm,worker_path,worker_target,worker_text +SUPERVISOR_FUNC_2_AST_BEGIN +FunctionDef( + name='gather', + args=arguments(), + body=[ + Assign( + targets=[ + Name(id='facts', ctx=Store())], + value=Dict()), + Assign( + targets=[ + Name(id='problems', ctx=Store())], + value=List(ctx=Load())), + Assign( + targets=[ + Name(id='core_cmd', ctx=Store())], + value=Constant(value='')), + Assign( + targets=[ + Tuple( + elts=[ + Name(id='rc', ctx=Store()), + Name(id='out', ctx=Store())], + ctx=Store())], + value=Call( + func=Name(id='ssh_edge', ctx=Load()), + args=[ + Name(id='core_cmd', ctx=Load())], + keywords=[ + keyword( + arg='timeout', + value=Constant(value=45))])), + Assign( + targets=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='core_ssh_rc'), + ctx=Store())], + value=Call( + func=Name(id='str', ctx=Load()), + args=[ + Name(id='rc', ctx=Load())])), + If( + test=Compare( + left=Name(id='rc', ctx=Load()), + ops=[ + NotEq()], + comparators=[ + Constant(value=0)]), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='core_ssh_failed')]))]), + FunctionDef( + name='section', + args=arguments( + args=[ + arg(arg='name')]), + body=[ + Assign( + targets=[ + Name(id='m', ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='re', ctx=Load()), + attr='search', + ctx=Load()), + args=[ + JoinedStr( + values=[ + Constant(value='__'), + FormattedValue( + value=Name(id='name', ctx=Load()), + conversion=-1), + Constant(value='_BEGIN__\\n(.*?)\\n__'), + FormattedValue( + value=Name(id='name', ctx=Load()), + conversion=-1), + Constant(value='_END__')]), + Name(id='out', ctx=Load()), + Attribute( + value=Name(id='re', ctx=Load()), + attr='S', + ctx=Load())])), + Return( + value=IfExp( + test=Name(id='m', ctx=Load()), + body=Call( + func=Attribute( + value=Call( + func=Attribute( + value=Name(id='m', ctx=Load()), + attr='group', + ctx=Load()), + args=[ + Constant(value=1)]), + attr='strip', + ctx=Load())), + orelse=Constant(value='')))]), + Assign( + targets=[ + Name(id='mon', ctx=Store())], + value=Call( + func=Name(id='parse_env_text', ctx=Load()), + args=[ + Call( + func=Name(id='section', ctx=Load()), + args=[ + Constant(value='MONITOR_HEALTH')])])), + Assign( + targets=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_status'), + ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='mon', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='STATUS'), + Constant(value='MISSING')])), + Assign( + targets=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_reports'), + ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='mon', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='reports'), + Constant(value='')])), + Assign( + targets=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_open'), + ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='mon', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='open'), + Constant(value='')])), + Assign( + targets=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_resolved'), + ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='mon', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='resolved'), + Constant(value='')])), + Assign( + targets=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_smtp_configured'), + ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='mon', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='smtp_configured'), + Constant(value='')])), + Assign( + targets=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_health_age_seconds'), + ctx=Store())], + value=Call( + func=Name(id='str', ctx=Load()), + args=[ + Call( + func=Name(id='age_seconds_from_ts', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='mon', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='TS')])])])), + If( + test=Compare( + left=Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_status'), + ctx=Load()), + ops=[ + NotEq()], + comparators=[ + Constant(value='OK')]), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='monitor_status_not_ok')]))]), + Try( + body=[ + Assign( + targets=[ + Name(id='health_age', ctx=Store())], + value=Call( + func=Name(id='int', ctx=Load()), + args=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_health_age_seconds'), + ctx=Load())])), + If( + test=Compare( + left=Name(id='health_age', ctx=Load()), + ops=[ + Gt()], + comparators=[ + Name(id='MONITOR_HEALTH_AGE_MAX', ctx=Load())]), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='monitor_health_stale')]))])], + handlers=[ + ExceptHandler( + type=Name(id='Exception', ctx=Load()), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='monitor_health_age_invalid')]))])]), + Try( + body=[ + Assign( + targets=[ + Name(id='reports', ctx=Store())], + value=Call( + func=Name(id='int', ctx=Load()), + args=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_reports'), + ctx=Load())])), + Assign( + targets=[ + Name(id='opened', ctx=Store())], + value=Call( + func=Name(id='int', ctx=Load()), + args=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_open'), + ctx=Load())])), + Assign( + targets=[ + Name(id='resolved', ctx=Store())], + value=Call( + func=Name(id='int', ctx=Load()), + args=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_resolved'), + ctx=Load())])), + If( + test=Compare( + left=Name(id='reports', ctx=Load()), + ops=[ + LtE()], + comparators=[ + Constant(value=0)]), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='monitor_reports_zero_or_missing')]))]), + If( + test=BoolOp( + op=Or(), + values=[ + Compare( + left=Name(id='opened', ctx=Load()), + ops=[ + Lt()], + comparators=[ + Constant(value=0)]), + Compare( + left=Name(id='resolved', ctx=Load()), + ops=[ + Lt()], + comparators=[ + Constant(value=0)]), + Compare( + left=BinOp( + left=Name(id='opened', ctx=Load()), + op=Add(), + right=Name(id='resolved', ctx=Load())), + ops=[ + NotEq()], + comparators=[ + Name(id='reports', ctx=Load())])]), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='monitor_counts_invalid')]))])], + handlers=[ + ExceptHandler( + type=Name(id='Exception', ctx=Load()), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='monitor_counts_missing')]))])]), + If( + test=Compare( + left=Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_smtp_configured'), + ctx=Load()), + ops=[ + NotEq()], + comparators=[ + Constant(value='yes')]), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='monitor_smtp_not_configured')]))]), + Assign( + targets=[ + Name(id='timers_text', ctx=Store())], + value=Call( + func=Name(id='section', ctx=Load()), + args=[ + Constant(value='TIMERS')])), + Assign( + targets=[ + Name(id='m', ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='re', ctx=Load()), + attr='search', + ctx=Load()), + args=[ + Constant(value='skladchik-reports-monitor\\.timer\\s+enabled=([^\\s]+)\\s+active=([^\\s]+)'), + Name(id='timers_text', ctx=Load())])), + Assign( + targets=[ + Name(id='timer_enabled', ctx=Store())], + value=IfExp( + test=Name(id='m', ctx=Load()), + body=Call( + func=Attribute( + value=Name(id='m', ctx=Load()), + attr='group', + ctx=Load()), + args=[ + Constant(value=1)]), + orelse=Constant(value='missing'))), + Assign( + targets=[ + Name(id='timer_active', ctx=Store())], + value=IfExp( + test=Name(id='m', ctx=Load()), + body=Call( + func=Attribute( + value=Name(id='m', ctx=Load()), + attr='group', + ctx=Load()), + args=[ + Constant(value=2)]), + orelse=Constant(value='missing'))), + Assign( + targets=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_timer_enabled'), + ctx=Store())], + value=Name(id='timer_enabled', ctx=Load())), + Assign( + targets=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_timer_active'), + ctx=Store())], + value=Name(id='timer_active', ctx=Load())), + If( + test=Compare( + left=Name(id='timer_enabled', ctx=Load()), + ops=[ + NotEq()], + comparators=[ + Constant(value='enabled')]), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='monitor_timer_not_enabled')]))]), + If( + test=Compare( + left=Name(id='timer_active', ctx=Load()), + ops=[ + NotEq()], + comparators=[ + Constant(value='active')]), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='monitor_timer_not_active')]))]), + Assign( + targets=[ + Name(id='route_lines', ctx=Store())], + value=Call( + func=Attribute( + value=Call( + func=Name(id='section', ctx=Load()), + args=[ + Constant(value='ROUTE')]), + att + +SUPERVISOR_FUNC_2_AST_END +SUPERVISOR_FUNC_3_NAME=render_body +SUPERVISOR_FUNC_3_LINENO=349 +SUPERVISOR_FUNC_3_ENDLINENO=378 +SUPERVISOR_FUNC_3_NAMES=facts,get,join,lines,none_text,problems,status,str +SUPERVISOR_FUNC_3_AST_BEGIN +FunctionDef( + name='render_body', + args=arguments( + args=[ + arg(arg='status'), + arg(arg='facts'), + arg(arg='problems'), + arg(arg='mode')]), + body=[ + Assign( + targets=[ + Name(id='none_text', ctx=Store())], + value=Constant(value='нет')), + Assign( + targets=[ + Name(id='lines', ctx=Store())], + value=List( + elts=[ + Constant(value='Надзор мониторинга жалоб Складчика'), + Constant(value=''), + BinOp( + left=Constant(value='Статус: '), + op=Add(), + right=Name(id='status', ctx=Load())), + BinOp( + left=Constant(value='Проблемы: '), + op=Add(), + right=IfExp( + test=Name(id='problems', ctx=Load()), + body=Call( + func=Attribute( + value=Constant(value=', '), + attr='join', + ctx=Load()), + args=[ + Name(id='problems', ctx=Load())]), + orelse=Name(id='none_text', ctx=Load()))), + Constant(value=''), + Constant(value='Основной монитор:'), + Constant(value=''), + BinOp( + left=Constant(value='- status: '), + op=Add(), + right=Call( + func=Name(id='str', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='monitor_status'), + Constant(value='')])])), + BinOp( + left=Constant(value='- reports: '), + op=Add(), + right=Call( + func=Name(id='str', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='monitor_reports'), + Constant(value='')])])), + BinOp( + left=Constant(value='- open: '), + op=Add(), + right=Call( + func=Name(id='str', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='monitor_open'), + Constant(value='')])])), + BinOp( + left=Constant(value='- resolved: '), + op=Add(), + right=Call( + func=Name(id='str', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='monitor_resolved'), + Constant(value='')])])), + BinOp( + left=Constant(value='- route: '), + op=Add(), + right=Call( + func=Name(id='str', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='netbird_route'), + Constant(value='')])])), + Constant(value=''), + Constant(value='Canonical backup:'), + BinOp( + left=Constant(value='- decision: '), + op=Add(), + right=Call( + func=Name(id='str', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='canonical_backup_decision'), + Constant(value='')])])), + BinOp( + left=Constant(value='- generation: '), + op=Add(), + right=Call( + func=Name(id='str', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='canonical_backup_generation'), + Constant(value='')])])), + BinOp( + left=Constant(value='- registry source: '), + op=Add(), + right=Call( + func=Name(id='str', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='registry_source'), + Constant(value='')])])), + BinOp( + left=Constant(value='- worker target: '), + op=Add(), + right=Call( + func=Name(id='str', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='worker_target'), + Constant(value='')])]))], + ctx=Load())), + Return( + value=Call( + func=Attribute( + value=Constant(value='\n'), + attr='join', + ctx=Load()), + args=[ + Name(id='lines', ctx=Load())]))]) +SUPERVISOR_FUNC_3_AST_END +SUPERVISOR_FUNC_4_NAME=main +SUPERVISOR_FUNC_4_LINENO=395 +SUPERVISOR_FUNC_4_ENDLINENO=515 +SUPERVISOR_FUNC_4_NAMES=append,argv,edge_mail,facts,gather,get,join,len,log,mail_sent,mode,old,old_status,print,problems,read_state,render_body,status,stderr,subject,sys,write_health,write_state +SUPERVISOR_FUNC_4_AST_BEGIN +FunctionDef( + name='main', + args=arguments(), + body=[ + Assign( + targets=[ + Name(id='mode', ctx=Store())], + value=IfExp( + test=Compare( + left=Call( + func=Name(id='len', ctx=Load()), + args=[ + Attribute( + value=Name(id='sys', ctx=Load()), + attr='argv', + ctx=Load())]), + ops=[ + Gt()], + comparators=[ + Constant(value=1)]), + body=Subscript( + value=Attribute( + value=Name(id='sys', ctx=Load()), + attr='argv', + ctx=Load()), + slice=Constant(value=1), + ctx=Load()), + orelse=Constant(value='check'))), + If( + test=Compare( + left=Name(id='mode', ctx=Load()), + ops=[ + NotIn()], + comparators=[ + Tuple( + elts=[ + Constant(value='check'), + Constant(value='test')], + ctx=Load())]), + body=[ + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + Constant(value='usage: skladchik-reports-monitor-supervisor [check|test]')], + keywords=[ + keyword( + arg='file', + value=Attribute( + value=Name(id='sys', ctx=Load()), + attr='stderr', + ctx=Load()))])), + Return( + value=Constant(value=2))]), + Assign( + targets=[ + Tuple( + elts=[ + Name(id='facts', ctx=Store()), + Name(id='problems', ctx=Store())], + ctx=Store())], + value=Call( + func=Name(id='gather', ctx=Load()))), + Assign( + targets=[ + Name(id='status', ctx=Store())], + value=IfExp( + test=UnaryOp( + op=Not(), + operand=Name(id='problems', ctx=Load())), + body=Constant(value='OK'), + orelse=Constant(value='FAIL'))), + If( + test=Compare( + left=Name(id='mode', ctx=Load()), + ops=[ + Eq()], + comparators=[ + Constant(value='test')]), + body=[ + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + JoinedStr( + values=[ + Constant(value='SUPERVISOR_STATUS='), + FormattedValue( + value=Name(id='status', ctx=Load()), + conversion=-1)])])), + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + BinOp( + left=Constant(value='SUPERVISOR_PROBLEMS='), + op=Add(), + right=IfExp( + test=Name(id='problems', ctx=Load()), + body=Call( + func=Attribute( + value=Constant(value=','), + attr='join', + ctx=Load()), + args=[ + Name(id='problems', ctx=Load())]), + orelse=Constant(value='none')))])), + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + JoinedStr( + values=[ + Constant(value='MONITOR='), + FormattedValue( + value=Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='monitor_status')]), + conversion=-1), + Constant(value=' reports='), + FormattedValue( + value=Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='monitor_reports')]), + conversion=-1), + Constant(value=' open='), + FormattedValue( + value=Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='monitor_open')]), + conversion=-1), + Constant(value=' resolved='), + FormattedValue( + value=Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='monitor_resolved')]), + conversion=-1)])])), + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + JoinedStr( + values=[ + Constant(value='CANONICAL_BACKUP='), + FormattedValue( + value=Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='canonical_backup_decision')]), + conversion=-1), + Constant(value=' generation='), + FormattedValue( + value=Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='canonical_backup_generation')]), + conversion=-1)])])), + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + JoinedStr( + values=[ + Constant(value='REGISTRY_SOURCE='), + FormattedValue( + value=Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='registry_source')]), + conversion=-1)])])), + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + JoinedStr( + values=[ + Constant(value='WORKER_TARGET='), + FormattedValue( + value=Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='worker_target')]), + conversion=-1)])])), + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + JoinedStr( + values=[ + Constant(value='NETBIRD_ROUTE='), + FormattedValue( + value=Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='netbird_route')]), + conversion=-1)])])), + Return( + value=IfExp( + test=Compare( + left=Name(id='status', ctx=Load()), + ops=[ + Eq()], + comparators=[ + Constant(value='OK')]), + body=Constant(value=0), + orelse=Constant(value=1)))]), + Assign( + targets=[ + Name(id='old', ctx=Store())], + value=Call( + func=Name(id='read_state', ctx=Load()))), + Assign( + targets=[ + Name(id='old_status', ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='old', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='LAST_STATUS'), + Constant(value='')])), + Assign( + targets=[ + Name(id='mail_sent', ctx=Store())], + value=Constant(value=False)), + If( + test=BoolOp( + op=And(), + values=[ + Compare( + left=Name(id='status', ctx=Load()), + ops=[ + NotEq()], + comparators=[ + Constant(value='OK')]), + Compare( + left=Name(id='old_status', ctx=Load()), + ops=[ + NotEq()], + comparators=[ + Constant(value='FAIL')])]), + body=[ + Assign( + targets=[ + Name(id='subject', ctx=Store())], + value=Constant(value='[Складчик] ТРЕВОГА: мониторинг жалоб')), + Assign( + targets=[ + Name(id='mail_sent', ctx=Store())], + value=Call( + func=Name(id='edge_mail', ctx=Load()), + args=[ + Name(id='subject', ctx=Load()), + Call( + func=Name(id='render_body', ctx=Load()), + args=[ + Name(id='status', ctx=Load()), + Name(id='facts', ctx=Load()), + Name(id='problems', ctx=Load()), + Name(id='mode', ctx=Load())])])), + If( + test=UnaryOp( + op=Not(), + operand=Name(id='mail_sent', ctx=Load())), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='supervisor_mail_send_failed')])), + Assign( + targets=[ + Name(id='status', ctx=Store())], + value=Constant(value='FAIL'))])], + orelse=[ + If( + test=BoolOp( + op=And(), + values=[ + Compare( + left=Name(id='status', ctx=Load()), + ops=[ + Eq()], + comparators=[ + Constant(value='OK')]), + Compare( + left=Name(id='old_status', ctx=Load()), + ops=[ + Eq()], + comparators=[ + Constant(value='FAIL')])]), + body=[ + Assign( + targets=[ + Name(id='subject', ctx=Store())], + value=Constant(value='[Складчик] ВОССТАНОВЛЕНО: мониторинг жалоб и backup снова OK')), + Assign( + targets=[ + Name(id='mail_sent', ctx=Store())], + value=Call( + func=Name(id='edge_mail', ctx=Load()), + args=[ + Name(id='subject', ctx=Load()), + Call( + func=Name(id='render_body', ctx=Load()), + args=[ + Name(id='status', ctx=Load()), + Name(id='facts', ctx=Load()), + Name(id='problems', ctx=Load()), + Name(id='mode', ctx=Load())])])), + If( + test=UnaryOp( + op=Not(), + operand=Name(id='mail_sent', ctx=Load())), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='supervisor_mail_send_failed')])), + Assign( + targets=[ + Name(id='status', ctx=Store())], + value=Constant(value='FAIL'))])])]), + Expr( + value=Call( + func=Name(id='write_health', ctx=Load()), + args=[ + Name(id='status', ctx=Load()), + Name(id='facts', ctx=Load()), + Name(id='problems', ctx=Load()), + Name(id='mail_sent', ctx=Load())])), + Expr( + value=Call( + func=Name(id='write_state', ctx=Load()), + args=[ + Name(id='status', ctx=Load()), + Name(id='problems', ctx=Load())])), + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + JoinedStr( + values=[ + Constant(value='SUPERVISOR_STATUS='), + FormattedValue( + value=Name(id='status', ctx=Load()), + conversion=-1)])])), + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + JoinedStr( + values=[ + Constant(value='SUPERVISOR_MAIL_SENT='), + FormattedValue( + value=IfExp( + test=Name(id='mail_sent', ctx=Load()), + body=Constant(value='yes'), + orelse=Constant(value='no')), + conversion=-1)])])), + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + BinOp( + left=Constant(value='SUPERVISOR_PROBLEMS='), + op=Add(), + right=IfExp( + test=Name(id='problems', ctx=Load()), + body=Call( + func=Attribute( + value=Constant(value=','), + attr='join', + ctx=Load()), + args=[ + Name(id='problems', ctx=Load())]), + orelse=Constant(value='none')))])), + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + JoinedStr( + values=[ + Constant(value='MONITOR='), + FormattedValue( + value=Call( + + +SUPERVISOR_FUNC_4_AST_END +BACKUP_AUDIT_PRESENT=true +BACKUP_AUDIT_SHA=1c2cd8a00859492c010ed35baf5eb67f4278544809de8c2563421a6f3e356ed3 +BACKUP_AUDIT_BASENAME=homelab-backup-audit +BACKUP_AUDIT_AST_OK=true +BACKUP_AUDIT_FUNCTION_COUNT=7 +BACKUP_AUDIT_FUNCTIONS=run,collect,parse_epoch,latest_legacy,unit_ok,parse_app_plan,expected_v2_heavy_lock_owner +BACKUP_AUDIT_CLI_OPTION_COUNT=0 +BACKUP_AUDIT_CLI_OPTIONS=NONE +BACKUP_AUDIT_ENV_NAME_COUNT=0 +BACKUP_AUDIT_ENV_NAMES=NONE +BACKUP_AUDIT_RELEVANT_FUNCTION_COUNT=4 +BACKUP_AUDIT_FUNC_1_NAME=collect +BACKUP_AUDIT_FUNC_1_LINENO=34 +BACKUP_AUDIT_FUNC_1_ENDLINENO=39 +BACKUP_AUDIT_FUNC_1_NAMES=append,collect,dict,get,isinstance,list,obj,out,str,v,values +BACKUP_AUDIT_FUNC_1_AST_BEGIN +FunctionDef( + name='collect', + args=arguments( + args=[ + arg(arg='obj'), + arg(arg='out')]), + body=[ + If( + test=Call( + func=Name(id='isinstance', ctx=Load()), + args=[ + Name(id='obj', ctx=Load()), + Name(id='dict', ctx=Load())]), + body=[ + If( + test=Call( + func=Name(id='isinstance', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='obj', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='logical_id')]), + Name(id='str', ctx=Load())]), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='out', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Name(id='obj', ctx=Load())]))]), + For( + target=Name(id='v', ctx=Store()), + iter=Call( + func=Attribute( + value=Name(id='obj', ctx=Load()), + attr='values', + ctx=Load())), + body=[ + Expr( + value=Call( + func=Name(id='collect', ctx=Load()), + args=[ + Name(id='v', ctx=Load()), + Name(id='out', ctx=Load())]))])], + orelse=[ + If( + test=Call( + func=Name(id='isinstance', ctx=Load()), + args=[ + Name(id='obj', ctx=Load()), + Name(id='list', ctx=Load())]), + body=[ + For( + target=Name(id='v', ctx=Store()), + iter=Name(id='obj', ctx=Load()), + body=[ + Expr( + value=Call( + func=Name(id='collect', ctx=Load()), + args=[ + Name(id='v', ctx=Load()), + Name(id='out', ctx=Load())]))])])])]) +BACKUP_AUDIT_FUNC_1_AST_END +BACKUP_AUDIT_FUNC_2_NAME=latest_legacy +BACKUP_AUDIT_FUNC_2_LINENO=53 +BACKUP_AUDIT_FUNC_2_ENDLINENO=77 +BACKUP_AUDIT_FUNC_2_NAMES=APPREST,Exception,QROOT,VMREST,age,best,best_epoch,d,epoch,gen,get,glob,int,is_dir,is_file,json,kind,loads,logical,max,obj,p,parse_epoch,read_text,restore,rev,rj,rroot,score,st_mtime,stat,str,strict,time +BACKUP_AUDIT_FUNC_2_AST_BEGIN +FunctionDef( + name='latest_legacy', + args=arguments( + args=[ + arg(arg='logical'), + arg(arg='kind')]), + body=[ + Assign( + targets=[ + Name(id='d', ctx=Store())], + value=BinOp( + left=Name(id='QROOT', ctx=Load()), + op=Div(), + right=Name(id='logical', ctx=Load()))), + Assign( + targets=[ + Name(id='best', ctx=Store())], + value=Constant(value=None)), + Assign( + targets=[ + Name(id='best_epoch', ctx=Store())], + value=UnaryOp( + op=USub(), + operand=Constant(value=1))), + If( + test=UnaryOp( + op=Not(), + operand=Call( + func=Attribute( + value=Name(id='d', ctx=Load()), + attr='is_dir', + ctx=Load()))), + body=[ + Return( + value=Constant(value=None))]), + For( + target=Name(id='p', ctx=Store()), + iter=Call( + func=Attribute( + value=Name(id='d', ctx=Load()), + attr='glob', + ctx=Load()), + args=[ + Constant(value='*.json')]), + body=[ + Try( + body=[ + Assign( + targets=[ + Name(id='obj', ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='json', ctx=Load()), + attr='loads', + ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='p', ctx=Load()), + attr='read_text', + ctx=Load()), + keywords=[ + keyword( + arg='encoding', + value=Constant(value='utf-8'))])]))], + handlers=[ + ExceptHandler( + type=Name(id='Exception', ctx=Load()), + body=[ + Continue()])]), + Assign( + targets=[ + Name(id='epoch', ctx=Store())], + value=Call( + func=Name(id='parse_epoch', ctx=Load()), + args=[ + Name(id='obj', ctx=Load())])), + Assign( + targets=[ + Name(id='score', ctx=Store())], + value=IfExp( + test=Compare( + left=Name(id='epoch', ctx=Load()), + ops=[ + IsNot()], + comparators=[ + Constant(value=None)]), + body=Name(id='epoch', ctx=Load()), + orelse=Call( + func=Name(id='int', ctx=Load()), + args=[ + Attribute( + value=Call( + func=Attribute( + value=Name(id='p', ctx=Load()), + attr='stat', + ctx=Load())), + attr='st_mtime', + ctx=Load())]))), + If( + test=Compare( + left=Name(id='score', ctx=Load()), + ops=[ + Gt()], + comparators=[ + Name(id='best_epoch', ctx=Load())]), + body=[ + Assign( + targets=[ + Name(id='best_epoch', ctx=Store())], + value=Name(id='score', ctx=Load())), + Assign( + targets=[ + Name(id='best', ctx=Store())], + value=Tuple( + elts=[ + Name(id='p', ctx=Load()), + Name(id='obj', ctx=Load()), + Name(id='score', ctx=Load())], + ctx=Load()))])]), + If( + test=UnaryOp( + op=Not(), + operand=Name(id='best', ctx=Load())), + body=[ + Return( + value=Constant(value=None))]), + Assign( + targets=[ + Tuple( + elts=[ + Name(id='p', ctx=Store()), + Name(id='obj', ctx=Store()), + Name(id='epoch', ctx=Store())], + ctx=Store())], + value=Name(id='best', ctx=Load())), + Assign( + targets=[ + Name(id='gen', ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='obj', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='generation')])), + Assign( + targets=[ + Name(id='strict', ctx=Store())], + value=BoolOp( + op=And(), + values=[ + Compare( + left=Call( + func=Attribute( + value=Name(id='obj', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='status')]), + ops=[ + Eq()], + comparators=[ + Constant(value='SEALED')]), + Compare( + left=Call( + func=Attribute( + value=Name(id='obj', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='cloud_quorum')]), + ops=[ + Eq()], + comparators=[ + Constant(value=2)]), + Compare( + left=Call( + func=Attribute( + value=Name(id='obj', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='cloud_a_verified')]), + ops=[ + Is()], + comparators=[ + Constant(value=True)]), + Compare( + left=Call( + func=Attribute( + value=Name(id='obj', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='cloud_b_verified')]), + ops=[ + Is()], + comparators=[ + Constant(value=True)]), + Compare( + left=Call( + func=Attribute( + value=Name(id='obj', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='part_hashes_verified')]), + ops=[ + Is()], + comparators=[ + Constant(value=True)]), + Compare( + left=Call( + func=Attribute( + value=Name(id='obj', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='seal_written')]), + ops=[ + Is()], + comparators=[ + Constant(value=True)]), + Compare( + left=Call( + func=Attribute( + value=Name(id='obj', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='local_payload_present')]), + ops=[ + Is()], + comparators=[ + Constant(value=False)]), + Compare( + left=Call( + func=Attribute( + value=Name(id='obj', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='local_cleanup')]), + ops=[ + Eq()], + comparators=[ + Constant(value='OK')])])), + Assign( + targets=[ + Name(id='rroot', ctx=Store())], + value=IfExp( + test=Compare( + left=Name(id='kind', ctx=Load()), + ops=[ + Eq()], + comparators=[ + Constant(value='VM')]), + body=Name(id='VMREST', ctx=Load()), + orelse=Name(id='APPREST', ctx=Load()))), + Assign( + targets=[ + Name(id='rev', ctx=Store())], + value=IfExp( + test=Name(id='gen', ctx=Load()), + body=BinOp( + left=BinOp( + left=Name(id='rroot', ctx=Load()), + op=Div(), + right=Name(id='logical', ctx=Load())), + op=Div(), + right=BinOp( + left=Call( + func=Name(id='str', ctx=Load()), + args=[ + Name(id='gen', ctx=Load())]), + op=Add(), + right=Constant(value='.json'))), + orelse=Constant(value=None))), + Assign( + targets=[ + Name(id='restore', ctx=Store())], + value=Constant(value=False)), + If( + test=BoolOp( + op=And(), + values=[ + Name(id='rev', ctx=Load()), + Call( + func=Attribute( + value=Name(id='rev', ctx=Load()), + attr='is_file', + ctx=Load()))]), + body=[ + Try( + body=[ + Assign( + targets=[ + Name(id='rj', ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='json', ctx=Load()), + attr='loads', + ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='rev', ctx=Load()), + attr='read_text', + ctx=Load()), + keywords=[ + keyword( + arg='encoding', + value=Constant(value='utf-8'))])])), + Assign( + targets=[ + Name(id='restore', ctx=Store())], + value=Compare( + left=Call( + func=Attribute( + value=Name(id='rj', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='result')]), + ops=[ + Eq()], + comparators=[ + Constant(value='OK')]))], + handlers=[ + ExceptHandler( + type=Name(id='Exception', ctx=Load()), + body=[ + Pass()])])]), + Assign( + targets=[ + Name(id='age', ctx=Store())], + value=IfExp( + test=Name(id='epoch', ctx=Load()), + body=Call( + func=Name(id='max', ctx=Load()), + args=[ + Constant(value=0), + Call( + func=Name(id='int', ctx=Load()), + args=[ + BinOp( + left=Call( + func=Attribute( + value=Name(id='time', ctx=Load()), + attr='time', + ctx=Load())), + op=Sub(), + right=Name(id='epoch', ctx=Load()))])]), + orelse=Constant(value=None))), + Return( + value=Dict( + keys=[ + Constant(value='generation'), + Constant(value='strict'), + Constant(value='restore_ok'), + Constant(value='age_seconds'), + Constant(value='state_file'), + Constant(value='obj')], + values=[ + Name(id='gen', ctx=Load()), + Name(id='strict', ctx=Load()), + Name(id='restore', ctx=Load()), + Name(id='age', ctx=Load()), + Call( + func=Name(id='str', ctx=Load()), + args=[ + Name(id='p', ctx=Load())]), + Name(id='obj', ctx=Load())]))]) +BACKUP_AUDIT_FUNC_2_AST_END +BACKUP_AUDIT_FUNC_3_NAME=parse_app_plan +BACKUP_AUDIT_FUNC_3_LINENO=84 +BACKUP_AUDIT_FUNC_3_ENDLINENO=93 +BACKUP_AUDIT_FUNC_3_NAMES=d,get,k,line,r,split,splitlines,startswith,tok,txt,v +BACKUP_AUDIT_FUNC_3_AST_BEGIN +FunctionDef( + name='parse_app_plan', + args=arguments( + args=[ + arg(arg='txt')]), + body=[ + Assign( + targets=[ + Name(id='d', ctx=Store())], + value=Dict()), + For( + target=Name(id='line', ctx=Store()), + iter=Call( + func=Attribute( + value=Name(id='txt', ctx=Load()), + attr='splitlines', + ctx=Load())), + body=[ + If( + test=Call( + func=Attribute( + value=Name(id='line', ctx=Load()), + attr='startswith', + ctx=Load()), + args=[ + Constant(value='QUEUE_FRESHNESS_PLAN APP=')]), + body=[ + Assign( + targets=[ + Name(id='r', ctx=Store())], + value=Dict()), + For( + target=Name(id='tok', ctx=Store()), + iter=Subscript( + value=Call( + func=Attribute( + value=Name(id='line', ctx=Load()), + attr='split', + ctx=Load())), + slice=Slice( + lower=Constant(value=1)), + ctx=Load()), + body=[ + If( + test=Compare( + left=Constant(value='='), + ops=[ + In()], + comparators=[ + Name(id='tok', ctx=Load())]), + body=[ + Assign( + targets=[ + Tuple( + elts=[ + Name(id='k', ctx=Store()), + Name(id='v', ctx=Store())], + ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='tok', ctx=Load()), + attr='split', + ctx=Load()), + args=[ + Constant(value='='), + Constant(value=1)])), + Assign( + targets=[ + Subscript( + value=Name(id='r', ctx=Load()), + slice=Name(id='k', ctx=Load()), + ctx=Store())], + value=Name(id='v', ctx=Load()))])]), + If( + test=Call( + func=Attribute( + value=Name(id='r', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='APP')]), + body=[ + Assign( + targets=[ + Subscript( + value=Name(id='d', ctx=Load()), + slice=Subscript( + value=Name(id='r', ctx=Load()), + slice=Constant(value='APP'), + ctx=Load()), + ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='r', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='DECISION')]))])])]), + Return( + value=Name(id='d', ctx=Load()))]) +BACKUP_AUDIT_FUNC_3_AST_END +BACKUP_AUDIT_FUNC_4_NAME=expected_v2_heavy_lock_owner +BACKUP_AUDIT_FUNC_4_LINENO=188 +BACKUP_AUDIT_FUNC_4_ENDLINENO=200 +BACKUP_AUDIT_FUNC_4_NAMES=Exception,_,a,add,arc,fe,fo,frc,int,isdigit,owners,pid,pid_text,prc,replace,run,set,split,strip,tok +BACKUP_AUDIT_FUNC_4_AST_BEGIN +FunctionDef( + name='expected_v2_heavy_lock_owner', + args=arguments(), + body=[ + Assign( + targets=[ + Tuple( + elts=[ + Name(id='arc', ctx=Store()), + Name(id='a', ctx=Store()), + Name(id='_', ctx=Store())], + ctx=Store())], + value=Call( + func=Name(id='run', ctx=Load()), + args=[ + List( + elts=[ + Constant(value='systemctl'), + Constant(value='show'), + Constant(value='homelab-backup-v2.service'), + Constant(value='-p'), + Constant(value='ActiveState'), + Constant(value='--value')], + ctx=Load()), + Constant(value=10)])), + Assign( + targets=[ + Tuple( + elts=[ + Name(id='prc', ctx=Store()), + Name(id='pid_text', ctx=Store()), + Name(id='_', ctx=Store())], + ctx=Store())], + value=Call( + func=Name(id='run', ctx=Load()), + args=[ + List( + elts=[ + Constant(value='systemctl'), + Constant(value='show'), + Constant(value='homelab-backup-v2.service'), + Constant(value='-p'), + Constant(value='MainPID'), + Constant(value='--value')], + ctx=Load()), + Constant(value=10)])), + If( + test=BoolOp( + op=Or(), + values=[ + Compare( + left=Name(id='arc', ctx=Load()), + ops=[ + NotEq()], + comparators=[ + Constant(value=0)]), + Compare( + left=Name(id='prc', ctx=Load()), + ops=[ + NotEq()], + comparators=[ + Constant(value=0)]), + Compare( + left=Call( + func=Attribute( + value=Name(id='a', ctx=Load()), + attr='strip', + ctx=Load())), + ops=[ + NotIn()], + comparators=[ + Tuple( + elts=[ + Constant(value='active'), + Constant(value='activating')], + ctx=Load())])]), + body=[ + Return( + value=Constant(value=False))]), + Try( + body=[ + Assign( + targets=[ + Name(id='pid', ctx=Store())], + value=Call( + func=Name(id='int', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='pid_text', ctx=Load()), + attr='strip', + ctx=Load()))]))], + handlers=[ + ExceptHandler( + type=Name(id='Exception', ctx=Load()), + body=[ + Return( + value=Constant(value=False))])]), + If( + test=Compare( + left=Name(id='pid', ctx=Load()), + ops=[ + LtE()], + comparators=[ + Constant(value=0)]), + body=[ + Return( + value=Constant(value=False))]), + Assign( + targets=[ + Tuple( + elts=[ + Name(id='frc', ctx=Store()), + Name(id='fo', ctx=Store()), + Name(id='fe', ctx=Store())], + ctx=Store())], + value=Call( + func=Name(id='run', ctx=Load()), + args=[ + List( + elts=[ + Constant(value='fuser'), + Constant(value='/run/homelab-backup-heavy.lock')], + ctx=Load()), + Constant(value=10)])), + Assign( + targets=[ + Name(id='owners', ctx=Store())], + value=Call( + func=Name(id='set', ctx=Load()))), + For( + target=Name(id='tok', ctx=Store()), + iter=Call( + func=Attribute( + value=Call( + func=Attribute( + value=BinOp( + left=BinOp( + left=Name(id='fo', ctx=Load()), + op=Add(), + right=Constant(value=' ')), + op=Add(), + right=Name(id='fe', ctx=Load())), + attr='replace', + ctx=Load()), + args=[ + Constant(value=':'), + Constant(value=' ')]), + attr='split', + ctx=Load())), + body=[ + If( + test=Call( + func=Attribute( + value=Name(id='tok', ctx=Load()), + attr='isdigit', + ctx=Load())), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='owners', ctx=Load()), + attr='add', + ctx=Load()), + args=[ + Call( + func=Name(id='int', ctx=Load()), + args=[ + Name(id='tok', ctx=Load())])]))])]), + Return( + value=BoolOp( + op=And(), + values=[ + Compare( + left=Name(id='frc', ctx=Load()), + ops=[ + Eq()], + comparators=[ + Constant(value=0)]), + Compare( + left=Name(id='owners', ctx=Load()), + ops=[ + Eq()], + comparators=[ + Set( + elts=[ + Name(id='pid', ctx=Load())])])]))]) +BACKUP_AUDIT_FUNC_4_AST_END +QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_PRESENT=true +QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_SHA=1f959049cca2710a2cb820cc1f6acab16399c6b6711b9e4522e0ecd49e0e4650 +QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_BASENAME=homelab-app-cloud-quorum-queue +QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_AST_OK=false +QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_AST_ERROR=SyntaxError +QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_HELP_RC=64 +QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_HELP_SHA=53bc0423b5ea9142a7be1f687f1572975bc52349a1fd28f97d6c0748b2b445e1 +QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_HELP_BEGIN + +APP_QUORUM_QUEUE_ERROR=ACTION_INVALID +QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_HELP_END +PRODUCER_SCRIPT_COUNT=3 +PRODUCER_UNIT_COUNT=4 +PRODUCER_UNIT_1_NAME=homelab-app-cloud-quorum-queue.service +PRODUCER_UNIT_1_SHOW_RC=0 +PRODUCER_UNIT_1_LOADSTATE=loaded +PRODUCER_UNIT_1_ACTIVESTATE=inactive +PRODUCER_UNIT_1_UNITFILESTATE=static +PRODUCER_UNIT_1_RESULT=success +PRODUCER_UNIT_1_EXECMAINSTATUS=0 +PRODUCER_UNIT_1_FRAGMENT_BASENAME=homelab-app-cloud-quorum-queue.service +PRODUCER_UNIT_1_FRAGMENT_SHA=afaa997bd85dafdb29d2cd2b53527996171c21fd5e80ae559f8f2bee0dcbbf1a +PRODUCER_UNIT_1_EXECSTART_SHA=22094bb14d8dc5f7399744e183b096583a9c9625527a2f00981f2ec5cd8e1713 +PRODUCER_UNIT_1_EXEC_COMPONENTS=NONE +PRODUCER_UNIT_1_ENVFILES_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +PRODUCER_UNIT_2_NAME=homelab-app-cloud-quorum-queue.timer +PRODUCER_UNIT_2_SHOW_RC=0 +PRODUCER_UNIT_2_LOADSTATE=loaded +PRODUCER_UNIT_2_ACTIVESTATE=active +PRODUCER_UNIT_2_UNITFILESTATE=enabled +PRODUCER_UNIT_2_RESULT=success +PRODUCER_UNIT_2_EXECMAINSTATUS= +PRODUCER_UNIT_2_FRAGMENT_BASENAME=homelab-app-cloud-quorum-queue.timer +PRODUCER_UNIT_2_FRAGMENT_SHA=af2eedce3df53029b591d31715a3f3e6688ddb997b4823f487e70c339ce88078 +PRODUCER_UNIT_2_EXECSTART_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +PRODUCER_UNIT_2_EXEC_COMPONENTS=NONE +PRODUCER_UNIT_2_ENVFILES_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +PRODUCER_UNIT_3_NAME=skladchik-reports-monitor-supervisor.service +PRODUCER_UNIT_3_SHOW_RC=0 +PRODUCER_UNIT_3_LOADSTATE=loaded +PRODUCER_UNIT_3_ACTIVESTATE=inactive +PRODUCER_UNIT_3_UNITFILESTATE=static +PRODUCER_UNIT_3_RESULT=success +PRODUCER_UNIT_3_EXECMAINSTATUS=0 +PRODUCER_UNIT_3_FRAGMENT_BASENAME=skladchik-reports-monitor-supervisor.service +PRODUCER_UNIT_3_FRAGMENT_SHA=e874fb03573b76181f3eb812c7285848e60705923c172a2f102504a7b9100ef7 +PRODUCER_UNIT_3_EXECSTART_SHA=27a2477643cbfc4f8676fd88ebc5cff23e471bc80f89094941123fa62e3edc5f +PRODUCER_UNIT_3_EXEC_COMPONENTS=skladchik-reports-monitor-supervisor +PRODUCER_UNIT_3_ENVFILES_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +PRODUCER_UNIT_4_NAME=skladchik-reports-monitor-supervisor.timer +PRODUCER_UNIT_4_SHOW_RC=0 +PRODUCER_UNIT_4_LOADSTATE=loaded +PRODUCER_UNIT_4_ACTIVESTATE=active +PRODUCER_UNIT_4_UNITFILESTATE=enabled +PRODUCER_UNIT_4_RESULT=success +PRODUCER_UNIT_4_EXECMAINSTATUS= +PRODUCER_UNIT_4_FRAGMENT_BASENAME=skladchik-reports-monitor-supervisor.timer +PRODUCER_UNIT_4_FRAGMENT_SHA=3c3e38a40b3dfbfaa77d99a1c2bea4b58009130eac7a5197356dead1137a5ef6 +PRODUCER_UNIT_4_EXECSTART_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +PRODUCER_UNIT_4_EXEC_COMPONENTS=NONE +PRODUCER_UNIT_4_ENVFILES_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +APPID_CONFIG_MATCH_COUNT=565 +APPID_CONFIG_1_BASENAME=targets.json +APPID_CONFIG_1_PATH_HINT=//etc/homelab-backup/targets.json +APPID_CONFIG_1_SHA=2f526330152d49461ff66f50adab57d1a195ea5d1b4c292945d523411b8a68a8 +APPID_CONFIG_1_LINE_NOS=115 +APPID_CONFIG_2_BASENAME=targets.json.before-skladchik-core-apps-20261003T205612Z.bak +APPID_CONFIG_2_PATH_HINT=//etc/homelab-backup/targets.json.before-skladchik-core-apps-20261003T205612Z.bak +APPID_CONFIG_2_SHA=6ecf034ca03b52a1e6beceeae81d86a623885462c095d50b133aea4048a4626e +APPID_CONFIG_2_LINE_NOS=115 +APPID_CONFIG_3_BASENAME=task.json +APPID_CONFIG_3_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T192441Z-1666483-preflight/task.json +APPID_CONFIG_3_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb +APPID_CONFIG_3_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_4_BASENAME=task.json +APPID_CONFIG_4_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T192627Z-1668009-prepare/task.json +APPID_CONFIG_4_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb +APPID_CONFIG_4_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_5_BASENAME=task.json +APPID_CONFIG_5_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T192843Z-1681558-dry-run/task.json +APPID_CONFIG_5_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb +APPID_CONFIG_5_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_6_BASENAME=task.json +APPID_CONFIG_6_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T193210Z-1692269-apply/task.json +APPID_CONFIG_6_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb +APPID_CONFIG_6_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_7_BASENAME=task.json +APPID_CONFIG_7_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T193950Z-1722753-preflight/task.json +APPID_CONFIG_7_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb +APPID_CONFIG_7_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_8_BASENAME=task.json +APPID_CONFIG_8_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T193952Z-1722941-prepare/task.json +APPID_CONFIG_8_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb +APPID_CONFIG_8_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_9_BASENAME=task.json +APPID_CONFIG_9_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T193952Z-1723022-dry-run/task.json +APPID_CONFIG_9_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb +APPID_CONFIG_9_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_10_BASENAME=task.json +APPID_CONFIG_10_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T194508Z-1738655-apply/task.json +APPID_CONFIG_10_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb +APPID_CONFIG_10_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_11_BASENAME=task.json +APPID_CONFIG_11_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T200841Z-1818714-preflight/task.json +APPID_CONFIG_11_SHA=8741a7407c135ebe5303056da44186d280b410efbca3714054a990d0f0340aec +APPID_CONFIG_11_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_12_BASENAME=task.json +APPID_CONFIG_12_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T200843Z-1818903-prepare/task.json +APPID_CONFIG_12_SHA=8741a7407c135ebe5303056da44186d280b410efbca3714054a990d0f0340aec +APPID_CONFIG_12_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_13_BASENAME=task.json +APPID_CONFIG_13_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T200843Z-1818980-dry-run/task.json +APPID_CONFIG_13_SHA=8741a7407c135ebe5303056da44186d280b410efbca3714054a990d0f0340aec +APPID_CONFIG_13_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_14_BASENAME=task.json +APPID_CONFIG_14_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T201139Z-1833098-apply/task.json +APPID_CONFIG_14_SHA=8741a7407c135ebe5303056da44186d280b410efbca3714054a990d0f0340aec +APPID_CONFIG_14_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_15_BASENAME=task.json +APPID_CONFIG_15_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T201939Z-1860663-preflight/task.json +APPID_CONFIG_15_SHA=c121d768f5aaf7dc111cf176f890bbd7508650813760b99ed97aa19613c94e68 +APPID_CONFIG_15_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_16_BASENAME=task.json +APPID_CONFIG_16_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T201941Z-1860857-prepare/task.json +APPID_CONFIG_16_SHA=c121d768f5aaf7dc111cf176f890bbd7508650813760b99ed97aa19613c94e68 +APPID_CONFIG_16_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_17_BASENAME=task.json +APPID_CONFIG_17_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T201941Z-1860933-dry-run/task.json +APPID_CONFIG_17_SHA=c121d768f5aaf7dc111cf176f890bbd7508650813760b99ed97aa19613c94e68 +APPID_CONFIG_17_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_18_BASENAME=task.json +APPID_CONFIG_18_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T202241Z-1874939-apply/task.json +APPID_CONFIG_18_SHA=c121d768f5aaf7dc111cf176f890bbd7508650813760b99ed97aa19613c94e68 +APPID_CONFIG_18_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_19_BASENAME=task.json +APPID_CONFIG_19_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T204310Z-1946040-preflight/task.json +APPID_CONFIG_19_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2 +APPID_CONFIG_19_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_20_BASENAME=task.json +APPID_CONFIG_20_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T204311Z-1946265-prepare/task.json +APPID_CONFIG_20_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2 +APPID_CONFIG_20_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_21_BASENAME=task.json +APPID_CONFIG_21_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T204311Z-1946345-dry-run/task.json +APPID_CONFIG_21_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2 +APPID_CONFIG_21_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_22_BASENAME=task.json +APPID_CONFIG_22_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T204533Z-1956057-apply/task.json +APPID_CONFIG_22_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2 +APPID_CONFIG_22_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_23_BASENAME=task.json +APPID_CONFIG_23_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T205721Z-1989628-preflight/task.json +APPID_CONFIG_23_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2 +APPID_CONFIG_23_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_24_BASENAME=task.json +APPID_CONFIG_24_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T205722Z-1989815-prepare/task.json +APPID_CONFIG_24_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2 +APPID_CONFIG_24_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_25_BASENAME=task.json +APPID_CONFIG_25_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T205722Z-1989891-dry-run/task.json +APPID_CONFIG_25_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2 +APPID_CONFIG_25_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_26_BASENAME=stderr.log +APPID_CONFIG_26_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T210034Z-2011730-apply/stderr.log +APPID_CONFIG_26_SHA=bbc5b7b614a73219147a06614942e2c67176375af10bcb85aeac5565cb8c2532 +APPID_CONFIG_26_LINE_NOS=7,8 +APPID_CONFIG_27_BASENAME=stdout.log +APPID_CONFIG_27_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T210034Z-2011730-apply/stdout.log +APPID_CONFIG_27_SHA=cdf49d288d7b019b1a5f5099fe8b3e4f5ed1432294051a3c2020a4369c4afd41 +APPID_CONFIG_27_LINE_NOS=24,31,32,35 +APPID_CONFIG_28_BASENAME=task.json +APPID_CONFIG_28_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T210034Z-2011730-apply/task.json +APPID_CONFIG_28_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2 +APPID_CONFIG_28_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_29_BASENAME=task.json +APPID_CONFIG_29_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T211239Z-2049968-preflight/task.json +APPID_CONFIG_29_SHA=4d850b025c6a9ad347015321775f9d0466149fb9d5a70212f91b6535adc3c0e3 +APPID_CONFIG_29_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_30_BASENAME=task.json +APPID_CONFIG_30_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T213313Z-2127686-preflight/task.json +APPID_CONFIG_30_SHA=d98bdf83ab6a9fda0d864e3ccac4a0d01e7813fec9f1173a6d4d5e8712c8e238 +APPID_CONFIG_30_LINE_NOS=44,55,56,81,86 +GEN_JOURNAL_MATCH_COUNT=3 +GEN_JOURNAL_1_UNIT=skladchik-reports-monitor-supervisor.service +GEN_JOURNAL_1_IDENT=skladchik-reports-monitor-supervisor +GEN_JOURNAL_1_EXE_BASENAME=python3.13 +GEN_JOURNAL_1_PID=932988 +GEN_JOURNAL_1_MESSAGE_SHA=93a0f7b08cf701cc4f77f2d02c659932db4ca849640cbbe55327693c1e4365eb +GEN_JOURNAL_1_FLAGS=generation,backup,sealed +GEN_JOURNAL_2_UNIT=homelab-backup-audit.service +GEN_JOURNAL_2_IDENT=homelab-backup-audit +GEN_JOURNAL_2_EXE_BASENAME=python3.13 +GEN_JOURNAL_2_PID=966882 +GEN_JOURNAL_2_MESSAGE_SHA=c8c9e905543f63dbee767d26e1c1824c99e7a23094405dba984b18361a36527f +GEN_JOURNAL_2_FLAGS=generation,fresh,skip_fresh +GEN_JOURNAL_3_UNIT=skladchik-reports-monitor-supervisor.service +GEN_JOURNAL_3_IDENT=skladchik-reports-monitor-supervisor +GEN_JOURNAL_3_EXE_BASENAME=python3.13 +GEN_JOURNAL_3_PID=968339 +GEN_JOURNAL_3_MESSAGE_SHA=93a0f7b08cf701cc4f77f2d02c659932db4ca849640cbbe55327693c1e4365eb +GEN_JOURNAL_3_FLAGS=generation,backup,sealed +QUORUM_SCRIPT_READY=false +QUORUM_UNIT_READY=true +APPID_CONFIG_READY=true +BACKUP_PRODUCER_TOPOLOGY_READY=false +MAIL_SENT_BY_COMMAND=false +CHANGES_MADE=false +ROLLBACK_STARTED=false +ROLLBACK_RESTORED=null +MUTATION_OUTCOME=NO_MUTATION +DECISION=HOLD_BACKUP_PRODUCER_RCA +NEXT_GATE=BACKUP_PRODUCER_RECONCILE +TASK_RESULT=SKLADCHIK_DURABILITY_BACKUP_PRODUCER_RCA + +OUTPUT_END +CHAT_OUTPUT_END diff --git a/runtime/latest.json b/runtime/latest.json index d8fdde14..af2186db 100644 --- a/runtime/latest.json +++ b/runtime/latest.json @@ -1,19 +1,19 @@ { "schema_version": 1, "channel": "homelab-runtime", - "command_id": "SUPPORT-261005-SNIKKET-POSTRESTORE-OPS-AUDIT-99576R1", - "status": "OK", - "rc": 0, + "command_id": "SUPPORT-261005-SKLADCHIK-DURABILITY-BACKUP-PRODUCER-RCA-99578R1", + "status": "FAIL", + "rc": 43, "host": "pve01", "mode": "read-only", - "component": "snikket-postrestore-ops-audit", - "started_at_utc": "2026-10-05T06:37:09Z", - "finished_at_utc": "2026-10-05T06:37:24Z", + "component": "skladchik-durability-backup-producer-rca", + "started_at_utc": "2026-10-05T06:43:36Z", + "finished_at_utc": "2026-10-05T06:44:06Z", "reference_register_checked": true, "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", "error_register_checked": true, "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", - "command_sha256": "cf66f2eb105bc655343e9e02bb17a8653b2204ad3b8b32f37cca41a1c3b8e13e", + "command_sha256": "6d4e000caabe0b4f15d31ba419f9633c5004c1b83d9c535098b8901ae634bb59", "duplicate_failed_command_blocked": false, "block_reason": null, "execution_started": true, @@ -21,7 +21,7 @@ "result_contract_valid": true, "result_contract_status": null, "result_contract_error": null, - "command_rc": 0, + "command_rc": 43, "changes_made": false, "rollback_started": false, "rollback_restored": null, @@ -30,9 +30,9 @@ "secrets_included": false, "private_addresses_included": false, "raw_evidence_retained_locally": true, - "raw_evidence_sha256": "550fefd239af3131158d8df5a4642c83f89f026d19e2b1e4a6d589a6296c395f", - "sanitized_output_sha256": "550fefd239af3131158d8df5a4642c83f89f026d19e2b1e4a6d589a6296c395f", + "raw_evidence_sha256": "16ba01850d81f6abbd81c5322dfb90ebe83f2780ce7f91f057ae10bce56216b0", + "sanitized_output_sha256": "16ba01850d81f6abbd81c5322dfb90ebe83f2780ce7f91f057ae10bce56216b0", "output_truncated_in_json": false, "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", - "output": "SNIKKET_POSTRESTORE_OPS_AUDIT_WRAPPER=V1\nMODE=read-only\nNO_DNS_MUTATION=true\nNO_VM_MUTATION=true\nNO_CONTAINER_RESTART=true\nNO_SERVICE_START=true\nNO_SOURCE_MUTATION=true\nHOST_PVE01=true\nINGRESS_HOSTKEY_SELF_BOUND=true\nVM150_INVENTORY_PRESENT=true\nVM150_RUNNING=true\nVM150_EXPECTED_NODE=true\nVM130_INVENTORY_PRESENT=true\nVM130_RUNNING=true\nVM130_EXPECTED_NODE=true\nVM150_QM_CONFIG_RC=0\nVM150_ONBOOT=true\nVM150_AGENT_CONFIGURED=false\nVM150_SNAPSHOT_COUNT=0\nPVE_BACKUP_JOBS_QUERY_RC=0\nPVE_BACKUP_JOB_COVERAGE_COUNT=0\nPVE_BACKUP_JOB_ENABLED_COVERAGE_COUNT=0\n File \"\", line 8\n open(sys.argv[2],'w').write('\n ^\nSyntaxError: unterminated string literal (detected at line 8)\nbash: line 91: /tmp/w2-snikket-99576.TklpZd/storage.list: No such file or directory\nPVE_VM150_BACKUP_OBJECT_COUNT=0\nPVE_VM150_BACKUP_STORAGE_WITH_OBJECT_COUNT=0\nPVE_VM150_NEWEST_BACKUP_AGE_HOURS=-1\nPVE_VM150_BACKUP_WITHIN_48H=false\nPVE_VM150_BACKUP_WITHIN_7D=false\nHOMELAB_BACKUP_V2_TIMER_ACTIVE=active\nHOMELAB_BACKUP_V2_TIMER_ENABLED=enabled\nHOMELAB_BACKUP_V2_TIMER_RESULT=success\nHOMELAB_BACKUP_V2_TIMER_EXEC_MAIN_STATUS=\nHOMELAB_BACKUP_V2_SERVICE_ACTIVE=activating\nHOMELAB_BACKUP_V2_SERVICE_ENABLED=static\nHOMELAB_BACKUP_V2_SERVICE_RESULT=success\nHOMELAB_BACKUP_V2_SERVICE_EXEC_MAIN_STATUS=0\nHOMELAB_BACKUP_AUDIT_TIMER_ACTIVE=active\nHOMELAB_BACKUP_AUDIT_TIMER_ENABLED=enabled\nHOMELAB_BACKUP_AUDIT_TIMER_RESULT=success\nHOMELAB_BACKUP_AUDIT_TIMER_EXEC_MAIN_STATUS=\nHOMELAB_BACKUP_AUDIT_SERVICE_ACTIVE=inactive\nHOMELAB_BACKUP_AUDIT_SERVICE_ENABLED=static\nHOMELAB_BACKUP_AUDIT_SERVICE_RESULT=success\nHOMELAB_BACKUP_AUDIT_SERVICE_EXEC_MAIN_STATUS=0\nBACKUP_V2_UNIT_SHA256=34025d4708ad366ad6948439f8f82e8543159337117f4d5631fd7c94f2795ffb\nBACKUP_AUDIT_UNIT_SHA256=f54a3f6fc2a7404f66123f3721f2ed5903b51ca09e91907d488fd0f42e9a0fc4\nBACKUP_V2_SCRIPT_SNIKKET_REF_COUNT=0\nBACKUP_V2_JOURNAL_30D_SNIKKET_REF_COUNT=28\nBACKUP_V2_JOURNAL_30D_FAIL_WORD_COUNT=396\nBACKUP_AUDIT_JOURNAL_30D_SNIKKET_REF_COUNT=191\nBACKUP_AUDIT_JOURNAL_30D_RESTORE_REF_COUNT=172\nSOURCE_GIT_REPO_SCAN_COUNT=64\nSOURCE_DNS_REPO_MATCH_COUNT=49\nSOURCE_DNS_TRACKED_FILE_MATCH_COUNT=832\nSOURCE_DNS_ALL3_IN_ONE_TRACKED_FILE_COUNT=391\nSOURCE_DNS_LIKELY_DESIRED_FILE_COUNT=98\nSOURCE_RECON_REPO_MATCH_COUNT=49\nSOURCE_RECON_LIKELY_SOURCE_FILE_COUNT=147\nSOURCE_RECON_EXACT_SHA_MATCH_COUNT=0\nHOMELAB_EXTERNAL_PROBE_VPS_HEALTH_TIMER_ACTIVE=active\nHOMELAB_EXTERNAL_PROBE_VPS_HEALTH_TIMER_ENABLED=enabled\nHOMELAB_KUMA_MONITOR_POLICY_TIMER_ACTIVE=active\nHOMELAB_KUMA_MONITOR_POLICY_TIMER_ENABLED=enabled\nHOMELAB_OVERALL_HEALTH_TIMER_ACTIVE=active\nHOMELAB_OVERALL_HEALTH_TIMER_ENABLED=enabled\nHOMELAB_ALERTING_HEALTH_TIMER_ACTIVE=active\nHOMELAB_ALERTING_HEALTH_TIMER_ENABLED=enabled\n File \"\", line 23\n text='\n ^\nSyntaxError: unterminated string literal (detected at line 23)\nPUBLIC_CHAT_GRAM1_RU_DNS_OK=true\nPUBLIC_CHAT_GRAM1_RU_HTTPS_OK=true\nPUBLIC_CHAT_GRAM1_RU_HTTPS_CODE=302\nPUBLIC_GROUPS_CHAT_GRAM1_RU_DNS_OK=true\nPUBLIC_GROUPS_CHAT_GRAM1_RU_HTTPS_OK=true\nPUBLIC_GROUPS_CHAT_GRAM1_RU_HTTPS_CODE=301\nPUBLIC_SHARE_CHAT_GRAM1_RU_DNS_OK=true\nPUBLIC_SHARE_CHAT_GRAM1_RU_HTTPS_OK=true\nPUBLIC_SHARE_CHAT_GRAM1_RU_HTTPS_CODE=301\nPUBLIC_DNS_OK_COUNT=3\nPUBLIC_HTTPS_OK_COUNT=3\nPVE01_PUBLIC_TCP_80_OPEN=true\nPVE01_PUBLIC_TCP_443_OPEN=true\nPVE01_PUBLIC_TCP_5000_OPEN=true\nPVE01_PUBLIC_TCP_5222_OPEN=true\nPVE01_PUBLIC_TCP_5269_OPEN=true\nPVE01_PUBLIC_TCP_3479_OPEN=true\nPVE01_PUBLIC_TCP_5349_OPEN=true\nPVE01_PUBLIC_TCP_5350_OPEN=true\nPVE01_PUBLIC_STUN_3479_PASS=true\nPVE01_PUBLIC_STUN_3479_CLASS=BINDING_SUCCESS\nPUBLIC_CERT_PRESENT=true\nPUBLIC_CERT_DAYS_REMAINING=39\nPUBLIC_CERT_SAN_CHAT=true\nVM150_QGA_PING=true\nVM150_QGA_EXEC_INIT_RC=0\nVM150_QGA_POLL_RC=0\nVM150_GUEST_EXITCODE=0\nVM150_GUEST_OUTPUT_MARKER=true\nSNIKKET_POSTRESTORE_OPS_GUEST_AUDIT=V1\nMODE=read-only\nNO_DNS_MUTATION=true\nNO_VM_MUTATION=true\nNO_CONTAINER_RESTART=true\nNO_SERVICE_START=true\nNO_SOURCE_MUTATION=true\nGUEST_HOSTNAME_SNIKKET=true\nGUEST_OS_ID=debian\nGUEST_OS_VERSION_ID=13\nDOCKER_SERVER_VERSION=26.1.5+dfsg1\nDOCKER_SERVICE_ACTIVE=active\nDOCKER_SERVICE_ENABLED=enabled\nCONTAINER_SNIKKET_RUNNING=true\nCONTAINER_SNIKKET_RESTART_COUNT=0\nIMAGE_SNIKKET_REF_SHA256=90021787527fca4ce74e831ccee538a0f6ed610b25a09ccf6f8a5fa36be16854\nIMAGE_SNIKKET_VERSION=UNKNOWN\nIMAGE_SNIKKET_REVISION_SHA256=5fd65d0d2176256727f7262622feba743256548e0fb32e898f3130fad7dc0ab0\nIMAGE_SNIKKET_CREATED=2026-06-12T14:41:53.\nCONTAINER_PROXY_RUNNING=true\nCONTAINER_PROXY_RESTART_COUNT=0\nIMAGE_PROXY_REF_SHA256=5a8598acfb66e46734b4723dc0b39e6746fa78beea110ddc4e22f0ea9b2d16dd\nIMAGE_PROXY_VERSION=UNKNOWN\nIMAGE_PROXY_REVISION_SHA256=95641b2ebc3894038678fcff2dea0c9aca19296b492904822bb83c404f1e530f\nIMAGE_PROXY_CREATED=2026-06-12T14:44:44.\nCONTAINER_CERTS_RUNNING=true\nCONTAINER_CERTS_RESTART_COUNT=0\nIMAGE_CERTS_REF_SHA256=3e42ce0a19bdc3fd01ce94c3a0610b9819b92a91e3377ad919f19462935c36e5\nIMAGE_CERTS_VERSION=UNKNOWN\nIMAGE_CERTS_REVISION_SHA256=183d76cbb4f298cd4bf8ad98f0e20a058be9590d187ebf17f4bfc854816d3f70\nIMAGE_CERTS_CREATED=2026-06-12T14:34:03.\nCONTAINER_PORTAL_RUNNING=true\nCONTAINER_PORTAL_RESTART_COUNT=0\nIMAGE_PORTAL_REF_SHA256=90841487d94e1720f5377e5e9df74fd2f14fa0be8553a5ae0098e8daa3f234e7\nIMAGE_PORTAL_VERSION=UNKNOWN\nIMAGE_PORTAL_REVISION_SHA256=d6de54b097cc2bc39eff3f505970ebd7d112211a1ac48f862907e8393602da21\nIMAGE_PORTAL_CREATED=2026-06-12T14:43:49.\nFILE_DOCKER_COMPOSE_YML_PRESENT=true\nFILE_DOCKER_COMPOSE_YML_SHA256=637ff81a1bd59446516782e8d89beeb4be8838b2f3577d07b2280e82a8484f58\nFILE_DOCKER_COMPOSE_OVERRIDE_YML_PRESENT=true\nFILE_DOCKER_COMPOSE_OVERRIDE_YML_SHA256=54a42711db5c2eb99b3886184c7ce3e01a30aba844ff2022bc74a45414a2241c\nFILE_SNIKKET_CONF_PRESENT=true\nFILE_SNIKKET_CONF_SHA256=43a91b1819fbcfc446f57f45a741b40558e9728963ecdfd09a01df33c64deb97\nFILE_COTURN_RUN_PRESENT=true\nFILE_COTURN_RUN_SHA256=2de0e47c09b3b4fc7a6c32c5ef061efaaa7c7f4db3d7a25fdf4da8fbb2e6f483\nFILE_COTURN_RUN_UPSTREAM_PRESENT=true\nFILE_COTURN_RUN_UPSTREAM_SHA256=6b3e7dce49b399ae3dc6d461a60e43c9dfc7c31a4fb11e8d5acf9f0a5b06cdb0\nDOCKER_COMPOSE_CONFIG_RC=0\nSNIKKET_DOMAIN_OK=true\nTURN_ENV_PORT_3479=true\nTURN_ENV_RELAY_RANGE_OK=true\nSNIKKET_RETENTION_DAYS_SET=false\nSNIKKET_RETENTION_DAYS_VALUE=DEFAULT\nSNIKKET_UPLOAD_STORAGE_GB_SET=false\nSNIKKET_UPLOAD_STORAGE_GB_VALUE=UNLIMITED_DEFAULT\nSNIKKET_UPDATE_CHECK_EFFECTIVE=true\nSNIKKET_TLS_PROFILE=DEFAULT\nGUEST_ROOT_FS_USED_PERCENT=4\nSNIKKET_DATA_MOUNT_PRESENT=true\nSNIKKET_DATA_BYTES=249208\nSNIKKET_DATA_MOUNT_PATH_SHA256=3e0588a2a1a406dcc977be380cefce0052aeb6d9b0ad7c75e0e884de626d33a3\nCERT_PRESENT=true\nCERT_DAYS_REMAINING=39\nCERT_NOTAFTER_SHA256=3a60a16e36e46a398f33d228be913dd27dbcba4e1dec068e2c5c724190bc01bc\nCERT_SAN_CHAT=true\nCERT_SAN_GROUPS=true\nCERT_SAN_SHARE=true\nCERT_MTIME_EPOCH=1791161208\nCERTS_LOG_30D_LINE_COUNT=741\nCERTS_LOG_30D_ERROR_WORD_COUNT=0\nCERTS_LOG_30D_RENEW_WORD_COUNT=39\nCERTS_LOG_30D_SHA256=e4eebfcbb18a9ac352e34a3508fd80d339950415bfe71960afda5bbeb4ff4c16\nTCP_80_LISTEN_COUNT=2\nTCP_443_LISTEN_COUNT=2\nTCP_5000_LISTEN_COUNT=2\nTCP_5222_LISTEN_COUNT=2\nTCP_5269_LISTEN_COUNT=2\nTCP_3479_LISTEN_COUNT=16\nTCP_5349_LISTEN_COUNT=16\nTCP_5350_LISTEN_COUNT=16\nUDP_3479_LISTEN_COUNT=16\nUDP_5349_LISTEN_COUNT=16\nUDP_5350_LISTEN_COUNT=16\nTURN_LOCAL_STUN_3479_PASS=true\nTURN_LOCAL_STUN_3479_CLASS=BINDING_SUCCESS\nRECON_SCRIPT_SHA256=bb692a3a044d41e6e04518aff5bdfa646f533660a70ea793f87d040c881a6e98\nRECON_SCRIPT_SHA_MATCH_FINAL=true\nRECON_SCRIPT_BASH_N_RC=0\nRECON_OLD_PORT_LOOP_COUNT=0\nRECON_NEW_PORT_LOOP_COUNT=2\nRECON_GOOD_PKILL_X_COUNT=1\nSNIKKET_TURN_RECONCILE_TIMER_ACTIVE=active\nSNIKKET_TURN_RECONCILE_TIMER_ENABLED=enabled\nSNIKKET_TURN_RECONCILE_TIMER_RESULT=success\nSNIKKET_TURN_RECONCILE_TIMER_EXEC_MAIN_STATUS=\nSNIKKET_TURN_RECONCILE_SERVICE_ACTIVE=inactive\nSNIKKET_TURN_RECONCILE_SERVICE_ENABLED=static\nSNIKKET_TURN_RECONCILE_SERVICE_RESULT=success\nSNIKKET_TURN_RECONCILE_SERVICE_EXEC_MAIN_STATUS=0\nSNIKKET_EDGE_EGRESS_SERVICE_ACTIVE=active\nSNIKKET_EDGE_EGRESS_SERVICE_ENABLED=enabled\nSNIKKET_EDGE_EGRESS_SERVICE_RESULT=success\nSNIKKET_EDGE_EGRESS_SERVICE_EXEC_MAIN_STATUS=0\nLOCAL_CHAT_HTTPS_RC=0\nLOCAL_CHAT_HTTPS_CODE=302\nGUEST_SNIKKET_UNIT_COUNT=3\nGUEST_SNIKKET_TIMER_COUNT=1\nGUEST_SNIKKET_CRON_FILE_COUNT=0\nGUEST_CURRENT_CORE_HEALTH=true\nCURRENT_SERVICE_HEALTH=PASS\nOPS_AUDIT_COMPLETE=true\nDECISION=ANALYZE_SNIKKET_POSTRESTORE_OPS_AUDIT\nNEXT_GATE=EVIDENCE_BACKED_HARDENING_ONLY\nTASK_RESULT=SNIKKET_POSTRESTORE_OPS_AUDIT\nCHANGES_MADE=false\nROLLBACK_STARTED=false\nROLLBACK_RESTORED=null\nMUTATION_OUTCOME=NO_MUTATION\n" + "output": "SKLADCHIK_DURABILITY_BACKUP_PRODUCER_RCA=V1\nNO_MAIL_SEND=true\nNO_SERVICE_RESTART=true\nNO_TIMER_MUTATION=true\nNO_NETWORK_MUTATION=true\nNO_SOURCE_MUTATION=true\nNO_BACKUP_MUTATION=true\nNO_GIT_PUSH=true\nMODE=read-only\nHOST_PVE01=true\nPRODUCER_VM170_QM_RC=0\nPRODUCER_VM170_STDERR_PRESENT=false\nPRODUCER_VM170_JSON=true\nPRODUCER_VM170_GUEST_EXITCODE=0\nVM170_MONITOR_SHA=19123e359f2f7b9a2d373fd7e4464dd426d31b91cabc567c252e70cad40d77c8\nVM170_TIMER_ACTIVE=active\nVM170_TIMER_ENABLED=enabled\nVM170_SERVICE_RESULT=success\nVM170_HEALTH_STATUS=OK\\nVM170_HEALTH_TS=2026-10-05T06:43:23Z\\nVM170_HEALTH_REPORTS=22\\nVM170_HEALTH_OPEN=13\\nVM170_HEALTH_RESOLVED=9\\n\nVM170_BASELINE_OK=false\nSUPERVISOR_PRESENT=true\nSUPERVISOR_SHA=3a9bf9f3f9c28dbf670300f0851a5b7f86eb41fa41cdf44d0935337ae8ef02a2\nSUPERVISOR_BASENAME=skladchik-reports-monitor-supervisor\nSUPERVISOR_AST_OK=true\nSUPERVISOR_FUNCTION_COUNT=16\nSUPERVISOR_FUNCTIONS=now,iso,log,run,parse_env_text,read_env_file,age_seconds_from_ts,ssh_edge,edge_mail,systemctl_props,gather,render_body,write_health,read_state,write_state,main\nSUPERVISOR_CLI_OPTION_COUNT=0\nSUPERVISOR_CLI_OPTIONS=NONE\nSUPERVISOR_ENV_NAME_COUNT=5\nSUPERVISOR_ENV_NAMES=SKLADCHIK_BACKUP_HEALTH_MAX_SECONDS,SKLADCHIK_COOKIE_EXPIRY_WARN_SECONDS,SKLADCHIK_EDGE,SKLADCHIK_MONITOR_HEALTH_MAX_SECONDS,SKLADCHIK_RESTORE_HEALTH_MAX_SECONDS\nSUPERVISOR_RELEVANT_FUNCTION_COUNT=4\nSUPERVISOR_FUNC_1_NAME=parse_env_text\nSUPERVISOR_FUNC_1_LINENO=51\nSUPERVISOR_FUNC_1_ENDLINENO=58\nSUPERVISOR_FUNC_1_NAMES=d,k,line,split,splitlines,startswith,strip,text,v\nSUPERVISOR_FUNC_1_AST_BEGIN\nFunctionDef(\n name='parse_env_text',\n args=arguments(\n args=[\n arg(arg='text')]),\n body=[\n Assign(\n targets=[\n Name(id='d', ctx=Store())],\n value=Dict()),\n For(\n target=Name(id='line', ctx=Store()),\n iter=Call(\n func=Attribute(\n value=BoolOp(\n op=Or(),\n values=[\n Name(id='text', ctx=Load()),\n Constant(value='')]),\n attr='splitlines',\n ctx=Load())),\n body=[\n If(\n test=BoolOp(\n op=Or(),\n values=[\n UnaryOp(\n op=Not(),\n operand=Name(id='line', ctx=Load())),\n Call(\n func=Attribute(\n value=Name(id='line', ctx=Load()),\n attr='startswith',\n ctx=Load()),\n args=[\n Constant(value='#')]),\n Compare(\n left=Constant(value='='),\n ops=[\n NotIn()],\n comparators=[\n Name(id='line', ctx=Load())])]),\n body=[\n Continue()]),\n Assign(\n targets=[\n Tuple(\n elts=[\n Name(id='k', ctx=Store()),\n Name(id='v', ctx=Store())],\n ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='line', ctx=Load()),\n attr='split',\n ctx=Load()),\n args=[\n Constant(value='='),\n Constant(value=1)])),\n Assign(\n targets=[\n Subscript(\n value=Name(id='d', ctx=Load()),\n slice=Call(\n func=Attribute(\n value=Name(id='k', ctx=Load()),\n attr='strip',\n ctx=Load())),\n ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='v', ctx=Load()),\n attr='strip',\n ctx=Load())))]),\n Return(\n value=Name(id='d', ctx=Load()))])\nSUPERVISOR_FUNC_1_AST_END\nSUPERVISOR_FUNC_2_NAME=gather\nSUPERVISOR_FUNC_2_LINENO=110\nSUPERVISOR_FUNC_2_ENDLINENO=347\nSUPERVISOR_FUNC_2_NAMES=APP_FRESHNESS_PROBE,Exception,M,MONITOR_HEALTH_AGE_MAX,Path,S,age_seconds_from_ts,append,base,core_cmd,facts,files,get,group,health_age,int,items,k,local_units,m,mon,name,opened,out,p,parse_env_text,probe,probe_out,probe_rc,problems,props,quote,rc,re,read_text,reg_cmd,reg_out,reg_rc,registry_source,replace,reports,resolved,route,route_lines,run,search,section,shlex,splitlines,ssh_edge,startswith,str,strip,systemctl_props,timer_active,timer_enabled,timers_text,u,wm,worker_path,worker_target,worker_text\nSUPERVISOR_FUNC_2_AST_BEGIN\nFunctionDef(\n name='gather',\n args=arguments(),\n body=[\n Assign(\n targets=[\n Name(id='facts', ctx=Store())],\n value=Dict()),\n Assign(\n targets=[\n Name(id='problems', ctx=Store())],\n value=List(ctx=Load())),\n Assign(\n targets=[\n Name(id='core_cmd', ctx=Store())],\n value=Constant(value='')),\n Assign(\n targets=[\n Tuple(\n elts=[\n Name(id='rc', ctx=Store()),\n Name(id='out', ctx=Store())],\n ctx=Store())],\n value=Call(\n func=Name(id='ssh_edge', ctx=Load()),\n args=[\n Name(id='core_cmd', ctx=Load())],\n keywords=[\n keyword(\n arg='timeout',\n value=Constant(value=45))])),\n Assign(\n targets=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='core_ssh_rc'),\n ctx=Store())],\n value=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Name(id='rc', ctx=Load())])),\n If(\n test=Compare(\n left=Name(id='rc', ctx=Load()),\n ops=[\n NotEq()],\n comparators=[\n Constant(value=0)]),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='core_ssh_failed')]))]),\n FunctionDef(\n name='section',\n args=arguments(\n args=[\n arg(arg='name')]),\n body=[\n Assign(\n targets=[\n Name(id='m', ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='re', ctx=Load()),\n attr='search',\n ctx=Load()),\n args=[\n JoinedStr(\n values=[\n Constant(value='__'),\n FormattedValue(\n value=Name(id='name', ctx=Load()),\n conversion=-1),\n Constant(value='_BEGIN__\\\\n(.*?)\\\\n__'),\n FormattedValue(\n value=Name(id='name', ctx=Load()),\n conversion=-1),\n Constant(value='_END__')]),\n Name(id='out', ctx=Load()),\n Attribute(\n value=Name(id='re', ctx=Load()),\n attr='S',\n ctx=Load())])),\n Return(\n value=IfExp(\n test=Name(id='m', ctx=Load()),\n body=Call(\n func=Attribute(\n value=Call(\n func=Attribute(\n value=Name(id='m', ctx=Load()),\n attr='group',\n ctx=Load()),\n args=[\n Constant(value=1)]),\n attr='strip',\n ctx=Load())),\n orelse=Constant(value='')))]),\n Assign(\n targets=[\n Name(id='mon', ctx=Store())],\n value=Call(\n func=Name(id='parse_env_text', ctx=Load()),\n args=[\n Call(\n func=Name(id='section', ctx=Load()),\n args=[\n Constant(value='MONITOR_HEALTH')])])),\n Assign(\n targets=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_status'),\n ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='mon', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='STATUS'),\n Constant(value='MISSING')])),\n Assign(\n targets=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_reports'),\n ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='mon', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='reports'),\n Constant(value='')])),\n Assign(\n targets=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_open'),\n ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='mon', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='open'),\n Constant(value='')])),\n Assign(\n targets=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_resolved'),\n ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='mon', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='resolved'),\n Constant(value='')])),\n Assign(\n targets=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_smtp_configured'),\n ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='mon', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='smtp_configured'),\n Constant(value='')])),\n Assign(\n targets=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_health_age_seconds'),\n ctx=Store())],\n value=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Call(\n func=Name(id='age_seconds_from_ts', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='mon', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='TS')])])])),\n If(\n test=Compare(\n left=Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_status'),\n ctx=Load()),\n ops=[\n NotEq()],\n comparators=[\n Constant(value='OK')]),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='monitor_status_not_ok')]))]),\n Try(\n body=[\n Assign(\n targets=[\n Name(id='health_age', ctx=Store())],\n value=Call(\n func=Name(id='int', ctx=Load()),\n args=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_health_age_seconds'),\n ctx=Load())])),\n If(\n test=Compare(\n left=Name(id='health_age', ctx=Load()),\n ops=[\n Gt()],\n comparators=[\n Name(id='MONITOR_HEALTH_AGE_MAX', ctx=Load())]),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='monitor_health_stale')]))])],\n handlers=[\n ExceptHandler(\n type=Name(id='Exception', ctx=Load()),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='monitor_health_age_invalid')]))])]),\n Try(\n body=[\n Assign(\n targets=[\n Name(id='reports', ctx=Store())],\n value=Call(\n func=Name(id='int', ctx=Load()),\n args=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_reports'),\n ctx=Load())])),\n Assign(\n targets=[\n Name(id='opened', ctx=Store())],\n value=Call(\n func=Name(id='int', ctx=Load()),\n args=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_open'),\n ctx=Load())])),\n Assign(\n targets=[\n Name(id='resolved', ctx=Store())],\n value=Call(\n func=Name(id='int', ctx=Load()),\n args=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_resolved'),\n ctx=Load())])),\n If(\n test=Compare(\n left=Name(id='reports', ctx=Load()),\n ops=[\n LtE()],\n comparators=[\n Constant(value=0)]),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='monitor_reports_zero_or_missing')]))]),\n If(\n test=BoolOp(\n op=Or(),\n values=[\n Compare(\n left=Name(id='opened', ctx=Load()),\n ops=[\n Lt()],\n comparators=[\n Constant(value=0)]),\n Compare(\n left=Name(id='resolved', ctx=Load()),\n ops=[\n Lt()],\n comparators=[\n Constant(value=0)]),\n Compare(\n left=BinOp(\n left=Name(id='opened', ctx=Load()),\n op=Add(),\n right=Name(id='resolved', ctx=Load())),\n ops=[\n NotEq()],\n comparators=[\n Name(id='reports', ctx=Load())])]),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='monitor_counts_invalid')]))])],\n handlers=[\n ExceptHandler(\n type=Name(id='Exception', ctx=Load()),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='monitor_counts_missing')]))])]),\n If(\n test=Compare(\n left=Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_smtp_configured'),\n ctx=Load()),\n ops=[\n NotEq()],\n comparators=[\n Constant(value='yes')]),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='monitor_smtp_not_configured')]))]),\n Assign(\n targets=[\n Name(id='timers_text', ctx=Store())],\n value=Call(\n func=Name(id='section', ctx=Load()),\n args=[\n Constant(value='TIMERS')])),\n Assign(\n targets=[\n Name(id='m', ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='re', ctx=Load()),\n attr='search',\n ctx=Load()),\n args=[\n Constant(value='skladchik-reports-monitor\\\\.timer\\\\s+enabled=([^\\\\s]+)\\\\s+active=([^\\\\s]+)'),\n Name(id='timers_text', ctx=Load())])),\n Assign(\n targets=[\n Name(id='timer_enabled', ctx=Store())],\n value=IfExp(\n test=Name(id='m', ctx=Load()),\n body=Call(\n func=Attribute(\n value=Name(id='m', ctx=Load()),\n attr='group',\n ctx=Load()),\n args=[\n Constant(value=1)]),\n orelse=Constant(value='missing'))),\n Assign(\n targets=[\n Name(id='timer_active', ctx=Store())],\n value=IfExp(\n test=Name(id='m', ctx=Load()),\n body=Call(\n func=Attribute(\n value=Name(id='m', ctx=Load()),\n attr='group',\n ctx=Load()),\n args=[\n Constant(value=2)]),\n orelse=Constant(value='missing'))),\n Assign(\n targets=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_timer_enabled'),\n ctx=Store())],\n value=Name(id='timer_enabled', ctx=Load())),\n Assign(\n targets=[\n Subscript(\n value=Name(id='facts', ctx=Load()),\n slice=Constant(value='monitor_timer_active'),\n ctx=Store())],\n value=Name(id='timer_active', ctx=Load())),\n If(\n test=Compare(\n left=Name(id='timer_enabled', ctx=Load()),\n ops=[\n NotEq()],\n comparators=[\n Constant(value='enabled')]),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='monitor_timer_not_enabled')]))]),\n If(\n test=Compare(\n left=Name(id='timer_active', ctx=Load()),\n ops=[\n NotEq()],\n comparators=[\n Constant(value='active')]),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='monitor_timer_not_active')]))]),\n Assign(\n targets=[\n Name(id='route_lines', ctx=Store())],\n value=Call(\n func=Attribute(\n value=Call(\n func=Name(id='section', ctx=Load()),\n args=[\n Constant(value='ROUTE')]),\n att\n\nSUPERVISOR_FUNC_2_AST_END\nSUPERVISOR_FUNC_3_NAME=render_body\nSUPERVISOR_FUNC_3_LINENO=349\nSUPERVISOR_FUNC_3_ENDLINENO=378\nSUPERVISOR_FUNC_3_NAMES=facts,get,join,lines,none_text,problems,status,str\nSUPERVISOR_FUNC_3_AST_BEGIN\nFunctionDef(\n name='render_body',\n args=arguments(\n args=[\n arg(arg='status'),\n arg(arg='facts'),\n arg(arg='problems'),\n arg(arg='mode')]),\n body=[\n Assign(\n targets=[\n Name(id='none_text', ctx=Store())],\n value=Constant(value='нет')),\n Assign(\n targets=[\n Name(id='lines', ctx=Store())],\n value=List(\n elts=[\n Constant(value='Надзор мониторинга жалоб Складчика'),\n Constant(value=''),\n BinOp(\n left=Constant(value='Статус: '),\n op=Add(),\n right=Name(id='status', ctx=Load())),\n BinOp(\n left=Constant(value='Проблемы: '),\n op=Add(),\n right=IfExp(\n test=Name(id='problems', ctx=Load()),\n body=Call(\n func=Attribute(\n value=Constant(value=', '),\n attr='join',\n ctx=Load()),\n args=[\n Name(id='problems', ctx=Load())]),\n orelse=Name(id='none_text', ctx=Load()))),\n Constant(value=''),\n Constant(value='Основной монитор:'),\n Constant(value=''),\n BinOp(\n left=Constant(value='- status: '),\n op=Add(),\n right=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='monitor_status'),\n Constant(value='')])])),\n BinOp(\n left=Constant(value='- reports: '),\n op=Add(),\n right=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='monitor_reports'),\n Constant(value='')])])),\n BinOp(\n left=Constant(value='- open: '),\n op=Add(),\n right=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='monitor_open'),\n Constant(value='')])])),\n BinOp(\n left=Constant(value='- resolved: '),\n op=Add(),\n right=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='monitor_resolved'),\n Constant(value='')])])),\n BinOp(\n left=Constant(value='- route: '),\n op=Add(),\n right=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='netbird_route'),\n Constant(value='')])])),\n Constant(value=''),\n Constant(value='Canonical backup:'),\n BinOp(\n left=Constant(value='- decision: '),\n op=Add(),\n right=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='canonical_backup_decision'),\n Constant(value='')])])),\n BinOp(\n left=Constant(value='- generation: '),\n op=Add(),\n right=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='canonical_backup_generation'),\n Constant(value='')])])),\n BinOp(\n left=Constant(value='- registry source: '),\n op=Add(),\n right=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='registry_source'),\n Constant(value='')])])),\n BinOp(\n left=Constant(value='- worker target: '),\n op=Add(),\n right=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='worker_target'),\n Constant(value='')])]))],\n ctx=Load())),\n Return(\n value=Call(\n func=Attribute(\n value=Constant(value='\\n'),\n attr='join',\n ctx=Load()),\n args=[\n Name(id='lines', ctx=Load())]))])\nSUPERVISOR_FUNC_3_AST_END\nSUPERVISOR_FUNC_4_NAME=main\nSUPERVISOR_FUNC_4_LINENO=395\nSUPERVISOR_FUNC_4_ENDLINENO=515\nSUPERVISOR_FUNC_4_NAMES=append,argv,edge_mail,facts,gather,get,join,len,log,mail_sent,mode,old,old_status,print,problems,read_state,render_body,status,stderr,subject,sys,write_health,write_state\nSUPERVISOR_FUNC_4_AST_BEGIN\nFunctionDef(\n name='main',\n args=arguments(),\n body=[\n Assign(\n targets=[\n Name(id='mode', ctx=Store())],\n value=IfExp(\n test=Compare(\n left=Call(\n func=Name(id='len', ctx=Load()),\n args=[\n Attribute(\n value=Name(id='sys', ctx=Load()),\n attr='argv',\n ctx=Load())]),\n ops=[\n Gt()],\n comparators=[\n Constant(value=1)]),\n body=Subscript(\n value=Attribute(\n value=Name(id='sys', ctx=Load()),\n attr='argv',\n ctx=Load()),\n slice=Constant(value=1),\n ctx=Load()),\n orelse=Constant(value='check'))),\n If(\n test=Compare(\n left=Name(id='mode', ctx=Load()),\n ops=[\n NotIn()],\n comparators=[\n Tuple(\n elts=[\n Constant(value='check'),\n Constant(value='test')],\n ctx=Load())]),\n body=[\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n Constant(value='usage: skladchik-reports-monitor-supervisor [check|test]')],\n keywords=[\n keyword(\n arg='file',\n value=Attribute(\n value=Name(id='sys', ctx=Load()),\n attr='stderr',\n ctx=Load()))])),\n Return(\n value=Constant(value=2))]),\n Assign(\n targets=[\n Tuple(\n elts=[\n Name(id='facts', ctx=Store()),\n Name(id='problems', ctx=Store())],\n ctx=Store())],\n value=Call(\n func=Name(id='gather', ctx=Load()))),\n Assign(\n targets=[\n Name(id='status', ctx=Store())],\n value=IfExp(\n test=UnaryOp(\n op=Not(),\n operand=Name(id='problems', ctx=Load())),\n body=Constant(value='OK'),\n orelse=Constant(value='FAIL'))),\n If(\n test=Compare(\n left=Name(id='mode', ctx=Load()),\n ops=[\n Eq()],\n comparators=[\n Constant(value='test')]),\n body=[\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n JoinedStr(\n values=[\n Constant(value='SUPERVISOR_STATUS='),\n FormattedValue(\n value=Name(id='status', ctx=Load()),\n conversion=-1)])])),\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n BinOp(\n left=Constant(value='SUPERVISOR_PROBLEMS='),\n op=Add(),\n right=IfExp(\n test=Name(id='problems', ctx=Load()),\n body=Call(\n func=Attribute(\n value=Constant(value=','),\n attr='join',\n ctx=Load()),\n args=[\n Name(id='problems', ctx=Load())]),\n orelse=Constant(value='none')))])),\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n JoinedStr(\n values=[\n Constant(value='MONITOR='),\n FormattedValue(\n value=Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='monitor_status')]),\n conversion=-1),\n Constant(value=' reports='),\n FormattedValue(\n value=Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='monitor_reports')]),\n conversion=-1),\n Constant(value=' open='),\n FormattedValue(\n value=Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='monitor_open')]),\n conversion=-1),\n Constant(value=' resolved='),\n FormattedValue(\n value=Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='monitor_resolved')]),\n conversion=-1)])])),\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n JoinedStr(\n values=[\n Constant(value='CANONICAL_BACKUP='),\n FormattedValue(\n value=Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='canonical_backup_decision')]),\n conversion=-1),\n Constant(value=' generation='),\n FormattedValue(\n value=Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='canonical_backup_generation')]),\n conversion=-1)])])),\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n JoinedStr(\n values=[\n Constant(value='REGISTRY_SOURCE='),\n FormattedValue(\n value=Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='registry_source')]),\n conversion=-1)])])),\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n JoinedStr(\n values=[\n Constant(value='WORKER_TARGET='),\n FormattedValue(\n value=Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='worker_target')]),\n conversion=-1)])])),\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n JoinedStr(\n values=[\n Constant(value='NETBIRD_ROUTE='),\n FormattedValue(\n value=Call(\n func=Attribute(\n value=Name(id='facts', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='netbird_route')]),\n conversion=-1)])])),\n Return(\n value=IfExp(\n test=Compare(\n left=Name(id='status', ctx=Load()),\n ops=[\n Eq()],\n comparators=[\n Constant(value='OK')]),\n body=Constant(value=0),\n orelse=Constant(value=1)))]),\n Assign(\n targets=[\n Name(id='old', ctx=Store())],\n value=Call(\n func=Name(id='read_state', ctx=Load()))),\n Assign(\n targets=[\n Name(id='old_status', ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='old', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='LAST_STATUS'),\n Constant(value='')])),\n Assign(\n targets=[\n Name(id='mail_sent', ctx=Store())],\n value=Constant(value=False)),\n If(\n test=BoolOp(\n op=And(),\n values=[\n Compare(\n left=Name(id='status', ctx=Load()),\n ops=[\n NotEq()],\n comparators=[\n Constant(value='OK')]),\n Compare(\n left=Name(id='old_status', ctx=Load()),\n ops=[\n NotEq()],\n comparators=[\n Constant(value='FAIL')])]),\n body=[\n Assign(\n targets=[\n Name(id='subject', ctx=Store())],\n value=Constant(value='[Складчик] ТРЕВОГА: мониторинг жалоб')),\n Assign(\n targets=[\n Name(id='mail_sent', ctx=Store())],\n value=Call(\n func=Name(id='edge_mail', ctx=Load()),\n args=[\n Name(id='subject', ctx=Load()),\n Call(\n func=Name(id='render_body', ctx=Load()),\n args=[\n Name(id='status', ctx=Load()),\n Name(id='facts', ctx=Load()),\n Name(id='problems', ctx=Load()),\n Name(id='mode', ctx=Load())])])),\n If(\n test=UnaryOp(\n op=Not(),\n operand=Name(id='mail_sent', ctx=Load())),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='supervisor_mail_send_failed')])),\n Assign(\n targets=[\n Name(id='status', ctx=Store())],\n value=Constant(value='FAIL'))])],\n orelse=[\n If(\n test=BoolOp(\n op=And(),\n values=[\n Compare(\n left=Name(id='status', ctx=Load()),\n ops=[\n Eq()],\n comparators=[\n Constant(value='OK')]),\n Compare(\n left=Name(id='old_status', ctx=Load()),\n ops=[\n Eq()],\n comparators=[\n Constant(value='FAIL')])]),\n body=[\n Assign(\n targets=[\n Name(id='subject', ctx=Store())],\n value=Constant(value='[Складчик] ВОССТАНОВЛЕНО: мониторинг жалоб и backup снова OK')),\n Assign(\n targets=[\n Name(id='mail_sent', ctx=Store())],\n value=Call(\n func=Name(id='edge_mail', ctx=Load()),\n args=[\n Name(id='subject', ctx=Load()),\n Call(\n func=Name(id='render_body', ctx=Load()),\n args=[\n Name(id='status', ctx=Load()),\n Name(id='facts', ctx=Load()),\n Name(id='problems', ctx=Load()),\n Name(id='mode', ctx=Load())])])),\n If(\n test=UnaryOp(\n op=Not(),\n operand=Name(id='mail_sent', ctx=Load())),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='problems', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Constant(value='supervisor_mail_send_failed')])),\n Assign(\n targets=[\n Name(id='status', ctx=Store())],\n value=Constant(value='FAIL'))])])]),\n Expr(\n value=Call(\n func=Name(id='write_health', ctx=Load()),\n args=[\n Name(id='status', ctx=Load()),\n Name(id='facts', ctx=Load()),\n Name(id='problems', ctx=Load()),\n Name(id='mail_sent', ctx=Load())])),\n Expr(\n value=Call(\n func=Name(id='write_state', ctx=Load()),\n args=[\n Name(id='status', ctx=Load()),\n Name(id='problems', ctx=Load())])),\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n JoinedStr(\n values=[\n Constant(value='SUPERVISOR_STATUS='),\n FormattedValue(\n value=Name(id='status', ctx=Load()),\n conversion=-1)])])),\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n JoinedStr(\n values=[\n Constant(value='SUPERVISOR_MAIL_SENT='),\n FormattedValue(\n value=IfExp(\n test=Name(id='mail_sent', ctx=Load()),\n body=Constant(value='yes'),\n orelse=Constant(value='no')),\n conversion=-1)])])),\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n BinOp(\n left=Constant(value='SUPERVISOR_PROBLEMS='),\n op=Add(),\n right=IfExp(\n test=Name(id='problems', ctx=Load()),\n body=Call(\n func=Attribute(\n value=Constant(value=','),\n attr='join',\n ctx=Load()),\n args=[\n Name(id='problems', ctx=Load())]),\n orelse=Constant(value='none')))])),\n Expr(\n value=Call(\n func=Name(id='print', ctx=Load()),\n args=[\n JoinedStr(\n values=[\n Constant(value='MONITOR='),\n FormattedValue(\n value=Call(\n \n\nSUPERVISOR_FUNC_4_AST_END\nBACKUP_AUDIT_PRESENT=true\nBACKUP_AUDIT_SHA=1c2cd8a00859492c010ed35baf5eb67f4278544809de8c2563421a6f3e356ed3\nBACKUP_AUDIT_BASENAME=homelab-backup-audit\nBACKUP_AUDIT_AST_OK=true\nBACKUP_AUDIT_FUNCTION_COUNT=7\nBACKUP_AUDIT_FUNCTIONS=run,collect,parse_epoch,latest_legacy,unit_ok,parse_app_plan,expected_v2_heavy_lock_owner\nBACKUP_AUDIT_CLI_OPTION_COUNT=0\nBACKUP_AUDIT_CLI_OPTIONS=NONE\nBACKUP_AUDIT_ENV_NAME_COUNT=0\nBACKUP_AUDIT_ENV_NAMES=NONE\nBACKUP_AUDIT_RELEVANT_FUNCTION_COUNT=4\nBACKUP_AUDIT_FUNC_1_NAME=collect\nBACKUP_AUDIT_FUNC_1_LINENO=34\nBACKUP_AUDIT_FUNC_1_ENDLINENO=39\nBACKUP_AUDIT_FUNC_1_NAMES=append,collect,dict,get,isinstance,list,obj,out,str,v,values\nBACKUP_AUDIT_FUNC_1_AST_BEGIN\nFunctionDef(\n name='collect',\n args=arguments(\n args=[\n arg(arg='obj'),\n arg(arg='out')]),\n body=[\n If(\n test=Call(\n func=Name(id='isinstance', ctx=Load()),\n args=[\n Name(id='obj', ctx=Load()),\n Name(id='dict', ctx=Load())]),\n body=[\n If(\n test=Call(\n func=Name(id='isinstance', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='obj', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='logical_id')]),\n Name(id='str', ctx=Load())]),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='out', ctx=Load()),\n attr='append',\n ctx=Load()),\n args=[\n Name(id='obj', ctx=Load())]))]),\n For(\n target=Name(id='v', ctx=Store()),\n iter=Call(\n func=Attribute(\n value=Name(id='obj', ctx=Load()),\n attr='values',\n ctx=Load())),\n body=[\n Expr(\n value=Call(\n func=Name(id='collect', ctx=Load()),\n args=[\n Name(id='v', ctx=Load()),\n Name(id='out', ctx=Load())]))])],\n orelse=[\n If(\n test=Call(\n func=Name(id='isinstance', ctx=Load()),\n args=[\n Name(id='obj', ctx=Load()),\n Name(id='list', ctx=Load())]),\n body=[\n For(\n target=Name(id='v', ctx=Store()),\n iter=Name(id='obj', ctx=Load()),\n body=[\n Expr(\n value=Call(\n func=Name(id='collect', ctx=Load()),\n args=[\n Name(id='v', ctx=Load()),\n Name(id='out', ctx=Load())]))])])])])\nBACKUP_AUDIT_FUNC_1_AST_END\nBACKUP_AUDIT_FUNC_2_NAME=latest_legacy\nBACKUP_AUDIT_FUNC_2_LINENO=53\nBACKUP_AUDIT_FUNC_2_ENDLINENO=77\nBACKUP_AUDIT_FUNC_2_NAMES=APPREST,Exception,QROOT,VMREST,age,best,best_epoch,d,epoch,gen,get,glob,int,is_dir,is_file,json,kind,loads,logical,max,obj,p,parse_epoch,read_text,restore,rev,rj,rroot,score,st_mtime,stat,str,strict,time\nBACKUP_AUDIT_FUNC_2_AST_BEGIN\nFunctionDef(\n name='latest_legacy',\n args=arguments(\n args=[\n arg(arg='logical'),\n arg(arg='kind')]),\n body=[\n Assign(\n targets=[\n Name(id='d', ctx=Store())],\n value=BinOp(\n left=Name(id='QROOT', ctx=Load()),\n op=Div(),\n right=Name(id='logical', ctx=Load()))),\n Assign(\n targets=[\n Name(id='best', ctx=Store())],\n value=Constant(value=None)),\n Assign(\n targets=[\n Name(id='best_epoch', ctx=Store())],\n value=UnaryOp(\n op=USub(),\n operand=Constant(value=1))),\n If(\n test=UnaryOp(\n op=Not(),\n operand=Call(\n func=Attribute(\n value=Name(id='d', ctx=Load()),\n attr='is_dir',\n ctx=Load()))),\n body=[\n Return(\n value=Constant(value=None))]),\n For(\n target=Name(id='p', ctx=Store()),\n iter=Call(\n func=Attribute(\n value=Name(id='d', ctx=Load()),\n attr='glob',\n ctx=Load()),\n args=[\n Constant(value='*.json')]),\n body=[\n Try(\n body=[\n Assign(\n targets=[\n Name(id='obj', ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='json', ctx=Load()),\n attr='loads',\n ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='p', ctx=Load()),\n attr='read_text',\n ctx=Load()),\n keywords=[\n keyword(\n arg='encoding',\n value=Constant(value='utf-8'))])]))],\n handlers=[\n ExceptHandler(\n type=Name(id='Exception', ctx=Load()),\n body=[\n Continue()])]),\n Assign(\n targets=[\n Name(id='epoch', ctx=Store())],\n value=Call(\n func=Name(id='parse_epoch', ctx=Load()),\n args=[\n Name(id='obj', ctx=Load())])),\n Assign(\n targets=[\n Name(id='score', ctx=Store())],\n value=IfExp(\n test=Compare(\n left=Name(id='epoch', ctx=Load()),\n ops=[\n IsNot()],\n comparators=[\n Constant(value=None)]),\n body=Name(id='epoch', ctx=Load()),\n orelse=Call(\n func=Name(id='int', ctx=Load()),\n args=[\n Attribute(\n value=Call(\n func=Attribute(\n value=Name(id='p', ctx=Load()),\n attr='stat',\n ctx=Load())),\n attr='st_mtime',\n ctx=Load())]))),\n If(\n test=Compare(\n left=Name(id='score', ctx=Load()),\n ops=[\n Gt()],\n comparators=[\n Name(id='best_epoch', ctx=Load())]),\n body=[\n Assign(\n targets=[\n Name(id='best_epoch', ctx=Store())],\n value=Name(id='score', ctx=Load())),\n Assign(\n targets=[\n Name(id='best', ctx=Store())],\n value=Tuple(\n elts=[\n Name(id='p', ctx=Load()),\n Name(id='obj', ctx=Load()),\n Name(id='score', ctx=Load())],\n ctx=Load()))])]),\n If(\n test=UnaryOp(\n op=Not(),\n operand=Name(id='best', ctx=Load())),\n body=[\n Return(\n value=Constant(value=None))]),\n Assign(\n targets=[\n Tuple(\n elts=[\n Name(id='p', ctx=Store()),\n Name(id='obj', ctx=Store()),\n Name(id='epoch', ctx=Store())],\n ctx=Store())],\n value=Name(id='best', ctx=Load())),\n Assign(\n targets=[\n Name(id='gen', ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='obj', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='generation')])),\n Assign(\n targets=[\n Name(id='strict', ctx=Store())],\n value=BoolOp(\n op=And(),\n values=[\n Compare(\n left=Call(\n func=Attribute(\n value=Name(id='obj', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='status')]),\n ops=[\n Eq()],\n comparators=[\n Constant(value='SEALED')]),\n Compare(\n left=Call(\n func=Attribute(\n value=Name(id='obj', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='cloud_quorum')]),\n ops=[\n Eq()],\n comparators=[\n Constant(value=2)]),\n Compare(\n left=Call(\n func=Attribute(\n value=Name(id='obj', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='cloud_a_verified')]),\n ops=[\n Is()],\n comparators=[\n Constant(value=True)]),\n Compare(\n left=Call(\n func=Attribute(\n value=Name(id='obj', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='cloud_b_verified')]),\n ops=[\n Is()],\n comparators=[\n Constant(value=True)]),\n Compare(\n left=Call(\n func=Attribute(\n value=Name(id='obj', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='part_hashes_verified')]),\n ops=[\n Is()],\n comparators=[\n Constant(value=True)]),\n Compare(\n left=Call(\n func=Attribute(\n value=Name(id='obj', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='seal_written')]),\n ops=[\n Is()],\n comparators=[\n Constant(value=True)]),\n Compare(\n left=Call(\n func=Attribute(\n value=Name(id='obj', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='local_payload_present')]),\n ops=[\n Is()],\n comparators=[\n Constant(value=False)]),\n Compare(\n left=Call(\n func=Attribute(\n value=Name(id='obj', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='local_cleanup')]),\n ops=[\n Eq()],\n comparators=[\n Constant(value='OK')])])),\n Assign(\n targets=[\n Name(id='rroot', ctx=Store())],\n value=IfExp(\n test=Compare(\n left=Name(id='kind', ctx=Load()),\n ops=[\n Eq()],\n comparators=[\n Constant(value='VM')]),\n body=Name(id='VMREST', ctx=Load()),\n orelse=Name(id='APPREST', ctx=Load()))),\n Assign(\n targets=[\n Name(id='rev', ctx=Store())],\n value=IfExp(\n test=Name(id='gen', ctx=Load()),\n body=BinOp(\n left=BinOp(\n left=Name(id='rroot', ctx=Load()),\n op=Div(),\n right=Name(id='logical', ctx=Load())),\n op=Div(),\n right=BinOp(\n left=Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Name(id='gen', ctx=Load())]),\n op=Add(),\n right=Constant(value='.json'))),\n orelse=Constant(value=None))),\n Assign(\n targets=[\n Name(id='restore', ctx=Store())],\n value=Constant(value=False)),\n If(\n test=BoolOp(\n op=And(),\n values=[\n Name(id='rev', ctx=Load()),\n Call(\n func=Attribute(\n value=Name(id='rev', ctx=Load()),\n attr='is_file',\n ctx=Load()))]),\n body=[\n Try(\n body=[\n Assign(\n targets=[\n Name(id='rj', ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='json', ctx=Load()),\n attr='loads',\n ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='rev', ctx=Load()),\n attr='read_text',\n ctx=Load()),\n keywords=[\n keyword(\n arg='encoding',\n value=Constant(value='utf-8'))])])),\n Assign(\n targets=[\n Name(id='restore', ctx=Store())],\n value=Compare(\n left=Call(\n func=Attribute(\n value=Name(id='rj', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='result')]),\n ops=[\n Eq()],\n comparators=[\n Constant(value='OK')]))],\n handlers=[\n ExceptHandler(\n type=Name(id='Exception', ctx=Load()),\n body=[\n Pass()])])]),\n Assign(\n targets=[\n Name(id='age', ctx=Store())],\n value=IfExp(\n test=Name(id='epoch', ctx=Load()),\n body=Call(\n func=Name(id='max', ctx=Load()),\n args=[\n Constant(value=0),\n Call(\n func=Name(id='int', ctx=Load()),\n args=[\n BinOp(\n left=Call(\n func=Attribute(\n value=Name(id='time', ctx=Load()),\n attr='time',\n ctx=Load())),\n op=Sub(),\n right=Name(id='epoch', ctx=Load()))])]),\n orelse=Constant(value=None))),\n Return(\n value=Dict(\n keys=[\n Constant(value='generation'),\n Constant(value='strict'),\n Constant(value='restore_ok'),\n Constant(value='age_seconds'),\n Constant(value='state_file'),\n Constant(value='obj')],\n values=[\n Name(id='gen', ctx=Load()),\n Name(id='strict', ctx=Load()),\n Name(id='restore', ctx=Load()),\n Name(id='age', ctx=Load()),\n Call(\n func=Name(id='str', ctx=Load()),\n args=[\n Name(id='p', ctx=Load())]),\n Name(id='obj', ctx=Load())]))])\nBACKUP_AUDIT_FUNC_2_AST_END\nBACKUP_AUDIT_FUNC_3_NAME=parse_app_plan\nBACKUP_AUDIT_FUNC_3_LINENO=84\nBACKUP_AUDIT_FUNC_3_ENDLINENO=93\nBACKUP_AUDIT_FUNC_3_NAMES=d,get,k,line,r,split,splitlines,startswith,tok,txt,v\nBACKUP_AUDIT_FUNC_3_AST_BEGIN\nFunctionDef(\n name='parse_app_plan',\n args=arguments(\n args=[\n arg(arg='txt')]),\n body=[\n Assign(\n targets=[\n Name(id='d', ctx=Store())],\n value=Dict()),\n For(\n target=Name(id='line', ctx=Store()),\n iter=Call(\n func=Attribute(\n value=Name(id='txt', ctx=Load()),\n attr='splitlines',\n ctx=Load())),\n body=[\n If(\n test=Call(\n func=Attribute(\n value=Name(id='line', ctx=Load()),\n attr='startswith',\n ctx=Load()),\n args=[\n Constant(value='QUEUE_FRESHNESS_PLAN APP=')]),\n body=[\n Assign(\n targets=[\n Name(id='r', ctx=Store())],\n value=Dict()),\n For(\n target=Name(id='tok', ctx=Store()),\n iter=Subscript(\n value=Call(\n func=Attribute(\n value=Name(id='line', ctx=Load()),\n attr='split',\n ctx=Load())),\n slice=Slice(\n lower=Constant(value=1)),\n ctx=Load()),\n body=[\n If(\n test=Compare(\n left=Constant(value='='),\n ops=[\n In()],\n comparators=[\n Name(id='tok', ctx=Load())]),\n body=[\n Assign(\n targets=[\n Tuple(\n elts=[\n Name(id='k', ctx=Store()),\n Name(id='v', ctx=Store())],\n ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='tok', ctx=Load()),\n attr='split',\n ctx=Load()),\n args=[\n Constant(value='='),\n Constant(value=1)])),\n Assign(\n targets=[\n Subscript(\n value=Name(id='r', ctx=Load()),\n slice=Name(id='k', ctx=Load()),\n ctx=Store())],\n value=Name(id='v', ctx=Load()))])]),\n If(\n test=Call(\n func=Attribute(\n value=Name(id='r', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='APP')]),\n body=[\n Assign(\n targets=[\n Subscript(\n value=Name(id='d', ctx=Load()),\n slice=Subscript(\n value=Name(id='r', ctx=Load()),\n slice=Constant(value='APP'),\n ctx=Load()),\n ctx=Store())],\n value=Call(\n func=Attribute(\n value=Name(id='r', ctx=Load()),\n attr='get',\n ctx=Load()),\n args=[\n Constant(value='DECISION')]))])])]),\n Return(\n value=Name(id='d', ctx=Load()))])\nBACKUP_AUDIT_FUNC_3_AST_END\nBACKUP_AUDIT_FUNC_4_NAME=expected_v2_heavy_lock_owner\nBACKUP_AUDIT_FUNC_4_LINENO=188\nBACKUP_AUDIT_FUNC_4_ENDLINENO=200\nBACKUP_AUDIT_FUNC_4_NAMES=Exception,_,a,add,arc,fe,fo,frc,int,isdigit,owners,pid,pid_text,prc,replace,run,set,split,strip,tok\nBACKUP_AUDIT_FUNC_4_AST_BEGIN\nFunctionDef(\n name='expected_v2_heavy_lock_owner',\n args=arguments(),\n body=[\n Assign(\n targets=[\n Tuple(\n elts=[\n Name(id='arc', ctx=Store()),\n Name(id='a', ctx=Store()),\n Name(id='_', ctx=Store())],\n ctx=Store())],\n value=Call(\n func=Name(id='run', ctx=Load()),\n args=[\n List(\n elts=[\n Constant(value='systemctl'),\n Constant(value='show'),\n Constant(value='homelab-backup-v2.service'),\n Constant(value='-p'),\n Constant(value='ActiveState'),\n Constant(value='--value')],\n ctx=Load()),\n Constant(value=10)])),\n Assign(\n targets=[\n Tuple(\n elts=[\n Name(id='prc', ctx=Store()),\n Name(id='pid_text', ctx=Store()),\n Name(id='_', ctx=Store())],\n ctx=Store())],\n value=Call(\n func=Name(id='run', ctx=Load()),\n args=[\n List(\n elts=[\n Constant(value='systemctl'),\n Constant(value='show'),\n Constant(value='homelab-backup-v2.service'),\n Constant(value='-p'),\n Constant(value='MainPID'),\n Constant(value='--value')],\n ctx=Load()),\n Constant(value=10)])),\n If(\n test=BoolOp(\n op=Or(),\n values=[\n Compare(\n left=Name(id='arc', ctx=Load()),\n ops=[\n NotEq()],\n comparators=[\n Constant(value=0)]),\n Compare(\n left=Name(id='prc', ctx=Load()),\n ops=[\n NotEq()],\n comparators=[\n Constant(value=0)]),\n Compare(\n left=Call(\n func=Attribute(\n value=Name(id='a', ctx=Load()),\n attr='strip',\n ctx=Load())),\n ops=[\n NotIn()],\n comparators=[\n Tuple(\n elts=[\n Constant(value='active'),\n Constant(value='activating')],\n ctx=Load())])]),\n body=[\n Return(\n value=Constant(value=False))]),\n Try(\n body=[\n Assign(\n targets=[\n Name(id='pid', ctx=Store())],\n value=Call(\n func=Name(id='int', ctx=Load()),\n args=[\n Call(\n func=Attribute(\n value=Name(id='pid_text', ctx=Load()),\n attr='strip',\n ctx=Load()))]))],\n handlers=[\n ExceptHandler(\n type=Name(id='Exception', ctx=Load()),\n body=[\n Return(\n value=Constant(value=False))])]),\n If(\n test=Compare(\n left=Name(id='pid', ctx=Load()),\n ops=[\n LtE()],\n comparators=[\n Constant(value=0)]),\n body=[\n Return(\n value=Constant(value=False))]),\n Assign(\n targets=[\n Tuple(\n elts=[\n Name(id='frc', ctx=Store()),\n Name(id='fo', ctx=Store()),\n Name(id='fe', ctx=Store())],\n ctx=Store())],\n value=Call(\n func=Name(id='run', ctx=Load()),\n args=[\n List(\n elts=[\n Constant(value='fuser'),\n Constant(value='/run/homelab-backup-heavy.lock')],\n ctx=Load()),\n Constant(value=10)])),\n Assign(\n targets=[\n Name(id='owners', ctx=Store())],\n value=Call(\n func=Name(id='set', ctx=Load()))),\n For(\n target=Name(id='tok', ctx=Store()),\n iter=Call(\n func=Attribute(\n value=Call(\n func=Attribute(\n value=BinOp(\n left=BinOp(\n left=Name(id='fo', ctx=Load()),\n op=Add(),\n right=Constant(value=' ')),\n op=Add(),\n right=Name(id='fe', ctx=Load())),\n attr='replace',\n ctx=Load()),\n args=[\n Constant(value=':'),\n Constant(value=' ')]),\n attr='split',\n ctx=Load())),\n body=[\n If(\n test=Call(\n func=Attribute(\n value=Name(id='tok', ctx=Load()),\n attr='isdigit',\n ctx=Load())),\n body=[\n Expr(\n value=Call(\n func=Attribute(\n value=Name(id='owners', ctx=Load()),\n attr='add',\n ctx=Load()),\n args=[\n Call(\n func=Name(id='int', ctx=Load()),\n args=[\n Name(id='tok', ctx=Load())])]))])]),\n Return(\n value=BoolOp(\n op=And(),\n values=[\n Compare(\n left=Name(id='frc', ctx=Load()),\n ops=[\n Eq()],\n comparators=[\n Constant(value=0)]),\n Compare(\n left=Name(id='owners', ctx=Load()),\n ops=[\n Eq()],\n comparators=[\n Set(\n elts=[\n Name(id='pid', ctx=Load())])])]))])\nBACKUP_AUDIT_FUNC_4_AST_END\nQUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_PRESENT=true\nQUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_SHA=1f959049cca2710a2cb820cc1f6acab16399c6b6711b9e4522e0ecd49e0e4650\nQUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_BASENAME=homelab-app-cloud-quorum-queue\nQUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_AST_OK=false\nQUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_AST_ERROR=SyntaxError\nQUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_HELP_RC=64\nQUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_HELP_SHA=53bc0423b5ea9142a7be1f687f1572975bc52349a1fd28f97d6c0748b2b445e1\nQUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_HELP_BEGIN\n\nAPP_QUORUM_QUEUE_ERROR=ACTION_INVALID\nQUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_HELP_END\nPRODUCER_SCRIPT_COUNT=3\nPRODUCER_UNIT_COUNT=4\nPRODUCER_UNIT_1_NAME=homelab-app-cloud-quorum-queue.service\nPRODUCER_UNIT_1_SHOW_RC=0\nPRODUCER_UNIT_1_LOADSTATE=loaded\nPRODUCER_UNIT_1_ACTIVESTATE=inactive\nPRODUCER_UNIT_1_UNITFILESTATE=static\nPRODUCER_UNIT_1_RESULT=success\nPRODUCER_UNIT_1_EXECMAINSTATUS=0\nPRODUCER_UNIT_1_FRAGMENT_BASENAME=homelab-app-cloud-quorum-queue.service\nPRODUCER_UNIT_1_FRAGMENT_SHA=afaa997bd85dafdb29d2cd2b53527996171c21fd5e80ae559f8f2bee0dcbbf1a\nPRODUCER_UNIT_1_EXECSTART_SHA=22094bb14d8dc5f7399744e183b096583a9c9625527a2f00981f2ec5cd8e1713\nPRODUCER_UNIT_1_EXEC_COMPONENTS=NONE\nPRODUCER_UNIT_1_ENVFILES_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nPRODUCER_UNIT_2_NAME=homelab-app-cloud-quorum-queue.timer\nPRODUCER_UNIT_2_SHOW_RC=0\nPRODUCER_UNIT_2_LOADSTATE=loaded\nPRODUCER_UNIT_2_ACTIVESTATE=active\nPRODUCER_UNIT_2_UNITFILESTATE=enabled\nPRODUCER_UNIT_2_RESULT=success\nPRODUCER_UNIT_2_EXECMAINSTATUS=\nPRODUCER_UNIT_2_FRAGMENT_BASENAME=homelab-app-cloud-quorum-queue.timer\nPRODUCER_UNIT_2_FRAGMENT_SHA=af2eedce3df53029b591d31715a3f3e6688ddb997b4823f487e70c339ce88078\nPRODUCER_UNIT_2_EXECSTART_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nPRODUCER_UNIT_2_EXEC_COMPONENTS=NONE\nPRODUCER_UNIT_2_ENVFILES_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nPRODUCER_UNIT_3_NAME=skladchik-reports-monitor-supervisor.service\nPRODUCER_UNIT_3_SHOW_RC=0\nPRODUCER_UNIT_3_LOADSTATE=loaded\nPRODUCER_UNIT_3_ACTIVESTATE=inactive\nPRODUCER_UNIT_3_UNITFILESTATE=static\nPRODUCER_UNIT_3_RESULT=success\nPRODUCER_UNIT_3_EXECMAINSTATUS=0\nPRODUCER_UNIT_3_FRAGMENT_BASENAME=skladchik-reports-monitor-supervisor.service\nPRODUCER_UNIT_3_FRAGMENT_SHA=e874fb03573b76181f3eb812c7285848e60705923c172a2f102504a7b9100ef7\nPRODUCER_UNIT_3_EXECSTART_SHA=27a2477643cbfc4f8676fd88ebc5cff23e471bc80f89094941123fa62e3edc5f\nPRODUCER_UNIT_3_EXEC_COMPONENTS=skladchik-reports-monitor-supervisor\nPRODUCER_UNIT_3_ENVFILES_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nPRODUCER_UNIT_4_NAME=skladchik-reports-monitor-supervisor.timer\nPRODUCER_UNIT_4_SHOW_RC=0\nPRODUCER_UNIT_4_LOADSTATE=loaded\nPRODUCER_UNIT_4_ACTIVESTATE=active\nPRODUCER_UNIT_4_UNITFILESTATE=enabled\nPRODUCER_UNIT_4_RESULT=success\nPRODUCER_UNIT_4_EXECMAINSTATUS=\nPRODUCER_UNIT_4_FRAGMENT_BASENAME=skladchik-reports-monitor-supervisor.timer\nPRODUCER_UNIT_4_FRAGMENT_SHA=3c3e38a40b3dfbfaa77d99a1c2bea4b58009130eac7a5197356dead1137a5ef6\nPRODUCER_UNIT_4_EXECSTART_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nPRODUCER_UNIT_4_EXEC_COMPONENTS=NONE\nPRODUCER_UNIT_4_ENVFILES_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nAPPID_CONFIG_MATCH_COUNT=565\nAPPID_CONFIG_1_BASENAME=targets.json\nAPPID_CONFIG_1_PATH_HINT=//etc/homelab-backup/targets.json\nAPPID_CONFIG_1_SHA=2f526330152d49461ff66f50adab57d1a195ea5d1b4c292945d523411b8a68a8\nAPPID_CONFIG_1_LINE_NOS=115\nAPPID_CONFIG_2_BASENAME=targets.json.before-skladchik-core-apps-20261003T205612Z.bak\nAPPID_CONFIG_2_PATH_HINT=//etc/homelab-backup/targets.json.before-skladchik-core-apps-20261003T205612Z.bak\nAPPID_CONFIG_2_SHA=6ecf034ca03b52a1e6beceeae81d86a623885462c095d50b133aea4048a4626e\nAPPID_CONFIG_2_LINE_NOS=115\nAPPID_CONFIG_3_BASENAME=task.json\nAPPID_CONFIG_3_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T192441Z-1666483-preflight/task.json\nAPPID_CONFIG_3_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb\nAPPID_CONFIG_3_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_4_BASENAME=task.json\nAPPID_CONFIG_4_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T192627Z-1668009-prepare/task.json\nAPPID_CONFIG_4_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb\nAPPID_CONFIG_4_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_5_BASENAME=task.json\nAPPID_CONFIG_5_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T192843Z-1681558-dry-run/task.json\nAPPID_CONFIG_5_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb\nAPPID_CONFIG_5_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_6_BASENAME=task.json\nAPPID_CONFIG_6_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T193210Z-1692269-apply/task.json\nAPPID_CONFIG_6_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb\nAPPID_CONFIG_6_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_7_BASENAME=task.json\nAPPID_CONFIG_7_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T193950Z-1722753-preflight/task.json\nAPPID_CONFIG_7_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb\nAPPID_CONFIG_7_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_8_BASENAME=task.json\nAPPID_CONFIG_8_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T193952Z-1722941-prepare/task.json\nAPPID_CONFIG_8_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb\nAPPID_CONFIG_8_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_9_BASENAME=task.json\nAPPID_CONFIG_9_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T193952Z-1723022-dry-run/task.json\nAPPID_CONFIG_9_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb\nAPPID_CONFIG_9_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_10_BASENAME=task.json\nAPPID_CONFIG_10_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T194508Z-1738655-apply/task.json\nAPPID_CONFIG_10_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb\nAPPID_CONFIG_10_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_11_BASENAME=task.json\nAPPID_CONFIG_11_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T200841Z-1818714-preflight/task.json\nAPPID_CONFIG_11_SHA=8741a7407c135ebe5303056da44186d280b410efbca3714054a990d0f0340aec\nAPPID_CONFIG_11_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_12_BASENAME=task.json\nAPPID_CONFIG_12_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T200843Z-1818903-prepare/task.json\nAPPID_CONFIG_12_SHA=8741a7407c135ebe5303056da44186d280b410efbca3714054a990d0f0340aec\nAPPID_CONFIG_12_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_13_BASENAME=task.json\nAPPID_CONFIG_13_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T200843Z-1818980-dry-run/task.json\nAPPID_CONFIG_13_SHA=8741a7407c135ebe5303056da44186d280b410efbca3714054a990d0f0340aec\nAPPID_CONFIG_13_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_14_BASENAME=task.json\nAPPID_CONFIG_14_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T201139Z-1833098-apply/task.json\nAPPID_CONFIG_14_SHA=8741a7407c135ebe5303056da44186d280b410efbca3714054a990d0f0340aec\nAPPID_CONFIG_14_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_15_BASENAME=task.json\nAPPID_CONFIG_15_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T201939Z-1860663-preflight/task.json\nAPPID_CONFIG_15_SHA=c121d768f5aaf7dc111cf176f890bbd7508650813760b99ed97aa19613c94e68\nAPPID_CONFIG_15_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_16_BASENAME=task.json\nAPPID_CONFIG_16_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T201941Z-1860857-prepare/task.json\nAPPID_CONFIG_16_SHA=c121d768f5aaf7dc111cf176f890bbd7508650813760b99ed97aa19613c94e68\nAPPID_CONFIG_16_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_17_BASENAME=task.json\nAPPID_CONFIG_17_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T201941Z-1860933-dry-run/task.json\nAPPID_CONFIG_17_SHA=c121d768f5aaf7dc111cf176f890bbd7508650813760b99ed97aa19613c94e68\nAPPID_CONFIG_17_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_18_BASENAME=task.json\nAPPID_CONFIG_18_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T202241Z-1874939-apply/task.json\nAPPID_CONFIG_18_SHA=c121d768f5aaf7dc111cf176f890bbd7508650813760b99ed97aa19613c94e68\nAPPID_CONFIG_18_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_19_BASENAME=task.json\nAPPID_CONFIG_19_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T204310Z-1946040-preflight/task.json\nAPPID_CONFIG_19_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2\nAPPID_CONFIG_19_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_20_BASENAME=task.json\nAPPID_CONFIG_20_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T204311Z-1946265-prepare/task.json\nAPPID_CONFIG_20_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2\nAPPID_CONFIG_20_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_21_BASENAME=task.json\nAPPID_CONFIG_21_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T204311Z-1946345-dry-run/task.json\nAPPID_CONFIG_21_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2\nAPPID_CONFIG_21_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_22_BASENAME=task.json\nAPPID_CONFIG_22_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T204533Z-1956057-apply/task.json\nAPPID_CONFIG_22_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2\nAPPID_CONFIG_22_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_23_BASENAME=task.json\nAPPID_CONFIG_23_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T205721Z-1989628-preflight/task.json\nAPPID_CONFIG_23_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2\nAPPID_CONFIG_23_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_24_BASENAME=task.json\nAPPID_CONFIG_24_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T205722Z-1989815-prepare/task.json\nAPPID_CONFIG_24_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2\nAPPID_CONFIG_24_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_25_BASENAME=task.json\nAPPID_CONFIG_25_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T205722Z-1989891-dry-run/task.json\nAPPID_CONFIG_25_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2\nAPPID_CONFIG_25_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_26_BASENAME=stderr.log\nAPPID_CONFIG_26_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T210034Z-2011730-apply/stderr.log\nAPPID_CONFIG_26_SHA=bbc5b7b614a73219147a06614942e2c67176375af10bcb85aeac5565cb8c2532\nAPPID_CONFIG_26_LINE_NOS=7,8\nAPPID_CONFIG_27_BASENAME=stdout.log\nAPPID_CONFIG_27_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T210034Z-2011730-apply/stdout.log\nAPPID_CONFIG_27_SHA=cdf49d288d7b019b1a5f5099fe8b3e4f5ed1432294051a3c2020a4369c4afd41\nAPPID_CONFIG_27_LINE_NOS=24,31,32,35\nAPPID_CONFIG_28_BASENAME=task.json\nAPPID_CONFIG_28_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T210034Z-2011730-apply/task.json\nAPPID_CONFIG_28_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2\nAPPID_CONFIG_28_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_29_BASENAME=task.json\nAPPID_CONFIG_29_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T211239Z-2049968-preflight/task.json\nAPPID_CONFIG_29_SHA=4d850b025c6a9ad347015321775f9d0466149fb9d5a70212f91b6535adc3c0e3\nAPPID_CONFIG_29_LINE_NOS=44,55,56,81,86\nAPPID_CONFIG_30_BASENAME=task.json\nAPPID_CONFIG_30_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T213313Z-2127686-preflight/task.json\nAPPID_CONFIG_30_SHA=d98bdf83ab6a9fda0d864e3ccac4a0d01e7813fec9f1173a6d4d5e8712c8e238\nAPPID_CONFIG_30_LINE_NOS=44,55,56,81,86\nGEN_JOURNAL_MATCH_COUNT=3\nGEN_JOURNAL_1_UNIT=skladchik-reports-monitor-supervisor.service\nGEN_JOURNAL_1_IDENT=skladchik-reports-monitor-supervisor\nGEN_JOURNAL_1_EXE_BASENAME=python3.13\nGEN_JOURNAL_1_PID=932988\nGEN_JOURNAL_1_MESSAGE_SHA=93a0f7b08cf701cc4f77f2d02c659932db4ca849640cbbe55327693c1e4365eb\nGEN_JOURNAL_1_FLAGS=generation,backup,sealed\nGEN_JOURNAL_2_UNIT=homelab-backup-audit.service\nGEN_JOURNAL_2_IDENT=homelab-backup-audit\nGEN_JOURNAL_2_EXE_BASENAME=python3.13\nGEN_JOURNAL_2_PID=966882\nGEN_JOURNAL_2_MESSAGE_SHA=c8c9e905543f63dbee767d26e1c1824c99e7a23094405dba984b18361a36527f\nGEN_JOURNAL_2_FLAGS=generation,fresh,skip_fresh\nGEN_JOURNAL_3_UNIT=skladchik-reports-monitor-supervisor.service\nGEN_JOURNAL_3_IDENT=skladchik-reports-monitor-supervisor\nGEN_JOURNAL_3_EXE_BASENAME=python3.13\nGEN_JOURNAL_3_PID=968339\nGEN_JOURNAL_3_MESSAGE_SHA=93a0f7b08cf701cc4f77f2d02c659932db4ca849640cbbe55327693c1e4365eb\nGEN_JOURNAL_3_FLAGS=generation,backup,sealed\nQUORUM_SCRIPT_READY=false\nQUORUM_UNIT_READY=true\nAPPID_CONFIG_READY=true\nBACKUP_PRODUCER_TOPOLOGY_READY=false\nMAIL_SENT_BY_COMMAND=false\nCHANGES_MADE=false\nROLLBACK_STARTED=false\nROLLBACK_RESTORED=null\nMUTATION_OUTCOME=NO_MUTATION\nDECISION=HOLD_BACKUP_PRODUCER_RCA\nNEXT_GATE=BACKUP_PRODUCER_RECONCILE\nTASK_RESULT=SKLADCHIK_DURABILITY_BACKUP_PRODUCER_RCA\n" } diff --git a/runtime/latest.txt b/runtime/latest.txt index b77c6afb..01211539 100644 --- a/runtime/latest.txt +++ b/runtime/latest.txt @@ -1,22 +1,22 @@ CHAT_OUTPUT_BEGIN -COMMAND_ID=SUPPORT-261005-SNIKKET-POSTRESTORE-OPS-AUDIT-99576R1 -STATUS=OK -RC=0 +COMMAND_ID=SUPPORT-261005-SKLADCHIK-DURABILITY-BACKUP-PRODUCER-RCA-99578R1 +STATUS=FAIL +RC=43 HOST=pve01 MODE=read-only -COMPONENT=snikket-postrestore-ops-audit +COMPONENT=skladchik-durability-backup-producer-rca REFERENCE_REGISTER_CHECK=OK REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 ERROR_REGISTER_CHECK=OK ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 -COMMAND_SHA256=cf66f2eb105bc655343e9e02bb17a8653b2204ad3b8b32f37cca41a1c3b8e13e +COMMAND_SHA256=6d4e000caabe0b4f15d31ba419f9633c5004c1b83d9c535098b8901ae634bb59 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 +COMMAND_RC=43 CHANGES_MADE=false ROLLBACK_STARTED=false ROLLBACK_RESTORED=null @@ -24,231 +24,2195 @@ MUTATION_OUTCOME=NO_MUTATION SANITIZED=yes SECRETS_INCLUDED=no PRIVATE_ADDRESSES_INCLUDED=no -RAW_EVIDENCE_SHA256=550fefd239af3131158d8df5a4642c83f89f026d19e2b1e4a6d589a6296c395f -SANITIZED_OUTPUT_SHA256=550fefd239af3131158d8df5a4642c83f89f026d19e2b1e4a6d589a6296c395f +RAW_EVIDENCE_SHA256=16ba01850d81f6abbd81c5322dfb90ebe83f2780ce7f91f057ae10bce56216b0 +SANITIZED_OUTPUT_SHA256=16ba01850d81f6abbd81c5322dfb90ebe83f2780ce7f91f057ae10bce56216b0 OUTPUT_BEGIN -SNIKKET_POSTRESTORE_OPS_AUDIT_WRAPPER=V1 -MODE=read-only -NO_DNS_MUTATION=true -NO_VM_MUTATION=true -NO_CONTAINER_RESTART=true -NO_SERVICE_START=true +SKLADCHIK_DURABILITY_BACKUP_PRODUCER_RCA=V1 +NO_MAIL_SEND=true +NO_SERVICE_RESTART=true +NO_TIMER_MUTATION=true +NO_NETWORK_MUTATION=true NO_SOURCE_MUTATION=true +NO_BACKUP_MUTATION=true +NO_GIT_PUSH=true +MODE=read-only HOST_PVE01=true -INGRESS_HOSTKEY_SELF_BOUND=true -VM150_INVENTORY_PRESENT=true -VM150_RUNNING=true -VM150_EXPECTED_NODE=true -VM130_INVENTORY_PRESENT=true -VM130_RUNNING=true -VM130_EXPECTED_NODE=true -VM150_QM_CONFIG_RC=0 -VM150_ONBOOT=true -VM150_AGENT_CONFIGURED=false -VM150_SNAPSHOT_COUNT=0 -PVE_BACKUP_JOBS_QUERY_RC=0 -PVE_BACKUP_JOB_COVERAGE_COUNT=0 -PVE_BACKUP_JOB_ENABLED_COVERAGE_COUNT=0 - File "", line 8 - open(sys.argv[2],'w').write(' - ^ -SyntaxError: unterminated string literal (detected at line 8) -bash: line 91: /tmp/w2-snikket-99576.TklpZd/storage.list: No such file or directory -PVE_VM150_BACKUP_OBJECT_COUNT=0 -PVE_VM150_BACKUP_STORAGE_WITH_OBJECT_COUNT=0 -PVE_VM150_NEWEST_BACKUP_AGE_HOURS=-1 -PVE_VM150_BACKUP_WITHIN_48H=false -PVE_VM150_BACKUP_WITHIN_7D=false -HOMELAB_BACKUP_V2_TIMER_ACTIVE=active -HOMELAB_BACKUP_V2_TIMER_ENABLED=enabled -HOMELAB_BACKUP_V2_TIMER_RESULT=success -HOMELAB_BACKUP_V2_TIMER_EXEC_MAIN_STATUS= -HOMELAB_BACKUP_V2_SERVICE_ACTIVE=activating -HOMELAB_BACKUP_V2_SERVICE_ENABLED=static -HOMELAB_BACKUP_V2_SERVICE_RESULT=success -HOMELAB_BACKUP_V2_SERVICE_EXEC_MAIN_STATUS=0 -HOMELAB_BACKUP_AUDIT_TIMER_ACTIVE=active -HOMELAB_BACKUP_AUDIT_TIMER_ENABLED=enabled -HOMELAB_BACKUP_AUDIT_TIMER_RESULT=success -HOMELAB_BACKUP_AUDIT_TIMER_EXEC_MAIN_STATUS= -HOMELAB_BACKUP_AUDIT_SERVICE_ACTIVE=inactive -HOMELAB_BACKUP_AUDIT_SERVICE_ENABLED=static -HOMELAB_BACKUP_AUDIT_SERVICE_RESULT=success -HOMELAB_BACKUP_AUDIT_SERVICE_EXEC_MAIN_STATUS=0 -BACKUP_V2_UNIT_SHA256=34025d4708ad366ad6948439f8f82e8543159337117f4d5631fd7c94f2795ffb -BACKUP_AUDIT_UNIT_SHA256=f54a3f6fc2a7404f66123f3721f2ed5903b51ca09e91907d488fd0f42e9a0fc4 -BACKUP_V2_SCRIPT_SNIKKET_REF_COUNT=0 -BACKUP_V2_JOURNAL_30D_SNIKKET_REF_COUNT=28 -BACKUP_V2_JOURNAL_30D_FAIL_WORD_COUNT=396 -BACKUP_AUDIT_JOURNAL_30D_SNIKKET_REF_COUNT=191 -BACKUP_AUDIT_JOURNAL_30D_RESTORE_REF_COUNT=172 -SOURCE_GIT_REPO_SCAN_COUNT=64 -SOURCE_DNS_REPO_MATCH_COUNT=49 -SOURCE_DNS_TRACKED_FILE_MATCH_COUNT=832 -SOURCE_DNS_ALL3_IN_ONE_TRACKED_FILE_COUNT=391 -SOURCE_DNS_LIKELY_DESIRED_FILE_COUNT=98 -SOURCE_RECON_REPO_MATCH_COUNT=49 -SOURCE_RECON_LIKELY_SOURCE_FILE_COUNT=147 -SOURCE_RECON_EXACT_SHA_MATCH_COUNT=0 -HOMELAB_EXTERNAL_PROBE_VPS_HEALTH_TIMER_ACTIVE=active -HOMELAB_EXTERNAL_PROBE_VPS_HEALTH_TIMER_ENABLED=enabled -HOMELAB_KUMA_MONITOR_POLICY_TIMER_ACTIVE=active -HOMELAB_KUMA_MONITOR_POLICY_TIMER_ENABLED=enabled -HOMELAB_OVERALL_HEALTH_TIMER_ACTIVE=active -HOMELAB_OVERALL_HEALTH_TIMER_ENABLED=enabled -HOMELAB_ALERTING_HEALTH_TIMER_ACTIVE=active -HOMELAB_ALERTING_HEALTH_TIMER_ENABLED=enabled - File "", line 23 - text=' - ^ -SyntaxError: unterminated string literal (detected at line 23) -PUBLIC_CHAT_GRAM1_RU_DNS_OK=true -PUBLIC_CHAT_GRAM1_RU_HTTPS_OK=true -PUBLIC_CHAT_GRAM1_RU_HTTPS_CODE=302 -PUBLIC_GROUPS_CHAT_GRAM1_RU_DNS_OK=true -PUBLIC_GROUPS_CHAT_GRAM1_RU_HTTPS_OK=true -PUBLIC_GROUPS_CHAT_GRAM1_RU_HTTPS_CODE=301 -PUBLIC_SHARE_CHAT_GRAM1_RU_DNS_OK=true -PUBLIC_SHARE_CHAT_GRAM1_RU_HTTPS_OK=true -PUBLIC_SHARE_CHAT_GRAM1_RU_HTTPS_CODE=301 -PUBLIC_DNS_OK_COUNT=3 -PUBLIC_HTTPS_OK_COUNT=3 -PVE01_PUBLIC_TCP_80_OPEN=true -PVE01_PUBLIC_TCP_443_OPEN=true -PVE01_PUBLIC_TCP_5000_OPEN=true -PVE01_PUBLIC_TCP_5222_OPEN=true -PVE01_PUBLIC_TCP_5269_OPEN=true -PVE01_PUBLIC_TCP_3479_OPEN=true -PVE01_PUBLIC_TCP_5349_OPEN=true -PVE01_PUBLIC_TCP_5350_OPEN=true -PVE01_PUBLIC_STUN_3479_PASS=true -PVE01_PUBLIC_STUN_3479_CLASS=BINDING_SUCCESS -PUBLIC_CERT_PRESENT=true -PUBLIC_CERT_DAYS_REMAINING=39 -PUBLIC_CERT_SAN_CHAT=true -VM150_QGA_PING=true -VM150_QGA_EXEC_INIT_RC=0 -VM150_QGA_POLL_RC=0 -VM150_GUEST_EXITCODE=0 -VM150_GUEST_OUTPUT_MARKER=true -SNIKKET_POSTRESTORE_OPS_GUEST_AUDIT=V1 -MODE=read-only -NO_DNS_MUTATION=true -NO_VM_MUTATION=true -NO_CONTAINER_RESTART=true -NO_SERVICE_START=true -NO_SOURCE_MUTATION=true -GUEST_HOSTNAME_SNIKKET=true -GUEST_OS_ID=debian -GUEST_OS_VERSION_ID=13 -DOCKER_SERVER_VERSION=26.1.5+dfsg1 -DOCKER_SERVICE_ACTIVE=active -DOCKER_SERVICE_ENABLED=enabled -CONTAINER_SNIKKET_RUNNING=true -CONTAINER_SNIKKET_RESTART_COUNT=0 -IMAGE_SNIKKET_REF_SHA256=90021787527fca4ce74e831ccee538a0f6ed610b25a09ccf6f8a5fa36be16854 -IMAGE_SNIKKET_VERSION=UNKNOWN -IMAGE_SNIKKET_REVISION_SHA256=5fd65d0d2176256727f7262622feba743256548e0fb32e898f3130fad7dc0ab0 -IMAGE_SNIKKET_CREATED=2026-06-12T14:41:53. -CONTAINER_PROXY_RUNNING=true -CONTAINER_PROXY_RESTART_COUNT=0 -IMAGE_PROXY_REF_SHA256=5a8598acfb66e46734b4723dc0b39e6746fa78beea110ddc4e22f0ea9b2d16dd -IMAGE_PROXY_VERSION=UNKNOWN -IMAGE_PROXY_REVISION_SHA256=95641b2ebc3894038678fcff2dea0c9aca19296b492904822bb83c404f1e530f -IMAGE_PROXY_CREATED=2026-06-12T14:44:44. -CONTAINER_CERTS_RUNNING=true -CONTAINER_CERTS_RESTART_COUNT=0 -IMAGE_CERTS_REF_SHA256=3e42ce0a19bdc3fd01ce94c3a0610b9819b92a91e3377ad919f19462935c36e5 -IMAGE_CERTS_VERSION=UNKNOWN -IMAGE_CERTS_REVISION_SHA256=183d76cbb4f298cd4bf8ad98f0e20a058be9590d187ebf17f4bfc854816d3f70 -IMAGE_CERTS_CREATED=2026-06-12T14:34:03. -CONTAINER_PORTAL_RUNNING=true -CONTAINER_PORTAL_RESTART_COUNT=0 -IMAGE_PORTAL_REF_SHA256=90841487d94e1720f5377e5e9df74fd2f14fa0be8553a5ae0098e8daa3f234e7 -IMAGE_PORTAL_VERSION=UNKNOWN -IMAGE_PORTAL_REVISION_SHA256=d6de54b097cc2bc39eff3f505970ebd7d112211a1ac48f862907e8393602da21 -IMAGE_PORTAL_CREATED=2026-06-12T14:43:49. -FILE_DOCKER_COMPOSE_YML_PRESENT=true -FILE_DOCKER_COMPOSE_YML_SHA256=637ff81a1bd59446516782e8d89beeb4be8838b2f3577d07b2280e82a8484f58 -FILE_DOCKER_COMPOSE_OVERRIDE_YML_PRESENT=true -FILE_DOCKER_COMPOSE_OVERRIDE_YML_SHA256=54a42711db5c2eb99b3886184c7ce3e01a30aba844ff2022bc74a45414a2241c -FILE_SNIKKET_CONF_PRESENT=true -FILE_SNIKKET_CONF_SHA256=43a91b1819fbcfc446f57f45a741b40558e9728963ecdfd09a01df33c64deb97 -FILE_COTURN_RUN_PRESENT=true -FILE_COTURN_RUN_SHA256=2de0e47c09b3b4fc7a6c32c5ef061efaaa7c7f4db3d7a25fdf4da8fbb2e6f483 -FILE_COTURN_RUN_UPSTREAM_PRESENT=true -FILE_COTURN_RUN_UPSTREAM_SHA256=6b3e7dce49b399ae3dc6d461a60e43c9dfc7c31a4fb11e8d5acf9f0a5b06cdb0 -DOCKER_COMPOSE_CONFIG_RC=0 -SNIKKET_DOMAIN_OK=true -TURN_ENV_PORT_3479=true -TURN_ENV_RELAY_RANGE_OK=true -SNIKKET_RETENTION_DAYS_SET=false -SNIKKET_RETENTION_DAYS_VALUE=DEFAULT -SNIKKET_UPLOAD_STORAGE_GB_SET=false -SNIKKET_UPLOAD_STORAGE_GB_VALUE=UNLIMITED_DEFAULT -SNIKKET_UPDATE_CHECK_EFFECTIVE=true -SNIKKET_TLS_PROFILE=DEFAULT -GUEST_ROOT_FS_USED_PERCENT=4 -SNIKKET_DATA_MOUNT_PRESENT=true -SNIKKET_DATA_BYTES=249208 -SNIKKET_DATA_MOUNT_PATH_SHA256=3e0588a2a1a406dcc977be380cefce0052aeb6d9b0ad7c75e0e884de626d33a3 -CERT_PRESENT=true -CERT_DAYS_REMAINING=39 -CERT_NOTAFTER_SHA256=3a60a16e36e46a398f33d228be913dd27dbcba4e1dec068e2c5c724190bc01bc -CERT_SAN_CHAT=true -CERT_SAN_GROUPS=true -CERT_SAN_SHARE=true -CERT_MTIME_EPOCH=1791161208 -CERTS_LOG_30D_LINE_COUNT=741 -CERTS_LOG_30D_ERROR_WORD_COUNT=0 -CERTS_LOG_30D_RENEW_WORD_COUNT=39 -CERTS_LOG_30D_SHA256=e4eebfcbb18a9ac352e34a3508fd80d339950415bfe71960afda5bbeb4ff4c16 -TCP_80_LISTEN_COUNT=2 -TCP_443_LISTEN_COUNT=2 -TCP_5000_LISTEN_COUNT=2 -TCP_5222_LISTEN_COUNT=2 -TCP_5269_LISTEN_COUNT=2 -TCP_3479_LISTEN_COUNT=16 -TCP_5349_LISTEN_COUNT=16 -TCP_5350_LISTEN_COUNT=16 -UDP_3479_LISTEN_COUNT=16 -UDP_5349_LISTEN_COUNT=16 -UDP_5350_LISTEN_COUNT=16 -TURN_LOCAL_STUN_3479_PASS=true -TURN_LOCAL_STUN_3479_CLASS=BINDING_SUCCESS -RECON_SCRIPT_SHA256=bb692a3a044d41e6e04518aff5bdfa646f533660a70ea793f87d040c881a6e98 -RECON_SCRIPT_SHA_MATCH_FINAL=true -RECON_SCRIPT_BASH_N_RC=0 -RECON_OLD_PORT_LOOP_COUNT=0 -RECON_NEW_PORT_LOOP_COUNT=2 -RECON_GOOD_PKILL_X_COUNT=1 -SNIKKET_TURN_RECONCILE_TIMER_ACTIVE=active -SNIKKET_TURN_RECONCILE_TIMER_ENABLED=enabled -SNIKKET_TURN_RECONCILE_TIMER_RESULT=success -SNIKKET_TURN_RECONCILE_TIMER_EXEC_MAIN_STATUS= -SNIKKET_TURN_RECONCILE_SERVICE_ACTIVE=inactive -SNIKKET_TURN_RECONCILE_SERVICE_ENABLED=static -SNIKKET_TURN_RECONCILE_SERVICE_RESULT=success -SNIKKET_TURN_RECONCILE_SERVICE_EXEC_MAIN_STATUS=0 -SNIKKET_EDGE_EGRESS_SERVICE_ACTIVE=active -SNIKKET_EDGE_EGRESS_SERVICE_ENABLED=enabled -SNIKKET_EDGE_EGRESS_SERVICE_RESULT=success -SNIKKET_EDGE_EGRESS_SERVICE_EXEC_MAIN_STATUS=0 -LOCAL_CHAT_HTTPS_RC=0 -LOCAL_CHAT_HTTPS_CODE=302 -GUEST_SNIKKET_UNIT_COUNT=3 -GUEST_SNIKKET_TIMER_COUNT=1 -GUEST_SNIKKET_CRON_FILE_COUNT=0 -GUEST_CURRENT_CORE_HEALTH=true -CURRENT_SERVICE_HEALTH=PASS -OPS_AUDIT_COMPLETE=true -DECISION=ANALYZE_SNIKKET_POSTRESTORE_OPS_AUDIT -NEXT_GATE=EVIDENCE_BACKED_HARDENING_ONLY -TASK_RESULT=SNIKKET_POSTRESTORE_OPS_AUDIT +PRODUCER_VM170_QM_RC=0 +PRODUCER_VM170_STDERR_PRESENT=false +PRODUCER_VM170_JSON=true +PRODUCER_VM170_GUEST_EXITCODE=0 +VM170_MONITOR_SHA=19123e359f2f7b9a2d373fd7e4464dd426d31b91cabc567c252e70cad40d77c8 +VM170_TIMER_ACTIVE=active +VM170_TIMER_ENABLED=enabled +VM170_SERVICE_RESULT=success +VM170_HEALTH_STATUS=OK\nVM170_HEALTH_TS=2026-10-05T06:43:23Z\nVM170_HEALTH_REPORTS=22\nVM170_HEALTH_OPEN=13\nVM170_HEALTH_RESOLVED=9\n +VM170_BASELINE_OK=false +SUPERVISOR_PRESENT=true +SUPERVISOR_SHA=3a9bf9f3f9c28dbf670300f0851a5b7f86eb41fa41cdf44d0935337ae8ef02a2 +SUPERVISOR_BASENAME=skladchik-reports-monitor-supervisor +SUPERVISOR_AST_OK=true +SUPERVISOR_FUNCTION_COUNT=16 +SUPERVISOR_FUNCTIONS=now,iso,log,run,parse_env_text,read_env_file,age_seconds_from_ts,ssh_edge,edge_mail,systemctl_props,gather,render_body,write_health,read_state,write_state,main +SUPERVISOR_CLI_OPTION_COUNT=0 +SUPERVISOR_CLI_OPTIONS=NONE +SUPERVISOR_ENV_NAME_COUNT=5 +SUPERVISOR_ENV_NAMES=SKLADCHIK_BACKUP_HEALTH_MAX_SECONDS,SKLADCHIK_COOKIE_EXPIRY_WARN_SECONDS,SKLADCHIK_EDGE,SKLADCHIK_MONITOR_HEALTH_MAX_SECONDS,SKLADCHIK_RESTORE_HEALTH_MAX_SECONDS +SUPERVISOR_RELEVANT_FUNCTION_COUNT=4 +SUPERVISOR_FUNC_1_NAME=parse_env_text +SUPERVISOR_FUNC_1_LINENO=51 +SUPERVISOR_FUNC_1_ENDLINENO=58 +SUPERVISOR_FUNC_1_NAMES=d,k,line,split,splitlines,startswith,strip,text,v +SUPERVISOR_FUNC_1_AST_BEGIN +FunctionDef( + name='parse_env_text', + args=arguments( + args=[ + arg(arg='text')]), + body=[ + Assign( + targets=[ + Name(id='d', ctx=Store())], + value=Dict()), + For( + target=Name(id='line', ctx=Store()), + iter=Call( + func=Attribute( + value=BoolOp( + op=Or(), + values=[ + Name(id='text', ctx=Load()), + Constant(value='')]), + attr='splitlines', + ctx=Load())), + body=[ + If( + test=BoolOp( + op=Or(), + values=[ + UnaryOp( + op=Not(), + operand=Name(id='line', ctx=Load())), + Call( + func=Attribute( + value=Name(id='line', ctx=Load()), + attr='startswith', + ctx=Load()), + args=[ + Constant(value='#')]), + Compare( + left=Constant(value='='), + ops=[ + NotIn()], + comparators=[ + Name(id='line', ctx=Load())])]), + body=[ + Continue()]), + Assign( + targets=[ + Tuple( + elts=[ + Name(id='k', ctx=Store()), + Name(id='v', ctx=Store())], + ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='line', ctx=Load()), + attr='split', + ctx=Load()), + args=[ + Constant(value='='), + Constant(value=1)])), + Assign( + targets=[ + Subscript( + value=Name(id='d', ctx=Load()), + slice=Call( + func=Attribute( + value=Name(id='k', ctx=Load()), + attr='strip', + ctx=Load())), + ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='v', ctx=Load()), + attr='strip', + ctx=Load())))]), + Return( + value=Name(id='d', ctx=Load()))]) +SUPERVISOR_FUNC_1_AST_END +SUPERVISOR_FUNC_2_NAME=gather +SUPERVISOR_FUNC_2_LINENO=110 +SUPERVISOR_FUNC_2_ENDLINENO=347 +SUPERVISOR_FUNC_2_NAMES=APP_FRESHNESS_PROBE,Exception,M,MONITOR_HEALTH_AGE_MAX,Path,S,age_seconds_from_ts,append,base,core_cmd,facts,files,get,group,health_age,int,items,k,local_units,m,mon,name,opened,out,p,parse_env_text,probe,probe_out,probe_rc,problems,props,quote,rc,re,read_text,reg_cmd,reg_out,reg_rc,registry_source,replace,reports,resolved,route,route_lines,run,search,section,shlex,splitlines,ssh_edge,startswith,str,strip,systemctl_props,timer_active,timer_enabled,timers_text,u,wm,worker_path,worker_target,worker_text +SUPERVISOR_FUNC_2_AST_BEGIN +FunctionDef( + name='gather', + args=arguments(), + body=[ + Assign( + targets=[ + Name(id='facts', ctx=Store())], + value=Dict()), + Assign( + targets=[ + Name(id='problems', ctx=Store())], + value=List(ctx=Load())), + Assign( + targets=[ + Name(id='core_cmd', ctx=Store())], + value=Constant(value='')), + Assign( + targets=[ + Tuple( + elts=[ + Name(id='rc', ctx=Store()), + Name(id='out', ctx=Store())], + ctx=Store())], + value=Call( + func=Name(id='ssh_edge', ctx=Load()), + args=[ + Name(id='core_cmd', ctx=Load())], + keywords=[ + keyword( + arg='timeout', + value=Constant(value=45))])), + Assign( + targets=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='core_ssh_rc'), + ctx=Store())], + value=Call( + func=Name(id='str', ctx=Load()), + args=[ + Name(id='rc', ctx=Load())])), + If( + test=Compare( + left=Name(id='rc', ctx=Load()), + ops=[ + NotEq()], + comparators=[ + Constant(value=0)]), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='core_ssh_failed')]))]), + FunctionDef( + name='section', + args=arguments( + args=[ + arg(arg='name')]), + body=[ + Assign( + targets=[ + Name(id='m', ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='re', ctx=Load()), + attr='search', + ctx=Load()), + args=[ + JoinedStr( + values=[ + Constant(value='__'), + FormattedValue( + value=Name(id='name', ctx=Load()), + conversion=-1), + Constant(value='_BEGIN__\\n(.*?)\\n__'), + FormattedValue( + value=Name(id='name', ctx=Load()), + conversion=-1), + Constant(value='_END__')]), + Name(id='out', ctx=Load()), + Attribute( + value=Name(id='re', ctx=Load()), + attr='S', + ctx=Load())])), + Return( + value=IfExp( + test=Name(id='m', ctx=Load()), + body=Call( + func=Attribute( + value=Call( + func=Attribute( + value=Name(id='m', ctx=Load()), + attr='group', + ctx=Load()), + args=[ + Constant(value=1)]), + attr='strip', + ctx=Load())), + orelse=Constant(value='')))]), + Assign( + targets=[ + Name(id='mon', ctx=Store())], + value=Call( + func=Name(id='parse_env_text', ctx=Load()), + args=[ + Call( + func=Name(id='section', ctx=Load()), + args=[ + Constant(value='MONITOR_HEALTH')])])), + Assign( + targets=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_status'), + ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='mon', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='STATUS'), + Constant(value='MISSING')])), + Assign( + targets=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_reports'), + ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='mon', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='reports'), + Constant(value='')])), + Assign( + targets=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_open'), + ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='mon', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='open'), + Constant(value='')])), + Assign( + targets=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_resolved'), + ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='mon', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='resolved'), + Constant(value='')])), + Assign( + targets=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_smtp_configured'), + ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='mon', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='smtp_configured'), + Constant(value='')])), + Assign( + targets=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_health_age_seconds'), + ctx=Store())], + value=Call( + func=Name(id='str', ctx=Load()), + args=[ + Call( + func=Name(id='age_seconds_from_ts', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='mon', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='TS')])])])), + If( + test=Compare( + left=Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_status'), + ctx=Load()), + ops=[ + NotEq()], + comparators=[ + Constant(value='OK')]), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='monitor_status_not_ok')]))]), + Try( + body=[ + Assign( + targets=[ + Name(id='health_age', ctx=Store())], + value=Call( + func=Name(id='int', ctx=Load()), + args=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_health_age_seconds'), + ctx=Load())])), + If( + test=Compare( + left=Name(id='health_age', ctx=Load()), + ops=[ + Gt()], + comparators=[ + Name(id='MONITOR_HEALTH_AGE_MAX', ctx=Load())]), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='monitor_health_stale')]))])], + handlers=[ + ExceptHandler( + type=Name(id='Exception', ctx=Load()), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='monitor_health_age_invalid')]))])]), + Try( + body=[ + Assign( + targets=[ + Name(id='reports', ctx=Store())], + value=Call( + func=Name(id='int', ctx=Load()), + args=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_reports'), + ctx=Load())])), + Assign( + targets=[ + Name(id='opened', ctx=Store())], + value=Call( + func=Name(id='int', ctx=Load()), + args=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_open'), + ctx=Load())])), + Assign( + targets=[ + Name(id='resolved', ctx=Store())], + value=Call( + func=Name(id='int', ctx=Load()), + args=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_resolved'), + ctx=Load())])), + If( + test=Compare( + left=Name(id='reports', ctx=Load()), + ops=[ + LtE()], + comparators=[ + Constant(value=0)]), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='monitor_reports_zero_or_missing')]))]), + If( + test=BoolOp( + op=Or(), + values=[ + Compare( + left=Name(id='opened', ctx=Load()), + ops=[ + Lt()], + comparators=[ + Constant(value=0)]), + Compare( + left=Name(id='resolved', ctx=Load()), + ops=[ + Lt()], + comparators=[ + Constant(value=0)]), + Compare( + left=BinOp( + left=Name(id='opened', ctx=Load()), + op=Add(), + right=Name(id='resolved', ctx=Load())), + ops=[ + NotEq()], + comparators=[ + Name(id='reports', ctx=Load())])]), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='monitor_counts_invalid')]))])], + handlers=[ + ExceptHandler( + type=Name(id='Exception', ctx=Load()), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='monitor_counts_missing')]))])]), + If( + test=Compare( + left=Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_smtp_configured'), + ctx=Load()), + ops=[ + NotEq()], + comparators=[ + Constant(value='yes')]), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='monitor_smtp_not_configured')]))]), + Assign( + targets=[ + Name(id='timers_text', ctx=Store())], + value=Call( + func=Name(id='section', ctx=Load()), + args=[ + Constant(value='TIMERS')])), + Assign( + targets=[ + Name(id='m', ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='re', ctx=Load()), + attr='search', + ctx=Load()), + args=[ + Constant(value='skladchik-reports-monitor\\.timer\\s+enabled=([^\\s]+)\\s+active=([^\\s]+)'), + Name(id='timers_text', ctx=Load())])), + Assign( + targets=[ + Name(id='timer_enabled', ctx=Store())], + value=IfExp( + test=Name(id='m', ctx=Load()), + body=Call( + func=Attribute( + value=Name(id='m', ctx=Load()), + attr='group', + ctx=Load()), + args=[ + Constant(value=1)]), + orelse=Constant(value='missing'))), + Assign( + targets=[ + Name(id='timer_active', ctx=Store())], + value=IfExp( + test=Name(id='m', ctx=Load()), + body=Call( + func=Attribute( + value=Name(id='m', ctx=Load()), + attr='group', + ctx=Load()), + args=[ + Constant(value=2)]), + orelse=Constant(value='missing'))), + Assign( + targets=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_timer_enabled'), + ctx=Store())], + value=Name(id='timer_enabled', ctx=Load())), + Assign( + targets=[ + Subscript( + value=Name(id='facts', ctx=Load()), + slice=Constant(value='monitor_timer_active'), + ctx=Store())], + value=Name(id='timer_active', ctx=Load())), + If( + test=Compare( + left=Name(id='timer_enabled', ctx=Load()), + ops=[ + NotEq()], + comparators=[ + Constant(value='enabled')]), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='monitor_timer_not_enabled')]))]), + If( + test=Compare( + left=Name(id='timer_active', ctx=Load()), + ops=[ + NotEq()], + comparators=[ + Constant(value='active')]), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='monitor_timer_not_active')]))]), + Assign( + targets=[ + Name(id='route_lines', ctx=Store())], + value=Call( + func=Attribute( + value=Call( + func=Name(id='section', ctx=Load()), + args=[ + Constant(value='ROUTE')]), + att + +SUPERVISOR_FUNC_2_AST_END +SUPERVISOR_FUNC_3_NAME=render_body +SUPERVISOR_FUNC_3_LINENO=349 +SUPERVISOR_FUNC_3_ENDLINENO=378 +SUPERVISOR_FUNC_3_NAMES=facts,get,join,lines,none_text,problems,status,str +SUPERVISOR_FUNC_3_AST_BEGIN +FunctionDef( + name='render_body', + args=arguments( + args=[ + arg(arg='status'), + arg(arg='facts'), + arg(arg='problems'), + arg(arg='mode')]), + body=[ + Assign( + targets=[ + Name(id='none_text', ctx=Store())], + value=Constant(value='нет')), + Assign( + targets=[ + Name(id='lines', ctx=Store())], + value=List( + elts=[ + Constant(value='Надзор мониторинга жалоб Складчика'), + Constant(value=''), + BinOp( + left=Constant(value='Статус: '), + op=Add(), + right=Name(id='status', ctx=Load())), + BinOp( + left=Constant(value='Проблемы: '), + op=Add(), + right=IfExp( + test=Name(id='problems', ctx=Load()), + body=Call( + func=Attribute( + value=Constant(value=', '), + attr='join', + ctx=Load()), + args=[ + Name(id='problems', ctx=Load())]), + orelse=Name(id='none_text', ctx=Load()))), + Constant(value=''), + Constant(value='Основной монитор:'), + Constant(value=''), + BinOp( + left=Constant(value='- status: '), + op=Add(), + right=Call( + func=Name(id='str', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='monitor_status'), + Constant(value='')])])), + BinOp( + left=Constant(value='- reports: '), + op=Add(), + right=Call( + func=Name(id='str', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='monitor_reports'), + Constant(value='')])])), + BinOp( + left=Constant(value='- open: '), + op=Add(), + right=Call( + func=Name(id='str', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='monitor_open'), + Constant(value='')])])), + BinOp( + left=Constant(value='- resolved: '), + op=Add(), + right=Call( + func=Name(id='str', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='monitor_resolved'), + Constant(value='')])])), + BinOp( + left=Constant(value='- route: '), + op=Add(), + right=Call( + func=Name(id='str', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='netbird_route'), + Constant(value='')])])), + Constant(value=''), + Constant(value='Canonical backup:'), + BinOp( + left=Constant(value='- decision: '), + op=Add(), + right=Call( + func=Name(id='str', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='canonical_backup_decision'), + Constant(value='')])])), + BinOp( + left=Constant(value='- generation: '), + op=Add(), + right=Call( + func=Name(id='str', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='canonical_backup_generation'), + Constant(value='')])])), + BinOp( + left=Constant(value='- registry source: '), + op=Add(), + right=Call( + func=Name(id='str', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='registry_source'), + Constant(value='')])])), + BinOp( + left=Constant(value='- worker target: '), + op=Add(), + right=Call( + func=Name(id='str', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='worker_target'), + Constant(value='')])]))], + ctx=Load())), + Return( + value=Call( + func=Attribute( + value=Constant(value='\n'), + attr='join', + ctx=Load()), + args=[ + Name(id='lines', ctx=Load())]))]) +SUPERVISOR_FUNC_3_AST_END +SUPERVISOR_FUNC_4_NAME=main +SUPERVISOR_FUNC_4_LINENO=395 +SUPERVISOR_FUNC_4_ENDLINENO=515 +SUPERVISOR_FUNC_4_NAMES=append,argv,edge_mail,facts,gather,get,join,len,log,mail_sent,mode,old,old_status,print,problems,read_state,render_body,status,stderr,subject,sys,write_health,write_state +SUPERVISOR_FUNC_4_AST_BEGIN +FunctionDef( + name='main', + args=arguments(), + body=[ + Assign( + targets=[ + Name(id='mode', ctx=Store())], + value=IfExp( + test=Compare( + left=Call( + func=Name(id='len', ctx=Load()), + args=[ + Attribute( + value=Name(id='sys', ctx=Load()), + attr='argv', + ctx=Load())]), + ops=[ + Gt()], + comparators=[ + Constant(value=1)]), + body=Subscript( + value=Attribute( + value=Name(id='sys', ctx=Load()), + attr='argv', + ctx=Load()), + slice=Constant(value=1), + ctx=Load()), + orelse=Constant(value='check'))), + If( + test=Compare( + left=Name(id='mode', ctx=Load()), + ops=[ + NotIn()], + comparators=[ + Tuple( + elts=[ + Constant(value='check'), + Constant(value='test')], + ctx=Load())]), + body=[ + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + Constant(value='usage: skladchik-reports-monitor-supervisor [check|test]')], + keywords=[ + keyword( + arg='file', + value=Attribute( + value=Name(id='sys', ctx=Load()), + attr='stderr', + ctx=Load()))])), + Return( + value=Constant(value=2))]), + Assign( + targets=[ + Tuple( + elts=[ + Name(id='facts', ctx=Store()), + Name(id='problems', ctx=Store())], + ctx=Store())], + value=Call( + func=Name(id='gather', ctx=Load()))), + Assign( + targets=[ + Name(id='status', ctx=Store())], + value=IfExp( + test=UnaryOp( + op=Not(), + operand=Name(id='problems', ctx=Load())), + body=Constant(value='OK'), + orelse=Constant(value='FAIL'))), + If( + test=Compare( + left=Name(id='mode', ctx=Load()), + ops=[ + Eq()], + comparators=[ + Constant(value='test')]), + body=[ + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + JoinedStr( + values=[ + Constant(value='SUPERVISOR_STATUS='), + FormattedValue( + value=Name(id='status', ctx=Load()), + conversion=-1)])])), + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + BinOp( + left=Constant(value='SUPERVISOR_PROBLEMS='), + op=Add(), + right=IfExp( + test=Name(id='problems', ctx=Load()), + body=Call( + func=Attribute( + value=Constant(value=','), + attr='join', + ctx=Load()), + args=[ + Name(id='problems', ctx=Load())]), + orelse=Constant(value='none')))])), + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + JoinedStr( + values=[ + Constant(value='MONITOR='), + FormattedValue( + value=Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='monitor_status')]), + conversion=-1), + Constant(value=' reports='), + FormattedValue( + value=Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='monitor_reports')]), + conversion=-1), + Constant(value=' open='), + FormattedValue( + value=Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='monitor_open')]), + conversion=-1), + Constant(value=' resolved='), + FormattedValue( + value=Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='monitor_resolved')]), + conversion=-1)])])), + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + JoinedStr( + values=[ + Constant(value='CANONICAL_BACKUP='), + FormattedValue( + value=Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='canonical_backup_decision')]), + conversion=-1), + Constant(value=' generation='), + FormattedValue( + value=Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='canonical_backup_generation')]), + conversion=-1)])])), + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + JoinedStr( + values=[ + Constant(value='REGISTRY_SOURCE='), + FormattedValue( + value=Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='registry_source')]), + conversion=-1)])])), + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + JoinedStr( + values=[ + Constant(value='WORKER_TARGET='), + FormattedValue( + value=Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='worker_target')]), + conversion=-1)])])), + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + JoinedStr( + values=[ + Constant(value='NETBIRD_ROUTE='), + FormattedValue( + value=Call( + func=Attribute( + value=Name(id='facts', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='netbird_route')]), + conversion=-1)])])), + Return( + value=IfExp( + test=Compare( + left=Name(id='status', ctx=Load()), + ops=[ + Eq()], + comparators=[ + Constant(value='OK')]), + body=Constant(value=0), + orelse=Constant(value=1)))]), + Assign( + targets=[ + Name(id='old', ctx=Store())], + value=Call( + func=Name(id='read_state', ctx=Load()))), + Assign( + targets=[ + Name(id='old_status', ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='old', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='LAST_STATUS'), + Constant(value='')])), + Assign( + targets=[ + Name(id='mail_sent', ctx=Store())], + value=Constant(value=False)), + If( + test=BoolOp( + op=And(), + values=[ + Compare( + left=Name(id='status', ctx=Load()), + ops=[ + NotEq()], + comparators=[ + Constant(value='OK')]), + Compare( + left=Name(id='old_status', ctx=Load()), + ops=[ + NotEq()], + comparators=[ + Constant(value='FAIL')])]), + body=[ + Assign( + targets=[ + Name(id='subject', ctx=Store())], + value=Constant(value='[Складчик] ТРЕВОГА: мониторинг жалоб')), + Assign( + targets=[ + Name(id='mail_sent', ctx=Store())], + value=Call( + func=Name(id='edge_mail', ctx=Load()), + args=[ + Name(id='subject', ctx=Load()), + Call( + func=Name(id='render_body', ctx=Load()), + args=[ + Name(id='status', ctx=Load()), + Name(id='facts', ctx=Load()), + Name(id='problems', ctx=Load()), + Name(id='mode', ctx=Load())])])), + If( + test=UnaryOp( + op=Not(), + operand=Name(id='mail_sent', ctx=Load())), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='supervisor_mail_send_failed')])), + Assign( + targets=[ + Name(id='status', ctx=Store())], + value=Constant(value='FAIL'))])], + orelse=[ + If( + test=BoolOp( + op=And(), + values=[ + Compare( + left=Name(id='status', ctx=Load()), + ops=[ + Eq()], + comparators=[ + Constant(value='OK')]), + Compare( + left=Name(id='old_status', ctx=Load()), + ops=[ + Eq()], + comparators=[ + Constant(value='FAIL')])]), + body=[ + Assign( + targets=[ + Name(id='subject', ctx=Store())], + value=Constant(value='[Складчик] ВОССТАНОВЛЕНО: мониторинг жалоб и backup снова OK')), + Assign( + targets=[ + Name(id='mail_sent', ctx=Store())], + value=Call( + func=Name(id='edge_mail', ctx=Load()), + args=[ + Name(id='subject', ctx=Load()), + Call( + func=Name(id='render_body', ctx=Load()), + args=[ + Name(id='status', ctx=Load()), + Name(id='facts', ctx=Load()), + Name(id='problems', ctx=Load()), + Name(id='mode', ctx=Load())])])), + If( + test=UnaryOp( + op=Not(), + operand=Name(id='mail_sent', ctx=Load())), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='problems', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Constant(value='supervisor_mail_send_failed')])), + Assign( + targets=[ + Name(id='status', ctx=Store())], + value=Constant(value='FAIL'))])])]), + Expr( + value=Call( + func=Name(id='write_health', ctx=Load()), + args=[ + Name(id='status', ctx=Load()), + Name(id='facts', ctx=Load()), + Name(id='problems', ctx=Load()), + Name(id='mail_sent', ctx=Load())])), + Expr( + value=Call( + func=Name(id='write_state', ctx=Load()), + args=[ + Name(id='status', ctx=Load()), + Name(id='problems', ctx=Load())])), + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + JoinedStr( + values=[ + Constant(value='SUPERVISOR_STATUS='), + FormattedValue( + value=Name(id='status', ctx=Load()), + conversion=-1)])])), + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + JoinedStr( + values=[ + Constant(value='SUPERVISOR_MAIL_SENT='), + FormattedValue( + value=IfExp( + test=Name(id='mail_sent', ctx=Load()), + body=Constant(value='yes'), + orelse=Constant(value='no')), + conversion=-1)])])), + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + BinOp( + left=Constant(value='SUPERVISOR_PROBLEMS='), + op=Add(), + right=IfExp( + test=Name(id='problems', ctx=Load()), + body=Call( + func=Attribute( + value=Constant(value=','), + attr='join', + ctx=Load()), + args=[ + Name(id='problems', ctx=Load())]), + orelse=Constant(value='none')))])), + Expr( + value=Call( + func=Name(id='print', ctx=Load()), + args=[ + JoinedStr( + values=[ + Constant(value='MONITOR='), + FormattedValue( + value=Call( + + +SUPERVISOR_FUNC_4_AST_END +BACKUP_AUDIT_PRESENT=true +BACKUP_AUDIT_SHA=1c2cd8a00859492c010ed35baf5eb67f4278544809de8c2563421a6f3e356ed3 +BACKUP_AUDIT_BASENAME=homelab-backup-audit +BACKUP_AUDIT_AST_OK=true +BACKUP_AUDIT_FUNCTION_COUNT=7 +BACKUP_AUDIT_FUNCTIONS=run,collect,parse_epoch,latest_legacy,unit_ok,parse_app_plan,expected_v2_heavy_lock_owner +BACKUP_AUDIT_CLI_OPTION_COUNT=0 +BACKUP_AUDIT_CLI_OPTIONS=NONE +BACKUP_AUDIT_ENV_NAME_COUNT=0 +BACKUP_AUDIT_ENV_NAMES=NONE +BACKUP_AUDIT_RELEVANT_FUNCTION_COUNT=4 +BACKUP_AUDIT_FUNC_1_NAME=collect +BACKUP_AUDIT_FUNC_1_LINENO=34 +BACKUP_AUDIT_FUNC_1_ENDLINENO=39 +BACKUP_AUDIT_FUNC_1_NAMES=append,collect,dict,get,isinstance,list,obj,out,str,v,values +BACKUP_AUDIT_FUNC_1_AST_BEGIN +FunctionDef( + name='collect', + args=arguments( + args=[ + arg(arg='obj'), + arg(arg='out')]), + body=[ + If( + test=Call( + func=Name(id='isinstance', ctx=Load()), + args=[ + Name(id='obj', ctx=Load()), + Name(id='dict', ctx=Load())]), + body=[ + If( + test=Call( + func=Name(id='isinstance', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='obj', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='logical_id')]), + Name(id='str', ctx=Load())]), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='out', ctx=Load()), + attr='append', + ctx=Load()), + args=[ + Name(id='obj', ctx=Load())]))]), + For( + target=Name(id='v', ctx=Store()), + iter=Call( + func=Attribute( + value=Name(id='obj', ctx=Load()), + attr='values', + ctx=Load())), + body=[ + Expr( + value=Call( + func=Name(id='collect', ctx=Load()), + args=[ + Name(id='v', ctx=Load()), + Name(id='out', ctx=Load())]))])], + orelse=[ + If( + test=Call( + func=Name(id='isinstance', ctx=Load()), + args=[ + Name(id='obj', ctx=Load()), + Name(id='list', ctx=Load())]), + body=[ + For( + target=Name(id='v', ctx=Store()), + iter=Name(id='obj', ctx=Load()), + body=[ + Expr( + value=Call( + func=Name(id='collect', ctx=Load()), + args=[ + Name(id='v', ctx=Load()), + Name(id='out', ctx=Load())]))])])])]) +BACKUP_AUDIT_FUNC_1_AST_END +BACKUP_AUDIT_FUNC_2_NAME=latest_legacy +BACKUP_AUDIT_FUNC_2_LINENO=53 +BACKUP_AUDIT_FUNC_2_ENDLINENO=77 +BACKUP_AUDIT_FUNC_2_NAMES=APPREST,Exception,QROOT,VMREST,age,best,best_epoch,d,epoch,gen,get,glob,int,is_dir,is_file,json,kind,loads,logical,max,obj,p,parse_epoch,read_text,restore,rev,rj,rroot,score,st_mtime,stat,str,strict,time +BACKUP_AUDIT_FUNC_2_AST_BEGIN +FunctionDef( + name='latest_legacy', + args=arguments( + args=[ + arg(arg='logical'), + arg(arg='kind')]), + body=[ + Assign( + targets=[ + Name(id='d', ctx=Store())], + value=BinOp( + left=Name(id='QROOT', ctx=Load()), + op=Div(), + right=Name(id='logical', ctx=Load()))), + Assign( + targets=[ + Name(id='best', ctx=Store())], + value=Constant(value=None)), + Assign( + targets=[ + Name(id='best_epoch', ctx=Store())], + value=UnaryOp( + op=USub(), + operand=Constant(value=1))), + If( + test=UnaryOp( + op=Not(), + operand=Call( + func=Attribute( + value=Name(id='d', ctx=Load()), + attr='is_dir', + ctx=Load()))), + body=[ + Return( + value=Constant(value=None))]), + For( + target=Name(id='p', ctx=Store()), + iter=Call( + func=Attribute( + value=Name(id='d', ctx=Load()), + attr='glob', + ctx=Load()), + args=[ + Constant(value='*.json')]), + body=[ + Try( + body=[ + Assign( + targets=[ + Name(id='obj', ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='json', ctx=Load()), + attr='loads', + ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='p', ctx=Load()), + attr='read_text', + ctx=Load()), + keywords=[ + keyword( + arg='encoding', + value=Constant(value='utf-8'))])]))], + handlers=[ + ExceptHandler( + type=Name(id='Exception', ctx=Load()), + body=[ + Continue()])]), + Assign( + targets=[ + Name(id='epoch', ctx=Store())], + value=Call( + func=Name(id='parse_epoch', ctx=Load()), + args=[ + Name(id='obj', ctx=Load())])), + Assign( + targets=[ + Name(id='score', ctx=Store())], + value=IfExp( + test=Compare( + left=Name(id='epoch', ctx=Load()), + ops=[ + IsNot()], + comparators=[ + Constant(value=None)]), + body=Name(id='epoch', ctx=Load()), + orelse=Call( + func=Name(id='int', ctx=Load()), + args=[ + Attribute( + value=Call( + func=Attribute( + value=Name(id='p', ctx=Load()), + attr='stat', + ctx=Load())), + attr='st_mtime', + ctx=Load())]))), + If( + test=Compare( + left=Name(id='score', ctx=Load()), + ops=[ + Gt()], + comparators=[ + Name(id='best_epoch', ctx=Load())]), + body=[ + Assign( + targets=[ + Name(id='best_epoch', ctx=Store())], + value=Name(id='score', ctx=Load())), + Assign( + targets=[ + Name(id='best', ctx=Store())], + value=Tuple( + elts=[ + Name(id='p', ctx=Load()), + Name(id='obj', ctx=Load()), + Name(id='score', ctx=Load())], + ctx=Load()))])]), + If( + test=UnaryOp( + op=Not(), + operand=Name(id='best', ctx=Load())), + body=[ + Return( + value=Constant(value=None))]), + Assign( + targets=[ + Tuple( + elts=[ + Name(id='p', ctx=Store()), + Name(id='obj', ctx=Store()), + Name(id='epoch', ctx=Store())], + ctx=Store())], + value=Name(id='best', ctx=Load())), + Assign( + targets=[ + Name(id='gen', ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='obj', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='generation')])), + Assign( + targets=[ + Name(id='strict', ctx=Store())], + value=BoolOp( + op=And(), + values=[ + Compare( + left=Call( + func=Attribute( + value=Name(id='obj', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='status')]), + ops=[ + Eq()], + comparators=[ + Constant(value='SEALED')]), + Compare( + left=Call( + func=Attribute( + value=Name(id='obj', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='cloud_quorum')]), + ops=[ + Eq()], + comparators=[ + Constant(value=2)]), + Compare( + left=Call( + func=Attribute( + value=Name(id='obj', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='cloud_a_verified')]), + ops=[ + Is()], + comparators=[ + Constant(value=True)]), + Compare( + left=Call( + func=Attribute( + value=Name(id='obj', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='cloud_b_verified')]), + ops=[ + Is()], + comparators=[ + Constant(value=True)]), + Compare( + left=Call( + func=Attribute( + value=Name(id='obj', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='part_hashes_verified')]), + ops=[ + Is()], + comparators=[ + Constant(value=True)]), + Compare( + left=Call( + func=Attribute( + value=Name(id='obj', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='seal_written')]), + ops=[ + Is()], + comparators=[ + Constant(value=True)]), + Compare( + left=Call( + func=Attribute( + value=Name(id='obj', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='local_payload_present')]), + ops=[ + Is()], + comparators=[ + Constant(value=False)]), + Compare( + left=Call( + func=Attribute( + value=Name(id='obj', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='local_cleanup')]), + ops=[ + Eq()], + comparators=[ + Constant(value='OK')])])), + Assign( + targets=[ + Name(id='rroot', ctx=Store())], + value=IfExp( + test=Compare( + left=Name(id='kind', ctx=Load()), + ops=[ + Eq()], + comparators=[ + Constant(value='VM')]), + body=Name(id='VMREST', ctx=Load()), + orelse=Name(id='APPREST', ctx=Load()))), + Assign( + targets=[ + Name(id='rev', ctx=Store())], + value=IfExp( + test=Name(id='gen', ctx=Load()), + body=BinOp( + left=BinOp( + left=Name(id='rroot', ctx=Load()), + op=Div(), + right=Name(id='logical', ctx=Load())), + op=Div(), + right=BinOp( + left=Call( + func=Name(id='str', ctx=Load()), + args=[ + Name(id='gen', ctx=Load())]), + op=Add(), + right=Constant(value='.json'))), + orelse=Constant(value=None))), + Assign( + targets=[ + Name(id='restore', ctx=Store())], + value=Constant(value=False)), + If( + test=BoolOp( + op=And(), + values=[ + Name(id='rev', ctx=Load()), + Call( + func=Attribute( + value=Name(id='rev', ctx=Load()), + attr='is_file', + ctx=Load()))]), + body=[ + Try( + body=[ + Assign( + targets=[ + Name(id='rj', ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='json', ctx=Load()), + attr='loads', + ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='rev', ctx=Load()), + attr='read_text', + ctx=Load()), + keywords=[ + keyword( + arg='encoding', + value=Constant(value='utf-8'))])])), + Assign( + targets=[ + Name(id='restore', ctx=Store())], + value=Compare( + left=Call( + func=Attribute( + value=Name(id='rj', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='result')]), + ops=[ + Eq()], + comparators=[ + Constant(value='OK')]))], + handlers=[ + ExceptHandler( + type=Name(id='Exception', ctx=Load()), + body=[ + Pass()])])]), + Assign( + targets=[ + Name(id='age', ctx=Store())], + value=IfExp( + test=Name(id='epoch', ctx=Load()), + body=Call( + func=Name(id='max', ctx=Load()), + args=[ + Constant(value=0), + Call( + func=Name(id='int', ctx=Load()), + args=[ + BinOp( + left=Call( + func=Attribute( + value=Name(id='time', ctx=Load()), + attr='time', + ctx=Load())), + op=Sub(), + right=Name(id='epoch', ctx=Load()))])]), + orelse=Constant(value=None))), + Return( + value=Dict( + keys=[ + Constant(value='generation'), + Constant(value='strict'), + Constant(value='restore_ok'), + Constant(value='age_seconds'), + Constant(value='state_file'), + Constant(value='obj')], + values=[ + Name(id='gen', ctx=Load()), + Name(id='strict', ctx=Load()), + Name(id='restore', ctx=Load()), + Name(id='age', ctx=Load()), + Call( + func=Name(id='str', ctx=Load()), + args=[ + Name(id='p', ctx=Load())]), + Name(id='obj', ctx=Load())]))]) +BACKUP_AUDIT_FUNC_2_AST_END +BACKUP_AUDIT_FUNC_3_NAME=parse_app_plan +BACKUP_AUDIT_FUNC_3_LINENO=84 +BACKUP_AUDIT_FUNC_3_ENDLINENO=93 +BACKUP_AUDIT_FUNC_3_NAMES=d,get,k,line,r,split,splitlines,startswith,tok,txt,v +BACKUP_AUDIT_FUNC_3_AST_BEGIN +FunctionDef( + name='parse_app_plan', + args=arguments( + args=[ + arg(arg='txt')]), + body=[ + Assign( + targets=[ + Name(id='d', ctx=Store())], + value=Dict()), + For( + target=Name(id='line', ctx=Store()), + iter=Call( + func=Attribute( + value=Name(id='txt', ctx=Load()), + attr='splitlines', + ctx=Load())), + body=[ + If( + test=Call( + func=Attribute( + value=Name(id='line', ctx=Load()), + attr='startswith', + ctx=Load()), + args=[ + Constant(value='QUEUE_FRESHNESS_PLAN APP=')]), + body=[ + Assign( + targets=[ + Name(id='r', ctx=Store())], + value=Dict()), + For( + target=Name(id='tok', ctx=Store()), + iter=Subscript( + value=Call( + func=Attribute( + value=Name(id='line', ctx=Load()), + attr='split', + ctx=Load())), + slice=Slice( + lower=Constant(value=1)), + ctx=Load()), + body=[ + If( + test=Compare( + left=Constant(value='='), + ops=[ + In()], + comparators=[ + Name(id='tok', ctx=Load())]), + body=[ + Assign( + targets=[ + Tuple( + elts=[ + Name(id='k', ctx=Store()), + Name(id='v', ctx=Store())], + ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='tok', ctx=Load()), + attr='split', + ctx=Load()), + args=[ + Constant(value='='), + Constant(value=1)])), + Assign( + targets=[ + Subscript( + value=Name(id='r', ctx=Load()), + slice=Name(id='k', ctx=Load()), + ctx=Store())], + value=Name(id='v', ctx=Load()))])]), + If( + test=Call( + func=Attribute( + value=Name(id='r', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='APP')]), + body=[ + Assign( + targets=[ + Subscript( + value=Name(id='d', ctx=Load()), + slice=Subscript( + value=Name(id='r', ctx=Load()), + slice=Constant(value='APP'), + ctx=Load()), + ctx=Store())], + value=Call( + func=Attribute( + value=Name(id='r', ctx=Load()), + attr='get', + ctx=Load()), + args=[ + Constant(value='DECISION')]))])])]), + Return( + value=Name(id='d', ctx=Load()))]) +BACKUP_AUDIT_FUNC_3_AST_END +BACKUP_AUDIT_FUNC_4_NAME=expected_v2_heavy_lock_owner +BACKUP_AUDIT_FUNC_4_LINENO=188 +BACKUP_AUDIT_FUNC_4_ENDLINENO=200 +BACKUP_AUDIT_FUNC_4_NAMES=Exception,_,a,add,arc,fe,fo,frc,int,isdigit,owners,pid,pid_text,prc,replace,run,set,split,strip,tok +BACKUP_AUDIT_FUNC_4_AST_BEGIN +FunctionDef( + name='expected_v2_heavy_lock_owner', + args=arguments(), + body=[ + Assign( + targets=[ + Tuple( + elts=[ + Name(id='arc', ctx=Store()), + Name(id='a', ctx=Store()), + Name(id='_', ctx=Store())], + ctx=Store())], + value=Call( + func=Name(id='run', ctx=Load()), + args=[ + List( + elts=[ + Constant(value='systemctl'), + Constant(value='show'), + Constant(value='homelab-backup-v2.service'), + Constant(value='-p'), + Constant(value='ActiveState'), + Constant(value='--value')], + ctx=Load()), + Constant(value=10)])), + Assign( + targets=[ + Tuple( + elts=[ + Name(id='prc', ctx=Store()), + Name(id='pid_text', ctx=Store()), + Name(id='_', ctx=Store())], + ctx=Store())], + value=Call( + func=Name(id='run', ctx=Load()), + args=[ + List( + elts=[ + Constant(value='systemctl'), + Constant(value='show'), + Constant(value='homelab-backup-v2.service'), + Constant(value='-p'), + Constant(value='MainPID'), + Constant(value='--value')], + ctx=Load()), + Constant(value=10)])), + If( + test=BoolOp( + op=Or(), + values=[ + Compare( + left=Name(id='arc', ctx=Load()), + ops=[ + NotEq()], + comparators=[ + Constant(value=0)]), + Compare( + left=Name(id='prc', ctx=Load()), + ops=[ + NotEq()], + comparators=[ + Constant(value=0)]), + Compare( + left=Call( + func=Attribute( + value=Name(id='a', ctx=Load()), + attr='strip', + ctx=Load())), + ops=[ + NotIn()], + comparators=[ + Tuple( + elts=[ + Constant(value='active'), + Constant(value='activating')], + ctx=Load())])]), + body=[ + Return( + value=Constant(value=False))]), + Try( + body=[ + Assign( + targets=[ + Name(id='pid', ctx=Store())], + value=Call( + func=Name(id='int', ctx=Load()), + args=[ + Call( + func=Attribute( + value=Name(id='pid_text', ctx=Load()), + attr='strip', + ctx=Load()))]))], + handlers=[ + ExceptHandler( + type=Name(id='Exception', ctx=Load()), + body=[ + Return( + value=Constant(value=False))])]), + If( + test=Compare( + left=Name(id='pid', ctx=Load()), + ops=[ + LtE()], + comparators=[ + Constant(value=0)]), + body=[ + Return( + value=Constant(value=False))]), + Assign( + targets=[ + Tuple( + elts=[ + Name(id='frc', ctx=Store()), + Name(id='fo', ctx=Store()), + Name(id='fe', ctx=Store())], + ctx=Store())], + value=Call( + func=Name(id='run', ctx=Load()), + args=[ + List( + elts=[ + Constant(value='fuser'), + Constant(value='/run/homelab-backup-heavy.lock')], + ctx=Load()), + Constant(value=10)])), + Assign( + targets=[ + Name(id='owners', ctx=Store())], + value=Call( + func=Name(id='set', ctx=Load()))), + For( + target=Name(id='tok', ctx=Store()), + iter=Call( + func=Attribute( + value=Call( + func=Attribute( + value=BinOp( + left=BinOp( + left=Name(id='fo', ctx=Load()), + op=Add(), + right=Constant(value=' ')), + op=Add(), + right=Name(id='fe', ctx=Load())), + attr='replace', + ctx=Load()), + args=[ + Constant(value=':'), + Constant(value=' ')]), + attr='split', + ctx=Load())), + body=[ + If( + test=Call( + func=Attribute( + value=Name(id='tok', ctx=Load()), + attr='isdigit', + ctx=Load())), + body=[ + Expr( + value=Call( + func=Attribute( + value=Name(id='owners', ctx=Load()), + attr='add', + ctx=Load()), + args=[ + Call( + func=Name(id='int', ctx=Load()), + args=[ + Name(id='tok', ctx=Load())])]))])]), + Return( + value=BoolOp( + op=And(), + values=[ + Compare( + left=Name(id='frc', ctx=Load()), + ops=[ + Eq()], + comparators=[ + Constant(value=0)]), + Compare( + left=Name(id='owners', ctx=Load()), + ops=[ + Eq()], + comparators=[ + Set( + elts=[ + Name(id='pid', ctx=Load())])])]))]) +BACKUP_AUDIT_FUNC_4_AST_END +QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_PRESENT=true +QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_SHA=1f959049cca2710a2cb820cc1f6acab16399c6b6711b9e4522e0ecd49e0e4650 +QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_BASENAME=homelab-app-cloud-quorum-queue +QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_AST_OK=false +QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_AST_ERROR=SyntaxError +QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_HELP_RC=64 +QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_HELP_SHA=53bc0423b5ea9142a7be1f687f1572975bc52349a1fd28f97d6c0748b2b445e1 +QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_HELP_BEGIN + +APP_QUORUM_QUEUE_ERROR=ACTION_INVALID +QUORUM_HOMELAB_APP_CLOUD_QUORUM_QUEUE_HELP_END +PRODUCER_SCRIPT_COUNT=3 +PRODUCER_UNIT_COUNT=4 +PRODUCER_UNIT_1_NAME=homelab-app-cloud-quorum-queue.service +PRODUCER_UNIT_1_SHOW_RC=0 +PRODUCER_UNIT_1_LOADSTATE=loaded +PRODUCER_UNIT_1_ACTIVESTATE=inactive +PRODUCER_UNIT_1_UNITFILESTATE=static +PRODUCER_UNIT_1_RESULT=success +PRODUCER_UNIT_1_EXECMAINSTATUS=0 +PRODUCER_UNIT_1_FRAGMENT_BASENAME=homelab-app-cloud-quorum-queue.service +PRODUCER_UNIT_1_FRAGMENT_SHA=afaa997bd85dafdb29d2cd2b53527996171c21fd5e80ae559f8f2bee0dcbbf1a +PRODUCER_UNIT_1_EXECSTART_SHA=22094bb14d8dc5f7399744e183b096583a9c9625527a2f00981f2ec5cd8e1713 +PRODUCER_UNIT_1_EXEC_COMPONENTS=NONE +PRODUCER_UNIT_1_ENVFILES_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +PRODUCER_UNIT_2_NAME=homelab-app-cloud-quorum-queue.timer +PRODUCER_UNIT_2_SHOW_RC=0 +PRODUCER_UNIT_2_LOADSTATE=loaded +PRODUCER_UNIT_2_ACTIVESTATE=active +PRODUCER_UNIT_2_UNITFILESTATE=enabled +PRODUCER_UNIT_2_RESULT=success +PRODUCER_UNIT_2_EXECMAINSTATUS= +PRODUCER_UNIT_2_FRAGMENT_BASENAME=homelab-app-cloud-quorum-queue.timer +PRODUCER_UNIT_2_FRAGMENT_SHA=af2eedce3df53029b591d31715a3f3e6688ddb997b4823f487e70c339ce88078 +PRODUCER_UNIT_2_EXECSTART_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +PRODUCER_UNIT_2_EXEC_COMPONENTS=NONE +PRODUCER_UNIT_2_ENVFILES_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +PRODUCER_UNIT_3_NAME=skladchik-reports-monitor-supervisor.service +PRODUCER_UNIT_3_SHOW_RC=0 +PRODUCER_UNIT_3_LOADSTATE=loaded +PRODUCER_UNIT_3_ACTIVESTATE=inactive +PRODUCER_UNIT_3_UNITFILESTATE=static +PRODUCER_UNIT_3_RESULT=success +PRODUCER_UNIT_3_EXECMAINSTATUS=0 +PRODUCER_UNIT_3_FRAGMENT_BASENAME=skladchik-reports-monitor-supervisor.service +PRODUCER_UNIT_3_FRAGMENT_SHA=e874fb03573b76181f3eb812c7285848e60705923c172a2f102504a7b9100ef7 +PRODUCER_UNIT_3_EXECSTART_SHA=27a2477643cbfc4f8676fd88ebc5cff23e471bc80f89094941123fa62e3edc5f +PRODUCER_UNIT_3_EXEC_COMPONENTS=skladchik-reports-monitor-supervisor +PRODUCER_UNIT_3_ENVFILES_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +PRODUCER_UNIT_4_NAME=skladchik-reports-monitor-supervisor.timer +PRODUCER_UNIT_4_SHOW_RC=0 +PRODUCER_UNIT_4_LOADSTATE=loaded +PRODUCER_UNIT_4_ACTIVESTATE=active +PRODUCER_UNIT_4_UNITFILESTATE=enabled +PRODUCER_UNIT_4_RESULT=success +PRODUCER_UNIT_4_EXECMAINSTATUS= +PRODUCER_UNIT_4_FRAGMENT_BASENAME=skladchik-reports-monitor-supervisor.timer +PRODUCER_UNIT_4_FRAGMENT_SHA=3c3e38a40b3dfbfaa77d99a1c2bea4b58009130eac7a5197356dead1137a5ef6 +PRODUCER_UNIT_4_EXECSTART_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +PRODUCER_UNIT_4_EXEC_COMPONENTS=NONE +PRODUCER_UNIT_4_ENVFILES_SHA=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +APPID_CONFIG_MATCH_COUNT=565 +APPID_CONFIG_1_BASENAME=targets.json +APPID_CONFIG_1_PATH_HINT=//etc/homelab-backup/targets.json +APPID_CONFIG_1_SHA=2f526330152d49461ff66f50adab57d1a195ea5d1b4c292945d523411b8a68a8 +APPID_CONFIG_1_LINE_NOS=115 +APPID_CONFIG_2_BASENAME=targets.json.before-skladchik-core-apps-20261003T205612Z.bak +APPID_CONFIG_2_PATH_HINT=//etc/homelab-backup/targets.json.before-skladchik-core-apps-20261003T205612Z.bak +APPID_CONFIG_2_SHA=6ecf034ca03b52a1e6beceeae81d86a623885462c095d50b133aea4048a4626e +APPID_CONFIG_2_LINE_NOS=115 +APPID_CONFIG_3_BASENAME=task.json +APPID_CONFIG_3_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T192441Z-1666483-preflight/task.json +APPID_CONFIG_3_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb +APPID_CONFIG_3_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_4_BASENAME=task.json +APPID_CONFIG_4_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T192627Z-1668009-prepare/task.json +APPID_CONFIG_4_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb +APPID_CONFIG_4_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_5_BASENAME=task.json +APPID_CONFIG_5_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T192843Z-1681558-dry-run/task.json +APPID_CONFIG_5_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb +APPID_CONFIG_5_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_6_BASENAME=task.json +APPID_CONFIG_6_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T193210Z-1692269-apply/task.json +APPID_CONFIG_6_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb +APPID_CONFIG_6_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_7_BASENAME=task.json +APPID_CONFIG_7_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T193950Z-1722753-preflight/task.json +APPID_CONFIG_7_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb +APPID_CONFIG_7_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_8_BASENAME=task.json +APPID_CONFIG_8_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T193952Z-1722941-prepare/task.json +APPID_CONFIG_8_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb +APPID_CONFIG_8_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_9_BASENAME=task.json +APPID_CONFIG_9_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T193952Z-1723022-dry-run/task.json +APPID_CONFIG_9_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb +APPID_CONFIG_9_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_10_BASENAME=task.json +APPID_CONFIG_10_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T194508Z-1738655-apply/task.json +APPID_CONFIG_10_SHA=0574665bd3a394e6471a28f0803d6a0134d61fd382ffe702f923a3336a845bcb +APPID_CONFIG_10_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_11_BASENAME=task.json +APPID_CONFIG_11_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T200841Z-1818714-preflight/task.json +APPID_CONFIG_11_SHA=8741a7407c135ebe5303056da44186d280b410efbca3714054a990d0f0340aec +APPID_CONFIG_11_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_12_BASENAME=task.json +APPID_CONFIG_12_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T200843Z-1818903-prepare/task.json +APPID_CONFIG_12_SHA=8741a7407c135ebe5303056da44186d280b410efbca3714054a990d0f0340aec +APPID_CONFIG_12_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_13_BASENAME=task.json +APPID_CONFIG_13_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T200843Z-1818980-dry-run/task.json +APPID_CONFIG_13_SHA=8741a7407c135ebe5303056da44186d280b410efbca3714054a990d0f0340aec +APPID_CONFIG_13_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_14_BASENAME=task.json +APPID_CONFIG_14_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T201139Z-1833098-apply/task.json +APPID_CONFIG_14_SHA=8741a7407c135ebe5303056da44186d280b410efbca3714054a990d0f0340aec +APPID_CONFIG_14_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_15_BASENAME=task.json +APPID_CONFIG_15_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T201939Z-1860663-preflight/task.json +APPID_CONFIG_15_SHA=c121d768f5aaf7dc111cf176f890bbd7508650813760b99ed97aa19613c94e68 +APPID_CONFIG_15_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_16_BASENAME=task.json +APPID_CONFIG_16_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T201941Z-1860857-prepare/task.json +APPID_CONFIG_16_SHA=c121d768f5aaf7dc111cf176f890bbd7508650813760b99ed97aa19613c94e68 +APPID_CONFIG_16_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_17_BASENAME=task.json +APPID_CONFIG_17_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T201941Z-1860933-dry-run/task.json +APPID_CONFIG_17_SHA=c121d768f5aaf7dc111cf176f890bbd7508650813760b99ed97aa19613c94e68 +APPID_CONFIG_17_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_18_BASENAME=task.json +APPID_CONFIG_18_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T202241Z-1874939-apply/task.json +APPID_CONFIG_18_SHA=c121d768f5aaf7dc111cf176f890bbd7508650813760b99ed97aa19613c94e68 +APPID_CONFIG_18_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_19_BASENAME=task.json +APPID_CONFIG_19_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T204310Z-1946040-preflight/task.json +APPID_CONFIG_19_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2 +APPID_CONFIG_19_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_20_BASENAME=task.json +APPID_CONFIG_20_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T204311Z-1946265-prepare/task.json +APPID_CONFIG_20_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2 +APPID_CONFIG_20_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_21_BASENAME=task.json +APPID_CONFIG_21_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T204311Z-1946345-dry-run/task.json +APPID_CONFIG_21_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2 +APPID_CONFIG_21_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_22_BASENAME=task.json +APPID_CONFIG_22_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T204533Z-1956057-apply/task.json +APPID_CONFIG_22_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2 +APPID_CONFIG_22_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_23_BASENAME=task.json +APPID_CONFIG_23_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T205721Z-1989628-preflight/task.json +APPID_CONFIG_23_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2 +APPID_CONFIG_23_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_24_BASENAME=task.json +APPID_CONFIG_24_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T205722Z-1989815-prepare/task.json +APPID_CONFIG_24_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2 +APPID_CONFIG_24_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_25_BASENAME=task.json +APPID_CONFIG_25_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T205722Z-1989891-dry-run/task.json +APPID_CONFIG_25_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2 +APPID_CONFIG_25_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_26_BASENAME=stderr.log +APPID_CONFIG_26_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T210034Z-2011730-apply/stderr.log +APPID_CONFIG_26_SHA=bbc5b7b614a73219147a06614942e2c67176375af10bcb85aeac5565cb8c2532 +APPID_CONFIG_26_LINE_NOS=7,8 +APPID_CONFIG_27_BASENAME=stdout.log +APPID_CONFIG_27_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T210034Z-2011730-apply/stdout.log +APPID_CONFIG_27_SHA=cdf49d288d7b019b1a5f5099fe8b3e4f5ed1432294051a3c2020a4369c4afd41 +APPID_CONFIG_27_LINE_NOS=24,31,32,35 +APPID_CONFIG_28_BASENAME=task.json +APPID_CONFIG_28_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T210034Z-2011730-apply/task.json +APPID_CONFIG_28_SHA=51ff18905717a2c1871cb25b56f4959d87d7ee798296f720b263332af8785bf2 +APPID_CONFIG_28_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_29_BASENAME=task.json +APPID_CONFIG_29_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T211239Z-2049968-preflight/task.json +APPID_CONFIG_29_SHA=4d850b025c6a9ad347015321775f9d0466149fb9d5a70212f91b6535adc3c0e3 +APPID_CONFIG_29_LINE_NOS=44,55,56,81,86 +APPID_CONFIG_30_BASENAME=task.json +APPID_CONFIG_30_PATH_HINT=lib/homelab-admin/runs/backup-app-cloud-quorum-cutover-v1/20260808T213313Z-2127686-preflight/task.json +APPID_CONFIG_30_SHA=d98bdf83ab6a9fda0d864e3ccac4a0d01e7813fec9f1173a6d4d5e8712c8e238 +APPID_CONFIG_30_LINE_NOS=44,55,56,81,86 +GEN_JOURNAL_MATCH_COUNT=3 +GEN_JOURNAL_1_UNIT=skladchik-reports-monitor-supervisor.service +GEN_JOURNAL_1_IDENT=skladchik-reports-monitor-supervisor +GEN_JOURNAL_1_EXE_BASENAME=python3.13 +GEN_JOURNAL_1_PID=932988 +GEN_JOURNAL_1_MESSAGE_SHA=93a0f7b08cf701cc4f77f2d02c659932db4ca849640cbbe55327693c1e4365eb +GEN_JOURNAL_1_FLAGS=generation,backup,sealed +GEN_JOURNAL_2_UNIT=homelab-backup-audit.service +GEN_JOURNAL_2_IDENT=homelab-backup-audit +GEN_JOURNAL_2_EXE_BASENAME=python3.13 +GEN_JOURNAL_2_PID=966882 +GEN_JOURNAL_2_MESSAGE_SHA=c8c9e905543f63dbee767d26e1c1824c99e7a23094405dba984b18361a36527f +GEN_JOURNAL_2_FLAGS=generation,fresh,skip_fresh +GEN_JOURNAL_3_UNIT=skladchik-reports-monitor-supervisor.service +GEN_JOURNAL_3_IDENT=skladchik-reports-monitor-supervisor +GEN_JOURNAL_3_EXE_BASENAME=python3.13 +GEN_JOURNAL_3_PID=968339 +GEN_JOURNAL_3_MESSAGE_SHA=93a0f7b08cf701cc4f77f2d02c659932db4ca849640cbbe55327693c1e4365eb +GEN_JOURNAL_3_FLAGS=generation,backup,sealed +QUORUM_SCRIPT_READY=false +QUORUM_UNIT_READY=true +APPID_CONFIG_READY=true +BACKUP_PRODUCER_TOPOLOGY_READY=false +MAIL_SENT_BY_COMMAND=false CHANGES_MADE=false ROLLBACK_STARTED=false ROLLBACK_RESTORED=null MUTATION_OUTCOME=NO_MUTATION +DECISION=HOLD_BACKUP_PRODUCER_RCA +NEXT_GATE=BACKUP_PRODUCER_RECONCILE +TASK_RESULT=SKLADCHIK_DURABILITY_BACKUP_PRODUCER_RCA OUTPUT_END CHAT_OUTPUT_END