2014-10-30 16:49:51 +00:00
|
|
|
import logging
|
2015-09-15 19:23:06 +00:00
|
|
|
import random
|
2014-10-30 16:49:51 +00:00
|
|
|
|
2014-11-15 00:55:31 +00:00
|
|
|
from app import analytics, app, userevents
|
2014-10-30 16:49:51 +00:00
|
|
|
from data import model
|
|
|
|
from flask import request
|
2015-11-19 22:40:33 +00:00
|
|
|
from auth.auth_context import (get_authenticated_user, get_validated_token,
|
|
|
|
get_validated_oauth_token, get_grant_user_context)
|
2014-10-30 16:49:51 +00:00
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
2015-09-15 19:23:06 +00:00
|
|
|
def track_and_log(event_name, repo, analytics_name=None, analytics_sample=1, **kwargs):
|
2014-10-30 16:49:51 +00:00
|
|
|
repository = repo.name
|
|
|
|
namespace = repo.namespace_user.username
|
|
|
|
metadata = {
|
|
|
|
'repo': repository,
|
|
|
|
'namespace': namespace,
|
|
|
|
}
|
|
|
|
metadata.update(kwargs)
|
|
|
|
|
|
|
|
analytics_id = 'anonymous'
|
|
|
|
|
2015-01-04 19:50:08 +00:00
|
|
|
authenticated_oauth_token = get_validated_oauth_token()
|
|
|
|
authenticated_user = get_authenticated_user()
|
|
|
|
authenticated_token = get_validated_token() if not authenticated_user else None
|
2015-11-19 22:40:33 +00:00
|
|
|
granted_username = get_grant_user_context()
|
|
|
|
|
|
|
|
# TODO: Fix this to support OAuth tokens as well.
|
|
|
|
if granted_username is not None:
|
|
|
|
authenticated_user = model.user.get_user(granted_username)
|
2015-01-04 19:50:08 +00:00
|
|
|
|
2015-02-11 19:15:18 +00:00
|
|
|
logger.debug('Logging the %s to Mixpanel and the log system', event_name)
|
2015-01-04 19:50:08 +00:00
|
|
|
if authenticated_oauth_token:
|
|
|
|
metadata['oauth_token_id'] = authenticated_oauth_token.id
|
|
|
|
metadata['oauth_token_application_id'] = authenticated_oauth_token.application.client_id
|
|
|
|
metadata['oauth_token_application'] = authenticated_oauth_token.application.name
|
2015-07-21 19:39:23 +00:00
|
|
|
analytics_id = 'oauth:{0}'.format(authenticated_oauth_token.id)
|
2015-01-04 19:50:08 +00:00
|
|
|
elif authenticated_user:
|
|
|
|
metadata['username'] = authenticated_user.username
|
|
|
|
analytics_id = authenticated_user.username
|
|
|
|
elif authenticated_token:
|
|
|
|
metadata['token'] = authenticated_token.friendly_name
|
|
|
|
metadata['token_code'] = authenticated_token.code
|
2015-02-17 17:35:16 +00:00
|
|
|
|
|
|
|
if authenticated_token.kind:
|
|
|
|
metadata['token_type'] = authenticated_token.kind.name
|
|
|
|
|
2015-07-21 19:39:23 +00:00
|
|
|
analytics_id = 'token:{0}'.format(authenticated_token.code)
|
2014-10-30 16:49:51 +00:00
|
|
|
else:
|
|
|
|
metadata['public'] = True
|
|
|
|
analytics_id = 'anonymous'
|
|
|
|
|
|
|
|
extra_params = {
|
|
|
|
'repository': '%s/%s' % (namespace, repository),
|
2015-03-06 17:02:40 +00:00
|
|
|
'user-agent': request.user_agent.string,
|
2014-10-30 16:49:51 +00:00
|
|
|
}
|
|
|
|
|
2014-11-15 00:55:31 +00:00
|
|
|
# Publish the user event (if applicable)
|
2015-02-11 19:15:18 +00:00
|
|
|
logger.debug('Checking publishing %s to the user events system', event_name)
|
2015-01-04 19:50:08 +00:00
|
|
|
if authenticated_user:
|
2015-02-11 19:15:18 +00:00
|
|
|
logger.debug('Publishing %s to the user events system', event_name)
|
2014-11-15 00:55:31 +00:00
|
|
|
user_event_data = {
|
|
|
|
'action': event_name,
|
|
|
|
'repository': repository,
|
|
|
|
'namespace': namespace
|
|
|
|
}
|
|
|
|
|
2015-01-04 19:50:08 +00:00
|
|
|
event = userevents.get_event(authenticated_user.username)
|
2014-11-15 00:55:31 +00:00
|
|
|
event.publish_event_data('docker-cli', user_event_data)
|
|
|
|
|
|
|
|
# Save the action to mixpanel.
|
2015-09-15 19:23:06 +00:00
|
|
|
if random.random() < analytics_sample:
|
|
|
|
if analytics_name is None:
|
|
|
|
analytics_name = event_name
|
|
|
|
logger.debug('Logging the %s to Mixpanel', analytics_name)
|
|
|
|
analytics.track(analytics_id, analytics_name, extra_params)
|
2014-11-15 00:55:31 +00:00
|
|
|
|
|
|
|
# Log the action to the database.
|
2015-02-11 19:15:18 +00:00
|
|
|
logger.debug('Logging the %s to logs system', event_name)
|
2015-07-15 21:25:41 +00:00
|
|
|
model.log.log_action(event_name, namespace, performer=authenticated_user, ip=request.remote_addr,
|
|
|
|
metadata=metadata, repository=repo)
|
2015-01-04 19:50:08 +00:00
|
|
|
|
2015-02-11 19:15:18 +00:00
|
|
|
logger.debug('Track and log of %s complete', event_name)
|