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__