code wiki / _hdl_build / nx_registered_rollback_gate_t185.nx

nx_registered_rollback_gate_t185.nx source

↩ module page · 48 lines · 4408 B

1import "nx_mgmt_deploy_candidate_t185.nx" 2import "nx_gate_verdict.nx" 3func rb185_write(path:*u8,value:i64)->i64{ 4 let b:*u8=sys_mmap(5);b[0]=127 as u8;b[1]=69 as u8;b[2]=76 as u8;b[3]=70 as u8;b[4]=value as u8 5 let rc:i64=dp_writefile(path,b,5);sys_munmap(b,5);return rc 6} 7func main()->i64{ 8 let c:*i64=gv_ctr();gv_head("Registry-bound actual rollback and exact restored identity") 9 let root:*u8=sys_mmap(512);var n:i64=sd_cat(root,0,"/tmp/nishi-rollback-t185-");n=sd_catn(root,n,sys_now_ms());root[n]=0 as u8 10 if sys_mkdir(root,MODE_0755)!=0 || sys_chdir(root)!=0{return 3} 11 let live:*u8=sys_mmap(fi_len(root)+10);var p:i64=sd_cat(live,0,root);p=sd_cat(live,p,"/live.elf") 12 let prev:*u8=sys_mmap(fi_len(live)+6);p=sd_cat(prev,0,live);p=sd_cat(prev,p,".prev") 13 let registry:*u8="deploy_targets.conf";let row:*u8=sys_mmap(fi_len(live)+128) 14 p=sd_cat(row,0,"fixture 0 live.elf.new gdeploy@fixture port:18998 gdeployrb@fixture ");p=sd_cat(row,p,live);p=sd_cat(row,p," fixture-never-running\n") 15 if dp_writefile(registry,row,p)!=0 || dp_writefile("rollback-live.path",live,fi_len(live))!=0{return 3} 16 let out:*u8=sys_mmap(65536);let scratch:*u8=sys_mmap(4096) 17 let executor:*u8="/volume1/homes/elderwesto/nishihost/buildroot/_build/nx_rollback_executor_t185.sov.elf" 18 let request:*u8="POST /api/rollback HTTP/1.1\r\nHost: fixture\r\n\r\ntarget=fixture&confirm=yes" 19 let rejected:*u8="POST /api/rollback HTTP/1.1\r\nHost: fixture\r\n\r\ntarget=missing&confirm=yes" 20 gv_check("distinct original and previous artifacts prepared",rb185_write(live,2)==0 && rb185_write(prev,1)==0,c) 21 let hashes:*u8=sys_mmap(195);ma_file_sha_hex(prev,hashes);ma_file_sha_hex(live,hashes+65) 22 let bad:i64=ma_registered_rollback_at(rejected,fi_len(rejected),out,registry,executor,4096,scratch,4096) 23 gv_check("unknown target refused before executor",bad>0 && dp_contains(out,bad,"ROLLBACK_TARGET_UNRESOLVED")==1 && ma_path_exists("rollback-executed.marker")==0,c) 24 let route_refusal:i64=ma_do_rollback(rejected,fi_len(rejected),out) 25 sys_write(1,out,route_refusal);sys_write(1,"\n",1) 26 gv_check("existing rollback route reaches registry guard",route_refusal>0 && dp_contains(out,route_refusal,"ROLLBACK_TARGET_UNRESOLVED")==1 && ma_path_exists("rollback-executed.marker")==0,c) 27 let pressure:i64=ma_registered_rollback_at(request,fi_len(request),out,registry,executor,4096,scratch,0) 28 gv_check("unavailable resource allowance does not execute",pressure>0 && dp_contains(out,pressure,"ROLLBACK_RESOURCE_POLICY_UNAVAILABLE")==1 && ma_path_exists("rollback-executed.marker")==0,c) 29 let got:i64=ma_registered_rollback_at(request,fi_len(request),out,registry,executor,4096,scratch,4096) 30 gv_check("actual hostctl rollback component executed",ma_path_exists("rollback-executed.marker")==1,c) 31 gv_check("rollback response independently verifies identity",got>0 && dp_contains(out,got,"\"identity_verified\":true")==1 && dp_contains(out,got,"200 OK")==1,c) 32 gv_check("response names expected original digest",dp_contains(out,got,hashes)==1,c) 33 ma_file_sha_hex(live,hashes+130) 34 gv_check("actual installed bytes equal previous generation",ma_hexstr_eq(hashes,hashes+130)==1,c) 35 let bank:*u8=sys_mmap(fi_len(live)+fi_len(".rollback-rejected-")+65) 36 p=sd_cat(bank,0,live);p=sd_cat(bank,p,".rollback-rejected-");p=sd_cat(bank,p,hashes+65) 37 ma_file_sha_hex(bank,hashes+130) 38 gv_check("rejected generation retained with matching digest",ma_hexstr_eq(hashes+65,hashes+130)==1,c) 39 gv_check("serving claim stays unverified in isolated test",dp_contains(out,got,"\"serving\":\"UNVERIFIED\"")==1,c) 40 let again:i64=ma_registered_rollback_at(request,fi_len(request),out,registry,executor,4096,scratch,4096) 41 gv_check("second rollback with no previous generation refuses",again>0 && dp_contains(out,again,"ROLLBACK_IDENTITY_UNAVAILABLE")==1,c) 42 ma_file_sha_hex(live,hashes+130) 43 gv_check("repeat refusal preserves restored bytes",ma_hexstr_eq(hashes,hashes+130)==1,c) 44 let duplicate:*u8=sys_mmap(fi_len(row)*2+1);p=sd_cat(duplicate,0,row);p=sd_cat(duplicate,p,row);dp_writefile(registry,duplicate,p) 45 let dup:i64=ma_registered_rollback_at(request,fi_len(request),out,registry,executor,4096,scratch,4096) 46 gv_check("ambiguous registry refuses",dup>0 && dp_contains(out,dup,"ROLLBACK_TARGET_UNRESOLVED")==1,c) 47 return gv_verdict("registered-rollback",c,"Real isolated files and existing hostctl rollback component; live daemon and final TOCTOU not covered") 48}