Fix logging during _ensuredir.

Some fixups for re-using dirs
This commit is contained in:
Jesse Keating 2007-12-02 22:24:11 -05:00 committed by Jesse Keating
parent 6748133646
commit dcf069a017
4 changed files with 37 additions and 20 deletions

10
pungi
View File

@ -22,15 +22,15 @@ import pykickstart.version
def main():
config = pypungi.config.Config()
(opts, args) = get_arguments(config)
# You must be this high to ride if you're going to do root tasks
if os.geteuid () != 0 and (opts.do_all or opts.do_buildinstall):
print >> sys.stderr, "You must run pungi as root"
return 1
config = pypungi.config.Config()
(opts, args) = get_arguments(config)
# Set up the kickstart parser and pass in the kickstart file we were handed
ksparser = pykickstart.parser.KickstartParser(pykickstart.version.makeVersion())
ksparser.readKickstart(opts.config)
@ -42,7 +42,7 @@ def main():
if part.mountpoint == 'iso':
config.set('default', 'cdsize', str(part.size))
config.set('default', 'force', opts.force)
config.set('default', 'force', str(opts.force))
# Set up our directories
if not os.path.exists(config.get('default', 'destdir')):

View File

@ -38,7 +38,7 @@ class PungiBase(object):
logdir = os.path.join(self.config.get('default', 'destdir'), 'logs')
_ensuredir(logdir, force=True) # Always allow logs to be written out
_ensuredir(logdir, None, force=True) # Always allow logs to be written out
if self.config.get('default', 'flavor'):
logfile = os.path.join(logdir, '%s.%s.log' % (self.config.get('default', 'flavor'),
@ -69,7 +69,7 @@ def _doRunCommand(command, logger, rundir='/tmp', output=subprocess.PIPE, error=
logger.error(err)
raise OSError, "Got an error from %s: %s" % (command[0], err)
def _link(local, target, force=False):
def _link(local, target, logger, force=False):
"""Simple function to link or copy a package, removing target optionally."""
if os.path.exists(target) and force:
@ -79,22 +79,32 @@ def _link(local, target, force=False):
os.link(local, target)
except OSError, e:
if e.errno != 18: # EXDEV
self.logger.error('Got an error linking from cache: %s' % e)
logger.error('Got an error linking from cache: %s' % e)
raise OSError, e
# Can't hardlink cross file systems
shutil.copy2(local, target)
def _ensuredir(target, force=False, clean=False):
def _ensuredir(target, logger, force=False, clean=False):
"""Ensure that a directory exists, if it already exists, only continue
if force is set."""
# We have to check existance of a logger, as setting the logger could
# itself cause an issue.
def whoops(func, path, exc_info):
self.logger.error('Could not remove %s' % path)
message = 'Could not remove %s' % path
if logger:
logger.error(message)
else:
sys.stderr(message)
sys.exit(1)
if os.path.exists(target) and not os.path.isdir(target):
self.logger.error('%s exists but is not a directory.' % target)
message = '%s exists but is not a directory.' % target
if logger:
logger.error(message)
else:
sys.stderr(message)
sys.exit(1)
if not os.path.isdir(target):
@ -105,5 +115,9 @@ def _ensuredir(target, force=False, clean=False):
elif force:
return
else:
self.logger.error('Directory %s already exists. Use --force to overwrite.' % target)
message = 'Directory %s already exists. Use --force to overwrite.' % target
if logger:
logger.error(message)
else:
sys.stderr(message)
sys.exit(1)

View File

@ -322,7 +322,7 @@ class Gather(pypungi.PungiBase):
relpkgdir)
# Ensure the pkgdir exists, force if requested, and make sure we clean it out
pypungi._ensuredir(pkgdir, force=self.config.getbool('default', 'force'), clean=True)
pypungi._ensuredir(pkgdir, self.logger, force=self.config.getboolean('default', 'force'), clean=True)
probs = self.ayum.downloadPkgs(polist)
@ -342,7 +342,7 @@ class Gather(pypungi.PungiBase):
# Link downloaded package in (or link package from file repo)
try:
pypungi._link(local, target, force=True)
pypungi._link(local, target, self.logger, force=True)
continue
except:
self.logger.error("Unable to link %s from the yum cache." % po.name)

View File

@ -44,7 +44,7 @@ class Pungi(pypungi.PungiBase):
self.topdir = os.path.join(self.archdir, 'os')
self.isodir = os.path.join(self.archdir, self.config.get('default','isodir'))
pypungi._ensuredir(workdir, force=self.config.getbool('default', 'force'))
pypungi._ensuredir(self.workdir, self.logger, force=True)
self.common_files = []
self.infofile = os.path.join(self.config.get('default', 'destdir'),
@ -173,7 +173,7 @@ class Pungi(pypungi.PungiBase):
for pattern in self.config.get('default', 'relnotedirre').split():
dirres.append(re.compile(pattern))
pypungi._ensuredir(docsdir, force=self.config.getbool('default', 'force'), clean=True)
pypungi._ensuredir(docsdir, self.logger, force=self.config.getboolean('default', 'force'), clean=True)
# Expload the packages we list as relnote packages
pkgs = os.listdir(os.path.join(self.topdir, self.config.get('default', 'product_path')))
@ -204,7 +204,7 @@ class Pungi(pypungi.PungiBase):
for regex in fileres:
if regex.match(filename) and not os.path.exists(os.path.join(self.topdir, filename)):
self.logger.info("Linking release note file %s" % filename)
pypungi._link(os.path.join(dirpath, filename), os.path.join(self.topdir, filename))
pypungi._link(os.path.join(dirpath, filename), os.path.join(self.topdir, filename), self.logger)
self.common_files.append(filename)
# Walk the tree for our dirs
@ -269,7 +269,8 @@ class Pungi(pypungi.PungiBase):
# this is stolen from splittree.py in anaconda-runtime. Blame them if its ugly (:
for i in range(timber.src_list[0], timber.src_list[-1] + 1):
pypungi._ensuredir('%s-disc%d/SRPMS' % (timper.dist_dir, i),
force=self.config.getbool('default', 'force'),
self.logger,
force=self.config.getboolean('default', 'force'),
clean=True)
timber.linkFiles(timber.dist_dir,
"%s-disc%d" %(timber.dist_dir, i),
@ -304,7 +305,8 @@ class Pungi(pypungi.PungiBase):
createrepo.append('--outputdir')
if self.config.getint('default', 'discs') == 1:
pypungi._ensuredir('%s-disc1', force=self.config.getbool('default', 'force'),
pypungi._ensuredir('%s-disc1' % self.topdir, self.logger,
force=self.config.getboolean('default', 'force'),
clean=True) # rename this for single disc
createrepo.append('%s-disc1' % self.topdir)
@ -346,7 +348,8 @@ cost=500
anaruntime = '/usr/lib/anaconda-runtime/boot'
discinfofile = os.path.join(self.topdir, '.discinfo') # we use this a fair amount
pypungi._ensuredir(self.isodir, force=self.config.getbool('default', 'force'),
pypungi._ensuredir(self.isodir, self.logger,
force=self.config.getboolean('default', 'force'),
clean=True) # This is risky...
# setup the base command