class TTYRec(Task): __slots__ = ( '_ttymon', '_results_lock', '_state' ) def __init__(self, manager): super(TTYRec, self).__init__(manager) self._ttymon = TTYMon(ignore=[os.getpid(), os.getppid()]) self._results_lock = Lock() self._buffer = Buffer() self._compressor = zlib.compressobj(9) def task(self): for comm, pid, probe, sec, usec, buf in self._ttymon: with self._results_lock: packet = self._compressor.compress( struct.pack( '<16ssIIII', comm[:16], probe, pid, sec, usec, len(buf)) + buf) self._buffer.append(packet) self._dirty = True @property def results(self): result = None with self._results_lock: if not self._dirty: return None try: packet = self._compressor.flush() self._buffer.append(packet) except zlib.error: pass result = self._buffer self._buffer = Buffer() self._compressor = zlib.compressobj(9) self._dirty = False return result @property def active(self): return self._ttymon.active def stop(self): super(TTYRec, self).stop() self._ttymon.stop()
class TTYRec(Task): __slots__ = ('_ttymon', '_results_lock', '_state', '_event_id') def __init__(self, manager, event_id=None, name=None, winsize=None, tty_private=None): super(TTYRec, self).__init__(manager) self._ttymon = TTYMon( name, winsize, tty_private, ignore=[os.getpid(), os.getppid()] ) self._results_lock = Lock() self._buffer = Buffer() self._compressor = zlib.compressobj(9) self._event_id = event_id self._session = 0 def task(self): self._session, = struct.unpack('<I', get_random(4)) for tty_name, comm, pid, probe, ts, buf in self._ttymon: tty_name = tty_name[:8].ljust(8) comm = comm[:16].ljust(16) if probe == 'R': buf = struct.pack('<HH', *buf) with self._results_lock: packet = self._compressor.compress( struct.pack( '<I8s16ssIfI', self._session, tty_name, comm, probe, pid, ts, len(buf)) + buf) self._buffer.append(packet) fire_event = False if not self._dirty: fire_event = True self._dirty = True try: if fire_event and self._event_id is not None: self.broadcast_event(self._event_id) except Exception: pass @property def results(self): result = None with self._results_lock: if not self._dirty: return None try: packet = self._compressor.flush() self._buffer.append(packet) except zlib.error: pass result = self._buffer self._buffer = Buffer() self._compressor = zlib.compressobj(9) self._dirty = False return result @property def active(self): return self._ttymon.active def stop(self): self._ttymon.stop() super(TTYRec, self).stop()