Package spade :: Module Platform
[hide private]
[frames] | no frames]

Source Code for Module spade.Platform

  1  from AMS import AmsAgentDescription 
  2  from DF import DfAgentDescription, ServiceDescription, Service 
  3  from Agent import PlatformAgent, require_login 
  4  import xmpp 
  5  import threading 
  6  #import Agent 
  7  import Envelope 
  8  import FIPAMessage 
  9  import AID 
 10  import Behaviour 
 11  import os.path 
 12  import sys 
 13  import traceback 
 14  import SocketServer 
 15  import SimpleHTTPServer 
 16  import BaseHTTPServer 
 17  import time 
 18  import thread 
 19  import copy 
 20  import ACLMessage 
 21  import types 
 22  import ACLParser 
 23  import BasicFipaDateTime 
 24   
 25  #from swi import SWIHandler 
 26  from wui import * 
 27  from os.path import * 
28 29 -class PlatformRestart(Exception):
30 - def __init__(self): pass
31 - def __str__(self): return
32
33 34 35 -class SpadePlatform(PlatformAgent):
36 - class RouteBehaviour(Behaviour.Behaviour):
37 - def __init__(self):
39
40 - def _process(self):
41 msg = self._receive(True) 42 if (msg != None): 43 self.myAgent.DEBUG("SPADE Platform Received a message: " + str(msg)) 44 if msg.getSender() == self.myAgent.getAID(): 45 # Prevent self-loopholes 46 self.myAgent.DEBUG("ACC LOOP HOLE", "warn") 47 return 48 49 to_list = msg.getReceivers() 50 d = {} 51 for to in to_list: 52 if (self.myAgent.getAID().getName() != to.getName()): 53 if not to.getAddresses()[0] in d: 54 d[to.getAddresses()[0]]=list() 55 d[to.getAddresses()[0]].append(to) 56 for k,v in d.items(): 57 newmsg = msg 58 newmsg.to = v 59 try: 60 protocol, receiver_URI = k.split("://") 61 except: 62 self.myAgent.DEBUG("Malformed Agent Address URI: " + str(k),"error") 63 break 64 65 # Check if one of our MTPs handles this protocol 66 #switch(protocol) 67 if protocol in self.myAgent.mtps.keys(): 68 self.myAgent.DEBUG("Message through protocol " + str(protocol)) 69 #ap = ACLParser.ACLxmlParser() 70 #payload = ap.encodeXML(newmsg) 71 payload = str(newmsg) 72 73 envelope = Envelope.Envelope() 74 envelope.setFrom(newmsg.getSender()) 75 for i in newmsg.getReceivers(): 76 envelope.addTo(i) 77 envelope.setAclRepresentation("fipa.acl.rep.string.std") # Always the same? 78 envelope.setPayloadLength(len(payload)) 79 envelope.setPayloadEncoding("US-ASCII") 80 envelope.setDate(BasicFipaDateTime.BasicFipaDateTime()) 81 self.myAgent.mtps[protocol].send(envelope, payload) 82 else: 83 # Default case: it's an XMPP message 84 self.myAgent.DEBUG("Message through protocol XMPP") 85 platform = self.myAgent.getSpadePlatformJID().split(".",1)[1] 86 if not platform in receiver_URI: 87 # Outside platform 88 self.myAgent.DEBUG("Message for another platform") 89 self.myAgent.send(newmsg, "jabber") 90 else: 91 # THIS platform 92 self.myAgent.DEBUG("Message for current platform") 93 for recv in v: 94 #self.myAgent._sendTo(newmsg, recv.getName(), "jabber") 95 self.myAgent.send(newmsg, "jabber") 96 97 """ 98 if k[7:] != self.myAgent.getSpadePlatformJID(): 99 self.myAgent._sendTo(newmsg, k[7:]) 100 else: 101 for recv in v: 102 self.myAgent._sendTo(newmsg, recv.getName()) 103 # Reenviamos el msg a todos los destinatarios 104 # Tambien deberiamos comprobar el protocolo y usar una pasarela en el caso de que sea necesario. 105 #print "Message to", to.getName(), "... Posting!" 106 """ 107 else: 108 self.myAgent.DEBUG("ACC::dying... it shouldn't happen", 'err')
109
110 - def __init__(self, node, password, server, port, config=None):
111 PlatformAgent.__init__(self, node, password, server, port, config=config, debug=[]) 112 self.mtps = {}
113
114 - def _setup(self):
115 self.setDefaultBehaviour(self.RouteBehaviour()) 116 117 self.wui.registerController("index",self.index) 118 self.wui.registerController("agents", self.agents) 119 self.wui.registerController("services", self.services) 120 self.wui.setPort(8008) 121 self.wui.start() 122 123 # Load MTPs 124 for name,mtp in self.config.acc.mtp.items(): 125 #self.mtps[mtp.protocol] = mtp.instance(name) 126 try: 127 mtp_path = "."+os.sep+"spade"+os.sep+"mtp" 128 if os.path.exists(mtp_path): 129 sys.path.append(mtp_path) 130 else: 131 # This path should come from the config file . . . 132 mtp_path = os.sep+"usr"+os.sep+"share"+os.sep+"spade"+os.sep+"mtp" 133 sys.path.append(mtp_path) 134 135 mod = __import__(name) 136 self.mtps[mtp['protocol']] = mod.INSTANCE(name,self.config,self) 137 138 except Exception, e: 139 print "EXCEPTION IMPORTING MTPS: ",str(e) 140 _exception = sys.exc_info() 141 if _exception[0]: 142 msg='\n'+''.join(traceback.format_exception(_exception[0], _exception[1], _exception[2])).rstrip() 143 print msg
144
145 - def takeDown(self):
146 for k,mtp in self.mtps.items(): 147 try: 148 mtp.stop() 149 del self.mtps[k] 150 except: 151 pass
152 153 154 155 #Controllers
156 - def index(self):
157 import sys 158 import time 159 servername = self.getDomain() 160 platform = self.getName() 161 version = str(sys.version) 162 the_time = str(time.ctime()) 163 doc_path = abspath('.') 164 return "webadmin_indigo.pyra", dict(name=platform,servername=servername, platform=platform, version=version, time=the_time, doc_path=doc_path)
165 166 @require_login
167 - def agents(self):
168 import sys 169 import time 170 so = self.session 171 servername = self.getDomain() 172 platform = self.getName() 173 version = str(sys.version) 174 the_time = str(time.ctime()) 175 search = self.searchAgent(AmsAgentDescription()) 176 """for agent in search: 177 if not agent.has_key("fipa:state"): 178 agent["fipa:state"] = "" 179 """ 180 # Build AWUIs dict 181 awuis = {} 182 if search: 183 aw = "" 184 for agent in search: 185 if agent.getAID(): 186 aw = "#" 187 for addr in agent.getAID().getAddresses(): 188 if "awui://" in addr: 189 aw = addr.replace("awui://", "http://") 190 break 191 awuis[agent.getAID().getName()] = aw 192 self.DEBUG("AWUIs: "+str(awuis)) 193 return "agents.pyra", dict(name=platform,servername=servername, platform=platform, version=version, time=the_time, agents=search, awuis=awuis)
194 195 @require_login
196 - def services(self):
197 import sys 198 import time 199 servername = self.getDomain() 200 platform = self.getName() 201 version = str(sys.version) 202 the_time = str(time.ctime()) 203 try: 204 search = self.searchService(DfAgentDescription()) 205 except Exception, e: 206 print "Exception: " + str(e) 207 servs = {} 208 for dad in search: 209 for service in dad.getServices(): 210 if service.getType() not in servs.keys(): 211 servs[service.getType()] = [] 212 new_dad = dad 213 new_dad.services = [service] 214 s = Service(dad=new_dad) 215 servs[service.getType()].append(s) 216 self.DEBUG("Services: " + str(servs)) 217 return "services.pyra", dict(name=platform,servername=servername, platform=platform, version=version, time=the_time, services=servs)
218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236
237 - def getMembers(self,aname):
238 msg = ACLMessage.ACLMessage() 239 msg.setOntology("spade:x:organization") 240 template = Behaviour.ACLTemplate() 241 template.setConversationId(msg.getConversationId()) 242 t = Behaviour.MessageTemplate(template) 243 b = self.GetMembersBehav() 244 b.msg = msg 245 b.aname = aname 246 self.addBehaviour(b,t) 247 b.join() 248 return b.result
249
250 - class GetMembersBehav(Behaviour.OneShotBehaviour):
251 - def _process(self):
252 self.result = [] 253 self.msg.addReceiver(AID.aid(self.aname, addresses=["xmpp://"+self.aname])) 254 self.msg.setContent("MEMBERS") 255 self.myAgent.send(self.msg) 256 rep = None 257 rep = self._receive(True, 20) 258 if rep: 259 print "The members list arrived" 260 self.result = rep.getContent().split(",")
261