private void CleanPool(DhcpPool pool, DhcpAddressPool addressPool) { var now = DateTimeOffset.Now; var timeoutDeadline = now.Add(pool.RequestTimeOut); // TODO : Find better way to clean List <Lease> leasesToClean; try { leasesToClean = Leases .Where(x => x.Pool == pool && ( ( x.Acknowledged == null && x.TimesOut < now ) || ( x.Expires < now ) ) ).ToList(); } catch (Exception e) { System.Diagnostics.Debug.WriteLine("Failed to scan leases for leases to clean : " + e.Message); return; } foreach (var lease in leasesToClean) { try { addressPool.SetAvailable(lease.Address); } catch (Exception e) { System.Diagnostics.Debug.WriteLine("Failed to set " + lease.Address.ToString() + " as available : " + e.Message); return; } try { Leases.Remove(lease); } catch (Exception e) { System.Diagnostics.Debug.WriteLine("Failed to remove " + lease.Address.ToString() + " from leases : " + e.Message); return; } } }
public void ModifyPool( NetworkPrefix network, List <IPAddress> gateways, IPRanges exclusions, string domainName, string bootFile, List <IPAddress> dnsServers, IPAddress tftpServer ) { lock (this) { var addressPool = AddressPools.Where(x => x.Pool.Network.Equals(network)).FirstOrDefault(); if (addressPool == null) { var dhcpPool = GetPoolByPrefix(network); if (dhcpPool == null) { return; } addressPool = new DhcpAddressPool(dhcpPool); AddressPools.Add(addressPool); } var pool = addressPool.Pool; pool.DefaultGateways = gateways .Select(x => x ) .ToList(); var exclusionChanges = new ExclusionChanges(pool.Network, pool.Exclusions, exclusions); var leasesToKill = Leases .Where(x => exclusionChanges.ToExclude.Contains(x.Address) ) .ToList(); foreach (var leaseToKill in leasesToKill) { addressPool.SetAvailable(leaseToKill.Address); Leases.Remove(leaseToKill); } var toExclude = exclusionChanges.ToExclude.Clone(); toExclude.Remove(pool.Network.BaseNetwork.Network); toExclude.Remove(pool.Network.Broadcast); addressPool.UnsetAvailable(toExclude); var toUnexclude = exclusionChanges.ToUnexclude.Clone(); toUnexclude.Remove(pool.Network.BaseNetwork.Network); toUnexclude.Remove(pool.Network.Broadcast); addressPool.SetAvailable(toUnexclude); pool.Exclusions = exclusions.Clone(); pool.PoolOptions.DomainName = domainName; pool.PoolOptions.BootFile = bootFile; pool.PoolOptions.TFTPServers = new List <string> { tftpServer.ToString() }; pool.PoolOptions.DNSServers = dnsServers .Select(x => x ) .ToList(); } }