diff options
Diffstat (limited to 'src/lib/Server')
-rw-r--r-- | src/lib/Server/Admin/Bundle.py | 14 | ||||
-rw-r--r-- | src/lib/Server/Admin/Examples.py | 71 | ||||
-rw-r--r-- | src/lib/Server/Admin/Init.py | 2 | ||||
-rw-r--r-- | src/lib/Server/Admin/Web.py | 79 | ||||
-rw-r--r-- | src/lib/Server/Admin/__init__.py | 22 |
5 files changed, 178 insertions, 10 deletions
diff --git a/src/lib/Server/Admin/Bundle.py b/src/lib/Server/Admin/Bundle.py index 41cd5727e..893fde489 100644 --- a/src/lib/Server/Admin/Bundle.py +++ b/src/lib/Server/Admin/Bundle.py @@ -46,7 +46,7 @@ class Bundle(Bcfg2.Server.Admin.MetadataCore): # except MetadataConsistencyError: # print "Error in deleting bundle." # raise SystemExit(1) - #Lists all available xml bundles + # Lists all available xml bundles elif args[0] in ['list-xml', 'ls-xml']: bundle_name = [] for bundle_path in xml_list: @@ -54,7 +54,7 @@ class Bundle(Bcfg2.Server.Admin.MetadataCore): bundle_name.append(rg.search(bundle_path).group(1)) for bundle in bundle_name: print bundle.split('.')[0] - #Lists all available genshi bundles + # Lists all available genshi bundles elif args[0] in ['list-genshi', 'ls-gen']: bundle_name = [] for bundle_path in genshi_list: @@ -62,9 +62,11 @@ class Bundle(Bcfg2.Server.Admin.MetadataCore): bundle_name.append(rg.search(bundle_path).group(1)) for bundle in bundle_name: print bundle.split('.')[0] - #Shows a list of all available bundles and prints bundle - #details after the user choose one bundle. - #FIXME: Add support for detailed output of genshi bundles + # Shows a list of all available bundles and prints bundle + # details after the user choose one bundle. + # FIXME: Add support for detailed output of genshi bundles + # FIXME: This functionality is almost identical with + # bcfg2-info bundles elif args[0] in ['show']: bundle_name = [] bundle_list = xml_list + genshi_list @@ -84,7 +86,7 @@ class Bundle(Bcfg2.Server.Admin.MetadataCore): else: if '%s/Bundler/%s' % \ (repo, bundle_name[int(lineno)]) in genshi_list: - print "Detailed output for *.genshi bundle is not supported." + print "Detailed output for *.genshi bundles is not supported." else: print 'Details for the "%s" bundle:' % \ (bundle_name[int(lineno)].split('.')[0]) 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/Init.py b/src/lib/Server/Admin/Init.py index 384ba6929..c6d1f9e3d 100644 --- a/src/lib/Server/Admin/Init.py +++ b/src/lib/Server/Admin/Init.py @@ -66,7 +66,7 @@ clients = '''<Clients version="3.0"> # Mapping of operating system names to groups os_list = [ - ('Redhat/Fedora/RHEL/RHAS/Centos', 'redhat'), + ('Red Hat/Fedora/RHEL/RHAS/Centos', 'redhat'), ('SUSE/SLES', 'suse'), ('Mandrake', 'mandrake'), ('Debian', 'debian'), 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/__init__.py b/src/lib/Server/Admin/__init__.py index bb5c41895..b76d0a77e 100644 --- a/src/lib/Server/Admin/__init__.py +++ b/src/lib/Server/Admin/__init__.py @@ -1,8 +1,24 @@ __revision__ = '$Revision$' -__all__ = ['Mode', 'Client', 'Compare', 'Init', 'Minestruct', 'Perf', - 'Pull', 'Query', 'Reports', 'Snapshots', 'Tidy', 'Viz', - 'Xcmd', 'Group', 'Backup'] +__all__ = [ + 'Backup', + 'Bundle', + 'Client', + 'Compare', + 'Group', + #'Examples', + 'Init', + 'Minestruct', + 'Mode', + 'Perf', + 'Pull', + 'Query', + 'Reports', + 'Snapshots', + 'Tidy', + 'Viz', + 'Xcmd' + ] import ConfigParser import logging |