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
[email protected]
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.")
--
Fedora-buildsys-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/fedora-buildsys-list

Reply via email to