From e833a7a76b231cd346f09c9a422ecb855d1cc6b4 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Wed, 8 Dec 2010 23:27:15 +0100 Subject: Merge with upstream --- src/lib/Server/Admin/20101204011521.tar.gz | Bin 0 -> 1269 bytes src/lib/Server/Admin/Examples.py | 71 ++++++++++++++++++++++++++ src/lib/Server/Admin/Web.py | 79 +++++++++++++++++++++++++++++ src/lib/Server/Admin/test.py | 73 ++++++++++++++++++++++++++ src/lib/Server/Plugins/__Web.py | 47 +++++++++++++++++ 5 files changed, 270 insertions(+) create mode 100644 src/lib/Server/Admin/20101204011521.tar.gz create mode 100644 src/lib/Server/Admin/Examples.py create mode 100644 src/lib/Server/Admin/Web.py create mode 100644 src/lib/Server/Admin/test.py create mode 100644 src/lib/Server/Plugins/__Web.py (limited to 'src') diff --git a/src/lib/Server/Admin/20101204011521.tar.gz b/src/lib/Server/Admin/20101204011521.tar.gz new file mode 100644 index 000000000..e14ae8fea Binary files /dev/null and b/src/lib/Server/Admin/20101204011521.tar.gz differ diff --git a/src/lib/Server/Admin/Examples.py b/src/lib/Server/Admin/Examples.py new file mode 100644 index 000000000..3335c5e10 --- /dev/null +++ b/src/lib/Server/Admin/Examples.py @@ -0,0 +1,71 @@ +import dulwich +import time +import tarfile +from subprocess import Popen +import Bcfg2.Server.Admin +from Bcfg2.Server.Plugins.Metadata import MetadataConsistencyError + +class Examples(Bcfg2.Server.Admin.MetadataCore): + __shorthelp__ = "Pulls in the data from the Bcfg2 sample repository" + __longhelp__ = (__shorthelp__ + "\n\nbcfg2-admin examples pull\n" + "\n\nbcfg2-admin examples update\n" + "bcfg2-admin examples backup") + __usage__ = ("bcfg2-admin examples [options] [add|del|update|list] [attr=val]") + + def __init__(self, configfile): + Bcfg2.Server.Admin.MetadataCore.__init__(self, configfile, + self.__usage__) + + def __call__(self, args): + Bcfg2.Server.Admin.MetadataCore.__call__(self, args) + + + Bcfg2.Server.Plugin.Plugin.__init__(self, core, datastore) + Bcfg2.Server.Plugin.Version.__init__(self) + self.core = core + self.datastore = datastore + + if len(args) == 0: + self.errExit("No argument specified.\n" + "Please see bcfg2-admin examples help for usage.") + + if args[0] == 'pull': + try: + # FIXME: Repo URL is hardcoded for now + Popen(['git', 'clone', 'https://github.com/solj/bcfg2-repo.git', datastore]) + except MetadataConsistencyError: + print "Error in pulling examples." + raise SystemExit(1) + +#fatal: destination path 'bcfg2-test' already exists and is not an empty directory. + + elif args[0] == 'backup': + try: + self.metadata.add_group(args[1], attr_d) + except MetadataConsistencyError: + print "Error in adding group" + raise SystemExit(1) + + + elif args[0] == 'backup': + try: + self.metadata.add_group(args[1], attr_d) + except MetadataConsistencyError: + print "Error in adding group" + raise SystemExit(1) + + else: + print "No command specified" + raise SystemExit(1) + + def repobackup(): + """Make a backup of the existing files in the Bcfg2 repo directory.""" + if os.path.isdir(datastore): + print 'Backup in progress...' + target = time.strftime('%Y%m%d%H%M%S') + + + out = tarfile.open(filename, w.gz) + else: + logger.error("%s doesn't exist." % datastore) + #raise Bcfg2.Server.Plugin.PluginInitError diff --git a/src/lib/Server/Admin/Web.py b/src/lib/Server/Admin/Web.py new file mode 100644 index 000000000..5ad14f2b9 --- /dev/null +++ b/src/lib/Server/Admin/Web.py @@ -0,0 +1,79 @@ +import os +import sys +import BaseHTTPServer +import SimpleHTTPServer +import daemon +import Bcfg2.Server.Admin +import Bcfg2.Options + +# For debugging output only +import logging +logger = logging.getLogger('Bcfg2.Server.Admin.Web') + +class Web(Bcfg2.Server.Admin.Mode): + __shorthelp__ = "A simple webserver to display the content of the Bcfg2 repos." + __longhelp__ = (__shorthelp__ + "\n\nbcfg2-admin web start\n" + "\n\nbcfg2-admin web stop") + __usage__ = ("bcfg2-admin web [start|stop]") + + def __init__(self, configfile): + Bcfg2.Server.Admin.Mode.__init__(self, configfile) + + def __call__(self, args): + Bcfg2.Server.Admin.Mode.__call__(self, args) + opts = {'repo': Bcfg2.Options.SERVER_REPOSITORY} + setup = Bcfg2.Options.OptionParser(opts) + setup.parse(sys.argv[1:]) + repo = setup['repo'] + + if len(args) == 0 or args[0] == '-h': + print(self.__usage__) + raise SystemExit(0) + + if len(args) == 0: + self.errExit("No argument specified.\n" + "Please see bcfg2-admin web help for usage.") + + if args[0] in ['start', 'up']: + # Change directory to the Bcfg2 repo + if not os.path.exists(repo): + #print "Path '%s' doesn't exisit" % repo + logger.error("%s doesn't exist" % repo) + else: + os.chdir(repo) + self.start_web() + + elif args[0] in ['stop', 'down']: + self.stop_web() + + else: + print "No command specified" + raise SystemExit(1) + + # The web server part with hardcoded port number + def start_web(self, port=6788): + """Starts the webserver for directory listing of the Bcfg2 repo.""" + try: + server_class = BaseHTTPServer.HTTPServer + handler_class = SimpleHTTPServer.SimpleHTTPRequestHandler + server_address = ('', port) + server = server_class(server_address, handler_class) + #server.serve_forever() + # Make the context manager for becoming a daemon process + daemon_context = daemon.DaemonContext() + daemon_context.files_preserve = [server.fileno()] + + # Become a daemon process + with daemon_context: + server.serve_forever() + except: + logger.error("Failed to start webserver") + #raise Bcfg2.Server.Admin.AdminInitError + + def stop_web(self): + """Stops the webserver.""" +# self.shutdown = 1 + self.shutdown() + # self.stopped = True +# self.serve_forever() + diff --git a/src/lib/Server/Admin/test.py b/src/lib/Server/Admin/test.py new file mode 100644 index 000000000..06271b186 --- /dev/null +++ b/src/lib/Server/Admin/test.py @@ -0,0 +1,73 @@ +import os +import time +import tarfile +import sys +datastore = '/var/lib/bcfg2' + +#Popen(['git', 'clone', 'https://github.com/solj/bcfg2-repo.git', datastore]) +#timestamp = time.strftime('%Y%m%d%H%M%S') +#format = 'gz' +#mode = 'w:' + format +#filename = timestamp + '.tar' + '.' + format +#out = tarfile.open('/home/fab/' + filename, mode=mode) + + +#content = os.listdir(os.getcwd()) +#for item in content: +# out.add(item) +#out.close() +#print "Archive %s was stored.\nLocation: %s" % (filename, datastore) + +#print os.getcwd() +#print os.listdir(os.getcwd()) + +#import shlex +#args = shlex.split('env LC_ALL=C git clone https://github.com/solj/bcfg2-repo.git datastore') +#print args + +#Popen("env LC_ALL=C git clone https://github.com/solj/bcfg2-repo.git datastore") + +#timestamp = time.strftime('%Y%m%d%H%M%S') +#format = 'gz' +#mode = 'w:' + format +#filename = timestamp + '.tar' + '.' + format +#out = tarfile.open(name = filename, mode = mode) +##content = os.listdir(datastore) +##for item in content: +## out.add(item) +##out.close() + +###t = tarfile.open(name = destination, mode = 'w:gz') +#out.add(datastore, os.path.basename(datastore)) +#out.close() + +#print datastore, os.path.basename(datastore) + +#content = os.listdir(datastore) +#for item in content: +# #out.add(item) +# print item + +#timestamp = time.strftime('%Y%m%d%H%M%S') +#format = 'gz' +#mode = 'w:' + format +#filename = timestamp + '.tar' + '.' + format + +if len(sys.argv) == 0: + destination = datastore + '/' +else: + destination = sys.argv[1] + +print destination +#out = tarfile.open(destination + filename, mode=mode) +#out.add(self.datastore, os.path.basename(self.datastore)) +#out.close() +#print "Archive %s was stored at %s" % (filename, destination) + +#print 'Die Kommandozeilenparameter sind:' +##for i in sys.argv: +## print i + +#print sys.argv[0] +#print sys.argv[1] +##print sys.argv[2] diff --git a/src/lib/Server/Plugins/__Web.py b/src/lib/Server/Plugins/__Web.py new file mode 100644 index 000000000..e1646e429 --- /dev/null +++ b/src/lib/Server/Plugins/__Web.py @@ -0,0 +1,47 @@ +import os +import BaseHTTPServer +import SimpleHTTPServer +import Bcfg2.Server.Plugin + +# for debugging output only +import logging +logger = logging.getLogger('Bcfg2.Plugins.Web') + +class Web(Bcfg2.Server.Plugin.Plugin, + Bcfg2.Server.Plugin.Version): + """Web is a simple webserver to display the content of the Bcfg2 repos.""" + name = 'Web' + __version__ = '$Id$' + __author__ = 'bcfg-dev@mcs.anl.gov' + experimental = True + + def __init__(self, core, datastore): + Bcfg2.Server.Plugin.Plugin.__init__(self, core, datastore) + Bcfg2.Server.Plugin.Version.__init__(self) + self.core = core + self.datastore = datastore + + # Change directory to the Bcfg2 repo + ##path = '/home/fab/backup' + if not os.path.exists(datastore): + ##print "Path '%s' doesn't exisit" % datastore + logger.error("%s doesn't exist" % datastore) + raise Bcfg2.Server.Plugin.PluginInitError + else: + os.chdir(datastore) + self.start_web() + + logger.debug("Serving at port %s" % port) + + + def start_web(self, port=6788): + """Starts the webserver for directory listing of the Bcfg2 repo.""" + try: + server_class = BaseHTTPServer.HTTPServer + handler_class = SimpleHTTPServer.SimpleHTTPRequestHandler + server_address = ('', port) + server = server_class(server_address, handler_class) + server.serve_forever() + except: + logger.error("Failed to start webserver") + raise Bcfg2.Server.Plugin.PluginInitError -- cgit v1.2.3-1-g7c22