00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 import socket
00017 from objects.logic.common.exception import exception
00018 from objects.logic.entity.networkEntity import networkEntity
00019 from objects.logic.entity.entityStatistics import entityStatistics
00020 from objects.logic.common.logger import logger
00021
00022 from objects.logic.process.extXportTableDict import extXportTableDict
00023 from objects.logic.network.packetDecoder import packetDecoder
00024 from objects.logic.common.globalStrings import globalStrings
00025 from objects.logic.common.observerInterface import observerInterface
00026
00027 from threading import RLock
00028 import win32com.client
00029 import pyproj, sys, os
00030 import time
00031
00032 import copy
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 class entityManager(observerInterface):
00045 def __init__(self):
00046
00047
00048 self.entityCollection = dict()
00049 self.stats = entityStatistics()
00050
00051
00052 self.filteredColl = dict()
00053
00054 self.filteredCollByLoc = dict()
00055
00056 self.currentIPAddress = None
00057 self.selfIPList = None
00058 self.selfIPAddress = None
00059
00060 self.lck = RLock()
00061
00062 self.geoIP = None
00063
00064 self.getHostIPList()
00065 self.intializeIPDatabase()
00066
00067 self.xportTableDict = extXportTableDict()
00068
00069 self.decoder = packetDecoder()
00070 self.decoder.setDefaultReader()
00071
00072 self.cnt = 0
00073
00074
00075
00076 def removeAllEntities(self):
00077 self.lck.acquire(1)
00078 try:
00079 self.entityCollection = dict()
00080 self.filteredColl = dict()
00081 self.filteredCollByLoc = dict()
00082 finally:
00083 self.lck.release()
00084
00085 def getEntityCollectionSize(self):
00086 return len(self.entityCollection)
00087
00088
00089
00090
00091
00092
00093 def intializeIPDatabase(self):
00094 self.geoIP = win32com.client.Dispatch("GeoIPCOMEx.GeoIPEx")
00095 geoIPDBLocation = os.sep.join([os.path.dirname(__file__), globalStrings.geoIPDBLocation()])
00096
00097
00098 print geoIPDBLocation
00099 self.geoIP.set_db_path(geoIPDBLocation)
00100
00101 def getSafeEntityCollectionByPK(self):
00102 newDict = None
00103
00104 self.lck.acquire(1)
00105 try:
00106 newDict = self.entityCollection.copy()
00107 finally:
00108 self.lck.release()
00109
00110 return newDict
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120 def getSafeFilteredEntityCollectionByPK(self, filter):
00121
00122 start = time.time()
00123
00124 if filter == None:
00125 return self.filteredColl.copy()
00126
00127 else:
00128
00129 self.lck.acquire(1)
00130 try:
00131 self.filteredDict.clear()
00132
00133 for key, netEnt in self.entityCollection.iteritems():
00134 if filter.shouldDisplayEntity(netEnt):
00135 self.filteredColl[key] = netEnt
00136 finally:
00137 self.lck.release()
00138
00139 end = time.time()
00140 msg = "getSafeFilteredEntityCollectionByPK: %3.4f to process %d Items" % (end - start, len(self.entityCollection))
00141
00142
00143 return self.filteredColl.copy()
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158 def getSafeFilteredEntityCollectionByGeoLoc(self, filter):
00159
00160 start = time.time()
00161
00162 insertIntoList = True
00163
00164 if filter == None:
00165 return copy.copy(self.filteredCollByLoc)
00166
00167 else:
00168
00169 self.lck.acquire(1)
00170 try:
00171 self.filteredCollByLoc.clear()
00172
00173 for key, netEnt in self.entityCollection.iteritems():
00174 if filter.shouldDisplayEntity(netEnt):
00175
00176 lon = netEnt.foreignLongitude
00177 lat = netEnt.foreignLatitude
00178
00179 newKey = (lon, lat)
00180 if not self.filteredCollByLoc.has_key(newKey):
00181 self.filteredCollByLoc[newKey] = list()
00182
00183 self.filteredCollByLoc[newKey].append(netEnt)
00184
00185
00186 finally:
00187 self.lck.release()
00188
00189 end = time.time()
00190 msg = "getSafeFilteredEntityCollectionByGeoLoc: %3.4f to process %d Items" % (end - start, len(self.entityCollection))
00191
00192
00193 return copy.copy(self.filteredCollByLoc)
00194
00195
00196 def __getattr__(self, name):
00197 if name == 'geoIP':
00198 return self.geoIP
00199
00200 logger.log(__name__ + ": Cannot get [" + name + "] attribute")
00201 raise AttributeError, name
00202
00203
00204
00205
00206
00207 def getHostIPList(self):
00208 hostnameInfo = socket.gethostbyname_ex(socket.gethostname())
00209
00210 self.hostIPList = hostnameInfo[2]
00211 print self.hostIPList
00212
00213
00214 def update(self, header, data):
00215
00216
00217
00218
00219 decodedPacketDict = self.decoder.decodePacket(header, data)
00220
00221 if decodedPacketDict == None:
00222 logger.log(__name__ + "Will not process packet because could not decode")
00223 return
00224
00225
00226
00227 if self.decoder.getXportProtocolString(decodedPacketDict['transportProtocol']) == 'ICMP':
00228 if not self.decoder.isPing(decodedPacketDict['networkHeader'], decodedPacketDict['transportHeader']):
00229 return
00230 try:
00231 self.processDataPacket(decodedPacketDict);
00232 except exception, ex:
00233 pass
00234
00235
00236
00237
00238
00239
00240 def extractSelfIPAddress(self, decodedPackeDict):
00241 if decodedPackeDict['sourceIP'] in self.hostIPList:
00242 return decodedPackeDict['sourceIP']
00243
00244 if decodedPackeDict['destIP'] in self.hostIPList:
00245 return decodedPackeDict['destIP']
00246
00247 raise exception("Could not identify the IP Address of this device.", True)
00248
00249
00250
00251
00252
00253 def processDataPacket(self, decodedPacketDict):
00254
00255 if self.selfIPAddress == None:
00256 self.selfIPAddress = self.extractSelfIPAddress(decodedPacketDict)
00257 logger.log(__name__ + ":" + self.selfIPAddress)
00258
00259
00260 self.lck.acquire(1)
00261
00262 try:
00263
00264 key = list()
00265
00266 if self.selfIPAddress == decodedPacketDict['sourceIP']:
00267 NodeInfo, procState = self.xportTableDict.getXportTableInfo(decodedPacketDict['sourcePort'])
00268
00269 if NodeInfo == None:
00270 Pid = "0"
00271 else:
00272 Pid = "%d" % NodeInfo["Pid"]
00273
00274 key = (decodedPacketDict['destIP'], Pid)
00275 else:
00276 NodeInfo, procState = self.xportTableDict.getXportTableInfo(decodedPacketDict['destPort'])
00277
00278 if NodeInfo == None:
00279 Pid = "0"
00280 else:
00281 Pid = "%d" % NodeInfo["Pid"]
00282
00283 key = (decodedPacketDict['sourceIP'], Pid)
00284
00285 if not self.entityCollection.has_key(key):
00286 self.entityCollection[key] = networkEntity(self.selfIPAddress, decodedPacketDict, self.geoIP, self.xportTableDict)
00287
00288
00289 self.entityCollection[key].computeStatistics(decodedPacketDict)
00290
00291 except Exception, ex:
00292 logger.log(__name__ + ": There was an exception processing decoded packet")
00293 logger.log(ex)
00294 finally:
00295 self.lck.release()
00296
00297