cachedir= /var/tmp/mic/cache
outdir= ./mic-output
runtime=bootstrap
+#use_mic_in_bootstrap = yes
pkgmgr = auto
KS_SCRIPT_POST = 1
KS_SCRIPT_TRACEBACK = 2
KS_SCRIPT_RUN = 3
+KS_SCRIPT_UMOUNT = 4
KS_WAIT = 0
KS_REBOOT = 1
retval += '\n%traceback'
elif self.type == constants.KS_SCRIPT_RUN:
retval += '\n%runscript'
+ elif self.type == constants.KS_SCRIPT_UMOUNT:
+ retval += '\n%post-umount'
if self.interp != "/bin/sh" and self.interp != "":
retval += " --interpreter=%s" % self.interp
self.registerSection(PostScriptSection(self.handler, dataObj=Script))
self.registerSection(TracebackScriptSection(self.handler, dataObj=Script))
self.registerSection(RunScriptSection(self.handler, dataObj=Script))
+ self.registerSection(PostUmountScriptSection(self.handler, dataObj=Script))
self.registerSection(PackageSection(self.handler))
self.registerSection(TpkPackageSection(self.handler))
parser.registerSection with an instance of your new class.
"""
from constants import *
+from errors import *
from options import KSOptionParser
from version import *
class RunScriptSection(ScriptSection):
sectionOpen = "%runscript"
+
def _resetScript(self):
ScriptSection._resetScript(self)
self._script["type"] = KS_SCRIPT_RUN
+
+ def finalize(self):
+ ScriptSection.finalize(self)
+ if self.handler:
+ for s in self.handler.scripts:
+ if s.type == KS_SCRIPT_UMOUNT:
+ raise KickstartError("%runscript and %post-umount " \
+ "can not be defined together")
+
+class PostUmountScriptSection(ScriptSection):
+ sectionOpen = "%post-umount"
+
+ def _resetScript(self):
+ ScriptSection._resetScript(self)
+ self._script["type"] = KS_SCRIPT_UMOUNT
+
+ def finalize(self):
+ ScriptSection.finalize(self)
+ if self.handler:
+ for s in self.handler.scripts:
+ if s.type == KS_SCRIPT_RUN:
+ raise KickstartError("%runscript and %post-umount " \
+ "can not be defined together")
+
class PackageSection(Section):
sectionOpen = "%packages"
\r
msger.set_loglevel('DEBUG')\r
\r
+ if args.rpm_debug:\r
+ try:\r
+ import rpm\r
+ rpm.setVerbosity(rpm.RPMLOG_DEBUG)\r
+ except ImportError:\r
+ pass\r
+\r
#check the imager type\r
createrClass = None\r
for subcmd, klass in pluginmgr.get_plugins('imager').iteritems():\r
if args.runtime:\r
configmgr.set_runtime(args.runtime)\r
\r
+ if args.use_mic_in_bootstrap:\r
+ configmgr.create['use_mic_in_bootstrap'] = args.use_mic_in_bootstrap\r
+\r
if args.pack_to is not None:\r
configmgr.create['pack_to'] = args.pack_to\r
\r
"strict_mode": False,
"run_script": None,
"tpk_install": None,
+ "use_mic_in_bootstrap": False,
},
'chroot': {
"saveto": None,
packages = packages.split()
self.bootstrap['packages'] = packages
+ if type(self.create['use_mic_in_bootstrap']) != 'bool':
+ use_mic_in_bootstrap = str(self.create['use_mic_in_bootstrap'])
+ if use_mic_in_bootstrap.lower() in ('on', 'yes', 'true', '1'):
+ self.create['use_mic_in_bootstrap'] = True
+ else:
+ self.create['use_mic_in_bootstrap'] = False
+
def _parse_kickstart(self, ksconf=None):
if not ksconf:
return
self.create['release'],
self.create['name'])
self.create['name'] = self.create['release'] + '_' + self.create['name']
+ if self.create['pack_to'] is not None:
+ if '@NAME@' in self.create['pack_to']:
+ self.create['pack_to'] = self.create['pack_to'].replace('@NAME@', self.create['name'])
+ self.create['name'] = misc.strip_archive_suffix(self.create['pack_to'])
+ if self.create['name'] is None:
+ raise errors.CreatorError("Not supported archive file format: %s" % self.create['pack_to'])
if not self.create['logfile']:
self.create['logfile'] = os.path.join(self.create['destdir'],
self.create['releaselog'] = True
self.set_logfile()
+ elif self.create['pack_to'] is not None:
+ if '@NAME@' in self.create['pack_to']:
+ self.create['pack_to'] = self.create['pack_to'].replace('@NAME@', self.create['name'])
+ self.create['name'] = misc.strip_archive_suffix(self.create['pack_to'])
+ if self.create['name'] is None:
+ raise errors.CreatorError("Not supported archive file format: %s" % self.create['pack_to'])
+
msger.info("Retrieving repo metadata:")
ksrepos = kickstart.get_repos(ks,
self.create['extrarepos'],
import time
from mic import kickstart
from mic import msger, __version__ as VERSION
-from mic.utils.errors import CreatorError, Abort
+from mic.utils.errors import CreatorError, KsError, Abort
from mic.utils import misc, grabber, runner, fs_related as fs
from mic.chroot import kill_proc_inchroot
from mic.archive import get_archive_suffixes
self.destdir = os.path.abspath(os.path.expanduser(self.destdir))
if self.pack_to:
- if '@NAME@' in self.pack_to:
- self.pack_to = self.pack_to.replace('@NAME@', self.name)
(tar, ext) = os.path.splitext(self.pack_to)
if ext in (".gz", ".bz2", ".lzo", ".bz") and tar.endswith(".tar"):
ext = ".tar" + ext
if part.fstype and part.fstype == "btrfs":
self._dep_checks.append("mkfs.btrfs")
break
- if part.fstype == "cpio":
- part.fstype = "ext4"
+ if part.cpioopts:
+ if part.fstype == "cpio":
+ part.fstype = "ext4"
+ else:
+ raise KsError("The '--fstype' in ks file need to set 'cpio' when you want to generate image by cpio.")
if len(self.ks.handler.partition.partitions) > 1:
self.multiple_partitions = True
for pkg in self._excluded_pkgs:
pkg_manager.deselectPackage(pkg)
- def __localinst_packages(self, pkg_manager):
+ """def __localinst_packages(self, pkg_manager):
for rpm_path in self._get_local_packages():
- pkg_manager.installLocal(rpm_path)
+ pkg_manager.installLocal(rpm_path)"""
def __preinstall_packages(self, pkg_manager):
if not self.ks:
self.__select_packages(pkg_manager)
self.__select_groups(pkg_manager)
self.__deselect_packages(pkg_manager)
- self.__localinst_packages(pkg_manager)
+ #self.__localinst_packages(pkg_manager)
self.__check_packages(pkg_manager)
BOOT_SAFEGUARD = 256L * 1024 * 1024 # 256M
raise CreatorError("Tpk package missing.")
def postinstall(self):
- self.copy_attachment()
+ pass
def _get_sign_scripts_env(self):
"""Return an environment dict for %post-umount scripts.
runner.show('find . | cpio --create %s | gzip > %s' % (item['cpioopts'], tmp_cpio_imgfile))
os.chdir(oldoutdir)
except OSError, (errno, msg):
- raise errors.CreatorError("Create image by cpio error: %s" % msg)
+ raise CreatorError("Create image by cpio error: %s" % msg)
def copy_cpio_image(self):
for item in self._instloops:
try:
shutil.copyfile(os.path.join(tmp_cpio, item['name']),os.path.join(self._imgdir, item['name']))
except IOError:
- raise errors.CreatorError("Copy cpio image error")
+ raise CreatorError("Copy cpio image error")
os.remove(os.path.join(tmp_cpio, item['name']))
if not os.listdir(tmp_cpio):
shutil.rmtree(tmp_cpio, ignore_errors=True)
self._instloops = []
self._imgdir = None
+ self._umountdir = None
if self.ks:
self.__image_size = kickstart.get_image_size(self.ks,
except:
pass
+ def _get_sign_scripts_env(self):
+ env = BaseImageCreator._get_sign_scripts_env(self)
+
+ # Directory path of %post-umounts scripts
+ if self._umountdir:
+ env['UMOUNT_SCRIPTS_PATH'] = str(self._umountdir)
+
+ return env
+
def _stage_final_image(self):
if self.pack_to or self.shrink_image:
self._check_imgdir()
- msger.info("Copying attachment files...")
+ msger.info("Moving attachment files...")
for item in self._attachment:
if not os.path.exists(item):
continue
dpath = os.path.join(self._imgdir, os.path.basename(item))
- msger.verbose("Copy attachment %s to %s" % (item, dpath))
- shutil.copy(item, dpath)
+ msger.verbose("Move attachment %s to %s" % (item, dpath))
+ shutil.move(item, dpath)
+
+ def move_post_umount_scripts(self):
+ scripts_dir = self._instroot + "/var/tmp/post_umount_scripts"
+ if not os.path.exists(scripts_dir):
+ return
+ self._umountdir = self._mkdtemp("umount")
+ msger.info("Moving post umount scripts...")
+ for item in os.listdir(scripts_dir):
+ spath = os.path.join(scripts_dir, item)
+ dpath = os.path.join(self._umountdir, item)
+ msger.verbose("Move post umount scripts %s to %s" % (spath, dpath))
+ shutil.move(spath, dpath)
+ shutil.rmtree(scripts_dir)
+
+ def postinstall(self):
+ BaseImageCreator.postinstall(self)
+ self.move_post_umount_scripts()
def create_manifest(self):
if self.compress_image:
def get_sign_scripts(ks):
scripts = []
for s in ks.handler.scripts:
- if s.type != ksparser.KS_SCRIPT_RUN:
- continue
- scripts.append(s)
+ if (s.type == ksparser.KS_SCRIPT_RUN or \
+ s.type == ksparser.KS_SCRIPT_UMOUNT):
+ scripts.append(s)
return scripts
+
def add_repo(ks, repostr):
args = repostr.split()
repoobj = ks.handler.repo.parse(args[1:])
rootdir = os.path.join(rootdir, "bootstrap")
bsenv.dirsetup(rootdir)
- sync_mic(rootdir, plugin=cropts['plugin_dir'])
+ if cropts['use_mic_in_bootstrap']:
+ msger.info("No copy host mic")
+ else:
+ msger.info("Copy host mic to bootstrap")
+ sync_mic(rootdir, plugin=cropts['plugin_dir'])
#FIXME: sync the ks file to bootstrap
if "/" == os.path.dirname(os.path.abspath(configmgr._ksconf)):
xmlparse = cElementTree.parse
from mic import msger
+from mic.archive import get_archive_suffixes
from mic.utils.errors import CreatorError, SquashfsError
from mic.utils.fs_related import find_binary_path, makedirs
from mic.utils.grabber import myurlgrab
if not text.endswith(suffix):
return text
return text[:-len(suffix)]
+
+def strip_archive_suffix(filename):
+ for suffix in get_archive_suffixes():
+ if filename.endswith(suffix):
+ return filename[:-len(suffix)]
+ else:
+ msger.warning("Not supported archive file format: %s" % filename)
+ return None
import shutil
import urlparse
import rpm
+import glob
import zypp
if not hasattr(zypp, 'PoolQuery') or \
from mic.utils.grabber import myurlgrab, TextProgress
from mic.utils.proxy import get_proxy_for
from mic.utils.errors import CreatorError, RepoError, RpmError
-from mic.imager.baseimager import BaseImageCreator
+from mic.conf import configmgr
class RepositoryStub:
def __init__(self):
def checkPackage(self, pkg):
self.check_pkgs.append(pkg)
+ def _get_local_packages(self):
+ """Return a list of rpm path to be local installed.
+ This is the hook where subclasses may specify a set of rpms which
+ it requires to be installed locally.
+ This returns an empty list by default.
+ Note, subclasses should usually chain up to the base class
+ implementation of this hook.
+ """
+ cropts = configmgr.create
+ if cropts['local_pkgs_path']:
+ if os.path.isdir(cropts['local_pkgs_path']):
+ return glob.glob(
+ os.path.join(cropts['local_pkgs_path'], '*.rpm'))
+ elif os.path.splitext(cropts['local_pkgs_path'])[-1] == '.rpm':
+ return [cropts['local_pkgs_path']]
+ return []
+ def __localinst_packages(self):
+ for rpm_path in self._get_local_packages():
+ self.installLocal(rpm_path)
def runInstall(self, checksize = 0):
os.environ["HOME"] = "/"
os.environ["LD_PRELOAD"] = ""
self.buildTransaction()
+ self.__localinst_packages()
todo = zypp.GetResolvablesToInsDel(self.Z.pool())
installed_pkgs = todo._toInstall
creator.configure(creatoropts["repomd"])
creator.copy_kernel()
+ creator.copy_attachment()
creator.unmount()
creator.package(creatoropts["destdir"])
creator.create_manifest()
creator.tpkinstall()
creator.configure(creatoropts["repomd"])
creator.copy_kernel()
+ creator.copy_attachment()
creator.create_cpio_image()
creator.unmount()
creator.copy_cpio_image()
creator.tpkinstall()
creator.configure(creatoropts["repomd"])
creator.copy_kernel()
+ creator.copy_attachment()
creator.create_cpio_image()
creator.unmount()
creator.copy_cpio_image()
creator.tpkinstall()
creator.configure(creatoropts["repomd"])
creator.copy_kernel()
+ creator.copy_attachment()
creator.unmount()
creator.generate_bmap()
creator.package(creatoropts["destdir"])
dest='strict_mode', default=False,
help='Abort creation of image, if there are some errors'
' during rpm installation. ')
+ parent_parser.add_argument('--use-mic-in-bootstrap', action='store_true',
+ dest='use_mic_in_bootstrap', default=False,
+ help='This option works in bootstrap runtime mode,'
+ ' Use mic in bootstrap to create image.'
+ ' By default, copy host mic to bootstrap and use it.')
parent_parser.add_argument('-d', '--debug', action='store_true',
help='debug output')
default=None, help='Run script on local PC after image created')
parent_parser.add_argument('--tpk_install', action='store', dest='tpk_install',
default=None, help='Copy tpk file to /usr/apps/.preload-tpk')
+ parent_parser.add_argument('--rpm-debug', action='store_true', dest='rpm_debug', help='Set debug mode for rpm install')
parser.set_defaults(alias="cr")