code wiki / _hdl_build / nx_translate_deploy.nx
nx_translate_deploy.nx source
↩ module page · 73 lines · 3943 B
1// nx_translate_deploy.nx -- SOVEREIGN deploy of the MT-R5 translate daemon to the live NAS:
2// streams /tmp/nx_translate_daemon.sov.elf over the team's own SSH (ssh_put_file, no scp) to
3// nx_translate_daemon.elf.new (avoids ETXTBSY on a running exe). Start/restart is done via
4// nx_ssh_cmd (kill old, mv, setsid) so this organ stays single-responsibility. pw from /tmp/nxpw.
5// license_tier: ORIGINAL
6import "nx_syscalls.nx"
7import "nx_ssh_lib.nx"
8const TD_MAGIC_1048576: i64 = 1048576
9const TD_MAGIC_16384: i64 = 16384
10const TD_MAGIC_65536: i64 = 65536
11const TD_MAGIC_1024: i64 = 1024
12
13const TD_WCMD: *u8 = "cat > /volume1/homes/elderwesto/nishihost/nx_translate_daemon.elf.new" as *u8
14
15func slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=0 as u8 { n=n+1 } return n }
16
17// stream data to remote run as `wcmd` (copied from nx_ssh_put.nx -- not exported by nx_ssh_lib)
18func ssh_put_file(st: *SshState, wcmd: *u8, wcmdlen: i64, data: *u8, datalen: i64) -> i64 {
19 let co: *u8 = sys_mmap(64); var c: i64 = 0
20 c = ssh_put_byte(co, c, 90); c = ssh_put_str(co, c, "session" as *u8, 7)
21 c = ssh_put_u32(co, c, 0); c = ssh_put_u32(co, c, TD_MAGIC_1048576); c = ssh_put_u32(co, c, TD_MAGIC_16384)
22 ssh_enc_send(st, co, c)
23 let rep: *u8 = sys_mmap(TD_MAGIC_65536); var rcid: i64 = 0 - 1; var guard: i64 = 0
24 while rcid < 0 {
25 if guard > 16 { return 0 - 1 }
26 let rl: i64 = ssh_enc_recv(st, rep); if rl < 0 { return 0 - 1 }
27 if rep[0] == 91 as u8 { rcid = ssh_u32be(rep, 5) }
28 if rep[0] == 92 as u8 { return 0 - 2 }
29 guard = guard + 1
30 }
31 let cr: *u8 = sys_mmap(TD_MAGIC_1024); var q: i64 = 0
32 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)
33 ssh_enc_send(st, cr, q)
34 var off: i64 = 0
35 while off < datalen {
36 var nn: i64 = datalen - off; if nn > TD_MAGIC_16384 { nn = TD_MAGIC_16384 }
37 let dp: *u8 = sys_mmap(nn + 64); var p: i64 = 0
38 p = ssh_put_byte(dp, p, 94); p = ssh_put_u32(dp, p, rcid); p = ssh_put_u32(dp, p, nn)
39 var i: i64 = 0; while i < nn { dp[p + i] = data[off + i]; i = i + 1 } p = p + nn
40 ssh_enc_send(st, dp, p)
41 off = off + nn
42 }
43 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)
44 var done: i64 = 0; var loops: i64 = 0
45 while done == 0 {
46 if loops > TD_MAGIC_16384 { done = 1 }
47 let rl: i64 = ssh_enc_recv(st, rep); if rl < 0 { done = 1 } else { if rep[0] == 97 as u8 { done = 1 } }
48 loops = loops + 1
49 }
50 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)
51 return 0
52}
53
54func main() -> i64 {
55 let pwbox: *i64 = sys_mmap(16) as *i64
56 let pw: *u8 = sys_read_file("/tmp/nxpw" as *u8, pwbox)
57 if (pw as i64) == 0 { ssh_puts("no /tmp/nxpw\n" as *u8); return 1 }
58 var pwlen: i64 = pwbox[0]
59 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 } } }
60
61 let dbox: *i64 = sys_mmap(16) as *i64
62 let payload: *u8 = sys_read_file("/tmp/nx_translate_daemon.sov.elf" as *u8, dbox)
63 if (payload as i64) == 0 { ssh_puts("no translate daemon elf in /tmp\n" as *u8); return 4 }
64 let plen: i64 = dbox[0]
65
66 let st: *SshState = sys_mmap(SSH_STATE_BYTES) as *SshState
67 if ssh_open_session(st, (192 << 24) | (168 << 16) | (8 << 8) | 227) != 0 { ssh_puts("session fail\n" as *u8); return 2 }
68 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 }
69 ssh_put_file(st, TD_WCMD, slen(TD_WCMD), payload, plen)
70 ssh_puts("[nx_translate_daemon.elf.new uploaded -- start via nx_ssh_cmd]\n" as *u8)
71 sys_close(st.fd)
72 return 0
73}