diff options
| -rw-r--r-- | generalresearch/managers/network/nmap.py | 4 | ||||
| -rw-r--r-- | generalresearch/managers/network/tool_run.py | 40 | ||||
| -rw-r--r-- | generalresearch/thl_django/network/models.py | 2 |
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() |
