diff options
-rwxr-xr-x | check | 3 | ||||
-rwxr-xr-x | morph | 4 | ||||
-rw-r--r-- | morphlib/bins.py | 10 | ||||
-rw-r--r-- | morphlib/bins_tests.py | 6 | ||||
-rw-r--r-- | morphlib/builder.py | 61 | ||||
-rw-r--r-- | morphlib/execute.py | 27 | ||||
-rw-r--r-- | morphlib/execute_tests.py | 6 |
7 files changed, 39 insertions, 78 deletions
@@ -20,4 +20,5 @@ set -e python setup.py clean check -cmdtest -c ./morph tests +fakeroot env PATH="$PATH:/sbin:/usr/sbin:/usr/local/sbin" \ + cmdtest -c ./morph tests @@ -79,7 +79,7 @@ class Morph(cliapp.Application): tempdir = morphlib.tempdir.Tempdir() builder = morphlib.builder.Builder(tempdir, self) - if not os.path.exists(self.settings['cachedir']) and os.getuid() != 0: + if not os.path.exists(self.settings['cachedir']): os.mkdir(self.settings['cachedir']) ret = [] @@ -91,7 +91,7 @@ class Morph(cliapp.Application): # we may not have permission to tempdir.remove() ex = morphlib.execute.Execute('.', lambda msg: None) - ex.runv(["rm", "-rf", tempdir.dirname], as_root=True) + ex.runv(["rm", "-rf", tempdir.dirname]) if args: raise cliapp.AppException('Extra args on command line: %s' % args) diff --git a/morphlib/bins.py b/morphlib/bins.py index 90d96d82..cd77a037 100644 --- a/morphlib/bins.py +++ b/morphlib/bins.py @@ -101,20 +101,16 @@ def create_stratum(rootdir, stratum_filename, ex): '''Create a stratum from the contents of a directory.''' logging.debug('Creating stratum file %s from %s' % (stratum_filename, rootdir)) - ex.runv(['tar', '-C', rootdir, '-caf', stratum_filename, '.'], - as_fakeroot=True) + ex.runv(['tar', '-C', rootdir, '-caf', stratum_filename, '.']) -def unpack_binary(filename, dirname, ex, as_fakeroot=False, as_root=False): +def unpack_binary(filename, dirname, ex): '''Unpack a binary into a directory. The directory must exist already. - If the binary will be packed up again by tar with the same Execute - object then as_fakeroot will suffice - If it will be creating a system image as_root will be needed ''' logging.debug('Unpacking %s into %s' % (filename, dirname)) - ex.runv(['tar', '-C', dirname, '-xvf', filename], as_fakeroot=as_fakeroot, as_root=as_root) + ex.runv(['tar', '-C', dirname, '-xvf', filename]) diff --git a/morphlib/bins_tests.py b/morphlib/bins_tests.py index 6fe48aa7..8a54033b 100644 --- a/morphlib/bins_tests.py +++ b/morphlib/bins_tests.py @@ -92,8 +92,7 @@ class ChunkTests(unittest.TestCase): morphlib.bins.create_chunk(self.instdir, self.chunk_file, ['.'], self.ex) os.mkdir(self.unpacked) - morphlib.bins.unpack_binary(self.chunk_file, self.unpacked, self.ex, - as_fakeroot=True) + morphlib.bins.unpack_binary(self.chunk_file, self.unpacked, self.ex) self.assertEqual(orig_files, recursive_lstat(self.unpacked)) def test_uses_only_matching_names(self): @@ -127,8 +126,7 @@ class StratumTests(unittest.TestCase): self.populate_instdir() morphlib.bins.create_stratum(self.instdir, self.stratum_file, self.ex) os.mkdir(self.unpacked) - morphlib.bins.unpack_binary(self.stratum_file, self.unpacked, self.ex, - as_fakeroot=True) + morphlib.bins.unpack_binary(self.stratum_file, self.unpacked, self.ex) self.assertEqual(recursive_lstat(self.instdir), recursive_lstat(self.unpacked)) diff --git a/morphlib/builder.py b/morphlib/builder.py index c3e3b727..1ac18e0b 100644 --- a/morphlib/builder.py +++ b/morphlib/builder.py @@ -43,11 +43,13 @@ def ldconfig(ex, rootdir): ''' - logging.debug('Running ldconfig for %s' % rootdir) conf = os.path.join(rootdir, 'etc', 'ld.so.conf') - cache = os.path.join(rootdir, 'etc', 'ld.so.cache') - ex.runv(['ldconfig', '-f', conf, '-C', cache, '-r', rootdir]) - + if os.path.exists(conf): + logging.debug('Running ldconfig for %s' % rootdir) + cache = os.path.join(rootdir, 'etc', 'ld.so.cache') + ex.runv(['ldconfig', '-f', conf, '-C', cache, '-r', rootdir]) + else: + logging.debug('No %s, not running ldconfig' % conf) class BinaryBlob(object): @@ -251,16 +253,14 @@ class Chunk(BinaryBlob): self.run_sequentially('configure', bs['configure-commands']) self.run_in_parallel('build', bs['build-commands']) self.run_sequentially('test', bs['test-commands']) - self.run_sequentially('install', bs['install-commands'], - as_fakeroot=True) + self.run_sequentially('install', bs['install-commands']) def build_using_commands(self): self.msg('Building using explicit commands') self.run_sequentially('configure', self.morph.configure_commands) self.run_in_parallel('build', self.morph.build_commands) self.run_sequentially('test', self.morph.test_commands) - self.run_sequentially('install', self.morph.install_commands, - as_fakeroot=True) + self.run_sequentially('install', self.morph.install_commands) def run_in_parallel(self, what, commands): self.msg('commands: %s' % what) @@ -268,13 +268,13 @@ class Chunk(BinaryBlob): self.ex.run(commands) self.build_watch.stop(what) - def run_sequentially(self, what, commands, as_fakeroot=False, as_root=False): + def run_sequentially(self, what, commands): self.msg ('commands: %s' % what) self.build_watch.start(what) flags = self.ex.env['MAKEFLAGS'] self.ex.env['MAKEFLAGS'] = '-j1' logging.debug('Setting MAKEFLAGS=%s' % self.ex.env['MAKEFLAGS']) - self.ex.run(commands, as_fakeroot=as_fakeroot, as_root=as_root) + self.ex.run(commands) self.ex.env['MAKEFLAGS'] = flags logging.debug('Restore MAKEFLAGS=%s' % self.ex.env['MAKEFLAGS']) self.build_watch.stop(what) @@ -321,8 +321,7 @@ class Stratum(BinaryBlob): self.build_watch.start('unpack-chunks') for chunk_name, filename in self.built: self.msg('Unpacking chunk %s' % chunk_name) - morphlib.bins.unpack_binary(filename, self.destdir, ex, - as_fakeroot=True) + morphlib.bins.unpack_binary(filename, self.destdir, ex) self.build_watch.stop('unpack-chunks') self.prepare_binary_metadata(self.morph.name) self.build_watch.start('create-binary') @@ -355,22 +354,20 @@ class System(BinaryBlob): # Partition it. self.build_watch.start('partition-image') - self.ex.runv(['parted', '-s', image_name, 'mklabel', 'msdos'], - as_root=True) + self.ex.runv(['parted', '-s', image_name, 'mklabel', 'msdos']) self.ex.runv(['parted', '-s', image_name, 'mkpart', 'primary', - '0%', '100%'], as_root=True) - self.ex.runv(['parted', '-s', image_name, 'set', '1', 'boot', 'on'], - as_root=True) + '0%', '100%']) + self.ex.runv(['parted', '-s', image_name, 'set', '1', 'boot', 'on']) self.build_watch.stop('partition-image') # Install first stage boot loader into MBR. self.build_watch.start('install-mbr') - self.ex.runv(['install-mbr', image_name], as_root=True) + self.ex.runv(['install-mbr', image_name]) self.build_watch.stop('install-mbr') # Setup device mapper to access the partition. self.build_watch.start('setup-device-mapper') - out = self.ex.runv(['kpartx', '-av', image_name], as_root=True) + out = self.ex.runv(['kpartx', '-av', image_name]) devices = [line.split()[2] for line in out.splitlines() if line.startswith('add map ')] @@ -381,14 +378,14 @@ class System(BinaryBlob): try: # Create filesystem. self.build_watch.start('create-filesystem') - self.ex.runv(['mkfs', '-t', 'ext3', partition], as_root=True) + self.ex.runv(['mkfs', '-t', 'ext3', partition]) self.build_watch.stop('create-filesystem') # Mount it. self.build_watch.start('mount-filesystem') mount_point = self.tempdir.join('mnt') os.mkdir(mount_point) - self.ex.runv(['mount', partition, mount_point], as_root=True) + self.ex.runv(['mount', partition, mount_point]) self.build_watch.stop('mount-filesystem') # Unpack all strata into filesystem. @@ -396,8 +393,7 @@ class System(BinaryBlob): self.build_watch.start('unpack-strata') for name, filename in self.built: self.msg('unpack %s from %s' % (name, filename)) - self.ex.runv(['tar', '-C', mount_point, '-xf', filename], - as_root=True) + self.ex.runv(['tar', '-C', mount_point, '-xf', filename]) ldconfig(ex, mount_point) self.build_watch.stop('unpack-strata') @@ -409,7 +405,7 @@ class System(BinaryBlob): proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 /dev/sda1 / ext4 errors=remount-ro 0 1 -''', as_root=True, stdout=open(os.devnull,'w')) +''', stdout=open(os.devnull,'w')) self.build_watch.stop('create-fstab') # Install extlinux bootloader. @@ -423,9 +419,9 @@ timeout 1 label linux kernel /vmlinuz append root=/dev/sda1 init=/sbin/init quiet rw -''', as_root=True, stdout=open(os.devnull, 'w')) +''', stdout=open(os.devnull, 'w')) - self.ex.runv(['extlinux', '--install', mount_point], as_root=True) + self.ex.runv(['extlinux', '--install', mount_point]) # Weird hack that makes extlinux work. There is a bug somewhere. self.ex.runv(['sync']) @@ -434,26 +430,26 @@ append root=/dev/sda1 init=/sbin/init quiet rw # Unmount. self.build_watch.start('unmount-filesystem') - self.ex.runv(['umount', mount_point], as_root=True) + self.ex.runv(['umount', mount_point]) self.build_watch.stop('unmount-filesystem') except BaseException, e: # Unmount. if mount_point is not None: try: - self.ex.runv(['umount', mount_point], as_root=True) + self.ex.runv(['umount', mount_point]) except Exception: pass # Undo device mapping. try: - self.ex.runv(['kpartx', '-d', image_name], as_root=True) + self.ex.runv(['kpartx', '-d', image_name]) except Exception: pass raise # Undo device mapping. self.build_watch.start('undo-device-mapper') - self.ex.runv(['kpartx', '-d', image_name], as_root=True) + self.ex.runv(['kpartx', '-d', image_name]) self.build_watch.stop('undo-device-mapper') # Move image file to cache. @@ -574,13 +570,12 @@ class Builder(object): if self.settings['bootstrap']: self.msg('Unpacking chunk %s onto system' % chunk_name) ex = morphlib.execute.Execute('/', self.msg) - morphlib.bins.unpack_binary(chunk_filename, '/', ex, as_root=True) + morphlib.bins.unpack_binary(chunk_filename, '/', ex) ldconfig(ex, '/') else: self.msg('Unpacking chunk %s into staging' % chunk_name) ex = morphlib.execute.Execute(staging_dir, self.msg) - morphlib.bins.unpack_binary(chunk_filename, staging_dir, ex, - as_root=True) + morphlib.bins.unpack_binary(chunk_filename, staging_dir, ex) ldconfig(ex, staging_dir) def get_morph_from_git(self, repo, ref, filename): diff --git a/morphlib/execute.py b/morphlib/execute.py index 7b6cf585..038a5cfd 100644 --- a/morphlib/execute.py +++ b/morphlib/execute.py @@ -39,31 +39,11 @@ class Execute(object): self._setup_env() self.dirname = dirname self.msg = msg - self._fakeroot_session = None - - def __del__(self): # pragma: no cover - if self._fakeroot_session: - os.remove(self._fakeroot_session) def _setup_env(self): self.env = dict(os.environ) - def _prefix(self, argv, as_root, as_fakeroot): - if as_root: # pragma: no cover - if os.getuid() == 0: - prefix = ['env'] - else: - prefix = ['sudo'] - envs = ["%s=%s" % x for x in self.env.iteritems()] - argv = prefix + envs + argv - elif as_fakeroot and os.getuid() != 0: - if not self._fakeroot_session: - self._fakeroot_session = tempfile.mkstemp()[1] - argv = ['fakeroot', '-i', self._fakeroot_session, '-s', - self._fakeroot_session, '--'] + argv - return argv - - def run(self, commands, as_root=False, as_fakeroot=False, _log=True): + def run(self, commands, _log=True): '''Execute a list of commands. If a command fails (returns non-zero exit code), the rest are @@ -75,7 +55,6 @@ class Execute(object): for command in commands: self.msg('# %s' % command) argv = ['sh', '-c', command] - argv = self._prefix(argv, as_root, as_fakeroot) logging.debug('run: argv=%s' % repr(argv)) logging.debug('run: env=%s' % repr(self.env)) logging.debug('run: cwd=%s' % repr(self.dirname)) @@ -94,8 +73,7 @@ class Execute(object): stdouts.append(out) return stdouts - def runv(self, argv, feed_stdin=None, as_root=False, as_fakeroot=False, - _log=True, **kwargs): + def runv(self, argv, feed_stdin=None, _log=True, **kwargs): '''Run a command given as a list of argv elements. Return standard output. Raise ``CommandFailure`` if the command @@ -113,7 +91,6 @@ class Execute(object): if 'env' not in kwargs: kwargs['env'] = self.env - argv = self._prefix(argv, as_root, as_fakeroot) logging.debug('runv: argv=%s' % repr(argv)) logging.debug('runv: env=%s' % repr(self.env)) logging.debug('runv: cwd=%s' % repr(self.dirname)) diff --git a/morphlib/execute_tests.py b/morphlib/execute_tests.py index 86db9c25..da6f5d49 100644 --- a/morphlib/execute_tests.py +++ b/morphlib/execute_tests.py @@ -52,9 +52,3 @@ class ExecuteTests(unittest.TestCase): def test_runv_sets_working_directory(self): self.assertEqual(self.e.runv(['pwd']), '/\n') - def test_runs_as_fakeroot_when_requested(self): - self.assertEqual(self.e.run(['id -u'], as_fakeroot=True), ['0\n']) - - def test_runvs_as_fakeroot_when_requested(self): - self.assertEqual(self.e.runv(['id', '-u'], as_fakeroot=True), '0\n') - |