1 import SocketServer
2 import SimpleHTTPServer
3 import urllib
4 import copy
5 import thread
6 from threading import Thread
7 import time
8 import sys
9 import os
10 from spade import ACLMessage
11 from xmpp import *
12
13 WEB_ADMIN_PORT = 8008
14
16
17
18 _body_template = "<table><tr><td class=cabecera colspan=2>#TOP#</td></tr><tr><td class=lateral>#MENU_LEFT#</td><td>#PANEL_RIGHT#</td></tr><tr><td>#BOTTOM#</td></tr></table>"
19
20 - def header(self, title="SPADE WEB ADMIN"):
21 try:
22 os.stat("modules/web/webadmin.css")
23 return "<html><head><link rel=stylesheet type='text/css' href='modules/web/webadmin.css'><title>" + title + "</title></head>"
24 except:
25 return "<html><head><link rel=stylesheet type='text/css' href='xmppd/modules/web/webadmin.css'><title>" + title + "</title></head>"
26
27
28 - def body(self, body = ""):
29 return "<body>" + str(body)
30
33
34 - def getPage(self, req):
35 """
36 Return the page name from a raw GET line
37 """
38 return req.split("?")[0]
39
41 """
42 Return the variables and values from a raw GET or POST request line
43 """
44 d = dict()
45 try:
46 raw_vars = req.split("?")[1]
47 print "RAW_VARS", raw_vars
48 for raw in raw_vars.split("&"):
49 print raw
50 var = raw.split("=")
51 if len(var) > 1:
52 d[var[0]] = var[1]
53 else:
54 d[var[0]] = ""
55 print var
56 except:
57 pass
58
59 return d
60
62 """
63 Send a message to a client
64 """
65
66 to = to.replace("%40", "@")
67 to = to.replace("%2F", "/")
68 stanza = Message(to=to, body=msg, frm=self.server.xmppd.servernames[0])
69 print "CREATED STANZA: " + str(stanza)
70 s = None
71 s = self.server.xmppd.getsession(to)
72 if s:
73 print "SENDING MSG TO " + to
74 s.enqueue(stanza)
75 else:
76 print "NO SESSION FOR MESSAGE"
77 return
78
84
85
87 self._body = copy.copy(self._body_template)
88 self._body = self._body.replace("#TOP#", "<h1>SPADE WEB ADMIN</h1>")
89 self._body = self._body.replace("#MENU_LEFT#", '<a class=lateral href="/">Main</a><br/><a class=lateral href="/pref">Preferences</a><br/><a class=lateral href="/clients">Active Clients</a><br/><a class=lateral href="/plugins">Plugins</a>')
90 self._body = self._body.replace("#PANEL_RIGHT#", """<h2>MAIN CONTROL PANEL</h2><br>#MAINCP#""")
91
92
94 print "POST"
95
96 self._POST_REQ = ""
97 try:
98 length = int(self.headers.getheader('content-length'))
99 self._POST_REQ = self.rfile.read(length)
100 except:
101 pass
102
103 print "_POST_REQ:", self._POST_REQ
104
105 self.do_GET()
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
122 """
123 GET petitions handler
124 """
125
126
127 request = self.raw_requestline.split()
128 page = self.getPage(request[1])
129 try:
130 vars = self.getVars("?"+self._POST_REQ)
131 except:
132 vars = self.getVars(request[1])
133 print page, vars
134 self._content = ""
135
136 if page.endswith("css"):
137
138 try:
139 f = open(page[1:], "r")
140 self.copyfile(f, self.wfile)
141 f.close()
142 except:
143 print "Could not open file: ", page[1:]
144 elif page == "/send":
145 self.setPageTemplate()
146 cp = """<table><tr><td>Send a Jabber message to agent """ + vars['to'] + """<br/>
147 <FORM ACTION="/clients" METHOD="POST">
148 <INPUT TYPE="text" NAME="msg"><BR/>
149 <INPUT TYPE="hidden" NAME="to" VALUE='"""+vars['to']+"""'>
150 <INPUT TYPE="hidden" NAME="jabber" VALUE="YES">
151 <INPUT TYPE="submit" VALUE="Send">
152 </FORM></td></tr>
153 """
154 cp = cp + """
155 <tr><td>
156 Send a FIPA message to agent """ + vars['to'] + """<br/>
157 <FORM ACTION="/clients" METHOD="POST">
158 <SELECT NAME="performative">
159 <OPTION VALUE="accept-proposal">Accept-Proposal</OPTION>
160 <OPTION VALUE="agree">Agree</OPTION>
161 <OPTION VALUE="cancel">Cancel</OPTION>
162 <OPTION VALUE="cfp">CFP</OPTION>
163 <OPTION VALUE="confirm">Confirm</OPTION>
164 <OPTION VALUE="disconfirm">Disconfirm</OPTION>
165 <OPTION VALUE="failure">Failure</OPTION>
166 <OPTION VALUE="inform">Inform</OPTION>
167 <OPTION VALUE="not-understood">Not-Understood</OPTION>
168 <OPTION VALUE="propagate">Propagate</OPTION>
169 <OPTION VALUE="propose">Propose</OPTION>
170 <OPTION VALUE="proxy">Proxy</OPTION>
171 <OPTION VALUE="query-if">Query-If</OPTION>
172 <OPTION VALUE="query-ref">Query-Ref</OPTION>
173 <OPTION VALUE="refuse">Refuse</OPTION>
174 <OPTION VALUE="reject-proposal">Reject-Proposal</OPTION>
175 <OPTION VALUE="request">Request</OPTION>
176 <OPTION VALUE="request-when">Request-When</OPTION>
177 <OPTION VALUE="request-whenever">Request-Whenever</OPTION>
178 <OPTION VALUE="subscribe">Subscribe</OPTION>
179 </SELECT>
180 <INPUT TYPE="text" NAME="content">Content<BR/>
181 <INPUT TYPE="hidden" NAME="to" VALUE='"""+vars['to']+"""'>
182 <INPUT TYPE="hidden" NAME="fipa" VALUE="YES">
183 <INPUT TYPE="submit" VALUE="Send">
184 </FORM>
185 </td></tr>
186 """
187 self._body = self._body.replace("#MAINCP#", cp)
188 self._body = self._body.replace("#BOTTOM#", '')
189 self._content = self.header() + self.body(self._body) + self.footer("<h5>Designed by <a href='http://gti-ia.dsic.upv.es'>GTI-IA DSIC UPV</a></h5>")
190
191 elif page == "/clients":
192
193 if vars.has_key("jabber"):
194 if vars.has_key("to") and vars.has_key("msg"):
195
196 self.sendMsg(vars["to"], vars["msg"])
197 elif vars.has_key("fipa"):
198 self.sendFIPAMsg(vars["to"], vars["performative"], vars["content"])
199
200 self.setPageTemplate()
201 cp = """Below there is the list of the currently connected clients.<br/>
202 <table><tr><th colspan=2>Active Connections</th></tr>"""
203 i = 0
204
205 for cl in self.server.xmppd.routes.keys():
206
207 j = JID(str(cl)).getStripped()
208 res = JID(str(cl)).getResource()
209 try:
210
211 pres_data = self.server.xmppd.Router._data[j]
212
213 pres = pres_data[res]
214
215 except Exception, e:
216
217
218
219 pres = ""
220
221
222 if i%2 == 1:
223 cp = cp + """<tr><td class=impar>"""
224 else:
225 cp = cp + """<tr><td class=par>"""
226 cp = cp + """<a href='/send?to="""+str(cl)+"""'>""" + str(cl) + """</a></td><td>""" + simplexml.XMLescape(str(pres)) + """</td></tr>"""
227
228
229 i = i + 1
230
231 cp = cp + """</table>"""
232 self._body = self._body.replace("#MAINCP#", cp)
233 self._body = self._body.replace("#BOTTOM#", '')
234 self._content = self.header() + self.body(self._body) + self.footer("<h5>Designed by <a href='http://gti-ia.dsic.upv.es'>GTI-IA DSIC UPV</a></h5>")
235
236 elif page == "/":
237 self.setPageTemplate()
238 cp = """Below are the jabber server settings. If you wish to know more about jabber servers, please visit <a href="http://www.jabber.org">this</a> link.<br>
239 <table><tr><td>
240 <table class=titulo><tr><td colspan=2>Server Configuration</td></tr></table>
241 <table class=linea><tr><td>Server name:</td><td align="right">#SERVERNAME#</td></tr></table>
242 <table class=linea><tr><td>System Platform:</td><td align="right">#PLATFORM#</td></tr></table>
243 <table class=linea><tr><td>Python Version:</td><td align="right">#PYTHONVERSION#</td></tr></table>
244 <table class=linea><tr><td>Time:</td><td align="right">#TIME#</td></tr></table>
245 </td></tr></table>
246 """
247
248 self._body = self._body.replace("#MAINCP#", cp)
249 self._body = self._body.replace("#BOTTOM#", '')
250 servernames = ""
251 for sn in self.server.xmppd.servernames:
252 servernames = servernames + sn + " "
253 self._body = self._body.replace("#SERVERNAME#", servernames)
254 self._body = self._body.replace("#PLATFORM#", sys.platform)
255 self._body = self._body.replace("#PYTHONVERSION#", sys.version)
256 self._body = self._body.replace("#TIME#", time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime()))
257 self._content = self.header() + self.body(self._body) + self.footer("<h5>Designed by <a href='http://gti-ia.dsic.upv.es'>GTI-IA DSIC UPV</a></h5>")
258 else:
259 self._content = self.header() + self.body() + self.footer()
260 self.wfile.write(self._content)
261
263 NS=''
265 self.server = server
266 XMPPD_SERVER = server
267 try:
268 self.httpd = None
269 self.httpd = SocketServer.ThreadingTCPServer(('', WEB_ADMIN_PORT), WebAdminHandler)
270
271 self.httpd.xmppd = self.server
272 self.httpd.server_name = "SPADE_WEB_ADMIN"
273 self.httpd.server_port = str(WEB_ADMIN_PORT)
274 self.DEBUG("WebAdmin serving at port "+str(WEB_ADMIN_PORT),"ok")
275
276 thread.start_new_thread(self.httpd.serve_forever, ())
277
278 except:
279 self.DEBUG("WebAdmin Error: could not open port "+str(WEB_ADMIN_PORT),"error")
280
281
283 self.DEBUG("WebAdmin plugging out","info")
284 if self.httpd: del self.httpd
285
286
287
288 if __name__ == "__main__":
289 pass
290