Exemplo n.º 1
0
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()
Exemplo n.º 2
0
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()