aboutsummaryrefslogtreecommitdiff
path: root/generalresearch/managers/network/tool_run.py
diff options
context:
space:
mode:
Diffstat (limited to 'generalresearch/managers/network/tool_run.py')
-rw-r--r--generalresearch/managers/network/tool_run.py90
1 files changed, 90 insertions, 0 deletions
diff --git a/generalresearch/managers/network/tool_run.py b/generalresearch/managers/network/tool_run.py
new file mode 100644
index 0000000..75c2e73
--- /dev/null
+++ b/generalresearch/managers/network/tool_run.py
@@ -0,0 +1,90 @@
+from typing import Collection
+
+from psycopg import Cursor, sql
+
+from generalresearch.managers.base import PostgresManager, Permission
+from generalresearch.models.network.rdns import RDNSResult
+from generalresearch.models.network.tool_run import ToolRun, PortScanRun, RDnsRun
+from generalresearch.managers.network.nmap import NmapManager
+from generalresearch.managers.network.rdns import RdnsManager
+from generalresearch.pg_helper import PostgresConfig
+
+
+class ToolRunManager(PostgresManager):
+ def __init__(
+ self,
+ pg_config: PostgresConfig,
+ permissions: Collection[Permission] = None,
+ ):
+ super().__init__(pg_config=pg_config, permissions=permissions)
+ self.nmap_manager = NmapManager(self.pg_config)
+ self.rdns_manager = RdnsManager(self.pg_config)
+
+ def create_tool_run(self, run: PortScanRun | RDnsRun, c: Cursor):
+ query = sql.SQL(
+ """
+ INSERT INTO network_toolrun (
+ ip, scan_group_id, tool_class,
+ tool_name, tool_version, started_at,
+ finished_at, status, raw_command,
+ config
+ )
+ VALUES (
+ %(ip)s, %(scan_group_id)s, %(tool_class)s,
+ %(tool_name)s, %(tool_version)s, %(started_at)s,
+ %(finished_at)s, %(status)s, %(raw_command)s,
+ %(config)s
+ ) RETURNING id;
+ """
+ )
+ params = run.model_dump_postgres()
+ c.execute(query, params)
+ run_id = c.fetchone()["id"]
+ run.id = run_id
+ return None
+
+ def create_portscan_run(self, run: PortScanRun) -> PortScanRun:
+ """
+ Insert a PortScan + PortScanPorts from a Pydantic NmapRun.
+ """
+ with self.pg_config.make_connection() as conn:
+ with conn.cursor() as c:
+ self.create_tool_run(run, c)
+ self.nmap_manager._create(run, c=c)
+ return run
+
+ def get_portscan_run(self, id: int) -> PortScanRun:
+ query = """
+ SELECT tr.*, np.parsed
+ FROM network_toolrun tr
+ JOIN network_portscan np ON tr.id = np.run_id
+ WHERE id = %(id)s
+ """
+ params = {"id": id}
+ res = self.pg_config.execute_sql_query(query, params)[0]
+ return PortScanRun.model_validate(res)
+
+ def create_rdns_run(self, run: RDnsRun) -> RDnsRun:
+ """
+ Insert a RDnsRun + RDNSResult
+ """
+ with self.pg_config.make_connection() as conn:
+ with conn.cursor() as c:
+ self.create_tool_run(run, c)
+ self.rdns_manager._create(run, c=c)
+ return run
+
+ def get_rdns_run(self, id: int) -> RDnsRun:
+ query = """
+ SELECT tr.*, hostnames
+ FROM network_toolrun tr
+ JOIN network_rdnsresult np ON tr.id = np.run_id
+ WHERE id = %(id)s
+ """
+ params = {"id": id}
+ res = self.pg_config.execute_sql_query(query, params)[0]
+ parsed = RDNSResult.model_validate(
+ {"ip": res["ip"], "hostnames": res["hostnames"]}
+ )
+ res["parsed"] = parsed
+ return RDnsRun.model_validate(res)