Exemple #1
0
class Output(cowrie.core.output.Output):
    """
    slack output
    """
    def start(self):
        self.slack_channel = CowrieConfig.get("output_slack", "channel")
        self.slack_token = CowrieConfig.get("output_slack", "token")

    def stop(self):
        pass

    def write(self, logentry):
        for i in list(logentry.keys()):
            # Remove twisted 15 legacy keys
            if i.startswith("log_"):
                del logentry[i]

        self.sc = SlackClient(self.slack_token)
        self.sc.api_call(
            "chat.postMessage",
            channel=self.slack_channel,
            text="{} {}".format(
                time.strftime("%Y-%m-%d %H:%M:%S"),
                json.dumps(logentry, indent=4, sort_keys=True),
            ),
        )
Exemple #2
0
class Output(cowrie.core.output.Output):
    """
    slack output
    """
    def start(self):
        self.slack_channel = CowrieConfig().get('output_slack', 'channel')
        self.slack_token = CowrieConfig().get('output_slack', 'token')

    def stop(self):
        pass

    def write(self, logentry):
        for i in list(logentry.keys()):
            # Remove twisted 15 legacy keys
            if i.startswith('log_'):
                del logentry[i]

        self.sc = SlackClient(self.slack_token)
        self.sc.api_call("chat.postMessage",
                         channel=self.slack_channel,
                         text="%s %s" %
                         (time.strftime('%Y-%m-%d %H:%M:%S'),
                          json.dumps(logentry, indent=4, sort_keys=True)))
class Reader(Thread):
    def __init__(self, token):
        self._client = SlackClient(token)  # create slack client
        self._output = Queue()
        self._exit = Event()
        self._read_int = 1
        super(Reader, self).__init__()
        self.daemon = True  # die on process exit
        self._log = _log.getChild('reader')
        self._id, self._user, = self._retrieve_id()
        self._channel_cache = {}

    def _handle_event(self, event):
        self._log.debug('got event type: %s' % event['type'])
        self._output.put(event)

    def _retrieve_id(self):
        # resp = json.loads(self._client.api_call('auth.test'))
        success, resp = self._client.api_call('auth.test')
        if not success:
            raise Exception('Invalid slack credentials')
        return resp['user_id'], resp['user']

    def _is_public(self, channel):
        if not channel in self._channel_cache:
            success, resp = self._client.api_call('im.list')
            if success:
                private = [ch['id'] for ch in resp.get('ims', [])]
                self._channel_cache[channel] = not channel in private
        return self._channel_cache[channel]

    @property
    def events(self):
        while not self._exit.isSet():
            try:
                event = self._output.get(True, 5)
                if event:
                    event['public'] = self._is_public(event['channel'])
                    yield event
            except QueueEmpty:
                pass

    def run(self):
        delay = 1
        self._log.debug('starting reader, initial backoff %i' % delay)
        while not self._exit.isSet():
            self._log.debug('connecting to slack rtm...')
            if self._client.rtm_connect():
                self._log.debug('connected, waiting for events...')
                delay = 2
                while not self._exit.isSet():
                    event = self._client.rtm_read()
                    if event and not event.get(
                            'user') == self._id and 'channel' in event:
                        self._handle_event(event)
            else:
                self._log.debug('connection failed')
                if delay <= 16:
                    delay += delay
                    self._log.debug('increasing backoff to %i' % delay)
                time.sleep(delay)

    def join(self):
        self._exit.set()
        self._log.debug('reader exiting...')
        self._client.rtm_close()
        return super(Reader, self).join()