diff options
Diffstat (limited to 'scripts/lib/mic/imager/fs.py')
-rw-r--r-- | scripts/lib/mic/imager/fs.py | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/scripts/lib/mic/imager/fs.py b/scripts/lib/mic/imager/fs.py new file mode 100644 index 0000000000..d53b29cb47 --- /dev/null +++ b/scripts/lib/mic/imager/fs.py @@ -0,0 +1,99 @@ +#!/usr/bin/python -tt +# +# Copyright (c) 2011 Intel, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the Free +# Software Foundation; version 2 of the License +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., 59 +# Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +import os + +from mic import msger +from mic.utils import runner, misc +from mic.utils.errors import CreatorError +from mic.utils.fs_related import find_binary_path +from mic.imager.baseimager import BaseImageCreator + +class FsImageCreator(BaseImageCreator): + def __init__(self, cfgmgr = None, pkgmgr = None): + self.zips = { + "tar.bz2" : "" + } + BaseImageCreator.__init__(self, cfgmgr, pkgmgr) + self._fstype = None + self._fsopts = None + self._include_src = False + + def package(self, destdir = "."): + + ignores = ["/dev/fd", + "/dev/stdin", + "/dev/stdout", + "/dev/stderr", + "/etc/mtab"] + + if not os.path.exists(destdir): + os.makedirs(destdir) + + if self._recording_pkgs: + self._save_recording_pkgs(destdir) + + if not self.pack_to: + fsdir = os.path.join(destdir, self.name) + + misc.check_space_pre_cp(self._instroot, destdir) + msger.info("Copying %s to %s ..." % (self._instroot, fsdir)) + runner.show(['cp', "-af", self._instroot, fsdir]) + + for exclude in ignores: + if os.path.exists(fsdir + exclude): + os.unlink(fsdir + exclude) + + self.outimage.append(fsdir) + + else: + (tar, comp) = os.path.splitext(self.pack_to) + try: + tarcreat = {'.tar': '-cf', + '.gz': '-czf', + '.bz2': '-cjf', + '.tgz': '-czf', + '.tbz': '-cjf'}[comp] + except KeyError: + raise CreatorError("Unsupported comression for this image type:" + " '%s', try '.tar', '.tar.gz', etc" % comp) + + dst = os.path.join(destdir, self.pack_to) + msger.info("Pack rootfs to %s. Please wait..." % dst) + + tar = find_binary_path('tar') + tar_cmdline = [tar, "--numeric-owner", + "--preserve-permissions", + "--preserve-order", + "--one-file-system", + "--directory", + self._instroot] + for ignore_entry in ignores: + if ignore_entry.startswith('/'): + ignore_entry = ignore_entry[1:] + + tar_cmdline.append("--exclude=%s" % (ignore_entry)) + + tar_cmdline.extend([tarcreat, dst, "."]) + + rc = runner.show(tar_cmdline) + if rc: + raise CreatorError("Failed compress image with tar.bz2. " + "Cmdline: %s" % (" ".join(tar_cmdline))) + + self.outimage.append(dst) + |