namespace KnockKnock.Service; using System.Net; using System.Management.Automation; using System.Timers; public class Worker : BackgroundService { private readonly ILogger _logger; public Worker(ILogger logger) { _logger = logger; } Lib.Manager manager; Timer idleTimer; protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogInformation("Starting KnockKnock"); manager = new Lib.Manager(); _logger.LogInformation("Creating proxy for :1234 -> 10.200.0.10:3389"); Lib.Proxy p = new Lib.Proxy(new IPEndPoint(IPAddress.Any, 1234), new IPEndPoint(IPAddress.Parse("10.200.0.10"), 3389)); p.Active += Proxy_Active; p.Idle += Proxy_Idle; _logger.LogInformation("Instantiating Idle Timer"); idleTimer = new Timer(10000); idleTimer.Elapsed += IdleTimer_Elapsed; _logger.LogInformation("Starting"); manager.AddProxy(p); while (!stoppingToken.IsCancellationRequested) { await Task.Delay(1000, stoppingToken); } manager.Close(); } private void IdleTimer_Elapsed(object? sender, ElapsedEventArgs e) { idleTimer.Stop(); _logger.LogDebug("Suspending VM"); PowerShell ps = PowerShell.Create(); ps.AddScript("Suspend-VM Debian"); ps.Invoke(); } private void Proxy_Idle(Lib.Proxy sender) { _logger.LogDebug("Idle -- starting idle timer"); idleTimer.Start(); } private void Proxy_Active(Lib.Proxy sender) { idleTimer.Stop(); _logger.LogDebug("Resuming VM"); PowerShell ps = PowerShell.Create(); ps.AddScript("Resume-VM Debian"); ps.Invoke(); } }