diff --git a/app/wol/static/js/scan.js b/app/wol/static/js/settings.js similarity index 74% rename from app/wol/static/js/scan.js rename to app/wol/static/js/settings.js index 33b21113..8b46c2d2 100644 --- a/app/wol/static/js/scan.js +++ b/app/wol/static/js/settings.js @@ -1,5 +1,14 @@ document.getElementById("scan-button").addEventListener("click", scan) +var deleteButtons = document.querySelectorAll('[id*=-delete-button]'); +for (let index = 0; index < deleteButtons.length; index++) { + const element = deleteButtons[index]; + element.addEventListener('click', () => { + element.disabled = true; + element.innerText = "Deleted"; + }); +} + async function scan() { const table = document.getElementById("scan-table").getElementsByTagName('tbody')[0]; table.innerHTML = ""; @@ -7,7 +16,7 @@ async function scan() { tableContainer.classList.add("is-hidden"); document.getElementById("scan-button").classList.add("is-loading"); - const response = await fetch("/scan"); + const response = await fetch("/settings/scan"); const data = await response.json(); if (data.devices.length == 0) { @@ -36,6 +45,7 @@ async function scan() { button.addEventListener("click", function (event) { add_device(JSON.stringify(device)); event.target.disabled = true; + event.target.innerText = "Added"; }); td4.appendChild(button); } @@ -45,8 +55,16 @@ async function scan() { function add_device(data) { var xhr = new XMLHttpRequest(); - var url = "/add-device/"; + var url = "/settings/add/"; xhr.open("POST", url, true); xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(data); +} + +function del_device(devId) { + var xhr = new XMLHttpRequest(); + var url = "/settings/del/"; + xhr.open("POST", url, true); + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.send(devId); } \ No newline at end of file diff --git a/app/wol/templates/wol/settings.html b/app/wol/templates/wol/settings.html index 7c21438c..8cb2d95d 100644 --- a/app/wol/templates/wol/settings.html +++ b/app/wol/templates/wol/settings.html @@ -48,15 +48,15 @@

-
+ {% csrf_token %}

General

-
-
+
+
Notifications:
-
+
-
-
+
+
Console logging:
-
+
-
-
+
+
Sort devices by:
-
+
-
-
+
+
-
+
@@ -116,117 +116,150 @@
-
-

Add devices

- {% if settings.scan_address %} - - {% else %} -
-
- Please enter the network address above and save to use this feature. Network address should look like "192.168.1.0/24". -
-
- - {% endif %} -
-
-

App info

-
-
- App version: -
-
-

{{ app_version }}

+
+
+
+

App info

+
+
+ App version: +
+
+

{{ app_version }}

+
+
+
+
+ Ping interval: +
+
+

{{ ping_interval }} seconds

+
+
+
+
+ Devices in database: +
+
+

{{ devices|length }}

+
+
+
+
+ Current visitors: +
+
+

{{ visitors }}

+
+
+
+
+ Debug mode: +
+
+

{{ debug }}

+
+
-
-
- Ping interval: -
-
-

{{ ping_interval }} seconds

-
-
-
-
- Devices in database: -
-
-

{{ devices_count }}

-
-
-
-
- Current visitors: -
-
-

{{ visitors }}

-
-
-
-
- Debug mode: -
-
-

{{ debug }}

-
-
-
-
-
-
-

System info

-
-
- System: -
-
-

{{ platform.system }}

-
-
-
-
- Node: -
-
-

{{ platform.node }}

-
-
-
-
- Release: -
-
-

{{ platform.release }}

-
-
-
-
- Version: -
-
-

{{ platform.version }}

-
-
-
-
- Machine: -
-
-

{{ platform.machine }}

+
+
+

System info

+
+
+ System: +
+
+

{{ platform.system }}

+
+
+
+
+ Node: +
+
+

{{ platform.node }}

+
+
+
+
+ Release: +
+
+

{{ platform.release }}

+
+
+
+
+ Version: +
+
+

{{ platform.version }}

+
+
+
+
+ Machine: +
+
+

{{ platform.machine }}

+
+
@@ -236,7 +269,7 @@ \ No newline at end of file diff --git a/app/wol/urls.py b/app/wol/urls.py index bc132bb5..88cd378d 100644 --- a/app/wol/urls.py +++ b/app/wol/urls.py @@ -5,7 +5,8 @@ from wol import views urlpatterns = [ path("", views.index, name="index"), path("settings/", views.settings, name="settings"), - path("save-settings/", views.save_settings, name="save_settings"), - path("scan/", views.scan, name="scan"), - path("add-device/", views.add_device, name="add_device") + path("settings/save/", views.settings_save, name="settings_save"), + path("settings/scan/", views.settings_scan, name="settings_scan"), + path("settings/add/", views.settings_add, name="settings_add"), + path("settings/del/", views.settings_del, name="settings_del") ] diff --git a/app/wol/views.py b/app/wol/views.py index 91251189..5580e3df 100644 --- a/app/wol/views.py +++ b/app/wol/views.py @@ -32,13 +32,13 @@ def index(request): def settings(request): conf = Settings.objects.first() - devices_count = Device.objects.all().count() + devices = Device.objects.all() visitors = Websocket.objects.first().visitors context = { "settings": conf, "ping_interval": os.getenv("PING_INTERVAL"), - "devices_count": devices_count, + "devices": devices, "platform": platform.uname(), "app_version": app_version, "debug": os.getenv("DJANGO_DEBUG"), @@ -48,7 +48,7 @@ def settings(request): return render(request, "wol/settings.html", context) -def save_settings(request): +def settings_save(request): if request.method == "POST": form = SettingsForm(request.POST) if form.is_valid(): @@ -64,7 +64,7 @@ def save_settings(request): return HttpResponseRedirect('/settings/') -def scan(request): +def settings_scan(request): data = { "devices": [] } @@ -74,7 +74,7 @@ def scan(request): if not conf.scan_address: return JsonResponse(data=data) - p = subprocess.Popen(["nmap", "-sP", conf.scan_address], stdout=subprocess.PIPE) + p = subprocess.Popen(["sudo", "nmap", "-sP", conf.scan_address], stdout=subprocess.PIPE) out = p.communicate()[0].decode("utf-8") ip_line = "Nmap scan report for" mac_line = "MAC Address:" @@ -104,7 +104,7 @@ def scan(request): @method_decorator(csrf_exempt, name="dispatch") -def add_device(request): +def settings_add(request): data = {} if request.method == "POST": post_body = json.loads(request.body.decode('utf-8')) @@ -130,3 +130,21 @@ def add_device(request): })}) return JsonResponse(data=data) + +@method_decorator(csrf_exempt, name="dispatch") +def settings_del(request): + data = {} + if request.method == "POST": + dev_id = int(request.body.decode('utf-8')) + Device.objects.get(id=dev_id).delete() + data["status"] = 200 + else: + data["status"] = 500 + + channel_layer = get_channel_layer() + async_to_sync(channel_layer.group_send)( + "wol", {"type": "send_status", "status": json.dumps({ + "reload": True + })}) + + return JsonResponse(data=data)