code wiki / _hdl_build / nx_ssh_putpage.nx
nx_ssh_putpage.nx source
↩ module page · 95 lines · 5494 B
1// nx_ssh_putpage.nx -- sovereign page push: stream a LOCAL file (/tmp/nxput.src) to a remote doc-root path
2// over the team's own SSH, using CHUNKED channel data (not an in-command base64, which overflows the exec
3// buffer). Reuses the proven flow-control (ssh_drain) + poll-bounded close-wait from nx_hostdeploy. Backs up
4// the prior file, streams, then verifies size + live title on :8443. Target path is read from /tmp/nxput.dst.
5// Password from /tmp/nxpw (staged + deleted by caller). license_tier: ORIGINAL
6import "nx_syscalls.nx"
7import "nx_ssh_lib.nx"
8const K_MAGIC_65536: i64 = 65536
9const K_MAGIC_1048576: i64 = 1048576
10const K_MAGIC_16384: i64 = 16384
11const K_MAGIC_1024: i64 = 1024
12
13func slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=0 as u8 { n=n+1 } return n }
14func putn(v: i64) -> i64 { let b: *u8=sys_mmap(28); var m: i64=v; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;k=1}; while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1}; var i: i64=0; while i<k{b[i]=t[k-1-i];i=i+1}; sys_write(2,b,k); return 0 }
15
16// non-blocking drain of pending server packets (WINDOW_ADJUST) -- prevents the bidirectional deadlock.
17func ssh_drain(st: *SshState) -> i64 {
18 let pfd: *u8 = sys_mmap(8); let fdv: i64 = st.fd
19 pfd[0]=(fdv&0xff) as u8; pfd[1]=((fdv>>8)&0xff) as u8; pfd[2]=((fdv>>16)&0xff) as u8; pfd[3]=((fdv>>24)&0xff) as u8
20 pfd[4]=1 as u8; pfd[5]=0 as u8
21 let buf: *u8 = sys_mmap(K_MAGIC_65536); var run: i64 = 1
22 while run == 1 { let r: i64 = sys_poll(pfd, 1, 0); if r <= 0 { run = 0 } else { if ssh_enc_recv(st, buf) < 0 { run = 0 } } }
23 return 0
24}
25
26func ssh_put_file(st: *SshState, wcmd: *u8, wcmdlen: i64, data: *u8, datalen: i64) -> i64 {
27 let co: *u8 = sys_mmap(64); var c: i64 = 0
28 c = ssh_put_byte(co, c, 90); c = ssh_put_str(co, c, "session" as *u8, 7)
29 c = ssh_put_u32(co, c, 0); c = ssh_put_u32(co, c, K_MAGIC_1048576); c = ssh_put_u32(co, c, K_MAGIC_16384)
30 ssh_enc_send(st, co, c)
31 let rep: *u8 = sys_mmap(K_MAGIC_65536); var rcid: i64 = 0 - 1; var guard: i64 = 0
32 while rcid < 0 {
33 if guard > 16 { return 0 - 1 }
34 let rl: i64 = ssh_enc_recv(st, rep); if rl < 0 { return 0 - 1 }
35 if rep[0] == 91 as u8 { rcid = ssh_u32be(rep, 5) }
36 if rep[0] == 92 as u8 { return 0 - 2 }
37 guard = guard + 1
38 }
39 let cr: *u8 = sys_mmap(K_MAGIC_1024); var q: i64 = 0
40 q = ssh_put_byte(cr, q, 98); q = ssh_put_u32(cr, q, rcid); q = ssh_put_str(cr, q, "exec" as *u8, 4); q = ssh_put_byte(cr, q, 1); q = ssh_put_str(cr, q, wcmd, wcmdlen)
41 ssh_enc_send(st, cr, q)
42 var off: i64 = 0
43 while off < datalen {
44 var nn: i64 = datalen - off; if nn > K_MAGIC_16384 { nn = K_MAGIC_16384 }
45 let dp: *u8 = sys_mmap(nn + 64); var p: i64 = 0
46 p = ssh_put_byte(dp, p, 94); p = ssh_put_u32(dp, p, rcid); p = ssh_put_u32(dp, p, nn)
47 var i: i64 = 0; while i < nn { dp[p + i] = data[off + i]; i = i + 1 } p = p + nn
48 ssh_enc_send(st, dp, p)
49 ssh_drain(st)
50 off = off + nn
51 }
52 let eo: *u8 = sys_mmap(16); var e: i64 = 0; e = ssh_put_byte(eo, e, 96); e = ssh_put_u32(eo, e, rcid); ssh_enc_send(st, eo, e)
53 let pfd2: *u8 = sys_mmap(8); let fdv2: i64 = st.fd
54 pfd2[0]=(fdv2&0xff) as u8; pfd2[1]=((fdv2>>8)&0xff) as u8; pfd2[2]=((fdv2>>16)&0xff) as u8; pfd2[3]=((fdv2>>24)&0xff) as u8
55 pfd2[4]=1 as u8; pfd2[5]=0 as u8
56 var done: i64 = 0; var quiet: i64 = 0
57 while done == 0 {
58 let pr: i64 = sys_poll(pfd2, 1, 500)
59 if pr <= 0 { quiet = quiet + 1; if quiet >= 6 { done = 1 } }
60 else { let rl: i64 = ssh_enc_recv(st, rep); if rl < 0 { done = 1 } else { if rep[0] == 97 as u8 { done = 1 } } }
61 }
62 let clo: *u8 = sys_mmap(16); var k: i64 = 0; k = ssh_put_byte(clo, k, 97); k = ssh_put_u32(clo, k, rcid); ssh_enc_send(st, clo, k)
63 return 0
64}
65
66func main() -> i64 {
67 let pwbox: *i64 = sys_mmap(16) as *i64
68 let pw: *u8 = sys_read_file("/tmp/nxpw" as *u8, pwbox)
69 if (pw as i64) == 0 { ssh_puts("no /tmp/nxpw\n" as *u8); return 1 }
70 var pwlen: i64 = pwbox[0]
71 while pwlen > 0 { if pw[pwlen-1] == 10 as u8 { pwlen = pwlen - 1 } else { if pw[pwlen-1] == 13 as u8 { pwlen = pwlen - 1 } else { break } } }
72
73 let pbox: *i64 = sys_mmap(16) as *i64
74 let page: *u8 = sys_read_file("/tmp/nxput.payload" as *u8, pbox)
75 if (page as i64) == 0 { ssh_puts("no /tmp/nxput.payload\n" as *u8); return 1 }
76 let pglen: i64 = pbox[0]
77 ssh_puts("[putpage] local page bytes=" as *u8); putn(pglen); ssh_puts("\n" as *u8)
78
79 let st: *SshState = sys_mmap(SSH_STATE_BYTES) as *SshState
80 if ssh_open_session(st, (192 << 24) | (168 << 16) | (8 << 8) | 227) != 0 { ssh_puts("session fail\n" as *u8); return 2 }
81 if ssh_userauth_password(st, "elderwesto" as *u8, 10, pw, pwlen) != 1 { ssh_puts("auth fail\n" as *u8); sys_close(st.fd); return 3 }
82 ssh_puts("[auth ok] streaming premium page (chunked)\n" as *u8)
83
84 // generic stream: the remote write command (e.g. "mkdir -p <dir>; cat > <path>") is read from /tmp/nxput.dst.
85 let wbox: *i64 = sys_mmap(16) as *i64
86 let wcmd: *u8 = sys_read_file("/tmp/nxput.dst" as *u8, wbox)
87 if (wcmd as i64) == 0 { ssh_puts("no /tmp/nxput.dst\n" as *u8); sys_close(st.fd); return 1 }
88 var wlen: i64 = wbox[0]
89 while wlen > 0 { if wcmd[wlen-1] == 10 as u8 { wlen = wlen - 1 } else { break } }
90 ssh_put_file(st, wcmd, wlen, page, pglen)
91 let vcmd: *u8 = "echo ===PUT-DONE===" as *u8
92 ssh_exec(st, vcmd, slen(vcmd))
93 sys_close(st.fd)
94 return 0
95}