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.
 
 
 
 
 

96 lines
2.7 KiB

import json
from django.contrib.humanize.templatetags.humanize import naturaltime
from django.db.models import F
from django.http import HttpResponse, HttpResponseBadRequest
from django.utils import timezone
from django.views.decorators.cache import never_cache
from django.views.decorators.csrf import csrf_exempt
from hc.api.decorators import uuid_or_400
from hc.api.models import Check, Ping
@csrf_exempt
@uuid_or_400
@never_cache
def ping(request, code):
try:
check = Check.objects.get(code=code)
except Check.DoesNotExist:
return HttpResponseBadRequest()
check.n_pings = F("n_pings") + 1
check.last_ping = timezone.now()
if check.status == "new":
check.status = "up"
check.save()
check.refresh_from_db()
ping = Ping(owner=check)
headers = request.META
ping.n = check.n_pings
remote_addr = headers.get("HTTP_X_FORWARDED_FOR", headers["REMOTE_ADDR"])
ping.remote_addr = remote_addr.split(",")[0]
ping.scheme = headers.get("HTTP_X_FORWARDED_PROTO", "http")
ping.method = headers["REQUEST_METHOD"]
# If User-Agent is longer than 200 characters, truncate it:
ping.ua = headers.get("HTTP_USER_AGENT", "")[:200]
ping.save()
response = HttpResponse("OK")
response["Access-Control-Allow-Origin"] = "*"
return response
@csrf_exempt
def handle_email(request):
if request.method != "POST":
return HttpResponseBadRequest()
events = json.loads(request.POST["mandrill_events"])
for event in events:
for recipient_address, recipient_name in event["msg"]["to"]:
code, domain = recipient_address.split("@")
try:
check = Check.objects.get(code=code)
except ValueError:
continue
except Check.DoesNotExist:
continue
check.n_pings = F("n_pings") + 1
check.last_ping = timezone.now()
if check.status == "new":
check.status = "up"
check.save()
ping = Ping(owner=check)
ping.scheme = "email"
ping.save()
response = HttpResponse("OK")
return response
@uuid_or_400
def status(request, code):
response = {
"last_ping": None,
"last_ping_human": None,
"secs_to_alert": None
}
check = Check.objects.get(code=code)
if check.last_ping and check.alert_after:
response["last_ping"] = check.last_ping.isoformat()
response["last_ping_human"] = naturaltime(check.last_ping)
duration = check.alert_after - timezone.now()
response["secs_to_alert"] = int(duration.total_seconds())
return HttpResponse(json.dumps(response),
content_type="application/javascript")