summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichael E Brown <michael_e_brown@dell.com>2007-10-17 11:33:49 -0500
committerMichael E Brown <michael_e_brown@dell.com>2007-10-17 11:33:49 -0500
commitdca92953271f4ada64a172c3b91e1626e665f96d (patch)
tree6af1e0ab37f590b33c4eee0f3c7dc4f80d15cdd1 /src
parentdfcfe855b25e56b318a964b0645bbeaa08223d79 (diff)
downloadmock-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.py149
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)