//
//
//
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; }
}