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

39 lines
13 KiB
JSON

{
"schema_version": 1,
"channel": "homelab-runtime",
"command_id": "SUPPORT-261001-BACKUPV2-GREENRUN-REPLICA-SEMANTICS-99286R1",
"status": "OK",
"rc": 0,
"host": "pve01",
"mode": "read-only",
"component": "backupv2-greenrun-replica-semantics",
"started_at_utc": "2026-10-01T11:56:33Z",
"finished_at_utc": "2026-10-01T11:56:33Z",
"reference_register_checked": true,
"reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66",
"error_register_checked": true,
"error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0",
"command_sha256": "61da54040f32177be6f3809e8495cb184cceb11de39b9d9bf7eb6119c2720e57",
"duplicate_failed_command_blocked": false,
"block_reason": null,
"execution_started": true,
"change_declared": false,
"result_contract_valid": true,
"result_contract_status": null,
"result_contract_error": null,
"command_rc": 0,
"changes_made": false,
"rollback_started": false,
"rollback_restored": null,
"mutation_outcome": "NO_MUTATION",
"sanitized": true,
"secrets_included": false,
"private_addresses_included": false,
"raw_evidence_retained_locally": true,
"raw_evidence_sha256": "f0929f6271f6d6f73ad0dba877ee9ff7adf6772ceb58510da01fc056a0920840",
"sanitized_output_sha256": "f0929f6271f6d6f73ad0dba877ee9ff7adf6772ceb58510da01fc056a0920840",
"output_truncated_in_json": false,
"full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt",
"output": "BACKUPV2_GREENRUN_REPLICA_SEMANTICS=V1\nINGRESS_HOSTKEY_SELF_BOUND=true\nBACKUPV2_TARGETS_SHA_EXACT=true\nBACKUPV2_RETIRED_US_NETBIRD_EXACT=true\nFN_GREEN_RUN_PRESENT=true\nFN_GREEN_RUN_PARAMS=label\nFN_GREEN_RUN_DIRECT_CALLS=BackupError,append,backup_target,bootstrap_vps_keys,dumps,ensure_router_known_hosts,get,join,len,load_targets,print,sub,sum,upper\nFN_GREEN_RUN_IF_TESTS=failures,_allocator_healthy_ in r\nFN_GREEN_RUN_COMP_FILTERS=t.get(_green1_),t[_type_] _= _control_,t[_type_] == _control_\nFN_GREEN_RUN_IMPORTANT_CALLS=load_targets(),bootstrap_vps_keys(targets),backup_target(t, green_verify=t[_type_] _= _control_)\nFN_GREEN_RUN_RETURNS=0\nFN_GREEN_RUN_KEYS=allocator_healthy,generation,green1,logical_id,payload_bytes,replicas,type\nFN_GREEN_RUN_STRINGS=_CLOUD_BACKUP_TARGET_COUNT=,_CONTROL_VERIFY_TARGET_COUNT=,_GENERATION=,_REPLICAS=,_TARGET_COUNT=,_TARGET_FAILURES,generation,green1,logical_id,replicas\nFN_BACKUP_TARGET_PRESENT=true\nFN_BACKUP_TARGET_PARAMS=t,green_verify\nFN_BACKUP_TARGET_DIRECT_CALLS=BackupError,Path,bool,capture_target,cleanup_source,control_verify,ensure_dir,epoch,exists,generation_id,reconstruct_replica,rmtree,unlink,upload_and_seal,validate_payload,write_state\nFN_BACKUP_TARGET_IF_TESTS=t[_type_] == _control_,green_verify,pathlib.Path(payload).exists(),ha _= hb or ha _= manifest[_payload_sha256_]\nFN_BACKUP_TARGET_COMP_FILTERS=NONE\nFN_BACKUP_TARGET_IMPORTANT_CALLS=capture_target(t, gen, work),upload_and_seal(t, payload, meta),write_state(t[_logical_id_], _SUCCESS_, generation=gen, payload_sha256=manifest[_payload_sha256_], manifest_sha256=msha, replicas=manifest[_replicas_], green_verified=bool(green_verify), last_success_epoch=epoch()),reconstruct_replica(manifest, manifest[_replicas_][0], a),validate_payload(t, a),reconstruct_replica(manifest, manifest[_replicas_][1], b),validate_payload(t, b),write_state(t[_logical_id_], result, generation=gen, reason=e.code, sealed=sealed)\nFN_BACKUP_TARGET_RETURNS=control_verify(t),{_logical_id_: t[_logical_id_], _generation_: gen, _result_: _SUCCESS_, _payload_bytes_: manifest[_payload_bytes_], _replicas_: 2, _allocator_healthy_: alloc[_healthy_]}\nFN_BACKUP_TARGET_KEYS=allocator_healthy,generation,healthy,logical_id,payload_bytes,payload_sha256,replicas,result,type\nFN_BACKUP_TARGET_STRINGS=GREEN_REPLICA_COMPARE,SUCCESS,generation,logical_id,replicas\nFN_SELECT_REPLICAS_PRESENT=true\nFN_SELECT_REPLICAS_PARAMS=rows,payload_bytes,reserve_bytes\nFN_SELECT_REPLICAS_DIRECT_CALLS=BackupError,add,append,dict,get,isinstance,len,set,sort\nFN_SELECT_REPLICAS_IF_TESTS=len(out) _= 2,not isinstance(r.get(_free_), int),r[_free_] < payload_bytes + reserve_bytes,r[_physical_] in phys,len(out) == 2\nFN_SELECT_REPLICAS_COMP_FILTERS=NONE\nFN_SELECT_REPLICAS_IMPORTANT_CALLS=NONE\nFN_SELECT_REPLICAS_RETURNS=out\nFN_SELECT_REPLICAS_KEYS=crypt,free,physical\nFN_SELECT_REPLICAS_STRINGS=NONE\nFN_UPLOAD_AND_SEAL_PRESENT=true\nFN_UPLOAD_AND_SEAL_PARAMS=t,payload_path,source_meta\nFN_UPLOAD_AND_SEAL_DIRECT_CALLS=BackupError,Path,allocator,canonical_json,make_manifest,part_plan,rclone_cat_bytes,rclone_cat_hash,rclone_rcat,remote_exists_any,remote_generation_path,sha256_bytes,sha256_file,stat,utcnow\nFN_UPLOAD_AND_SEAL_IF_TESTS=remote_exists_any(t[_scope_], t[_logical_id_], gen),rclone_cat_bytes(base + _/manifest.json_) _= mb,rclone_cat_bytes(base + _/SEALED.json_) _= sb,got _= part[_sha256_]\nFN_UPLOAD_AND_SEAL_COMP_FILTERS=NONE\nFN_UPLOAD_AND_SEAL_IMPORTANT_CALLS=make_manifest(t[_scope_], t[_logical_id_], gen, n, psha, parts, reps, source_meta),rclone_rcat(base + _/manifest.json_, data=mb),rclone_rcat(base + _/SEALED.json_, data=sb),rclone_rcat(rp, source_path=payload_path, offset=part[_offset_], length=part[_bytes_]),rclone_cat_hash(rp, part[_bytes_]),rclone_cat_bytes(base + _/manifest.json_),rclone_cat_bytes(base + _/SEALED.json_)\nFN_UPLOAD_AND_SEAL_RETURNS=(manifest, msha, {_unhealthy_: bad, _healthy_: healthy})\nFN_UPLOAD_AND_SEAL_KEYS=bytes,crypt,generation,healthy,logical_id,manifest_sha256,name,offset,payload_sha256,schema,scope,sealed_at_utc,sha256,status,unhealthy\nFN_UPLOAD_AND_SEAL_STRINGS=/manifest.json,GENERATION_COLLISION,MANIFEST_READBACK_MISMATCH,generation,logical_id,manifest_sha256\nFN_WRITE_STATE_PRESENT=true\nFN_WRITE_STATE_PARAMS=logical_id,result\nFN_WRITE_STATE_DIRECT_CALLS=BackupError,atomic_write,canonical_json,epoch,utcnow\nFN_WRITE_STATE_IF_TESTS=result not in RESULT_CLASSES,result == _SUCCESS_\nFN_WRITE_STATE_COMP_FILTERS=NONE\nFN_WRITE_STATE_IMPORTANT_CALLS=NONE\nFN_WRITE_STATE_RETURNS=j\nFN_WRITE_STATE_KEYS=last_success_epoch,logical_id,result,schema,updated_at_utc\nFN_WRITE_STATE_STRINGS=SUCCESS,last_success_epoch,logical_id,state\nFN_SCHEDULED_RUN_PRESENT=true\nFN_SCHEDULED_RUN_PARAMS=NONE\nFN_SCHEDULED_RUN_DIRECT_CALLS=backup_target,choose_due_target,load_state_all,load_targets,print\nFN_SCHEDULED_RUN_IF_TESTS=t is None\nFN_SCHEDULED_RUN_COMP_FILTERS=NONE\nFN_SCHEDULED_RUN_IMPORTANT_CALLS=load_targets(),choose_due_target(targets, state),backup_target(t, green_verify=False)\nFN_SCHEDULED_RUN_RETURNS=0,0,2\nFN_SCHEDULED_RUN_KEYS=logical_id\nFN_SCHEDULED_RUN_STRINGS=SCHEDULE_DECISION=DEFER_NO_DUE_TARGET,SCHEDULE_RESULT=SUCCESS,SCHEDULE_TARGET=,logical_id\nFN_CHOOSE_DUE_TARGET_PRESENT=true\nFN_CHOOSE_DUE_TARGET_PARAMS=targets,state,now\nFN_CHOOSE_DUE_TARGET_DIRECT_CALLS=append,epoch,get,int,max,sort\nFN_CHOOSE_DUE_TARGET_IF_TESTS=not c,not t.get(_enabled_, True),last == 0 or age >= due\nFN_CHOOSE_DUE_TARGET_COMP_FILTERS=NONE\nFN_CHOOSE_DUE_TARGET_IMPORTANT_CALLS=NONE\nFN_CHOOSE_DUE_TARGET_RETURNS=c[0][3],None\nFN_CHOOSE_DUE_TARGET_KEYS=due_seconds,enabled,last_success_epoch,logical_id\nFN_CHOOSE_DUE_TARGET_STRINGS=due_seconds,enabled,last_success_epoch,logical_id\nFN_RCLONE_RCAT_PRESENT=true\nFN_RCLONE_RCAT_PARAMS=remote_path,source_path,offset,length,data,timeout\nFN_RCLONE_RCAT_DIRECT_CALLS=BackupError,Popen,close,communicate,kill,len,min,open,rclone_base_args,read,seek,str,write\nFN_RCLONE_RCAT_IF_TESTS=p.returncode _= 0,data is not None,not b\nFN_RCLONE_RCAT_COMP_FILTERS=NONE\nFN_RCLONE_RCAT_IMPORTANT_CALLS=NONE\nFN_RCLONE_RCAT_RETURNS=NONE\nFN_RCLONE_RCAT_KEYS=NONE\nFN_RCLONE_RCAT_STRINGS=RCLONE_RCAT_FAILED\nFN_MAKE_MANIFEST_PRESENT=true\nFN_MAKE_MANIFEST_PARAMS=scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta\nFN_MAKE_MANIFEST_DIRECT_CALLS=BackupError,fullmatch,int,len,sum,utcnow\nFN_MAKE_MANIFEST_IF_TESTS=len(replicas) _= 2 or len({r[_physical_] for r in replicas}) _= 2,not re.fullmatch(_[0-9a-f]{64}_, payload_sha256),sum((int(p[_bytes_]) for p in parts)) _= payload_bytes\nFN_MAKE_MANIFEST_COMP_FILTERS=NONE\nFN_MAKE_MANIFEST_IMPORTANT_CALLS=NONE\nFN_MAKE_MANIFEST_RETURNS={_schema_: 2, _scope_: scope, _logical_id_: logical_id, _generation_: generation, _created_at_utc_: utcnow(), _payload_bytes_: payload_bytes, _payload_sha256_: payload_sha256, _part_size_: PART_SIZE, _parts_: parts, _replicas_: [{_crypt_: r[_crypt_], _physical_: r[_physical_]} for r in replicas], _source_meta_: source_meta}\nFN_MAKE_MANIFEST_KEYS=bytes,created_at_utc,crypt,generation,logical_id,part_size,parts,payload_bytes,payload_sha256,physical,replicas,schema,scope,source_meta\nFN_MAKE_MANIFEST_STRINGS=MANIFEST_PART_TOTAL_MISMATCH,MANIFEST_PAYLOAD_SHA_INVALID,MANIFEST_REPLICA_PHYSICAL_DUPLICATE,generation,logical_id,replicas\nFN_GENERATION_ID_PRESENT=true\nFN_GENERATION_ID_PARAMS=logical_id\nFN_GENERATION_ID_DIRECT_CALLS=hex,now,strftime,urandom\nFN_GENERATION_ID_IF_TESTS=NONE\nFN_GENERATION_ID_COMP_FILTERS=NONE\nFN_GENERATION_ID_IMPORTANT_CALLS=NONE\nFN_GENERATION_ID_RETURNS=f_v2-{logical_id}-{ts}-{os.urandom(6).hex()}_\nFN_GENERATION_ID_KEYS=NONE\nFN_GENERATION_ID_STRINGS=NONE\nFN_LOAD_TARGETS_PRESENT=true\nFN_LOAD_TARGETS_PARAMS=NONE\nFN_LOAD_TARGETS_DIRECT_CALLS=BackupError,get,isinstance,len,loads,read_text,set\nFN_LOAD_TARGETS_IF_TESTS=j.get(_schema_) _= 1 or not isinstance(j.get(_targets_), list),len(ids) _= len(set(ids))\nFN_LOAD_TARGETS_COMP_FILTERS=NONE\nFN_LOAD_TARGETS_IMPORTANT_CALLS=NONE\nFN_LOAD_TARGETS_RETURNS=j[_targets_]\nFN_LOAD_TARGETS_KEYS=logical_id,schema,targets\nFN_LOAD_TARGETS_STRINGS=TARGET_MANIFEST_DUPLICATE,TARGET_MANIFEST_SCHEMA,logical_id,targets\nFN_BOOTSTRAP_VPS_KEYS_PRESENT=true\nFN_BOOTSTRAP_VPS_KEYS_PARAMS=targets\nFN_BOOTSTRAP_VPS_KEYS_DIRECT_CALLS=BackupError,decode,ensure_vps_known_hosts,get,operator_key_fingerprint,run,str,strip,vps_run\nFN_BOOTSTRAP_VPS_KEYS_IF_TESTS=t[_type_] not in (_vps_md_, _vps_spb_),probe.returncode == 0,not os.environ.get(_SSH_AUTH_SOCK_),tag not in (_ADDED_, _ALREADY_)\nFN_BOOTSTRAP_VPS_KEYS_COMP_FILTERS=x[_type_] == _vps_us_\nFN_BOOTSTRAP_VPS_KEYS_IMPORTANT_CALLS=NONE\nFN_BOOTSTRAP_VPS_KEYS_RETURNS=results\nFN_BOOTSTRAP_VPS_KEYS_KEYS=SSH_AUTH_SOCK,logical_id,type\nFN_BOOTSTRAP_VPS_KEYS_STRINGS=SSH_AUTH_SOCK,logical_id,ssh-keygen\nFN_VPS_SSH_ARGV_PRESENT=true\nFN_VPS_SSH_ARGV_PARAMS=t\nFN_VPS_SSH_ARGV_DIRECT_CALLS=str\nFN_VPS_SSH_ARGV_IF_TESTS=use_agent\nFN_VPS_SSH_ARGV_COMP_FILTERS=NONE\nFN_VPS_SSH_ARGV_IMPORTANT_CALLS=NONE\nFN_VPS_SSH_ARGV_RETURNS=a\nFN_VPS_SSH_ARGV_KEYS=host,port,user\nFN_VPS_SSH_ARGV_STRINGS=IdentityAgent=none,StrictHostKeyChecking=yes\nFN_CAPTURE_VPS_US_PRESENT=true\nFN_CAPTURE_VPS_US_PARAMS=t,gen,work\nFN_CAPTURE_VPS_US_DIRECT_CALLS=join,pipe_to_zstd,vps_ssh_argv\nFN_CAPTURE_VPS_US_IF_TESTS=NONE\nFN_CAPTURE_VPS_US_COMP_FILTERS=NONE\nFN_CAPTURE_VPS_US_IMPORTANT_CALLS=NONE\nFN_CAPTURE_VPS_US_RETURNS=(payload, {_generation_: gen, _source_class_: _vps_us_, _consistency_: _SQLITE_ONLINE_BACKUP_PLUS_NONDB_FILES_, _sqlite_count_: 4}, None)\nFN_CAPTURE_VPS_US_KEYS=consistency,generation,source_class,sqlite_count\nFN_CAPTURE_VPS_US_STRINGS=generation\nMAIN_IF_TESTS=len(argv) < 2,cmd == _selftest_,cmd == _green1_,cmd == _green2_,cmd == _scheduled_,cmd == _discover_ and len(argv) == 3\nMAIN_IMPORTANT_CALLS=selftest(),green_run(_GREEN1_),green_run(_GREEN2_),scheduled_run(),discover(argv[2])\nCALLSITE_GREEN_RUN=green_run(_GREEN1_),green_run(_GREEN2_)\nCALLSITE_SCHEDULED_RUN=scheduled_run()\nCALLSITE_BACKUP_TARGET=backup_target(t, green_verify=False),backup_target(t, green_verify=t[_type_] _= _control_)\nCALLSITE_SELECT_REPLICAS=select_replicas(rows, payload_bytes, RESERVE_BYTES)\nCALLSITE_UPLOAD_AND_SEAL=upload_and_seal(t, payload, meta)\nCALLSITE_WRITE_STATE=write_state(t[_logical_id_], _SUCCESS_, generation=gen, verification=_existing_control_engine_verify_, last_success_epoch=epoch()),write_state(t[_logical_id_], _SUCCESS_, generation=gen, payload_sha256=manifest[_payload_sha256_], manifest_sha256=msha, replicas=manifest[_replicas_], green_verified=bool(green_verify), last_success_epoch=epoch()),write_state(t[_logical_id_], result, generation=gen, reason=e.code, sealed=sealed)\nTARGET_VPS_US_COUNT=1\nTARGET_VPS_US_1_SAFE={\"due_seconds\":86400,\"enabled\":false,\"green1\":true,\"logical_id\":\"us-netbird\",\"port\":22,\"scope\":\"vps\",\"type\":\"vps_us\",\"user\":\"root\"}\nTARGET_VPS_MD_COUNT=1\nTARGET_VPS_MD_1_SAFE={\"due_seconds\":86400,\"enabled\":false,\"green1\":true,\"logical_id\":\"md-relay\",\"port\":22,\"scope\":\"vps\",\"type\":\"vps_md\",\"user\":\"ops\"}\nTARGET_VPS_SPB_COUNT=1\nTARGET_VPS_SPB_1_SAFE={\"due_seconds\":86400,\"enabled\":false,\"green1\":true,\"logical_id\":\"spb-ingress\",\"port\":22,\"scope\":\"vps\",\"type\":\"vps_spb\",\"user\":\"edgeadmin\"}\nUS_NETBIRD_AST_OCCURRENCES={t[_logical_id_] for t in default_targets() if t.get(_green1_)} == {_ct112_, _node-pve01_, _md-relay_, _spb-ingress_, _us-netbird_, _router-netcraze_, _xf-codevipe_, _xf-zakrutim_, _control-bootstrap-v2_}\nBACKUPV2_SERVICE_EXECSTART=/usr/local/sbin/homelab-backup-v2 scheduled\nBACKUPV2_TIMER_ACTIVE=active\nBACKUPV2_TIMER_ENABLED=enabled\nBACKUPV2_GREENRUN_REPLICA_READY=true\nDECISION=PASS_BACKUPV2_GREENRUN_REPLICA_SEMANTICS\nNEXT_GATE=FINAL_BACKUPV2_NEW_TARGET_INTEGRATION_AND_GLOBAL_CLOSEOUT\nTASK_RESULT=BACKUPV2_GREENRUN_REPLICA_SEMANTICS\nCHANGES_MADE=false\nROLLBACK_STARTED=false\nROLLBACK_RESTORED=null\nMUTATION_OUTCOME=NO_MUTATION\nHOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"SUPPORT-261001-BACKUPV2-GREENRUN-REPLICA-SEMANTICS-99286R1\",\"status\":\"OK\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}\n"
}