Пример #1
0
        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;
                }
            }
        }
Пример #2
0
        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();
            }
        }