def compose_bcd(self, kernel_params, local_host): """Composes the Windows boot configuration data. :param kernel_params: An instance of `KernelParameters`. :return: Binary data """ preseed_url = self.compose_preseed_url(kernel_params.preseed_url) release_path = "%s\\source" % kernel_params.release remote_path = "\\\\%s\\reminst" % local_host loadoptions = "%s;%s;%s" % \ (remote_path, release_path, preseed_url) # Generate the bcd file. bcd_template = self.get_resource_path(kernel_params, "bcd") if not os.path.isfile(bcd_template): raise BootMethodError("Failed to find bcd template: %s" % bcd_template) with tempdir() as tmp: bcd_tmp = os.path.join(tmp, "bcd") shutil.copyfile(bcd_template, bcd_tmp) bcd = Bcd(bcd_tmp) bcd.set_load_options(loadoptions) with open(bcd_tmp, 'rb') as stream: return BytesReader(stream.read())
def match_path(self, backend, path): """Checks path to see if the boot method should handle the requested file. :param backend: requesting backend :param path: requested path :return: dict of match params from path, None if no match """ # If the node is requesting the initial bootloader, then we # need to see if this node is set to boot Windows first. local_host, local_port = tftp.get_local_address() if path in ['pxelinux.0', 'lpxelinux.0']: data = yield self.get_node_info() if data is None: returnValue(None) # Only provide the Windows bootloader when installing # PXELINUX chainloading will work for the rest of the time. purpose = data.get('purpose') if purpose != 'install': returnValue(None) osystem = data.get('osystem') if osystem == 'windows': # python-hivex is needed to continue. if get_hivex_module() is None: raise BootMethodError('python-hivex package is missing.') returnValue({ 'mac': data.get('mac'), 'path': self.bootloader_path, 'local_host': local_host, }) # Fix the paths for the other static files, Windows requests. elif path.lower() in STATIC_FILES: returnValue({ 'mac': get_remote_mac(), 'path': self.clean_path(path), 'local_host': local_host, }) returnValue(None)
def match_path(self, backend, path): """Checks path to see if the boot method should handle the requested file. :param backend: requesting backend :param path: requested path :return: dict of match params from path, None if no match """ # If the node is requesting the initial bootloader, then we # need to see if this node is set to boot Windows first. local_host, local_port = tftp.get_local_address() if path in ["pxelinux.0", "lpxelinux.0"]: data = yield self.get_node_info() if data is None: return None # Only provide the Windows bootloader when installing # PXELINUX chainloading will work for the rest of the time. purpose = data.get("purpose") if purpose != "install": return None osystem = data.get("osystem") if osystem == "windows": # python-hivex is needed to continue. if get_hivex_module() is None: raise BootMethodError("python-hivex package is missing.") return { "mac": data.get("mac"), "path": self.bootloader_path, "local_host": local_host, } # Fix the paths for the other static files, Windows requests. elif path.lower() in STATIC_FILES: return { "mac": get_remote_mac(), "path": self.clean_path(path), "local_host": local_host, }