Commit graph

90 commits

Author SHA1 Message Date
Andrew Pimenov
bfe9529667 exporter: name the report after the target, not always the local egress asn
target mode's filename fell back to the local machine's egress asn
unconditionally, so 'netcheck --target AS15169' wrote report_<local-asn>_*
instead of report_AS15169_*. meta.target already carries the right
subject when one was given; prefer it and fall back to the egress asn
only in auto mode.
2026-08-09 03:47:55 +03:00
Andrew Pimenov
3425e87dbf interpret: label a non-responding hop instead of printing None
a hop with no icmp reply has ip=None; the sustained-loss finding
formatted it straight into the report text as the literal string
'(None)'. seen live in a --quick smoke test report.
2026-08-09 03:43:57 +03:00
Andrew Pimenov
10c5939bcb bgp: clamp cache age to zero against windows mtime clock skew
time.time() - path.stat().st_mtime went negative under load when NTFS
stamped a write's mtime slightly ahead of the wall clock read a moment
later, making a ttl_hours=0 cache lookup serve stale data instead of
refetching. surfaced as a flaky failure in test_cached_json_refetches_once_the_entry_expires
during the full suite run before task 40's smoke test.
2026-08-09 03:39:35 +03:00
Andrew Pimenov
0d6d5405b3 watch: cycle scheduling, live dashboard and one time-series artifact per session 2026-08-09 03:37:01 +03:00
Andrew Pimenov
21b71a4056 icmp_win: bound trace_hops_win to a total timeout budget and stop it blocking process exit
subprocess_seconds was being applied per hop instead of as a total trace
budget, so a path with several non-responding hops could block for up to
max_hops * subprocess_seconds. The blocking call also ran on a
ThreadPoolExecutor worker via asyncio.to_thread, which concurrent.futures
joins at process exit - so an orphaned hop stuck past its timeout kept the
whole CLI alive long after diagnose() had already written its report.

Divide the budget across hops (capped at 4s per hop) with an early exit
once the total deadline passes, and dispatch the call on a raw daemon
thread instead so it can never hold the process open even in the worst
case.
2026-08-09 03:33:12 +03:00
Andrew Pimenov
4e4956ceeb compare: diff identity, latency, speed and findings between two reports 2026-08-09 03:24:03 +03:00
Andrew Pimenov
335ff0975e cli: typer app, phase pipeline and opt-in tcp-syn trace tier 2026-08-09 03:24:00 +03:00
Andrew Pimenov
e4f9c3b5b7 exporter: explicit placeholders so a failed section never reads as a healthy one 2026-08-09 02:46:53 +03:00
Andrew Pimenov
879b974e57 exporter: markdown rendering with sparklines and hop bars 2026-08-09 02:44:43 +03:00
Andrew Pimenov
71b1fc95e3 exporter: report assembly, strict json and atomic writes 2026-08-09 02:42:22 +03:00
Andrew Pimenov
62040021af speed: bufferbloat probe running concurrently with saturation 2026-08-09 02:39:24 +03:00
Andrew Pimenov
36b2941667 speed: ookla, cloudflare, fast.com and ndt7 cascade tiers 2026-08-09 02:38:19 +03:00
Andrew Pimenov
5eec7aacab speed: throughput math, cfL4 header parsing, bufferbloat delta 2026-08-09 02:37:14 +03:00
Andrew Pimenov
0999f85235 dns_leak: per-adapter asn mismatch and ecs leak detection 2026-08-09 02:32:13 +03:00
Andrew Pimenov
b151a934b7 traceroute: mtr to icmp_win to icmplib to system-binary cascade 2026-08-09 02:31:25 +03:00
Andrew Pimenov
4c58f8add8 icmp_win: decode ICMP_ECHO_REPLY buffers for both pointer widths 2026-08-09 02:26:09 +03:00
Andrew Pimenov
c35725a50f latency: ping summarization and unprivileged backend fan-out 2026-08-09 02:25:04 +03:00
Andrew Pimenov
d7b4c49786 reputation: internetdb, captcha risk and reputation assembly 2026-08-09 02:21:57 +03:00
Andrew Pimenov
30e001dc81 reputation: decode dnsbl 127.255.255.x error range as unavailable 2026-08-09 02:20:30 +03:00
Andrew Pimenov
48f7865987 reputation: firehol netset cache with local range index 2026-08-09 02:19:43 +03:00
Andrew Pimenov
d45fcb5a59 bgp: assemble BgpIntel from every source with per-source failures tolerated 2026-08-09 02:16:59 +03:00
Andrew Pimenov
fee732dd8d bgp: asrank, team cymru and disk-cached peeringdb parsing 2026-08-09 02:16:05 +03:00
Andrew Pimenov
f269fb95d8 bgp: ripestat parsers and bounded bulk queries 2026-08-09 02:15:07 +03:00
Andrew Pimenov
db055d8a85 ip_geo: field-wise merge, dual-stack comparison, provider fan-out 2026-08-09 02:14:03 +03:00
Andrew Pimenov
858806f014 ip_geo: per-provider normalizers to a common IpGeo shape 2026-08-09 02:12:56 +03:00
Andrew Pimenov
925bf1b910 interpret: bufferbloat grading and overall verdict scoring 2026-08-08 22:10:26 +03:00
Andrew Pimenov
7533f7e5bd interpret: weighted vpn confidence scoring 2026-08-08 22:08:20 +03:00
Andrew Pimenov
f99de6b7dc interpret: threshold bands, latency and path findings 2026-08-08 22:07:07 +03:00
Andrew Pimenov
6ebc9ac695 traceparse: os dispatcher and trace completion detection 2026-08-08 22:04:34 +03:00
Andrew Pimenov
e8e55278a7 traceparse: bsd/macos parser with multipath hops and annotations 2026-08-08 22:03:37 +03:00
Andrew Pimenov
61c22b218d traceparse: windows tracert parser, shape-based and code-page safe 2026-08-08 22:02:38 +03:00
Andrew Pimenov
5e4c9096a6 traceparse: gnu traceroute parser with per-hop stats 2026-08-08 22:01:30 +03:00
Andrew Pimenov
3f85c5083e stats: rtt loss, mdev and jitter with timeout-safe edge cases 2026-08-08 22:00:00 +03:00
Andrew Pimenov
afc32e4599 netinfo: local interface, gateway, mtu and per-adapter resolvers 2026-08-08 21:56:45 +03:00
Andrew Pimenov
e61790222d netinfo: attempt-based capability detection and backend choice 2026-08-08 21:54:00 +03:00
Andrew Pimenov
a26a0587c5 orchestration: run_module envelope and exception classification 2026-08-08 21:53:05 +03:00
Andrew Pimenov
ecf570a5b2 config: pydantic-settings loader with env > .env > yaml precedence 2026-08-08 21:38:12 +03:00
Andrew Pimenov
9e6c6c5f77 models: domain shapes for geo, bgp, reputation, probes, speed 2026-08-08 21:33:09 +03:00
Andrew Pimenov
f8f5fbc49c models: ModuleResult, ProbeError, Finding, Signal envelopes 2026-08-08 21:28:58 +03:00
Andrew Pimenov
de09864eba project scaffold: uv packaging, config.yaml, package skeleton 2026-08-08 21:12:41 +03:00