Package spade :: Package xmppd :: Package modules :: Module webadmin
[hide private]
[frames] | no frames]

Source Code for Module spade.xmppd.modules.webadmin

  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   
15 -class WebAdminHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
16 #class WebAdminHandler(CGIHTTPServer.CGIHTTPRequestHandler): 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) # + "</body>"
30
31 - def footer(self, foot = ""):
32 return foot+"</body>"+"</html>"
33
34 - def getPage(self, req):
35 """ 36 Return the page name from a raw GET line 37 """ 38 return req.split("?")[0]
39
40 - def getVars(self, req):
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
61 - def sendMsg(self, to, msg):
62 """ 63 Send a message to a client 64 """ 65 # Translate 'to' to proper address (convert @ and /) 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
79 - def sendFIPAMsg(self, to, performative, content):
84 #self.myAgent.send(msg) 85
86 - def setPageTemplate(self):
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
93 - def do_POST(self):
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 # def do_POST(self): 108 # """Serve a POST request. 109 # This is only implemented for CGI scripts. 110 # """ 111 # 112 # self.cgi_directories.append("/xmppd/modules/web") 113 # self.cgi_directories.append("/modules/web") 114 # if self.is_cgi(): 115 # self.run_cgi() 116 # else: 117 # self.send_error(501, "Can only POST to CGI scripts") 118 # 119 # print "READ: ", self.rfile.read() 120
121 - def do_GET(self):
122 """ 123 GET petitions handler 124 """ 125 #print "ENVIRON: ", str(os.environ) 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 # Switch page 136 if page.endswith("css"): 137 #self.copyfile(urllib.urlopen(self.path), self.wfile) 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 # First of all, see if we need to send a message 193 if vars.has_key("jabber"): 194 if vars.has_key("to") and vars.has_key("msg"): 195 # Yup, a message 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 # We are going to list all the current routes present in the server 205 for cl in self.server.xmppd.routes.keys(): 206 # Now, for the presence information 207 j = JID(str(cl)).getStripped() 208 res = JID(str(cl)).getResource() 209 try: 210 #print "J", j, "RES", res 211 pres_data = self.server.xmppd.Router._data[j] 212 #print "PRES_DATA: " + str(pres_data) 213 pres = pres_data[res] 214 #print "PRES: " + str(pres) 215 except Exception, e: 216 # There was no presence information 217 #print "EXCEPCION EN LA PRESENCIA" 218 #print str(e) 219 pres = "" 220 221 # Odd or even 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 # Update the even/odd index 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
262 -class WebAdmin(PlugIn):
263 NS=''
264 - def plugin(self, server):
265 self.server = server 266 XMPPD_SERVER = server 267 try: 268 self.httpd = None 269 self.httpd = SocketServer.ThreadingTCPServer(('', WEB_ADMIN_PORT), WebAdminHandler) 270 # This connects xmmpd with the request handler and server 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 #print "WebAdmin: Serving at port", WEB_ADMIN_PORT 276 thread.start_new_thread(self.httpd.serve_forever, ()) 277 #self.httpd.serve_forever() 278 except: 279 self.DEBUG("WebAdmin Error: could not open port "+str(WEB_ADMIN_PORT),"error")
280 #if self.httpd: del self.httpd 281
282 - def plugout(self):
283 self.DEBUG("WebAdmin plugging out","info") 284 if self.httpd: del self.httpd
285 286 287 # Debug main code 288 if __name__ == "__main__": 289 pass 290