diff options
author | Narayan Desai <desai@mcs.anl.gov> | 2004-10-19 18:22:16 +0000 |
---|---|---|
committer | Narayan Desai <desai@mcs.anl.gov> | 2004-10-19 18:22:16 +0000 |
commit | 853220b7567cb814567d38bf7d0924fd4ebd2d1c (patch) | |
tree | d9c49b5b1abaed9b47d3e31da3174014027472e5 /src/lib/Server/Generators | |
parent | e4848caced7538908e628a8007395997a41be6c9 (diff) | |
download | bcfg2-853220b7567cb814567d38bf7d0924fd4ebd2d1c.tar.gz bcfg2-853220b7567cb814567d38bf7d0924fd4ebd2d1c.tar.bz2 bcfg2-853220b7567cb814567d38bf7d0924fd4ebd2d1c.zip |
pylint fixes
(Logical change 1.100)
git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@455 ce84e21b-d406-0410-9b95-82705330c041
Diffstat (limited to 'src/lib/Server/Generators')
-rw-r--r-- | src/lib/Server/Generators/cfg.py | 89 |
1 files changed, 54 insertions, 35 deletions
diff --git a/src/lib/Server/Generators/cfg.py b/src/lib/Server/Generators/cfg.py index 622c3cdf9..a18445a03 100644 --- a/src/lib/Server/Generators/cfg.py +++ b/src/lib/Server/Generators/cfg.py @@ -1,14 +1,19 @@ #!/usr/bin/env python +'''This module implements a config file repository''' +__revision__ = '$Revision$' + from binascii import b2a_base64 from os import stat -from re import compile +from re import compile as regcompile from stat import S_ISDIR, ST_MODE -from string import join from Bcfg2.Server.Generator import Generator, DirectoryBacked, FileBacked from Bcfg2.Server.Metadata import Metadata +class CfgFileException(Exception): + pass + class FileEntry(FileBacked): '''The File Entry class pertains to the config files contained in a particular directory. This includes :info, all base files and deltas''' @@ -18,6 +23,7 @@ class FileEntry(FileBacked): self.metadata = metadata def Applies(self, other): + '''redirect to metadata.Applies''' return self.metadata.Applies(other) def __cmp__(self, other): @@ -25,10 +31,13 @@ class FileEntry(FileBacked): return self.metadata.__cmp__(other.metadata) class ConfigFileEntry(object): - mx = compile("(^(?P<filename>.*)(\.((B(?P<bprio>\d+)_(?P<bundle>\S+))|(A(?P<aprio>\d+)_(?P<attr>\S+))|(I(?P<iprio>\d+)_(?P<image>\S+))|(I(?P<cprio>\d+)_(?P<class>\S+))|(H_(?P<hostname>\S+)))(\.(?P<op>cat|udiff))?)?$)") - info = compile('^owner:(\s)*(?P<owner>\w+)|group:(\s)*(?P<group>\w+)|perms:(\s)*(?P<perms>\w+)|encoding:(\s)*(?P<encoding>\w+)|(?P<paranoid>paranoid(\s)*)$') + '''ConfigFileEntry is a repository entry for a single file, containing + all data for all clients.''' + mx = regcompile("(^(?P<filename>.*)(\.((B(?P<bprio>\d+)_(?P<bundle>\S+))|(A(?P<aprio>\d+)_(?P<attr>\S+))|(I(?P<iprio>\d+)_(?P<image>\S+))|(I(?P<cprio>\d+)_(?P<class>\S+))|(H_(?P<hostname>\S+)))(\.(?P<op>cat|udiff))?)?$)") + info = regcompile('^owner:(\s)*(?P<owner>\w+)|group:(\s)*(?P<group>\w+)|perms:(\s)*(?P<perms>\w+)|encoding:(\s)*(?P<encoding>\w+)|(?P<paranoid>paranoid(\s)*)$') def __init__(self, path): + object.__init__(self) self.path = path self.basefiles = [] self.deltas = [] @@ -38,38 +47,41 @@ class ConfigFileEntry(object): self.perms = '0644' self.paranoid = False - def GetInfo(self, filename): + def read_info(self, filename): + '''read in :info metadata''' for line in open(filename).readlines(): - m = self.info.match(line) - if not m: + match = self.info.match(line) + if not match: continue else: - d = m.groupdict() - if d['owner']: - self.owner=d['owner'] - elif d['group']: - self.group=d['group'] - elif d['encoding']: - self.encoding=d['encoding'] - elif d['perms']: - self.perms=d['perms'] + mgd = match.groupdict() + if mgd['owner']: + self.owner = mgd['owner'] + elif mgd['group']: + self.group = mgd['group'] + elif mgd['encoding']: + self.encoding = mgd['encoding'] + elif mgd['perms']: + self.perms = mgd['perms'] if len(self.perms) == 3: - self.perms="0%s"%(self.perms) - elif d['paranoid']: + self.perms = "0%s" % (self.perms) + elif mgd['paranoid']: self.paranoid = True def AddEntry(self, name): + '''add new file additions for a single cf file''' if name[-5:] == ':info': - return self.GetInfo(name) + return self.read_info(name) g = self.mx.match(name) if g == None: - print "match failed for file name %s"%(name) + print "match failed for file name %s" % (name) return data = {} for attr in ['bundle', 'attr', 'hostname', 'class']: - if g.group(attr) != None: data[attr] = g.group(attr) + if g.group(attr) != None: + data[attr] = g.group(attr) if data == {}: all = True else: @@ -88,9 +100,10 @@ class ConfigFileEntry(object): # need to sort here def HandleEvent(self, event): + '''Handle FAM updates''' action = event.code2str() if event.filename[-5:] == ':info': - return self.GetInfo(event.filename) + return self.read_info(event.filename) for l in [self.basefiles, self.deltas]: for entry in l: if entry.name.split('/')[-1] == event.filename: @@ -99,25 +112,27 @@ class ConfigFileEntry(object): elif action == 'deleted': l.remove(entry) else: - print "unhandled action %s"%(action) + print "unhandled action %s" % (action) def GetConfigFile(self, entry, metadata): + '''Fetch config file from repository''' name = entry.attrib['name'] filedata = "" # first find basefile try: - basefile = filter(lambda x:x.Applies(metadata), self.basefiles)[0] + basefile = [x for x in self.basefiles if x.Applies(metadata)][0] except IndexError: - raise CfgFileException, ('basefile', self.name) + raise CfgFileException, ('basefile', name) filedata += basefile.data # find applicable deltas - deltas = filter(lambda x:x.Applies(metadata), self.deltas) + deltas = [x for x in self.deltas if x.Applies(metadata)] # filter for more specific for delta in deltas: pass # apply diffs, etc - entry.attrib.update({'owner':self.owner, 'group':self.group, 'perms':self.perms, 'encoding':self.encoding}) + entry.attrib.update({'owner':self.owner, 'group':self.group, + 'perms':self.perms, 'encoding':self.encoding}) if self.paranoid: entry.attrib['paranoid'] = 'true' if self.encoding == 'base64': @@ -136,26 +151,28 @@ class ConfigFileRepository(DirectoryBacked): self.famID = {} self.directories = [] self.AddDirectoryMonitor(self.name) - # eventually flush fam events here so that all generators come out of constructors + # eventually flush fam events here so that all entries built here # ready to go def AddDirectoryMonitor(self, name): + '''Add new directory to FAM structures''' if name not in self.directories: try: stat(name) - except: - print "Failed to open %s"%(name) + except OSError: + print "Failed to open %s" % (name) return - id = self.fam.AddMonitor(name, self) - self.famID[id] = name + reqid = self.fam.AddMonitor(name, self) + self.famID[reqid] = name self.directories.append(name) def AddEntry(self, name): + '''Add new entry to FAM structures''' if S_ISDIR(stat(name)[ST_MODE]): self.AddDirectoryMonitor(name) else: # file entries shouldn't contain path-to-repo - shortname = '/'+ join(name[len(self.name)+1:].split('/')[:-1], '/') + shortname = '/'+ '/'.join(name[len(self.name)+1:].split('/')[:-1]) if not self.entries.has_key(shortname): self.entries[shortname] = ConfigFileEntry(shortname) self.provides[shortname] = self.entries[shortname].GetConfigFile @@ -163,9 +180,10 @@ class ConfigFileRepository(DirectoryBacked): #self.entries[shortname].HandleEvent() def HandleEvent(self, event): + '''Handle FAM updates''' action = event.code2str() if event.filename[0] != '/': - filename = "%s/%s"%(self.famID[event.requestID], event.filename) + filename = "%s/%s" % (self.famID[event.requestID], event.filename) else: filename = event.filename if action == 'exists': @@ -185,9 +203,10 @@ class ConfigFileRepository(DirectoryBacked): elif action in ['endExist']: pass else: - print "Got unknown event %s %s %s"%(event.requestID, event.code2str(), event.filename) + print "Got unknown event %s %s %s" % (event.requestID, event.code2str(), event.filename) class cfg(Generator): + '''This generator manages the configuration file repository for bcfg2''' __name__ = 'cfg' __version__ = '$Id$' __author__ = 'bcfg-dev@mcs.anl.gov' |