summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNarayan Desai <desai@mcs.anl.gov>2004-10-19 18:22:16 +0000
committerNarayan Desai <desai@mcs.anl.gov>2004-10-19 18:22:16 +0000
commit853220b7567cb814567d38bf7d0924fd4ebd2d1c (patch)
treed9c49b5b1abaed9b47d3e31da3174014027472e5
parente4848caced7538908e628a8007395997a41be6c9 (diff)
downloadbcfg2-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
-rw-r--r--src/lib/Server/Generators/cfg.py89
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'