[package] name = "netdesk-cli" version.workspace = true edition.workspace = true authors.workspace = true license.workspace = true description = "Headless NetDesk native client — connects to a host and verifies the pipeline (dev/test harness)." [[bin]] name = "netdesk" path = "src/main.rs" # End-to-end feature test harness: connects to the live host and verifies every # Session feature + the read-only host_ctl backend. See src/bin/e2e.rs. [[bin]] name = "netdesk-e2e" path = "src/bin/e2e.rs" # TCP tunnel client: forward a local port through the relay to a port on the # remote host (SSH/VNC/RDP/DB over NetDesk). Portal-authed. [[bin]] name = "netdesk-tunnel" path = "src/bin/tunnel.rs" # LAN discovery scanner: find NetDesk hosts on the local network. [[bin]] name = "netdesk-lan-scan" path = "src/bin/lan_scan.rs" # Recursive folder download: pull a whole remote folder tree to a local dir. [[bin]] name = "netdesk-getdir" path = "src/bin/getdir.rs" # Interactive terminal: run commands on the remote host's shell (ConPTY). [[bin]] name = "netdesk-term" path = "src/bin/term.rs" # Voice send-test: capture this PC's mic and stream it to the host over # CHAN_VOICE (drives the exact native-viewer voice path, headlessly). [[bin]] name = "netdesk-voice-send" path = "src/bin/voice_send.rs" # FPS probe: count received video frames per 1-second bucket (observes the # host's startup FPS ramp end to end). [[bin]] name = "netdesk-fps-probe" path = "src/bin/fps_probe.rs" # Privacy-mode integration test: toggle privacy + verify sys.res and that the # capture keeps delivering frames through the blackout. [[bin]] name = "netdesk-privacy-test" path = "src/bin/privacy_test.rs" # Direct-IP connect test: dial a host's IP:port directly (no relay) over # DirectTcp and verify the E2E session + video. [[bin]] name = "netdesk-direct" path = "src/bin/direct_connect.rs" [dependencies] netdesk-core = { path = "../core" } # e2e decodes received Opus audio packets to measure real per-source energy # (RMS/peak) — proving system + mic audio actually transmit, not just that # packets arrive. netdesk-opus = { path = "../opus" } tokio = { workspace = true } anyhow = { workspace = true } # e2e.rs parses sys.res / session.info JSON and pulls in the viewer's host_ctl # module verbatim (via #[path]); host_ctl needs serde derive, serde_json, a # blocking HTTP client (ureq) and the clipboard crate it references. serde = { workspace = true } serde_json = { workspace = true } ureq = { version = "2.10", features = ["json"] } arboard = "3" # netdesk-tunnel client: portal-login (ureq) then a raw tunnel WebSocket to # wss://server/tunnel/, piping a local TcpListener through it. tokio-tungstenite = { workspace = true } futures-util = { workspace = true } # e2e.rs verifies REAL OS-level input injection on the host (which, for the live # test, runs on this same machine): GetCursorPos confirms the mouse actually # moved, GetAsyncKeyState confirms a key actually registered. DPI-aware so the # readings share the host's physical pixel space. [target.'cfg(windows)'.dependencies] # the e2e bin #[path]-includes viewer/src/host_ctl.rs, which drives the in-process # native host engine for the HOSTCTL checks. netdesk-host = { path = "../host" } windows = { version = "0.58", features = [ "Win32_Foundation", "Win32_UI_WindowsAndMessaging", "Win32_UI_Input_KeyboardAndMouse", "Win32_UI_HiDpi", ] }