1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 """
30 @summary:
31 The XML-RPC version of a LogServer connection.
32 This is a slow way to log
33 (mainly because of the unnecessary overhead of
34 xml-rpc blocking calls), but simple and robust.
35 Use it when the performance is good enough for you.
36 @author: Ruben Reifenberg
37 """
38
39 from SimpleXMLRPCServer import SimpleXMLRPCServer
40 import pickle
41
42
43
45 """
46 """
48 """
49 @return: "" if all right, error msg if not
50 """
51 self.s = logServer
52
53
54 - def log(self, kwargs_ps):
55 """
56 No threading, xmlrpc blocks until return
57 """
58 try:
59 kwargs = pickle.loads(kwargs_ps.data)
60 except Exception,e:
61 return "invalid pickle data:"+str(e)
62 if kwargs["special"] is None: kwargs["special"] = {}
63 try:
64
65 self.s.log(**kwargs)
66 except Exception,e:
67 return "log failed:"+str(e)
68 return ""
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
89 """
90 @rtype: int
91 @return: unique id
92 """
93 return self.s.addClient()
94
95
96
98 """
99 Creates server that does no multithreading.
100 Remark: The SimpleXMLRPCServer seems to do no multithreading,
101 except we use MixIn class.
102 Indeed, I found that a second client
103 is blocked as long as the server is processing another request.
104 (Python 2.4)
105 @param ports: list or iterator of port numbers
106 Multiple ports address the problem that a socket is for some time
107 "already in use" when restarting the server.
108 The first free port of the ports is used.
109 """
110 for port in ports:
111 try:
112 res = SimpleXMLRPCServer((host,port))
113 except Exception, e:
114 print "Retrying:%s"%(e)
115 else:
116 res.logRequests = 0
117 return res
118
119
120
121 -def startServer(logServer,ports,host="localhost",readyMsg=True):
122 """
123 Run the given logServer as an xmlrpc server (forever).
124 @param ports: see L{createSimpleXMLRPCServer}
125 """
126 server = createSimpleXMLRPCServer(host,ports)
127 adapter = LogAdapter(logServer)
128 server.register_function(adapter.log, "log")
129 server.register_function(adapter.addClient, "addClient")
130 if readyMsg: print "log server ready. Available at host,port: %s"%(str(server.server_address))
131 server.serve_forever()
132