CLIENT-SERVER: improve netrpc

bzr revid: ced-228717f183c1bf3b42dbe1e9df452bde0fb3645c
This commit is contained in:
ced 2007-02-03 22:58:57 +00:00
parent cd498105b9
commit 840953821b
4 changed files with 70 additions and 43 deletions

View File

@ -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

View File

@ -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]

View File

@ -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)

View File

@ -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':