diff options
author | Fabian Affolter <fabian@bernewireless.net> | 2010-12-08 23:27:15 +0100 |
---|---|---|
committer | Fabian Affolter <fabian@bernewireless.net> | 2010-12-08 23:27:15 +0100 |
commit | e833a7a76b231cd346f09c9a422ecb855d1cc6b4 (patch) | |
tree | e2762fc31e1162a6859dbd6cd7b5c28208296d9d /build/lib/Bcfg2/Server/Admin/__init__.py | |
parent | baf5854f414c2a35887e3fbbcfd094e12e7c6ee7 (diff) | |
download | bcfg2-e833a7a76b231cd346f09c9a422ecb855d1cc6b4.tar.gz bcfg2-e833a7a76b231cd346f09c9a422ecb855d1cc6b4.tar.bz2 bcfg2-e833a7a76b231cd346f09c9a422ecb855d1cc6b4.zip |
Merge with upstream
Diffstat (limited to 'build/lib/Bcfg2/Server/Admin/__init__.py')
-rw-r--r-- | build/lib/Bcfg2/Server/Admin/__init__.py | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/build/lib/Bcfg2/Server/Admin/__init__.py b/build/lib/Bcfg2/Server/Admin/__init__.py new file mode 100644 index 000000000..bb5c41895 --- /dev/null +++ b/build/lib/Bcfg2/Server/Admin/__init__.py @@ -0,0 +1,114 @@ +__revision__ = '$Revision$' + +__all__ = ['Mode', 'Client', 'Compare', 'Init', 'Minestruct', 'Perf', + 'Pull', 'Query', 'Reports', 'Snapshots', 'Tidy', 'Viz', + 'Xcmd', 'Group', 'Backup'] + +import ConfigParser +import logging +import lxml.etree +import sys + +import Bcfg2.Server.Core +import Bcfg2.Options + +class ModeOperationError(Exception): + pass + +class Mode(object): + """Help message has not yet been added for mode.""" + __shorthelp__ = 'Shorthelp not defined yet' + __longhelp__ = 'Longhelp not defined yet' + __args__ = [] + def __init__(self, configfile): + self.configfile = configfile + self.__cfp = False + self.log = logging.getLogger('Bcfg2.Server.Admin.Mode') + + def getCFP(self): + if not self.__cfp: + self.__cfp = ConfigParser.ConfigParser() + self.__cfp.read(self.configfile) + return self.__cfp + + cfp = property(getCFP) + + def __call__(self, args): + if len(args) > 0 and args[0] == 'help': + print self.__longhelp__ + raise SystemExit(0) + + def errExit(self, emsg): + print emsg + raise SystemExit(1) + + def get_repo_path(self): + """Return repository path""" + return self.cfp.get('server', 'repository') + + def load_stats(self, client): + stats = lxml.etree.parse("%s/etc/statistics.xml" % + (self.get_repo_path())) + hostent = stats.xpath('//Node[@name="%s"]' % client) + if not hostent: + self.errExit("Could not find stats for client %s" % (client)) + return hostent[0] + + def print_table(self, rows, justify='left', hdr=True, vdelim=" ", padding=1): + """Pretty print a table + + rows - list of rows ([[row 1], [row 2], ..., [row n]]) + hdr - if True the first row is treated as a table header + vdelim - vertical delimiter between columns + padding - # of spaces around the longest element in the column + justify - may be left,center,right + + """ + hdelim = "=" + justify = {'left':str.ljust, + 'center':str.center, + 'right':str.rjust}[justify.lower()] + + """ + Calculate column widths (longest item in each column + plus padding on both sides) + + """ + cols = list(zip(*rows)) + colWidths = [max([len(str(item))+2*padding for \ + item in col]) for col in cols] + borderline = vdelim.join([w*hdelim for w in colWidths]) + + # print out the table + print(borderline) + for row in rows: + print(vdelim.join([justify(str(item), width) for \ + (item, width) in zip(row, colWidths)])) + if hdr: + print(borderline) + hdr = False + +class MetadataCore(Mode): + """Base class for admin-modes that handle metadata.""" + def __init__(self, configfile, usage, pwhitelist=None, pblacklist=None): + Mode.__init__(self, configfile) + options = {'plugins': Bcfg2.Options.SERVER_PLUGINS, + 'configfile': Bcfg2.Options.CFILE} + setup = Bcfg2.Options.OptionParser(options) + setup.hm = usage + setup.parse(sys.argv[1:]) + if pwhitelist is not None: + setup['plugins'] = [x for x in setup['plugins'] if x in pwhitelist] + elif pblacklist is not None: + setup['plugins'] = [x for x in setup['plugins'] if x not in pblacklist] + try: + self.bcore = Bcfg2.Server.Core.Core(self.get_repo_path(), + setup['plugins'], + 'foo', 'UTF-8') + except Bcfg2.Server.Core.CoreInitError, msg: + self.errExit("Core load failed because %s" % msg) + self.bcore.fam.handle_events_in_interval(5) + self.metadata = self.bcore.metadata + +class StructureMode(MetadataCore): + pass |