Skip to content
Snippets Groups Projects
Commit 33a95751 authored by Vladyslav Lubkovskyi's avatar Vladyslav Lubkovskyi
Browse files

added an ability to look up into the database

parent 23be1da1
No related branches found
No related tags found
No related merge requests found
......@@ -4,6 +4,7 @@ import subprocess
import threading
import os
import sys
import duckdb
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), 'machine_learning_models')))
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
......@@ -11,12 +12,9 @@ python_executable = os.path.join(base_dir, ".venv", "Scripts", "python.exe")
from machine_learning_models import utilities as util
train_file_path = os.path.abspath(os.path.join(os.path.dirname(__file__), 'machine_learning_models', 'nsl-kdd-dataset', 'KDDTrain+.arff'))
test_file_path = os.path.abspath(os.path.join(os.path.dirname(__file__), 'machine_learning_models', 'nsl-kdd-dataset', 'KDDTest+.arff'))
# Import data using the correct paths
df_train, df_test, model_name = util.import_data(
train_file_path=train_file_path,
test_file_path=test_file_path,
......@@ -47,6 +45,7 @@ class PacketCaptureGUI:
self.menu_bar.add_cascade(label="View", menu=self.view_menu)
self.view_menu.add_command(label="Statistics", command=self.show_statistics)
self.view_menu.add_command(label="Graph Viewer", command=self.open_graph_viewer)
self.view_menu.add_command(label="Packet Data", command=self.show_packet_data) # New menu item
# Add a "Train" menu with a "Train Model" option
self.train_menu = Menu(self.menu_bar, tearoff=0)
......@@ -94,6 +93,7 @@ class PacketCaptureGUI:
self.rule_based_radio.config(state=tk.DISABLED)
self.start_button.config(state=tk.DISABLED)
self.stop_button.config(state=tk.NORMAL)
self.disable_menu_items()
if self.model_var.get() == "rule_based":
self.packet_display.insert(tk.END, "Starting packet capture with rule-based model...\n")
......@@ -136,8 +136,11 @@ class PacketCaptureGUI:
self.rule_based_radio.config(state=tk.NORMAL)
self.start_button.config(state=tk.NORMAL)
self.stop_button.config(state=tk.DISABLED)
self.enable_menu_items()
def show_statistics(self):
self.disable_menu_items()
self.start_button.config(state=tk.DISABLED)
# Create a new window for statistics
stats_window = tk.Toplevel(self.root)
stats_window.title("Statistics")
......@@ -153,7 +156,11 @@ class PacketCaptureGUI:
canvas.draw()
canvas.get_tk_widget().pack()
stats_window.protocol("WM_DELETE_WINDOW", lambda: self.on_close_window(stats_window))
def train_model(self):
self.disable_menu_items()
self.start_button.config(state=tk.DISABLED)
# Create a new window for model training
train_window = tk.Toplevel(self.root)
train_window.title("Train Model")
......@@ -169,6 +176,8 @@ class PacketCaptureGUI:
start_training_button = tk.Button(train_window, text="Start Training", command=lambda: self.start_training(model_combobox.get()))
start_training_button.pack(pady=10)
train_window.protocol("WM_DELETE_WINDOW", lambda: self.on_close_window(train_window))
def start_training(self, model_name):
if model_name == "Random Forest":
self.packet_display.insert(tk.END, f"Starting training with {model_name} model...\n")
......@@ -269,7 +278,7 @@ class PacketCaptureGUI:
def on_mouse_move(self, event):
if self.dragging and self.last_mouse_pos:
dx = self.last_mouse_pos[0] - event.x
dy = self.last_mouse_pos[1] - event.y
dy = event.y - self.last_mouse_pos[1] # Invert vertical movement
cur_xlim = self.ax.get_xlim()
cur_ylim = self.ax.get_ylim()
......@@ -281,9 +290,61 @@ class PacketCaptureGUI:
self.last_mouse_pos = (event.x, event.y)
def open_graph_viewer(self):
self.disable_menu_items()
self.start_button.config(state=tk.DISABLED)
viewer_window = tk.Toplevel(self.root)
GraphViewer(viewer_window)
def show_packet_data(self):
self.disable_menu_items()
self.start_button.config(state=tk.DISABLED)
# Create a new window for packet data
data_window = tk.Toplevel(self.root)
data_window.title("Packet Data")
# Create a Treeview widget to display packet data
tree = ttk.Treeview(data_window, columns=("source_ip", "destination_ip", "source_mac", "destination_mac", "source_port", "destination_port", "is_dangerous", "type_of_threat"), show="headings")
tree.pack(fill=tk.BOTH, expand=True)
# Define column headings
tree.heading("source_ip", text="Source IP")
tree.heading("destination_ip", text="Destination IP")
tree.heading("source_mac", text="Source MAC")
tree.heading("destination_mac", text="Destination MAC")
tree.heading("source_port", text="Source Port")
tree.heading("destination_port", text="Destination Port")
tree.heading("is_dangerous", text="Is Dangerous")
tree.heading("type_of_threat", text="Type of Threat")
# Connect to the DuckDB database and fetch data
conn = duckdb.connect('packets_data.duckdb')
query = "SELECT * FROM packets"
result = conn.execute(query).fetchall()
# Insert data into the Treeview widget
for row in result:
tree.insert("", tk.END, values=row)
conn.close()
data_window.protocol("WM_DELETE_WINDOW", lambda: self.on_close_window(data_window))
def disable_menu_items(self):
self.view_menu.entryconfig("Statistics", state=tk.DISABLED)
self.view_menu.entryconfig("Graph Viewer", state=tk.DISABLED)
self.view_menu.entryconfig("Packet Data", state=tk.DISABLED)
self.train_menu.entryconfig("Train Model", state=tk.DISABLED)
def enable_menu_items(self):
self.view_menu.entryconfig("Statistics", state=tk.NORMAL)
self.view_menu.entryconfig("Graph Viewer", state=tk.NORMAL)
self.view_menu.entryconfig("Packet Data", state=tk.NORMAL)
self.train_menu.entryconfig("Train Model", state=tk.NORMAL)
self.start_button.config(state=tk.NORMAL)
def on_close_window(self, window):
window.destroy()
self.enable_menu_items()
class GraphViewer:
def __init__(self, root):
self.root = root
......@@ -385,4 +446,4 @@ class GraphViewer:
if __name__ == "__main__":
root = tk.Tk()
app = PacketCaptureGUI(root)
root.mainloop()
root.mainloop()
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment