import json
|
|
|
|
from django.contrib.humanize.templatetags.humanize import naturaltime
|
|
from django.http import HttpResponse, HttpResponseBadRequest
|
|
from django.utils import timezone
|
|
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
|
|
def ping(request, code):
|
|
try:
|
|
check = Check.objects.get(code=code)
|
|
except Check.DoesNotExist:
|
|
return HttpResponseBadRequest()
|
|
|
|
check.last_ping = timezone.now()
|
|
if check.status == "new":
|
|
check.status = "up"
|
|
|
|
check.save()
|
|
|
|
ping = Ping(owner=check)
|
|
headers = request.META
|
|
ping.remote_addr = headers.get("HTTP_X_REAL_IP", headers["REMOTE_ADDR"])
|
|
ping.scheme = headers.get("HTTP_X_SCHEME", "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.body = request.body
|
|
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.last_ping = timezone.now()
|
|
if check.status == "new":
|
|
check.status = "up"
|
|
|
|
check.save()
|
|
|
|
ping = Ping(owner=check)
|
|
ping.scheme = "email"
|
|
ping.body = event["msg"]["raw_msg"]
|
|
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")
|