|
|
|
@@ -95,18 +95,21 @@ public partial class ProbeService(IOptionsMonitor<ProbeOptions> options, ILogger
|
|
|
|
|
await tracing.WaitAsync(ct);
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var info = new ProcessStartInfo("tracepath") { RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false };
|
|
|
|
|
foreach (var argument in new[] { "-n", "-m", "16", target.ToString() }) info.ArgumentList.Add(argument);
|
|
|
|
|
var info = new ProcessStartInfo("stdbuf") { RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false };
|
|
|
|
|
foreach (var argument in new[] { "-oL", "tracepath", "-n", "-m", "16", target.ToString() }) info.ArgumentList.Add(argument);
|
|
|
|
|
using var process = Process.Start(info);
|
|
|
|
|
if (process is null) return hops;
|
|
|
|
|
using var timeout = CancellationTokenSource.CreateLinkedTokenSource(ct);
|
|
|
|
|
timeout.CancelAfter(TimeSpan.FromSeconds(25));
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var silent = 0;
|
|
|
|
|
while (await process.StandardOutput.ReadLineAsync(timeout.Token) is { } line)
|
|
|
|
|
{
|
|
|
|
|
if (SilentLine().IsMatch(line) && ++silent >= 3) break;
|
|
|
|
|
var match = HopLine().Match(line);
|
|
|
|
|
if (!match.Success || !IPAddress.TryParse(match.Groups[2].Value, out var address)) continue;
|
|
|
|
|
silent = 0;
|
|
|
|
|
var distance = int.Parse(match.Groups[1].Value, CultureInfo.InvariantCulture);
|
|
|
|
|
if (hops.Any(h => h.Distance == distance)) continue;
|
|
|
|
|
if (!IsPublic(address) || Refuse(address) is not null) continue;
|
|
|
|
@@ -148,6 +151,9 @@ public partial class ProbeService(IOptionsMonitor<ProbeOptions> options, ILogger
|
|
|
|
|
[GeneratedRegex(@"^\s*(\d+):\s+([0-9a-fA-F.:]+)\s+([\d.]+)ms")]
|
|
|
|
|
internal static partial Regex HopLine();
|
|
|
|
|
|
|
|
|
|
[GeneratedRegex(@"^\s*\d+:\s+no reply")]
|
|
|
|
|
internal static partial Regex SilentLine();
|
|
|
|
|
|
|
|
|
|
async Task<ProbeOutcome> Knock(Ticket ticket, int port, CancellationToken ct)
|
|
|
|
|
{
|
|
|
|
|
await outbound.WaitAsync(ct);
|
|
|
|
|