mirror of
https://github.com/seriousm4x/UpSnap.git
synced 2026-04-05 00:43:55 -04:00
better device scan. less dependencies. ip regex
This commit is contained in:
@@ -19,10 +19,7 @@ COPY --from=builder /install /usr/local
|
|||||||
COPY app /app
|
COPY app /app
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
apt-get -y install iputils-ping && \
|
apt-get -y install iputils-ping nmap && \
|
||||||
rm -rf /var/lib/apt/lists/* && \
|
rm -rf /var/lib/apt/lists/*
|
||||||
groupadd user && useradd -M user -g user && \
|
|
||||||
chmod -R 755 /app && chown -R user:user /app
|
|
||||||
USER user
|
|
||||||
|
|
||||||
CMD ["./run.sh"]
|
CMD ["./run.sh"]
|
||||||
|
|||||||
@@ -142,4 +142,4 @@ STATIC_URL = '/static/'
|
|||||||
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
|
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
|
||||||
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
|
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
|
||||||
|
|
||||||
VERSION = "v1.2.2"
|
VERSION = "v1.2.3"
|
||||||
@@ -4,6 +4,7 @@ async function scan() {
|
|||||||
const table = document.getElementById("scan-table").getElementsByTagName('tbody')[0];
|
const table = document.getElementById("scan-table").getElementsByTagName('tbody')[0];
|
||||||
table.innerHTML = "";
|
table.innerHTML = "";
|
||||||
const tableContainer = document.getElementById("scan-table-container");
|
const tableContainer = document.getElementById("scan-table-container");
|
||||||
|
tableContainer.classList.add("is-hidden");
|
||||||
document.getElementById("scan-button").classList.add("is-loading");
|
document.getElementById("scan-button").classList.add("is-loading");
|
||||||
|
|
||||||
const response = await fetch("/scan");
|
const response = await fetch("/scan");
|
||||||
|
|||||||
@@ -108,7 +108,7 @@
|
|||||||
<label class="mr-2" for="ip-range"><strong>Network address for discovering devices:</strong></label>
|
<label class="mr-2" for="ip-range"><strong>Network address for discovering devices:</strong></label>
|
||||||
</div>
|
</div>
|
||||||
<div class="column is-half-mobile is-two-thirds-tablet is-three-quarters-desktop is-four-fifths-widescreen is-narrow">
|
<div class="column is-half-mobile is-two-thirds-tablet is-three-quarters-desktop is-four-fifths-widescreen is-narrow">
|
||||||
<input id="ip-range" class="input" type="text" placeholder="192.168.1.0/24" name="ip_range" value="{{ settings.scan_address }}">
|
<input id="ip-range" class="input" type="text" placeholder="192.168.1.0/24" name="ip_range" value="{% if settings.scan_address %}{{ settings.scan_address }}{% endif %}" pattern="^([01]?\d\d?|2[0-4]\d|25[0-5])(?:\.(?:[01]?\d\d?|2[0-4]\d|25[0-5])){2}(?:\.(?:0))(?:/[0-2]\d|/3[0-2])$">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button class="button is-primary" type="submit" value="Submit">Save</button>
|
<button class="button is-primary" type="submit" value="Submit">Save</button>
|
||||||
@@ -118,7 +118,16 @@
|
|||||||
<section class="section py-3">
|
<section class="section py-3">
|
||||||
<div class="box no-flex">
|
<div class="box no-flex">
|
||||||
<h2 class="title is-size-3 mb-4">Add devices</h2>
|
<h2 class="title is-size-3 mb-4">Add devices</h2>
|
||||||
|
{% if settings.scan_address %}
|
||||||
<button id="scan-button" class="button is-primary">Scan network</button>
|
<button id="scan-button" class="button is-primary">Scan network</button>
|
||||||
|
{% else %}
|
||||||
|
<article class="message is-danger">
|
||||||
|
<div class="message-body">
|
||||||
|
Please enter the network address above and save to use this feature. Network address should look like "192.168.1.0/24".
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
<button id="scan-button" class="button is-primary" disabled>Scan network</button>
|
||||||
|
{% endif %}
|
||||||
<div id="scan-table-container" class="table-container py-3 is-hidden">
|
<div id="scan-table-container" class="table-container py-3 is-hidden">
|
||||||
<table id="scan-table" class="table is-fullwidth">
|
<table id="scan-table" class="table is-fullwidth">
|
||||||
<thead>
|
<thead>
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import platform
|
import platform
|
||||||
|
import subprocess
|
||||||
|
|
||||||
import arpreq
|
|
||||||
import nmap
|
|
||||||
from asgiref.sync import async_to_sync
|
from asgiref.sync import async_to_sync
|
||||||
from channels.layers import get_channel_layer
|
from channels.layers import get_channel_layer
|
||||||
from django.http import HttpResponseRedirect
|
from django.http import HttpResponseRedirect
|
||||||
@@ -66,21 +65,39 @@ def save_settings(request):
|
|||||||
|
|
||||||
|
|
||||||
def scan(request):
|
def scan(request):
|
||||||
conf = Settings.objects.filter(id=1).get()
|
|
||||||
nm = nmap.PortScanner()
|
|
||||||
nm.scan(hosts=conf.scan_address, arguments='-sP')
|
|
||||||
up_hosts = nm.all_hosts()
|
|
||||||
|
|
||||||
data = {
|
data = {
|
||||||
"devices": []
|
"devices": []
|
||||||
}
|
}
|
||||||
for address in up_hosts:
|
|
||||||
mac = arpreq.arpreq(address)
|
conf = Settings.objects.filter(id=1).get()
|
||||||
if mac:
|
|
||||||
|
if not conf.scan_address:
|
||||||
|
return JsonResponse(data=data)
|
||||||
|
|
||||||
|
p = subprocess.Popen(["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:"
|
||||||
|
|
||||||
|
for line in out.splitlines():
|
||||||
|
if line.startswith(ip_line):
|
||||||
|
line_splitted = line.split()
|
||||||
|
if len(line_splitted) == 6:
|
||||||
|
name = line_splitted[4]
|
||||||
|
ip = line_splitted[5]
|
||||||
|
ip = ip.replace("(", "")
|
||||||
|
ip = ip.replace(")", "")
|
||||||
|
else:
|
||||||
|
name = None
|
||||||
|
ip = line_splitted[4]
|
||||||
|
elif line.startswith(mac_line):
|
||||||
|
line_splitted = line.split()
|
||||||
|
mac = line_splitted[2]
|
||||||
|
|
||||||
data["devices"].append({
|
data["devices"].append({
|
||||||
"name": nm[address].hostname(),
|
"name": name,
|
||||||
"ip": address,
|
"ip": ip,
|
||||||
"mac": arpreq.arpreq(address)
|
"mac": mac
|
||||||
})
|
})
|
||||||
|
|
||||||
return JsonResponse(data=data)
|
return JsonResponse(data=data)
|
||||||
|
|||||||
@@ -7,5 +7,3 @@ psycopg2-binary
|
|||||||
whitenoise
|
whitenoise
|
||||||
gunicorn
|
gunicorn
|
||||||
uvicorn[standard]
|
uvicorn[standard]
|
||||||
python-nmap
|
|
||||||
arpreq
|
|
||||||
|
|||||||
Reference in New Issue
Block a user