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}