public IPAddress GetNextServer(string mac)
        {
            var clusterTftpServers = new ApiCalls.APICall().ProxyDhcpApi.GetComputerTftpServers(mac);
            var onlineTftpServers  = new List <string>();

            foreach (var tftpServer in clusterTftpServers.TftpServers)
            {
                if (_availableTftpServers[tftpServer])
                {
                    onlineTftpServers.Add(tftpServer);
                }
            }

            var random = new Random();
            var index  = random.Next(0, onlineTftpServers.Count);
            var ip     = onlineTftpServers[index];

            return(IPAddress.Parse(ip));
        }
Exemple #2
0
        public void SetAll()
        {
            var isError = false;

            var reader = new IniReader();

            reader.CheckForConfig();

            Nic        = reader.ReadConfig("settings", "interface");
            NextServer = reader.ReadConfig("settings", "next-server");

            try
            {
                ListenDiscover = Convert.ToBoolean(reader.ReadConfig("settings", "listen-dhcp"));
            }
            catch (Exception)
            {
                Console.WriteLine("listen-dhcp Is Not Valid.  Valid Entries Include true or false");
                isError = true;
            }

            try
            {
                ListenProxy = Convert.ToBoolean(reader.ReadConfig("settings", "listen-proxy"));
            }
            catch (Exception)
            {
                Console.WriteLine("listen-proxy Is Not Valid.  Valid Entries Include true or false");
                isError = true;
            }

            try
            {
                AllowAll = Convert.ToBoolean(reader.ReadConfig("settings", "allow-all-mac"));
            }
            catch (Exception)
            {
                Console.WriteLine("allow-all-mac Is Not Valid.  Valid Entries Include true or false");
                isError = true;
            }

            try
            {
                CheckWebReservations = Convert.ToBoolean(reader.ReadConfig("settings", "check-web-reservations"));
            }
            catch (Exception)
            {
                Console.WriteLine("check-web-reservations Is Not Valid.  Valid Entries Include true or false");
                isError = true;
            }

            try
            {
                CheckTftpCluster = Convert.ToBoolean(reader.ReadConfig("settings", "check-tftp-cluster"));
            }
            catch (Exception)
            {
                Console.WriteLine("check-tftp-cluster Is Not Valid.  Valid Entries Include true or false");
                isError = true;
            }

            PXEClient = Encoding.UTF8.GetBytes("PXEClient");
            AAPLBSDPC = Encoding.UTF8.GetBytes("AAPLBSDPC");

            CloneDeployServiceURL = reader.ReadConfig("settings", "clonedeploy-base-url");
            if (!CloneDeployServiceURL.Trim().EndsWith("/"))
            {
                CloneDeployServiceURL += "/";
            }
            BiosBootFile  = reader.ReadConfig("settings", "bios-bootfile");
            Efi32BootFile = reader.ReadConfig("settings", "efi32-bootfile");
            Efi64BootFile = reader.ReadConfig("settings", "efi64-bootfile");

            AppleBootFile            = reader.ReadConfig("settings", "apple-boot-file");
            RootPath                 = reader.ReadConfig("settings", "apple-root-path");
            VendorInfo               = reader.ReadConfig("settings", "apple-vendor-specific-information");
            ServerIdentifierOverride = reader.ReadConfig("settings", "server-identifier-override");



            try
            {
                ListenBSDP = Convert.ToBoolean(reader.ReadConfig("settings", "listen-apple-bsdp"));
            }
            catch (Exception)
            {
                Console.WriteLine("listen-apple-bsdp Is Not Valid.  Valid Entries Include true or false");
                isError = true;
            }


            AppleEFIBootFile = reader.ReadConfig("settings", "apple-efi-boot-file");

            if (!string.IsNullOrEmpty(CloneDeployServiceURL))
            {
                Console.Write("CloneDeploy ServiceURL Is Populated.  Testing API ... ");
                CheckAppleApi = true;
                var testResult = new ApiCalls.APICall().ProxyDhcpApi.Test();
                if (!testResult)
                {
                    Console.WriteLine("FAILED");
                    Console.WriteLine("... Web Reservations Will Not Be Processed");
                    Console.WriteLine("... Clustered Tftp Servers Will Not Be Processed");
                    CloneDeployServiceURL = null;
                    CheckTftpCluster      = false;
                    CheckWebReservations  = false;
                    CheckAppleApi         = false;
                }
                else
                {
                    Console.WriteLine("PASSED");
                }

                if (ListenBSDP && CheckAppleApi)
                {
                    var profileIp = "";
                    Console.WriteLine("Checking For Apple NetBoot Info From CloneDeploy API");
                    if (Nic == "0.0.0.0")
                    {
                        profileIp = ServerIdentifierOverride;
                        Console.WriteLine("Looking For Matching NetBoot Profile For IP " + ServerIdentifierOverride);
                    }
                    else
                    {
                        profileIp = Nic;
                        Console.WriteLine("Looking For Matching NetBoot Profile For IP " + Nic);
                    }

                    var appleVendorDto = new ApiCalls.APICall().ProxyDhcpApi.GetAppleVendorString(profileIp);
                    if (appleVendorDto.Success)
                    {
                        Console.WriteLine("Found. " + appleVendorDto.VendorString);
                        VendorInfo = appleVendorDto.VendorString;
                    }
                    else
                    {
                        Console.WriteLine(appleVendorDto.ErrorMessage);
                    }
                }

                if (CheckTftpCluster)
                {
                    try
                    {
                        TftpPollingInterval = Int32.Parse(reader.ReadConfig("settings", "tftp-polling-interval"));
                    }
                    catch (Exception)
                    {
                        Console.WriteLine(
                            "tftp-polling-interval Is Not Valid.  Valid Entries Include A Positive Integer");
                        isError          = true;
                        CheckTftpCluster = false;
                    }

                    try
                    {
                        Console.WriteLine("Clustered Tftp Server Check Is Enabled.  Enumerating Tftp Servers ...");

                        new TftpMonitor().Run();
                        //Fix me - the last item in the list seems to get cut off because it might not have finished the tftp get again.  Running it again, adds a delay.
                        new TftpMonitor().Run();

                        for (int i = 0; i < TftpMonitor.TftpStatus.Keys.Count; i++)
                        {
                            Console.WriteLine(TftpMonitor.TftpStatus.ElementAt(i));
                        }
                        Console.WriteLine("... Complete");
                    }
                    catch (Exception)
                    {
                        Console.WriteLine(
                            "Could Not Enumerate Tftp Servers");
                        isError          = true;
                        CheckTftpCluster = false;
                    }
                }
            }
            else
            {
                Console.WriteLine("CloneDeploy Web Service Is Not Populated.  Web Reservations And Apple NetBoot Profiles Will Not Be Processed");
            }

            Console.WriteLine();


            try
            {
                IPAddress.Parse(Nic);
            }
            catch
            {
                Console.WriteLine("Interface Is Not Valid.  Ensure The Interface Is A Valid IPv4 Address");
                isError = true;
            }

            try
            {
                IPAddress.Parse(NextServer);
            }
            catch
            {
                Console.WriteLine("Next-Server Is Not Valid.  Ensure The Next-Server Is A Valid IPv4 Address");
                isError = true;
            }

            if (ListenBSDP && !ListenDiscover)
            {
                Console.WriteLine("Cannot Listen For Apple BSDP Requests.  listen-dhcp Must Be true");
                isError = true;
            }

            if (Nic == "0.0.0.0" && string.IsNullOrEmpty(ServerIdentifierOverride))
            {
                Console.WriteLine("When the interface Is Set To Listen For Requests On Any IP, server-identifier-override Must Have An Address");
                isError = true;
            }

            if (Type.GetType("Mono.Runtime") != null)
            {
                if (Nic != "0.0.0.0")
                {
                    Console.WriteLine("When running on Mono the interface must be set to 0.0.0.0");
                    isError = true;
                }
                if (string.IsNullOrEmpty(ServerIdentifierOverride))
                {
                    Console.WriteLine("When running on Mono the server-identifier-override must have a value");
                    isError = true;
                }
            }

            if (isError)
            {
                Console.WriteLine("CloneDeploy Proxy DHCP Could Not Be Started");
                Console.WriteLine("Press [Enter] to Exit");
                Console.Read();
                Environment.Exit(1);
            }

            var rdr = new FileReader();

            if (!AllowAll)
            {
                if (File.Exists(AppDomain.CurrentDomain.BaseDirectory + @"allow"))
                {
                    foreach (var mac in rdr.ReadFile("allow"))
                    {
                        DHCPServer.DHCPServer.AddAcl(PhysicalAddress.Parse(mac), false);
                    }
                }
            }

            if (File.Exists(AppDomain.CurrentDomain.BaseDirectory + @"deny"))
            {
                foreach (var mac in rdr.ReadFile("deny"))
                {
                    DHCPServer.DHCPServer.AddAcl(PhysicalAddress.Parse(mac), true);
                }
            }

            try
            {
                if (File.Exists(AppDomain.CurrentDomain.BaseDirectory + @"reservations"))
                {
                    foreach (var reservation in rdr.ReadFile("reservations"))
                    {
                        var arrayReservation = reservation.Split(',');

                        var serveroptions = new DHCPServer.DHCPServer.ReservationOptions();
                        if (arrayReservation.Length == 4)
                        {
                            serveroptions.ReserveBCDFile = arrayReservation[3];
                        }
                        serveroptions.ReserveBootFile   = arrayReservation[2];
                        serveroptions.ReserveNextServer = arrayReservation[1];
                        DHCPServer.DHCPServer.Reservations.Add(PhysicalAddress.Parse(arrayReservation[0]), serveroptions);
                    }
                }
            }
            catch (Exception)
            {
                Console.WriteLine("Could Not Parse Local Reservations File.  Local Reservations Will Not Be Processed");
                DHCPServer.DHCPServer.Reservations.Clear();
            }
        }