code wiki / _hdl_build / nx_ssh_put_lib.nx
nx_ssh_put_lib.nx source
↩ module page · 48 lines · 2636 B
1// nx_ssh_put_lib.nx -- the SOVEREIGN SSH file-PUT, extracted as a library (no main) so multiple deploy tools
2// reuse it (DRY): the dashboard deploy (nx_ssh_put) and the remote-fetch deploy (nx_inet_fetch_deploy) both
3// stream a local buffer to a remote `cat > path` over the team's own SSH client. license_tier: ORIGINAL
4import "nx_syscalls.nx"
5import "nx_ssh_lib.nx"
6const K_MAGIC_1048576: i64 = 1048576
7const K_MAGIC_16384: i64 = 16384
8const K_MAGIC_65536: i64 = 65536
9const K_MAGIC_1024: i64 = 1024
10
11func sshp_slen(s: *u8) -> i64 { var n: i64 = 0; while s[n] != 0 as u8 { n = n + 1 } return n }
12
13// stream `data[0..datalen)` to the remote, executed as `wcmd` (e.g. "cat > /path"). chunked at 16 KB.
14func sshp_put_file(st: *SshState, wcmd: *u8, wcmdlen: i64, data: *u8, datalen: i64) -> i64 {
15 let co: *u8 = sys_mmap(64); var c: i64 = 0
16 c = ssh_put_byte(co, c, 90); c = ssh_put_str(co, c, "session" as *u8, 7)
17 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)
18 ssh_enc_send(st, co, c)
19 let rep: *u8 = sys_mmap(K_MAGIC_65536); var rcid: i64 = 0 - 1; var guard: i64 = 0
20 while rcid < 0 {
21 if guard > 16 { return 0 - 1 }
22 let rl: i64 = ssh_enc_recv(st, rep); if rl < 0 { return 0 - 1 }
23 if rep[0] == 91 as u8 { rcid = ssh_u32be(rep, 5) }
24 if rep[0] == 92 as u8 { return 0 - 2 }
25 guard = guard + 1
26 }
27 let cr: *u8 = sys_mmap(K_MAGIC_1024); var q: i64 = 0
28 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)
29 ssh_enc_send(st, cr, q)
30 var off: i64 = 0
31 while off < datalen {
32 var nn: i64 = datalen - off; if nn > K_MAGIC_16384 { nn = K_MAGIC_16384 }
33 let dp: *u8 = sys_mmap(nn + 64); var p: i64 = 0
34 p = ssh_put_byte(dp, p, 94); p = ssh_put_u32(dp, p, rcid); p = ssh_put_u32(dp, p, nn)
35 var i: i64 = 0; while i < nn { dp[p + i] = data[off + i]; i = i + 1 } p = p + nn
36 ssh_enc_send(st, dp, p)
37 off = off + nn
38 }
39 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)
40 var done: i64 = 0; var loops: i64 = 0
41 while done == 0 {
42 if loops > K_MAGIC_16384 { done = 1 }
43 let rl: i64 = ssh_enc_recv(st, rep); if rl < 0 { done = 1 } else { if rep[0] == 97 as u8 { done = 1 } }
44 loops = loops + 1
45 }
46 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)
47 return 0
48}