from OFS.SimpleItem import SimpleItem
import xmlrpclib
import httplib
from Products.PageTemplates.PageTemplateFile import PageTemplateFile
import os.path
from Globals import package_home
import re
class XMLRpcServerProxy(SimpleItem):
"""makes servery proxy available for zope"""
meta_type="XMLRpcServerProxy"
rpc_no_arg_expr='[^A-z0-9]'
manage_options= (
{'label':'Main Config','action':'mainConfigHTML'},
)+ SimpleItem.manage_options
def __init__(self,id,serverUrl,use_xmlrpc=True):
"""init server proxy"""
self.id=id
self.serverUrl=serverUrl
self.use_xmlrpc = use_xmlrpc
def ServerProxy(self,serverUrl=None):
"""get the proxy"""
if not serverUrl:
serverUrl=self.serverUrl
if self.use_xmlrpc:
pr = xmlrpclib.ServerProxy(serverUrl)
else:
pr = httplib.HTTPConnection(serverUrl)
return pr
def eval(self,method,argument,outputUnicode=True):
"""do proxy request"""
server=self.ServerProxy()
if self.use_xmlrpc:
# for XML-RPC methods only letters are allowed
method=re.sub('[^A-z0-9_]','',method)
# clean argument
argument=re.sub(self.rpc_no_arg_expr,'',argument)
cmd="""server.%s('%s')"""%(method,argument)
return eval(cmd)
else:
# HTTP
# TODO: check arguments
uri = method
if argument:
uri += '?' + argument
#print "GET: ", uri
server.request("GET", uri)
resp = server.getresponse()
data = resp.read()
#print "GOT: ", resp.status, ", ", resp.reason, " = ", data
if outputUnicode:
return data.decode('UTF-8')
else:
return data
def eval2(self,method,argument1,argument2,outputUnicode=True):
"""do proxy request"""
server=self.ServerProxy()
if self.use_xmlrpc:
# for XML-RPC methods only letters are allowed
method=re.sub('[^A-z0-9_]','',method)
# clean argument
argument1=re.sub(self.rpc_no_arg_expr,'',argument1)
argument2=re.sub(self.rpc_no_arg_expr,'',argument2)
cmd="""server.%s('%s','%s')"""%(method,argument1,argument2)
return eval(cmd)
else:
# HTTP
# TODO: check arguments
uri = method
if argument1:
uri += '?' + argument1 + argument2
#print "GET: ", uri
server.request("GET", uri)
resp = server.getresponse()
data = resp.read()
#print "GOT: ", resp.status, ", ", resp.reason, " = ", data
if outputUnicode:
return data.decode('UTF-8')
else:
return data
def mainConfigHTML(self):
"""main config form"""
pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','manageXMLRpcServerProxy.zpt')).__of__(self)
return pt()
def mainConfig(self,serverUrl,use_xmlrpc=True,rpc_no_arg_expr=None,RESPONSE=None):
"""main config"""
self.serverUrl=serverUrl
if use_xmlrpc and use_xmlrpc != "no":
use_xmlrpc = True
else:
use_xmlrpc = False
self.use_xmlrpc=use_xmlrpc
if rpc_no_arg_expr is not None:
self.rpc_no_arg_expr = rpc_no_arg_expr
if RESPONSE:
RESPONSE.redirect("manage_main")
def manage_addXMLRpcServerProxyForm(self):
"""add the XMLRpcServerProxy"""
pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addXMLRpcServerProxy.zpt')).__of__(self)
return pt()
def manage_addXMLRpcServerProxy(self,id,serverUrl,use_xmlrpc=True,rpc_no_arg_expr=None,RESPONSE=None):
"""add the XMLRpcServerProxy"""
if use_xmlrpc is not None and use_xmlrpc != "no":
use_xmlrpc = True
else:
use_xmlrpc = False
ob=XMLRpcServerProxy(id,serverUrl,use_xmlrpc)
if rpc_no_arg_expr is not None:
ob.rpc_no_arg_expr = rpc_no_arg_expr
self._setObject(id, ob)
if RESPONSE is not None:
RESPONSE.redirect('manage_main')
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>