Package dpkt :: Module snoop
[hide private]
[frames] | no frames]

Source Code for Module dpkt.snoop

  1  # $Id$ 
  2   
  3  """Snoop file format.""" 
  4   
  5  import sys, time 
  6  import dpkt 
  7   
  8  # RFC 1761 
  9   
 10  SNOOP_MAGIC = 0x736E6F6F70000000L 
 11   
 12  SNOOP_VERSION = 2 
 13   
 14  SDL_8023   = 0 
 15  SDL_8024   = 1 
 16  SDL_8025   = 2 
 17  SDL_8026   = 3 
 18  SDL_ETHER  = 4 
 19  SDL_HDLC   = 5 
 20  SDL_CHSYNC = 6 
 21  SDL_IBMCC  = 7 
 22  SDL_FDDI   = 8 
 23  SDL_OTHER  = 9 
 24   
 25   
 26  dltoff = { SDL_ETHER:14 } 
 27   
28 -class PktHdr(dpkt.Packet):
29 """snoop packet header.""" 30 __byte_order__ = '!' 31 __hdr__ = ( 32 ('orig_len', 'I', 0), 33 ('incl_len', 'I', 0), 34 ('rec_len', 'I', 0), 35 ('cum_drops', 'I', 0), 36 ('ts_sec', 'I', 0), 37 ('ts_usec', 'I', 0), 38 )
39
40 -class FileHdr(dpkt.Packet):
41 """snoop file header.""" 42 __byte_order__ = '!' 43 __hdr__ = ( 44 ('magic', 'Q', SNOOP_MAGIC), 45 ('v', 'I', SNOOP_VERSION), 46 ('linktype', 'I', SDL_ETHER), 47 )
48
49 -class Writer(object):
50 """Simple snoop dumpfile writer."""
51 - def __init__(self, fileobj, linktype=SDL_ETHER):
52 self.__f = fileobj 53 fh = FileHdr(linktype=linktype) 54 self.__f.write(str(fh))
55
56 - def writepkt(self, pkt, ts=None):
57 if ts is None: 58 ts = time.time() 59 s = str(pkt) 60 n = len(s) 61 pad_len = 4 - n % 4 if n % 4 else 0 62 ph = PktHdr(orig_len=n,incl_len=n, 63 rec_len=PktHdr.__hdr_len__+n+pad_len, 64 ts_sec=int(ts), 65 ts_usec=int((int(ts) - float(ts)) * 1000000.0)) 66 self.__f.write(str(ph)) 67 self.__f.write(s + '\0' * pad_len)
68
69 - def close(self):
70 self.__f.close()
71
72 -class Reader(object):
73 """Simple pypcap-compatible snoop file reader.""" 74
75 - def __init__(self, fileobj):
76 self.name = fileobj.name 77 self.fd = fileobj.fileno() 78 self.__f = fileobj 79 buf = self.__f.read(FileHdr.__hdr_len__) 80 self.__fh = FileHdr(buf) 81 self.__ph = PktHdr 82 if self.__fh.magic != SNOOP_MAGIC: 83 raise ValueError, 'invalid snoop header' 84 self.dloff = dltoff[self.__fh.linktype] 85 self.filter = ''
86
87 - def fileno(self):
88 return self.fd
89 92
93 - def setfilter(self, value, optimize=1):
94 return NotImplementedError
95
96 - def readpkts(self):
97 return list(self)
98
99 - def dispatch(self, cnt, callback, *args):
100 if cnt > 0: 101 for i in range(cnt): 102 ts, pkt = self.next() 103 callback(ts, pkt, *args) 104 else: 105 for ts, pkt in self: 106 callback(ts, pkt, *args)
107
108 - def loop(self, callback, *args):
109 self.dispatch(0, callback, *args)
110
111 - def __iter__(self):
112 self.__f.seek(FileHdr.__hdr_len__) 113 while 1: 114 buf = self.__f.read(PktHdr.__hdr_len__) 115 if not buf: break 116 hdr = self.__ph(buf) 117 buf = self.__f.read(hdr.rec_len - PktHdr.__hdr_len__) 118 yield (hdr.ts_sec + (hdr.ts_usec / 1000000.0), buf[:hdr.incl_len])
119