1
0
Files
homelab-public-context/runtime/latest.txt
T

2219 lines
75 KiB
Plaintext

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='<STR len=870 sha=810f6d32471c23a6>')),
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
<TRUNCATED len=32262 sha=ed5d6c179095d9303280fce46b2a815ee2f05348c6e2774d6db13ee393436cb6>
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='<STR len=33 sha=40b00748b4622055>'),
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(
<TRUNCATED len=18945 sha=f4a4af5518b9647f5f52013dd810094b555b6d99d4ad6f11ff77ca4917259a39>
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