diff --git a/backend/backend/settings.py b/backend/backend/settings.py index 5069e80c..b0837289 100644 --- a/backend/backend/settings.py +++ b/backend/backend/settings.py @@ -39,8 +39,7 @@ INSTALLED_APPS = [ 'django.contrib.messages', 'django.contrib.staticfiles', 'wol', - 'channels', - 'rest_framework' + 'channels' ] MIDDLEWARE = [ diff --git a/backend/backend/urls.py b/backend/backend/urls.py index 75ad1983..41d49625 100644 --- a/backend/backend/urls.py +++ b/backend/backend/urls.py @@ -14,9 +14,8 @@ Including another URLconf 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.urls import path, include +from django.urls import path urlpatterns = [ - path('admin/', admin.site.urls), - path('', include('wol.urls')), + path('admin/', admin.site.urls) ] diff --git a/backend/wol/consumers.py b/backend/wol/consumers.py index 808ab9a4..1afc9d0f 100644 --- a/backend/wol/consumers.py +++ b/backend/wol/consumers.py @@ -16,9 +16,10 @@ class WSConsumer(AsyncWebsocketConsumer): await self.accept() await self.send(text_data=json.dumps({ "type": "init", - "message": await self.get_device_count() + "message": await self.get_all_devices() })) await self.add_visitor() + await self.channel_layer.group_send( "wol", { "type": "send_group", @@ -36,7 +37,8 @@ class WSConsumer(AsyncWebsocketConsumer): "wol", { "type": "send_group", "message": { - "visitors": await self.get_visitors() + "type": "visitor", + "message": await self.get_visitors() } } ) @@ -89,13 +91,7 @@ class WSConsumer(AsyncWebsocketConsumer): } } ) - elif received["type"] == "get_ports": - ports = await self.get_ports() - await self.send(text_data=json.dumps({ - "type": "get_ports", - "message": ports - })) - elif received["type"] == "delete": + elif received["type"] == "delete_device": await self.delete_device(received["id"]) await self.channel_layer.group_send( "wol", { @@ -106,8 +102,10 @@ class WSConsumer(AsyncWebsocketConsumer): } } ) - elif received["type"] == "update": + elif received["type"] == "update_device": await self.update_device(received["data"]) + elif received["type"] == "update_port": + await self.update_port(received["data"]) async def send_group(self, event): @@ -130,9 +128,27 @@ class WSConsumer(AsyncWebsocketConsumer): return Websocket.objects.first().visitors @database_sync_to_async - def get_device_count(self): - count = Device.objects.count() - return count + def get_all_devices(self): + devices = Device.objects.all() + d = [] + for dev in devices: + data = { + "id": dev.id, + "name": dev.name, + "ip": dev.ip, + "mac": dev.mac, + "netmask": dev.netmask, + "ports": [] + } + for p in Port.objects.all().order_by("number"): + data["ports"].append({ + "number": p.number, + "name": p.name, + "checked": False, + "open": False + }) + d.append(data) + return d @database_sync_to_async def delete_device(self, id): @@ -150,14 +166,25 @@ class WSConsumer(AsyncWebsocketConsumer): "netmask": data["netmask"] } ) - for _, value in data["ports"].items(): - if value["checked"]: - p, _ = Port.objects.get_or_create(number=value["number"], name=value["name"]) + for port in data["ports"]: + if port["checked"]: + p, _ = Port.objects.get_or_create(number=port["number"], name=port["name"]) obj.port.add(p) else: - p = Port.objects.get(number=value["number"]) + p = Port.objects.get(number=port["number"]) obj.port.remove(p) + @database_sync_to_async + def update_port(self, data): + if data.get("name"): + Port.objects.update_or_create( + number=data["number"], + defaults={ + "name": data["name"] + } + ) + else: + Port.objects.filter(number=data["number"]).delete() @database_sync_to_async def get_json_from_device_id(self, id): @@ -175,8 +202,3 @@ class WSConsumer(AsyncWebsocketConsumer): dev = Device.objects.filter(id=id).get() dev.scheduled_wake = None dev.save() - - @database_sync_to_async - def get_ports(self): - ports = Port.objects.all().order_by("name") - return serializers.serialize("python", ports) diff --git a/backend/wol/serializers.py b/backend/wol/serializers.py deleted file mode 100644 index f28c80e8..00000000 --- a/backend/wol/serializers.py +++ /dev/null @@ -1,25 +0,0 @@ -from rest_framework import serializers, viewsets -from wol.models import Settings, Device, Port - -class SettingsSerializer(serializers.HyperlinkedModelSerializer): - class Meta: - model = Settings - fields = "__all__" - -class SettingsViewSet(viewsets.ModelViewSet): - def get_queryset(self): - queryset = Settings.objects.first() - return queryset - serializer_class = SettingsSerializer - -class PortSerializer(serializers.ModelSerializer): - class Meta: - model = Port - fields = ["number", "name"] - -class DeviceSerializer(serializers.ModelSerializer): - port = PortSerializer(many=True, read_only=True) - - class Meta: - model = Device - fields = ["name", "ip", "mac", "netmask", "scheduled_wake", "port"] diff --git a/backend/wol/tasks.py b/backend/wol/tasks.py index bb113dd8..1a5a973f 100644 --- a/backend/wol/tasks.py +++ b/backend/wol/tasks.py @@ -31,33 +31,32 @@ class WolDevice: def start(self, dev): data = { - "device": { - "id": dev.id, - "name": dev.name, - "ip": dev.ip, - "mac": dev.mac, - "netmask": dev.netmask, - "up": False, - "ports": {} - } + "id": dev.id, + "name": dev.name, + "ip": dev.ip, + "mac": dev.mac, + "netmask": dev.netmask, + "up": False, + "ports": [] } - for p in Port.objects.all(): - data["device"]["ports"][str(p.number)] = { + for p in Port.objects.all().order_by("number"): + data["ports"].append({ "number": p.number, "name": p.name, - "checked": False, + "checked": True if p in dev.port.all() else False, "open": False - } + }) if self.ping_device(dev.ip): - data["device"]["up"] = True + data["up"] = True for port in dev.port.all(): + index = next(i for i, d in enumerate(data["ports"]) if d["number"] == port.number) if self.check_port(dev.ip, port.number): - data["device"]["ports"][str(port.number)]["checked"] = True - data["device"]["ports"][str(port.number)]["open"] = True + data["ports"][index]["checked"] = True + data["ports"][index]["open"] = True else: - data["device"]["ports"][str(port.number)]["checked"] = True - data["device"]["ports"][str(port.number)]["open"] = False + data["ports"][index]["checked"] = True + data["ports"][index]["open"] = False async_to_sync(channel_layer.group_send)( "wol", {"type": "send_group", "message": { diff --git a/backend/wol/urls.py b/backend/wol/urls.py deleted file mode 100644 index 68e232ca..00000000 --- a/backend/wol/urls.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.urls import path, include -from rest_framework import routers -from wol.serializers import SettingsViewSet - - -router = routers.DefaultRouter() -router.register(r'settings', SettingsViewSet, basename="settings") - -urlpatterns = [ - path('api/', include(router.urls)), -] diff --git a/backend/wol/views.py b/backend/wol/views.py deleted file mode 100644 index 91ea44a2..00000000 --- a/backend/wol/views.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.shortcuts import render - -# Create your views here. diff --git a/frontend/package.json b/frontend/package.json index 57eb61d8..14d5e690 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -5,7 +5,7 @@ "scripts": { "build": "rollup -c", "dev": "rollup -c -w", - "start": "sirv public --no-clear" + "start": "sirv public --no-clear --host" }, "devDependencies": { "@rollup/plugin-commonjs": "^17.0.0", diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte index 407182c2..66cdcfad 100644 --- a/frontend/src/App.svelte +++ b/frontend/src/App.svelte @@ -3,35 +3,36 @@ import store from './store.js'; import Navbar from "./components/Navbar.svelte"; import DeviceCard from "./components/DeviceCard.svelte" - import DummyDeviceCard from "./components/DummyDeviceCard.svelte" let visitors = 0; let devices = []; - let dummyDevices = 0; - let ports = []; onMount(() => { store.subscribe(currentMessage => { if (currentMessage.type == "init") { // create placeholder devices - dummyDevices = currentMessage.message; + for (let index = 0; index < currentMessage.message.length; index++) { + const element = currentMessage.message[index]; + devices.push(element); + devices = devices; + devices.sort(compare) + } } else if (currentMessage.type == "status") { // set device array and sort - dummyDevices -= 1; - const index = devices.findIndex(x => x.id == currentMessage.message.device.id); + const index = devices.findIndex(x => x.id == currentMessage.message.id); if (devices.length === 0 || index === -1) { - devices.push(currentMessage.message.device); + devices.push(currentMessage.message); devices = devices; } else { - devices[index] = currentMessage.message.device; + devices[index] = currentMessage.message; } devices.sort(compare) // set device status - if (currentMessage.message.device.up == true) { - setUp(currentMessage.message.device.id); + if (currentMessage.message.up == true) { + setUp(currentMessage.message.id); } else { - setDown(currentMessage.message.device.id); + setDown(currentMessage.message.id); } } else if (currentMessage.type == "wake") { // set device waking @@ -40,9 +41,6 @@ } else if (currentMessage.type == "visitor") { // update visitor count visitors = currentMessage.message; - } else if (currentMessage.type == "get_ports") { - // all available ports in db - ports = [...currentMessage.message]; } else if (currentMessage.type == "delete") { // delete device const devCol = document.querySelector(`#device-col-${currentMessage.message}`); @@ -115,15 +113,10 @@
-
+
- {#if dummyDevices >= 1} - {#each Array(dummyDevices) as _, i} - - {/each} - {/if} {#each devices as device} - + {/each}
diff --git a/frontend/src/components/DeviceCard.svelte b/frontend/src/components/DeviceCard.svelte index 62746cd3..2ee96a35 100644 --- a/frontend/src/components/DeviceCard.svelte +++ b/frontend/src/components/DeviceCard.svelte @@ -1,9 +1,9 @@
@@ -43,7 +75,11 @@
- + {#if device.up === true || device.up === false} + + {:else} + + {/if}
@@ -53,7 +89,7 @@
{device.name}
{device.ip}
    - {#each Object.entries(device.ports) as [_, port]} + {#each device.ports as port} {#if port.checked === true}
  • @@ -66,7 +102,7 @@