1
2 """
3 fcpxmlrpc.py
4
5 Exposes some pyFreenet primitives over an XML-RPC service
6 """
7
8
9 import sys
10 from SimpleXMLRPCServer import SimpleXMLRPCServer
11 from SocketServer import ThreadingMixIn
12
13
14 import node
15
16
17 xmlrpcHost = "127.0.0.1"
18 xmlrpcPort = 19481
19
21 """
22 Multi-threaded XML-RPC server for freenet FCP access
23 """
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
37 host = kw.get('host', xmlrpcHost)
38 port = kw.get('port', xmlrpcPort)
39
40 SimpleXMLRPCServer.__init__(self, (host, port))
41
42
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
53 hdlr = FreenetXMLRPCRequestHandler(self.node)
54
55
56 self.register_instance(hdlr)
57 self.register_introspection_functions()
58
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
71 """
72 Simple class which exposes basic primitives
73 for freenet xmlrpc server
74 """
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
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
160
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
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
189 usage()
190 sys.exit(2)
191 output = None
192 verbose = False
193
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
213 except:
214 usage("Invalid verbosity '%s'" % a)
215
216
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