diff --git a/bin/netsvc.py b/bin/netsvc.py index 1ce795aa518..ba4e2983c90 100644 --- a/bin/netsvc.py +++ b/bin/netsvc.py @@ -242,8 +242,9 @@ if HAS_SSL: else: pass -class HttpDaemon(object): +class HttpDaemon(threading.Thread): def __init__(self, interface,port, secure=False): + threading.Thread.__init__(self) self.__port=port self.__interface=interface if secure and HAS_SSL: @@ -255,14 +256,20 @@ class HttpDaemon(object): pass def stop(self): + self.running = False + self.server.socket.shutdown(socket.SHUT_RDWR) self.server.socket.close() - self.server.socket.close() - del self.server +# self.server.socket.close() +# del self.server - def start(self): + def run(self): self.server.register_introspection_functions() - self.server.serve_forever() +# self.server.serve_forever() + self.running = True + while self.running: + self.server.handle_request() + return True # If the server need to be run recursively # @@ -346,7 +353,6 @@ class TinySocketServerThread(threading.Thread): # print "threads size:", len(self.threads) self.socket.close() except Exception, e: - print "exception server", e self.socket.close() return False diff --git a/bin/service/security.py b/bin/service/security.py index cef66941333..2653328edfd 100644 --- a/bin/service/security.py +++ b/bin/service/security.py @@ -40,13 +40,13 @@ def login(db, login, password): if res: return res[0] else: - raise _('Bad username or password') + raise Exception('Bad username or password') def check_super(passwd): if passwd == tools.config['admin_passwd']: return True else: - raise 'AccessDenied' + raise Exception('AccessDenied') def check(db, uid, passwd): #FIXME: this should be db dependent @@ -57,7 +57,7 @@ def check(db, uid, passwd): res = cr.fetchone()[0] cr.close() if not bool(res): - raise 'AccessDenied' + raise Exception('AccessDenied') if res: _uid_cache[uid] = passwd return bool(res) @@ -68,5 +68,5 @@ def access(db, uid, passwd, sec_level, ids): res = cr.fetchone() cr.close() if not res: - raise _('Bad username or password') + raise Exception('Bad username or password') return res[0] diff --git a/bin/tinyerp-server.py b/bin/tinyerp-server.py index 70518098b5d..da0397b1657 100755 --- a/bin/tinyerp-server.py +++ b/bin/tinyerp-server.py @@ -66,10 +66,10 @@ logger = netsvc.Logger() # import the tools module so that the commandline parameters are parsed #----------------------------------------------------------------------- import tools +import time if sys.platform=='win32': import mx.DateTime - import time mx.DateTime.strptime = lambda x,y: mx.DateTime.mktime(time.strptime(x, y)) #os.chdir(tools.file_path_root) @@ -200,35 +200,44 @@ if tools.config["stop_after_init"]: #---------------------------------------------------------- # Launch Server #---------------------------------------------------------- -try: - port = int(tools.config["port"]) -except Exception: - logger.notifyChannel("init", netsvc.LOG_ERROR, "invalid port '%s'!" % (tools.config["port"],)) - sys.exit(1) -interface = tools.config["interface"] -secure = tools.config["secure"] -httpd = netsvc.HttpDaemon(interface,port, secure) +if tools.config['xmlrpc']: + try: + port = int(tools.config["port"]) + except Exception: + logger.notifyChannel("init", netsvc.LOG_ERROR, "invalid port '%s'!" % (tools.config["port"],)) + sys.exit(1) + interface = tools.config["interface"] + secure = tools.config["secure"] + + httpd = netsvc.HttpDaemon(interface,port, secure) + + if tools.config["xmlrpc"]: + xml_gw = netsvc.xmlrpc.RpcGateway('web-services') + httpd.attach("/xmlrpc", xml_gw ) + logger.notifyChannel("web-services", netsvc.LOG_INFO, "starting XML-RPC services, port "+str(port)) + + # + #if tools.config["soap"]: + # soap_gw = netsvc.xmlrpc.RpcGateway('web-services') + # httpd.attach("/soap", soap_gw ) + # logger.notifyChannel("web-services", netsvc.LOG_INFO, 'starting SOAP services, port '+str(port)) + # + if not (netsvc.HAS_SSL and tools.config['secure']): + logger.notifyChannel("web-services", netsvc.LOG_INFO, "You are not using the SSL layer") + else: + logger.notifyChannel("web-services", netsvc.LOG_INFO, "You are using the SSL Layer") -if tools.config["xmlrpc"]: - xml_gw = netsvc.xmlrpc.RpcGateway('web-services') - httpd.attach("/xmlrpc", xml_gw ) - logger.notifyChannel("web-services", netsvc.LOG_INFO, "starting XML-RPC services, port "+str(port)) - -# -#if tools.config["soap"]: -# soap_gw = netsvc.xmlrpc.RpcGateway('web-services') -# httpd.attach("/soap", soap_gw ) -# logger.notifyChannel("web-services", netsvc.LOG_INFO, 'starting SOAP services, port '+str(port)) -# -if not (netsvc.HAS_SSL and tools.config['secure']): - logger.notifyChannel("web-services", netsvc.LOG_INFO, "You are not using the SSL layer") -else: - logger.notifyChannel("web-services", netsvc.LOG_INFO, "You are using the SSL Layer") - - -tinySocket = netsvc.TinySocketServerThread(interface, 8085, False) -logger.notifyChannel("web-services", netsvc.LOG_INFO, "starting TinySocket service, port "+str(8085)) +if tools.config['netrpc']: + try: + netport = int(tools.config["netport"]) + except Exception: + logger.notifyChannel("init", netsvc.LOG_ERROR, "invalid port '%s'!" % (tools.config["netport"],)) + sys.exit(1) + netinterface = tools.config["netinterface"] + + tinySocket = netsvc.TinySocketServerThread(netinterface, netport, False) + logger.notifyChannel("web-services", netsvc.LOG_INFO, "starting netrpc service, port "+str(netport)) def handler(signum, frame): from tools import config @@ -245,10 +254,16 @@ if config['pidfile']: pidtext="%d" % (os.getpid()) fd.write(pidtext) fd.close() + signal.signal(signal.SIGINT, handler) signal.signal(signal.SIGTERM, handler) logger.notifyChannel("web-services", netsvc.LOG_INFO, 'the server is running, waiting for connections...') -tinySocket.start() -httpd.start() -dispatcher.run() +if tools.config['netrpc']: + tinySocket.start() +if tools.config['xmlrpc']: + httpd.start() +#dispatcher.run() + +while True: + time.sleep(1) diff --git a/bin/tools/config.py b/bin/tools/config.py index 45ab813f989..b50526bdd24 100644 --- a/bin/tools/config.py +++ b/bin/tools/config.py @@ -36,6 +36,8 @@ class configmanager(object): 'verbose': False, 'interface': '', # this will bind the server to all interfaces 'port': '8069', + 'netinterface': '', + 'netport': '8070', 'db_host': False, 'db_port': False, 'db_name': 'terp', @@ -71,6 +73,10 @@ class configmanager(object): parser.add_option("-n", "--interface", dest="interface", help="specify the TCP IP address") parser.add_option("-p", "--port", dest="port", help="specify the TCP port") + parser.add_option("--net_interface", dest="netinterface", help="specify the TCP IP address for netrpc") + parser.add_option("--net_port", dest="netport", help="specify the TCP port for netrpc") + parser.add_option("--no-netrpc", dest="netrpc", action="store_false", default=True, help="disable netrpc") + parser.add_option("--no-xmlrpc", dest="xmlrpc", action="store_false", default=True, help="disable xmlrpc") parser.add_option("-i", "--init", dest="init", help="init a module (use \"all\" for all modules)") parser.add_option("--without-demo", dest="without_demo", help="load demo data for a module (use \"all\" for all modules)", default=False) @@ -131,13 +137,13 @@ class configmanager(object): self.options['pidfile'] = False for arg in ('interface', 'port', 'db_name', 'db_user', 'db_password', 'db_host', - 'db_port', 'logfile', 'pidfile', 'secure', 'smtp_server', 'price_accuracy'): + 'db_port', 'logfile', 'pidfile', 'secure', 'smtp_server', 'price_accuracy', 'netinterface', 'netport'): if getattr(opt, arg): self.options[arg] = getattr(opt, arg) for arg in ('language', 'translate_out', 'translate_in', 'upgrade', 'verbose', 'debug_mode', - 'stop_after_init', 'without_demo'): + 'stop_after_init', 'without_demo', 'netrpc', 'xmlrpc'): self.options[arg] = getattr(opt, arg) if not self.options['root_path'] or self.options['root_path']=='None':