Initial commit: Simple DHCP Server mit Tkinter-GUI und Start-Skripten
This commit is contained in:
7
.gitignore
vendored
Normal file
7
.gitignore
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
venv/
|
||||||
|
__pycache__/
|
||||||
|
*.pyc
|
||||||
|
*.pyo
|
||||||
|
*.pyd
|
||||||
|
.env
|
||||||
|
.DS_Store
|
55
README.md
Normal file
55
README.md
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
# Python DHCP Tkinter Application
|
||||||
|
|
||||||
|
This project is a simple DHCP server application built using Python and Tkinter. It provides a graphical user interface (GUI) for managing DHCP leases and clients.
|
||||||
|
|
||||||
|
## Project Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
python-dhcp-tk-app
|
||||||
|
├── src
|
||||||
|
│ ├── main.py # Entry point of the application
|
||||||
|
│ ├── dhcp_server.py # Contains the DHCPServer class
|
||||||
|
│ ├── gui.py # Defines the GUI layout
|
||||||
|
│ ├── utils.py # Utility functions for networking tasks
|
||||||
|
│ └── types
|
||||||
|
│ └── __init__.py # Custom types and data structures
|
||||||
|
├── requirements.txt # Project dependencies
|
||||||
|
└── README.md # Project documentation
|
||||||
|
```
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
To run this project, you need to install the following dependencies:
|
||||||
|
|
||||||
|
- tkinter
|
||||||
|
- (any additional libraries required for DHCP functionality)
|
||||||
|
|
||||||
|
You can install the required packages using pip:
|
||||||
|
|
||||||
|
```
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
1. Run the application by executing the `main.py` file:
|
||||||
|
|
||||||
|
```
|
||||||
|
python src/main.py
|
||||||
|
```
|
||||||
|
|
||||||
|
2. The GUI will display a dropdown menu with available network interfaces. Select the desired interface.
|
||||||
|
|
||||||
|
3. Enter the desired IP address and subnet mask in the provided fields.
|
||||||
|
|
||||||
|
4. Use the "Start" button to start the DHCP server. The application will begin managing DHCP leases and display active clients in the list.
|
||||||
|
|
||||||
|
5. To stop the DHCP server, click the "Stop" button.
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Feel free to contribute to this project by submitting issues or pull requests. Your feedback and contributions are welcome!
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This project is licensed under the MIT License. See the LICENSE file for more details.
|
2
requirements.txt
Normal file
2
requirements.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
tkinter
|
||||||
|
scapy
|
35
src/dhcp_server.py
Normal file
35
src/dhcp_server.py
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
class DHCPServer:
|
||||||
|
def __init__(self):
|
||||||
|
self.leases = {}
|
||||||
|
self.active_clients = []
|
||||||
|
|
||||||
|
def start(self, interface, ip_range, subnet):
|
||||||
|
# Start the DHCP server on the specified interface
|
||||||
|
pass
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
# Stop the DHCP server
|
||||||
|
pass
|
||||||
|
|
||||||
|
def handle_request(self, request):
|
||||||
|
# Handle incoming DHCP requests
|
||||||
|
pass
|
||||||
|
|
||||||
|
def add_lease(self, client_ip, client_mac):
|
||||||
|
# Add a new lease for a client
|
||||||
|
self.leases[client_mac] = client_ip
|
||||||
|
self.active_clients.append(client_mac)
|
||||||
|
|
||||||
|
def remove_lease(self, client_mac):
|
||||||
|
# Remove a lease for a client
|
||||||
|
if client_mac in self.leases:
|
||||||
|
del self.leases[client_mac]
|
||||||
|
self.active_clients.remove(client_mac)
|
||||||
|
|
||||||
|
def get_active_clients(self):
|
||||||
|
# Return a list of active clients
|
||||||
|
return self.active_clients
|
||||||
|
|
||||||
|
def get_leases(self):
|
||||||
|
# Return the current leases
|
||||||
|
return self.leases
|
68
src/gui.py
Normal file
68
src/gui.py
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
from tkinter import Tk, Label, Button, Entry, StringVar, OptionMenu, Listbox, END
|
||||||
|
import psutil
|
||||||
|
from dhcp_server import DHCPServer
|
||||||
|
|
||||||
|
class DHCPApp:
|
||||||
|
def __init__(self, master):
|
||||||
|
self.master = master
|
||||||
|
master.title("DHCP Server")
|
||||||
|
|
||||||
|
self.interface_label = Label(master, text="Select Network Interface:")
|
||||||
|
self.interface_label.pack()
|
||||||
|
|
||||||
|
self.interface_var = StringVar(master)
|
||||||
|
self.interfaces = self.get_network_interfaces()
|
||||||
|
self.interface_menu = OptionMenu(master, self.interface_var, *self.interfaces)
|
||||||
|
self.interface_menu.pack()
|
||||||
|
|
||||||
|
self.ip_label = Label(master, text="IP Address:")
|
||||||
|
self.ip_label.pack()
|
||||||
|
self.ip_entry = Entry(master)
|
||||||
|
self.ip_entry.pack()
|
||||||
|
|
||||||
|
self.subnet_label = Label(master, text="Subnet Mask:")
|
||||||
|
self.subnet_label.pack()
|
||||||
|
self.subnet_entry = Entry(master)
|
||||||
|
self.subnet_entry.pack()
|
||||||
|
|
||||||
|
self.start_button = Button(master, text="Start DHCP Server", command=self.start_dhcp_server)
|
||||||
|
self.start_button.pack()
|
||||||
|
|
||||||
|
self.stop_button = Button(master, text="Stop DHCP Server", command=self.stop_dhcp_server)
|
||||||
|
self.stop_button.pack()
|
||||||
|
|
||||||
|
self.clients_label = Label(master, text="Active Clients:")
|
||||||
|
self.clients_label.pack()
|
||||||
|
|
||||||
|
self.clients_listbox = Listbox(master)
|
||||||
|
self.clients_listbox.pack()
|
||||||
|
|
||||||
|
self.dhcp_server = None
|
||||||
|
|
||||||
|
def get_network_interfaces(self):
|
||||||
|
return psutil.net_if_addrs().keys()
|
||||||
|
|
||||||
|
def start_dhcp_server(self):
|
||||||
|
ip = self.ip_entry.get()
|
||||||
|
subnet = self.subnet_entry.get()
|
||||||
|
interface = self.interface_var.get()
|
||||||
|
self.dhcp_server = DHCPServer(interface, ip, subnet)
|
||||||
|
self.dhcp_server.start()
|
||||||
|
self.update_clients_list()
|
||||||
|
|
||||||
|
def stop_dhcp_server(self):
|
||||||
|
if self.dhcp_server:
|
||||||
|
self.dhcp_server.stop()
|
||||||
|
self.dhcp_server = None
|
||||||
|
self.clients_listbox.delete(0, END)
|
||||||
|
|
||||||
|
def update_clients_list(self):
|
||||||
|
if self.dhcp_server:
|
||||||
|
self.clients_listbox.delete(0, END)
|
||||||
|
for client in self.dhcp_server.get_active_clients():
|
||||||
|
self.clients_listbox.insert(END, client)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
root = Tk()
|
||||||
|
app = DHCPApp(root)
|
||||||
|
root.mainloop()
|
69
src/main.py
Normal file
69
src/main.py
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
import tkinter as tk
|
||||||
|
from tkinter import ttk
|
||||||
|
from dhcp_server import DHCPServer
|
||||||
|
import utils
|
||||||
|
|
||||||
|
class DHCPApp:
|
||||||
|
def __init__(self, root):
|
||||||
|
self.root = root
|
||||||
|
self.root.title("Simple DHCP Server")
|
||||||
|
|
||||||
|
self.server = None
|
||||||
|
|
||||||
|
self.interface_label = tk.Label(root, text="Select Network Interface:")
|
||||||
|
self.interface_label.grid(row=0, column=0, padx=10, pady=10)
|
||||||
|
|
||||||
|
self.interface_var = tk.StringVar()
|
||||||
|
self.interface_dropdown = ttk.Combobox(root, textvariable=self.interface_var)
|
||||||
|
self.interface_dropdown['values'] = utils.get_network_interfaces()
|
||||||
|
self.interface_dropdown.grid(row=0, column=1, padx=10, pady=10)
|
||||||
|
|
||||||
|
self.ip_label = tk.Label(root, text="DHCP IP Range Start:")
|
||||||
|
self.ip_label.grid(row=1, column=0, padx=10, pady=10)
|
||||||
|
|
||||||
|
self.ip_entry = tk.Entry(root)
|
||||||
|
self.ip_entry.grid(row=1, column=1, padx=10, pady=10)
|
||||||
|
|
||||||
|
self.subnet_label = tk.Label(root, text="Subnet Mask:")
|
||||||
|
self.subnet_label.grid(row=2, column=0, padx=10, pady=10)
|
||||||
|
|
||||||
|
self.subnet_entry = tk.Entry(root)
|
||||||
|
self.subnet_entry.grid(row=2, column=1, padx=10, pady=10)
|
||||||
|
|
||||||
|
self.start_button = tk.Button(root, text="Start DHCP Server", command=self.start_server)
|
||||||
|
self.start_button.grid(row=3, column=0, padx=10, pady=10)
|
||||||
|
|
||||||
|
self.stop_button = tk.Button(root, text="Stop DHCP Server", command=self.stop_server)
|
||||||
|
self.stop_button.grid(row=3, column=1, padx=10, pady=10)
|
||||||
|
|
||||||
|
self.clients_label = tk.Label(root, text="Active Clients:")
|
||||||
|
self.clients_label.grid(row=4, column=0, padx=10, pady=10)
|
||||||
|
|
||||||
|
self.clients_listbox = tk.Listbox(root, width=50)
|
||||||
|
self.clients_listbox.grid(row=5, column=0, columnspan=2, padx=10, pady=10)
|
||||||
|
|
||||||
|
def start_server(self):
|
||||||
|
if not self.server:
|
||||||
|
ip_range = self.ip_entry.get()
|
||||||
|
subnet = self.subnet_entry.get()
|
||||||
|
interface = self.interface_var.get()
|
||||||
|
self.server = DHCPServer(interface, ip_range, subnet)
|
||||||
|
self.server.start()
|
||||||
|
self.update_clients()
|
||||||
|
|
||||||
|
def stop_server(self):
|
||||||
|
if self.server:
|
||||||
|
self.server.stop()
|
||||||
|
self.server = None
|
||||||
|
self.clients_listbox.delete(0, tk.END)
|
||||||
|
|
||||||
|
def update_clients(self):
|
||||||
|
if self.server:
|
||||||
|
self.clients_listbox.delete(0, tk.END)
|
||||||
|
for client in self.server.get_active_clients():
|
||||||
|
self.clients_listbox.insert(tk.END, client)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
root = tk.Tk()
|
||||||
|
app = DHCPApp(root)
|
||||||
|
root.mainloop()
|
8
src/types/__init__.py
Normal file
8
src/types/__init__.py
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
class ClientLease:
|
||||||
|
def __init__(self, ip_address, mac_address, lease_time):
|
||||||
|
self.ip_address = ip_address
|
||||||
|
self.mac_address = mac_address
|
||||||
|
self.lease_time = lease_time
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f"ClientLease(ip_address={self.ip_address}, mac_address={self.mac_address}, lease_time={self.lease_time})"
|
29
src/utils.py
Normal file
29
src/utils.py
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
def get_available_interfaces():
|
||||||
|
import netifaces
|
||||||
|
return netifaces.interfaces()
|
||||||
|
|
||||||
|
def format_ip_address(ip):
|
||||||
|
try:
|
||||||
|
parts = ip.split('.')
|
||||||
|
if len(parts) != 4:
|
||||||
|
raise ValueError("Invalid IP address format")
|
||||||
|
return '.'.join(str(int(part)) for part in parts)
|
||||||
|
except ValueError as e:
|
||||||
|
raise ValueError(f"Error formatting IP address: {e}")
|
||||||
|
|
||||||
|
def validate_subnet_mask(mask):
|
||||||
|
valid_masks = [
|
||||||
|
'255.255.255.255', '255.255.255.254', '255.255.255.252',
|
||||||
|
'255.255.255.248', '255.255.255.240', '255.255.255.224',
|
||||||
|
'255.255.255.192', '255.255.255.128', '255.255.255.0',
|
||||||
|
'255.255.254.0', '255.255.252.0', '255.255.248.0',
|
||||||
|
'255.255.240.0', '255.255.224.0', '255.255.192.0',
|
||||||
|
'255.255.128.0', '255.255.0.0', '255.254.0.0',
|
||||||
|
'255.252.0.0', '255.248.0.0', '255.240.0.0',
|
||||||
|
'255.224.0.0', '255.192.0.0', '255.128.0.0',
|
||||||
|
'255.0.0.0', '254.0.0.0', '252.0.0.0',
|
||||||
|
'248.0.0.0', '240.0.0.0', '224.0.0.0',
|
||||||
|
'192.0.0.0', '128.0.0.0', '0.0.0.0'
|
||||||
|
]
|
||||||
|
if mask not in valid_masks:
|
||||||
|
raise ValueError("Invalid subnet mask")
|
11
start.bat
Normal file
11
start.bat
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
@echo off
|
||||||
|
if not exist venv (
|
||||||
|
python -m venv venv
|
||||||
|
)
|
||||||
|
call venv\Scripts\activate
|
||||||
|
pip install --upgrade pip
|
||||||
|
pip install -r requirements.txt
|
||||||
|
tasklist /FI "IMAGENAME eq python.exe" | find /I "main.py" >nul
|
||||||
|
if errorlevel 1 (
|
||||||
|
python src\main.py
|
||||||
|
)
|
Reference in New Issue
Block a user