def delete(self): """ Deletes the buildroot contents. """ if os.path.exists(self.basedir): self._lock_buildroot(exclusive=True) util.orphansKill(self.make_chroot_path()) self._umount_all() self.plugins.call_hooks('umount_root') self._unlock_buildroot() util.rmtree(self.basedir, selinux=self.selinux) self.chroot_was_initialized = False self.plugins.call_hooks('postclean')
def finalize(self): """ Do the cleanup if this is the last process working with the buildroot. """ if os.path.exists(self.make_chroot_path()): try: if self.tmpdir: for d in self.tmpdir, self.make_chroot_path(self.tmpdir): if os.path.exists(d): shutil.rmtree(d) self._lock_buildroot(exclusive=True) util.orphansKill(self.make_chroot_path()) self._umount_all() self.plugins.call_hooks('postumount') except BuildRootLocked: pass finally: self._unlock_buildroot()
def run_command(options, args, config_opts, commands, buildroot, state): # TODO separate this # Fetch and prepare sources from SCM if config_opts['scm']: try: import mockbuild.scm except ImportError as e: raise mockbuild.exception.BadCmdline( "Mock SCM module not installed: %s. You should install package mock-scm." % e) scmWorker = mockbuild.scm.scmWorker(log, config_opts['scm_opts'], config_opts['macros']) with buildroot.uid_manager: scmWorker.get_sources() (options.sources, options.spec) = scmWorker.prepare_sources() if options.mode == 'init': if config_opts['clean']: commands.clean() commands.init() elif options.mode == 'clean': if len(options.scrub) == 0: commands.clean() else: commands.scrub(options.scrub) elif options.mode == 'shell': if len(args): cmd = args else: cmd = None commands.init(do_log=False) sys.exit(commands.shell(options, cmd)) elif options.mode == 'chroot': if len(args) == 0: log.critical("You must specify a command to run with --chroot") sys.exit(50) commands.init(do_log=True) commands.chroot(args, options) elif options.mode == 'installdeps': if len(args) == 0: log.critical("You must specify an SRPM file with --installdeps") sys.exit(50) util.checkSrpmHeaders(args, plainRpmOk=1) commands.init() commands.installSrpmDeps(*args) elif options.mode == 'install': if len(args) == 0: log.critical("You must specify a package list to install.") sys.exit(50) commands.init() commands.install(*args) elif options.mode == 'update': commands.init() buildroot.pkg_manager.execute('update', *args) elif options.mode == 'remove': if len(args) == 0: log.critical("You must specify a package list to remove.") sys.exit(50) commands.init() commands.remove(*args) elif options.mode == 'rebuild': if config_opts['scm']: srpm = do_buildsrpm(config_opts, commands, buildroot, options, args) if srpm: args.append(srpm) scmWorker.clean() do_rebuild(config_opts, commands, buildroot, args) elif options.mode == 'buildsrpm': do_buildsrpm(config_opts, commands, buildroot, options, args) elif options.mode == 'orphanskill': util.orphansKill(buildroot.make_chroot_path()) elif options.mode == 'copyin': commands.init() if len(args) < 2: log.critical("Must have source and destinations for copyin") sys.exit(50) dest = buildroot.make_chroot_path(args[-1]) if len(args) > 2 and not os.path.isdir(dest): log.critical("multiple source files and %s is not a directory!", dest) sys.exit(50) args = args[:-1] for src in args: if not os.path.lexists(src): log.critical("No such file or directory: %s", src) sys.exit(50) log.info("copying %s to %s", src, dest) if os.path.isdir(src): dest2 = dest if os.path.exists(dest2): path_suffix = os.path.split(src)[1] dest2 = os.path.join(dest2, path_suffix) if os.path.exists(dest2): log.critical("Destination %s already exists!", dest2) sys.exit(50) shutil.copytree(src, dest2) else: shutil.copy(src, dest) buildroot.chown_home_dir() elif options.mode == 'copyout': commands.init() with buildroot.uid_manager: if len(args) < 2: log.critical("Must have source and destinations for copyout") sys.exit(50) dest = args[-1] sources = [] for arg in args[:-1]: matches = glob.glob(buildroot.make_chroot_path(arg.replace('~', buildroot.homedir))) if not matches: log.critical("%s not found", arg) sys.exit(50) sources += matches if len(sources) > 1 and not os.path.isdir(dest): log.critical("multiple source files and %s is not a directory!", dest) sys.exit(50) for src in sources: log.info("copying %s to %s", src, dest) if os.path.isdir(src): shutil.copytree(src, dest, symlinks=True) else: if os.path.islink(src): linkto = os.readlink(src) os.symlink(linkto, dest) else: shutil.copy(src, dest) elif options.mode in ('pm-cmd', 'yum-cmd', 'dnf-cmd'): log.info('Running %s %s', buildroot.pkg_manager.command, ' '.join(args)) commands.init() buildroot.pkg_manager.execute(*args) elif options.mode == 'snapshot': if len(args) < 1: log.critical("Requires a snapshot name") sys.exit(50) buildroot.plugins.call_hooks('make_snapshot', args[0], required=True) elif options.mode == 'rollback-to': if len(args) < 1: log.critical("Requires a snapshot name") sys.exit(50) buildroot.plugins.call_hooks('rollback_to', args[0], required=True) elif options.mode == 'remove_snapshot': if len(args) < 1: log.critical("Requires a snapshot name") sys.exit(50) buildroot.plugins.call_hooks('remove_snapshot', args[0], required=True) elif options.mode == 'umount': buildroot.plugins.call_hooks('umount_root') elif options.mode == 'mount': buildroot.plugins.call_hooks('mount_root') buildroot.nuke_rpm_db() state.finish("run") state.alldone()
def run_command(options, args, config_opts, commands, buildroot, state): result = 0 # TODO separate this # Fetch and prepare sources from SCM if config_opts['scm']: try: from mockbuild import scm except ImportError as e: raise mockbuild.exception.BadCmdline( "Mock SCM module not installed: %s. You should install package mock-scm." % e) scmWorker = scm.scmWorker(log, config_opts, config_opts['macros']) with buildroot.uid_manager: scmWorker.get_sources() (options.sources, options.spec) = scmWorker.prepare_sources() if options.mode == 'init': if config_opts['clean']: commands.clean() commands.init() elif options.mode == 'clean': if len(options.scrub) == 0: commands.clean() else: commands.scrub(options.scrub) elif options.mode == 'chain': if len(args) == 0: log.critical("You must specify an SRPM file with --chain") return 50 commands.init(do_log=True) result = commands.chain(args, options, buildroot) elif options.mode == 'shell': if len(args): cmd = args else: cmd = None commands.init(do_log=False) return commands.shell(options, cmd) elif options.mode == 'chroot': if len(args) == 0: log.critical("You must specify a command to run with --chroot") return 50 commands.init(do_log=True) commands.chroot(args, options) elif options.mode == 'installdeps': if len(args) == 0: log.critical("You must specify an SRPM file with --installdeps") return 50 commands.init() rpms = [] for file in args: if os.path.splitext(file)[1] == ".spec": commands.installSpecDeps(file) else: rpms.append(file) if rpms: util.checkSrpmHeaders(rpms, plainRpmOk=1) commands.installSrpmDeps(*rpms) elif options.mode == 'install': if len(args) == 0: log.critical("You must specify a package list to install.") return 50 commands.init() commands.install(*args) elif options.mode == 'update': commands.init() buildroot.pkg_manager.execute('update', *args) elif options.mode == 'remove': if len(args) == 0: log.critical("You must specify a package list to remove.") return 50 commands.init() commands.remove(*args) elif options.mode == 'rebuild': if config_opts['scm'] or (options.spec and options.sources): srpm = mockbuild.rebuild.do_buildsrpm(config_opts, commands, buildroot, options, args) if srpm: args.append(srpm) if config_opts['scm']: scmWorker.clean() options.spec = None options.sources = None else: config_opts['clean'] = False mockbuild.rebuild.do_rebuild(config_opts, commands, buildroot, options, args) elif options.mode == 'buildsrpm': mockbuild.rebuild.do_buildsrpm(config_opts, commands, buildroot, options, args) elif options.mode == 'debugconfig': do_debugconfig(config_opts) elif options.mode == 'orphanskill': util.orphansKill(buildroot.make_chroot_path()) elif options.mode == 'copyin': commands.init() if len(args) < 2: log.critical("Must have source and destinations for copyin") return 50 dest = buildroot.make_chroot_path(args[-1]) if len(args) > 2 and not os.path.isdir(dest): log.critical("multiple source files and %s is not a directory!", dest) return 50 args = args[:-1] for src in args: if not os.path.lexists(src): log.critical("No such file or directory: %s", src) return 50 log.info("copying %s to %s", src, dest) if os.path.isdir(src): dest2 = dest if os.path.exists(dest2): path_suffix = os.path.split(src)[1] dest2 = os.path.join(dest2, path_suffix) if os.path.exists(dest2): log.critical("Destination %s already exists!", dest2) return 50 shutil.copytree(src, dest2) else: shutil.copy(src, dest) buildroot.chown_home_dir() elif options.mode == 'copyout': commands.init() with buildroot.uid_manager: if len(args) < 2: log.critical("Must have source and destinations for copyout") return 50 dest = args[-1] sources = [] for arg in args[:-1]: matches = glob.glob( buildroot.make_chroot_path( arg.replace('~', buildroot.homedir))) if not matches: log.critical("%s not found", arg) return 50 sources += matches if len(sources) > 1 and not os.path.isdir(dest): log.critical( "multiple source files and %s is not a directory!", dest) return 50 for src in sources: log.info("copying %s to %s", src, dest) if os.path.isdir(src): shutil.copytree(src, dest, symlinks=True) else: if os.path.islink(src): linkto = os.readlink(src) os.symlink(linkto, dest) else: shutil.copy(src, dest) elif options.mode in ('pm-cmd', 'yum-cmd', 'dnf-cmd'): log.info('Running %s %s', buildroot.pkg_manager.command, ' '.join(args)) commands.init() buildroot.pkg_manager.execute(*args) elif options.mode == 'snapshot': if len(args) < 1: log.critical("Requires a snapshot name") return 50 buildroot.plugins.call_hooks('make_snapshot', args[0], required=True) if buildroot.bootstrap_buildroot is not None: buildroot.bootstrap_buildroot.plugins.call_hooks('make_snapshot', args[0], required=True) elif options.mode == 'rollback-to': if len(args) < 1: log.critical("Requires a snapshot name") return 50 buildroot.plugins.call_hooks('rollback_to', args[0], required=True) if buildroot.bootstrap_buildroot is not None: buildroot.bootstrap_buildroot.plugins.call_hooks('rollback_to', args[0], required=True) elif options.mode == 'remove_snapshot': if len(args) < 1: log.critical("Requires a snapshot name") return 50 buildroot.plugins.call_hooks('remove_snapshot', args[0], required=True) if buildroot.bootstrap_buildroot is not None: buildroot.bootstrap_buildroot.plugins.call_hooks('remove_snapshot', args[0], required=True) elif options.mode == 'umount': buildroot.plugins.call_hooks('umount_root') if buildroot.bootstrap_buildroot is not None: buildroot.bootstrap_buildroot.plugins.call_hooks('umount_root') elif options.mode == 'mount': buildroot.plugins.call_hooks('mount_root') if buildroot.bootstrap_buildroot is not None: buildroot.bootstrap_buildroot.plugins.call_hooks('mount_root') buildroot.nuke_rpm_db() state.finish("run") state.alldone() return result
def handle_signals(buildroot, number, frame): log.info("\nReceived signal {} activating orphansKill".format( signal_names[number])) util.orphansKill(buildroot.make_chroot_path()) sys.exit(128 + number)
def run_command(options, args, config_opts, commands, buildroot, state): #TODO separate this # Fetch and prepare sources from SCM if config_opts['scm']: scmWorker = mockbuild.scm.scmWorker(log, config_opts['scm_opts'], config_opts['macros']) buildroot.uid_manager.dropPrivsTemp() scmWorker.get_sources() buildroot.uid_manager.restorePrivs() (options.sources, options.spec) = scmWorker.prepare_sources() # security cleanup (don't need/want this in the chroot) if 'SSH_AUTH_SOCK' in os.environ: del os.environ['SSH_AUTH_SOCK'] if options.mode == 'init': if config_opts['clean']: commands.clean() commands.init() elif options.mode == 'clean': if len(options.scrub) == 0: commands.clean() else: commands.scrub(options.scrub) elif options.mode == 'shell': if len(args): cmd = args else: cmd = None commands.init(do_log=False) sys.exit(commands.shell(options, cmd)) elif options.mode == 'chroot': if len(args) == 0: log.critical("You must specify a command to run with --chroot") sys.exit(50) commands.init(do_log=True) commands.chroot(args, options) elif options.mode == 'installdeps': if len(args) == 0: log.critical("You must specify an SRPM file with --installdeps") sys.exit(50) util.checkSrpmHeaders(args, plainRpmOk=1) commands.init() commands.installSrpmDeps(*args) elif options.mode == 'install': if len(args) == 0: log.critical("You must specify a package list to install.") sys.exit(50) commands.init() commands.install(*args) elif options.mode == 'update': commands.init() buildroot.pkg_manager.execute('update', *args) elif options.mode == 'remove': if len(args) == 0: log.critical("You must specify a package list to remove.") sys.exit(50) commands.init() commands.remove(*args) elif options.mode == 'rebuild': if config_opts['scm']: srpm = do_buildsrpm(config_opts, commands, buildroot, options, args) if srpm: args.append(srpm) scmWorker.clean() do_rebuild(config_opts, commands, buildroot, args) elif options.mode == 'buildsrpm': do_buildsrpm(config_opts, commands, buildroot, options, args) elif options.mode == 'orphanskill': util.orphansKill(buildroot.make_chroot_path()) elif options.mode == 'copyin': commands.init() if len(args) < 2: log.critical("Must have source and destinations for copyin") sys.exit(50) dest = buildroot.make_chroot_path(args[-1]) if len(args) > 2 and not os.path.isdir(dest): log.critical("multiple source files and %s is not a directory!" % dest) sys.exit(50) args = args[:-1] for src in args: if not os.path.lexists(src): log.critical("No such file or directory: {0}".format(src)) sys.exit(50) log.info("copying %s to %s" % (src, dest)) if os.path.isdir(src): if os.path.exists(dest): path_suffix = os.path.split(src)[1] dest = os.path.join(dest, path_suffix) if os.path.exists(dest): log.critical( "Destination %{0} already exist!".format(dest)) sys.exit(50) shutil.copytree(src, dest) else: shutil.copy(src, dest) buildroot.chown_home_dir() elif options.mode == 'copyout': commands.init() buildroot.uid_manager.dropPrivsTemp() try: if len(args) < 2: log.critical("Must have source and destinations for copyout") sys.exit(50) dest = args[-1] sources = [] for arg in args[:-1]: matches = glob.glob( buildroot.make_chroot_path( arg.replace('~', buildroot.homedir))) if not matches: log.critical("%s not found" % arg) sys.exit(50) sources += matches if len(sources) > 1 and not os.path.isdir(dest): log.critical( "multiple source files and %s is not a directory!" % dest) sys.exit(50) for src in sources: log.info("copying %s to %s" % (src, dest)) if os.path.isdir(src): shutil.copytree(src, dest, symlinks=True) else: if os.path.islink(src): linkto = os.readlink(src) os.symlink(linkto, dest) else: shutil.copy(src, dest) finally: buildroot.uid_manager.restorePrivs() elif options.mode in ('pm-cmd', 'yum-cmd', 'dnf-cmd'): log.info('Running {0} {1}'.format(buildroot.pkg_manager.command, ' '.join(args))) commands.init() buildroot.pkg_manager.execute(*args) elif options.mode == 'snapshot': if len(args) < 1: log.critical("Requires a snapshot name") sys.exit(50) buildroot.plugins.call_hooks('make_snapshot', args[0], required=True) elif options.mode == 'rollback-to': if len(args) < 1: log.critical("Requires a snapshot name") sys.exit(50) buildroot.plugins.call_hooks('rollback_to', args[0], required=True) elif options.mode == 'remove_snapshot': if len(args) < 1: log.critical("Requires a snapshot name") sys.exit(50) buildroot.plugins.call_hooks('remove_snapshot', args[0], required=True) elif options.mode == 'umount': buildroot.plugins.call_hooks('umount_root') elif options.mode == 'mount': buildroot.plugins.call_hooks('mount_root') buildroot._nuke_rpm_db() state.finish("run") state.alldone() buildroot.finalize()
def run_command(options, args, config_opts, commands, buildroot, state): #TODO separate this # Fetch and prepare sources from SCM if config_opts['scm']: scmWorker = mockbuild.scm.scmWorker(log, config_opts['scm_opts'], config_opts['macros']) scmWorker.get_sources() (options.sources, options.spec) = scmWorker.prepare_sources() if options.mode == 'init': if config_opts['clean']: commands.clean() commands.init() elif options.mode == 'clean': if len(options.scrub) == 0: commands.clean() else: commands.scrub(options.scrub) elif options.mode == 'shell': if len(args): cmd = ' '.join(args) else: cmd = None commands.init(do_log=False) sys.exit(commands.shell(options, cmd)) elif options.mode == 'chroot': if not os.path.exists(buildroot.make_chroot_path()): raise mockbuild.exception.ChrootNotInitialized("chroot %s not initialized!" % buildroot.make_chroot_path()) if len(args) == 0: log.critical("You must specify a command to run with --chroot") sys.exit(50) commands.init(do_log=False) commands.chroot(args, options) elif options.mode == 'installdeps': if len(args) == 0: log.critical("You must specify an SRPM file with --installdeps") sys.exit(50) util.checkSrpmHeaders(args, plainRpmOk=1) commands.init() commands.installSrpmDeps(*args) elif options.mode == 'install': if len(args) == 0: log.critical("You must specify a package list to install.") sys.exit(50) commands.init() commands.install(*args) elif options.mode == 'update': commands.init() commands.update() elif options.mode == 'remove': if len(args) == 0: log.critical("You must specify a package list to remove.") sys.exit(50) commands.init() commands.remove(*args) elif options.mode == 'rebuild': if config_opts['scm']: srpm = do_buildsrpm(config_opts, commands, buildroot, options, args) if srpm: args.append(srpm) scmWorker.clean() do_rebuild(config_opts, commands, buildroot, args) elif options.mode == 'buildsrpm': do_buildsrpm(config_opts, commands, buildroot, options, args) elif options.mode == 'orphanskill': util.orphansKill(buildroot.make_chroot_path()) elif options.mode == 'copyin': commands.init() #uidManager.dropPrivsForever() if len(args) < 2: log.critical("Must have source and destinations for copyin") sys.exit(50) dest = buildroot.make_chroot_path(args[-1]) if len(args) > 2 and not os.path.isdir(dest): log.critical("multiple source files and %s is not a directory!" % dest) sys.exit(50) args = args[:-1] import shutil for src in args: log.info("copying %s to %s" % (src, dest)) if os.path.isdir(src): shutil.copytree(src, dest) else: shutil.copy(src, dest) elif options.mode == 'copyout': commands.init() buildroot.uid_manager.dropPrivsTemp() if len(args) < 2: log.critical("Must have source and destinations for copyout") sys.exit(50) dest = args[-1] if len(args) > 2 and not os.path.isdir(dest): log.critical("multiple source files and %s is not a directory!" % dest) sys.exit(50) args = args[:-1] import shutil for f in args: src = buildroot.make_chroot_path(f) log.info("copying %s to %s" % (src, dest)) if os.path.isdir(src): shutil.copytree(src, dest, symlinks=True) else: if os.path.islink(src): linkto = os.readlink(src) os.symlink(linkto, dst) else: shutil.copy(src, dest) buildroot.uid_manager.restorePrivs() elif options.mode in ('pm-cmd', 'yum-cmd', 'dnf-cmd'): log.info('Running {0} {1}'.format(buildroot.pkg_manager.command, ' '.join(args))) commands.init() buildroot.pkg_manager.execute(*args) elif options.mode == 'snapshot': if len(args) < 1: log.critical("Requires a snapshot name") sys.exit(50) buildroot.plugins.call_hooks('make_snapshot', args[0], required=True) elif options.mode == 'rollback-to': if len(args) < 1: log.critical("Requires a snapshot name") sys.exit(50) buildroot.plugins.call_hooks('rollback_to', args[0], required=True) elif options.mode == 'remove_snapshot': if len(args) < 1: log.critical("Requires a snapshot name") sys.exit(50) buildroot.plugins.call_hooks('remove_snapshot', args[0], required=True) elif options.mode == 'umount': buildroot.plugins.call_hooks('umount_root') buildroot._nuke_rpm_db() state.finish("run") state.alldone() buildroot.finalize()