Ticket #569: 0001-renaming-Logging-module-to-Logger-to-avoid-collision.patch

File 0001-renaming-Logging-module-to-Logger-to-avoid-collision.patch, 21.0 KB (added by [email protected]…, 14 years ago)

renaming patch

  • redhat/bcfg2.spec

    From 9704398770b4b84ce27c05d6acf6c740f26c6b21 Mon Sep 17 00:00:00 2001
    From: Peter Woodman <[email protected]>
    Date: Wed, 25 Jun 2008 14:54:48 -0700
    Subject: [PATCH] renaming Logging module to Logger to avoid collision with standard library module on case-insensitive filesystems
    
    ---
     redhat/bcfg2.spec             |    2 +-
     src/lib/Logger.py             |  155 +++++++++++++++++++++++++++++++++++++++++
     src/lib/Logging.py            |  155 -----------------------------------------
     src/lib/Server/Admin/Query.py |    4 +-
     src/lib/__init__.py           |    2 +-
     src/sbin/bcfg2                |    4 +-
     src/sbin/bcfg2-admin          |    4 +-
     src/sbin/bcfg2-info           |    4 +-
     src/sbin/bcfg2-remote         |    4 +-
     src/sbin/bcfg2-server         |    6 +-
     tools/bcfg2-export-config     |    4 +-
     11 files changed, 172 insertions(+), 172 deletions(-)
     create mode 100644 src/lib/Logger.py
     delete mode 100644 src/lib/Logging.py
    
    diff --git a/redhat/bcfg2.spec b/redhat/bcfg2.spec
    index 50b32a8..a4873d5 100644
    a b fi 
    182182%{python_sitelib}/Bcfg2/Client 
    183183%{python_sitelib}/Bcfg2/Component.* 
    184184%{python_sitelib}/Bcfg2/Daemon.* 
    185 %{python_sitelib}/Bcfg2/Logging.* 
     185%{python_sitelib}/Bcfg2/Logger.* 
    186186%{python_sitelib}/Bcfg2/Options.* 
    187187%{python_sitelib}/Bcfg2/Proxy.* 
    188188%{python_sitelib}/Bcfg2/tlslite 
  • new file src/lib/Logger.py

    diff --git a/src/lib/Logger.py b/src/lib/Logger.py
    new file mode 100644
    index 0000000..4295380
    - +  
     1'''Bcfg2 logging support''' 
     2__revision__ = '$Revision$' 
     3 
     4import copy, fcntl, logging, logging.handlers, math, socket, struct, sys, termios, types 
     5 
     6logging.raiseExceptions=0 
     7 
     8def print_attributes(attrib): 
     9    ''' Add the attributes for an element''' 
     10    return ' '.join(['%s="%s"' % data for data in attrib.iteritems()]) 
     11 
     12def print_text(text): 
     13    ''' Add text to the output (which will need normalising ''' 
     14    charmap = {'<':'&lt;', '>':'&gt;', '&':'&amp;'} 
     15    return ''.join([charmap.get(char, char) for char in text]) + '\n' 
     16         
     17def xml_print(element, running_indent=0, indent=4): 
     18    ''' Add an element and its children to the return string ''' 
     19    if (len(element.getchildren()) == 0) and (not element.text): 
     20        ret = (' ' * running_indent) 
     21        ret += '<%s %s/>\n' % (element.tag, print_attributes(element.attrib)) 
     22    else: 
     23        child_indent = running_indent + indent 
     24        ret = (' ' * running_indent) 
     25        ret += '<%s%s>\n' % (element.tag, print_attributes(element)) 
     26        if element.text:                 
     27            ret += (' '* child_indent) + print_text(element.text) 
     28        for child in element.getchildren(): 
     29            ret += xml_print(child, child_indent, indent) 
     30            ret += (' ' * running_indent) +  '</%s>\n' % (element.tag) 
     31        if element.tail: 
     32            ret += (' ' * child_indent) + print_text(element.tail) 
     33    return ret 
     34 
     35class TermiosFormatter(logging.Formatter): 
     36    '''The termios formatter displays output in a terminal-sensitive fashion''' 
     37 
     38    def __init__(self, fmt=None, datefmt=None): 
     39        logging.Formatter.__init__(self, fmt, datefmt) 
     40        if sys.stdout.isatty(): 
     41            # now get termios info 
     42            try: 
     43                self.width = struct.unpack('hhhh', fcntl.ioctl(0, termios.TIOCGWINSZ, 
     44                                                               "\000"*8))[1] 
     45                if self.width == 0: 
     46                    self.width = 80 
     47            except: 
     48                self.width = 80 
     49        else: 
     50            # output to a pipe 
     51            self.width = 32768 
     52 
     53    def format(self, record): 
     54        '''format a record for display''' 
     55        returns = [] 
     56        line_len = self.width 
     57        if type(record.msg) in types.StringTypes: 
     58            for line in record.msg.split('\n'): 
     59                if len(line) <= line_len: 
     60                    returns.append(line) 
     61                else: 
     62                    inner_lines = int(math.floor(float(len(line)) / line_len))+1 
     63                    for i in xrange(inner_lines): 
     64                        returns.append("%s" % (line[i*line_len:(i+1)*line_len])) 
     65        elif type(record.msg) == types.ListType: 
     66            if not record.msg: 
     67                return '' 
     68            record.msg.sort() 
     69            msgwidth = self.width 
     70            columnWidth = max([len(item) for item in record.msg]) 
     71            columns = int(math.floor(float(msgwidth) / (columnWidth+2))) 
     72            lines = int(math.ceil(float(len(record.msg)) / columns)) 
     73            for lineNumber in xrange(lines): 
     74                indices = [idx for idx in [(colNum * lines) + lineNumber 
     75                                           for colNum in range(columns)] if idx < len(record.msg)] 
     76                format = (len(indices) * (" %%-%ds " % columnWidth)) 
     77                returns.append(format % tuple([record.msg[idx] for idx in indices])) 
     78        #elif type(record.msg) == lxml.etree._Element: 
     79        #    returns.append(str(xml_print(record.msg))) 
     80        else: 
     81            returns.append(str(record.msg)) 
     82        if record.exc_info: 
     83            returns.append(self.formatException(record.exc_info)) 
     84        return '\n'.join(returns) 
     85 
     86class FragmentingSysLogHandler(logging.handlers.SysLogHandler): 
     87    '''This handler fragments messages into chunks smaller than 250 characters''' 
     88 
     89    def __init__(self, procname, path, facility): 
     90        self.procname = procname 
     91        self.unixsocket = False 
     92        logging.handlers.SysLogHandler.__init__(self, path, facility) 
     93 
     94    def emit(self, record): 
     95        '''chunk and deliver records''' 
     96        record.name = self.procname 
     97        if str(record.msg) > 250: 
     98            msgs = [] 
     99            error = record.exc_info 
     100            record.exc_info = None 
     101            msgdata = record.msg 
     102            while msgdata: 
     103                newrec = copy.deepcopy(record) 
     104                newrec.msg = msgdata[:250] 
     105                msgs.append(newrec) 
     106                msgdata = msgdata[250:] 
     107            msgs[0].exc_info = error 
     108        else: 
     109            msgs = [record] 
     110        while msgs: 
     111            newrec = msgs.pop() 
     112            msg = self.log_format_string % (self.encodePriority(self.facility, 
     113                                                                newrec.levelname.lower()), self.format(newrec)) 
     114            try: 
     115                self.socket.send(msg) 
     116            except socket.error: 
     117                while True: 
     118                    try: 
     119                        if isinstance(self.address, types.TupleType): 
     120                            self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
     121                        else: 
     122                            self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) 
     123                        self.socket.connect(self.address) 
     124                        break 
     125                    except socket.error: 
     126                        continue 
     127                self.socket.send("Reconnected to syslog") 
     128                self.socket.send(msg) 
     129 
     130def setup_logging(procname, to_console=True, to_syslog=True, syslog_facility='daemon', level=0): 
     131    '''setup logging for bcfg2 software''' 
     132    if hasattr(logging, 'already_setup'): 
     133        return  
     134    # add the handler to the root logger 
     135    if to_console: 
     136        console = logging.StreamHandler(sys.stdout) 
     137        console.setLevel(logging.DEBUG) 
     138        # tell the handler to use this format 
     139        console.setFormatter(TermiosFormatter()) 
     140        logging.root.addHandler(console) 
     141    if to_syslog: 
     142        try: 
     143            try: 
     144                syslog = FragmentingSysLogHandler(procname, '/dev/log', syslog_facility) 
     145            except socket.error: 
     146                syslog = FragmentingSysLogHandler(procname, ('localhost', 514), syslog_facility) 
     147            syslog.setLevel(logging.DEBUG) 
     148            syslog.setFormatter(logging.Formatter('%(name)s[%(process)d]: %(message)s')) 
     149            logging.root.addHandler(syslog) 
     150        except socket.error: 
     151            logging.root.error("failed to activate syslogging") 
     152        except: 
     153            print "Failed to activate syslogging" 
     154    logging.root.setLevel(level) 
     155    logging.already_setup = True 
  • deleted file src/lib/Logging.py

    diff --git a/src/lib/Logging.py b/src/lib/Logging.py
    deleted file mode 100644
    index 4295380..0000000
    + -  
    1 '''Bcfg2 logging support''' 
    2 __revision__ = '$Revision$' 
    3  
    4 import copy, fcntl, logging, logging.handlers, math, socket, struct, sys, termios, types 
    5  
    6 logging.raiseExceptions=0 
    7  
    8 def print_attributes(attrib): 
    9     ''' Add the attributes for an element''' 
    10     return ' '.join(['%s="%s"' % data for data in attrib.iteritems()]) 
    11  
    12 def print_text(text): 
    13     ''' Add text to the output (which will need normalising ''' 
    14     charmap = {'<':'&lt;', '>':'&gt;', '&':'&amp;'} 
    15     return ''.join([charmap.get(char, char) for char in text]) + '\n' 
    16          
    17 def xml_print(element, running_indent=0, indent=4): 
    18     ''' Add an element and its children to the return string ''' 
    19     if (len(element.getchildren()) == 0) and (not element.text): 
    20         ret = (' ' * running_indent) 
    21         ret += '<%s %s/>\n' % (element.tag, print_attributes(element.attrib)) 
    22     else: 
    23         child_indent = running_indent + indent 
    24         ret = (' ' * running_indent) 
    25         ret += '<%s%s>\n' % (element.tag, print_attributes(element)) 
    26         if element.text:                 
    27             ret += (' '* child_indent) + print_text(element.text) 
    28         for child in element.getchildren(): 
    29             ret += xml_print(child, child_indent, indent) 
    30             ret += (' ' * running_indent) +  '</%s>\n' % (element.tag) 
    31         if element.tail: 
    32             ret += (' ' * child_indent) + print_text(element.tail) 
    33     return ret 
    34  
    35 class TermiosFormatter(logging.Formatter): 
    36     '''The termios formatter displays output in a terminal-sensitive fashion''' 
    37  
    38     def __init__(self, fmt=None, datefmt=None): 
    39         logging.Formatter.__init__(self, fmt, datefmt) 
    40         if sys.stdout.isatty(): 
    41             # now get termios info 
    42             try: 
    43                 self.width = struct.unpack('hhhh', fcntl.ioctl(0, termios.TIOCGWINSZ, 
    44                                                                "\000"*8))[1] 
    45                 if self.width == 0: 
    46                     self.width = 80 
    47             except: 
    48                 self.width = 80 
    49         else: 
    50             # output to a pipe 
    51             self.width = 32768 
    52  
    53     def format(self, record): 
    54         '''format a record for display''' 
    55         returns = [] 
    56         line_len = self.width 
    57         if type(record.msg) in types.StringTypes: 
    58             for line in record.msg.split('\n'): 
    59                 if len(line) <= line_len: 
    60                     returns.append(line) 
    61                 else: 
    62                     inner_lines = int(math.floor(float(len(line)) / line_len))+1 
    63                     for i in xrange(inner_lines): 
    64                         returns.append("%s" % (line[i*line_len:(i+1)*line_len])) 
    65         elif type(record.msg) == types.ListType: 
    66             if not record.msg: 
    67                 return '' 
    68             record.msg.sort() 
    69             msgwidth = self.width 
    70             columnWidth = max([len(item) for item in record.msg]) 
    71             columns = int(math.floor(float(msgwidth) / (columnWidth+2))) 
    72             lines = int(math.ceil(float(len(record.msg)) / columns)) 
    73             for lineNumber in xrange(lines): 
    74                 indices = [idx for idx in [(colNum * lines) + lineNumber 
    75                                            for colNum in range(columns)] if idx < len(record.msg)] 
    76                 format = (len(indices) * (" %%-%ds " % columnWidth)) 
    77                 returns.append(format % tuple([record.msg[idx] for idx in indices])) 
    78         #elif type(record.msg) == lxml.etree._Element: 
    79         #    returns.append(str(xml_print(record.msg))) 
    80         else: 
    81             returns.append(str(record.msg)) 
    82         if record.exc_info: 
    83             returns.append(self.formatException(record.exc_info)) 
    84         return '\n'.join(returns) 
    85  
    86 class FragmentingSysLogHandler(logging.handlers.SysLogHandler): 
    87     '''This handler fragments messages into chunks smaller than 250 characters''' 
    88  
    89     def __init__(self, procname, path, facility): 
    90         self.procname = procname 
    91         self.unixsocket = False 
    92         logging.handlers.SysLogHandler.__init__(self, path, facility) 
    93  
    94     def emit(self, record): 
    95         '''chunk and deliver records''' 
    96         record.name = self.procname 
    97         if str(record.msg) > 250: 
    98             msgs = [] 
    99             error = record.exc_info 
    100             record.exc_info = None 
    101             msgdata = record.msg 
    102             while msgdata: 
    103                 newrec = copy.deepcopy(record) 
    104                 newrec.msg = msgdata[:250] 
    105                 msgs.append(newrec) 
    106                 msgdata = msgdata[250:] 
    107             msgs[0].exc_info = error 
    108         else: 
    109             msgs = [record] 
    110         while msgs: 
    111             newrec = msgs.pop() 
    112             msg = self.log_format_string % (self.encodePriority(self.facility, 
    113                                                                 newrec.levelname.lower()), self.format(newrec)) 
    114             try: 
    115                 self.socket.send(msg) 
    116             except socket.error: 
    117                 while True: 
    118                     try: 
    119                         if isinstance(self.address, types.TupleType): 
    120                             self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    121                         else: 
    122                             self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) 
    123                         self.socket.connect(self.address) 
    124                         break 
    125                     except socket.error: 
    126                         continue 
    127                 self.socket.send("Reconnected to syslog") 
    128                 self.socket.send(msg) 
    129  
    130 def setup_logging(procname, to_console=True, to_syslog=True, syslog_facility='daemon', level=0): 
    131     '''setup logging for bcfg2 software''' 
    132     if hasattr(logging, 'already_setup'): 
    133         return  
    134     # add the handler to the root logger 
    135     if to_console: 
    136         console = logging.StreamHandler(sys.stdout) 
    137         console.setLevel(logging.DEBUG) 
    138         # tell the handler to use this format 
    139         console.setFormatter(TermiosFormatter()) 
    140         logging.root.addHandler(console) 
    141     if to_syslog: 
    142         try: 
    143             try: 
    144                 syslog = FragmentingSysLogHandler(procname, '/dev/log', syslog_facility) 
    145             except socket.error: 
    146                 syslog = FragmentingSysLogHandler(procname, ('localhost', 514), syslog_facility) 
    147             syslog.setLevel(logging.DEBUG) 
    148             syslog.setFormatter(logging.Formatter('%(name)s[%(process)d]: %(message)s')) 
    149             logging.root.addHandler(syslog) 
    150         except socket.error: 
    151             logging.root.error("failed to activate syslogging") 
    152         except: 
    153             print "Failed to activate syslogging" 
    154     logging.root.setLevel(level) 
    155     logging.already_setup = True 
  • src/lib/Server/Admin/Query.py

    diff --git a/src/lib/Server/Admin/Query.py b/src/lib/Server/Admin/Query.py
    index 322329b..a0cfa9f 100644
    a b  
    1 import Bcfg2.Server.Admin, Bcfg2.Logging, logging 
     1import Bcfg2.Server.Admin, Bcfg2.Logger, logging 
    22 
    33class Query(Bcfg2.Server.Admin.Mode): 
    44    __shorthelp__ = 'bcfg2-admin query [-n] [-c] [-f filename] g=group p=profile' 
    55    __longhelp__ = __shorthelp__ + '\n\tQuery clients' 
    66    def __init__(self, cfile): 
    77        logging.root.setLevel(100) 
    8         Bcfg2.Logging.setup_logging(100, to_console=False, to_syslog=False) 
     8        Bcfg2.Logger.setup_logging(100, to_console=False, to_syslog=False) 
    99        Bcfg2.Server.Admin.Mode.__init__(self, cfile) 
    1010        try: 
    1111            self.bcore = Bcfg2.Server.Core.Core(self.get_repo_path(), 
  • src/lib/__init__.py

    diff --git a/src/lib/__init__.py b/src/lib/__init__.py
    index 7f771da..a6300af 100644
    a b  
    11'''base modules definition''' 
    22__revision__ = '$Revision$' 
    33 
    4 __all__ = ['Server', 'Client', 'Component', 'Logging', 'Options', 'Proxy'] 
     4__all__ = ['Server', 'Client', 'Component', 'Logger', 'Options', 'Proxy'] 
  • src/sbin/bcfg2

    diff --git a/src/sbin/bcfg2 b/src/sbin/bcfg2
    index 472eab7..d713819 100755
    a b from Bcfg2.Component import SimpleXMLRPCServer, ComponentInitError, ComponentKey 
    2020from Bcfg2.tlslite.errors import TLSNoAuthenticationError, TLSFingerprintError 
    2121 
    2222import Bcfg2.Proxy 
    23 import Bcfg2.Logging 
     23import Bcfg2.Logger 
    2424 
    2525logger = logging.getLogger('bcfg2') 
    2626 
    class Client: 
    130130            level = 20 
    131131        if self.setup['debug']: 
    132132            level = 0 
    133         Bcfg2.Logging.setup_logging('bcfg2', to_syslog=False, level=level) 
     133        Bcfg2.Logger.setup_logging('bcfg2', to_syslog=False, level=level) 
    134134        self.logger = logging.getLogger('bcfg2') 
    135135        self.logger.debug(self.setup) 
    136136        if 'drivers' in self.setup and self.setup['drivers'] == 'help': 
  • src/sbin/bcfg2-admin

    diff --git a/src/sbin/bcfg2-admin b/src/sbin/bcfg2-admin
    index bb44bbc..1cc8ca2 100755
    a b  
    22'''bcfg2-admin is a script that helps to administrate a bcfg2 deployment''' 
    33 
    44import getopt, logging, sys 
    5 import Bcfg2.Server.Core, Bcfg2.Logging, Bcfg2.Options 
     5import Bcfg2.Server.Core, Bcfg2.Logger, Bcfg2.Options 
    66 
    77log = logging.getLogger('bcfg-admin') 
    88 
    def mode_import(modename): 
    1616    return getattr(mod, modname) 
    1717 
    1818if __name__ == '__main__': 
    19     Bcfg2.Logging.setup_logging('bcfg2-admin', to_console=True) 
     19    Bcfg2.Logger.setup_logging('bcfg2-admin', to_console=True) 
    2020    # Get config file path 
    2121    configfile = Bcfg2.Options.CFILE.default 
    2222    try: 
  • src/sbin/bcfg2-info

    diff --git a/src/sbin/bcfg2-info b/src/sbin/bcfg2-info
    index dac7fa6..0f5ad8f 100755
    a b  
    33__revision__ = '$Revision$' 
    44 
    55import copy, logging, lxml.etree, sys, time, cmd 
    6 import Bcfg2.Logging, Bcfg2.Server.Core, os 
     6import Bcfg2.Logger, Bcfg2.Server.Core, os 
    77import Bcfg2.Server.Plugins.Metadata, Bcfg2.Server.Plugin 
    88import Bcfg2.Options 
    99 
    Usage: [quit|exit]""" 
    262262        self.fam.debug = True 
    263263 
    264264if __name__ == '__main__': 
    265     Bcfg2.Logging.setup_logging('bcfg2-info', to_syslog=False) 
     265    Bcfg2.Logger.setup_logging('bcfg2-info', to_syslog=False) 
    266266    optinfo = { 
    267267            'configfile': Bcfg2.Options.CFILE,  
    268268            'help': Bcfg2.Options.HELP, 
  • src/sbin/bcfg2-remote

    diff --git a/src/sbin/bcfg2-remote b/src/sbin/bcfg2-remote
    index c33fcfb..ee52d62 100755
    a b __revision__ = '$Revision$' 
    44from Bcfg2.tlslite.api import parsePEMKey, X509, X509CertChain 
    55from xmlrpclib import ServerProxy 
    66from Bcfg2.tlslite.integration.XMLRPCTransport import XMLRPCTransport 
    7 import Bcfg2.Options, Bcfg2.Logging, logging, socket, sys 
     7import Bcfg2.Options, Bcfg2.Logger, logging, socket, sys 
    88 
    99if __name__ == '__main__': 
    1010    opts = { 
    if __name__ == '__main__': 
    1616        } 
    1717    setup = Bcfg2.Options.OptionParser(opts) 
    1818    setup.parse(sys.argv[1:]) 
    19     Bcfg2.Logging.setup_logging('bcfg2-remote', 
     19    Bcfg2.Logger.setup_logging('bcfg2-remote', 
    2020                                to_syslog=False, 
    2121                                level=int(setup['debug'])) 
    2222    logger = logging.getLogger('bcfg2-remote') 
  • src/sbin/bcfg2-server

    diff --git a/src/sbin/bcfg2-server b/src/sbin/bcfg2-server
    index a5c5310..263d52b 100755
    a b from xmlrpclib import Fault 
    1010from lxml.etree import XML, Element, tostring 
    1111 
    1212import logging, select, signal, socket, sys 
    13 import Bcfg2.Logging, Bcfg2.Options, Bcfg2.Component, Bcfg2.Daemon 
     13import Bcfg2.Logger, Bcfg2.Options, Bcfg2.Component, Bcfg2.Daemon 
    1414 
    1515logger = logging.getLogger('bcfg2-server') 
    1616 
    if __name__ == '__main__': 
    211211 
    212212    level = 0 
    213213    if setup['daemon']: 
    214         Bcfg2.Logging.setup_logging('bcfg2-server', to_console=False, level=level) 
     214        Bcfg2.Logger.setup_logging('bcfg2-server', to_console=False, level=level) 
    215215        Bcfg2.Daemon.daemonize(setup['daemon']) 
    216216    else: 
    217         Bcfg2.Logging.setup_logging('bcfg2-server', level=level) 
     217        Bcfg2.Logger.setup_logging('bcfg2-server', level=level) 
    218218 
    219219    if not setup['key']: 
    220220        print "No key specified in '%s'" % setup['configfile'] 
  • tools/bcfg2-export-config

    diff --git a/tools/bcfg2-export-config b/tools/bcfg2-export-config
    index 25513cb..569eb01 100755
    a b user,group,permission,/path/to/file 
    1818''' 
    1919__revision__ = '$Revision: 221 $' 
    2020 
    21 import logging, lxml.etree, Bcfg2.Logging, Bcfg2.Server.Core 
     21import logging, lxml.etree, Bcfg2.Logger, Bcfg2.Server.Core 
    2222import Bcfg2.Server.Plugins.Metadata, Bcfg2.Server.Plugin 
    2323import sys,os,time,errno 
    2424from optparse import OptionParser 
    def handleConfigFileEntry(indexfile, cfg): 
    8585  logger.info("<<<") 
    8686 
    8787if __name__ == '__main__': 
    88   Bcfg2.Logging.setup_logging('%s' % TOOLNAME, to_syslog=False) 
     88  Bcfg2.Logger.setup_logging('%s' % TOOLNAME, to_syslog=False) 
    8989  logger = logging.getLogger('%s' % TOOLNAME) 
    9090 
    9191  # parse command line options, arguments