public CleanTaskBootFiles(ComputerEntity computer) { _computer = computer; _bootFile = StringManipulationServices.MacToPxeMac(_computer.Mac); _computerServices = new ComputerServices(); _clusterGroupServices = new ClusterGroupServices(); _secondaryServerServices = new SecondaryServerServices(); }
public bool CreatePxeBootFiles() { var pxeComputerMac = StringManipulationServices.MacToPxeMac(_computer.Mac); var webPath = SettingServices.GetSettingValue(SettingStrings.WebPath) + "api/ClientImaging/"; var globalComputerArgs = SettingServices.GetSettingValue(SettingStrings.GlobalComputerArgs); var userToken = SettingServices.GetSettingValue(SettingStrings.WebTaskRequiresLogin) == "No" ? SettingServices.GetSettingValue(SettingStrings.UniversalToken) : ""; const string newLineChar = "\n"; if (_computer.AlternateServerIpId != -1) { var altServer = new AlternateServerIpServices().GetAlternateServerIp(_computer.AlternateServerIpId); if (altServer != null) { webPath = altServer.ApiUrl + "api/ClientImaging/"; } } var ipxe = new StringBuilder(); ipxe.Append("#!ipxe" + newLineChar); ipxe.Append("kernel " + webPath + "IpxeBoot?filename=" + _imageProfile.Kernel + "&type=kernel" + " initrd=" + _imageProfile.BootImage + " root=/dev/ram0 rw ramdisk_size=156000" + " consoleblank=0" + " web=" + webPath + " USER_TOKEN=" + userToken + " " + globalComputerArgs + " " + _imageProfile.KernelArguments + newLineChar); ipxe.Append("imgfetch --name " + _imageProfile.BootImage + " " + webPath + "IpxeBoot?filename=" + _imageProfile.BootImage + "&type=bootimage" + newLineChar); ipxe.Append("boot" + newLineChar); var sysLinux = new StringBuilder(); sysLinux.Append("DEFAULT clonedeploy" + newLineChar); sysLinux.Append("LABEL clonedeploy" + newLineChar); sysLinux.Append("KERNEL kernels" + Path.DirectorySeparatorChar + _imageProfile.Kernel + newLineChar); sysLinux.Append("APPEND initrd=images" + Path.DirectorySeparatorChar + _imageProfile.BootImage + " root=/dev/ram0 rw ramdisk_size=156000" + " consoleblank=0" + " web=" + webPath + " USER_TOKEN=" + userToken + " " + globalComputerArgs + " " + _imageProfile.KernelArguments + newLineChar); var grub = new StringBuilder(); grub.Append("set default=0" + newLineChar); grub.Append("set timeout=0" + newLineChar); grub.Append("menuentry CloneDeploy --unrestricted {" + newLineChar); grub.Append("echo Please Wait While The Boot Image Is Transferred. This May Take A Few Minutes." + newLineChar); grub.Append("linux /kernels/" + _imageProfile.Kernel + " root=/dev/ram0 rw ramdisk_size=156000" + " consoleblank=0" + " web=" + webPath + " USER_TOKEN=" + userToken + " " + globalComputerArgs + " " + _imageProfile.KernelArguments + newLineChar); grub.Append("initrd /images/" + _imageProfile.BootImage + newLineChar); grub.Append("}" + newLineChar); var list = new List <Tuple <string, string, string> > { Tuple.Create("bios", "", sysLinux.ToString()), Tuple.Create("bios", ".ipxe", ipxe.ToString()), Tuple.Create("efi32", "", sysLinux.ToString()), Tuple.Create("efi32", ".ipxe", ipxe.ToString()), Tuple.Create("efi64", "", sysLinux.ToString()), Tuple.Create("efi64", ".ipxe", ipxe.ToString()), Tuple.Create("efi64", ".cfg", grub.ToString()) }; //In proxy mode all boot files are created regardless of the pxe mode, this way computers can be customized //to use a specific boot file without affecting all others, using the proxydhcp reservations file. if (SettingServices.GetSettingValue(SettingStrings.ProxyDhcp) == "Yes") { if (SettingServices.ServerIsNotClustered) { foreach (var bootMenu in list) { var path = SettingServices.GetSettingValue(SettingStrings.TftpPath) + "proxy" + Path.DirectorySeparatorChar + bootMenu.Item1 + Path.DirectorySeparatorChar + "pxelinux.cfg" + Path.DirectorySeparatorChar + pxeComputerMac + bootMenu.Item2; if (!new FileOpsServices().WritePath(path, bootMenu.Item3)) { return(false); } } } else { var clusterGroup = new ComputerServices().GetClusterGroup(_computer.Id); foreach (var tftpServer in _clusterGroupServices.GetClusterTftpServers(clusterGroup.Id)) { foreach (var bootMenu in list) { if (tftpServer.ServerId == -1) { var path = SettingServices.GetSettingValue(SettingStrings.TftpPath) + "proxy" + Path.DirectorySeparatorChar + bootMenu.Item1 + Path.DirectorySeparatorChar + "pxelinux.cfg" + Path.DirectorySeparatorChar + pxeComputerMac + bootMenu.Item2; if (!new FileOpsServices().WritePath(path, bootMenu.Item3)) { return(false); } } else { var secondaryServer = _secondaryServerServices.GetSecondaryServer(tftpServer.ServerId); var tftpPath = new APICall(_secondaryServerServices.GetToken(secondaryServer.Name)) .SettingApi.GetSetting("Tftp Path").Value; var path = tftpPath + "proxy" + Path.DirectorySeparatorChar + bootMenu.Item1 + Path.DirectorySeparatorChar + "pxelinux.cfg" + Path.DirectorySeparatorChar + pxeComputerMac + bootMenu.Item2; if ( !new APICall(_secondaryServerServices.GetToken(secondaryServer.Name)) .ServiceAccountApi.WriteTftpFile(new TftpFileDTO { Path = path, Contents = bootMenu.Item3 })) { return(false); } } } } } } //When not using proxy dhcp, only one boot file is created else { var mode = SettingServices.GetSettingValue(SettingStrings.PxeMode); var path = ""; if (SettingServices.ServerIsNotClustered) { path = SettingServices.GetSettingValue(SettingStrings.TftpPath) + "pxelinux.cfg" + Path.DirectorySeparatorChar + pxeComputerMac; string fileContents = null; if (mode == "pxelinux" || mode == "syslinux_32_efi" || mode == "syslinux_64_efi") { fileContents = sysLinux.ToString(); } else if (mode.Contains("ipxe")) { path += ".ipxe"; fileContents = ipxe.ToString(); } else if (mode.Contains("grub")) { path += ".cfg"; fileContents = grub.ToString(); } if (!new FileOpsServices().WritePath(path, fileContents)) { return(false); } } else { var clusterGroup = new ComputerServices().GetClusterGroup(_computer.Id); var secondaryServer = new SecondaryServerEntity(); foreach (var tftpServer in _clusterGroupServices.GetClusterTftpServers(clusterGroup.Id)) { if (tftpServer.ServerId == -1) { path = SettingServices.GetSettingValue(SettingStrings.TftpPath) + "pxelinux.cfg" + Path.DirectorySeparatorChar + pxeComputerMac; } else { secondaryServer = _secondaryServerServices.GetSecondaryServer(tftpServer.ServerId); var tftpPath = new APICall(_secondaryServerServices.GetToken(secondaryServer.Name)).SettingApi .GetSetting("Tftp Path").Value; path = tftpPath + "pxelinux.cfg" + Path.DirectorySeparatorChar + pxeComputerMac; } string fileContents = null; if (mode == "pxelinux" || mode == "syslinux_32_efi" || mode == "syslinux_64_efi") { fileContents = sysLinux.ToString(); } else if (mode.Contains("ipxe")) { path += ".ipxe"; fileContents = ipxe.ToString(); } else if (mode.Contains("grub")) { path += ".cfg"; fileContents = grub.ToString(); } if (tftpServer.ServerId == -1) { if (!new FileOpsServices().WritePath(path, fileContents)) { return(false); } } else { if ( !new APICall(_secondaryServerServices.GetToken(secondaryServer.Name)) .ServiceAccountApi.WriteTftpFile(new TftpFileDTO { Path = path, Contents = fileContents })) { return(false); } } } } } return(true); }
public bool Execute(EntityComputer computer) { _computer = computer; _listOfMacs = new List <string>(); if (!string.IsNullOrEmpty(_computer.ImagingMac)) { _listOfMacs.Add(StringManipulationServices.MacToPxeMac(_computer.ImagingMac)); } else { var computerMacs = new UnitOfWork().NicInventoryRepository.Get(x => x.ComputerId == computer.Id && x.Type.Equals("Ethernet")).Select(x => x.Mac).ToList(); foreach (var mac in computerMacs) { _listOfMacs.Add(StringManipulationServices.MacToPxeMac(mac)); } } _computerServices = new ServiceComputer(); var guid = ConfigurationManager.AppSettings["ComServerUniqueId"]; _thisComServer = new ServiceClientComServer().GetServerByGuid(guid); if (_thisComServer == null) { Logger.Error($"Com Server With Guid {guid} Not Found"); return(false); } if (string.IsNullOrEmpty(_thisComServer.TftpPath)) { Logger.Error($"Com Server With Guid {guid} Does Not Have A Valid Tftp Path"); return(false); } if (ServiceSetting.GetSettingValue(SettingStrings.ProxyDhcpEnabled) == "Yes") { DeleteProxyFile("bios"); DeleteProxyFile("bios", ".ipxe"); DeleteProxyFile("efi32"); DeleteProxyFile("efi32", ".ipxe"); DeleteProxyFile("efi64"); DeleteProxyFile("efi64", ".ipxe"); DeleteProxyFile("efi64", ".cfg"); } else { var mode = ServiceSetting.GetSettingValue(SettingStrings.PxeBootloader); if (mode.Contains("ipxe")) { DeleteStandardFile(".ipxe"); } else if (mode.Contains("grub")) { DeleteStandardFile(".cfg"); } else { DeleteStandardFile(); } } return(true); }
public bool CreatePxeBootFiles() { var pxeComputerMac = StringManipulationServices.MacToPxeMac(_computer.Mac); var webPath = SettingServices.GetSettingValue(SettingStrings.WebPath) + "api/ClientImaging/"; var globalComputerArgs = SettingServices.GetSettingValue(SettingStrings.GlobalComputerArgs); var userToken = SettingServices.GetSettingValue(SettingStrings.WebTaskRequiresLogin) == "No" ? SettingServices.GetSettingValue(SettingStrings.UniversalToken) : ""; const string newLineChar = "\n"; if (_computer.AlternateServerIpId != -1) { var altServer = new AlternateServerIpServices().GetAlternateServerIp(_computer.AlternateServerIpId); if (altServer != null) { webPath = altServer.ApiUrl + "api/ClientImaging/"; } } var replacedPath = webPath; if (SettingServices.GetSettingValue(SettingStrings.IpxeSSL).Equals("1")) { replacedPath = replacedPath.ToLower().Replace("http", "https"); } else { replacedPath = replacedPath.ToLower().Replace("https", "http"); } var ipxe = new StringBuilder(); ipxe.Append("#!ipxe" + newLineChar); ipxe.Append("kernel " + replacedPath + "IpxeBoot?filename=" + _imageProfile.Kernel + "&type=kernel" + " initrd=" + _imageProfile.BootImage + " root=/dev/ram0 rw ramdisk_size=156000" + " consoleblank=0" + " web=" + webPath + " USER_TOKEN=" + userToken + " " + globalComputerArgs + " " + _imageProfile.KernelArguments + newLineChar); ipxe.Append("imgfetch --name " + _imageProfile.BootImage + " " + replacedPath + "IpxeBoot?filename=" + _imageProfile.BootImage + "&type=bootimage" + newLineChar); ipxe.Append("boot" + newLineChar); var sysLinux = new StringBuilder(); sysLinux.Append("DEFAULT clonedeploy" + newLineChar); sysLinux.Append("LABEL clonedeploy" + newLineChar); sysLinux.Append("KERNEL kernels" + Path.DirectorySeparatorChar + _imageProfile.Kernel + newLineChar); sysLinux.Append("APPEND initrd=images" + Path.DirectorySeparatorChar + _imageProfile.BootImage + " root=/dev/ram0 rw ramdisk_size=156000" + " consoleblank=0" + " web=" + webPath + " USER_TOKEN=" + userToken + " " + globalComputerArgs + " " + _imageProfile.KernelArguments + newLineChar); var grub = new StringBuilder(); grub.Append("set default=0" + newLineChar); grub.Append("set timeout=0" + newLineChar); grub.Append("menuentry CloneDeploy --unrestricted {" + newLineChar); grub.Append("echo Please Wait While The Boot Image Is Transferred. This May Take A Few Minutes." + newLineChar); grub.Append("linux /kernels/" + _imageProfile.Kernel + " root=/dev/ram0 rw ramdisk_size=156000" + " consoleblank=0" + " web=" + webPath + " USER_TOKEN=" + userToken + " " + globalComputerArgs + " " + _imageProfile.KernelArguments + newLineChar); grub.Append("initrd /images/" + _imageProfile.BootImage + newLineChar); grub.Append("}" + newLineChar); var list = new List <Tuple <string, string, string> > { Tuple.Create("bios", "", sysLinux.ToString()), Tuple.Create("bios", ".ipxe", ipxe.ToString()), Tuple.Create("efi32", "", sysLinux.ToString()), Tuple.Create("efi32", ".ipxe", ipxe.ToString()), Tuple.Create("efi64", "", sysLinux.ToString()), Tuple.Create("efi64", ".ipxe", ipxe.ToString()), Tuple.Create("efi64", ".cfg", grub.ToString()) }; //In proxy mode all boot files are created regardless of the pxe mode, this way computers can be customized //to use a specific boot file without affecting all others, using the proxydhcp reservations file. if (SettingServices.GetSettingValue(SettingStrings.ProxyDhcp) == "Yes") { if (SettingServices.ServerIsNotClustered) { foreach (var bootMenu in list) { var path = SettingServices.GetSettingValue(SettingStrings.TftpPath) + "proxy" + Path.DirectorySeparatorChar + bootMenu.Item1 + Path.DirectorySeparatorChar + "pxelinux.cfg" + Path.DirectorySeparatorChar + pxeComputerMac + bootMenu.Item2; if (!new FileOpsServices().WritePath(path, bootMenu.Item3)) { return(false); } } } else { var clusterGroup = new ComputerServices().GetClusterGroup(_computer.Id); var tftpServers = _clusterGroupServices.GetClusterTftpServers(clusterGroup.Id); // patch by Diederick Niehorster! See comment below. Ask Diederick if (tftpServers.Count == 0) { // no tftp server found for this cluster. I have seen that happen when using a // fake cluster where both members are different NICs on the same computer. That // means no secondary server can be defined for the cluster, which messes up // defining tftp role for for the cluster group (foreign key constraint failure // because there is no secondary server). Then we get count=0 here. Fall back to // seeing if the server we're on has tftp role defined in its cluster server role // and if so, use it if (SettingServices.GetSettingValue(SettingStrings.TftpServerRole).Equals("1")) { var fakeServer = new ClusterGroupServerEntity(); fakeServer.ServerId = -1; // only thing that needs to be set tftpServers.Add(fakeServer); } } foreach (var tftpServer in tftpServers) { foreach (var bootMenu in list) { if (tftpServer.ServerId == -1) { var path = SettingServices.GetSettingValue(SettingStrings.TftpPath) + "proxy" + Path.DirectorySeparatorChar + bootMenu.Item1 + Path.DirectorySeparatorChar + "pxelinux.cfg" + Path.DirectorySeparatorChar + pxeComputerMac + bootMenu.Item2; if (!new FileOpsServices().WritePath(path, bootMenu.Item3)) { return(false); } } else { var secondaryServer = _secondaryServerServices.GetSecondaryServer(tftpServer.ServerId); var tftpPath = new APICall(_secondaryServerServices.GetToken(secondaryServer.Name)) .SettingApi.GetSetting("Tftp Path").Value; var path = tftpPath + "proxy" + Path.DirectorySeparatorChar + bootMenu.Item1 + Path.DirectorySeparatorChar + "pxelinux.cfg" + Path.DirectorySeparatorChar + pxeComputerMac + bootMenu.Item2; if ( !new APICall(_secondaryServerServices.GetToken(secondaryServer.Name)) .ServiceAccountApi.WriteTftpFile(new TftpFileDTO { Path = path, Contents = bootMenu.Item3 })) { return(false); } } } } } } //When not using proxy dhcp, only one boot file is created else { var mode = SettingServices.GetSettingValue(SettingStrings.PxeMode); var path = ""; if (SettingServices.ServerIsNotClustered) { path = SettingServices.GetSettingValue(SettingStrings.TftpPath) + "pxelinux.cfg" + Path.DirectorySeparatorChar + pxeComputerMac; string fileContents = null; if (mode == "pxelinux" || mode == "syslinux_32_efi" || mode == "syslinux_64_efi") { fileContents = sysLinux.ToString(); } else if (mode.Contains("ipxe")) { path += ".ipxe"; fileContents = ipxe.ToString(); } else if (mode.Contains("grub")) { path += ".cfg"; fileContents = grub.ToString(); } if (!new FileOpsServices().WritePath(path, fileContents)) { return(false); } } else { var clusterGroup = new ComputerServices().GetClusterGroup(_computer.Id); var secondaryServer = new SecondaryServerEntity(); var tftpServers = _clusterGroupServices.GetClusterTftpServers(clusterGroup.Id); // patch by Diederick Niehorster! See comment below. Ask Diederick if (tftpServers.Count == 0) { // no tftp server found for this cluster. I have seen that happen when using a // fake cluster where both members are different NICs on the same computer. That // means no secondary server can be defined for the cluster, which messes up // defining tftp role for for the cluster group (foreign key constraint failure // because there is no secondary server). Then we get count=0 here. Fall back to // seeing if the server we're on has tftp role defined in its cluster server role // and if so, use it if (SettingServices.GetSettingValue(SettingStrings.TftpServerRole).Equals("1")) { var fakeServer = new ClusterGroupServerEntity(); fakeServer.ServerId = -1; // only thing that needs to be set tftpServers.Add(fakeServer); } } foreach (var tftpServer in tftpServers) { if (tftpServer.ServerId == -1) { path = SettingServices.GetSettingValue(SettingStrings.TftpPath) + "pxelinux.cfg" + Path.DirectorySeparatorChar + pxeComputerMac; } else { secondaryServer = _secondaryServerServices.GetSecondaryServer(tftpServer.ServerId); var tftpPath = new APICall(_secondaryServerServices.GetToken(secondaryServer.Name)).SettingApi .GetSetting("Tftp Path").Value; path = tftpPath + "pxelinux.cfg" + Path.DirectorySeparatorChar + pxeComputerMac; } string fileContents = null; if (mode == "pxelinux" || mode == "syslinux_32_efi" || mode == "syslinux_64_efi") { fileContents = sysLinux.ToString(); } else if (mode.Contains("ipxe")) { path += ".ipxe"; fileContents = ipxe.ToString(); } else if (mode.Contains("grub")) { path += ".cfg"; fileContents = grub.ToString(); } if (tftpServer.ServerId == -1) { if (!new FileOpsServices().WritePath(path, fileContents)) { return(false); } } else { if ( !new APICall(_secondaryServerServices.GetToken(secondaryServer.Name)) .ServiceAccountApi.WriteTftpFile(new TftpFileDTO { Path = path, Contents = fileContents })) { return(false); } } } } } return(true); }
public bool CreatePxeBootFiles(EntityComputer computer, EntityImageProfile imageProfile) { _uow = new UnitOfWork(); const string newLineChar = "\n"; _computer = computer; _imageProfile = imageProfile; var guid = ConfigurationManager.AppSettings["ComServerUniqueId"]; _thisComServer = new ServiceClientComServer().GetServerByGuid(guid); if (_thisComServer == null) { log.Error($"Com Server With Guid {guid} Not Found"); return(false); } if (string.IsNullOrEmpty(_thisComServer.TftpPath)) { log.Error($"Com Server With Guid {guid} Does Not Have A Valid Tftp Path"); return(false); } var webRequiresLogin = ServiceSetting.GetSettingValue(SettingStrings.WebTasksRequireLogin); var globalToken = ServiceSetting.GetSettingValue(SettingStrings.GlobalImagingToken); if (webRequiresLogin.Equals("False")) { _userToken = globalToken; } else { _userToken = ""; } var listOfMacs = new List <string>(); if (!string.IsNullOrEmpty(_computer.ImagingMac)) { log.Debug("Computer Task PXE Mac: " + _computer.ImagingMac); listOfMacs.Add(StringManipulationServices.MacToPxeMac(_computer.ImagingMac)); } else { var computerMacs = _uow.NicInventoryRepository.Get(x => x.ComputerId == computer.Id && x.Type.Equals("Ethernet")).Select(x => x.Mac).ToList(); foreach (var mac in computerMacs) { listOfMacs.Add(StringManipulationServices.MacToPxeMac(mac)); } } var imageComServers = new Workflows.GetCompImagingServers().Run(computer.Id); if (imageComServers == null) { log.Error("Could Not Determine Imaging Com Servers For Computer: " + computer.Name); return(false); } if (imageComServers.Count == 0) { log.Error("Could Not Determine Imaging Com Servers For Computer: " + computer.Name); return(false); } var webPath = "\""; foreach (var imageServer in imageComServers) { webPath += imageServer.Url + "clientimaging/ "; //adds a space delimiter } webPath = webPath.Trim(' '); webPath += "\""; var globalComputerArgs = ServiceSetting.GetSettingValue(SettingStrings.GlobalImagingArguments); var compTftpServers = new Workflows.GetCompTftpServers().Run(computer.Id); if (compTftpServers == null) { log.Error("Could Not Determine Tftp Com Servers For Computer: " + computer.Name); return(false); } if (compTftpServers.Count == 0) { log.Error("Could Not Determine Tftp Com Servers For Computer: " + computer.Name); return(false); } var iPxePath = _thisComServer.Url; if (iPxePath.Contains("https://")) { if (ServiceSetting.GetSettingValue(SettingStrings.IpxeSSL).Equals("False")) { iPxePath = iPxePath.ToLower().Replace("https://", "http://"); var currentPort = iPxePath.Split(':').Last(); iPxePath = iPxePath.Replace(currentPort, ServiceSetting.GetSettingValue(SettingStrings.IpxeHttpPort)) + "/clientimaging/"; } else { iPxePath += "clientimaging/"; } } else { iPxePath += "clientimaging/"; } var ipxe = new StringBuilder(); ipxe.Append("#!ipxe" + newLineChar); ipxe.Append("kernel " + iPxePath + "IpxeBoot?filename=" + _imageProfile.Kernel + "&type=kernel" + " initrd=" + _imageProfile.BootImage + " root=/dev/ram0 rw ramdisk_size=156000" + " consoleblank=0" + " web=" + webPath + " USER_TOKEN=" + _userToken + " " + globalComputerArgs + " " + _imageProfile.KernelArguments + newLineChar); ipxe.Append("imgfetch --name " + _imageProfile.BootImage + " " + iPxePath + "IpxeBoot?filename=" + _imageProfile.BootImage + "&type=bootimage" + newLineChar); ipxe.Append("boot" + newLineChar); var sysLinux = new StringBuilder(); sysLinux.Append("DEFAULT theopenem" + newLineChar); sysLinux.Append("LABEL theopenem" + newLineChar); sysLinux.Append("KERNEL kernels" + Path.DirectorySeparatorChar + _imageProfile.Kernel + newLineChar); sysLinux.Append("APPEND initrd=images" + Path.DirectorySeparatorChar + _imageProfile.BootImage + " root=/dev/ram0 rw ramdisk_size=156000" + " consoleblank=0" + " web=" + webPath + " USER_TOKEN=" + _userToken + " " + globalComputerArgs + " " + _imageProfile.KernelArguments + newLineChar); var grub = new StringBuilder(); grub.Append("set default=0" + newLineChar); grub.Append("set timeout=0" + newLineChar); grub.Append("menuentry Theopenem --unrestricted {" + newLineChar); grub.Append("echo Please Wait While The Boot Image Is Transferred. This May Take A Few Minutes." + newLineChar); grub.Append("linux /kernels/" + _imageProfile.Kernel + " root=/dev/ram0 rw ramdisk_size=156000" + " consoleblank=0" + " web=" + webPath + " USER_TOKEN=" + _userToken + " " + globalComputerArgs + " " + _imageProfile.KernelArguments + newLineChar); grub.Append("initrd /images/" + _imageProfile.BootImage + newLineChar); grub.Append("}" + newLineChar); var list = new List <Tuple <string, string, string> > { Tuple.Create("bios", "", sysLinux.ToString()), Tuple.Create("bios", ".ipxe", ipxe.ToString()), Tuple.Create("efi32", "", sysLinux.ToString()), Tuple.Create("efi32", ".ipxe", ipxe.ToString()), Tuple.Create("efi64", "", sysLinux.ToString()), Tuple.Create("efi64", ".ipxe", ipxe.ToString()), Tuple.Create("efi64", ".cfg", grub.ToString()) }; //In proxy mode all boot files are created regardless of the pxe mode, this way computers can be customized //to use a specific boot file without affecting all others, using the proxydhcp reservations file. if (ServiceSetting.GetSettingValue(SettingStrings.ProxyDhcpEnabled) == "Yes") { foreach (var mac in listOfMacs) { foreach (var bootMenu in list) { var path = _thisComServer.TftpPath + "proxy" + Path.DirectorySeparatorChar + bootMenu.Item1 + Path.DirectorySeparatorChar + "pxelinux.cfg" + Path.DirectorySeparatorChar + mac + bootMenu.Item2; if (!new FilesystemServices().WritePath(path, bootMenu.Item3)) { return(false); } } } } //When not using proxy dhcp, only one boot file is created else { var mode = ServiceSetting.GetSettingValue(SettingStrings.PxeBootloader); foreach (var mac in listOfMacs) { var path = ""; path = _thisComServer.TftpPath + "pxelinux.cfg" + Path.DirectorySeparatorChar + mac; string fileContents = null; if (mode == "pxelinux" || mode == "syslinux_32_efi" || mode == "syslinux_64_efi") { fileContents = sysLinux.ToString(); } else if (mode.Contains("ipxe")) { path += ".ipxe"; fileContents = ipxe.ToString(); } else if (mode.Contains("grub")) { path += ".cfg"; fileContents = grub.ToString(); } if (!new FilesystemServices().WritePath(path, fileContents)) { return(false); } } } return(true); }