NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

machoNetAddress.py (6143B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\script\net\machoNetAddress.py
      2 import log
      3 import carbon.common.script.net.machobase as machobase
      4 from carbon.common.lib import const
      5 from carbon.common.script.net.GPSExceptions import GPSBadAddress
      6 from stringutil import strx
      7 
      8 class MachoAddress:
      9     __guid__ = 'macho.MachoAddress'
     10     __passbyvalue__ = 1
     11     __legalclientaddr__ = ('clientID', 'callID', 'service')
     12     __legalbroadcastaddr__ = ('broadcastID', 'narrowcast', 'idtype')
     13     __legalnodeaddr__ = ('nodeID', 'service', 'callID')
     14     __legalanyaddr__ = ('service', 'callID')
     15 
     16     def __init__(self, *args, **keywords):
     17         if 'clientID' in keywords:
     18             if len(args) != 0:
     19                 raise GPSBadAddress('A macho client address should contain only keyword arguments')
     20             self.addressType = const.ADDRESS_TYPE_CLIENT
     21             self.clientID = keywords['clientID']
     22             self.callID = keywords.get('callID', None)
     23             self.service = keywords.get('service', None)
     24             for each in keywords.iterkeys():
     25                 if each not in self.__legalclientaddr__:
     26                     raise GPSBadAddress("A macho client address may not contain '%s'" % each)
     27 
     28         elif 'broadcastID' in keywords:
     29             if len(args) != 0:
     30                 raise GPSBadAddress('A macho broadcast address should contain only keyword arguments')
     31             self.addressType = const.ADDRESS_TYPE_BROADCAST
     32             self.broadcastID = keywords.get('broadcastID', None)
     33             self.narrowcast = list(keywords.get('narrowcast', []))
     34             self.idtype = keywords.get('idtype', None)
     35             for each in keywords.iterkeys():
     36                 if each not in self.__legalbroadcastaddr__:
     37                     raise GPSBadAddress("A macho broadcast address may not contain '%s'" % each)
     38 
     39         elif 'nodeID' in keywords:
     40             if len(args) != 0:
     41                 raise GPSBadAddress('A macho node address should contain only keyword arguments')
     42             self.addressType = const.ADDRESS_TYPE_NODE
     43             self.nodeID = keywords['nodeID']
     44             self.service = keywords.get('service', None)
     45             self.callID = keywords.get('callID', None)
     46             for each in keywords.iterkeys():
     47                 if each not in self.__legalnodeaddr__:
     48                     raise GPSBadAddress("A macho node address may not contain '%s'" % each)
     49 
     50         else:
     51             if len(args) != 0:
     52                 raise GPSBadAddress("A macho 'any' address should contain only keyword arguments")
     53             self.addressType = const.ADDRESS_TYPE_ANY
     54             self.service = keywords.get('service', None)
     55             self.callID = keywords.get('callID', None)
     56             for each in keywords.iterkeys():
     57                 if each not in self.__legalanyaddr__:
     58                     raise GPSBadAddress("A macho any address may not contain '%s'" % each)
     59 
     60     def __getstate__(self):
     61         if self.addressType == const.ADDRESS_TYPE_CLIENT:
     62             return (const.ADDRESS_TYPE_CLIENT,
     63              self.clientID,
     64              self.callID,
     65              self.service)
     66         elif self.addressType == const.ADDRESS_TYPE_BROADCAST:
     67             return (const.ADDRESS_TYPE_BROADCAST,
     68              self.broadcastID,
     69              self.narrowcast,
     70              self.idtype)
     71         elif self.addressType == const.ADDRESS_TYPE_ANY:
     72             return (const.ADDRESS_TYPE_ANY, self.service, self.callID)
     73         else:
     74             return (const.ADDRESS_TYPE_NODE,
     75              self.nodeID,
     76              self.service,
     77              self.callID)
     78 
     79     def __setstate__(self, state):
     80         if state[0] == const.ADDRESS_TYPE_CLIENT:
     81             self.addressType, self.clientID, self.callID, self.service = state
     82         elif state[0] == const.ADDRESS_TYPE_BROADCAST:
     83             self.addressType, self.broadcastID, self.narrowcast, self.idtype = state
     84         elif state[0] == const.ADDRESS_TYPE_ANY:
     85             self.addressType, self.service, self.callID = state
     86         else:
     87             self.addressType, self.nodeID, self.service, self.callID = state
     88 
     89     def RoutesTo(self, otherAddress, fromAddress = None):
     90         if self.addressType == const.ADDRESS_TYPE_ANY:
     91             return 1
     92         if self.addressType == const.ADDRESS_TYPE_CLIENT and otherAddress.addressType == const.ADDRESS_TYPE_CLIENT and self.clientID == otherAddress.clientID:
     93             return 1
     94         if self.addressType == const.ADDRESS_TYPE_BROADCAST and (otherAddress.addressType == const.ADDRESS_TYPE_CLIENT or machobase.mode != 'proxy' and machobase.mode != 'client' and fromAddress is not None and fromAddress.addressType == const.ADDRESS_TYPE_NODE):
     95             return 1
     96         if self.addressType == const.ADDRESS_TYPE_BROADCAST and machobase.mode == 'proxy' and self.idtype and self.idtype.startswith('+'):
     97             return 2
     98         if self.addressType == const.ADDRESS_TYPE_NODE and otherAddress.addressType == const.ADDRESS_TYPE_NODE and self.nodeID == otherAddress.nodeID:
     99             return 1
    100         return 0
    101 
    102     def __repr__(self):
    103         try:
    104             if self.addressType == const.ADDRESS_TYPE_CLIENT:
    105                 return 'Address::Client(clientID="%s",callID="%s",service="%s")' % (self.clientID, self.callID, self.service)
    106             if self.addressType == const.ADDRESS_TYPE_NODE:
    107                 return 'Address::Node(nodeID="%s",service="%s",callID="%s")' % (self.nodeID, self.service, self.callID)
    108             if self.addressType == const.ADDRESS_TYPE_ANY:
    109                 return 'Address::Any(service="%s",callID="%s")' % (self.service, self.callID)
    110             if self.addressType == const.ADDRESS_TYPE_BROADCAST:
    111                 return 'Address::BroadCast(broadcastID="%s",narrowcast="%s",idtype="%s")' % (self.broadcastID, strx(self.narrowcast), self.idtype)
    112             return 'Address::Undefined'
    113         except Exception:
    114             log.LogException()
    115             try:
    116                 return 'Address::Crap(%s)' % strx(self.__dict__)
    117             except Exception:
    118                 return 'Address containing crappy data'
    119 
    120     __str__ = __repr__