X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=plugins%2Fimager%2Fraw_plugin.py;h=ef537a42e5edb8a3daf81e18c2261ef996528681;hb=7db9b0c91a5b26f96a86ec10dfad261a7d781f3b;hp=3bbda6984e806bc6ce84e6b35ccbfe44a1af8258;hpb=455384c51ad9d2cae1975a01b8bbb3f217514f4d;p=tools%2Fmic.git diff --git a/plugins/imager/raw_plugin.py b/plugins/imager/raw_plugin.py old mode 100644 new mode 100755 index 3bbda69..ef537a4 --- a/plugins/imager/raw_plugin.py +++ b/plugins/imager/raw_plugin.py @@ -16,11 +16,12 @@ # Temple Place - Suite 330, Boston, MA 02111-1307, USA. import os +import subprocess import shutil import re import tempfile -from mic import chroot, msger +from mic import chroot, msger, rt_util from mic.utils import misc, fs_related, errors, runner from mic.conf import configmgr from mic.plugin import pluginmgr @@ -33,24 +34,21 @@ class RawPlugin(ImagerPlugin): name = 'raw' @classmethod - def do_create(self, subcmd, opts, *args): + def do_create(self, args): """${cmd_name}: create raw image - ${cmd_usage} + Usage: + ${name} ${cmd_name} [OPTS] + ${cmd_option_list} """ - if not args: - raise errors.Usage("More arguments needed") - - if len(args) != 1: - raise errors.Usage("Extra arguments given") - creatoropts = configmgr.create - ksconf = args[0] + ksconf = args.ksfile - if not os.path.exists(ksconf): - raise errors.CreatorError("Can't find the file: %s" % ksconf) + if creatoropts['runtime'] == "bootstrap": + configmgr._ksconf = ksconf + rt_util.bootstrap_mic() recording_pkgs = [] if len(creatoropts['record_pkgs']) > 0: @@ -59,48 +57,57 @@ class RawPlugin(ImagerPlugin): if creatoropts['release'] is not None: if 'name' not in recording_pkgs: recording_pkgs.append('name') - ksconf = misc.save_ksconf_file(ksconf, creatoropts['release']) + if 'vcs' not in recording_pkgs: + recording_pkgs.append('vcs') configmgr._ksconf = ksconf - - # Called After setting the configmgr._ksconf as the creatoropts['name'] is reset there. - if creatoropts['release'] is not None: - creatoropts['outdir'] = "%s/%s/images/%s/" % (creatoropts['outdir'], creatoropts['release'], creatoropts['name']) # try to find the pkgmgr pkgmgr = None - for (key, pcls) in pluginmgr.get_plugins('backend').iteritems(): - if key == creatoropts['pkgmgr']: - pkgmgr = pcls - break + backends = pluginmgr.get_plugins('backend') + if 'auto' == creatoropts['pkgmgr']: + for key in configmgr.prefer_backends: + if key in backends: + pkgmgr = backends[key] + break + else: + for key in backends.keys(): + if key == creatoropts['pkgmgr']: + pkgmgr = backends[key] + break if not pkgmgr: - pkgmgrs = pluginmgr.get_plugins('backend').keys() - raise errors.CreatorError("Can't find package manager: %s (availables: %s)" % (creatoropts['pkgmgr'], ', '.join(pkgmgrs))) + raise errors.CreatorError("Can't find backend: %s, " + "available choices: %s" % + (creatoropts['pkgmgr'], + ','.join(backends.keys()))) - creator = raw.RawImageCreator(creatoropts, pkgmgr) + creator = raw.RawImageCreator(creatoropts, pkgmgr, args.compress_image, + args.generate_bmap, args.fstab_entry) if len(recording_pkgs) > 0: creator._recording_pkgs = recording_pkgs - if creatoropts['release'] is None: - for item in creator.get_diskinfo(): - imagefile = "%s-%s.raw" % (os.path.join(creator.destdir, creator.name), item['name']) - if os.path.exists(imagefile): - if msger.ask('The target image: %s already exists, cleanup and continue?' % imagefile): - os.unlink(imagefile) - else: - raise errors.Abort('Canceled') + images = ["%s-%s.raw" % (creator.name, disk_name) + for disk_name in creator.get_disk_names()] + self.check_image_exists(creator.destdir, + creator.pack_to, + images, + creatoropts['release']) try: creator.check_depend_tools() creator.mount(None, creatoropts["cachedir"]) creator.install() creator.configure(creatoropts["repomd"]) + creator.copy_kernel() + creator.copy_attachment() creator.unmount() - creator.package(creatoropts["outdir"]) + creator.generate_bmap() + creator.package(creatoropts["destdir"]) + creator.create_manifest() if creatoropts['release'] is not None: - creator.release_output(ksconf, creatoropts['outdir'], creatoropts['release']) + creator.release_output(ksconf, creatoropts['destdir'], creatoropts['release']) creator.print_outimage_info() except errors.CreatorError: @@ -108,23 +115,51 @@ class RawPlugin(ImagerPlugin): finally: creator.cleanup() + #Run script of --run_script after image created + if creatoropts['run_script']: + cmd = creatoropts['run_script'] + try: + runner.show(cmd) + except OSError,err: + msger.warning(str(err)) + + msger.info("Finished.") return 0 @classmethod - def do_chroot(cls, target): + def do_chroot(cls, target, cmd=[]): img = target imgsize = misc.get_file_size(img) * 1024L * 1024L partedcmd = fs_related.find_binary_path("parted") disk = fs_related.SparseLoopbackDisk(img, imgsize) imgmnt = misc.mkdtemp() - imgloop = PartitionedMount({'/dev/sdb':disk}, imgmnt, skipformat = True) + imgloop = PartitionedMount(imgmnt, skipformat = True) + imgloop.add_disk('/dev/sdb', disk) img_fstype = "ext3" + msger.info("Partition Table:") + partnum = [] + for line in runner.outs([partedcmd, "-s", img, "print"]).splitlines(): + # no use strip to keep line output here + if "Number" in line: + msger.raw(line) + if line.strip() and line.strip()[0].isdigit(): + partnum.append(line.strip()[0]) + msger.raw(line) + + rootpart = None + if len(partnum) > 1: + rootpart = msger.choice("please choose root partition", partnum) + # Check the partitions from raw disk. - root_mounted = False + # if choose root part, the mark it as mounted + if rootpart: + root_mounted = True + else: + root_mounted = False partition_mounts = 0 - for line in runner.outs([partedcmd,"-s",img,"unit","B","print"]).splitlines(): + for line in runner.outs([ partedcmd, "-s", img, "unit", "B", "print" ]).splitlines(): line = line.strip() # Lines that start with number are the partitions, @@ -136,12 +171,12 @@ class RawPlugin(ImagerPlugin): line = line.replace(",","") # Example of parted output lines that are handled: - # Number Start End Size Type File system Flags + # Number Start End Size Type File system Flags # 1 512B 3400000511B 3400000000B primary # 2 3400531968B 3656384511B 255852544B primary linux-swap(v1) - # 3 3656384512B 3720347647B 63963136B primary fat16 boot, lba + # 3 3656384512B 3720347647B 63963136B primary fat16 boot, lba - partition_info = re.split("\s+",line) + partition_info = re.split("\s+", line) size = partition_info[3].split("B")[0] @@ -151,16 +186,19 @@ class RawPlugin(ImagerPlugin): # not recognize properly. # TODO: Can we make better assumption? fstype = "btrfs" - elif partition_info[5] in ["ext2","ext3","ext4","btrfs"]: + elif partition_info[5] in [ "ext2", "ext3", "ext4", "btrfs" ]: fstype = partition_info[5] - elif partition_info[5] in ["fat16","fat32"]: + elif partition_info[5] in [ "fat16", "fat32" ]: fstype = "vfat" elif "swap" in partition_info[5]: fstype = "swap" else: - raise errors.CreatorError("Could not recognize partition fs type '%s'." % partition_info[5]) + raise errors.CreatorError("Could not recognize partition fs type '%s'." % + partition_info[5]) - if not root_mounted and fstype in ["ext2","ext3","ext4","btrfs"]: + if rootpart and rootpart == line[0]: + mountpoint = '/' + elif not root_mounted and fstype in [ "ext2", "ext3", "ext4", "btrfs" ]: # TODO: Check that this is actually the valid root partition from /etc/fstab mountpoint = "/" root_mounted = True @@ -176,9 +214,11 @@ class RawPlugin(ImagerPlugin): else: boot = False - msger.verbose("Size: %s Bytes, fstype: %s, mountpoint: %s, boot: %s" % (size, fstype, mountpoint, boot)) + msger.verbose("Size: %s Bytes, fstype: %s, mountpoint: %s, boot: %s" % + (size, fstype, mountpoint, boot)) # TODO: add_partition should take bytes as size parameter. - imgloop.add_partition((int)(size)/1024/1024, "/dev/sdb", mountpoint, fstype = fstype, boot = boot) + imgloop.add_partition((int)(size)/1024/1024, "/dev/sdb", mountpoint, + fstype = fstype, boot = boot) try: imgloop.mount() @@ -188,7 +228,14 @@ class RawPlugin(ImagerPlugin): raise try: - chroot.chroot(imgmnt, None, "/bin/env HOME=/root /bin/bash") + if len(cmd) != 0: + cmdline = ' '.join(cmd) + else: + cmdline = "/bin/bash" + envcmd = fs_related.find_binary_inchroot("env", imgmnt) + if envcmd: + cmdline = "%s HOME=/root %s" % (envcmd, cmdline) + chroot.chroot(imgmnt, None, cmdline) except: raise errors.CreatorError("Failed to chroot to %s." %img) finally: @@ -199,8 +246,9 @@ class RawPlugin(ImagerPlugin): srcimgsize = (misc.get_file_size(srcimg)) * 1024L * 1024L srcmnt = misc.mkdtemp("srcmnt") disk = fs_related.SparseLoopbackDisk(srcimg, srcimgsize) - srcloop = PartitionedMount({'/dev/sdb':disk}, srcmnt, skipformat = True) + srcloop = PartitionedMount(srcmnt, skipformat = True) + srcloop.add_disk('/dev/sdb', disk) srcloop.add_partition(srcimgsize/1024/1024, "/dev/sdb", "/", "ext3", boot=False) try: srcloop.mount()