// // // using Aiursoft.AiurObserver; using Aiursoft.AiurObserver.Command; using Microsoft.Extensions.Logging; using Aiursoft.AiurObserver.Extensions; namespace Moni; public abstract class Program { private BlockRule[] _rules = new[] { // 8MiB/s, 80MiB in 10 seconds new BlockRule { MaxBytesTransferred = 0x500_0000, IntervalSeconds = 10 }, // 6MiB/s, 360MiB in 60 seconds new BlockRule { MaxBytesTransferred = 0x1680_0000, IntervalSeconds = 60 }, // 5MiB/s, 1500MiB in 300 seconds (5 minutes) new BlockRule { MaxBytesTransferred = 0x5DC0_0000, IntervalSeconds = 300 }, // 4MiB/s, 2400MiB in 600 seconds (10 minutes) new BlockRule { MaxBytesTransferred = 0x9600_0000, IntervalSeconds = 600 }, // 3MiB/s, 3600MiB in 1200 seconds (20 minutes) new BlockRule { MaxBytesTransferred = 0xE10_0000, IntervalSeconds = 1200 } }; private static Dictionary IpTrafficUsage { get; } = new(); public static async Task Main(string[] args) { if (args.Length != 1) { Console.WriteLine("Please provide the network interface name."); return; } var interfaceName = args[0]; var logger = LoggerFactory.Create(logging => logging.AddConsole()).CreateLogger(); var runner = new LongCommandRunner(logger); // Returns every 10 seconds runner.Output.InNewThread().Subscribe(OnLog); await runner.Run( bin: "/usr/bin/bash", arg: $"/usr/local/bin/moninet {interfaceName}", path: "/"); } private static Task OnLog(string rawOutput) { var outputLines = rawOutput.Split("\n"); foreach (var line in outputLines.Select(outputLine => outputLine.Trim())) { if (line.StartsWith("IP Address")) continue; if (line.StartsWith("===")) continue; var parts = line.Split(" ", StringSplitOptions.RemoveEmptyEntries) .Select(part => part.Trim()) .ToArray(); if (parts.Length != 3) continue; var ipAddr = parts[0]; var download = long.Parse(parts[1]); var upload = long.Parse(parts[2]); Console.WriteLine($"In the past 10 seconds, remote IP {ipAddr} downloaded {download} bytes and uploaded {upload} bytes."); var totalTraffic = download + upload; IpTrafficUsage[ipAddr] = IpTrafficUsage.TryGetValue(ipAddr, out var usage) ? usage + totalTraffic : totalTraffic; } return Task.CompletedTask; } } public class BlockRule { public long MaxBytesTransferred { get; set; } public int IntervalSeconds { get; set; } }