diff --git a/apps/common/api.py b/apps/common/api.py index 58a5822c1..0e626cacd 100644 --- a/apps/common/api.py +++ b/apps/common/api.py @@ -1,7 +1,10 @@ # -*- coding: utf-8 -*- # +import os import json +import uuid +from django.core.cache import cache from rest_framework.views import APIView from rest_framework.views import Response from ldap3 import Server, Connection @@ -11,6 +14,7 @@ from django.conf import settings from .permissions import IsSuperUser, IsAppUser from .serializers import MailTestSerializer, LDAPTestSerializer +from .const import FILE_END_GUARD class MailTestingAPI(APIView): @@ -105,3 +109,30 @@ class DjangoSettingsAPI(APIView): if i.isupper(): configs[i] = str(getattr(settings, i)) return Response(configs) + + +class FileTailApi(APIView): + permission_classes = (IsSuperUser,) + default_buff_size = 1024 * 10 + end = False + buff_size = None + + def get(self, request, *args, **kwargs): + file_path = request.query_params.get("file") + self.buff_size = request.query_params.get('buffer') or self.default_buff_size + mark = request.query_params.get("mark") or str(uuid.uuid4()) + + if not os.path.isfile(file_path): + return Response({"data": _("Waiting ...")}, status=203) + + with open(file_path, 'r') as f: + offset = cache.get(mark, 0) + f.seek(offset) + data = f.read(self.buff_size).replace('\n', '\r\n') + mark = str(uuid.uuid4()) + cache.set(mark, f.tell(), 5) + + if FILE_END_GUARD in data: + data = data.replace(FILE_END_GUARD, '') + self.end = True + return Response({"data": data, 'end': self.end, 'mark': mark}) \ No newline at end of file diff --git a/apps/common/celery.py b/apps/common/celery.py index e79f1d434..352f1ff45 100644 --- a/apps/common/celery.py +++ b/apps/common/celery.py @@ -5,7 +5,7 @@ import json from functools import wraps from celery import Celery, subtask -from celery.signals import worker_ready, worker_shutdown +from celery.signals import worker_ready, worker_shutdown, task_prerun, task_postrun from django.db.utils import ProgrammingError, OperationalError from .utils import get_logger @@ -199,3 +199,16 @@ def after_app_shutdown(sender=None, headers=None, body=None, **kwargs): ', '.join(__AFTER_APP_SHUTDOWN_CLEAN_TASKS)) ) PeriodicTask.objects.filter(name__in=__AFTER_APP_SHUTDOWN_CLEAN_TASKS).delete() + + +@task_prerun.connect +def pre_run_task_signal_handler(sender, task, *args, **kwargs): + + print("Sender: {}".format(sender)) + print("Task: {}".format(task)) + + +@task_postrun.connect +def post_run_task_signal_handler(sender, task, *args, **kwargs): + print("Sender: {}".format(sender)) + print("Task: {}".format(task)) \ No newline at end of file diff --git a/apps/common/const.py b/apps/common/const.py index a28b0f1db..f3669c49d 100644 --- a/apps/common/const.py +++ b/apps/common/const.py @@ -4,4 +4,5 @@ from django.utils.translation import ugettext as _ create_success_msg = _("%(name)s was created successfully") -update_success_msg = _("%(name)s was updated successfully") \ No newline at end of file +update_success_msg = _("%(name)s was updated successfully") +FILE_END_GUARD = ">>> Content End <<<" diff --git a/apps/common/templates/common/tail_file.html b/apps/common/templates/common/tail_file.html new file mode 100644 index 000000000..8c24fa707 --- /dev/null +++ b/apps/common/templates/common/tail_file.html @@ -0,0 +1,96 @@ +{% load static %} +
+