code wiki / _hdl_build / nx_media_sniff_daemon.nx
nx_media_sniff_daemon.nx source
↩ module page · 106 lines · 6801 B
1// nx_media_sniff_daemon.nx -- the API ENDPOINT: an HTTP server exposing the video sniffer.
2// GET /sniff?url=<percent-encoded page url> -> 200 {"found":..,"route":..,"url":..}
3// GET / -> 200 nx_media_sniff_daemon ok (health)
4// Reuses nx_http_server (listen/accept/read/send) + the shared vsf_sniff_url (fetch page + bundles over
5// sovereign TLS + guarded sniff). Loopback bind by default (front it with the OPAQUE gateway to go public).
6// Run: nx_media_sniff_daemon [port] (from nxc2 root -- certdata path is relative). license_tier: ORIGINAL
7import "nx_syscalls.nx"
8import "nx_http_server.nx"
9import "nx_x509_trust_store.nx"
10import "nx_trust_store_load_from_certdata.nx"
11import "nx_video_sniff.nx"
12import "nx_video_sniff_fetch.nx"
13import "nx_extract_heal.nx" // xh_log / xh_flush -- failure log fuels the self-heal loop
14const K_MAGIC_18092: i64 = 18092
15const K_MAGIC_4194304: i64 = 4194304
16const K_MAGIC_1048576: i64 = 1048576
17const K_MAGIC_16384: i64 = 16384
18const K_MAGIC_8192: i64 = 8192
19const K_MAGIC_2560: i64 = 2560
20
21func dlog(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(2,s,n); return 0 }
22func dput(dst: *u8, off: i64, s: *u8) -> i64 { var i: i64=0; while s[i]!=(0 as u8){dst[off]=s[i];off=off+1;i=i+1} return off }
23func dputn(dst: *u8, off: i64, v: i64) -> i64 { var m: i64=v; if m==0 { dst[off]=48 as u8; return off+1 } let t: *u8=sys_mmap(24); var k: i64=0; while m>0 { t[k]=(48+(m%10)) as u8; m=m/10; k=k+1 } var j: i64=0; while j<k { dst[off]=t[k-1-j]; off=off+1; j=j+1 } return off }
24func dstarts(p: *u8, plen: i64, pre: *u8) -> i64 { var i: i64=0; while pre[i]!=(0 as u8) { if i>=plen { return 0 } if (p[i]&0xff)!=(pre[i]&0xff) { return 0 } i=i+1 } return 1 }
25func datoi(s: *u8) -> i64 { var v: i64=0; var i: i64=0; while (s[i]&0xff)>=48 { if (s[i]&0xff)>57 { i=i } else { v=v*10+((s[i]&0xff)-48); i=i+1 } if (s[i]&0xff)<48 { i=i } } return v }
26
27// send an HTTP 200 with a body of the given content-type, then close.
28func send_resp(cfd: i64, ctype: *u8, body: *u8, blen: i64) -> i64 {
29 let resp: *u8 = sys_mmap(blen + 512)
30 var o: i64 = 0
31 o = dput(resp, o, "HTTP/1.1 200 OK\r\nContent-Type: " as *u8)
32 o = dput(resp, o, ctype)
33 o = dput(resp, o, "\r\nContent-Length: " as *u8)
34 o = dputn(resp, o, blen)
35 o = dput(resp, o, "\r\nConnection: close\r\nAccess-Control-Allow-Origin: *\r\n\r\n" as *u8)
36 var i: i64 = 0
37 while i < blen { resp[o] = body[i]; o = o + 1; i = i + 1 }
38 return nx_http_server_send_response(cfd, resp, o)
39}
40func slen2(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
41func dcontains(hay: *u8, hl: i64, needle: *u8) -> i64 { var nl: i64=0; while needle[nl]!=(0 as u8){nl=nl+1} if nl==0 { return 1 } var i: i64=0; let last: i64=hl-nl; while i<=last { var j: i64=0; var m: i64=1; while j<nl { if (hay[i+j]&0xff)!=(needle[j]&0xff) { m=0; j=nl } else { j=j+1 } } if m==1 { return 1 } i=i+1 } return 0 }
42
43func main(argc: i64, argv: *i64) -> i64 {
44 var port: i64 = K_MAGIC_18092
45 if argc >= 2 { port = datoi(argv[1] as *u8) }
46 let r: i64 = nx_trust_store_load_from_certdata("data/mozilla_certdata.txt" as *u8, 512, K_MAGIC_4194304)
47 if r <= 0 { dlog("SNIFFD: certdata load failed (run from nxc2 root)\n" as *u8); sys_exit(1); return 1 }
48 let store: *TrustStore = r as *TrustStore
49
50 let addr: *u8 = sys_mmap(16)
51 nx_http_server_addr_loopback(addr, port)
52 let vb: *i64 = sys_mmap(8) as *i64
53 let lfd: i64 = nx_http_server_listen(addr, 16, vb)
54 if lfd < 0 { dlog("SNIFFD: listen failed\n" as *u8); sys_exit(1); return 1 }
55 let banner: *u8 = sys_mmap(64); var bo: i64 = dput(banner, 0, "SNIFFD listening 127.0.0.1:" as *u8); bo = dputn(banner, bo, port); banner[bo] = 10 as u8; banner[bo+1] = 0 as u8
56 dlog(banner)
57
58 // FAILURE LOG: persistent, accumulated across requests, flushed to a status file each miss (self-heal fuel).
59 sys_mkdir("knowledge" as *u8, 0x1ff)
60 sys_mkdir("knowledge/status" as *u8, 0x1ff)
61 let logpath: *u8 = "knowledge/status/sniff_failures.log" as *u8
62 let flog: *u8 = sys_mmap(K_MAGIC_1048576)
63 var flog_off: i64 = 0
64
65 var running: i64 = 1
66 while running == 1 {
67 let cfd: i64 = nx_http_server_accept_one(lfd, vb)
68 if cfd < 0 { running = running } // transient accept error -> keep serving
69 else {
70 let req: *u8 = sys_mmap(K_MAGIC_16384)
71 let om: *i64 = sys_mmap(8) as *i64; let opo: *i64 = sys_mmap(8) as *i64; let opl: *i64 = sys_mmap(8) as *i64
72 let ocl: *i64 = sys_mmap(8) as *i64; let obo: *i64 = sys_mmap(8) as *i64; let orn: *i64 = sys_mmap(8) as *i64
73 let rc: i64 = nx_http_server_read_request(cfd, req, K_MAGIC_16384, om, opo, opl, ocl, obo, orn)
74 if rc == NXS_OK {
75 let path: *u8 = ((req as i64) + opo[0]) as *u8
76 let plen: i64 = opl[0]
77 if dstarts(path, plen, "/sniff" as *u8) == 1 {
78 let urlbuf: *u8 = sys_mmap(K_MAGIC_8192)
79 let un: i64 = vs_query_url(path, plen, urlbuf, K_MAGIC_8192)
80 if un > 0 {
81 dlog("SNIFFD /sniff url=" as *u8); dlog(urlbuf); dlog("\n" as *u8)
82 let planbuf: *u8 = sys_mmap(K_MAGIC_2560)
83 let kind: i64 = vsf_sniff_url(urlbuf, un, store, planbuf, K_MAGIC_2560, 5)
84 let json: *u8 = sys_mmap(K_MAGIC_2560)
85 vs_result_json(kind, planbuf, json, K_MAGIC_2560)
86 send_resp(cfd, "application/json" as *u8, json, slen2(json))
87 // a MISS (no media / fetch-fail / guard-kill) -> log url + reason, flush. This is the
88 // real-world failure stream that drives auto-heal: an operator/critic reviews these and
89 // xh_learn feeds the pattern table, then the extractor adapts (see nx_extract_heal).
90 if dcontains(json, slen2(json), "\"found\":false" as *u8) == 1 {
91 let reason: *u8 = vs_route_name(kind)
92 flog_off = xh_log(flog, flog_off, K_MAGIC_1048576, urlbuf, un, reason)
93 xh_flush(logpath, flog, flog_off)
94 dlog("SNIFFD MISS logged url=" as *u8); dlog(urlbuf); dlog(" reason=" as *u8); dlog(reason); dlog("\n" as *u8)
95 }
96 } else {
97 send_resp(cfd, "application/json" as *u8, "{\"error\":\"missing url param\"}" as *u8, 29)
98 }
99 } else {
100 send_resp(cfd, "text/plain" as *u8, "nx_media_sniff_daemon ok" as *u8, 24)
101 }
102 } else { sys_close(cfd) }
103 }
104 }
105 return 0
106}