X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=activity%2F__init__.py;h=4a7d5c3070c70a36f8206423bbee7277fed54a3f;hb=1251e59480caceb7fdfa9ba11e525e37d27f5b12;hp=e8eb5c3f0b097ab59dd2b2742138ddba61ca956c;hpb=29a9340139de5dc9537985c0fefa145b0b1c2afd;p=myslice.git diff --git a/activity/__init__.py b/activity/__init__.py index e8eb5c3f..4a7d5c30 100644 --- a/activity/__init__.py +++ b/activity/__init__.py @@ -6,8 +6,6 @@ # The secret is a 64 chars string that is used to sign the request # The generated signature is a SHA256 hes digest -from __future__ import print_function - import urllib, urllib2 import threading import hmac @@ -16,6 +14,12 @@ import base64 import time import datetime from myslice.configengine import ConfigEngine +from myslice.settings import logger +import random +import os +import sqlite3 as lite +import json +import syslog config = ConfigEngine() if config.activity and config.activity.apikey : @@ -39,10 +43,10 @@ else : def logWrite(request, action, message, objects = None): if not apikey : - print("===============>> activity: no apikey") + logger.info("===============>> activity: no apikey") return if not secret : - print("===============>> activity: no secret") + logger.info("===============>> activity: no secret") return timestamp = time.mktime(datetime.datetime.today().timetuple()) @@ -52,7 +56,7 @@ def logWrite(request, action, message, objects = None): "client_ip" : ip, "host" : request.get_host(), "referrer" : request.META.get('HTTP_REFERER'), - "user" : request.user, + "user" : request.user.username, "action" : action, "message" : message, "apikey" : apikey, @@ -63,20 +67,40 @@ def logWrite(request, action, message, objects = None): "facility" : None, "testbed" : None, } - + if objects is not None: for o in objects : if (o in log) : log[o] = objects[o] - + try : result = urllib2.urlopen(server, urllib.urlencode(log)) - print("===============>> activity: %s <%s> %s" % (action, request.user,message)) + logger.info("===============>> activity: {} <{}> {}".format(action, request.user,message)) content = result.read() + + #checking for not sent data and sending it (50% probability) + if random.randint(0,100) < 50: + logCheck() + except urllib2.URLError as e: - print("===============>> activity: connection to " + server + " impossible, could not log action") - print(e.strerror) - print("") + logger.error("===============>> activity: connection to {} impossible, could not log action".format(server)) + logger.error(e.strerror) + + dbfile = ''.join([os.path.dirname(os.path.abspath(__file__)), "/errors.db"]) + conn = None + try: + conn = lite.connect(dbfile) + cur = conn.cursor() + cur.execute("""INSERT INTO logs(log) values('%s')""" % json.dumps(log)) + conn.commit() + except lite.Error, e: + # this means that writing log into db also failed :( + # Last chance to preserve log is to send it to system syslog + # however there is no mechanism to pull it from this log - just manually. + logger.error('[activity] Error while inserting into sql db: %s' % str(e.args)) + logger.error("[activity] data to send: '%s'" % json.dumps(log)) + if conn: + conn.close() def log(request, action, message, objects = None): # Create a new thread in Daemon mode to send the log entry @@ -85,10 +109,10 @@ def log(request, action, message, objects = None): t.start() def getClientIp(request): - x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') - if x_forwarded_for: + try : + x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') ip = x_forwarded_for.split(',')[0] - else: + except: ip = request.META.get('REMOTE_ADDR') return ip @@ -96,3 +120,38 @@ def getClientIp(request): # sign the request with the secret key def sign(secret, message): return hmac.new(secret, msg=message, digestmod=hashlib.sha256).hexdigest() + +# +# sending the logs cached in sqlite database + +def logCheck(): + """Checking local database for logs adn sending it to monitoring server""" + dbfile = ''.join([os.path.dirname(os.path.abspath(__file__)), "/errors.db"]) + conn = None + + #trying to connect local db adn pull unsent logs + try: + conn = lite.connect(dbfile) + cur = conn.cursor() + cur.execute("SELECT rowid, log from logs") + notsent = cur.fetchall() + for row in notsent: + #trying to send unsent data from sqlite db + try : + urllib2.urlopen(config.activity.server, urllib.urlencode(json.loads(row[1]))) + #delete those who were sent + cur.execute("""DELETE FROM logs where rowid = %s""" % row[0] ) + conn.commit() + except urllib2.URLError as e: + # this is just to inform that DB is not working properly + logger.error('[activity] Error while sending stats') + logger.error(e.strerror) + + except lite.Error, e: + #this need to be updated to store information via syslog + logger.error('[activity] Error while pulling from local sqlite3 db: %s' % str(e.args)) + logger.error(e.strerror) + if conn: + conn.close() + + return