diff options
| author | Michael E Brown <michael_e_brown@dell.com> | 2007-10-17 11:33:49 -0500 |
|---|---|---|
| committer | Michael E Brown <michael_e_brown@dell.com> | 2007-10-17 11:33:49 -0500 |
| commit | dca92953271f4ada64a172c3b91e1626e665f96d (patch) | |
| tree | 6af1e0ab37f590b33c4eee0f3c7dc4f80d15cdd1 /src | |
| parent | dfcfe855b25e56b318a964b0645bbeaa08223d79 (diff) | |
| download | mock-dca92953271f4ada64a172c3b91e1626e665f96d.tar.gz mock-dca92953271f4ada64a172c3b91e1626e665f96d.tar.xz mock-dca92953271f4ada64a172c3b91e1626e665f96d.zip | |
tracing. start init() work
Diffstat (limited to 'src')
| -rw-r--r-- | src/py-libs/backend.py | 149 |
1 files changed, 102 insertions, 47 deletions
diff --git a/src/py-libs/backend.py b/src/py-libs/backend.py index 7d2a2db..18ed77f 100644 --- a/src/py-libs/backend.py +++ b/src/py-libs/backend.py @@ -25,13 +25,18 @@ import shutil # our imports import mock.util +from mock.trace_decorator import traceLog + +# set up logging +moduleLog = logging.getLogger("mock") # classes -class Root: +class Root(object): """controls setup of chroot environment""" - def __init__(self, config): + @traceLog(moduleLog) + def __init__(self, config, uidManager): self._state = 'unstarted' - self.config = config + self.uidManager = uidManager root = config['root'] if config.has_key('unique-ext'): @@ -40,51 +45,41 @@ class Root: self.basedir = os.path.join(config['basedir'], root) self.target_arch = config['target_arch'] self.rootdir = os.path.join(self.basedir, 'root') - self.homedir = self.config['chroothome'] + self.homedir = config['chroothome'] self.builddir = os.path.join(self.homedir, 'build') - self.cache_file = os.path.join(self.config['basedir'], - self.config['cache_topdir'], self.config['root'] + self.config['cache_ext']) + self.cache_file = os.path.join(config['basedir'], + config['cache_topdir'], config['root'] + config['cache_ext']) # result dir - if not self.config.has_key('resultdir'): + if not config.has_key('resultdir'): self.resultdir = os.path.join(self.basedir, 'result') else: - self.resultdir = self.config['resultdir'] + self.resultdir = config['resultdir'] # state dir - if not self.config.has_key('statedir'): + if not config.has_key('statedir'): self.statedir = os.path.join(self.basedir, 'state') else: - self.statedir = self.config['statedir'] + self.statedir = config['statedir'] + self.root_log = logging.getLogger("mock") self.build_log = logging.getLogger("mock.Root.build") - self.root_log = logging.getLogger("mock.Root.chroot") self._state_log = logging.getLogger("mock.Root.state") + # config options + self.chrootuid = config['chrootuid'] + self.yum_conf_content = config['yum.conf'] + self.use_host_resolv = config['use_host_resolv'] + self.chroot_file_contents = config['files'] + # officially set state so it is logged self.state("unstarted") - - def _resetLogging(self): - # attach logs to log files. - # This happens in addition to anything - # is set up in the config file... ie. logs go everywhere - formatter = logging.Formatter("%(asctime)s - %(module)s:%(lineno)d - %(levelname)s - %(message)s") - for (log, filename) in ( - (self._state_log, "state.log"), - (self.build_log, "build.log"), - (self.root_log, "root.log")): - fullPath = os.path.join(self.statedir, filename) - fh = logging.FileHandler(fullPath, "w+") - fh.setFormatter(formatter) - fh.setLevel(logging.NOTSET) - log.addHandler(fh) - - # ============= # 'Public' API # ============= + @traceLog(moduleLog) def state(self, newState = None): if newState is not None: self._state = newState @@ -92,6 +87,7 @@ class Root: return self._state + @traceLog(moduleLog) def clean(self): """clean out chroot with extreme prejudice :)""" self.state("clean") @@ -102,9 +98,17 @@ class Root: if e.errno != 2: # no such file or directory raise + @traceLog(moduleLog) def init(self): self.state("init") + # NOTE: removed the following stuff vs mock v0: + # --> /etc/ is no longer 02775 (new privs model) + # --> no /etc/yum.conf symlink (F7 and above) + + self.root_log.debug("elevating privs") + self.uidManager.elevatePrivs() + # create our base directory heirarchy mock.util.mkdirIfAbsent(self.basedir) mock.util.mkdirIfAbsent(self.statedir) @@ -118,30 +122,81 @@ class Root: self.root_log.debug('resultdir = %s' % self.resultdir) self.root_log.debug('statedir = %s' % self.statedir) - self.root_log.debug("root_log debug message") - self.root_log.info("root_log info message") - self.root_log.warning("root_log warning message") - self.root_log.error("root_log error message") - self.root_log.critical("root_log critical message") - - self.build_log.debug("build_log debug message") - self.build_log.info("build_log info message") - self.build_log.warning("build_log warning message") - self.build_log.error("build_log error message") - self.build_log.critical("build_log critical message") - - - # ============= - # 'Private' API - # ============= - - def prep(self): - self.state("prep") self.root_log.debug("uid:%d, gid:%d" % (os.getuid(), os.getgid())) + # create skeleton dirs + self.root_log.info('create skeleton dirs') + for item in [ + os.path.join(self.rootdir, 'var/lib/rpm'), + os.path.join(self.rootdir, 'var/log'), + os.path.join(self.rootdir, 'var/lock/rpm'), + os.path.join(self.rootdir, 'dev'), + os.path.join(self.rootdir, 'etc/rpm'), + os.path.join(self.rootdir, 'tmp'), + os.path.join(self.rootdir, 'var/tmp'), + os.path.join(self.rootdir, 'etc/yum.repos.d'), + os.path.join(self.rootdir, 'etc/yum'), + ]: + mock.util.mkdirIfAbsent(item) + + # touch files + self.root_log.info('touch required files') + for item in [os.path.join(self.rootdir, 'etc', 'mtab'), + os.path.join(self.rootdir, 'etc', 'fstab'), + os.path.join(self.rootdir, 'var', 'log', 'yum.log')]: + mock.util.touch(item) + + # write in yum.conf into chroot + # always truncate and overwrite (w+) + self.root_log.info('configure yum') + yumconf = os.path.join(self.rootdir, 'etc', 'yum.conf') + yumconf_fo = open(yumconf, 'w+') + yumconf_fo.write(self.yum_conf_content) + yumconf_fo.close() + + # set up resolv.conf + if self.use_host_resolv: + resolvdir = os.path.join(self.rootdir, 'etc') + resolvpath = os.path.join(self.rootdir, 'etc', 'resolv.conf') + if os.path.exists(resolvpath): + os.remove(resolvpath) + shutil.copy2('/etc/resolv.conf', resolvdir) + + # files in /etc that need doing + for key in self.chroot_file_contents: + p = os.path.join(self.rootdir, *key.split('/')) + if not os.path.exists(p): + # write file + fo = open(p, 'w+') + fo.write(self.chroot_file_contents[key]) + fo.close() + # yum stuff # create user # create rpmbuild dir + + # ============= + # 'Private' API + # ============= + @traceLog(moduleLog) + def _yum(self): + pass + + @traceLog(moduleLog) + def _resetLogging(self): + # attach logs to log files. + # This happens in addition to anything + # is set up in the config file... ie. logs go everywhere + formatter = logging.Formatter("%(asctime)s - %(module)s:%(lineno)d:%(levelname)s: %(message)s") + for (log, filename) in ( + (self._state_log, "state.log"), + (self.build_log, "build.log"), + (self.root_log, "root.log")): + fullPath = os.path.join(self.statedir, filename) + fh = logging.FileHandler(fullPath, "w+") + fh.setFormatter(formatter) + fh.setLevel(logging.NOTSET) + log.addHandler(fh) |
