Package fcp :: Module xmlrpc
[hide private]
[frames] | no frames]

Source Code for Module fcp.xmlrpc

  1  #! /usr/bin/env python 
  2  """ 
  3  fcpxmlrpc.py 
  4   
  5  Exposes some pyFreenet primitives over an XML-RPC service 
  6  """ 
  7   
  8  # standard library imports 
  9  import sys 
 10  from SimpleXMLRPCServer import SimpleXMLRPCServer 
 11  from SocketServer import ThreadingMixIn 
 12   
 13  # FCP imports 
 14  import node 
 15   
 16  # where to listen, for the xml-rpc server 
 17  xmlrpcHost = "127.0.0.1" 
 18  xmlrpcPort = 19481 
 19   
20 -class FCPXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):
21 """ 22 Multi-threaded XML-RPC server for freenet FCP access 23 """
24 - def __init__(self, **kw):
25 """ 26 Creates the xml-rpc server 27 28 Keywords: 29 - host - hostname to listen on for xml-rpc requests, default 127.0.0.1 30 - port - port to listen on for xml-rpc requests, default 19481 31 - fcpHost - hostname where FCP port is 32 - fcpPort - port where FCP port is 33 - verbosity - verbosity of output messages, 0 (silent) through 6 (noisy), 34 default 4. Refer verbosity constants in fcp module 35 """ 36 # create the server 37 host = kw.get('host', xmlrpcHost) 38 port = kw.get('port', xmlrpcPort) 39 40 SimpleXMLRPCServer.__init__(self, (host, port)) 41 42 # create the fcp node interface 43 fcpHost = kw.get('fcpHost', node.defaultFCPHost) 44 fcpPort = kw.get('fcpPort', node.defaultFCPPort) 45 verbosity = kw.get('verbosity', node.SILENT) 46 47 self.node = node.FCPNode(host=fcpHost, 48 port=fcpPort, 49 verbosity=verbosity, 50 ) 51 52 # create the request handler 53 hdlr = FreenetXMLRPCRequestHandler(self.node) 54 55 # link in the request handler object 56 self.register_instance(hdlr) 57 self.register_introspection_functions()
58
59 - def run(self):
60 """ 61 Launch the server to run forever 62 """ 63 try: 64 self.serve_forever() 65 except KeyboardInterrupt: 66 self.node.shutdown() 67 raise
68 69
70 -class FreenetXMLRPCRequestHandler:
71 """ 72 Simple class which exposes basic primitives 73 for freenet xmlrpc server 74 """
75 - def __init__(self, fcpnode):
76 77 self.node = fcpnode
78 79
80 - def get(self, uri, options=None):
81 """ 82 Performs a fetch of a key 83 84 Arguments: 85 - uri - the URI to retrieve 86 - options - a mapping (dict) object containing various 87 options - refer to FCPNode.get documentation 88 """ 89 if options is None: 90 options = {} 91 92 if options.has_key('file'): 93 raise Exception("file option not available over XML-RPC") 94 if options.has_key('dir'): 95 raise Exception("dir option not available over XML-RPC") 96 97 return self.node.get(uri, **options)
98
99 - def put(self, uri, options=None):
100 """ 101 Inserts data to node 102 103 Arguments: 104 - uri - the URI to insert under 105 - options - a mapping (dict) object containing various options, 106 refer to FCPNode.get documentation 107 """ 108 if options is None: 109 options = {} 110 111 if options.has_key('file'): 112 raise Exception("file option not available over XML-RPC") 113 if options.has_key('dir'): 114 raise Exception("dir option not available over XML-RPC") 115 116 return self.node.put(uri, data=data, **options)
117
118 - def genkey(self):
119 120 return self.node.genkey()
121 122
123 -def usage(msg="", ret=1):
124 125 if msg: 126 sys.stderr.write(msg+"\n") 127 128 print "\n".join([ 129 "Freenet XML-RPC Server", 130 "Usage: %s [options]" % sys.argv[0], 131 "Options:", 132 " -h, --help", 133 " show this usage message", 134 " -v, --verbosity=", 135 " set verbosity level, values are:", 136 " 0 (SILENT) show only 1 line for incoming hits", 137 " 1 (FATAL) show only fatal messages", 138 " 2 (CRITICAL) show only major failures", 139 " 3 (ERROR) show significant errors", 140 " 4 (INFO) show basic request details", 141 " 5 (DETAIL) show FCP dialogue", 142 " 6 (DEBUG) show ridiculous amounts of debug info", 143 " --host=", 144 " listen hostname for xml-rpc requests, default %s" % xmlrpcHost, 145 " --port=", 146 " listen port number for xml-rpc requests, default %s" % xmlrpcPort, 147 " --fcphost=", 148 " set hostname of freenet FCP interface, default %s" \ 149 % node.defaultFCPHost, 150 " --fcpport=", 151 " set port number of freenet FCP interface, default %s" \ 152 % node.defaultFCPPort, 153 ]) 154 155 sys.exit(ret)
156
157 -def testServer():
158 159 runServer(host="", fcpHost="127.0.0.1", verbosity=DETAIL)
160
161 -def runServer(**kw):
162 """ 163 Creates and runs a basic XML-RPC server for FCP access 164 165 For keyword parameters, refer FCPXMLRPCServer constructor 166 """ 167 FCPXMLRPCServer(**kw).run()
168
169 -def main():
170 """ 171 When this script is executed, it runs the XML-RPC server 172 """ 173 import getopt 174 175 opts = {'verbosity': node.INFO, 176 'host':xmlrpcHost, 177 'port':xmlrpcPort, 178 'fcpHost':node.defaultFCPHost, 179 'fcpPort':node.defaultFCPPort, 180 } 181 182 try: 183 cmdopts, args = getopt.getopt(sys.argv[1:], 184 "?hv:", 185 ["help", "verbosity=", "host=", "port=", 186 "fcphost=", "fcpport="]) 187 except getopt.GetoptError: 188 # print help information and exit: 189 usage() 190 sys.exit(2) 191 output = None 192 verbose = False 193 #print cmdopts 194 for o, a in cmdopts: 195 if o in ("-h", "--help"): 196 usage(ret=0) 197 elif o == "--host": 198 opts['host'] = a 199 elif o == "--port": 200 try: 201 opts['port'] = int(a) 202 except: 203 usage("Invalid port number '%s'" % a) 204 elif o == "--fcphost": 205 opts['fcpHost'] = a 206 elif o == "--fcpport": 207 opts['fcpPort'] = a 208 elif o in ['-v', '--verbosity']: 209 print "setting verbosity" 210 try: 211 opts['verbosity'] = int(a) 212 #print "verbosity=%s" % opts['verbosity'] 213 except: 214 usage("Invalid verbosity '%s'" % a) 215 216 #print "Verbosity=%s" % opts['verbosity'] 217 218 if opts['verbosity'] >= node.INFO: 219 print "Launching Freenet XML-RPC server" 220 print "Listening on %s:%s" % (opts['host'], opts['port']) 221 print "Talking to Freenet FCP at %s:%s" % (opts['fcpHost'], opts['fcpPort']) 222 223 try: 224 runServer(**opts) 225 except KeyboardInterrupt: 226 print "Freenet XML-RPC server terminated by user"
227 228 229 230 if __name__ == '__main__': 231 232 main() 233