You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
2.3 KiB
71 lines
2.3 KiB
import logging
|
|
from slackclient import SlackClient
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
TIMESTAMP_FIELD = "date_last"
|
|
USER_FIELD = "email"
|
|
IP_FIELD = "ip"
|
|
USER_AGENT_FIELD = "user_agent"
|
|
FILTER_FIELD = None
|
|
|
|
|
|
def poll(config):
|
|
slack_api = SlackClient(config["pollers"]["slack"]["api_token"])
|
|
data = []
|
|
caught_up = False
|
|
for i in range(1, 101):
|
|
logger.info("Polling page %s..." % i)
|
|
api_data = slack_api.api_call("team.accessLogs", count=1000, page=i)
|
|
check_api(api_data)
|
|
for event in api_data["logins"]:
|
|
if event[TIMESTAMP_FIELD] > config["pollers"]["slack"]["last_polled_time"]:
|
|
data.append(event)
|
|
elif event[TIMESTAMP_FIELD] == config["pollers"]["slack"]["last_polled_time"]:
|
|
if str(event) == str(config["pollers"]["slack"]["last_polled_event"]):
|
|
caught_up = True
|
|
break
|
|
else:
|
|
data.append(event)
|
|
else:
|
|
caught_up = True
|
|
break
|
|
if caught_up:
|
|
break
|
|
data = enrich(config, data)
|
|
return data
|
|
|
|
|
|
def notify(config, alerts):
|
|
return
|
|
|
|
|
|
def check_api(data):
|
|
if not data["ok"]:
|
|
raise RuntimeError("Slack API returned an error: "+str(data))
|
|
else:
|
|
return
|
|
|
|
def enrich(config, data):
|
|
unique_users = list(set([e["user_id"] for e in data]))
|
|
slack_api = SlackClient(config["pollers"]["slack"]["api_token"])
|
|
user_map = {}
|
|
|
|
for user in unique_users:
|
|
user_info = slack_api.api_call("users.info", user=user)
|
|
check_api(user_info)
|
|
logger.debug(user_info)
|
|
if "is_bot" in user_info["user"] and user_info["user"]["is_bot"]:
|
|
continue
|
|
elif "is_app_user" in user_info["user"] and user_info["user"]["is_app_user"]:
|
|
continue
|
|
elif "profile" in user_info["user"] and "email" in user_info["user"]["profile"]:
|
|
user_map[user] = user_info["user"]["profile"]["email"]
|
|
logger.debug("Mapping user %s to %s." % (user, user_map[user]))
|
|
new_data = []
|
|
for entry in data:
|
|
if entry["user_id"] in user_map:
|
|
entry["email"] = user_map[entry["user_id"]]
|
|
new_data.append(entry)
|
|
logger.debug("Returning %s records." % len(new_data))
|
|
return new_data
|
|
|