X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=activity%2F__init__.py;h=ab2cd0d39d92eb88aca3c68a08f57e509301dcd9;hb=6837910efeb308b2bbb50228731669b90e9f1906;hp=d570662ed62ecbc4ed1ddbb87a66fcef79af69d4;hpb=567a9d3b511730254de5963b8bb68936c5881d3b;p=myslice.git diff --git a/activity/__init__.py b/activity/__init__.py index d570662e..ab2cd0d3 100644 --- a/activity/__init__.py +++ b/activity/__init__.py @@ -1,61 +1,82 @@ # # Activity monitor # +# Client is authenticated with an API key and a secret +# The API key is a 64 chars string (digits and letters) that is passed to the request +# The secret is a 64 chars string that is used to sign the request +# The generated signature is a SHA256 hes digest import urllib, urllib2 import threading -from datetime import datetime +import hmac +import hashlib +import base64 +import time +import datetime +from myslice.configengine import ConfigEngine +config = ConfigEngine() +if config.activity and config.activity.apikey : + apikey = config.activity.apikey +else : + # apikey will be necessary + apikey = None + +if config.activity and config.activity.secret : + secret = config.activity.secret +else : + # secret will be necessary + secret = None + +if config.activity and config.activity.server : + server = config.activity.server +else : + # default log server + server = "http://athos.ipv6.lip6.fr/activity/push/log" def logWrite(request, action, message): - url = "http://localhost:5000/log" + + if not apikey : + print "===============>> activity: no apikey" + return + if not secret : + print "===============>> activity: no secret" + return + + timestamp = time.mktime(datetime.datetime.today().timetuple()) + ip = getClientIp(request) log = { - "date" : datetime.today(), - "client_ip" : getClientIp(request), - "host" : request.get_host(), - "referrer" : request.META.get('HTTP_REFERER'), - "user" : request.user + "timestamp" : timestamp, + "client_ip" : ip, + "host" : request.get_host(), + "referrer" : request.META.get('HTTP_REFERER'), + "user" : request.user, + "action" : action, + "message" : message, + "apikey" : apikey, + "signature" : sign(secret, "%s%s%s%s" % (timestamp, ip, request.user, action)) } - try : - result = urllib2.urlopen(url, urllib.urlencode(log)) + result = urllib2.urlopen(server, urllib.urlencode(log)) content = result.read() except urllib2.URLError as e: - print "Error: connection to " + url + " impossible, logging disabled" + print "===============>> activity: connection to " + server + " impossible, could not log action" -def spawnThread(request, action, message): - print "aaaaaaaaa" +def log(request, action, message): # Create a new thread in Daemon mode to send the log entry t = threading.Thread(target=logWrite, args=(request, action, message)) t.setDaemon(True) t.start() -def userLogin(request): - spawnThread(request, 'userlogin', 'User logged in') - -def userLogout(request): - spawnThread(request, 'userlogout', 'User logged out') - -def userRegistration(request): - spawnThread(request, 'userregistration', 'User registered') - -def userSliceRequest(request): - spawnThread(request, 'userslicerequest', 'User requested a slice') - -def userContactSupport(request): - spawnThread(request, 'usercontactsupport', 'User contacted suppport') - -def userAddResource(request): - spawnThread(request, 'useraddresource', 'User added resource to slice') - -def userDelResource(request): - spawnThread(request, 'userdelresource', 'User removed resource from slice') - - def getClientIp(request): x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') if x_forwarded_for: ip = x_forwarded_for.split(',')[0] else: ip = request.META.get('REMOTE_ADDR') - return ip \ No newline at end of file + return ip + +# +# sign the request with the secret key +def sign(secret, message): + return hmac.new(secret, msg=message, digestmod=hashlib.sha256).hexdigest() \ No newline at end of file