From 094efd6fffe79fbff1d45fe0006eee62cd791d75 Mon Sep 17 00:00:00 2001 From: Javi Palanca Date: Wed, 15 May 2013 17:47:57 +0200 Subject: [PATCH] 1) Added a roster controller in the Web User Interface (wui) 2) Fixed an issue when guessing the external ip --- examples/social.py | 56 +++++++++++++++++ spade/Agent.py | 18 +++++- spade/Platform.py | 2 +- spade/templates/agent_roster.pyra | 59 ++++++++++++++++++ spade/templates/header.pyra | 14 +++-- .../templates/{roster.pyra => rosterdb.pyra} | 2 +- spade/templates/statusGreen.png | Bin 0 -> 2954 bytes spade/templates/statusRed.png | Bin 0 -> 2864 bytes spade/templates/statusYellow.png | Bin 0 -> 2854 bytes spade/wui.py | 23 ++++--- 10 files changed, 156 insertions(+), 18 deletions(-) create mode 100644 examples/social.py create mode 100755 spade/templates/agent_roster.pyra rename spade/templates/{roster.pyra => rosterdb.pyra} (96%) create mode 100644 spade/templates/statusGreen.png create mode 100644 spade/templates/statusRed.png create mode 100644 spade/templates/statusYellow.png diff --git a/examples/social.py b/examples/social.py new file mode 100644 index 00000000..944a141e --- /dev/null +++ b/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() diff --git a/spade/Agent.py b/spade/Agent.py index ca1f0b22..454c4feb 100644 --- a/spade/Agent.py +++ b/spade/Agent.py @@ -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() @@ -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() @@ -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 @@ -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): diff --git a/spade/Platform.py b/spade/Platform.py index b6b01103..23d0a97e 100644 --- a/spade/Platform.py +++ b/spade/Platform.py @@ -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() diff --git a/spade/templates/agent_roster.pyra b/spade/templates/agent_roster.pyra new file mode 100755 index 00000000..cd2ecb13 --- /dev/null +++ b/spade/templates/agent_roster.pyra @@ -0,0 +1,59 @@ + + + + + + + + + + + +@!name!@ - SPADE Web Interface + + + +header.pyra + + +@!header(item="roster",admin="True")!@ + +@!header(item="roster",admin="False")!@ + + + +
+ +
+
+
+
+ +

Roster

+ + + + + + + + + + + + + + + + + +
@!str(jid)!@
@!str(res)!@: @!str(stat)!@
@!str(jid)!@
+ +
+
+ +
+ + +
+@!footer!@ diff --git a/spade/templates/header.pyra b/spade/templates/header.pyra index 081e3655..de13bc64 100644 --- a/spade/templates/header.pyra +++ b/spade/templates/header.pyra @@ -37,13 +37,17 @@
  • Services
  • - -
  • Roster
  • - -
  • Roster
  • - + + +
  • Roster
  • + +
  • Roster
  • + + + +
  • Admin
  • diff --git a/spade/templates/roster.pyra b/spade/templates/rosterdb.pyra similarity index 96% rename from spade/templates/roster.pyra rename to spade/templates/rosterdb.pyra index 612947af..7f364f64 100755 --- a/spade/templates/roster.pyra +++ b/spade/templates/rosterdb.pyra @@ -15,7 +15,7 @@ header.pyra -@!header(item="roster",admin="True")!@ +@!header(item="rosterdb",admin="True")!@
    diff --git a/spade/templates/statusGreen.png b/spade/templates/statusGreen.png new file mode 100644 index 0000000000000000000000000000000000000000..f7529872c20202d9e163e3a2dc9839e1656273b3 GIT binary patch literal 2954 zcmb_edpwhUAD(T_)HCNu);cNdU{>2`PIH)YNQr;=kt zN2T0?>?V<_r2?TUDx+_eSi0Te->+JV<9W0Dg^)lWJ#7p zd%+nhJS4;f-<;s!DZxpSZMl;J07%OV4-r6Swh90M4rh=lT#EHpJdMSKQ{7o^bU2U6 z7O(*T10G&*$)t0sP#)9AmxJeRhRreXf@>j+fI;Ud+`XG&6l*)EDa)S@#lTT;T^KLsv9eSyBP)(Hv0LQUni6Ovym@nK9wLJf=6W|P;eyT zr?Wt4AjpWfX1Oyw_7SOEIzbnS#ONS5>L7K=C=6Z?jYp#m5Q{j!dd{g${pnOL%b(0* z`4EhSBZS&{vA8Ub7mE!w^Pw~8zFZDe7mobyvyeS+WPlJRT99yVe8R;o!v9xtF2m#3 zjQ=gVu=0C$A&R&4X9!kE6;76bGC=%>El4|8+i6eduzUjM_?vX+1q;E&0#g=~?N8@$ zgbgtB{Ds(J{xAO>z6>tmM~g-9V%6Nt1-GR?gGTb@()|T3=R^H4_%ma%7v)zk!q12c z!Fj>|ZR6-X#ve9LSowY9gecyQ!K3?7hz!9EHaASUHJkOr}U)cX0Mm z*r7l`*Y|wuIIq*)(E+ULb}%~nDcuqV(NdM)>J4J8opDY5OD^Gtcy7qkW=lOt#L~4B zGV7< zm~6A_>C57~zuxg=eaH>%27XIv5^%R?p7LMX)C(BMlQuiSA~=w>$*O+Hy}nw zy^EQAa2B8R4DLRvaKof|GN?$S?*)ZaF5?}imakj6#C)w-{)cqwK73bFsNc{{!|SG7 zd|TzPQ#)=dzIB(_ zf1pH8o_M7Q@os6nilyMhYAZ!E_JQnUW$xT7aOJ{)hxl^cl@<9Z$V=c5aY!}Qk@n0y zHB?E)BTu8$sZ&i!1$sE-K`bgRLMxE{vFb%Qt;Z`7`dT#az(bNLOfB+L!ZcD(uTDDp zfCGU5EEugUTYoluA9{V<7TikN*o31JB1fcYV6Vso9mT<`r3WF=Y^;n7>QW;C*gL4h zH~K5y$Nag9-=y-kcR><3>W>;*R23_$5$>gZ?ZIa}3s*bh+ z6%t9I~+VUHW$d$FoXdj;m4PfApM%Ka5r4x{8%95ym7 zYQ2~3nL=rbw96)u_sO|wc?VDq%0?(TTdoyw*= z`CJ8s6Un`1?&B`+pF4}Dj-Cw4g$?CHS09xuXA*{{r*lBrwV~tKF+e;+b*)N@8S!EdaE7G z+pL0%hp#6Xhq2`zIGC+ldn_dwebTlZ3LbxrCHfNgm*#5J4hfVZFCWv>_7{A+t-e(e zF1pvaIN3Img8F+E0=Iq@*?w}?FY`W9>?$R)>unF^xu*op45-)Mr5_wPDgrAJ{ol;+fY|(VMcNvD*3l z;h5!B4R)9Bw+{?)K4;c>S38*4Nk_DLk+4Nl#xJr~Cn!RqI#=m;^UT0(d$Jf)%6U8R+Wsx4IR_Y@lN8t8W9H=^a zz^1=a{bT6FUNkee&JY=-MrCfje9m)eG+h#kEm?Qayua^7K*_)+>A0yb4OZEs3;6*$ zM8aD*9M+!o`& zS2EYK&?+iMgjJPSx{Bu(@0!lrQ#KNO+(ze%TpTAWX<&thhgdyszhS8QS8Kgbh0u3c zC%L=3i?3LLL!_QYo(4lU7@fLcno%7?+SBRQto=ql_FEZ%Kx84MY>dEGZsG>!9QWd> za;?NQFk^F;E?wp`(PJ7D-Zpr<3&__*iq=%F2@7cA?HZO}Y1N>*uK&=8%d+mID+uy9 QO!#k^WM)GwHF1sj2U-%X?f?J) literal 0 HcmV?d00001 diff --git a/spade/templates/statusRed.png b/spade/templates/statusRed.png new file mode 100644 index 0000000000000000000000000000000000000000..6b6e3c95f5c8b5e29102d14bea0f66a1f35273dd GIT binary patch literal 2864 zcmb_edpwhUA6`+IM-Hiw!O# zp&~kb>Miv;L_$)Yh(b?Jy_-~Cy}j>0?>?V<_r2@;y{_wbeSi0Te|F5l-ckyv1Oxy8 zQr1>@N5L5+JjB-uzS$umlY)~3)5?_%07$ME9;*O3xe5S)XavoPz#-V#q9_c1DA|K? zhzjNUGX>oM0Gf*uT>4WvWDwWikIqJMG2q1xl;Bzj!@!`$7LG3lOt5nR;TS9`NFR!T z>VmOA5D0{3d3d56@fJ&T!7mKho5NwEV6foeU}!KB%3yiH5XQ#FFt{#ES64^Sp~L3U zIb^O5ovr>&Yjl`tey>r$6(D5uLr1N{|o6B{N|N zC>-`fSwKV!GNSAl9yCuLp3I?Qb>VP*9k{U$0^x)(M!}6x2t71xMbA&qMK+E_C36@o zCkDe0Yc3oi$ibVzVX(a!OwcYrsy~&^VS{v`@NYWHyO)H}Fkzx)2^YsFT-*x$e=$fV+QpiyBbCkY3ta3s)LkMh2Uiks41Xqz z%4RP&SdOji|Ea%^PUB#|TdaUrvKD79xGh;UiZz`>WeF^oLVXwbeaA{I!cQ;kkBG~` zCBpx0+EG5i>;y-YHNiZ#&J zN9r%pmcc6-i&n0`vsza8uY>tEF2NfC3luyH-`_4+V3<~=D*&+8*&1)|M3884wy||` zQCRpuQ3Z*hr zn=|z_Ye5Z4Ya)YW6iH`32h1G)nkUI_JzKOxIydwYX4v%W=lRr6eOHnYA5o|0QMZoG zcT4bRrz5DYhOLk66&~c)H0L5Sl86>5AJK0fBi!MKdaox1`VPG8vFq~kE1z%cRZwdL zSwPPyDCNG#h7sP6(Gex`a~({QLc$PFj!wV-=6=H54L-+iXEyJ{%e>OB)K`sieBR7t zrR?m}@d--)l(MO(jn{?FQwjW*b9|V4Lfy5ZnRz$+Ib2-xhj;0fg}C!>83XNJ{U`I^~cWay?aXsj2zdtWUgq+Atg7s|a4vwYuh$ zrPAyE9Bq@G=;#<4%d4xtp7r8!haqE?CIbA`BD z5|`GLAeUej?a>_EmsvnOMGCdKoh&usUUsZ;CbMnsCc&s9(**uS5}qRg0j3XUeTqw~ z-&o;NqP>OhlhLlNN5YpQp14Hh5bbR1Qy$`^WkxeR`@6e+eV_I|*}kKt{8MLxY$8P5 z3N-APokY;oyjnF;Q6YtD*vC_3j3`u50)I(S;DY~E(0 z5g4G|yr+Cf+!x31a=Kr8(TGc!+z@>gQUKi{l9W5Jee&pw*|iU*HK$t2V*oxT6kC_E zzfI(*VN!#MT9%4LD+e(CT(r3_yya4ZWd-*re>4cp?E z^W9<|U!t@2uH?ObWf#9NW1B!OAb->f8nSf+Fc1_fxv_fRs)KjM+C=zbqgZ>NIFy=F zx@?{L>)_8yEYLejZ=v?1b2lFpORt|ey{bJgV?08ISOYu*JK&fO6tA4w6^k$?NgNFN zBYEG&TO%25CWJl-Q)&T@S*_{(8m(8uSFU;8A+svQAEZSpM<^{Yybm~^ONRC)n=g|2=c65yT z5s{M9#?on5Yh!tk^)XFxDL`?*&Xi3=&tk<~w-ch3OftFOrz_|}NAF3kRI`$@?b70_ zUB}iSKyMxraL3yQd&!$>9J{yPpi7oq8?&UKr^m?~1fA`e_NI-DE>8I&a!Qdv;c%V!AgoF;TiQ=0zt_jE1}Ibt$SPs(ZX{|GI+V z2BVP4JL=i*#p>_co}aL@5^LaJOtK&JBX#)%^ad1-p&TpA`Zkq5cW)#fTu>a|b1&L7 z-x#cMJR($<)QNnHdCQwrK3?>xu%RJ1uDYvTZ1kB`rmwW8w#nnvlufaJ6@lDB`a9Gx zmpVQ?mIsD|tbL7IFIkKSPJ%KUIq3 gABS&Vt{rSO1sL9FN=~Gi2>;Vs@3O~V-bp(8FDAE_fB*mh literal 0 HcmV?d00001 diff --git a/spade/templates/statusYellow.png b/spade/templates/statusYellow.png new file mode 100644 index 0000000000000000000000000000000000000000..68de6501dbaa960be413b51dd9ab46f28b58386e GIT binary patch literal 2854 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