Jesse Keating wrote:
On Tuesday 15 May 2007 14:20:29 Jesse Keating wrote:
> On Friday 04 May 2007 10:13:34 Joel Andres Granados wrote:
>
>> Referring to ticket #34 at
>>
https://hosted.fedoraproject.org/projects/pungi/ticket/34 stating that
>> the logger needed a little work so that it didn't depend on the
>> gather.py (or at least thats what I understood :) I propose either a
>> new file (pungiLog.py) located in the pypungi directory or a new
>> function in the "pungi" file that contains the logging stuff. The log
>> services would be started somewhere before the line containing "#
>> Actually do work." of the "pungi" file. The logging root would
be
>> called "pungi" and would be called in each file that logging is needed
>> with the logging.getlogger("pungi") command.
>> If "quiet" is specified in the config file the logging will be turned
>> off.
>>
>> *Diff for the pungi file:*
>> 1. Initializes the logger by calling to the new file.
>> 2. specify quiet value.
>> 3. logging function.
>> *
>> Diff for pungi.py file:
>> *1. use the correct logger.
>> *
>> Diff for gather.py file:*
>> change all the if statements for each logging call.
>>
>> Files attached...
>> Comments appreciated.
>>
> Thanks for this. I think this is the right direction. However I'm
> reluctant to make such a change this late in Fedora 7 development. I'll
> want to look at this once I start doing Fedora 8 changes.
>
I just looked at this again and I don't think it'll quite work. The thing is
I want logging to work if somebody just imported pypungi and started using
commands. Maybe that's not possible, maybe it is. Something to look into.
I think I can have a pypungi.logger module/class that has some reasonable
defaults that can be overridden if the config file is used, or if
say /usr/bin/pungi is envoked, but would work otherwise.
------------------------------------------------------------------------
--
Fedora-buildsys-list mailing list
Fedora-buildsys-list(a)redhat.com
https://www.redhat.com/mailman/listinfo/fedora-buildsys-list Something like
this???
The logger must still be initialized, but after that you just have to
import the Plog variable from pypungi to begin. I put the logging code
in the __init__.py because I wanted it to execute when "import pypungi"
was called. I couldn't find a way to pass arguments to it though
(within python). It would be ideal to set global variables before the
import and for the function to somehow notice those globals. I would
suppose it is possible but have no idea how. Look for more info on that
tomorrow.
For now here is my proposal :)
Comments greatly appreciated :)
Regards
--
Joel Andres Granados
diff -ur -x .hg pungi/pungi pungi_l/pungi
--- pungi/pungi 2007-05-28 14:54:05.000000000 +0200
+++ pungi_l/pungi 2007-05-28 18:37:26.000000000 +0200
@@ -83,6 +83,15 @@
destdir = config.get('default', 'destdir')
+ if not config.has_option('default', 'quiet'):logF=True
+ else:logF=False
+ config.set('default','quiet',str(not logF))
+
+ # initialize logging.
+ logPath = os.path.join(config.get('default', 'destdir'),
+ 'logs/%s.%s.log' % (config.get('default', 'flavor'),
config.get('default', 'arch')))
+ pypungi.startLogger(logPath=logPath, logF=logF)
+
if not os.path.exists(destdir):
try:
os.makedirs(destdir)
diff -ur -x .hg pungi/pypungi/gather.py pungi_l/pypungi/gather.py
--- pungi/pypungi/gather.py 2007-05-28 12:49:57.000000000 +0200
+++ pungi_l/pypungi/gather.py 2007-05-28 18:09:53.000000000 +0200
@@ -17,6 +17,8 @@
import shutil
import sys
+from pypungi import Plog
+
class Gather(yum.YumBase):
def __init__(self, config, pkglist):
self.workdir = os.path.join(config.get('default', 'destdir'),
@@ -49,7 +51,6 @@
#self.doSackSetup(arches)
self.doSackSetup(archlist=arches) # work around temp break in yum api
self.doSackFilelistPopulate()
- self.logger = yum.logging.getLogger("yum.verbose.pungi")
self.pkglist = pkglist
self.polist = []
self.srpmlist = []
@@ -59,15 +60,8 @@
self.compsobj.add(self.config.get('default', 'comps'))
def doLoggingSetup(self, debuglevel, errorlevel):
- """Setup the logging facility."""
-
-
- logdir = os.path.join(self.config.get('default', 'destdir'),
'logs')
- if not os.path.exists(logdir):
- os.makedirs(logdir)
- logfile = os.path.join(logdir, '%s.%s.log' %
(self.config.get('default', 'flavor'),
- self.config.get('default',
'arch')))
- yum.logging.basicConfig(level=yum.logging.DEBUG, filename=logfile)
+ # We want to use our own logger.
+ pass
def doFileLogSetup(self, uid, logfile):
# This function overrides a yum function, allowing pungi to control
@@ -95,8 +89,7 @@
transaction info"""
- if not self.config.has_option('default', 'quiet'):
- self.logger.info('Checking deps of %s.%s' % (po.name, po.arch))
+ Plog.info('Checking deps of %s.%s' % (po.name, po.arch))
reqs = po.requires
provs = po.provides
@@ -112,13 +105,12 @@
deps = self.whatProvides(r, f, v).returnPackages()
if deps is None:
- self.logger.warning("Unresolvable dependency %s in %s.%s" % (r,
po.name, po.arch))
+ Plog.warning("Unresolvable dependency %s in %s.%s" % (r,
po.name, po.arch))
continue
for dep in deps:
self.tsInfo.addInstall(dep)
- if not self.config.has_option('default', 'quiet'):
- self.logger.info('Added %s.%s for %s.%s' % (dep.name,
dep.arch, po.name, po.arch))
+ Plog.info('Added %s.%s for %s.%s' % (dep.name, dep.arch, po.name,
po.arch))
self.resolved_deps[req] = None
@@ -143,7 +135,7 @@
# Check if we have the group
if not self.compsobj.has_group(group):
- self.logger.error("Group %s not found in comps!" % group)
+ Plog.error("Group %s not found in comps!" % group)
return packages
# Get the group object to work with
@@ -194,22 +186,18 @@
for line in self.pkglist:
line = line.strip()
if line.startswith('#'):
- if not self.config.has_option('default', 'quiet'):
- self.logger.info('Skipping comment: %s' % line)
+ Plog.info('Skipping comment: %s' % line)
continue
if line.startswith('@'):
- if not self.config.has_option('default', 'quiet'):
- self.logger.info('Adding group: %s' % line)
+ Plog.info('Adding group: %s' % line)
grouplist.append(line.strip('@'))
continue
if line.startswith('-'):
- if not self.config.has_option('default', 'quiet'):
- self.logger.info('Adding exclude: %s' % line)
+ Plog.info('Adding exclude: %s' % line)
excludelist.append(line.strip('-'))
continue
else:
- if not self.config.has_option('default', 'quiet'):
- self.logger.info('Adding package: %s' % line)
+ Plog.info('Adding package: %s' % line)
addlist.append(line)
# First remove the excludes
@@ -238,12 +226,10 @@
mysack = yum.packageSack.ListPackageSack(matches)
for match in mysack.returnNewestByNameArch():
self.tsInfo.addInstall(match)
- if not self.config.has_option('default', 'quiet'):
- self.logger.info('Found %s.%s' % (match.name, match.arch))
+ Plog.info('Found %s.%s' % (match.name, match.arch))
for pkg in unmatched:
- if not pkg in matchdict.keys():
- self.logger.warn('Could not find a match for %s' % pkg)
+ Plog.warn('Could not find a match for %s' % pkg)
if len(self.tsInfo) == 0:
raise yum.Errors.MiscError, 'No packages found to download.'
@@ -281,7 +267,7 @@
for pkg in self.polist:
downloads.append('%s.%s' % (pkg.name, pkg.arch))
downloads.sort()
- self.logger.info("Download list: %s" % downloads)
+ Plog.info("Download list: %s" % downloads)
# Package location within destdir, name subject to change/config
pkgdir = os.path.join(self.config.get('default', 'destdir'),
self.config.get('default', 'version'),
@@ -300,8 +286,7 @@
local = os.path.join(self.config.get('default', 'cachedir'),
local)
if os.path.exists(local) and self.verifyCachePkg(pkg, local):
- if not self.config.has_option('default', 'quiet'):
- self.logger.info("%s already exists and appears to be
complete" % local)
+ Plog.info("%s already exists and appears to be complete" %
local)
target = os.path.join(pkgdir, os.path.basename(remote))
if os.path.exists(target):
os.remove(target) # avoid traceback after interrupted download
@@ -310,8 +295,7 @@
# Disable cache otherwise things won't download
repo.cache = 0
- if not self.config.has_option('default', 'quiet'):
- self.logger.info('Downloading %s' % os.path.basename(remote))
+ Plog.info('Downloading %s' % os.path.basename(remote))
pkg.localpath = local # Hack: to set the localpath to what we want.
# do a little dance for file:// repos...
@@ -365,20 +349,17 @@
local = os.path.basename(remote)
local = os.path.join(self.config.get('default', 'cachedir'),
local)
if os.path.exists(local) and self.verifyCachePkg(pkg, local):
-
- if not self.config.has_option('default', 'quiet'):
- self.logger.info("%s already exists and appears to be
complete" % local)
- if os.path.exists(os.path.join(pkgdir, os.path.basename(remote))) and
self.verifyCachePkg(pkg, os.path.join(pkgdir, os.path.basename(remote))) ==
pkg.packagesize:
- if not self.config.has_option('default', 'quiet'):
- self.logger.info("%s already exists in tree and appears to
be complete" % local)
+ Plog.info("%s already exists and appears to be complete" %
local)
+ if os.path.exists(os.path.join(pkgdir, os.path.basename(remote))) and \
+ self.verifyCachePkg(pkg, os.path.join(pkgdir,
os.path.basename(remote))) == pkg.packagesize:
+ Plog.info("%s already exists in tree and appears to be
complete" % local)
else:
os.link(local, os.path.join(pkgdir, os.path.basename(remote)))
continue
# Disable cache otherwise things won't download
repo.cache = 0
- if not self.config.has_option('default', 'quiet'):
- self.logger.info('Downloading %s' % os.path.basename(remote))
+ Plog.info('Downloading %s' % os.path.basename(remote))
pkg.localpath = local # Hack: to set the localpath to what we want.
# do a little dance for file:// repos...
diff -ur -x .hg pungi/pypungi/__init__.py pungi_l/pypungi/__init__.py
--- pungi/pypungi/__init__.py 2007-05-28 12:49:57.000000000 +0200
+++ pungi_l/pypungi/__init__.py 2007-05-28 18:32:12.000000000 +0200
@@ -0,0 +1,43 @@
+#!/usr/bin/python -tt
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Library General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+
+import logging
+import os.path
+import os
+
+Plog = logging.getLogger("pungi")
+
+def startLogger(logPath="/srv/pungi/pungi.log", logF=True,
level=logging.DEBUG):
+ """ Initialize the logger.
+
+ logPath - is the path to the file.
+ logF - when true log will be activated.
+ level - the level of debuging
+ """
+
+ if logF:
+ if not os.path.exists(os.path.split(logPath)[0]):
+ os.makedirs(os.path.split(logPath)[0])
+ fileHandler = logging.FileHandler(logPath)
+ fileHandler.setLevel(level)
+
+ # should this be changeable?
+ formatter = logging.Formatter('%(name)s-%(levelno)s-%(funcName)s :
%(message)s')
+ fileHandler.setFormatter(formatter)
+
+ Plog.addHandler(fileHandler)
+ Plog.setLevel(logging.DEBUG)
+ else:
+ Plog.disabled=1
diff -ur -x .hg pungi/pypungi/pungi.py pungi_l/pypungi/pungi.py
--- pungi/pypungi/pungi.py 2007-05-28 12:49:57.000000000 +0200
+++ pungi_l/pypungi/pungi.py 2007-05-28 18:09:40.000000000 +0200
@@ -13,7 +13,6 @@
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
import subprocess
-import logging
import os
import sys
sys.path.append('/usr/lib/anaconda-runtime')
@@ -21,7 +20,7 @@
import shutil
import re
-log = logging.getLogger("pypungi.pungi")
+from pypungi import Plog
class Pungi:
def __init__(self, config):
@@ -67,16 +66,16 @@
"""Run a command and log the output. Error out if we get
something on stderr"""
- log.info("Running %s" % ' '.join(command))
+ Plog.info("Running %s" % ' '.join(command))
- p1 = subprocess.Popen(command, cwd=rundir, stdout=output, stderr=error)
+ p1 = subprocess.Popen(command, cwd=rundir, stdout=output, stderr=error,
universal_newlines=True)
(out, err) = p1.communicate()
if p1.returncode != 0:
- log.error("Got an error from %s" % command[0])
- log.error(err)
+ Plog.error("Got an error from %s" % command[0])
+ Plog.error(err)
raise OSError, "Got an error from %s" % command[0]
- log.info(out)
+ Plog.info(out)
def doBuildinstall(self):
"""Run anaconda-runtime's buildinstall on the
tree."""
@@ -180,18 +179,18 @@
(out, err) = subprocess.Popen(cpio, cwd=docsdir, stdin=p1.stdout,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE).communicate()
except:
- log.error("Got an error from rpm2cpio")
- log.error(err)
+ Plog.error("Got an error from rpm2cpio")
+ Plog.error(err)
raise
- log.info(out)
+ Plog.info(out)
# Walk the tree for our files
for dirpath, dirname, filelist in os.walk(docsdir):
for filename in filelist:
for regex in fileres:
if regex.match(filename) and not
os.path.exists(os.path.join(self.topdir, filename)):
- log.info("Copying release note file %s" % filename)
+ Plog.info("Copying release note file %s" % filename)
shutil.copy(os.path.join(dirpath, filename),
os.path.join(self.topdir, filename))
self.common_files.append(filename)
@@ -200,7 +199,7 @@
for directory in dirname:
for regex in dirres:
if regex.match(directory) and not
os.path.exists(os.path.join(self.topdir, directory)):
- log.info("Copying release note dir %s" % directory)
+ Plog.info("Copying release note dir %s" % directory)
shutil.copytree(os.path.join(dirpath, directory),
os.path.join(self.topdir, directory))
@@ -228,7 +227,7 @@
#timber.reserve_size =
output = timber.main()
- log.info("Output from splittree: %s" % '\n'.join(output))
+ Plog.info("Output from splittree: %s" % '\n'.join(output))
def doSplitSRPMs(self):
"""Use anaconda-runtime's splittree to split the srpms into
appropriate
@@ -266,7 +265,7 @@
timber.common_files)
timber.splitSRPMS()
- log.info("splitSRPMS complete")
+ Plog.info("splitSRPMS complete")
def doCreateSplitrepo(self):
"""Create the split metadata for the isos"""
@@ -514,4 +513,4 @@
if directory.startswith('os-disc') or
directory.startswith('SRPM-disc'):
shutil.move(os.path.join(self.archdir, directory),
os.path.join(self.workdir, directory))
- log.info("CreateIsos is done.")
+ Plog.info("CreateIsos is done.")