def run(self): while True: if time.time() - self.clearTime > 1800: self.packetSet.clear() self.clearTime = time.time() nodes = self.getAllNode() addedNode, deletedNode = self.diffNode(nodes) self.nodeList = nodes logger.debug(f"Add node: {addedNode}, deleted node: {deletedNode}") logger.debug(f"Len node {len(nodes)}, add node {len(addedNode)}, deleted node {len(deletedNode)}") nodeInfo = self.probeNode(addedNode) for (ip, info) in nodeInfo: # createdNode = Node(ip, info["username"], info["firstname"], info["lastname"], # info["faculty"], info["year"], info["groupID"], info) createdNode = Node(ip, info) self.eventListener.nodeJoin(createdNode) self.nodeMap[ip] = info self.reverseMap[info["username"]] = ip for ip in deletedNode: if ip in self.nodeMap: info = self.nodeMap.get(ip) # createdNode = Node(ip,info["username"],info["firstname"],info["lastname"],info["faculty"],info["year"],info["group_id"],info) createdNode = Node(ip, info) self.eventListener.nodeLeave(createdNode) self.nodeMap.pop(ip) self.reverseMap.pop(info["username"]) self.info = UserService.infoBroadcast() self.sender.info = self.info self.sender.sendGroupBroadcast()
def __init__(self): self.net = NetworkInterface() UserService.initMe(self.net.getInterfaceMac(), '', '', '', 1) self.macAddress = self.net.getInterfaceMac() self.nodeList = set() # self.selfInfo = mocSelf() self.selfInfo = UserService.infoBroadcast() self.nodeMap = dict() self.packetSet = set() self.reverseMap = dict() self.isRunning = False self.sender = Sender(self.reverseMap, self.selfInfo) self.eventListener = None
def processData(self): logger.info("processing request...") # handling broadcast message self.info = UserService.infoBroadcast() if self.header["broadcast"]: if self.header["groupBroadcast"]: if self.info.get("groupID", "") == self.header["srcGroup"][4:]: msg = GroupMessage( self.header["srcUsername"], self.header["srcGroup"][4:], self.request) self.eventListener.receiveMessageGroup(msg) else: logger.debug( f"The sender is from group {self.header['srcGroup']}, but this node is in group {self.info.get('groupID','')}") logger.debug("Drop request; not from the same group") elif self.header["memberRq"]: if self.header["desGroup"][4:] == self.info.get("groupID", "") and self.info.get("role", "") == "admin": req = Request( self.header["srcUsername"], self.header["desGroup"][4:]) self.eventListener.receiveGroupJoinRequest(req) print(self.header['desGroup'][4:], self.info.get( 'groupID', ''), self.info.get('role', '')) elif self.header["nodeRep"]: groupInfo = GroupBroadcast(self.request) if self.addr not in self.nodeMap: # This is new node createdNode = Node(self.addr, self.request) self.eventListener.nodeJoin(createdNode) self.nodeMap[self.addr] = self.request self.reverseMap[self.request["username"]] = self.addr self.eventListener.receiveGroupBroadcast(groupInfo) else: msg = BroadcastMessage( self.header["srcUsername"], self.request) self.eventListener.receiveMessageBroadcast(msg) elif self.header["ackRq"]: self.eventListener.receiveJoinOK(self.header["srcGroup"][4:]) elif self.header["denyRq"]: self.eventListener.receiveJoinDeny(self.header["srcGroup"][4:]) else: # personal message msg = Message(self.header["srcUsername"], self.info.get( "username", ""), self.request) self.eventListener.receiveMessage(msg)
def createNodeReplyMessage(self): self.info = UserService.infoBroadcast() contentJson = json.dumps(self.info) contentByte = contentJson.encode("utf-8") header = { "srcUsername": self.info.get("username", ""), "srcGroup": self.info.get("groupID", ""), "desGroup": "", "admin": self.info.get("isAdmin", ""), "member": self.info.get("isMember", ""), "broadcast": False, "groupBroadcast": False, "memberRq": False, "ackRq": False, "denyRq": False, "leaveRq": False, "nodeRq": False, "big": False, "nodeRep": True, "contentLength": len(contentByte), } messageHeader = packHeader(header) message = messageHeader + contentByte return message