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}