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}