def chkHeart(self): while self.isAlive and self.switch: self.isAlive = False sleep(self.timeout) if self.switch: Logger.error("%s heart time out !" % self.address) self.shutdown()
def __init__(self, socket, address): """ 服务抽象类 """ if self.__class__ is Service: # 抽象类不能实例化 Logger.error("Net class dose not instantiation") raise Exception("Net class dose not instantiation") Service.server[address] = self self.address = address self.sock = socket self.switch = True self.isAlive = True self.pid = 0 self.packQueue = [] self.timeout = 30 self.recvThread = None self.mainThread = None self.mainThreadName = None self.chkThread = None self.commCondition = None self.magicCode = None self.heartCode = None self.headerStruct = None self.headerSize = None self.packager = None self.terminalManager = None self.config(srvCenterConf) self.setPackager(Packager) self.setTerminalManager(TerminalManager)
def WOL(self, data): udp = socket( AF_INET, SOCK_DGRAM ) for groupData in data: terminalInfo = self.terminalManager.selectTerminal( groupData[0] ) wolPackage = a2b_hex( 'f' * 12 + sub( '-', '', terminalInfo['Mac'] ) * 16 ) Logger.info( '%s WOL %s:'%( self.address, terminalInfo['Name'] ), wolPackage ) udp.sendto( wolPackage, ( BROADCASTADDR, 6666 ) )
def TerminalInfo(self, data): data = data[0] terminalNames = data.split( ',' ) self.tStatus = [] print 'Terminal'+'='*30 for terminal in terminalNames: self.tStatus.append([terminal,0]) Logger.info('terminal: %s'%terminal)
def chkResponse(self): self.chkCondition.acquire() while self.switch: while self.respSurplusTime>0 and self.switch: sleep( self.timeout ) self.respSurplusTime -= self.timeout if self.respWaitCount > 0: Logger.error('%s response time out ! %d'%(self.address, self.respWaitCount)) self.shutdown() else: self.chkCondition.wait() self.chkCondition.release()
def parseHeader(self, stream): if len(stream) >= self.headerSize: head = unpack(self.headerStruct, stream[ : self.headerSize]) if head[1] != self.magicCode: Logger.error('receive invalid package from Server : ', stream) self.shutdown() if head[0] + 2 <= len(stream): mStream = stream[self.headerSize : head[0] + 2] stream = stream[head[0] + 2 : ] if head[2] != self.heartCode: self.packQueue( head[3], head[2], mStream ) stream = self.parseHeader(stream) return stream
def recv(self): sourceStream = '' while self.switch: recvStream = self.sock.recv( 1000 ) Logger.debug( 'receive raw stream from Server : ', recvStream ) if recvStream: sourceStream = self.parseHeader( '%s%s' % ( sourceStream, recvStream ) ) else: Logger.error( 'disconnect!' ) DB.stop() self.sock.shutdown( socket.SHUT_RDWR ) self.sock.close() self.switch = False
def open(self): print '='*38 while self.switch: name = raw_input( 'which terminal: ' ) for i in range( len( self.tStatus ) ): if self.tStatus[i][0] == name: if self.tStatus[i][1] == 0: wolPackager = Packager.genPackage( self.tname, 'WOL', 3, [ i ] ) self.send( wolPackager ) Logger.info( 'open %s!'%self.tStatus[i][0] ) else: Logger.info( '%s is online!'%self.tStatus[i][0] ) break;
def parseHeader(self, stream): if len(stream) >= self.headerSize: head = unpack(self.headerStruct, stream[: self.headerSize]) if head[1] != self.magicCode: Logger.error("receive invalid package from %s : " % self.address, stream) self.shutdown() if head[0] + 2 <= len(stream): mStream = stream[self.headerSize : head[0] + 2] stream = stream[head[0] + 2 :] if head[2] != self.heartCode: self.commCondition.acquire() self.packQueue.insert(0, [head[3], head[2], mStream]) self.commCondition.notify() self.commCondition.release() stream = self.parseHeader(stream) return stream
def send(self, packName, package): if not self.packager.nameAuthorized( packName, self.myAuth ): Logger.warning( '%s do not allow to send %s package'%( self.address, packName ) ) return super( OuterService, self ).send( package ) if self.packager.existsReply( packName ): self.pid += 1 if self.respSurplusTime>0: self.respSurplusTime += self.timeout self.respWaitCount += 1 else: self.chkCondition.acquire() self.respSurplusTime += self.timeout self.respWaitCount += 1 self.chkCondition.notify() self.chkCondition.release()
def main(self): self.commCondition.acquire() while self.switch: if len( self.packQueue ) <= 0: self.commCondition.wait() ( pid, code, package ) = self.packQueue.pop() Logger.info('received head from %s : [%d, %2x]' % ( self.address, pid, code ) ) Logger.debug('received package from %s : '%self.address, package) #检查权限 if not self.packager.codeAuthorized( code, self.myAuth ): Logger.warning( '%s do not allow to response the package %d'%( self.address, code ) ) continue #解析包 data = self.packager.parsePackage( self.mainThreadName, code, package ) packInfo = self.packager.codeFindPackage( code ) #发送回应包 if packInfo['ExistReply'] == 1: respPackage = self.packager.genPackage( self.mainThreadName, 'Response', pid ) self.send( 'Response', respPackage ) func = getattr( self, packInfo['Name'] ) unitNum = packInfo['StructLabel'].split( ',' ).__len__() data = [data[i : i + unitNum] for i in range( 0, len( data ), unitNum )] func( data ) self.commCondition.release()
def changeStatus( delay, destAddr ): if delay: if self.__status.has_key( destAddr ): if self.__status[ destAddr ][ 'Status' ] == False: self.activateTerminal( destAddr ) else: return; else: try: host = socket.gethostbyaddr( destAddr )[0] except socket.herror, e: if e.errno != 11004: raise Exception( 'get host name error!' ) host = destAddr mac = getMac( destAddr ) terminalID = self.setTerminal( destAddr, mac, host ) self.__status[ destAddr ] = { 'TerminalID':terminalID, 'Name':host, 'IPv4':destAddr, 'Mac':mac } queryPackInfo = Packager.nameFindPackage( 'QueryTerminals' ) OuterService.broadcast( [ 0, queryPackInfo[ 'Code' ], '' ] ) Logger.info( 'Terminal %s login!'%destAddr ) self.__status[ destAddr ][ 'Status' ] = True queryPackInfo = Packager.nameFindPackage( 'QueryStatus' ) OuterService.broadcast( [ 0, queryPackInfo[ 'Code' ], '' ] )
def receive(self): try: sourceStream = "" while self.switch: Logger.debug("%s receiving..." % self.address) recvStream = self.sock.recv(1000) Logger.debug("receive raw stream from %s : " % self.address, recvStream) if recvStream: self.isAlive = True sourceStream = self.parseHeader("%s%s" % (sourceStream, recvStream)) elif self.switch == True: Logger.info("%s disconnect..." % self.address) self.shutdown() except: Logger.error("%s receive error : \n%s" % (self.address, format_exc())) self.shutdown()
def Response(self, data): Logger.debug( 'receive response!' )
if e.errno != 11004: raise Exception( 'get host name error!' ) host = destAddr mac = getMac( destAddr ) terminalID = self.setTerminal( destAddr, mac, host ) self.__status[ destAddr ] = { 'TerminalID':terminalID, 'Name':host, 'IPv4':destAddr, 'Mac':mac } queryPackInfo = Packager.nameFindPackage( 'QueryTerminals' ) OuterService.broadcast( [ 0, queryPackInfo[ 'Code' ], '' ] ) Logger.info( 'Terminal %s login!'%destAddr ) self.__status[ destAddr ][ 'Status' ] = True queryPackInfo = Packager.nameFindPackage( 'QueryStatus' ) OuterService.broadcast( [ 0, queryPackInfo[ 'Code' ], '' ] ) else: if self.__status.has_key( destAddr ): if self.__status[ destAddr ][ 'Status' ] == True: Logger.info( 'Terminal %s logout!'%destAddr ) self.__status[ destAddr ][ 'Status' ] = False queryPackInfo = Packager.nameFindPackage( 'QueryStatus' ) OuterService.broadcast( [ 0, queryPackInfo[ 'Code' ], '' ] ) while self.__switch: for existsAddr in self.__status.keys(): ICMP.send_one_ping(mySocket, existsAddr, my_ID) delay = ICMP.receive_one_ping(mySocket, my_ID, 1) changeStatus( delay, existsAddr ) for i in range( 1, ipCount ): destAddr = socket.inet_ntoa( pack( '>L', netAddrBit + i ) ) if destAddr == IP or self.__status.has_key( destAddr ): continue ICMP.send_one_ping(mySocket, destAddr, my_ID)
def shutdown(self): Logger.error("%s shutdown !" % self.address) self.switch = False self.sock.shutdown(SHUT_RDWR) self.sock.close() del Service.server[self.address]
def QueryStatus(self, data): terminalStatus = self.terminalManager.getStatus() Logger.info('terminal status:%s'%terminalStatus) terminalStatusPackage = self.packager.genPackage( self.mainThreadName, 'TerminalStatus', self.pid, terminalStatus ) self.send( 'TerminalStatus', terminalStatusPackage )
def send(self, stream): Logger.debug("%s send raw stream : " % self.address, stream) self.sock.sendall(stream)
def send(self, data): Logger.debug( 'send raw stream:', data ) self.sock.sendall( data )
def QueryTerminals(self, data): terminalList = self.terminalManager.findAllTerminal() terminalNames = [ ','.join( [theTerminal['Name'] for theTerminal in terminalList] ) ] Logger.info('terminal name:%s'%terminalNames) terminalInfoPackage = self.packager.genPackage( self.mainThreadName, 'TerminalInfo', self.pid, terminalNames ) self.send( 'TerminalInfo', terminalInfoPackage )