This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
logtracker/logtracker/journal/views.py

128 lines
4.4 KiB
Python
Raw Normal View History

2020-08-28 16:20:05 +02:00
import datetime
from functools import wraps
2019-11-08 15:19:22 +01:00
from django.contrib.auth.mixins import LoginRequiredMixin
2020-08-28 16:20:05 +02:00
from django.conf import settings
2019-11-08 15:19:22 +01:00
from django.core import serializers
2020-08-28 16:20:05 +02:00
from django.core.exceptions import PermissionDenied
2019-11-08 15:19:22 +01:00
from django.http import HttpResponse, HttpResponseRedirect
from django.urls import reverse
2020-08-28 16:20:05 +02:00
from django.views.decorators.csrf import csrf_exempt
2019-11-08 15:19:22 +01:00
from django.views.generic import TemplateView
from django.views.generic.list import ListView
2020-07-03 17:44:32 +02:00
from logtracker.journal.models import Entry
2020-08-28 16:20:05 +02:00
from logtracker.journal.journalstream import get_journal_entries
2019-11-08 15:19:22 +01:00
2020-07-03 17:44:32 +02:00
class APIEntriesList(LoginRequiredMixin, ListView):
2019-11-08 15:19:22 +01:00
def get_queryset(self):
2020-09-08 16:05:22 +02:00
lines = self.request.GET.get('lines', 100)
host = self.request.GET.get('host', '')
return Entry.objects.dump(host=host, lines=lines)
2019-11-08 15:19:22 +01:00
def get(self, request, *args, **kwargs):
queryset = self.get_queryset()
response = serializers.serialize("json", queryset)
return HttpResponse(response, content_type='application/json')
2020-07-03 17:44:32 +02:00
class EntriesList(LoginRequiredMixin, ListView):
2020-09-08 16:05:22 +02:00
template_name = 'journal/entry_list.html'
2020-07-03 17:44:32 +02:00
def get_queryset(self):
2020-09-08 16:05:22 +02:00
lines = self.request.GET.get('lines', 100)
host = self.request.GET.get('host')
2020-09-10 15:28:20 +02:00
options = {k: v for k, v in self.request.GET.items() if k not in ('lines', 'host', 'timestamp')}
return Entry.objects.dump(host=host, lines=lines, **options)
def get_context_data(self, **kwargs):
data = super().get_context_data(**kwargs)
data['hosts'] = Entry.objects.hosts
data['units'] = Entry.objects.units
return data
2020-07-03 17:44:32 +02:00
2019-11-08 15:19:22 +01:00
class HomeView(LoginRequiredMixin, TemplateView):
2020-07-03 17:44:32 +02:00
template_name = 'home.html'
2019-11-08 15:19:22 +01:00
def post(self, request, *args, **kwargs):
2020-09-08 16:05:22 +02:00
url = '%s?%s' % (reverse('mail-api'), '%s=%s' % (request.POST['field'], request.POST['address']))
2019-11-08 15:19:22 +01:00
return HttpResponseRedirect(url)
2020-08-28 16:20:05 +02:00
def get_chunks(gen, n):
chunk = []
ended = False
while True:
for i in range(n):
try:
chunk.append(next(gen))
except StopIteration:
ended = True
yield chunk
chunk = []
if ended:
break
def ssl_client_verify(view):
@wraps(view)
def wrapper(request, *args, **kwargs):
headers = request.META
if headers.get('HTTP_X_SSL') == "1" and (
headers.get('HTTP_X_SSL_CLIENT_VERIFY') == "0"
or headers.get('HTTP_X_SSL_CLIENT_VERIFY') == "SUCCESS"
):
cn = headers.get('HTTP_X_SSL_CLIENT_CN')
dn = headers.get('HTTP_X_SSL_CLIENT_DN')
if cn:
request.host_verified = cn
else:
request.host_verified = dn.split(',')[0].split('=')[1]
if settings.CA_ISSUER:
ca_issuer = headers.get('HTTP_X_SSL_ISSUER')
if ca_issuer != settings.CA_ISSUER:
raise PermissionDenied
2020-08-28 16:20:05 +02:00
else:
if settings.DEBUG:
request.host_verified = 'test_host'
else:
raise PermissionDenied
return view(request, *args, **kwargs)
return wrapper
@ssl_client_verify
@csrf_exempt
def UploadView(request, debug=False):
if request.method == "POST":
count = 0
data = {}
new_entries = []
now = datetime.datetime.now()
timestamp = now
2020-08-28 16:20:05 +02:00
journal_stream = request.META.get('wsgi.input')
for chunk in get_chunks(get_journal_entries(journal_stream), 20):
for el in chunk:
data = {k: v for k, v in el}
try:
timestamp = datetime.datetime.fromtimestamp(int(data['__REALTIME_TIMESTAMP']) / 1000000)
2020-08-28 16:20:05 +02:00
except (KeyError, TypeError, ValueError):
continue
if (now - timestamp).days > settings.JOURNAL_HISTORY:
continue
2020-08-28 16:20:05 +02:00
entry = Entry(timestamp=timestamp, host=request.host_verified, data=data)
new_entries.append(entry)
count += 1
if debug and count % 1000 == 0:
print(count, timestamp)
Entry.objects.bulk_create(new_entries)
new_entries = []
2020-08-28 16:20:05 +02:00
if debug:
elapsed = datetime.datetime.now() - now
2020-08-28 16:20:05 +02:00
print('elapsed: %s' % elapsed)
print('count: %s' % count)
return HttpResponse('added %s' % count)
raise PermissionDenied