def send(self): data = cache.get_many([self.data_key, self.counter_key]) if not data: return cache.delete_many([self.data_key, self.counter_key]) err = error() for key, value in data[self.data_key].items(): err.set(key, value) err.set('count', data[self.counter_key]) err.server(url=settings.ARECIBO_SERVER_URL) err.send()
def __init__(self, request, status, **kw): # first off, these items can just be ignored, we # really don't care about them too much path = request.get_full_path() if _is_ignorable_404(path): return # if you've set INTERNAL_IPS, we'll respect that and # ignore any requests, we suggest settings this so your # unit tests don't blast the server if request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS: return exc_info = sys.exc_info() items = ['HOME', 'HTTP_ACCEPT', 'HTTP_ACCEPT_ENCODING', 'HTTP_REFERER', \ 'HTTP_ACCEPT_LANGUAGE', 'HTTP_CONNECTION', 'HTTP_HOST', 'LANG', \ 'PATH_INFO', 'QUERY_STRING', 'REQUEST_METHOD', 'SCRIPT_NAME', \ 'SERVER_NAME', 'SERVER_PORT', 'SERVER_PROTOCOL', 'SERVER_SOFTWARE'] data = [ "%s: %s" % (k, request.META[k]) for k in items if request.META.get(k)] if request.method.lower() == "post": data.append("POST and FILES Variables:") data.extend([" %s: %s" % self.filter_post_var(k, v) for k, v in request.POST.items() if not self.exclude_post_var(k) ]) data.extend([" %s: %s" % self.filter_file(k, v) for k, v in request.FILES.items() if not self.exclude_file(k) ]) # build out data to send to Arecibo some fields (like timestamp) # are automatically added self.data = { "account": getattr(settings, 'ARECIBO_PUBLIC_ACCOUNT_NUMBER', ''), "url": request.build_absolute_uri(), "ip": request.META.get('REMOTE_ADDR'), "traceback": u"\n".join(traceback.format_tb(exc_info[2])).encode("utf-8"), # Replace any chars that can't be represented in UTF-8 with the # Unicode replacement char: "request": "\n".join(smart_unicode(d, errors='replace') for d in data), "type": exc_info[0], "msg": str(exc_info[1]), "status": status, "uid": uuid.uuid4(), "user_agent": request.META.get('HTTP_USER_AGENT'), } # we might have a traceback, but it's not required try: if self.data["type"]: self.data["type"] = str(self.data["type"].__name__) except AttributeError: pass self.data.update(kw) # it could be the site does not have the standard django auth # setup and hence no request.user try: self.data["username"] = request.user.username, # this will be "" for Anonymous except Exception: pass # a 404 has some specific formatting of the error that can be useful if status == 404: msg = "" for m in exc_info[1]: if isinstance(m, dict): tried = "\n".join(map(self.get_pattern, m["tried"])) msg = "Failed to find %s, tried: \n%s" % (m["path"], tried) else: msg += m self.data["msg"] = msg # if we don't get a priority, lets create one if not self.data.get("priority"): if status == 500: self.data["priority"] = 1 else: self.data["priority"] = 5 # populate my arecibo object self.err = error() for key, value in self.data.items(): self.err.set(key, value)
def post(request, status, **kw): # first off, these items can just be ignored, we # really don't care about them too much path = request.get_full_path() if _is_ignorable_404(path): return # if you've set INTERNAL_IPS, we'll respect that and # ignore any requests, we suggest settings this so your # unit tests don't blast the server if request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS: return exc_info = sys.exc_info() items = ['HOME', 'HTTP_ACCEPT', 'HTTP_ACCEPT_ENCODING', 'HTTP_REFERER', \ 'HTTP_ACCEPT_LANGUAGE', 'HTTP_CONNECTION', 'HTTP_HOST', 'LANG', \ 'PATH_INFO', 'QUERY_STRING', 'REQUEST_METHOD', 'SCRIPT_NAME', \ 'SERVER_NAME', 'SERVER_PORT', 'SERVER_PROTOCOL', 'SERVER_SOFTWARE'] data = [ "%s: %s" % (k, request.META[k]) for k in items if request.META.get(k)] if request.method.lower() == "post": data.append("POST and FILES Variables:") data.extend( [ " %s: %s" % (k, v) for k, v in request.POST.items() ]) data.extend( [ " %s: %s" % (k, v) for k, v in request.FILES.items() ]) # build out data to send to Arecibo some fields (like timestamp) # are automatically added data = { "account": settings.ARECIBO_PUBLIC_ACCOUNT_NUMBER, "url": request.build_absolute_uri(), "ip": request.META.get('REMOTE_ADDR'), "traceback": "\n".join(traceback.format_tb(exc_info[2])), "request": "\n".join(data).encode("utf-8"), "type": exc_info[0], "msg": str(exc_info[1]), "status": status, "uid": time.time(), "user_agent": request.META.get('HTTP_USER_AGENT'), } # we might have a traceback, but it's not required try: if data["type"]: data["type"] = str(data["type"].__name__) except AttributeError: pass data.update(kw) # it could be the site does not have the standard django auth # setup and hence no reques.user try: data["username"] = request.user.username, # this will be "" for Anonymous except AttributeError: pass # a 404 has some specific formatting of the error that can be useful if status == 404: msg = "" for m in exc_info[1]: if isinstance(m, dict): tried = "\n".join(m["tried"]) msg = "Failed to find %s, tried: \n%s" % (m["path"], tried) else: msg += m data["msg"] = msg # if we don't get a priority, lets create one if not data.get("priority"): if status == 500: data["priority"] = 1 else: data["priority"] = 5 # populate my arecibo object err = error() for key, value in data.items(): err.set(key, value) try: if getattr(settings, "ARECIBO_TRANSPORT", "") == "smtp": # use Djangos builtin mail send_mail("Error", err.as_json(), settings.DEFAULT_FROM_EMAIL, [settings.ARECIBO_SERVER_EMAIL,]) else: err.server(url=settings.ARECIBO_SERVER_URL) err.send() except: # if you want this to be an explicit fail swap # change the comments on the next two lines around raise #pass return data["uid"]
def __init__(self, request, status, **kw): # first off, these items can just be ignored, we # really don't care about them too much path = request.get_full_path() if _is_ignorable_404(path): return # if you've set INTERNAL_IPS, we'll respect that and # ignore any requests, we suggest settings this so your # unit tests don't blast the server if request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS: return exc_info = sys.exc_info() items = ['HOME', 'HTTP_ACCEPT', 'HTTP_ACCEPT_ENCODING', 'HTTP_REFERER', \ 'HTTP_ACCEPT_LANGUAGE', 'HTTP_CONNECTION', 'HTTP_HOST', 'LANG', \ 'PATH_INFO', 'QUERY_STRING', 'REQUEST_METHOD', 'SCRIPT_NAME', \ 'SERVER_NAME', 'SERVER_PORT', 'SERVER_PROTOCOL', 'SERVER_SOFTWARE'] data = [ "%s: %s" % (k, request.META[k]) for k in items if request.META.get(k) ] if request.method.lower() == "post": data.append("POST and FILES Variables:") data.extend([ " %s: %s" % self.filter_post_var(k, v) for k, v in request.POST.items() if not self.exclude_post_var(k) ]) data.extend([ " %s: %s" % self.filter_file(k, v) for k, v in request.FILES.items() if not self.exclude_file(k) ]) # build out data to send to Arecibo some fields (like timestamp) # are automatically added self.data = { "account": getattr(settings, 'ARECIBO_PUBLIC_ACCOUNT_NUMBER', ''), "url": request.build_absolute_uri(), "ip": request.META.get('REMOTE_ADDR'), "traceback": u"\n".join(traceback.format_tb(exc_info[2])).encode("utf-8"), # Replace any chars that can't be represented in UTF-8 with the # Unicode replacement char: "request": "\n".join(smart_unicode(d, errors='replace') for d in data), "type": exc_info[0], "msg": str(exc_info[1]), "status": status, "uid": uuid.uuid4(), "user_agent": request.META.get('HTTP_USER_AGENT'), } # we might have a traceback, but it's not required try: if self.data["type"]: self.data["type"] = str(self.data["type"].__name__) except AttributeError: pass self.data.update(kw) # it could be the site does not have the standard django auth # setup and hence no request.user try: self.data["username"] = request.user.username, # this will be "" for Anonymous except Exception: pass # a 404 has some specific formatting of the error that can be useful if status == 404: msg = "" for m in exc_info[1]: if isinstance(m, dict): tried = "\n".join(map(self.get_pattern, m["tried"])) msg = "Failed to find %s, tried: \n%s" % (m["path"], tried) else: msg += m self.data["msg"] = msg # if we don't get a priority, lets create one if not self.data.get("priority"): if status == 500: self.data["priority"] = 1 else: self.data["priority"] = 5 # populate my arecibo object self.err = error() for key, value in self.data.items(): self.err.set(key, value)
def post(request, status, **kw): # first off, these items can just be ignored, we # really don't care about them too much path = request.get_full_path() if _is_ignorable_404(path): return # if you've set INTERNAL_IPS, we'll respect that and # ignore any requests, we suggest settings this so your # unit tests don't blast the server if request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS: return exc_info = sys.exc_info() items = ['HOME', 'HTTP_ACCEPT', 'HTTP_ACCEPT_ENCODING', 'HTTP_REFERER', \ 'HTTP_ACCEPT_LANGUAGE', 'HTTP_CONNECTION', 'HTTP_HOST', 'LANG', \ 'PATH_INFO', 'QUERY_STRING', 'REQUEST_METHOD', 'SCRIPT_NAME', \ 'SERVER_NAME', 'SERVER_PORT', 'SERVER_PROTOCOL', 'SERVER_SOFTWARE'] data = [ "%s: %s" % (k, request.META[k]) for k in items if request.META.get(k) ] if request.method.lower() == "post": data.append("POST and FILES Variables:") data.extend([" %s: %s" % (k, v) for k, v in request.POST.items()]) data.extend([" %s: %s" % (k, v) for k, v in request.FILES.items()]) # build out data to send to Arecibo some fields (like timestamp) # are automatically added data = { "account": settings.ARECIBO_PUBLIC_ACCOUNT_NUMBER, "url": request.build_absolute_uri(), "ip": request.META.get('REMOTE_ADDR'), "traceback": "\n".join(traceback.format_tb(exc_info[2])), "request": "\n".join(data).encode("utf-8"), "type": exc_info[0], "msg": str(exc_info[1]), "status": status, "uid": time.time(), "user_agent": request.META.get('HTTP_USER_AGENT'), } # we might have a traceback, but it's not required try: if data["type"]: data["type"] = str(data["type"].__name__) except AttributeError: pass data.update(kw) # it could be the site does not have the standard django auth # setup and hence no reques.user try: data["username"] = request.user.username, # this will be "" for Anonymous except AttributeError: pass # a 404 has some specific formatting of the error that can be useful if status == 404: msg = "" for m in exc_info[1]: if isinstance(m, dict): tried = "\n".join(m["tried"]) msg = "Failed to find %s, tried: \n%s" % (m["path"], tried) else: msg += m data["msg"] = msg # if we don't get a priority, lets create one if not data.get("priority"): if status == 500: data["priority"] = 1 else: data["priority"] = 5 # populate my arecibo object err = error() for key, value in data.items(): err.set(key, value) try: if getattr(settings, "ARECIBO_TRANSPORT", "") == "smtp": # use Djangos builtin mail send_mail("Error", err.as_json(), settings.DEFAULT_FROM_EMAIL, [ settings.ARECIBO_SERVER_EMAIL, ]) else: err.server(url=settings.ARECIBO_SERVER_URL) err.send() except: # if you want this to be an explicit fail swap # change the comments on the next two lines around raise #pass return data["uid"]