def do_image_hd(hd, fslabel, target, grub_version, grub_fw_type=None): # pylint: disable=too-many-arguments # pylint: disable=too-many-locals # pylint: disable=too-many-branches sector_size = 512 s = size_to_int(hd.text("size")) size_in_sectors = s // sector_size imagename = os.path.join(target, hd.text("name")) do('rm -f "%s"' % imagename, allow_fail=True) f = open(imagename, "wb") f.truncate(size_in_sectors * sector_size) f.close() imag = parted.Device(imagename) if hd.tag == "gpthd": disk = parted.freshDisk(imag, "gpt") else: disk = parted.freshDisk(imag, "msdos") if grub_version == 202: grub = grubinstaller202(grub_fw_type) elif grub_version == 97: grub = grubinstaller97(grub_fw_type) else: grub = grubinstaller_base() current_sector = size_to_int( hd.text("first_partition_sector", default="2048")) for part in hd: if part.tag == "partition": ppart = create_partition(disk, part, parted.PARTITION_NORMAL, fslabel, size_in_sectors, current_sector) if part.text("label") in fslabel: create_label(disk, part, ppart, fslabel, target, grub) elif part.tag == "extended": ppart = create_partition(disk, part, parted.PARTITION_EXTENDED, fslabel, size_in_sectors, current_sector) create_logical_partitions(disk, part, ppart, fslabel, target, grub) else: continue current_sector += ppart.getLength() disk.commit() if hd.has("grub-install") and grub_version: grub.install(target) return hd.text("name")
def create_partition(disk, part, ptype, fslabel, size_in_sectors, current_sector): # pylint: disable=too-many-arguments sector_size = 512 if part.text("size") == "remain" and disk.type == "gpt": sz = size_in_sectors - 35 - current_sector elif part.text("size") == "remain": sz = size_in_sectors - current_sector else: sz = size_to_int(part.text("size")) / sector_size g = parted.Geometry(device=disk.device, start=current_sector, length=sz) if ptype != parted.PARTITION_EXTENDED and \ part.text("label") in fslabel and \ fslabel[part.text("label")].fstype == "vfat": fs = simple_fstype("fat32") ppart = parted.Partition(disk, ptype, fs, geometry=g) if disk.type != "gpt": ppart.setFlag(_ped.PARTITION_LBA) else: ppart = parted.Partition(disk, ptype, geometry=g) cons = parted.Constraint(exactGeom=g) disk.addPartition(ppart, cons) if part.has("bootable"): ppart.setFlag(_ped.PARTITION_BOOT) if part.has("biosgrub"): ppart.setFlag(_ped.PARTITION_BIOS_GRUB) return ppart
def build_cdroms(self, build_bin=True, build_sources=False, cdrom_size=None): self.repo_images = [] env = None sysrootstr = "" if os.path.exists(self.sysrootpath): sysrootstr = "(including sysroot packages)" env = BuildEnv(self.xml, self.sysrootpath, build_sources=build_sources, clean=False) else: env = BuildEnv(self.xml, self.chrootpath, build_sources=build_sources, clean=False) # ensure the /etc/apt/sources.list is created according to # buil_sources, # build_bin flag, ensure to reopen it with # the new 'sources.list' with env: env.seed_etc() self.drop_rpcaptcache(env=env) with env: init_codename = self.xml.get_initvm_codename() if build_bin: validation.info("Binary CD %s", sysrootstr) self.repo_images += mk_binary_cdrom(env.rfs, self.arch, self.codename, init_codename, self.xml, self.builddir) if build_sources: if not cdrom_size and self.xml.has("src-cdrom/size"): cdrom_size = size_to_int(self.xml.text("src-cdrom/size")) validation.info("Source CD %s", sysrootstr) try: self.repo_images += mk_source_cdrom(env.rfs, self.arch, self.codename, init_codename, self.builddir, cdrom_size=cdrom_size, xml=self.xml) except SystemError as e: # e.g. no deb-src urls specified validation.error(str(e))
def create_partition( disk, part, ptype, fslabel, size_in_sectors, current_sector): # pylint: disable=too-many-arguments sector_size = 512 if part.text("size") == "remain" and disk.type == "gpt": sz = size_in_sectors - 35 - current_sector elif part.text("size") == "remain": sz = size_in_sectors - current_sector else: sz = size_to_int(part.text("size")) / sector_size g = parted.Geometry(device=disk.device, start=current_sector, length=sz) if ptype != parted.PARTITION_EXTENDED and \ part.text("label") in fslabel and \ fslabel[part.text("label")].fstype == "vfat": fs = simple_fstype("fat32") ppart = parted.Partition(disk, ptype, fs, geometry=g) if disk.type != "gpt": ppart.setFlag(_ped.PARTITION_LBA) else: ppart = parted.Partition(disk, ptype, geometry=g) cons = parted.Constraint(exactGeom=g) disk.addPartition(ppart, cons) if part.has("bootable"): ppart.setFlag(_ped.PARTITION_BOOT) if part.has("biosgrub"): ppart.setFlag(_ped.PARTITION_BIOS_GRUB) return ppart
def build_cdroms(self, build_bin=True, build_sources=False, cdrom_size=None, tgt_pkg_lst=None): # pylint: disable=too-many-branches # pylint: disable=too-many-locals self.repo_images = [] env = None sysrootstr = "" if os.path.exists(self.sysrootpath): sysrootstr = "(including sysroot packages)" env = BuildEnv(self.xml, self.sysrootpath, build_sources=build_sources, clean=False) else: env = BuildEnv(self.xml, self.chrootpath, build_sources=build_sources, clean=False) # ensure the /etc/apt/sources.list is created according to # buil_sources, # build_bin flag, ensure to reopen it with # the new 'sources.list' with env: env.seed_etc() self.drop_rpcaptcache(env=env) with env: init_codename = self.xml.get_initvm_codename() if build_bin: validation.info("Binary CD %s", sysrootstr) self.repo_images += mk_binary_cdrom(env.rfs, self.arch, self.codename, init_codename, self.xml, self.builddir) if build_sources: if not cdrom_size and self.xml.has("src-cdrom/size"): cdrom_size = size_to_int(self.xml.text("src-cdrom/size")) validation.info("Source CD %s", sysrootstr) # Target component cache = self.get_rpcaptcache(env=self.buildenv) tgt_lst = cache.get_corresponding_source_packages( pkg_lst=tgt_pkg_lst) components = {"target": (self.targetfs, cache, tgt_lst)} # Main component main_lst = [] if self.xml is not None: tmp_lst = [] for pkg_node in self.xml.node("debootstrappkgs"): pkg = XMLPackage(pkg_node, self.arch) tmp_lst.append(pkg.name) main_lst = cache.get_corresponding_source_packages( pkg_lst=tmp_lst) components["main"] = (env.rfs, cache, main_lst) # Added component other_components = [(env, "added")] # Let's build a list of (build_env, name) for the # other RFS if they exist host_sysroot_path = os.path.join(self.sdkpath, "sysroots", "host") for path, name in [(self.chrootpath, "chroot"), (host_sysroot_path, "sysroot-host")]: if os.path.exists(path) and env.path != path: tmp_env = BuildEnv(self.xml, path) with tmp_env: tmp_env.seed_etc() other_components.append((tmp_env, name)) # Now let's generate the correct (rfs, cache, pkg_lst) # components using the full installed packages for build_env, name in other_components: cache = self.get_rpcaptcache(env=build_env) src_lst = cache.get_corresponding_source_packages() components[name] = (build_env.rfs, cache, src_lst) try: # Using kwargs here allows us to avoid making # special case for when self.xml is None kwargs = {"cdrom_size": cdrom_size, "xml": self.xml} if self.xml is not None: kwargs["mirror"] = self.xml.get_primary_mirror( env.rfs.fname("cdrom")) self.repo_images += mk_source_cdrom( components, self.codename, init_codename, self.builddir, **kwargs) except SystemError as e: # e.g. no deb-src urls specified validation.error(str(e))
def build_image_mtd(mtd, target): # pylint: disable=too-many-branches img_files = [] if not mtd.has("ubivg"): return img_files ubivg = mtd.node("ubivg") cfgfilename = "%s_%s.cfg" % (mtd.text("name"), mtd.node("ubivg").text("label")) fp = open(os.path.join(target, cfgfilename), "w") for vol in mtd.node("ubivg"): if vol.has("label"): fp.write("[%s]\n" % vol.text("label")) fp.write("mode=ubi\n") if not vol.has("empty"): if vol.has("binary"): tmp = "" # copy from buildenv if path starts with / if vol.text("binary")[0] == '/': tmp = target + "/" + "chroot" + vol.text("binary") # copy from project directory else: tmp = target + "/" + vol.text("binary") do("cp %s %s/%s.ubibin" % (tmp, target, vol.text("label"))) img_files.append(vol.text("label") + ".ubibin") fp.write("image=%s.ubibin\n" % os.path.join(target, vol.text("label"))) else: fp.write("image=%s.ubifs\n" % os.path.join(target, vol.text("label"))) else: empt = open("/tmp/empty", "w") empt.write("EMPTY") empt.close() fp.write("image=/tmp/empty\n") fp.write("vol_type=%s\n" % vol.text("type")) fp.write("vol_id=%s\n" % vol.text("id")) fp.write("vol_name=%s\n" % vol.text("label")) if vol.text("size") != "remain": fp.write("vol_size=%d\n" % size_to_int(vol.text("size"))) else: fp.write("vol_flags=autoresize\n") fp.close() if ubivg.has("subpagesize"): subp = "-s " + ubivg.text("subpagesize") else: subp = "" try: do("ubinize %s -o %s -p %s -m %s %s/%s_%s.cfg" % (subp, os.path.join(target, mtd.text("name")), ubivg.text("physicaleraseblocksize"), ubivg.text("miniosize"), target, mtd.text("name"), ubivg.text("label"))) # only add file to list if ubinize command was successful img_files.append(mtd.text("name")) except CommandError: # continue with generating further images pass return img_files
def build_image_mtd(outf, mtd, target): # pylint: disable=too-many-branches img_files = [] if not mtd.has("ubivg"): return img_files ubivg = mtd.node("ubivg") cfgfilename = "%s_%s.cfg" % ( mtd.text("name"), mtd.node("ubivg").text("label")) fp = open(os.path.join(target, cfgfilename), "w") for vol in mtd.node("ubivg"): if vol.has("label"): fp.write("[%s]\n" % vol.text("label")) fp.write("mode=ubi\n") if not vol.has("empty"): if vol.has("binary"): tmp = "" # copy from buildenv if path starts with / if vol.text("binary")[0] == '/': tmp = target + "/" + "chroot" + vol.text("binary") # copy from project directory else: tmp = target + "/" + vol.text("binary") outf.do( "cp %s %s/%s.ubibin" % (tmp, target, vol.text("label"))) img_files.append(vol.text("label") + ".ubibin") fp.write( "image=%s.ubibin\n" % os.path.join( target, vol.text("label"))) else: fp.write( "image=%s.ubifs\n" % os.path.join( target, vol.text("label"))) else: empt = open("/tmp/empty", "w") empt.write("EMPTY") empt.close() fp.write("image=/tmp/empty\n") fp.write("vol_type=%s\n" % vol.text("type")) fp.write("vol_id=%s\n" % vol.text("id")) fp.write("vol_name=%s\n" % vol.text("label")) if vol.text("size") != "remain": fp.write("vol_size=%d\n" % size_to_int(vol.text("size"))) else: fp.write("vol_flags=autoresize\n") fp.close() if ubivg.has("subpagesize"): subp = "-s " + ubivg.text("subpagesize") else: subp = "" try: outf.do("ubinize %s -o %s -p %s -m %s %s/%s_%s.cfg" % ( subp, os.path.join(target, mtd.text("name")), ubivg.text("physicaleraseblocksize"), ubivg.text("miniosize"), target, mtd.text("name"), ubivg.text("label"))) # only add file to list if ubinize command was successful img_files.append(mtd.text("name")) except CommandError: # continue with generating further images pass return img_files
def do_image_hd(outf, hd, fslabel, target, grub_version, grub_fw_type=None): # pylint: disable=too-many-arguments # pylint: disable=too-many-locals # pylint: disable=too-many-branches sector_size = 512 s = size_to_int(hd.text("size")) size_in_sectors = s / sector_size imagename = os.path.join(target, hd.text("name")) outf.do('rm -f "%s"' % imagename, allow_fail=True) f = open(imagename, "wb") f.truncate(size_in_sectors * sector_size) f.close() imag = parted.Device(imagename) if hd.tag == "gpthd": disk = parted.freshDisk(imag, "gpt") else: disk = parted.freshDisk(imag, "msdos") if grub_version == 199: grub = grubinstaller199(outf) elif grub_version == 202 and grub_fw_type == "efi": grub = grubinstaller202(outf, "efi") elif grub_version == 202 and grub_fw_type == "hybrid": grub = grubinstaller202(outf, "hybrid") elif grub_version == 202: grub = grubinstaller202(outf) else: grub = grubinstaller_base(outf) current_sector = 2048 for part in hd: if part.tag == "partition": ppart = create_partition( disk, part, parted.PARTITION_NORMAL, fslabel, size_in_sectors, current_sector) if part.text("label") in fslabel: create_label(outf, disk, part, ppart, fslabel, target, grub) elif part.tag == "extended": ppart = create_partition( disk, part, parted.PARTITION_EXTENDED, fslabel, size_in_sectors, current_sector) create_logical_partitions( outf, disk, part, ppart, fslabel, target, grub) else: continue current_sector += ppart.getLength() disk.commit() if hd.has("grub-install") and grub_version: grub.install(target) return hd.text("name")