From 7d7c0f4dc299dc342c53341f61ae4643eb134213 Mon Sep 17 00:00:00 2001 From: Michael DeHaan Date: Thu, 20 Sep 2007 16:44:02 -0400 Subject: Remove yaml libraries (configparser is good enough) plus remove references to virt-factory. --- server/server.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'server/server.py') diff --git a/server/server.py b/server/server.py index d297b06..5e78cae 100755 --- a/server/server.py +++ b/server/server.py @@ -1,11 +1,10 @@ #!/usr/bin/python + """ -Virt-factory backend code. +func -Copyright 2006, Red Hat, Inc -Michael DeHaan -Scott Seago -Adrian Likins +Copyright 2007, Red Hat, Inc +see AUTHORS This software may be freely redistributed under the terms of the GNU general public license. -- cgit From e807123be1eaa599261a160aa0d9fa36f982029b Mon Sep 17 00:00:00 2001 From: Adrian Likins Date: Thu, 20 Sep 2007 17:22:19 -0400 Subject: attempt to let us run with --debug flag to run from src checkout --- server/server.py | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) (limited to 'server/server.py') diff --git a/server/server.py b/server/server.py index d297b06..0b408a0 100755 --- a/server/server.py +++ b/server/server.py @@ -32,11 +32,6 @@ import module_loader import utils -MODULE_PATH="modules/" -modules = module_loader.load_modules(MODULE_PATH) -print "modules", modules - - #from busrpc.services import RPCDispatcher #from busrpc.config import DeploymentConfig @@ -44,16 +39,9 @@ from rhpl.translate import _, N_, textdomain, utf8 I18N_DOMAIN = "vf_server" -class Singleton(object): - def __new__(type, *args, **kwargs): - if not '_the_instance' in type.__dict__: - type._the_instance = object.__new__(type, *args, **kwargs) - type._the_instance.init(*args, **kwargs) - return type._the_instance - -class XmlRpcInterface(Singleton): +class XmlRpcInterface(object): - def init(self): + def __init__(self, modules={}): """ Constructor sets up SQLAlchemy (database ORM) and logging. """ @@ -63,6 +51,8 @@ class XmlRpcInterface(Singleton): self.tables = {} self.tokens = [] + self.modules = modules + self.logger = logger.Logger().logger self.__setup_handlers() @@ -73,11 +63,11 @@ class XmlRpcInterface(Singleton): FIXME: eventually calling most functions should go from here through getattr. """ self.handlers = {} - print "ffffffffffff", modules.keys() - for x in modules.keys(): + print "ffffffffffff", self.modules.keys() + for x in self.modules.keys(): print "x", x try: - modules[x].register_rpc(self.handlers) + self.modules[x].register_rpc(self.handlers) self.logger.debug("adding %s" % x) except AttributeError, e: self.logger.warning("module %s could not be loaded, it did not have a register_rpc method" % modules[x]) @@ -178,8 +168,9 @@ def main(argv): Start things up. """ - websvc = XmlRpcInterface() + module_path=None + for arg in sys.argv: if arg == "import" or arg == "--import": prov_obj = provisioning.Provisioning() @@ -189,6 +180,19 @@ def main(argv): prov_obj = provisioning.Provisioning() prov_obj.sync(None, {}) # just for testing return + elif arg in ["debug", "--debug", "-d"]: + # basically, run from the src tree instead of + # using the installed modules + module_path="modules/" + mod_path="server/" + + print "module_path_foo", module_path + modules = module_loader.load_modules(module_path=module_path) + print "modules", modules + + + websvc = XmlRpcInterface(modules=modules) + if "qpid" in sys.argv or "--qpid" in sys.argv: if "daemon" in sys.argv or "--daemon" in sys.argv: utils.daemonize("/var/run/vf_server_qpid.pid") -- cgit From 50250e45f0c225198e08097a525cc5ff1b91474d Mon Sep 17 00:00:00 2001 From: Adrian Likins Date: Thu, 20 Sep 2007 17:40:59 -0400 Subject: debug spew cleanup to protect the unwashed masses from foo poisoning --- server/server.py | 3 --- 1 file changed, 3 deletions(-) (limited to 'server/server.py') diff --git a/server/server.py b/server/server.py index 42adcda..7b0a1a2 100755 --- a/server/server.py +++ b/server/server.py @@ -62,9 +62,7 @@ class XmlRpcInterface(object): FIXME: eventually calling most functions should go from here through getattr. """ self.handlers = {} - print "ffffffffffff", self.modules.keys() for x in self.modules.keys(): - print "x", x try: self.modules[x].register_rpc(self.handlers) self.logger.debug("adding %s" % x) @@ -185,7 +183,6 @@ def main(argv): module_path="modules/" mod_path="server/" - print "module_path_foo", module_path modules = module_loader.load_modules(module_path=module_path) print "modules", modules -- cgit From a847a423257a863c18f20b003820f74dcd5259af Mon Sep 17 00:00:00 2001 From: Adrian Likins Date: Thu, 20 Sep 2007 17:57:52 -0400 Subject: remove all the --debug "try to run from the src tree" crap 3rd party modules wont be here anyway, so remove all that weird noise --- server/server.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) (limited to 'server/server.py') diff --git a/server/server.py b/server/server.py index 7b0a1a2..f7370b8 100755 --- a/server/server.py +++ b/server/server.py @@ -166,8 +166,6 @@ def main(argv): """ - module_path=None - for arg in sys.argv: if arg == "import" or arg == "--import": prov_obj = provisioning.Provisioning() @@ -177,13 +175,8 @@ def main(argv): prov_obj = provisioning.Provisioning() prov_obj.sync(None, {}) # just for testing return - elif arg in ["debug", "--debug", "-d"]: - # basically, run from the src tree instead of - # using the installed modules - module_path="modules/" - mod_path="server/" - modules = module_loader.load_modules(module_path=module_path) + modules = module_loader.load_modules() print "modules", modules -- cgit From d6b77d16f9a1e1acf8e8c65ef311657daef7bb05 Mon Sep 17 00:00:00 2001 From: Michael DeHaan Date: Thu, 20 Sep 2007 18:16:30 -0400 Subject: Removing VF items + misc cleanup --- server/server.py | 121 +++++++++++++++++++------------------------------------ 1 file changed, 42 insertions(+), 79 deletions(-) (limited to 'server/server.py') diff --git a/server/server.py b/server/server.py index f7370b8..3069d0a 100755 --- a/server/server.py +++ b/server/server.py @@ -14,192 +14,155 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. """ +# standard modules import SimpleXMLRPCServer import os import subprocess import socket +from rhpl.translate import _, N_, textdomain, utf8 +I18N_DOMAIN = "vf_server" -SERVE_ON = (None,None) - -# FIXME: logrotate - +# our modules from codes import * - import config_data import logger import module_loader import utils - -#from busrpc.services import RPCDispatcher -#from busrpc.config import DeploymentConfig - -from rhpl.translate import _, N_, textdomain, utf8 -I18N_DOMAIN = "vf_server" - +# ====================================================================================== class XmlRpcInterface(object): def __init__(self, modules={}): + """ - Constructor sets up SQLAlchemy (database ORM) and logging. + Constructor. """ + config_obj = config_data.Config() self.config = config_obj.get() - - self.tables = {} - self.tokens = [] - self.modules = modules - self.logger = logger.Logger().logger - self.__setup_handlers() def __setup_handlers(self): + """ Add RPC functions from each class to the global list so they can be called. - FIXME: eventually calling most functions should go from here through getattr. """ + self.handlers = {} for x in self.modules.keys(): try: self.modules[x].register_rpc(self.handlers) self.logger.debug("adding %s" % x) except AttributeError, e: - self.logger.warning("module %s could not be loaded, it did not have a register_rpc method" % modules[x]) + self.logger.warning("module %s not loaded, missing register_rpc method" % modules[x]) - # FIXME: find some more elegant way to surface the handlers? - # FIXME: aforementioned login/session token requirement - def get_dispatch_method(self, method): + if method in self.handlers: - return FuncApiMethod(self.logger, method, - self.handlers[method]) + return FuncApiMethod(self.logger, method, self.handlers[method]) else: self.logger.info("Unhandled method call for method: %s " % method) raise InvalidMethodException def _dispatch(self, method, params): + """ the SimpleXMLRPCServer class will call _dispatch if it doesn't find a handler method """ + return self.get_dispatch_method(method)(*params) -class BusRpcWrapper: - - def __init__(self, config): - self.rpc_interface = None +# ====================================================================================== - def __getattr__(self, name): - if self.rpc_interface == None: - self.rpc_interface = XmlRpcInterface() - return self.rpc_interface.get_dispatch_method(name) +class FuncApiMethod: - def __repr__(self): - return ("") + """ + Used to hold a reference to all of the registered functions. + """ -class FuncApiMethod: def __init__(self, logger, name, method): + self.logger = logger self.__method = method self.__name = name def __log_exc(self): + """ Log an exception. """ + (t, v, tb) = sys.exc_info() self.logger.info("Exception occured: %s" % t ) self.logger.info("Exception value: %s" % v) self.logger.info("Exception Info:\n%s" % string.join(traceback.format_list(traceback.extract_tb(tb)))) def __call__(self, *args): + self.logger.debug("(X) -------------------------------------------") + try: rc = self.__method(*args) except FuncException, e: self.__log_exc() rc = e except: - self.logger.debug("Not a virt-factory specific exception") + self.logger.debug("Not a Func-specific exception") self.__log_exc() raise - rc = rc.to_datastruct() self.logger.debug("Return code for %s: %s" % (self.__name, rc)) + return rc +# ====================================================================================== def serve(websvc): + """ Code for starting the XMLRPC service. FIXME: make this HTTPS (see RRS code) and make accompanying Rails changes.. """ + server =FuncXMLRPCServer(('', 51234)) server.register_instance(websvc) server.serve_forever() -def serve_qpid(config_path, register_with_bridge=False, is_bridge_server=False): - """ - Code for starting the QPID RPC service. - """ - config = DeploymentConfig(config_path) - dispatcher = RPCDispatcher(config, register_with_bridge, is_bridge_server=is_bridge_server) - - try: - dispatcher.start() - except KeyboardInterrupt: - dispatcher.stop() - print "Exiting..." +# ====================================================================================== class FuncXMLRPCServer(SimpleXMLRPCServer.SimpleXMLRPCServer): + def __init__(self, args): + self.allow_reuse_address = True SimpleXMLRPCServer.SimpleXMLRPCServer.__init__(self, args) + +# ====================================================================================== def main(argv): + """ Start things up. """ - - for arg in sys.argv: - if arg == "import" or arg == "--import": - prov_obj = provisioning.Provisioning() - prov_obj.init(None, {}) - return - elif arg == "sync" or arg == "--sync": - prov_obj = provisioning.Provisioning() - prov_obj.sync(None, {}) # just for testing - return - modules = module_loader.load_modules() print "modules", modules - websvc = XmlRpcInterface(modules=modules) - if "qpid" in sys.argv or "--qpid" in sys.argv: - if "daemon" in sys.argv or "--daemon" in sys.argv: - utils.daemonize("/var/run/vf_server_qpid.pid") - else: - print "serving...\n" - serve_qpid("/etc/virt-factory/qpid.conf") + if "daemon" in sys.argv or "--daemon" in sys.argv: + utils.daemonize("/var/run/vf_server.pid") else: - if "daemon" in sys.argv or "--daemon" in sys.argv: - utils.daemonize("/var/run/vf_server.pid") - else: - print "serving...\n" - # daemonize only if --daemonize, because I forget to type "debug" -- MPD - serve(websvc) - -# FIXME: upgrades? database upgrade logic would be nice to have here, as would general creation (?) -# FIXME: command line way to add a distro would be nice to have in the future, rsync import is a bit heavy handed. -# (and might not be enough for RHEL, but is good for Fedora/Centos) + print "serving...\n" + serve(websvc) + +# ====================================================================================== if __name__ == "__main__": textdomain(I18N_DOMAIN) -- cgit From 425f61b97305e9a44d9f31c8a82c633c95f61edc Mon Sep 17 00:00:00 2001 From: James Bowes Date: Thu, 20 Sep 2007 18:27:11 -0400 Subject: Catch FuncException when the config file is missing and exit gracefully --- server/server.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'server/server.py') diff --git a/server/server.py b/server/server.py index 3069d0a..a313301 100755 --- a/server/server.py +++ b/server/server.py @@ -153,7 +153,11 @@ def main(argv): modules = module_loader.load_modules() print "modules", modules - websvc = XmlRpcInterface(modules=modules) + try: + websvc = XmlRpcInterface(modules=modules) + except FuncException, e: + print >> sys.stderr, 'error: %s' % e + sys.exit(1) if "daemon" in sys.argv or "--daemon" in sys.argv: utils.daemonize("/var/run/vf_server.pid") -- cgit From 393fc312b9af104b729f12a344c6b44aa7a76b96 Mon Sep 17 00:00:00 2001 From: Michael DeHaan Date: Thu, 20 Sep 2007 18:28:18 -0400 Subject: Prevent XMLRPC server from printing to console. --- server/server.py | 1 + 1 file changed, 1 insertion(+) (limited to 'server/server.py') diff --git a/server/server.py b/server/server.py index a313301..0106109 100755 --- a/server/server.py +++ b/server/server.py @@ -130,6 +130,7 @@ def serve(websvc): """ server =FuncXMLRPCServer(('', 51234)) + server.logRequests = 0 # don't print stuff to console server.register_instance(websvc) server.serve_forever() -- cgit From bfc12e218fa56755aa37338c5aa36feee632ed49 Mon Sep 17 00:00:00 2001 From: Adrian Likins Date: Thu, 20 Sep 2007 18:43:14 -0400 Subject: pychecker cleanups "import codes" instead of polluting the namespace with "from codes import *" and update accordingly --- server/server.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'server/server.py') diff --git a/server/server.py b/server/server.py index 3069d0a..6179d86 100755 --- a/server/server.py +++ b/server/server.py @@ -16,14 +16,16 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # standard modules import SimpleXMLRPCServer -import os -import subprocess +import string import socket +import sys +import traceback + from rhpl.translate import _, N_, textdomain, utf8 I18N_DOMAIN = "vf_server" # our modules -from codes import * +import codes import config_data import logger import module_loader @@ -57,7 +59,7 @@ class XmlRpcInterface(object): self.modules[x].register_rpc(self.handlers) self.logger.debug("adding %s" % x) except AttributeError, e: - self.logger.warning("module %s not loaded, missing register_rpc method" % modules[x]) + self.logger.warning("module %s not loaded, missing register_rpc method" % self.modules[x]) def get_dispatch_method(self, method): @@ -67,7 +69,7 @@ class XmlRpcInterface(object): else: self.logger.info("Unhandled method call for method: %s " % method) - raise InvalidMethodException + raise codes.InvalidMethodException def _dispatch(self, method, params): @@ -109,7 +111,7 @@ class FuncApiMethod: try: rc = self.__method(*args) - except FuncException, e: + except codes.FuncException, e: self.__log_exc() rc = e except: -- cgit From cd9b88aaf0ded28358d0de2f3351a023e7ae5651 Mon Sep 17 00:00:00 2001 From: Adrian Likins Date: Thu, 20 Sep 2007 19:04:10 -0400 Subject: we are not vf_server, change I!*N domain --- server/server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'server/server.py') diff --git a/server/server.py b/server/server.py index d6fffd5..5c4e6ec 100755 --- a/server/server.py +++ b/server/server.py @@ -22,7 +22,7 @@ import sys import traceback from rhpl.translate import _, N_, textdomain, utf8 -I18N_DOMAIN = "vf_server" +I18N_DOMAIN = "func" # our modules import codes -- cgit From 98010f591948fb4bf297c1c0c32def42f766edca Mon Sep 17 00:00:00 2001 From: Adrian Likins Date: Thu, 20 Sep 2007 19:13:22 -0400 Subject: just a friendly reminder --- server/server.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'server/server.py') diff --git a/server/server.py b/server/server.py index 5c4e6ec..aa8bdef 100755 --- a/server/server.py +++ b/server/server.py @@ -154,7 +154,19 @@ def main(argv): """ modules = module_loader.load_modules() - print "modules", modules + + print "\n\n\n\n\n" + print " WARNING WARNING WARNING" + print "DANGER DANGER DANGER" + print "\n\n\n\n" + print "THERE IS NO AUTHENTICATION IN THIS VERSION" + print "DO NOT RUN ON A MACHINE EXPOSED TO ANYONE YOU DO NOT TRUST" + print " THEY CAN DO VERY BAD THINGS" + print "\n\n\n\n\n" + print "Really, don't do that. It is not at all secure at the moment" + print "like, at all." + print "" + print "Seriously.\n\n" try: websvc = XmlRpcInterface(modules=modules) -- cgit