aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstuppie2026-03-13 14:04:03 -0600
committerstuppie2026-03-13 14:04:03 -0600
commitb1e533a6ac76ad127df0a7bf0bbf507e7938224e (patch)
treedfb3c7330659d1fe46105843a83c943e59b20d11
parentefe1c368b8b49a2c6b3bf2193a5b89eb5426eba3 (diff)
downloadgeneralresearch-b1e533a6ac76ad127df0a7bf0bbf507e7938224e.tar.gz
generalresearch-b1e533a6ac76ad127df0a7bf0bbf507e7938224e.zip
nmap: dont neet raw_xml separate; its inside parsed
-rw-r--r--generalresearch/managers/network/nmap.py4
-rw-r--r--generalresearch/managers/network/tool_run.py40
-rw-r--r--generalresearch/thl_django/network/models.py2
3 files changed, 36 insertions, 10 deletions
diff --git a/generalresearch/managers/network/nmap.py b/generalresearch/managers/network/nmap.py
index 0995a32..a9e6c56 100644
--- a/generalresearch/managers/network/nmap.py
+++ b/generalresearch/managers/network/nmap.py
@@ -18,14 +18,14 @@ class NmapRunManager(PostgresManager):
INSERT INTO network_portscan (
run_id, xml_version, host_state,
host_state_reason, latency_ms, distance,
- uptime_seconds, last_boot, raw_xml,
+ uptime_seconds, last_boot,
parsed, scan_group_id, open_tcp_ports,
started_at, ip
)
VALUES (
%(run_id)s, %(xml_version)s, %(host_state)s,
%(host_state_reason)s, %(latency_ms)s, %(distance)s,
- %(uptime_seconds)s, %(last_boot)s, %(raw_xml)s,
+ %(uptime_seconds)s, %(last_boot)s,
%(parsed)s, %(scan_group_id)s, %(open_tcp_ports)s,
%(started_at)s, %(ip)s
);
diff --git a/generalresearch/managers/network/tool_run.py b/generalresearch/managers/network/tool_run.py
index 33853a0..17f4935 100644
--- a/generalresearch/managers/network/tool_run.py
+++ b/generalresearch/managers/network/tool_run.py
@@ -1,4 +1,4 @@
-from typing import Collection
+from typing import Collection, List, Dict
from psycopg import Cursor, sql
@@ -8,7 +8,13 @@ from generalresearch.managers.network.nmap import NmapRunManager
from generalresearch.managers.network.rdns import RDNSRunManager
from generalresearch.managers.network.mtr import MTRRunManager
from generalresearch.models.network.rdns.result import RDNSResult
-from generalresearch.models.network.tool_run import NmapRun, RDNSRun, MTRRun
+from generalresearch.models.network.tool_run import (
+ NmapRun,
+ RDNSRun,
+ MTRRun,
+ ToolRun,
+ ToolName,
+)
from generalresearch.pg_helper import PostgresConfig
@@ -23,7 +29,7 @@ class ToolRunManager(PostgresManager):
self.rdns_manager = RDNSRunManager(self.pg_config)
self.mtr_manager = MTRRunManager(self.pg_config)
- def create_tool_run(self, run: NmapRun | RDNSRun | MTRRun, c: Cursor):
+ def _create_tool_run(self, run: NmapRun | RDNSRun | MTRRun, c: Cursor):
query = sql.SQL(
"""
INSERT INTO network_toolrun (
@@ -46,13 +52,35 @@ class ToolRunManager(PostgresManager):
run.id = run_id
return None
+ def create_tool_run(self, run: NmapRun | RDNSRun | MTRRun):
+ if type(run) is NmapRun:
+ return self.create_nmap_run(run)
+ elif type(run) is RDNSRun:
+ return self.create_rdns_run(run)
+ elif type(run) is MTRRun:
+ return self.create_mtr_run(run)
+ else:
+ raise ValueError("unrecognized run type")
+
+ def get_latest_runs_by_tool(self, ip: str) -> Dict[ToolName, ToolRun]:
+ query = """
+ SELECT DISTINCT ON (tool_name) *
+ FROM network_toolrun
+ WHERE ip = %(ip)s
+ ORDER BY tool_name, started_at DESC;
+ """
+ params = {"ip": ip}
+ res = self.pg_config.execute_sql_query(query, params=params)
+ runs = [ToolRun.model_validate(x) for x in res]
+ return {r.tool_name: r for r in runs}
+
def create_nmap_run(self, run: NmapRun) -> NmapRun:
"""
Insert a PortScan + PortScanPorts from a Pydantic NmapResult.
"""
with self.pg_config.make_connection() as conn:
with conn.cursor() as c:
- self.create_tool_run(run, c)
+ self._create_tool_run(run, c)
self.nmap_manager._create(run, c=c)
return run
@@ -73,7 +101,7 @@ class ToolRunManager(PostgresManager):
"""
with self.pg_config.make_connection() as conn:
with conn.cursor() as c:
- self.create_tool_run(run, c)
+ self._create_tool_run(run, c)
self.rdns_manager._create(run, c=c)
return run
@@ -95,7 +123,7 @@ class ToolRunManager(PostgresManager):
def create_mtr_run(self, run: MTRRun) -> MTRRun:
with self.pg_config.make_connection() as conn:
with conn.cursor() as c:
- self.create_tool_run(run, c)
+ self._create_tool_run(run, c)
self.mtr_manager._create(run, c=c)
return run
diff --git a/generalresearch/thl_django/network/models.py b/generalresearch/thl_django/network/models.py
index 7d4d8de..2da7071 100644
--- a/generalresearch/thl_django/network/models.py
+++ b/generalresearch/thl_django/network/models.py
@@ -133,8 +133,6 @@ class PortScan(models.Model):
uptime_seconds = models.IntegerField(null=True)
last_boot = models.DateTimeField(null=True)
- raw_xml = models.TextField(null=True)
-
# Full parsed output
parsed = models.JSONField()