def _pipeline_read_frame(self, *, mpfdp, mpkit): """Extract frame.""" # check EOF if self._flag_e: raise EOFError def _analyse_frame(*, frame, mpkit): """Analyse frame.""" # wait until ready while mpkit.current != self._frnum: time.sleep(random.randint(0, datetime.datetime.now().second) // 600) # analysis and storage # print(self._frnum, 'get') self._trace = mpkit.trace self._reasm = mpkit.reassembly self._default_read_frame(frame=frame, mpkit=mpkit) # print(self._frnum, 'analysed') mpkit.trace = copy.deepcopy(self._trace) mpkit.reassembly = copy.deepcopy(self._reasm) # print(self._frnum, 'put') # extract frame try: # extraction frame = Frame(self._ifile, num=self._frnum, proto=self._dlink, layer=self._exlyr, protocol=self._exptl, nanosecond=self._nnsec, mpkit=mpkit, mpfdp=mpfdp) # analysis _analyse_frame(frame=frame, mpkit=mpkit) except EOFError: mpkit.eof = True finally: mpkit.counter -= 1 self._ifile.close()
def _append_value(self, value, file, name): # pylint: disable=unused-argument """Call this function to write contents. Args: value (Info[DataType_Frame]): content to be dumped file (io.BufferedReader): output file name (str): name of current content block """ packet = Frame( packet=value.packet, nanosecond=self._nsec, num=self._fnum, proto=self._link, **value.get('frame_info', value), ).data file.write(packet) self._fnum += 1
def _server_extract_frame(self, *, mpfdp, mpkit, mpbuf): """Extract frame.""" # check EOF if self._flag_e: raise EOFError # extract frame try: frame = Frame(self._ifile, num=self._frnum, proto=self._dlink, layer=self._exlyr, protocol=self._exptl, nanosecond=self._nnsec, mpkit=mpkit, mpfdp=mpfdp) # frame._file = NotImplemented mpbuf[self._frnum] = frame except EOFError: mpbuf[self._frnum] = EOFError mpkit.eof = True finally: mpkit.counter -= 1 self._ifile.close()
def _default_read_frame(self, *, frame=None, mpkit=None): """Read frames with default engine. - Extract frames and each layer of packets. - Make Info object out of frame properties. - Append Info. - Write plist & append Info. """ from pcapkit.toolkit.default import (ipv4_reassembly, ipv6_reassembly, tcp_reassembly, tcp_traceflow) # read frame header if not self._flag_m: frame = Frame(self._ifile, num=self._frnum + 1, proto=self._dlink, layer=self._exlyr, protocol=self._exptl, nanosecond=self._nnsec) self._frnum += 1 # verbose output if self._flag_v: print(f' - Frame {self._frnum:>3d}: {frame.protochain}') # write plist frnum = f'Frame {self._frnum}' if not self._flag_q: if self._flag_f: ofile = self._ofile(f'{self._ofnm}/{frnum}.{self._fext}') ofile(frame.info, name=frnum) else: self._ofile(frame.info, name=frnum) # record fragments if self._ipv4: flag, data = ipv4_reassembly(frame) if flag: self._reasm[0](data) if self._ipv6: flag, data = ipv6_reassembly(frame) if flag: self._reasm[1](data) if self._tcp: flag, data = tcp_reassembly(frame) if flag: self._reasm[2](data) # trace flows if self._flag_t: flag, data = tcp_traceflow(frame, data_link=self._dlink) if flag: self._trace(data) # record frames if self._exeng == 'pipeline': if self._flag_d: # frame._file = NotImplemented mpkit.frames[self._frnum] = frame # print(self._frnum, 'stored') mpkit.current += 1 elif self._exeng == 'server': # record frames if self._flag_d: # frame._file = NotImplemented self._frame.append(frame) # print(self._frnum, 'stored') self._frnum += 1 else: if self._flag_d: self._frame.append(frame) self._proto = frame.protochain.chain # return frame record return frame