From 5b8fd8cb103f31ef0d67c0fd4bbedfec0988c6af Mon Sep 17 00:00:00 2001 From: Sol Jerome Date: Tue, 13 Jan 2009 20:00:16 +0000 Subject: Add support for alternate VCS backends git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@5023 ce84e21b-d406-0410-9b95-82705330c041 --- src/lib/Options.py | 7 ++-- src/lib/Server/Core.py | 38 +++++++++++++++++----- src/lib/Server/Reports/importscript.py | 16 ++++----- .../Reports/reports/fixtures/initial_version.xml | 4 +++ src/lib/Server/Reports/reports/models_new.py | 2 +- src/lib/Server/Reports/reports/models_old.py | 2 +- .../reports/templates/clients/client-nodebox.html | 2 +- src/lib/Server/Reports/updatefix.py | 4 ++- src/sbin/bcfg2-info | 10 +++--- src/sbin/bcfg2-server | 6 ++-- 10 files changed, 60 insertions(+), 31 deletions(-) (limited to 'src') diff --git a/src/lib/Options.py b/src/lib/Options.py index 0933b61cf..fd31fa05b 100644 --- a/src/lib/Options.py +++ b/src/lib/Options.py @@ -1,5 +1,5 @@ '''Option parsing library for utilities''' -__revision__ = '$Revision$' +__revision__ = '$Revision: 5000 $' import getopt, os, socket, sys, ConfigParser, Bcfg2.Client.Tools @@ -127,7 +127,7 @@ class OptionSet(dict): def buildHelpMessage(self): if hasattr(self, 'hm'): return self.hm - return ''.join([opt.buildHelpMessage() for opt in self.values()]) + return ' '.join([opt.buildHelpMessage() for opt in self.values()]) def helpExit(self, msg='', code=1): if msg: @@ -177,7 +177,8 @@ DAEMON = Option("Daemonize process, storing pid", False, SERVER_REPOSITORY = Option('Server repository path', '/var/lib/bcfg2', cf=('server', 'repository'), cmd='-Q', odesc='' ) -SERVER_SVN = Option('Server svn support', False, cf=('server', 'svn')) +SERVER_VCS = Option('Server vcs support', cf=('server', 'vcs'), + default='default') SERVER_PLUGINS = Option('Server plugin list', cf=('server', 'plugins'), default=[], cook=list_split) SERVER_GENERATORS = Option('Server generator list', cf=('server', 'generators'), diff --git a/src/lib/Server/Core.py b/src/lib/Server/Core.py index 0961ed23a..a99af4aa9 100644 --- a/src/lib/Server/Core.py +++ b/src/lib/Server/Core.py @@ -1,5 +1,9 @@ '''Bcfg2.Server.Core provides the runtime support for bcfg2 modules''' -__revision__ = '$Revision$' +__revision__ = '$Revision: 5014 $' + +from ConfigParser import ConfigParser, NoSectionError, NoOptionError +c = ConfigParser() +c.read('/etc/bcfg2.conf') from time import time @@ -24,7 +28,7 @@ class CoreInitError(Exception): class Core(object): '''The Core object is the container for all Bcfg2 Server logic, and modules''' - def __init__(self, repo, plugins, password, svn, encoding, + def __init__(self, repo, plugins, password, vcs, encoding, filemonitor='default'): object.__init__(self) self.datastore = repo @@ -41,13 +45,15 @@ class Core(object): self.plugins = {} self.revision = '-1' self.password = password - self.svn = svn self.encoding = encoding try: - if self.svn: + self.vcs = c.get('server', 'vcs') + if self.vcs == 'svn': self.read_svn_revision() + elif self.vcs == 'git': + self.read_git_revision() except: - self.svn = False + self.vcs = 'none' if '' in plugins: plugins.remove('') @@ -208,8 +214,24 @@ class Core(object): def Service(self): '''Perform periodic update tasks''' count = self.fam.Service() - if count and self.svn: - self.read_svn_revision() + if count: + if self.vcs == 'svn': + self.read_svn_revision() + elif self.vcs == 'git': + self.read_git_revision() + + def read_git_revision(self): + try: + data = os.popen("env LC_ALL=C git ls-remote %s" % + (self.datastore)).readlines() + revline = [line.split('\t')[0].strip() for line in data if \ + line.split('\t')[1].strip() == 'refs/heads/master'][-1] + self.revision = revline + except IndexError: + logger.error("Failed to read git ls-remote; disabling git support") + logger.error('''Ran command "git ls-remote %s"''' % (self.datastore)) + logger.error("Got output: %s" % data) + self.vcs = 'none' def read_svn_revision(self): '''Read svn revision information for the bcfg2 repository''' @@ -223,7 +245,7 @@ class Core(object): logger.error("Failed to read svn info; disabling svn support") logger.error('''Ran command "svn info %s"''' % (self.datastore)) logger.error("Got output: %s" % data) - self.svn = False + self.vcs = 'none' def GetDecisions(self, metadata, mode): result = [] diff --git a/src/lib/Server/Reports/importscript.py b/src/lib/Server/Reports/importscript.py index 763056c20..bb26647f2 100755 --- a/src/lib/Server/Reports/importscript.py +++ b/src/lib/Server/Reports/importscript.py @@ -1,6 +1,6 @@ #! /usr/bin/env python '''Imports statistics.xml and clients.xml files in to database backend for new statistics engine''' -__revision__ = '$Revision$' +__revision__ = '$Revision: 4999 $' import os, sys, binascii try: @@ -98,13 +98,13 @@ def load_stats(cdata, sdata, vlevel, quick=False, location=''): continue else: newint = Interaction(client=c_inst, - timestamp=timestamp, - state=statistics.get('state', default="unknown"), - repo_revision=statistics.get('revision',default="unknown"), - client_version=statistics.get('client_version',default="unknown"), - goodcount=statistics.get('good',default="0"), - totalcount=statistics.get('total',default="0"), - server=location) + timestamp = timestamp, + state = statistics.get('state', default="unknown"), + repo_rev_code = statistics.get('revision',default="unknown"), + client_version = statistics.get('client_version',default="unknown"), + goodcount = statistics.get('good',default="0"), + totalcount = statistics.get('total',default="0"), + server = location) newint.save() current_interaction = newint if vlevel > 0: diff --git a/src/lib/Server/Reports/reports/fixtures/initial_version.xml b/src/lib/Server/Reports/reports/fixtures/initial_version.xml index 9edb8fe57..4fc05b7af 100644 --- a/src/lib/Server/Reports/reports/fixtures/initial_version.xml +++ b/src/lib/Server/Reports/reports/fixtures/initial_version.xml @@ -20,4 +20,8 @@ 10 2008-08-22 11:28:50 + + 11 + 2009-01-13 12:26:10 + diff --git a/src/lib/Server/Reports/reports/models_new.py b/src/lib/Server/Reports/reports/models_new.py index 3b1a005da..c8f649089 100644 --- a/src/lib/Server/Reports/reports/models_new.py +++ b/src/lib/Server/Reports/reports/models_new.py @@ -111,7 +111,7 @@ class Interaction(models.Model): client = models.ForeignKey(Client, related_name="interactions",) timestamp = models.DateTimeField()#Timestamp for this record state = models.CharField(max_length=32)#good/bad/modified/etc - repo_revision = models.IntegerField()#repo revision at time of interaction + repo_rev_code = models.CharField(max_length=64)#repo revision at time of interaction client_version = models.CharField(max_length=32)#Client Version goodcount = models.IntegerField()#of good config-items totalcount = models.IntegerField()#of total config-items diff --git a/src/lib/Server/Reports/reports/models_old.py b/src/lib/Server/Reports/reports/models_old.py index a45fb0d30..aee66fd7d 100644 --- a/src/lib/Server/Reports/reports/models_old.py +++ b/src/lib/Server/Reports/reports/models_old.py @@ -111,7 +111,7 @@ class Interaction(models.Model): client = models.ForeignKey(Client, related_name="interactions", core=True) timestamp = models.DateTimeField()#Timestamp for this record state = models.CharField(maxlength=32)#good/bad/modified/etc - repo_revision = models.IntegerField()#repo revision at time of interaction + repo_rev_code = models.CharField(maxlength=64)#repo revision at time of interaction client_version = models.CharField(maxlength=32)#Client Version goodcount = models.IntegerField()#of good config-items totalcount = models.IntegerField()#of total config-items diff --git a/src/lib/Server/Reports/reports/templates/clients/client-nodebox.html b/src/lib/Server/Reports/reports/templates/clients/client-nodebox.html index daa8bb245..5aae03c30 100644 --- a/src/lib/Server/Reports/reports/templates/clients/client-nodebox.html +++ b/src/lib/Server/Reports/reports/templates/clients/client-nodebox.html @@ -9,7 +9,7 @@

Node: {{client.name}}

- {% if interaction.repo_revision %}Revision: {{interaction.repo_revision}}{% endif %} + {% if interaction.repo_rev_code %}Revision: {{interaction.repo_rev_code}}{% endif %}
 
diff --git a/src/lib/Server/Reports/updatefix.py b/src/lib/Server/Reports/updatefix.py index f3679892e..4a35c31ea 100644 --- a/src/lib/Server/Reports/updatefix.py +++ b/src/lib/Server/Reports/updatefix.py @@ -60,6 +60,8 @@ _fixes = [_merge_database_table_entries, "drop table reports_repository;", "drop table reports_metadata;", "alter table reports_interaction add server varchar(256) not null default 'N/A';", + # fix revision data type to support $VCS hashes + "alter table reports_interaction add repo_rev_code varchar(64) default '';", ] # this will calculate the last possible version of the database @@ -95,7 +97,7 @@ def dosync(): # if we get here with no error then the database has existing tables fresh = False except: - logger.debug("there was an error while detecting the freshnest of the database") + logger.debug("there was an error while detecting the freshness of the database") #we should get here if the database is new fresh = True diff --git a/src/sbin/bcfg2-info b/src/sbin/bcfg2-info index a4c3be83b..cf369bd4d 100755 --- a/src/sbin/bcfg2-info +++ b/src/sbin/bcfg2-info @@ -1,6 +1,6 @@ #!/usr/bin/python -i '''This tool loads the Bcfg2 core into an interactive debugger''' -__revision__ = '$Revision$' +__revision__ = '$Revision: 5014 $' import copy, logging, lxml.etree, sys, time, cmd import Bcfg2.Logger, Bcfg2.Server.Core, os @@ -24,10 +24,10 @@ def printTabular(rows): class infoCore(cmd.Cmd, Bcfg2.Server.Core.Core): - def __init__(self, repo, plgs, passwd, svn, encoding, event_debug): + def __init__(self, repo, plgs, passwd, vcs, encoding, event_debug): cmd.Cmd.__init__(self) try: - Bcfg2.Server.Core.Core.__init__(self, repo, plgs, passwd, svn, + Bcfg2.Server.Core.Core.__init__(self, repo, plgs, passwd, vcs, encoding) if event_debug: self.fam.debug = True @@ -293,7 +293,7 @@ if __name__ == '__main__': 'help': Bcfg2.Options.HELP, } optinfo.update({'repo': Bcfg2.Options.SERVER_REPOSITORY, - 'svn': Bcfg2.Options.SERVER_SVN, + 'vcs': Bcfg2.Options.SERVER_VCS, 'plugins': Bcfg2.Options.SERVER_PLUGINS, 'password': Bcfg2.Options.SERVER_PASSWORD, 'event debug': Bcfg2.Options.DEBUG, @@ -302,7 +302,7 @@ if __name__ == '__main__': setup.parse(sys.argv[1:]) print setup loop = infoCore(setup['repo'], setup['plugins'], - setup['password'], setup['svn'], setup['encoding'], + setup['password'], setup['vcs'], setup['encoding'], '-d' in sys.argv) if "args" in setup and setup['args']: loop.onecmd(" ".join(setup['args'])) diff --git a/src/sbin/bcfg2-server b/src/sbin/bcfg2-server index 98274be4a..48619c124 100755 --- a/src/sbin/bcfg2-server +++ b/src/sbin/bcfg2-server @@ -1,7 +1,7 @@ #!/usr/bin/env python '''The XML-RPC Bcfg2 Server''' -__revision__ = '$Revision$' +__revision__ = '$Revision: 5014 $' import Bcfg2.Server.Plugins.Metadata @@ -35,7 +35,7 @@ class Bcfg2Serv(Bcfg2.Component.Component): try: self.Core = Core(setup['repo'], setup['plugins'], setup['password'], - setup['svn'], setup['encoding'], setup['filemonitor']) + setup['vcs'], setup['encoding'], setup['filemonitor']) except CoreInitError, msg: logger.critical("Fatal error: %s" % (msg)) raise SystemExit, 1 @@ -197,7 +197,7 @@ if __name__ == '__main__': } OPTINFO.update({'repo': Bcfg2.Options.SERVER_REPOSITORY, - 'svn': Bcfg2.Options.SERVER_SVN, + 'vcs': Bcfg2.Options.SERVER_VCS, 'plugins': Bcfg2.Options.SERVER_PLUGINS, 'password': Bcfg2.Options.SERVER_PASSWORD, 'filemonitor': Bcfg2.Options.SERVER_FILEMONITOR, -- cgit v1.2.3-1-g7c22