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), ), )
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()