Skip to content

Commit

Permalink
1) Added a roster controller in the Web User Interface (wui)
Browse files Browse the repository at this point in the history
2) Fixed an issue when guessing the external ip
  • Loading branch information
javipalanca committed May 15, 2013
1 parent 038572a commit 094efd6
Show file tree
Hide file tree
Showing 10 changed files with 156 additions and 18 deletions.
56 changes: 56 additions & 0 deletions examples/social.py
@@ -0,0 +1,56 @@
# -*- coding: utf-8 -*-
import time

import sys
sys.path.append("..")

import spade

host = "127.0.0.1"


if __name__ == "__main__":
jida = "a@" + host
jidb = "b@" + host
jidc = "c@" + host

a = spade.Agent.Agent(jida, "secret")
a.start()
#a.setDebugToScreen()

b = spade.Agent.Agent(jidb, "secret", "work")
b.start()
b2 = spade.Agent.Agent(jidb, "secret", "home")
b2.start()
#b.setDebugToScreen()

c = spade.Agent.Agent(jidc, "secret", "travel")
c.start()
#c.setDebugToScreen()

a.roster.acceptAllSubscriptions()
b.roster.acceptAllSubscriptions()
c.roster.acceptAllSubscriptions()
b2.roster.acceptAllSubscriptions()
b.roster.followbackAllSubscriptions()
b2.roster.followbackAllSubscriptions()
c.roster.followbackAllSubscriptions()
a.roster.subscribe(jidb)
a.roster.subscribe(jidc)

a.wui.start()
b.wui.start()
b2.wui.start()
c.wui.start()


alive = True
while alive:
try:
time.sleep(1)
except:
alive=False

a.stop()
b.stop()
c.stop()
18 changes: 16 additions & 2 deletions spade/Agent.py
Expand Up @@ -139,6 +139,7 @@ def __init__(self, agentjid, serverplatform, p2p=False):
self.wui.registerController("search", self.WUIController_search)
self.wui.registerController("send", self.WUIController_sendmsg)
self.wui.registerController("sent", self.WUIController_sent)
self.wui.registerController("roster", self.WUIController_roster)
self.wui.passwd = None

self._aclparser = ACLParser.ACLxmlParser()
Expand Down Expand Up @@ -200,7 +201,7 @@ def WUIController_admin(self):
behavs[id(k)] = k
for attribute in self.__dict__:
if eval("type(self." + attribute + ") not in [types.MethodType, types.BuiltinFunctionType, types.BuiltinMethodType, types.FunctionType]"):
if attribute not in ["_agent_log"]:
if attribute not in ["_agent_log", "_messages"]:
attrs[attribute] = eval("str(self." + attribute + ")")
sorted_attrs = attrs.keys()
sorted_attrs.sort()
Expand All @@ -214,6 +215,15 @@ def WUIController_admin(self):
def WUIController_log(self):
return "log.pyra", {"name": self.getName(), "log": self.getLog()}

@require_login
def WUIController_roster(self):
roster = {}
for friend in self.roster.getContacts():
if friend == self.getName():
continue
roster[friend] = self.roster.getContact(friend)
return "agent_roster.pyra", {"name": self.getName(), "roster": roster}

@require_login
def WUIController_messages(self, agents=None):
index = 0
Expand Down Expand Up @@ -716,7 +726,11 @@ def getDomain(self):
return self._serverplatform

def getP2PUrl(self):
return str("spade://" + socket.gethostbyname(socket.gethostname()) + ":" + str(self._P2P.getPort()))
try:
ip = socket.gethostbyname_ex(socket.gethostname())[2][0]
except:
ip = socket.gethostbyname(socket.gethostname())
return str("spade://" + ip + ":" + str(self._P2P.getPort()))

def requestDiscoInfo(self, to):

Expand Down
2 changes: 1 addition & 1 deletion spade/Platform.py
Expand Up @@ -212,7 +212,7 @@ def get_roster(self):
try:
del r["roster"]["__ir__"]
except: pass
return "roster.pyra", dict(name=platform, servername=servername, platform=platform, version=version, time=the_time, roster=roster)
return "rosterdb.pyra", dict(name=platform, servername=servername, platform=platform, version=version, time=the_time, roster=roster)

def getMembers(self, aname):
msg = spade.ACLMessage.ACLMessage()
Expand Down
59 changes: 59 additions & 0 deletions spade/templates/agent_roster.pyra
@@ -0,0 +1,59 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
<meta name="description" content="description"/>
<meta name="keywords" content="keywords"/>
<meta name="author" content="author"/>
<link rel="stylesheet" type="text/css" href="magwood.css" media="screen"/>
<link rel="stylesheet" type="text/css" href="table.css" media="screen"/>

<title>@!name!@ - SPADE Web Interface</title>
</head>

<!--(include)-->
header.pyra
<!--(end)-->
<!--(if "acc" in name)-->
@!header(item="roster",admin="True")!@
<!--(else)-->
@!header(item="roster",admin="False")!@
<!--(end)-->


<div id="templatemo_background_section_mid">

<div class="templatemo_container">
<div id="templatemo_content_area">
<div id="templatemo_left_section">
<div class='main section' id='main'>

<h1 class="templatemo_left_section_box_top">Roster</h1>
<table class="servicesT" cellspacing="0">
<!--(for jid, v in roster.items())-->
<!--(if len(v['resources'])>0)-->
<tr>
<td rowspan=@!len(v['resources'])+1!@><img src="statusGreen.png" width="10" height="10"></td>
<td><b>@!str(jid)!@</b></td>
</tr>
<!--(for res, stat in v['resources'].items())-->
<tr><td>@!str(res)!@: @!str(stat)!@</td></tr>
<!--(end)-->
<!--(else)-->
<tr>
<td><img src="statusRed.png" width="10" height="10"></td>
<td><b>@!str(jid)!@</b></td>
</tr>
<!--(end)-->
<!--(end)-->
</table>

</div>
</div>

<div class="cleaner_with_height"></div>


</div>
@!footer!@
14 changes: 9 additions & 5 deletions spade/templates/header.pyra
Expand Up @@ -37,13 +37,17 @@
<!--(else)-->
<li><a href='services' title='Services'><span class='left'>Services</span></a></li>
<!--(end)-->
<!--(if item=="roster")-->
<li><a class='current' href='roster' title='Roster'><span class='left'>Roster</span></a></li>
<!--(else)-->
<li><a href='roster' title='Roster'><span class='left'>Roster</span></a></li>
<!--(end)-->
<!--(end)-->

<!--(if "ams" not in name and "df" not in name)-->
<!--(if item=="roster")-->
<li><a class='current' href='roster' title='Roster'><span class='left'>Roster</span></a></li>
<!--(else)-->
<li><a href='roster' title='Roster'><span class='left'>Roster</span></a></li>
<!--(end)-->
<!--(end)-->


<!--(if item=="admin")-->
<li><a class='current' href='admin' title='Admin'><span class='left'>Admin</span></a></li>
<!--(else)-->
Expand Down
Expand Up @@ -15,7 +15,7 @@
<!--(include)-->
header.pyra
<!--(end)-->
@!header(item="roster",admin="True")!@
@!header(item="rosterdb",admin="True")!@


<div id="templatemo_background_section_mid">
Expand Down
Binary file added spade/templates/statusGreen.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added spade/templates/statusRed.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added spade/templates/statusYellow.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
23 changes: 14 additions & 9 deletions spade/wui.py
Expand Up @@ -100,7 +100,11 @@ def notifyAMS(self):
from spade.AMS import AmsAgentDescription
aad = AmsAgentDescription()
aid = self.owner.getAID()
aid.addAddress("awui://" + str(socket.gethostbyname(socket.gethostname())) + ":" + str(self.port))
try:
ip = socket.gethostbyname_ex(socket.gethostname())[2][0]
except:
ip = socket.gethostbyname(socket.gethostname())
aid.addAddress("awui://" + str(ip) + ":" + str(self.port))
aad.setAID(aid)
self.owner.modifyAgent(aad)

Expand Down Expand Up @@ -301,33 +305,34 @@ def do_GET(self):
ret = {"template": page, "error": str(_err), "name": self.server.owner.owner.getName()}
code = 501

#check if user is authenticated
authenticated = False
if hasattr(sess, "user_authenticated"):
if sess.user_authenticated is True:
authenticated = True
ret['authenticated'] = authenticated
try:
if os.path.exists(self.server.owner.template_path + os.sep + template):
t = pyratemp.Template(filename=self.server.owner.template_path + os.sep + template, data=ret)
else:
#olddir = os.path.curdir
#os.chdir(self.server.spade_path)
authenticated = False
if hasattr(sess, "user_authenticated"):
if sess.user_authenticated is True:
authenticated = True
ret['authenticated'] = authenticated
t = pyratemp.Template(filename=self.server.owner.spade_path + os.sep + "templates" + os.sep + template, data=ret)
#print template, ret
#os.chdir(olddir)
except pyratemp.TemplateSyntaxError, e:
_exception = sys.exc_info()
if _exception[0]:
_err = ''.join(traceback.format_exception(_exception[0], _exception[1], _exception[2])).rstrip()
t = pyratemp.Template(filename=self.server.owner.spade_path + os.sep + "templates" + os.sep + "501.pyra", data={"template": template, "error": str(_err), "name": self.server.owner.owner.getName()})
t = pyratemp.Template(filename=self.server.owner.spade_path + os.sep + "templates" + os.sep + "501.pyra", data={"template": template, "error": str(_err), "name": self.server.owner.owner.getName(), "authenticated":authenticated})
code = 501
except Exception, e:
#No template
_exception = sys.exc_info()
if _exception[0]:
_err = ''.join(traceback.format_exception(_exception[0], _exception[1], _exception[2])).rstrip()
#print "###", _err, "###"
t = pyratemp.Template(filename=self.server.owner.spade_path + os.sep + "templates" + os.sep + "503.pyra", data={"page": template, "name": self.server.owner.owner.getName()})
t = pyratemp.Template(filename=self.server.owner.spade_path + os.sep + "templates" + os.sep + "503.pyra", data={"page": template, "name": self.server.owner.owner.getName(), "authenticated":authenticated})
code = 503
try:
result = t()
Expand All @@ -336,7 +341,7 @@ def do_GET(self):
_exception = sys.exc_info()
if _exception[0]:
_err = ''.join(traceback.format_exception(_exception[0], _exception[1], _exception[2])).rstrip()
t = pyratemp.Template(filename=self.server.owner.spade_path + os.sep + "templates" + os.sep + "501.pyra", data={"template": template, "error": str(_err), "name": self.server.owner.owner.getName()})
t = pyratemp.Template(filename=self.server.owner.spade_path + os.sep + "templates" + os.sep + "501.pyra", data={"template": template, "error": str(_err), "name": self.server.owner.owner.getName(), "authenticated":authenticated})
result = t()
code = 501

Expand Down

0 comments on commit 094efd6

Please sign in to comment.