From 7a575afcb3e599e14290ec4a9104b7a6eb902641 Mon Sep 17 00:00:00 2001 From: James Williams Date: Tue, 12 Jul 2022 03:18:28 +0000 Subject: [PATCH 1/8] rename home app to core app --- netopsio/{home => core}/__init__.py | 0 netopsio/{home => core}/admin.py | 0 netopsio/{home => core}/apps.py | 6 +++--- netopsio/{home => core}/migrations/__init__.py | 0 netopsio/{home => core}/models.py | 0 netopsio/{home => core}/serializers.py | 0 .../templates/home => core/templates/core}/base.html | 0 .../home => core/templates/core}/task_details.html | 0 .../home => core/templates/core}/tasks.html | 0 netopsio/{home => core}/tests.py | 0 netopsio/{home => core}/urls.py | 6 +++--- netopsio/{home => core}/views.py | 12 ++++++------ netopsio/netopsio/settings.py | 2 +- netopsio/netopsio/urls.py | 4 ++-- 14 files changed, 15 insertions(+), 15 deletions(-) rename netopsio/{home => core}/__init__.py (100%) rename netopsio/{home => core}/admin.py (100%) rename netopsio/{home => core}/apps.py (63%) rename netopsio/{home => core}/migrations/__init__.py (100%) rename netopsio/{home => core}/models.py (100%) rename netopsio/{home => core}/serializers.py (100%) rename netopsio/{home/templates/home => core/templates/core}/base.html (100%) rename netopsio/{home/templates/home => core/templates/core}/task_details.html (100%) rename netopsio/{home/templates/home => core/templates/core}/tasks.html (100%) rename netopsio/{home => core}/tests.py (100%) rename netopsio/{home => core}/urls.py (71%) rename netopsio/{home => core}/views.py (80%) diff --git a/netopsio/home/__init__.py b/netopsio/core/__init__.py similarity index 100% rename from netopsio/home/__init__.py rename to netopsio/core/__init__.py diff --git a/netopsio/home/admin.py b/netopsio/core/admin.py similarity index 100% rename from netopsio/home/admin.py rename to netopsio/core/admin.py diff --git a/netopsio/home/apps.py b/netopsio/core/apps.py similarity index 63% rename from netopsio/home/apps.py rename to netopsio/core/apps.py index 4191065..cfd1f99 100644 --- a/netopsio/home/apps.py +++ b/netopsio/core/apps.py @@ -3,7 +3,7 @@ from django.apps import AppConfig -class HomeConfig(AppConfig): - "Home app config." +class CoreConfig(AppConfig): + "Core app config." default_auto_field = "django.db.models.BigAutoField" - name = "home" + name = "core" diff --git a/netopsio/home/migrations/__init__.py b/netopsio/core/migrations/__init__.py similarity index 100% rename from netopsio/home/migrations/__init__.py rename to netopsio/core/migrations/__init__.py diff --git a/netopsio/home/models.py b/netopsio/core/models.py similarity index 100% rename from netopsio/home/models.py rename to netopsio/core/models.py diff --git a/netopsio/home/serializers.py b/netopsio/core/serializers.py similarity index 100% rename from netopsio/home/serializers.py rename to netopsio/core/serializers.py diff --git a/netopsio/home/templates/home/base.html b/netopsio/core/templates/core/base.html similarity index 100% rename from netopsio/home/templates/home/base.html rename to netopsio/core/templates/core/base.html diff --git a/netopsio/home/templates/home/task_details.html b/netopsio/core/templates/core/task_details.html similarity index 100% rename from netopsio/home/templates/home/task_details.html rename to netopsio/core/templates/core/task_details.html diff --git a/netopsio/home/templates/home/tasks.html b/netopsio/core/templates/core/tasks.html similarity index 100% rename from netopsio/home/templates/home/tasks.html rename to netopsio/core/templates/core/tasks.html diff --git a/netopsio/home/tests.py b/netopsio/core/tests.py similarity index 100% rename from netopsio/home/tests.py rename to netopsio/core/tests.py diff --git a/netopsio/home/urls.py b/netopsio/core/urls.py similarity index 71% rename from netopsio/home/urls.py rename to netopsio/core/urls.py index 4dd612f..86f6209 100644 --- a/netopsio/home/urls.py +++ b/netopsio/core/urls.py @@ -1,10 +1,10 @@ -"Home app urls." +"Core app urls." from django.urls import path -from . import views +from core import views app_name = "" # pylint: disable=invalid-name urlpatterns = [ - path("", views.index, name="home-index"), + path("", views.index, name="core-index"), path("tasks/", views.tasks, name="tasks"), path("tasks//", views.task_details, name="task-details"), ] diff --git a/netopsio/home/views.py b/netopsio/core/views.py similarity index 80% rename from netopsio/home/views.py rename to netopsio/core/views.py index 6897405..aeb4054 100644 --- a/netopsio/home/views.py +++ b/netopsio/core/views.py @@ -1,15 +1,15 @@ -"Home app views." +"Core app views." from django.http import HttpResponse from django.template import loader from django.shortcuts import get_object_or_404 from django_celery_results.models import TaskResult from rest_framework import viewsets -from home.serializers import TaskResultSerializer +from core.serializers import TaskResultSerializer def index(request): - """Render Home Page.""" - template = loader.get_template("home/base.html") + """Render Core Page.""" + template = loader.get_template("core/base.html") context = {"title": "Home"} return HttpResponse(template.render(context, request)) @@ -17,7 +17,7 @@ def index(request): def tasks(request): """Render Task Results.""" task_results = TaskResult.objects.all() - template = loader.get_template("home/tasks.html") + template = loader.get_template("core/tasks.html") context = {"title": "Task Results", "results": task_results} return HttpResponse(template.render(context, request)) @@ -26,7 +26,7 @@ def task_details(request, task_id): """Render Task Detail Results.""" job = get_object_or_404(TaskResult, task_id=task_id) result = "\n".join(job.result.strip('"').split("\\n")) - template = loader.get_template("home/task_details.html") + template = loader.get_template("core/task_details.html") context = {"title": "Task Details", "job": job, "result": result} return HttpResponse(template.render(context, request)) diff --git a/netopsio/netopsio/settings.py b/netopsio/netopsio/settings.py index ae6f826..8b1c9c4 100644 --- a/netopsio/netopsio/settings.py +++ b/netopsio/netopsio/settings.py @@ -41,7 +41,7 @@ "rest_framework", "drf_yasg", "django_celery_results", - "home", + "core", "ping", "traceroute", "nmap", diff --git a/netopsio/netopsio/urls.py b/netopsio/netopsio/urls.py index f759ae3..4a9a7ff 100644 --- a/netopsio/netopsio/urls.py +++ b/netopsio/netopsio/urls.py @@ -19,7 +19,7 @@ from rest_framework import permissions from drf_yasg.views import get_schema_view from drf_yasg import openapi -from home.views import TaskResultViewSet +from core.views import TaskResultViewSet from ping.views import PingRequestViewSet, PingViewSet from traceroute.views import TraceRouteRequestViewSet, TraceRouteViewSet from nmap.views import NmapRequestViewSet, NmapViewSet @@ -48,7 +48,7 @@ urlpatterns = [ - path("", include("home.urls"), name="home"), + path("", include("core.urls"), name="core"), path("ping/", include("ping.urls"), name="ping"), path("traceroute/", include("traceroute.urls"), name="traceroute"), path("nmap/", include("nmap.urls"), name="nmap"), From acbae2053d115956c202b971f5a1962f484b5207 Mon Sep 17 00:00:00 2001 From: James Williams Date: Mon, 18 Jul 2022 02:44:19 +0000 Subject: [PATCH 2/8] move ping app into core --- netopsio/core/__init__.py | 1 + netopsio/core/admin.py | 14 +++++- netopsio/core/api/__init__.py | 1 + netopsio/core/{ => api}/serializers.py | 19 ++++++- netopsio/core/api/urls.py | 8 +++ netopsio/core/api/views.py | 47 ++++++++++++++++++ .../migrations/0001_add_request_log.py} | 6 +-- netopsio/core/models.py | 22 ++++++++- netopsio/{ping => core}/tasks.py | 4 +- .../templates/core/task.html} | 2 +- netopsio/core/tests.py | 25 ++++++++-- netopsio/core/urls.py | 5 +- netopsio/core/views.py | 20 ++++---- netopsio/netopsio/settings.py | 1 - netopsio/netopsio/urls.py | 21 +------- netopsio/ping/__init__.py | 0 netopsio/ping/admin.py | 13 ----- netopsio/ping/apps.py | 8 --- netopsio/ping/migrations/__init__.py | 0 netopsio/ping/models.py | 20 -------- netopsio/ping/serializers.py | 20 -------- netopsio/ping/tests.py | 16 ------ netopsio/ping/urls.py | 7 --- netopsio/ping/views.py | 49 ------------------- 24 files changed, 149 insertions(+), 180 deletions(-) create mode 100644 netopsio/core/api/__init__.py rename netopsio/core/{ => api}/serializers.py (56%) create mode 100644 netopsio/core/api/urls.py create mode 100644 netopsio/core/api/views.py rename netopsio/{ping/migrations/0001_initial.py => core/migrations/0001_add_request_log.py} (84%) rename netopsio/{ping => core}/tasks.py (74%) rename netopsio/{ping/templates/ping/base.html => core/templates/core/task.html} (96%) delete mode 100644 netopsio/ping/__init__.py delete mode 100644 netopsio/ping/admin.py delete mode 100644 netopsio/ping/apps.py delete mode 100644 netopsio/ping/migrations/__init__.py delete mode 100644 netopsio/ping/models.py delete mode 100644 netopsio/ping/serializers.py delete mode 100644 netopsio/ping/tests.py delete mode 100644 netopsio/ping/urls.py delete mode 100644 netopsio/ping/views.py diff --git a/netopsio/core/__init__.py b/netopsio/core/__init__.py index e69de29..239c127 100644 --- a/netopsio/core/__init__.py +++ b/netopsio/core/__init__.py @@ -0,0 +1 @@ +"""Netops.io core app.""" diff --git a/netopsio/core/admin.py b/netopsio/core/admin.py index 4185d36..6373b3f 100644 --- a/netopsio/core/admin.py +++ b/netopsio/core/admin.py @@ -1,3 +1,13 @@ -# from django.contrib import admin +"""Register core models in admin panel.""" -# Register your models here. +from django.contrib import admin +from core.models import RequestLog + + +class RequestLogAdmin(admin.ModelAdmin): + """Request Log Admin Site Fields.""" + + list_display = ("ip", "app", "date") + + +admin.site.register(RequestLog, RequestLogAdmin) diff --git a/netopsio/core/api/__init__.py b/netopsio/core/api/__init__.py new file mode 100644 index 0000000..6f6fd31 --- /dev/null +++ b/netopsio/core/api/__init__.py @@ -0,0 +1 @@ +"""Core application API.""" diff --git a/netopsio/core/serializers.py b/netopsio/core/api/serializers.py similarity index 56% rename from netopsio/core/serializers.py rename to netopsio/core/api/serializers.py index 25a62dc..dd748ef 100644 --- a/netopsio/core/serializers.py +++ b/netopsio/core/api/serializers.py @@ -1,6 +1,7 @@ -"""Home App and Worker Serializers.""" +"""Core App and Worker Serializers.""" from rest_framework import serializers from django_celery_results.models import TaskResult +from core import models class TaskResultSerializer(serializers.HyperlinkedModelSerializer): @@ -24,3 +25,19 @@ class Meta: "date_done", "url", ] + + +class TaskSerializer(serializers.Serializer): # pylint: disable=abstract-method + """Ping Serializer.""" + + task_id = serializers.CharField(max_length=512) + + +class RequestLogSerializer(serializers.ModelSerializer): + """RequestLog Serializer.""" + + class Meta: + """RequestLog Serializer Meta.""" + + model = models.RequestLog + fields = ["id", "date", "task_id", "ip", "app", "result", "url"] diff --git a/netopsio/core/api/urls.py b/netopsio/core/api/urls.py new file mode 100644 index 0000000..c9650b4 --- /dev/null +++ b/netopsio/core/api/urls.py @@ -0,0 +1,8 @@ +"""Netops.io core api urls.""" + +from rest_framework.routers import DefaultRouter +from core.api.views import TaskResultViewSet + + +router = DefaultRouter() +router.register(r"tasks", TaskResultViewSet) diff --git a/netopsio/core/api/views.py b/netopsio/core/api/views.py new file mode 100644 index 0000000..bbd0662 --- /dev/null +++ b/netopsio/core/api/views.py @@ -0,0 +1,47 @@ +"""Netops.io core api views.""" + +from django_celery_results.models import TaskResult +from rest_framework import viewsets +from rest_framework.response import Response +from drf_yasg import openapi +from drf_yasg.utils import swagger_auto_schema +from core.api import serializers +from core import models, tasks +from netopsio.utilities import get_ip_address + + +class TaskResultViewSet(viewsets.ReadOnlyModelViewSet): + """Rest API View for 'list' and 'retrieving' TaskResult actions.""" + + queryset = TaskResult.objects.all() + serializer_class = serializers.TaskResultSerializer + lookup_field = "task_id" + + +class RequestLogViewSet(viewsets.ReadOnlyModelViewSet): + """Rest API View for 'list' and 'retrieving' RequestLog actions.""" + + queryset = models.RequestLog.objects.all() + serializer_class = serializers.RequestLogSerializer + + +class PingViewSet(viewsets.ViewSet): + """Ping Viewset.""" + + @swagger_auto_schema( + request_body=openapi.Schema( + type=openapi.TYPE_OBJECT, + properties={ + "host": openapi.Schema( + type=openapi.TYPE_STRING, description="Host to ping." + ), + }, + ) + ) # pylint: disable=no-self-use + def create(self, request, host=None): + """Ping a host.""" + host = get_ip_address(request) + task = tasks.ping.delay(host=host) + data = models.Ping(task_id=task.task_id) + serializer = serializers.TaskSerializer(data, context={"request": request}) + return Response(serializer.data) diff --git a/netopsio/ping/migrations/0001_initial.py b/netopsio/core/migrations/0001_add_request_log.py similarity index 84% rename from netopsio/ping/migrations/0001_initial.py rename to netopsio/core/migrations/0001_add_request_log.py index 9f69123..53d7bbe 100644 --- a/netopsio/ping/migrations/0001_initial.py +++ b/netopsio/core/migrations/0001_add_request_log.py @@ -1,5 +1,4 @@ -# Generated by Django 3.2.10 on 2021-12-22 14:23 -# pylint: skip-file +# Generated by Django 3.2.10 on 2022-07-18 02:40 from django.db import migrations, models @@ -12,7 +11,7 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name="PingRequest", + name="RequestLog", fields=[ ( "id", @@ -27,6 +26,7 @@ class Migration(migrations.Migration): ("task_id", models.UUIDField(null=True, unique=True)), ("ip", models.CharField(max_length=255)), ("result", models.TextField()), + ("app", models.CharField(max_length=255)), ], ), ] diff --git a/netopsio/core/models.py b/netopsio/core/models.py index 0b4331b..6a3a440 100644 --- a/netopsio/core/models.py +++ b/netopsio/core/models.py @@ -1,3 +1,21 @@ -# from django.db import models +"""Netops.io core app models.""" -# Create your models here. +from django.db import models + + +class RequestLog(models.Model): + """Request Logging Model.""" + + date = models.DateTimeField(auto_now_add=True) + task_id = models.UUIDField(unique=True, null=True) + ip = models.CharField(max_length=255) + result = models.TextField() + app = models.CharField(max_length=255) + + +class Ping: + """Ping Model.""" + + def __init__(self, task_id: str): + """Initialize the model.""" + self.task_id = task_id diff --git a/netopsio/ping/tasks.py b/netopsio/core/tasks.py similarity index 74% rename from netopsio/ping/tasks.py rename to netopsio/core/tasks.py index 21d3af4..c7d678f 100644 --- a/netopsio/ping/tasks.py +++ b/netopsio/core/tasks.py @@ -1,7 +1,7 @@ """Celery Background Tasks""" import subprocess from celery import shared_task -from ping.models import PingRequest +from core.models import RequestLog @shared_task @@ -10,6 +10,6 @@ def ping(host: str, count: int = 2) -> str: task = subprocess.run( ["ping", f"-c {count}", host], capture_output=True, check=True ) - data = PingRequest(ip=host, result=task.stdout.decode("utf-8")) + data = RequestLog(ip=host, result=task.stdout.decode("utf-8"), app="ping") data.save() return task.stdout.decode("utf-8") diff --git a/netopsio/ping/templates/ping/base.html b/netopsio/core/templates/core/task.html similarity index 96% rename from netopsio/ping/templates/ping/base.html rename to netopsio/core/templates/core/task.html index 0a4b88c..3de707f 100644 --- a/netopsio/ping/templates/ping/base.html +++ b/netopsio/core/templates/core/task.html @@ -14,4 +14,4 @@ -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/netopsio/core/tests.py b/netopsio/core/tests.py index 39e7e2d..0966e68 100644 --- a/netopsio/core/tests.py +++ b/netopsio/core/tests.py @@ -1,12 +1,27 @@ -"Home app tests." +"Core app tests." from django.test import TestCase +from core.models import RequestLog -class HomeViewsTest(TestCase): - """Test the Home App views.""" +class CoreViewsTest(TestCase): + """Test the Core App views.""" def test_index_view(self): - """Test the home page.""" + """Test the core page.""" response = self.client.get("/") - self.assertTemplateUsed(response, "home/base.html") + self.assertTemplateUsed(response, "core/base.html") self.assertEqual(response.status_code, 200) + + +class RequestLogTestCase(TestCase): + """RequestLog TestCases.""" + + def setUp(self): + """Setup tests.""" + RequestLog.objects.create(ip="1.1.1.1", result="OK", app="ping") + return super().setUp() + + def test_requestlog_models(self): + """Test RequestLog models.""" + req = RequestLog.objects.get(ip="1.1.1.1") + self.assertEqual(req.ip, "1.1.1.1") diff --git a/netopsio/core/urls.py b/netopsio/core/urls.py index 86f6209..1044b36 100644 --- a/netopsio/core/urls.py +++ b/netopsio/core/urls.py @@ -2,9 +2,10 @@ from django.urls import path from core import views -app_name = "" # pylint: disable=invalid-name + urlpatterns = [ path("", views.index, name="core-index"), - path("tasks/", views.tasks, name="tasks"), + path("tasks/", views.tasks_view, name="tasks"), path("tasks//", views.task_details, name="task-details"), + path("ping/", views.ping, name="ping"), ] diff --git a/netopsio/core/views.py b/netopsio/core/views.py index aeb4054..733e971 100644 --- a/netopsio/core/views.py +++ b/netopsio/core/views.py @@ -3,8 +3,9 @@ from django.template import loader from django.shortcuts import get_object_or_404 from django_celery_results.models import TaskResult -from rest_framework import viewsets -from core.serializers import TaskResultSerializer + +from core import tasks +from netopsio.utilities import get_ip_address def index(request): @@ -14,7 +15,7 @@ def index(request): return HttpResponse(template.render(context, request)) -def tasks(request): +def tasks_view(request): """Render Task Results.""" task_results = TaskResult.objects.all() template = loader.get_template("core/tasks.html") @@ -31,9 +32,10 @@ def task_details(request, task_id): return HttpResponse(template.render(context, request)) -class TaskResultViewSet(viewsets.ReadOnlyModelViewSet): - """Rest API View for 'list' and 'retrieving' TaskResult actions.""" - - queryset = TaskResult.objects.all() - serializer_class = TaskResultSerializer - lookup_field = "task_id" +def ping(request): + """Ping app index view.""" + host = get_ip_address(request) + task = tasks.ping.delay(host=host) + template = loader.get_template("core/task.html") + context = {"host": host, "status": task.status, "id": task, "title": "Ping"} + return HttpResponse(template.render(context, request)) diff --git a/netopsio/netopsio/settings.py b/netopsio/netopsio/settings.py index 8b1c9c4..2d860d6 100644 --- a/netopsio/netopsio/settings.py +++ b/netopsio/netopsio/settings.py @@ -42,7 +42,6 @@ "drf_yasg", "django_celery_results", "core", - "ping", "traceroute", "nmap", ] diff --git a/netopsio/netopsio/urls.py b/netopsio/netopsio/urls.py index 4a9a7ff..ff6f511 100644 --- a/netopsio/netopsio/urls.py +++ b/netopsio/netopsio/urls.py @@ -15,24 +15,10 @@ """ from django.contrib import admin from django.urls import include, path, re_path -from rest_framework.routers import DefaultRouter from rest_framework import permissions from drf_yasg.views import get_schema_view from drf_yasg import openapi -from core.views import TaskResultViewSet -from ping.views import PingRequestViewSet, PingViewSet -from traceroute.views import TraceRouteRequestViewSet, TraceRouteViewSet -from nmap.views import NmapRequestViewSet, NmapViewSet - - -router = DefaultRouter() -router.register(r"tasks", TaskResultViewSet) -router.register(r"ping-logs", PingRequestViewSet) -router.register(r"ping", PingViewSet, basename="ping") -router.register(r"traceroute-logs", TraceRouteRequestViewSet) -router.register(r"traceroute", TraceRouteViewSet, basename="traceroute") -router.register(r"nmap-logs", NmapRequestViewSet) -router.register(r"nmap", NmapViewSet, basename="nmap") +from core.api.urls import router schema_view = get_schema_view( # pylint: disable=invalid-name @@ -49,11 +35,8 @@ urlpatterns = [ path("", include("core.urls"), name="core"), - path("ping/", include("ping.urls"), name="ping"), - path("traceroute/", include("traceroute.urls"), name="traceroute"), - path("nmap/", include("nmap.urls"), name="nmap"), path("admin/", admin.site.urls, name="admin"), - path("api/v1/", include(router.urls), name="admin-v1"), + path("api/v1/", include(router.urls), name="api-v1"), re_path( r"^api/docs/(?P\.json|\.yaml)$", schema_view.without_ui(cache_timeout=0), diff --git a/netopsio/ping/__init__.py b/netopsio/ping/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/netopsio/ping/admin.py b/netopsio/ping/admin.py deleted file mode 100644 index 0552e2d..0000000 --- a/netopsio/ping/admin.py +++ /dev/null @@ -1,13 +0,0 @@ -"""Register Ping Models in Admin Pandel.""" - -from django.contrib import admin -from ping.models import PingRequest - - -class PingAdmin(admin.ModelAdmin): - """Ping Admin Site Fields.""" - - list_display = ("ip", "date") - - -admin.site.register(PingRequest, PingAdmin) diff --git a/netopsio/ping/apps.py b/netopsio/ping/apps.py deleted file mode 100644 index 69b3aa6..0000000 --- a/netopsio/ping/apps.py +++ /dev/null @@ -1,8 +0,0 @@ -# pylint: skip-file - -from django.apps import AppConfig - - -class PingConfig(AppConfig): - default_auto_field = "django.db.models.BigAutoField" - name = "ping" diff --git a/netopsio/ping/migrations/__init__.py b/netopsio/ping/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/netopsio/ping/models.py b/netopsio/ping/models.py deleted file mode 100644 index 2a3546c..0000000 --- a/netopsio/ping/models.py +++ /dev/null @@ -1,20 +0,0 @@ -"""Ping App Models.""" - -from django.db import models - - -class PingRequest(models.Model): - """Ping Requests Logging Model.""" - - date = models.DateTimeField(auto_now_add=True) - task_id = models.UUIDField(unique=True, null=True) - ip = models.CharField(max_length=255) - result = models.TextField() - - -class Ping: - """Ping Model.""" - - def __init__(self, task_id: str): - """Initialize the model.""" - self.task_id = task_id diff --git a/netopsio/ping/serializers.py b/netopsio/ping/serializers.py deleted file mode 100644 index 569eda3..0000000 --- a/netopsio/ping/serializers.py +++ /dev/null @@ -1,20 +0,0 @@ -"""Ping App serializers.""" - -from rest_framework import serializers -from ping.models import PingRequest - - -class PingRequestSerializer(serializers.ModelSerializer): - """PingRequest Serializer.""" - - class Meta: - """PingRequest Serializer Meta.""" - - model = PingRequest - fields = ["id", "date", "task_id", "ip", "result", "url"] - - -class PingSerializer(serializers.Serializer): # pylint: disable=abstract-method - """Ping Serializer.""" - - task_id = serializers.CharField(max_length=512) diff --git a/netopsio/ping/tests.py b/netopsio/ping/tests.py deleted file mode 100644 index 6048401..0000000 --- a/netopsio/ping/tests.py +++ /dev/null @@ -1,16 +0,0 @@ -"""Ping App Tests.""" -from django.test import TestCase -from ping.models import PingRequest - - -class TestPing(TestCase): - """Ping App TestCases.""" - - def setUp(self): - """Setup tests.""" - PingRequest.objects.create(ip="1.1.1.1", result="OK") - - def test_ping_models(self): - """Test Ping App models.""" - req = PingRequest.objects.get(ip="1.1.1.1") - self.assertEqual(req.ip, "1.1.1.1") diff --git a/netopsio/ping/urls.py b/netopsio/ping/urls.py deleted file mode 100644 index 65bc607..0000000 --- a/netopsio/ping/urls.py +++ /dev/null @@ -1,7 +0,0 @@ -"Ping app urls." -from django.urls import path -from ping import views - -urlpatterns = [ - path("", views.index, name="ping-index"), -] diff --git a/netopsio/ping/views.py b/netopsio/ping/views.py deleted file mode 100644 index f610384..0000000 --- a/netopsio/ping/views.py +++ /dev/null @@ -1,49 +0,0 @@ -"""Ping app views.""" -from django.http import HttpResponse -from django.template import loader -from ping.tasks import ping -from ping.models import PingRequest, Ping -from ping.serializers import PingRequestSerializer, PingSerializer -from rest_framework import viewsets -from rest_framework.response import Response -from drf_yasg import openapi -from drf_yasg.utils import swagger_auto_schema -from netopsio.utilities import get_ip_address - - -def index(request): - """Ping app index view.""" - host = get_ip_address(request) - task = ping.delay(host=host) - template = loader.get_template("ping/base.html") - context = {"host": host, "status": task.status, "id": task, "title": "Ping"} - return HttpResponse(template.render(context, request)) - - -class PingRequestViewSet(viewsets.ReadOnlyModelViewSet): - """Rest API View for 'list' and 'retrieving' PingRequest actions.""" - - queryset = PingRequest.objects.all() - serializer_class = PingRequestSerializer - - -class PingViewSet(viewsets.ViewSet): - """Ping Viewset.""" - - @swagger_auto_schema( - request_body=openapi.Schema( - type=openapi.TYPE_OBJECT, - properties={ - "host": openapi.Schema( - type=openapi.TYPE_STRING, description="Host to ping." - ), - }, - ) - ) # pylint: disable=no-self-use - def create(self, request, host=None): - """Ping a host.""" - host = get_ip_address(request) - task = ping.delay(host=host) - data = Ping(task_id=task.task_id) - serializer = PingSerializer(data, context={"request": request}) - return Response(serializer.data) From db5ec8a927a506758afe08b3f9bd3a1ed9eb79c7 Mon Sep 17 00:00:00 2001 From: James Williams Date: Mon, 18 Jul 2022 02:59:20 +0000 Subject: [PATCH 3/8] fix api --- netopsio/core/api/urls.py | 6 ++++-- netopsio/templates/base.html | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/netopsio/core/api/urls.py b/netopsio/core/api/urls.py index c9650b4..5e2c203 100644 --- a/netopsio/core/api/urls.py +++ b/netopsio/core/api/urls.py @@ -1,8 +1,10 @@ """Netops.io core api urls.""" from rest_framework.routers import DefaultRouter -from core.api.views import TaskResultViewSet +from core.api import views router = DefaultRouter() -router.register(r"tasks", TaskResultViewSet) +router.register(r"tasks", views.TaskResultViewSet) +router.register(r"request-logs", views.RequestLogViewSet, basename="requestlog") +router.register(r"ping", views.PingViewSet, basename="ping") diff --git a/netopsio/templates/base.html b/netopsio/templates/base.html index b9b2420..6d10dcd 100644 --- a/netopsio/templates/base.html +++ b/netopsio/templates/base.html @@ -22,8 +22,10 @@ Home Task Results Ping + From 261036ba6fbbeb37466882e5ef1cf124e073f386 Mon Sep 17 00:00:00 2001 From: James Williams Date: Mon, 18 Jul 2022 03:20:42 +0000 Subject: [PATCH 4/8] move nmap app to core --- netopsio/core/api/urls.py | 2 + netopsio/core/api/views.py | 46 ++++++++++++++++- netopsio/core/models.py | 4 +- netopsio/core/tasks.py | 18 +++++++ netopsio/core/urls.py | 2 + netopsio/core/views.py | 20 +++++++- netopsio/netopsio/settings.py | 2 - netopsio/nmap/__init__.py | 0 netopsio/nmap/admin.py | 13 ----- netopsio/nmap/apps.py | 8 --- netopsio/nmap/migrations/0001_initial.py | 31 ------------ netopsio/nmap/migrations/__init__.py | 0 netopsio/nmap/models.py | 20 -------- netopsio/nmap/serializers.py | 20 -------- netopsio/nmap/tasks.py | 13 ----- netopsio/nmap/templates/nmap/base.html | 17 ------- netopsio/nmap/tests.py | 16 ------ netopsio/nmap/urls.py | 7 --- netopsio/nmap/views.py | 49 ------------------- netopsio/templates/base.html | 2 +- netopsio/traceroute/__init__.py | 0 netopsio/traceroute/admin.py | 13 ----- netopsio/traceroute/apps.py | 8 --- .../traceroute/migrations/0001_initial.py | 31 ------------ netopsio/traceroute/migrations/__init__.py | 0 netopsio/traceroute/models.py | 20 -------- netopsio/traceroute/serializers.py | 20 -------- netopsio/traceroute/tasks.py | 13 ----- .../traceroute/templates/traceroute/base.html | 17 ------- netopsio/traceroute/tests.py | 16 ------ netopsio/traceroute/urls.py | 7 --- netopsio/traceroute/views.py | 49 ------------------- 32 files changed, 89 insertions(+), 395 deletions(-) delete mode 100644 netopsio/nmap/__init__.py delete mode 100644 netopsio/nmap/admin.py delete mode 100644 netopsio/nmap/apps.py delete mode 100644 netopsio/nmap/migrations/0001_initial.py delete mode 100644 netopsio/nmap/migrations/__init__.py delete mode 100644 netopsio/nmap/models.py delete mode 100644 netopsio/nmap/serializers.py delete mode 100644 netopsio/nmap/tasks.py delete mode 100644 netopsio/nmap/templates/nmap/base.html delete mode 100644 netopsio/nmap/tests.py delete mode 100644 netopsio/nmap/urls.py delete mode 100644 netopsio/nmap/views.py delete mode 100644 netopsio/traceroute/__init__.py delete mode 100644 netopsio/traceroute/admin.py delete mode 100644 netopsio/traceroute/apps.py delete mode 100644 netopsio/traceroute/migrations/0001_initial.py delete mode 100644 netopsio/traceroute/migrations/__init__.py delete mode 100644 netopsio/traceroute/models.py delete mode 100644 netopsio/traceroute/serializers.py delete mode 100644 netopsio/traceroute/tasks.py delete mode 100644 netopsio/traceroute/templates/traceroute/base.html delete mode 100644 netopsio/traceroute/tests.py delete mode 100644 netopsio/traceroute/urls.py delete mode 100644 netopsio/traceroute/views.py diff --git a/netopsio/core/api/urls.py b/netopsio/core/api/urls.py index 5e2c203..ecc7fe4 100644 --- a/netopsio/core/api/urls.py +++ b/netopsio/core/api/urls.py @@ -8,3 +8,5 @@ router.register(r"tasks", views.TaskResultViewSet) router.register(r"request-logs", views.RequestLogViewSet, basename="requestlog") router.register(r"ping", views.PingViewSet, basename="ping") +router.register(r"traceroute", views.TraceRouteViewSet, basename="traceroute") +router.register(f"nmap", views.NmapViewSet, basename="nmap") diff --git a/netopsio/core/api/views.py b/netopsio/core/api/views.py index bbd0662..7781753 100644 --- a/netopsio/core/api/views.py +++ b/netopsio/core/api/views.py @@ -42,6 +42,50 @@ def create(self, request, host=None): """Ping a host.""" host = get_ip_address(request) task = tasks.ping.delay(host=host) - data = models.Ping(task_id=task.task_id) + data = models.TaskModel(task_id=task.task_id) + serializer = serializers.TaskSerializer(data, context={"request": request}) + return Response(serializer.data) + + +class TraceRouteViewSet(viewsets.ViewSet): + """TraceRoute Viewset.""" + + @swagger_auto_schema( + request_body=openapi.Schema( + type=openapi.TYPE_OBJECT, + properties={ + "host": openapi.Schema( + type=openapi.TYPE_STRING, description="Host to traceroute." + ), + }, + ) + ) # pylint: disable=no-self-use + def create(self, request, host=None): + """Traceroute a host.""" + host = get_ip_address(request) + task = tasks.traceroute.delay(host=host) + data = models.TaskModel(task_id=task.task_id) + serializer = serializers.TaskSerializer(data, context={"request": request}) + return Response(serializer.data) + + +class NmapViewSet(viewsets.ViewSet): + """Nmap Viewset.""" + + @swagger_auto_schema( + request_body=openapi.Schema( + type=openapi.TYPE_OBJECT, + properties={ + "host": openapi.Schema( + type=openapi.TYPE_STRING, description="Host to ping." + ), + }, + ) + ) # pylint: disable=no-self-use + def create(self, request, host=None): + """Nmap a host.""" + host = get_ip_address(request) + task = tasks.nmap.delay(host=host) + data = models.TaskModel(task_id=task.task_id) serializer = serializers.TaskSerializer(data, context={"request": request}) return Response(serializer.data) diff --git a/netopsio/core/models.py b/netopsio/core/models.py index 6a3a440..1583cbd 100644 --- a/netopsio/core/models.py +++ b/netopsio/core/models.py @@ -13,8 +13,8 @@ class RequestLog(models.Model): app = models.CharField(max_length=255) -class Ping: - """Ping Model.""" +class TaskModel: + """Task Model.""" def __init__(self, task_id: str): """Initialize the model.""" diff --git a/netopsio/core/tasks.py b/netopsio/core/tasks.py index c7d678f..85a7ab8 100644 --- a/netopsio/core/tasks.py +++ b/netopsio/core/tasks.py @@ -13,3 +13,21 @@ def ping(host: str, count: int = 2) -> str: data = RequestLog(ip=host, result=task.stdout.decode("utf-8"), app="ping") data.save() return task.stdout.decode("utf-8") + + +@shared_task +def traceroute(host: str) -> str: + """Traceroute host worker.""" + task = subprocess.run(["traceroute", host], capture_output=True, check=True) + data = RequestLog(ip=host, result=task.stdout.decode("utf-8"), app="traceroute") + data.save() + return task.stdout.decode("utf-8") + + +@shared_task +def nmap(host: str) -> str: + """Nmap host worker.""" + task = subprocess.run(["nmap", "-v", "-A", host], capture_output=True, check=True) + data = RequestLog(ip=host, result=task.stdout.decode("utf-8"), app="nmap") + data.save() + return task.stdout.decode("utf-8") diff --git a/netopsio/core/urls.py b/netopsio/core/urls.py index 1044b36..55c970e 100644 --- a/netopsio/core/urls.py +++ b/netopsio/core/urls.py @@ -8,4 +8,6 @@ path("tasks/", views.tasks_view, name="tasks"), path("tasks//", views.task_details, name="task-details"), path("ping/", views.ping, name="ping"), + path("traceroute/", views.traceroute, name="traceroute"), + path("nmap/", views.nmap, name="nmap"), ] diff --git a/netopsio/core/views.py b/netopsio/core/views.py index 733e971..f7cd754 100644 --- a/netopsio/core/views.py +++ b/netopsio/core/views.py @@ -33,9 +33,27 @@ def task_details(request, task_id): def ping(request): - """Ping app index view.""" + """Ping view.""" host = get_ip_address(request) task = tasks.ping.delay(host=host) template = loader.get_template("core/task.html") context = {"host": host, "status": task.status, "id": task, "title": "Ping"} return HttpResponse(template.render(context, request)) + + +def traceroute(request): + """TraceRoute view.""" + host = get_ip_address(request) + task = tasks.traceroute.delay(host=host) + template = loader.get_template("core/task.html") + context = {"host": host, "status": task.status, "id": task, "title": "Traceroute"} + return HttpResponse(template.render(context, request)) + + +def nmap(request): + """Nmap view.""" + host = get_ip_address(request) + task = tasks.nmap.delay(host=host) + template = loader.get_template("core/task.html") + context = {"host": host, "status": task.status, "id": task, "title": "Nmap"} + return HttpResponse(template.render(context, request)) diff --git a/netopsio/netopsio/settings.py b/netopsio/netopsio/settings.py index 2d860d6..4cbb710 100644 --- a/netopsio/netopsio/settings.py +++ b/netopsio/netopsio/settings.py @@ -42,8 +42,6 @@ "drf_yasg", "django_celery_results", "core", - "traceroute", - "nmap", ] MIDDLEWARE = [ diff --git a/netopsio/nmap/__init__.py b/netopsio/nmap/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/netopsio/nmap/admin.py b/netopsio/nmap/admin.py deleted file mode 100644 index f45858d..0000000 --- a/netopsio/nmap/admin.py +++ /dev/null @@ -1,13 +0,0 @@ -"""Register Nmap Models in Admin Pandel.""" - -from django.contrib import admin -from nmap.models import NmapRequest - - -class NmapAdmin(admin.ModelAdmin): - """Nmap Admin Site Fields.""" - - list_display = ("ip", "date") - - -admin.site.register(NmapRequest, NmapAdmin) diff --git a/netopsio/nmap/apps.py b/netopsio/nmap/apps.py deleted file mode 100644 index e470ba9..0000000 --- a/netopsio/nmap/apps.py +++ /dev/null @@ -1,8 +0,0 @@ -# pylint: skip-file - -from django.apps import AppConfig - - -class PingConfig(AppConfig): - default_auto_field = "django.db.models.BigAutoField" - name = "nmap" diff --git a/netopsio/nmap/migrations/0001_initial.py b/netopsio/nmap/migrations/0001_initial.py deleted file mode 100644 index 03d6c1e..0000000 --- a/netopsio/nmap/migrations/0001_initial.py +++ /dev/null @@ -1,31 +0,0 @@ -# Generated by Django 3.2.10 on 2022-07-11 01:55 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [] - - operations = [ - migrations.CreateModel( - name="NmapRequest", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("date", models.DateTimeField(auto_now_add=True)), - ("task_id", models.UUIDField(null=True, unique=True)), - ("ip", models.CharField(max_length=255)), - ("result", models.TextField()), - ], - ), - ] diff --git a/netopsio/nmap/migrations/__init__.py b/netopsio/nmap/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/netopsio/nmap/models.py b/netopsio/nmap/models.py deleted file mode 100644 index 078189e..0000000 --- a/netopsio/nmap/models.py +++ /dev/null @@ -1,20 +0,0 @@ -"""Nmap App Models.""" - -from django.db import models - - -class NmapRequest(models.Model): - """Nmap Requests Logging Model.""" - - date = models.DateTimeField(auto_now_add=True) - task_id = models.UUIDField(unique=True, null=True) - ip = models.CharField(max_length=255) - result = models.TextField() - - -class Nmap: - """Nmap Model.""" - - def __init__(self, task_id: str): - """Initialize the model.""" - self.task_id = task_id diff --git a/netopsio/nmap/serializers.py b/netopsio/nmap/serializers.py deleted file mode 100644 index 7a8fda2..0000000 --- a/netopsio/nmap/serializers.py +++ /dev/null @@ -1,20 +0,0 @@ -"""Nmap App serializers.""" - -from rest_framework import serializers -from nmap.models import NmapRequest - - -class NmapRequestSerializer(serializers.ModelSerializer): - """NmapRequest Serializer.""" - - class Meta: - """NmapRequest Serializer Meta.""" - - model = NmapRequest - fields = ["id", "date", "task_id", "ip", "result", "url"] - - -class NmapSerializer(serializers.Serializer): # pylint: disable=abstract-method - """Nmap Serializer.""" - - task_id = serializers.CharField(max_length=512) diff --git a/netopsio/nmap/tasks.py b/netopsio/nmap/tasks.py deleted file mode 100644 index da7e298..0000000 --- a/netopsio/nmap/tasks.py +++ /dev/null @@ -1,13 +0,0 @@ -"""Celery Background Tasks""" -import subprocess -from celery import shared_task -from nmap.models import NmapRequest - - -@shared_task -def nmap(host: str) -> str: - """Nmap host worker.""" - task = subprocess.run(["nmap", "-v", "-A", host], capture_output=True, check=True) - data = NmapRequest(ip=host, result=task.stdout.decode("utf-8")) - data.save() - return task.stdout.decode("utf-8") diff --git a/netopsio/nmap/templates/nmap/base.html b/netopsio/nmap/templates/nmap/base.html deleted file mode 100644 index 0a4b88c..0000000 --- a/netopsio/nmap/templates/nmap/base.html +++ /dev/null @@ -1,17 +0,0 @@ -{% extends "base.html" %} -{% block content %} -
- - - - - - - - - - - -
StatusHost
{{ status }}{{ host }}
-
-{% endblock %} diff --git a/netopsio/nmap/tests.py b/netopsio/nmap/tests.py deleted file mode 100644 index 277625c..0000000 --- a/netopsio/nmap/tests.py +++ /dev/null @@ -1,16 +0,0 @@ -"""Nmap App Tests.""" -from django.test import TestCase -from nmap.models import NmapRequest - - -class TestNmap(TestCase): - """Nmap App TestCases.""" - - def setUp(self): - """Setup tests.""" - NmapRequest.objects.create(ip="1.1.1.1", result="OK") - - def test_nmap_models(self): - """Test Nmap App models.""" - req = NmapRequest.objects.get(ip="1.1.1.1") - self.assertEqual(req.ip, "1.1.1.1") diff --git a/netopsio/nmap/urls.py b/netopsio/nmap/urls.py deleted file mode 100644 index 2944ca9..0000000 --- a/netopsio/nmap/urls.py +++ /dev/null @@ -1,7 +0,0 @@ -"Ping app urls." -from django.urls import path -from nmap import views - -urlpatterns = [ - path("", views.index, name="nmap-index"), -] diff --git a/netopsio/nmap/views.py b/netopsio/nmap/views.py deleted file mode 100644 index bd07785..0000000 --- a/netopsio/nmap/views.py +++ /dev/null @@ -1,49 +0,0 @@ -"""Ping app views.""" -from django.http import HttpResponse -from django.template import loader -from nmap.tasks import nmap -from nmap.models import NmapRequest, Nmap -from nmap.serializers import NmapRequestSerializer, NmapSerializer -from rest_framework import viewsets -from rest_framework.response import Response -from drf_yasg import openapi -from drf_yasg.utils import swagger_auto_schema -from netopsio.utilities import get_ip_address - - -def index(request): - """Nmap app index view.""" - host = get_ip_address(request) - task = nmap.delay(host=host) - template = loader.get_template("nmap/base.html") - context = {"host": host, "status": task.status, "id": task, "title": "Nmap"} - return HttpResponse(template.render(context, request)) - - -class NmapRequestViewSet(viewsets.ReadOnlyModelViewSet): - """Rest API View for 'list' and 'retrieving' NmapRequest actions.""" - - queryset = NmapRequest.objects.all() - serializer_class = NmapRequestSerializer - - -class NmapViewSet(viewsets.ViewSet): - """Nmap Viewset.""" - - @swagger_auto_schema( - request_body=openapi.Schema( - type=openapi.TYPE_OBJECT, - properties={ - "host": openapi.Schema( - type=openapi.TYPE_STRING, description="Host to ping." - ), - }, - ) - ) # pylint: disable=no-self-use - def create(self, request, host=None): - """Nmap a host.""" - host = get_ip_address(request) - task = nmap.delay(host=host) - data = Nmap(task_id=task.task_id) - serializer = NmapSerializer(data, context={"request": request}) - return Response(serializer.data) diff --git a/netopsio/templates/base.html b/netopsio/templates/base.html index 6d10dcd..2f6dbef 100644 --- a/netopsio/templates/base.html +++ b/netopsio/templates/base.html @@ -22,8 +22,8 @@ Home Task Results Ping - diff --git a/netopsio/traceroute/__init__.py b/netopsio/traceroute/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/netopsio/traceroute/admin.py b/netopsio/traceroute/admin.py deleted file mode 100644 index 66e95d8..0000000 --- a/netopsio/traceroute/admin.py +++ /dev/null @@ -1,13 +0,0 @@ -"""Register Ping Models in Admin Pandel.""" - -from django.contrib import admin -from traceroute.models import TraceRouteRequest - - -class TraceRouteAdmin(admin.ModelAdmin): - """TraceRoute Admin Site Fields.""" - - list_display = ("ip", "date") - - -admin.site.register(TraceRouteRequest, TraceRouteAdmin) diff --git a/netopsio/traceroute/apps.py b/netopsio/traceroute/apps.py deleted file mode 100644 index 99b760d..0000000 --- a/netopsio/traceroute/apps.py +++ /dev/null @@ -1,8 +0,0 @@ -# pylint: skip-file - -from django.apps import AppConfig - - -class TraceRouteConfig(AppConfig): - default_auto_field = "django.db.models.BigAutoField" - name = "traceroute" diff --git a/netopsio/traceroute/migrations/0001_initial.py b/netopsio/traceroute/migrations/0001_initial.py deleted file mode 100644 index a9eadbf..0000000 --- a/netopsio/traceroute/migrations/0001_initial.py +++ /dev/null @@ -1,31 +0,0 @@ -# Generated by Django 3.2.10 on 2022-07-11 00:25 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [] - - operations = [ - migrations.CreateModel( - name="TraceRouteRequest", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("date", models.DateTimeField(auto_now_add=True)), - ("task_id", models.UUIDField(null=True, unique=True)), - ("ip", models.CharField(max_length=255)), - ("result", models.TextField()), - ], - ), - ] diff --git a/netopsio/traceroute/migrations/__init__.py b/netopsio/traceroute/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/netopsio/traceroute/models.py b/netopsio/traceroute/models.py deleted file mode 100644 index 7caa112..0000000 --- a/netopsio/traceroute/models.py +++ /dev/null @@ -1,20 +0,0 @@ -"""Ping App Models.""" - -from django.db import models - - -class TraceRouteRequest(models.Model): - """TraceRoute Requests Logging Model.""" - - date = models.DateTimeField(auto_now_add=True) - task_id = models.UUIDField(unique=True, null=True) - ip = models.CharField(max_length=255) - result = models.TextField() - - -class TraceRoute: - """TraceRoute Model.""" - - def __init__(self, task_id: str): - """Initialize the model.""" - self.task_id = task_id diff --git a/netopsio/traceroute/serializers.py b/netopsio/traceroute/serializers.py deleted file mode 100644 index 803a05c..0000000 --- a/netopsio/traceroute/serializers.py +++ /dev/null @@ -1,20 +0,0 @@ -"""TraceRoute App serializers.""" - -from rest_framework import serializers -from traceroute.models import TraceRouteRequest - - -class TraceRouteRequestSerializer(serializers.ModelSerializer): - """TraceRouteRequest Serializer.""" - - class Meta: - """TraceRouteRequest Serializer Meta.""" - - model = TraceRouteRequest - fields = ["id", "date", "task_id", "ip", "result", "url"] - - -class TraceRouteSerializer(serializers.Serializer): # pylint: disable=abstract-method - """TraceRoute Serializer.""" - - task_id = serializers.CharField(max_length=512) diff --git a/netopsio/traceroute/tasks.py b/netopsio/traceroute/tasks.py deleted file mode 100644 index b8ca11f..0000000 --- a/netopsio/traceroute/tasks.py +++ /dev/null @@ -1,13 +0,0 @@ -"""Celery Background Tasks""" -import subprocess -from celery import shared_task -from traceroute.models import TraceRouteRequest - - -@shared_task -def traceroute(host: str) -> str: - """Traceroute host worker.""" - task = subprocess.run(["traceroute", host], capture_output=True, check=True) - data = TraceRouteRequest(ip=host, result=task.stdout.decode("utf-8")) - data.save() - return task.stdout.decode("utf-8") diff --git a/netopsio/traceroute/templates/traceroute/base.html b/netopsio/traceroute/templates/traceroute/base.html deleted file mode 100644 index 0a4b88c..0000000 --- a/netopsio/traceroute/templates/traceroute/base.html +++ /dev/null @@ -1,17 +0,0 @@ -{% extends "base.html" %} -{% block content %} -
- - - - - - - - - - - -
StatusHost
{{ status }}{{ host }}
-
-{% endblock %} diff --git a/netopsio/traceroute/tests.py b/netopsio/traceroute/tests.py deleted file mode 100644 index b406298..0000000 --- a/netopsio/traceroute/tests.py +++ /dev/null @@ -1,16 +0,0 @@ -"""Ping App Tests.""" -from django.test import TestCase -from traceroute.models import TraceRouteRequest - - -class TestTraceRoute(TestCase): - """TraceRoute App TestCases.""" - - def setUp(self): - """Setup tests.""" - TraceRouteRequest.objects.create(ip="1.1.1.1", result="OK") - - def test_traceroute_models(self): - """Test TraceRoute App models.""" - req = TraceRouteRequest.objects.get(ip="1.1.1.1") - self.assertEqual(req.ip, "1.1.1.1") diff --git a/netopsio/traceroute/urls.py b/netopsio/traceroute/urls.py deleted file mode 100644 index 94215c4..0000000 --- a/netopsio/traceroute/urls.py +++ /dev/null @@ -1,7 +0,0 @@ -"Ping app urls." -from django.urls import path -from traceroute import views - -urlpatterns = [ - path("", views.index, name="traceroute-index"), -] diff --git a/netopsio/traceroute/views.py b/netopsio/traceroute/views.py deleted file mode 100644 index 91d90b1..0000000 --- a/netopsio/traceroute/views.py +++ /dev/null @@ -1,49 +0,0 @@ -"""Ping app views.""" -from django.http import HttpResponse -from django.template import loader -from traceroute.tasks import traceroute -from traceroute.models import TraceRouteRequest, TraceRoute -from traceroute.serializers import TraceRouteRequestSerializer, TraceRouteSerializer -from rest_framework import viewsets -from rest_framework.response import Response -from drf_yasg import openapi -from drf_yasg.utils import swagger_auto_schema -from netopsio.utilities import get_ip_address - - -def index(request): - """TraceRoute app index view.""" - host = get_ip_address(request) - task = traceroute.delay(host=host) - template = loader.get_template("traceroute/base.html") - context = {"host": host, "status": task.status, "id": task, "title": "Traceroute"} - return HttpResponse(template.render(context, request)) - - -class TraceRouteRequestViewSet(viewsets.ReadOnlyModelViewSet): - """Rest API View for 'list' and 'retrieving' TraceRouteRequest actions.""" - - queryset = TraceRouteRequest.objects.all() - serializer_class = TraceRouteRequestSerializer - - -class TraceRouteViewSet(viewsets.ViewSet): - """TraceRoute Viewset.""" - - @swagger_auto_schema( - request_body=openapi.Schema( - type=openapi.TYPE_OBJECT, - properties={ - "host": openapi.Schema( - type=openapi.TYPE_STRING, description="Host to traceroute." - ), - }, - ) - ) # pylint: disable=no-self-use - def create(self, request, host=None): - """Traceroute a host.""" - host = get_ip_address(request) - task = traceroute.delay(host=host) - data = TraceRoute(task_id=task.task_id) - serializer = TraceRouteSerializer(data, context={"request": request}) - return Response(serializer.data) From 4da20439d93ac7428a1b7c32c7dd66bf361c01be Mon Sep 17 00:00:00 2001 From: James Williams Date: Mon, 18 Jul 2022 03:21:10 +0000 Subject: [PATCH 5/8] add nmap app to index --- netopsio/templates/base.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/netopsio/templates/base.html b/netopsio/templates/base.html index 2f6dbef..b9b2420 100644 --- a/netopsio/templates/base.html +++ b/netopsio/templates/base.html @@ -23,9 +23,7 @@ Task Results Ping Traceroute - From e80cb19e3106c36fabb4d5b317abe2a05655ecbc Mon Sep 17 00:00:00 2001 From: James Williams Date: Mon, 18 Jul 2022 03:23:56 +0000 Subject: [PATCH 6/8] flake8 fix --- netopsio/core/api/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netopsio/core/api/urls.py b/netopsio/core/api/urls.py index ecc7fe4..d06609f 100644 --- a/netopsio/core/api/urls.py +++ b/netopsio/core/api/urls.py @@ -9,4 +9,4 @@ router.register(r"request-logs", views.RequestLogViewSet, basename="requestlog") router.register(r"ping", views.PingViewSet, basename="ping") router.register(r"traceroute", views.TraceRouteViewSet, basename="traceroute") -router.register(f"nmap", views.NmapViewSet, basename="nmap") +router.register(r"nmap", views.NmapViewSet, basename="nmap") From c567fa65839c414f483a92727f5b914a3157b63b Mon Sep 17 00:00:00 2001 From: James Williams Date: Wed, 20 Jul 2022 02:19:16 +0000 Subject: [PATCH 7/8] create tests --- .pylintrc | 2 +- netopsio/core/admin.py | 1 + netopsio/core/api/serializers.py | 3 +- netopsio/core/api/urls.py | 2 +- netopsio/core/api/views.py | 7 +-- netopsio/core/tasks.py | 2 + netopsio/core/tests/__init__.py | 1 + netopsio/core/tests/test_api.py | 43 +++++++++++++++++++ .../core/{tests.py => tests/test_models.py} | 11 +---- netopsio/core/tests/test_tasks.py | 23 ++++++++++ netopsio/core/tests/test_views.py | 12 ++++++ netopsio/core/urls.py | 2 +- netopsio/core/views.py | 2 +- netopsio/netopsio/__init__.py | 1 + netopsio/netopsio/celery.py | 1 - netopsio/netopsio/settings.py | 2 +- netopsio/netopsio/tests/__init__.py | 0 netopsio/netopsio/tests/test_utilities.py | 20 +++++++++ netopsio/netopsio/urls.py | 6 +-- pyproject.toml | 2 +- tasks.py | 14 ++++-- 21 files changed, 130 insertions(+), 27 deletions(-) create mode 100644 netopsio/core/tests/__init__.py create mode 100644 netopsio/core/tests/test_api.py rename netopsio/core/{tests.py => tests/test_models.py} (62%) create mode 100644 netopsio/core/tests/test_tasks.py create mode 100644 netopsio/core/tests/test_views.py create mode 100644 netopsio/netopsio/tests/__init__.py create mode 100644 netopsio/netopsio/tests/test_utilities.py diff --git a/.pylintrc b/.pylintrc index 4e2d6a9..6ef3977 100644 --- a/.pylintrc +++ b/.pylintrc @@ -1,5 +1,5 @@ [MASTER] -ignore=migrations +ignore=migrations,tests [MESSAGES CONTROL] disable=no-member,too-few-public-methods,too-many-ancestors, duplicate-code \ No newline at end of file diff --git a/netopsio/core/admin.py b/netopsio/core/admin.py index 6373b3f..651dfe9 100644 --- a/netopsio/core/admin.py +++ b/netopsio/core/admin.py @@ -1,6 +1,7 @@ """Register core models in admin panel.""" from django.contrib import admin + from core.models import RequestLog diff --git a/netopsio/core/api/serializers.py b/netopsio/core/api/serializers.py index dd748ef..8fb9a6a 100644 --- a/netopsio/core/api/serializers.py +++ b/netopsio/core/api/serializers.py @@ -1,6 +1,7 @@ """Core App and Worker Serializers.""" -from rest_framework import serializers from django_celery_results.models import TaskResult +from rest_framework import serializers + from core import models diff --git a/netopsio/core/api/urls.py b/netopsio/core/api/urls.py index d06609f..b573ef8 100644 --- a/netopsio/core/api/urls.py +++ b/netopsio/core/api/urls.py @@ -1,8 +1,8 @@ """Netops.io core api urls.""" from rest_framework.routers import DefaultRouter -from core.api import views +from core.api import views router = DefaultRouter() router.register(r"tasks", views.TaskResultViewSet) diff --git a/netopsio/core/api/views.py b/netopsio/core/api/views.py index 7781753..facb2c5 100644 --- a/netopsio/core/api/views.py +++ b/netopsio/core/api/views.py @@ -1,12 +1,13 @@ """Netops.io core api views.""" from django_celery_results.models import TaskResult -from rest_framework import viewsets -from rest_framework.response import Response from drf_yasg import openapi from drf_yasg.utils import swagger_auto_schema -from core.api import serializers +from rest_framework import viewsets +from rest_framework.response import Response + from core import models, tasks +from core.api import serializers from netopsio.utilities import get_ip_address diff --git a/netopsio/core/tasks.py b/netopsio/core/tasks.py index 85a7ab8..2832dd0 100644 --- a/netopsio/core/tasks.py +++ b/netopsio/core/tasks.py @@ -1,6 +1,8 @@ """Celery Background Tasks""" import subprocess + from celery import shared_task + from core.models import RequestLog diff --git a/netopsio/core/tests/__init__.py b/netopsio/core/tests/__init__.py new file mode 100644 index 0000000..67ad1ef --- /dev/null +++ b/netopsio/core/tests/__init__.py @@ -0,0 +1 @@ +"""Core tests.""" diff --git a/netopsio/core/tests/test_api.py b/netopsio/core/tests/test_api.py new file mode 100644 index 0000000..19ae06d --- /dev/null +++ b/netopsio/core/tests/test_api.py @@ -0,0 +1,43 @@ +"""Core api tests.""" +from django.test import TestCase +from rest_framework.test import APIRequestFactory + +from core.api import views + + +class CoreApiTestCase(TestCase): + def setUp(self): + self.factory = APIRequestFactory() + self.ping = views.PingViewSet() + self.traceroute = views.TraceRouteViewSet() + self.nmap = views.NmapViewSet() + self.host = {"host": "localhost"} + self.content_type = {"Content-type": "application/json"} + return super().setUp() + + def test_ping_api(self): + request = self.factory.post( + "/api/v1/ping/", + self.host, + content_type=self.content_type, + ) + response = self.ping.create(request) + self.assertEqual(response.status_code, 200) + + def test_traceroute_api(self): + request = self.factory.post( + "/api/v1/traceroute/", + self.host, + content_type=self.content_type, + ) + response = self.traceroute.create(request) + self.assertEqual(response.status_code, 200) + + def test_nmap_api(self): + request = self.factory.post( + "/api/v1/nmap/", + self.host, + content_type=self.content_type, + ) + response = self.nmap.create(request) + self.assertEqual(response.status_code, 200) diff --git a/netopsio/core/tests.py b/netopsio/core/tests/test_models.py similarity index 62% rename from netopsio/core/tests.py rename to netopsio/core/tests/test_models.py index 0966e68..e0bf350 100644 --- a/netopsio/core/tests.py +++ b/netopsio/core/tests/test_models.py @@ -1,16 +1,7 @@ "Core app tests." from django.test import TestCase -from core.models import RequestLog - -class CoreViewsTest(TestCase): - """Test the Core App views.""" - - def test_index_view(self): - """Test the core page.""" - response = self.client.get("/") - self.assertTemplateUsed(response, "core/base.html") - self.assertEqual(response.status_code, 200) +from core.models import RequestLog class RequestLogTestCase(TestCase): diff --git a/netopsio/core/tests/test_tasks.py b/netopsio/core/tests/test_tasks.py new file mode 100644 index 0000000..48af040 --- /dev/null +++ b/netopsio/core/tests/test_tasks.py @@ -0,0 +1,23 @@ +"""Core tasks tests.""" + + +from django.test import TestCase + +from core import tasks + + +class TasksTestCase(TestCase): + def setUp(self): + self.host = "localhost" + + def test_ping_task(self): + ping = tasks.ping.delay(host=self.host) + self.assertIn(ping.status, ("PENDING", "STARTED", "SUCCESS")) + + def test_traceroute_task(self): + traceroute = tasks.ping.delay(host=self.host) + self.assertIn(traceroute.status, ("PENDING", "STARTED", "SUCCESS")) + + def test_nmap_task(self): + nmap = tasks.nmap.delay(host=self.host) + self.assertIn(nmap.status, ("PENDING", "STARTED", "SUCCESS")) diff --git a/netopsio/core/tests/test_views.py b/netopsio/core/tests/test_views.py new file mode 100644 index 0000000..613729d --- /dev/null +++ b/netopsio/core/tests/test_views.py @@ -0,0 +1,12 @@ +"Core app tests." +from django.test import TestCase + + +class CoreViewsTest(TestCase): + """Test the Core App views.""" + + def test_index_view(self): + """Test the core page.""" + response = self.client.get("/") + self.assertTemplateUsed(response, "core/base.html") + self.assertEqual(response.status_code, 200) diff --git a/netopsio/core/urls.py b/netopsio/core/urls.py index 55c970e..6f24fa1 100644 --- a/netopsio/core/urls.py +++ b/netopsio/core/urls.py @@ -1,7 +1,7 @@ "Core app urls." from django.urls import path -from core import views +from core import views urlpatterns = [ path("", views.index, name="core-index"), diff --git a/netopsio/core/views.py b/netopsio/core/views.py index f7cd754..580f50f 100644 --- a/netopsio/core/views.py +++ b/netopsio/core/views.py @@ -1,7 +1,7 @@ "Core app views." from django.http import HttpResponse -from django.template import loader from django.shortcuts import get_object_or_404 +from django.template import loader from django_celery_results.models import TaskResult from core import tasks diff --git a/netopsio/netopsio/__init__.py b/netopsio/netopsio/__init__.py index 50bf77f..890a790 100644 --- a/netopsio/netopsio/__init__.py +++ b/netopsio/netopsio/__init__.py @@ -1,4 +1,5 @@ """Netops.io Project Base.""" + from .celery import app as celery_app __all__ = ("celery_app",) diff --git a/netopsio/netopsio/celery.py b/netopsio/netopsio/celery.py index 2428b8a..5c4be3a 100644 --- a/netopsio/netopsio/celery.py +++ b/netopsio/netopsio/celery.py @@ -4,7 +4,6 @@ from celery import Celery - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "netopsio.settings") app = Celery( diff --git a/netopsio/netopsio/settings.py b/netopsio/netopsio/settings.py index 4cbb710..b670711 100644 --- a/netopsio/netopsio/settings.py +++ b/netopsio/netopsio/settings.py @@ -10,8 +10,8 @@ https://docs.djangoproject.com/en/3.2/ref/settings/ """ -from pathlib import Path import os +from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent diff --git a/netopsio/netopsio/tests/__init__.py b/netopsio/netopsio/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/netopsio/netopsio/tests/test_utilities.py b/netopsio/netopsio/tests/test_utilities.py new file mode 100644 index 0000000..d515497 --- /dev/null +++ b/netopsio/netopsio/tests/test_utilities.py @@ -0,0 +1,20 @@ +"""Test netopsio utilities.""" +from django.test import RequestFactory, TestCase + +from netopsio import utilities + + +class UtilitiesTestCase(TestCase): + """Test Utilities.""" + + def setUp(self): + """Setup tests.""" + self.request = RequestFactory() + + def test_get_ip_address(self): + """Test get_ip_address.""" + response = self.request.get("/") + self.assertEqual(utilities.get_ip_address(response), "127.0.0.1") + + response.META["HTTP_X_FORWARDED_FOR"] = response.META["REMOTE_ADDR"] + self.assertEqual(utilities.get_ip_address(response), "127.0.0.1") diff --git a/netopsio/netopsio/urls.py b/netopsio/netopsio/urls.py index ff6f511..bd107a3 100644 --- a/netopsio/netopsio/urls.py +++ b/netopsio/netopsio/urls.py @@ -15,11 +15,11 @@ """ from django.contrib import admin from django.urls import include, path, re_path -from rest_framework import permissions -from drf_yasg.views import get_schema_view from drf_yasg import openapi -from core.api.urls import router +from drf_yasg.views import get_schema_view +from rest_framework import permissions +from core.api.urls import router schema_view = get_schema_view( # pylint: disable=invalid-name openapi.Info( diff --git a/pyproject.toml b/pyproject.toml index 901234b..9c600ac 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "netops.io" -version = "0.3.1" +version = "0.3.2" description = "netops.io web application and rest framework" authors = ["James Williams "] license = "Apache" diff --git a/tasks.py b/tasks.py index 6488539..e21572d 100644 --- a/tasks.py +++ b/tasks.py @@ -1,10 +1,10 @@ """Invoke Linting Task Automation.""" import os + from invoke import Collection from invoke import task as invoke_task - namespace = Collection("netopsio") namespace.configure( { @@ -62,6 +62,10 @@ def docker_compose(context, command, **kwargs): # Linting Tasks +@task +def isort(context): + """Execute Python isort.""" + context.run("isort .") @task def black(context): @@ -78,12 +82,13 @@ def pylint(context): @task def flake8(context): """Execute Python Flake8.""" - context.run("flake8 netopsio/* --ignore=E501") + context.run("flake8 netopsio/* --ignore=E501 --exclude=*/tests/*") @task def linting(context): """Execute Linting Tasks.""" + isort(context) black(context) pylint(context) flake8(context) @@ -95,8 +100,11 @@ def linting(context): @task def coverage(context, container="app", percent=80): """Execute Coverage Test.""" + omit = ["netopsio/asgi.py", "netopsio/wsgi.py", "*/tests*", "manage.py"] coverage_cmd = "coverage run --source '.' manage.py test" - coverage_report = f"coverage report --fail-under={percent} -m" + coverage_report = ( + f"coverage report --fail-under={percent} -m --omit={','.join(omit)}" + ) docker_compose(context, f"exec {container} {coverage_cmd}", pty=True) docker_compose(context, f"exec {container} {coverage_report}", pty=True) From 2fc98d8a5207e315caf3efe7fd58f1de0403ac38 Mon Sep 17 00:00:00 2001 From: James Williams Date: Wed, 20 Jul 2022 02:21:42 +0000 Subject: [PATCH 8/8] fix tasks black --- tasks.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tasks.py b/tasks.py index e21572d..d0e1bf9 100644 --- a/tasks.py +++ b/tasks.py @@ -62,11 +62,13 @@ def docker_compose(context, command, **kwargs): # Linting Tasks + @task def isort(context): """Execute Python isort.""" context.run("isort .") + @task def black(context): """Execute Python Black."""