00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 import wx
00019 import wx.lib.mixins.listctrl
00020 from wx.lib.anchors import LayoutAnchors
00021 from objects.logic.common.globalStrings import globalStrings
00022 import sys
00023 import time
00024 from traceDisplayDialog import traceDisplayDialog
00025 from objects.logic.common.logger import logger
00026 from objects.logic.utils.timeUtil import timeUtil
00027
00028
00029
00030
00031
00032
00033 class entityColumnSorter():
00034 def __init__(self, netEnt):
00035 self.netEnt = netEnt
00036
00037 self.since = timeUtil.formatDateTime(netEnt.since)
00038 self.idleTime = timeUtil.formatTimeDiff(time.time() - self.netEnt.lastUpdateTS)
00039
00040 self.colDefinition = dict()
00041 self.colDefinition[0] = [self.netEnt.foreignIPAddress, "S"]
00042 self.colDefinition[1] = [self.netEnt.foreignPort, "D"]
00043 self.colDefinition[2] = [self.netEnt.selfPort, "D"]
00044 self.colDefinition[3] = [self.netEnt.processName, "S"]
00045 self.colDefinition[4] = [self.netEnt.Pid, "S"]
00046 self.colDefinition[5] = [self.since, "S"]
00047 self.colDefinition[6] = [float(self.netEnt.totalBytes) / float(1000), "F"]
00048 self.colDefinition[7] = [self.netEnt.foreignCity, "U"]
00049 self.colDefinition[8] = [self.netEnt.foreignStateProv, "S"]
00050 self.colDefinition[9] = [self.netEnt.foreignCountry, "S"]
00051 self.colDefinition[10] = [self.netEnt.foreignOrganization, "S"]
00052 self.colDefinition[11] = [self.netEnt.foreignISP, "S"]
00053 self.colDefinition[12] = [self.netEnt.foreignLongitude, "F"]
00054 self.colDefinition[13] = [self.netEnt.foreignLatitude, "F"]
00055 self.colDefinition[14] = [self.idleTime, "S"]
00056
00057
00058 def __getitem__(self, key):
00059
00060 attr, type = self.colDefinition[key]
00061
00062 if type == "S":
00063 return str(attr)
00064 elif type == "F":
00065 return float(attr)
00066 elif type == "U":
00067 return unicode(attr)
00068 else:
00069 return int(attr)
00070
00071
00072 def create(parent):
00073 return peerGridDisplay(parent)
00074
00075 [wxID_PEERGRIDDISPLAY, wxID_PEERGRIDDISPLAYBUTTONEXPORTLIST,
00076 wxID_PEERGRIDDISPLAYBUTTONSHOWTRACE, wxID_PEERGRIDDISPLAYLISTCTRLPEERS,
00077 wxID_PEERGRIDDISPLAYPANELCONTROLS,
00078 ] = [wx.NewId() for _init_ctrls in range(5)]
00079
00080
00081
00082
00083
00084
00085
00086 class peerGridDisplay(wx.Frame, wx.lib.mixins.listctrl.ColumnSorterMixin):
00087 def _init_coll_flexGridSizerControls_Growables(self, parent):
00088
00089
00090 parent.AddGrowableRow(0)
00091 parent.AddGrowableCol(0)
00092
00093 def _init_coll_flexGridSizerButtons_Items(self, parent):
00094
00095
00096 parent.AddWindow(self.buttonShowTrace, 0, border=5,
00097 flag=wx.TOP | wx.LEFT | wx.BOTTOM | wx.RIGHT)
00098 parent.AddWindow(self.buttonExportList, 0, border=5,
00099 flag=wx.TOP | wx.LEFT | wx.BOTTOM | wx.RIGHT)
00100
00101 def _init_coll_flexGridSizerControls_Items(self, parent):
00102
00103
00104 parent.AddWindow(self.listCtrlPeers, 0, border=5,
00105 flag=wx.BOTTOM | wx.TOP | wx.RIGHT | wx.LEFT | wx.GROW | wx.ADJUST_MINSIZE | wx.EXPAND)
00106 parent.AddSizer(self.flexGridSizerButtons, 0, border=10,
00107 flag=wx.ALIGN_RIGHT)
00108
00109 def _init_coll_listCtrlPeers_Columns(self, parent):
00110
00111
00112 parent.InsertColumn(col=0, format=wx.LIST_FORMAT_LEFT,
00113 heading='Remote IP', width=140)
00114 parent.InsertColumn(col=1, format=wx.LIST_FORMAT_RIGHT,
00115 heading='Rmt. Port', width=80)
00116 parent.InsertColumn(col=2, format=wx.LIST_FORMAT_RIGHT,
00117 heading='Lc. Port', width=70)
00118 parent.InsertColumn(col=3, format=wx.LIST_FORMAT_LEFT,
00119 heading='Application', width=100)
00120 parent.InsertColumn(col=4, format=wx.LIST_FORMAT_RIGHT, heading='PID',
00121 width=70)
00122 parent.InsertColumn(col=5, format=wx.LIST_FORMAT_RIGHT, heading='Since',
00123 width=140)
00124 parent.InsertColumn(col=6, format=wx.LIST_FORMAT_RIGHT,
00125 heading='Kb Xfer', width=-1)
00126 parent.InsertColumn(col=7, format=wx.LIST_FORMAT_LEFT, heading='City',
00127 width=100)
00128 parent.InsertColumn(col=8, format=wx.LIST_FORMAT_LEFT,
00129 heading='State/Prov', width=20)
00130 parent.InsertColumn(col=9, format=wx.LIST_FORMAT_LEFT,
00131 heading='Country', width=120)
00132 parent.InsertColumn(col=10, format=wx.LIST_FORMAT_LEFT,
00133 heading='Organization', width=20)
00134 parent.InsertColumn(col=11, format=wx.LIST_FORMAT_LEFT, heading='ISP',
00135 width=20)
00136 parent.InsertColumn(col=12, format=wx.LIST_FORMAT_RIGHT, heading='Lon',
00137 width=-1)
00138 parent.InsertColumn(col=13, format=wx.LIST_FORMAT_RIGHT, heading='Lat',
00139 width=-1)
00140 parent.InsertColumn(col=14, format=wx.LIST_FORMAT_RIGHT,
00141 heading='Idle Time', width=120)
00142
00143 def _init_sizers(self):
00144
00145 self.flexGridSizerControls = wx.FlexGridSizer(cols=1, hgap=5, rows=2,
00146 vgap=5)
00147 self.flexGridSizerControls.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED)
00148 self.flexGridSizerControls.SetFlexibleDirection(wx.BOTH)
00149
00150 self.flexGridSizerButtons = wx.FlexGridSizer(cols=3, hgap=10, rows=1,
00151 vgap=10)
00152 self.flexGridSizerButtons.SetFlexibleDirection(wx.BOTH)
00153
00154 self._init_coll_flexGridSizerControls_Items(self.flexGridSizerControls)
00155 self._init_coll_flexGridSizerControls_Growables(self.flexGridSizerControls)
00156 self._init_coll_flexGridSizerButtons_Items(self.flexGridSizerButtons)
00157
00158 self.panelControls.SetSizer(self.flexGridSizerControls)
00159
00160 def _init_ctrls(self, prnt):
00161
00162 wx.Frame.__init__(self, id=wxID_PEERGRIDDISPLAY, name='peerGridDisplay',
00163 parent=prnt, pos=wx.Point(472, 260), size=wx.Size(663, 397),
00164 style=wx.DEFAULT_FRAME_STYLE, title='Peer List ...')
00165 self.SetClientSize(wx.Size(647, 361))
00166 self.SetMinSize(wx.Size(597, 218))
00167 self.SetMaxSize(wx.Size(-1, -1))
00168 self.SetHelpText('')
00169 self.SetIcon(wx.Icon(u'./res/images/ico/eyespy_small.ico',
00170 wx.BITMAP_TYPE_ICO))
00171
00172 self.panelControls = wx.Panel(id=wxID_PEERGRIDDISPLAYPANELCONTROLS,
00173 name='panelControls', parent=self, pos=wx.Point(0, 0),
00174 size=wx.Size(647, 361), style=wx.TAB_TRAVERSAL)
00175 self.panelControls.SetAutoLayout(True)
00176 self.panelControls.SetConstraints(LayoutAnchors(self.panelControls,
00177 True, True, True, True))
00178 self.panelControls.SetToolTipString('')
00179
00180 self.listCtrlPeers = wx.ListCtrl(id=wxID_PEERGRIDDISPLAYLISTCTRLPEERS,
00181 name='listCtrlPeers', parent=self.panelControls, pos=wx.Point(5,
00182 5), size=wx.Size(637, 313), style=wx.LC_REPORT)
00183 self.listCtrlPeers.SetAutoLayout(True)
00184 self.listCtrlPeers.SetMinSize(wx.Size(-1, -1))
00185 self.listCtrlPeers.SetBackgroundColour(wx.Colour(0, 0, 0))
00186 self.listCtrlPeers.SetForegroundColour(wx.Colour(192, 192, 192))
00187 self.listCtrlPeers.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.NORMAL,
00188 False, 'Verdana'))
00189 self._init_coll_listCtrlPeers_Columns(self.listCtrlPeers)
00190 self.listCtrlPeers.Bind(wx.EVT_LIST_ITEM_DESELECTED,
00191 self.OnListCtrlPeersListItemDeselected,
00192 id=wxID_PEERGRIDDISPLAYLISTCTRLPEERS)
00193 self.listCtrlPeers.Bind(wx.EVT_LIST_ITEM_SELECTED,
00194 self.OnListCtrlPeersListItemSelected,
00195 id=wxID_PEERGRIDDISPLAYLISTCTRLPEERS)
00196 self.listCtrlPeers.Bind(wx.EVT_LIST_COL_CLICK,
00197 self.OnListCtrlPeersListColClick,
00198 id=wxID_PEERGRIDDISPLAYLISTCTRLPEERS)
00199
00200 self.buttonShowTrace = wx.Button(id=wxID_PEERGRIDDISPLAYBUTTONSHOWTRACE,
00201 label='Show Trace', name='buttonShowTrace',
00202 parent=self.panelControls, pos=wx.Point(408, 333),
00203 size=wx.Size(96, 23), style=0)
00204 self.buttonShowTrace.SetToolTipString('')
00205 self.buttonShowTrace.Bind(wx.EVT_BUTTON, self.OnButtonShowTraceButton,
00206 id=wxID_PEERGRIDDISPLAYBUTTONSHOWTRACE)
00207
00208 self.buttonExportList = wx.Button(id=wxID_PEERGRIDDISPLAYBUTTONEXPORTLIST,
00209 label='Export to File', name='buttonExportList',
00210 parent=self.panelControls, pos=wx.Point(524, 333),
00211 size=wx.Size(118, 23), style=0)
00212 self.buttonExportList.SetToolTipString('')
00213 self.buttonExportList.Bind(wx.EVT_BUTTON, self.OnButtonExportListButton,
00214 id=wxID_PEERGRIDDISPLAYBUTTONEXPORTLIST)
00215
00216 self._init_sizers()
00217
00218 def __init__(self, parent):
00219 self._init_ctrls(parent)
00220
00221 il = wx.ImageList(16,16, True)
00222 self.up = il.AddWithColourMask(
00223 wx.Bitmap(globalStrings.sort_up, wx.BITMAP_TYPE_BMP), "blue")
00224 self.dn = il.AddWithColourMask(
00225 wx.Bitmap(globalStrings.sort_down, wx.BITMAP_TYPE_BMP), "blue")
00226
00227
00228 self.listCtrlPeers.AssignImageList(il, wx.IMAGE_LIST_SMALL)
00229
00230 wx.lib.mixins.listctrl.ColumnSorterMixin.__init__(self,15)
00231
00232 self.selectedPeer = None
00233 self.peerList = []
00234
00235 def GetListCtrl(self):
00236 return self.listCtrlPeers
00237
00238 def GetSortImages(self):
00239 return (self.dn, self.up)
00240
00241
00242
00243
00244 def fromEntList(self, entList):
00245 if entList == None: return
00246
00247 self.itemDataMap = {}
00248
00249 for ent in entList:
00250 self.addEntityToList(ent)
00251 self.peerList.append(ent)
00252
00253
00254
00255
00256 def fromEntGeoLocDict(self, entDict):
00257 if entDict == None: return
00258
00259 self.PeerDict = entDict
00260
00261 self.itemDataMap = {}
00262
00263 for key, entList in entDict.iteritems():
00264 for ent in entList:
00265 self.addEntityToList(ent)
00266 self.peerList.append(ent)
00267
00268
00269
00270
00271 def fromEntDict(self, entDict):
00272 if entDict == None: return
00273
00274 self.PeerDict = entDict
00275
00276 self.itemDataMap = {}
00277
00278 for key, ent in entDict.iteritems():
00279 self.addEntityToList(ent)
00280 self.peerList.append(ent)
00281
00282
00283
00284 def getForeignIP(self, ent):
00285 return ent.foreignIPAddress
00286
00287
00288
00289
00290
00291 def getProcName(self, ent):
00292 return str(ent.processName)
00293
00294
00295
00296
00297
00298 def getPid(self, ent):
00299 return ent.Pid
00300
00301
00302
00303
00304
00305 def getISP(self, ent):
00306 return ent.foreignISP
00307
00308
00309
00310
00311 def getOrg(self, ent):
00312 return ent.foreignOrganization
00313
00314
00315
00316
00317 def addEntityToList(self, ent):
00318
00319 since = timeUtil.formatDateTime(ent.since)
00320 idleTime = timeUtil.formatTimeDiff(time.time() - int(ent.lastUpdateTS))
00321
00322
00323
00324 index = self.listCtrlPeers.InsertStringItem(sys.maxint, self.getForeignIP(ent))
00325 self.listCtrlPeers.SetStringItem(index, 1, str(ent.foreignPort))
00326 self.listCtrlPeers.SetStringItem(index, 2, str(ent.selfPort))
00327 self.listCtrlPeers.SetStringItem(index, 3, self.getProcName(ent))
00328 self.listCtrlPeers.SetStringItem(index, 4, self.getPid(ent))
00329 self.listCtrlPeers.SetStringItem(index, 5, since)
00330
00331 totalKB = "%6.2f" % (float(ent.totalBytes) / float(1000))
00332 self.listCtrlPeers.SetStringItem(index, 6, totalKB)
00333
00334 try:
00335 self.listCtrlPeers.SetStringItem(index, 7, ent.foreignCity)
00336 except Exception, e:
00337 self.listCtrlPeers.SetStringItem(index, 7, "N/A")
00338
00339 self.listCtrlPeers.SetStringItem(index, 8, str(ent.foreignStateProv))
00340 self.listCtrlPeers.SetStringItem(index, 9, str(ent.foreignCountry))
00341 self.listCtrlPeers.SetStringItem(index, 10, self.getOrg(ent))
00342 self.listCtrlPeers.SetStringItem(index, 11, self.getISP(ent))
00343
00344 lon = "%3.2f" % (ent.foreignLongitude)
00345 lat = "%3.2f" % (ent.foreignLatitude)
00346
00347 self.listCtrlPeers.SetStringItem(index, 12, lon)
00348 self.listCtrlPeers.SetStringItem(index, 13, lat)
00349
00350 self.listCtrlPeers.SetStringItem(index, 14, idleTime)
00351
00352 self.listCtrlPeers.SetItemData(index, index)
00353 wrappedEnt = entityColumnSorter(ent)
00354
00355 self.itemDataMap[index] = wrappedEnt
00356
00357
00358
00359
00360
00361 def OnButtonShowTraceButton(self, event):
00362
00363 if self.selectedPeer == None:
00364 return
00365
00366
00367 try:
00368
00369 foreignIP = self.listCtrlPeers.GetItemText(self.selectedPeer)
00370 srcPort = self.getColumnText(self.selectedPeer, 2)
00371 dstPort = self.getColumnText(self.selectedPeer, 1)
00372
00373 traceDisplay = None
00374 traceDisplay = traceDisplayDialog(self, foreignIP, srcPort, dstPort)
00375 traceDisplay.ShowModal()
00376
00377 except Exception, e:
00378 errMsg = "There was an error opening Trace Display window.\nDetailed Error:\n%s " % (str(e))
00379
00380 dlg = wx.MessageDialog(None, errMsg, 'Error', wx.ICON_ERROR)
00381 result = dlg.ShowModal()
00382 dlg.Destroy()
00383 finally:
00384 if traceDisplay is not None:
00385 traceDisplay.Destroy()
00386
00387
00388
00389
00390
00391
00392
00393 def getColumnText(self, index, col):
00394 item = self.listCtrlPeers.GetItem(index, col)
00395 return item.GetText()
00396
00397
00398
00399
00400 def OnButtonReconstructButton(self, event):
00401 pass
00402
00403
00404
00405
00406
00407
00408 def OnListCtrlPeersListItemSelected(self, event):
00409 item = event.GetItem()
00410 self.selectedPeer = item.GetId()
00411
00412
00413
00414
00415 def OnListCtrlPeersListItemDeselected(self, event):
00416 self.selectedPeer = None
00417
00418
00419
00420
00421 def OnListCtrlPeersListColClick(self, event):
00422 pass
00423
00424
00425
00426 def OnSortOrderChanged(self):
00427 print "sorted"
00428 self.selectedPeer = self.listCtrlPeers.GetFirstSelected()
00429
00430
00431
00432
00433 def OnButtonExportListButton(self, event):
00434 dlg = wx.FileDialog(self, "Export to file", "\\", "PeerList.csv", "Comma Separated Values (*.csv)|*.csv", style=wx.SAVE|wx.OVERWRITE_PROMPT)
00435
00436 if dlg.ShowModal() == wx.ID_OK:
00437 path = dlg.GetPath()
00438 FILE = open(path,"w")
00439 FILE.write("RemoteIP,RemotePort,LocalPort,Application,PID,Since,KbXfer,City,State/Prov,Country,Organization,ISP,Lon,Lat,IdleTime\n")
00440
00441 for ent in self.peerList:
00442 totalKB = "%6.2f" % (float(ent.totalBytes) / float(1000))
00443 idleTime = timeUtil.formatTimeDiff(time.time() - int(ent.lastUpdateTS))
00444
00445 since = timeUtil.formatDateTime(ent.since)
00446
00447
00448
00449 try:
00450 nextLine = "%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%3.2f,%3.2f,%s" %(ent.foreignIPAddress.replace(',', ' '),
00451 str(ent.foreignPort).replace(',', ' '),
00452 str(ent.selfPort).replace(',', ' '),
00453 ent.processName.replace(',', ' '),
00454 str(ent.Pid).replace(',', ' '),
00455 since.replace(',', ' '),
00456 totalKB.replace(',', ' '),
00457 ent.foreignCity.replace(',', ' '),
00458 ent.foreignStateProv.replace(',', ' '),
00459 ent.foreignCountry.replace(',', ' '),
00460 ent.foreignOrganization.replace(',', ' '),
00461 ent.foreignISP.replace(',', ' '),
00462 ent.foreignLongitude,
00463 ent.foreignLatitude,
00464 idleTime.replace(',', ' '))
00465 nextLine = nextLine.encode('utf-8')
00466 except Exception, ex:
00467 logger.log(__name__ + ": Exception Writing Entity List line to file: " + str(ex))
00468 else:
00469 FILE.write(nextLine + "\n")
00470
00471 FILE.close()
00472
00473
00474