code wiki / (root) / nx_pagepub.nx

nx_pagepub.nx source

↩ module page · 88 lines · 4018 B

1// nx_pagepub.nx -- ONE sovereign command to publish a static site page over the mgmt API (2026-07-09; retires 2// the flaky ssh-cat push for pages). Chain: /api/upload (chunked, sha256 fail-closed at stage time -- a truncated 3// transfer can NEVER go live) -> /api/promote_content (atomic .prev-backed swap). Both over sovereign TLS-1.3 4// with a minted X-Nishi-Session. Targets are the fail-closed md_content_pfx namespace (sites/nishifamily/ 5// {synth,swgpu,factory,world,gsplat}/...). 6// nx_pagepub <target> <localfile> [tokenfile] 7// <target> e.g. sites/nishifamily/world/index.html 8// <localfile> e.g. knowledge/world.html 9// <tokenfile> default mgtok.txt (mint: nx_mgmt_session_mint on the NAS, 24h) 10import "nx_tool_run.nx" // tr_run_capture (fork + argv + stdout capture) 11const K_MAGIC_1048576: i64 = 1048576 12 13func pp_slen(s: *u8) -> i64 { var i: i64 = 0; while s[i] != (0 as u8) { i = i + 1 } return i } 14func pp_puts(s: *u8) -> i64 { sys_write(1, s, pp_slen(s)); return 0 } 15 16func pp_contains(buf: *u8, n: i64, needle: *u8) -> i64 { 17 let m: i64 = pp_slen(needle) 18 if m == 0 { return 1 } 19 var i: i64 = 0 20 while i + m <= n { 21 var k: i64 = 0 22 while k < m { if buf[i + k] != needle[k] { k = m + 9 } else { k = k + 1 } } 23 if k == m { return 1 } 24 i = i + 1 25 } 26 return 0 27} 28 29func pp_run(path: *u8, av: *i64, out: *u8, cap: i64, olen: *i64) -> i64 { 30 av[0] = path as i64 31 return tr_run_capture(path, av, out, cap, olen) 32} 33 34func main(argc: i64, argv: *i64) -> i64 { 35 if argc < 3 { pp_puts("usage: nx_pagepub <target> <localfile> [tokenfile]\n" as *u8); return 1 } 36 let target: *u8 = argv[1] as *u8 37 let localf: *u8 = argv[2] as *u8 38 var tok: *u8 = "mgtok.txt" as *u8 39 if argc > 3 { tok = argv[3] as *u8 } 40 41 let edge: *u8 = "https://nishifamily.com" as *u8 42 let mgmtclient: *u8 = "./_offc/nx_mgmt_client.elf" as *u8 43 let bodyf: *u8 = "/tmp/nx_pagepub.body" as *u8 44 let out: *u8 = sys_mmap(K_MAGIC_1048576) 45 let olen: *i64 = sys_mmap(16) as *i64 46 let av: *i64 = sys_mmap(256) as *i64 47 48 // ---- 1. upload (chunked + sha256; the daemon refuses a truncated/garbled artifact at stage time) ---- 49 pp_puts("[nx_pagepub] 1/2 upload " as *u8); pp_puts(target); pp_puts(" (sovereign TLS, sha256-gated)\n" as *u8) 50 av[1] = edge as i64; av[2] = "upload" as *u8 as i64; av[3] = target as i64; av[4] = localf as i64; av[5] = tok as i64; av[6] = 0 51 pp_run(mgmtclient, av, out, K_MAGIC_1048576, olen) 52 if pp_contains(out, olen[0], "UPLOAD OK" as *u8) == 0 { 53 pp_puts("[nx_pagepub] UPLOAD FAILED\n" as *u8) 54 sys_write(1, out, olen[0]) 55 sys_exit(2) 56 return 2 57 } 58 59 // ---- 2. promote (atomic .prev-backed swap; never leaves the page missing) ---- 60 pp_puts("[nx_pagepub] 2/2 promote_content (atomic)\n" as *u8) 61 let bb: *u8 = sys_mmap(512) 62 var bo: i64 = 0 63 let p1: *u8 = "target=" as *u8 64 while p1[bo] != (0 as u8) { bb[bo] = p1[bo]; bo = bo + 1 } 65 var ti: i64 = 0 66 while target[ti] != (0 as u8) { bb[bo] = target[ti]; bo = bo + 1; ti = ti + 1 } 67 let p2: *u8 = "&confirm=yes" as *u8 68 var pi: i64 = 0 69 while p2[pi] != (0 as u8) { bb[bo] = p2[pi]; bo = bo + 1; pi = pi + 1 } 70 bb[bo] = 0 as u8 71 let bfd: i64 = sys_openat_wr(bodyf, 0x1a4) 72 if bfd < 0 { pp_puts("[nx_pagepub] body write failed\n" as *u8); sys_exit(3); return 3 } 73 sys_write(bfd, bb, bo) 74 sys_close(bfd) 75 av[1] = edge as i64; av[2] = "call" as *u8 as i64; av[3] = "POST" as *u8 as i64; av[4] = "/api/promote_content" as *u8 as i64; av[5] = tok as i64; av[6] = bodyf as i64; av[7] = 0 76 pp_run(mgmtclient, av, out, K_MAGIC_1048576, olen) 77 if pp_contains(out, olen[0], "PROMOTE_CONTENT" as *u8) == 1 { 78 pp_puts("[nx_pagepub] PUBLISHED -- " as *u8) 79 sys_write(1, out, olen[0]) 80 pp_puts("\n" as *u8) 81 sys_exit(0) 82 return 0 83 } 84 pp_puts("[nx_pagepub] PROMOTE FAILED\n" as *u8) 85 sys_write(1, out, olen[0]) 86 sys_exit(4) 87 return 4 88}