Add captive_portal_with_ip_input.py
This commit is contained in:
commit
6d825148a7
|
@ -0,0 +1,122 @@
|
|||
import os
|
||||
import subprocess
|
||||
from http.server import SimpleHTTPRequestHandler, HTTPServer
|
||||
|
||||
def get_ip_range():
|
||||
"""Automatically detect or manually specify the IP range."""
|
||||
try:
|
||||
# Automatically detect the IP range
|
||||
result = subprocess.run(["ip", "route"], capture_output=True, text=True)
|
||||
for line in result.stdout.splitlines():
|
||||
if "src" in line:
|
||||
ip_range = line.split()[0] # Extract the IP range (e.g., 192.168.0.0/24)
|
||||
return ip_range
|
||||
raise Exception("IP range detection failed.")
|
||||
except Exception as e:
|
||||
print(f"Error detecting IP range: {e}")
|
||||
# Prompt the user to enter the IP range manually
|
||||
return input("Enter your network IP range (e.g., 10.0.0.0/24): ")
|
||||
|
||||
def setup_iptables(server_ip, ip_range):
|
||||
"""Configure iptables to redirect HTTP traffic to the warning page."""
|
||||
os.system("sudo iptables -t nat -F")
|
||||
os.system(f"sudo iptables -t nat -A PREROUTING -p tcp -s {ip_range} --dport 80 -j DNAT --to-destination {server_ip}:80")
|
||||
os.system("sudo iptables -t nat -A POSTROUTING -j MASQUERADE")
|
||||
|
||||
def clear_iptables():
|
||||
"""Clear iptables rules."""
|
||||
os.system("sudo iptables -t nat -F")
|
||||
|
||||
def create_warning_page(message, content_type, content_path=None):
|
||||
"""Create an HTML file with the warning message and optional content."""
|
||||
with open("index.html", "w") as f:
|
||||
f.write(f"""
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Warning</title>
|
||||
<style>
|
||||
body {{
|
||||
font-family: Arial, sans-serif;
|
||||
text-align: center;
|
||||
padding: 50px;
|
||||
}}
|
||||
h1 {{
|
||||
color: red;
|
||||
}}
|
||||
img {{
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
}}
|
||||
video {{
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
}}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Attention!</h1>
|
||||
<p>{message}</p>
|
||||
""")
|
||||
if content_type == "image":
|
||||
f.write(f'<img src="{content_path}" alt="Warning Image">')
|
||||
elif content_type == "video":
|
||||
f.write(f'<video controls autoplay><source src="{content_path}" type="video/mp4">Your browser does not support the video tag.</video>')
|
||||
f.write("""
|
||||
</body>
|
||||
</html>
|
||||
""")
|
||||
|
||||
def start_server():
|
||||
"""Start the HTTP server to serve the warning page."""
|
||||
server_address = ('', 80)
|
||||
httpd = HTTPServer(server_address, SimpleHTTPRequestHandler)
|
||||
print("Captive portal is active. Press Ctrl+C to stop.")
|
||||
try:
|
||||
httpd.serve_forever()
|
||||
except KeyboardInterrupt:
|
||||
print("\nStopping server...")
|
||||
httpd.server_close()
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
# Get the message from the user
|
||||
message = input("Enter the warning message to display: ")
|
||||
print("Choose the content type:")
|
||||
print("1. Text only")
|
||||
print("2. Image")
|
||||
print("3. Video")
|
||||
content_choice = input("Enter your choice (1/2/3): ")
|
||||
|
||||
content_type = None
|
||||
content_path = None
|
||||
if content_choice == "2":
|
||||
content_type = "image"
|
||||
content_path = input("Enter the path to the image file: ")
|
||||
elif content_choice == "3":
|
||||
content_type = "video"
|
||||
content_path = input("Enter the path to the video file (MP4 format): ")
|
||||
|
||||
create_warning_page(message, content_type, content_path)
|
||||
|
||||
# Get the IP address of the Linux machine
|
||||
server_ip = os.popen("hostname -I").read().strip().split()[0]
|
||||
print(f"Server IP: {server_ip}")
|
||||
|
||||
# Get the IP range of the network
|
||||
ip_range = get_ip_range()
|
||||
print(f"Detected/Entered IP Range: {ip_range}")
|
||||
|
||||
# Set up iptables for redirection
|
||||
setup_iptables(server_ip, ip_range)
|
||||
|
||||
# Start the HTTP server
|
||||
start_server()
|
||||
except Exception as e:
|
||||
print(f"Error: {e}")
|
||||
finally:
|
||||
# Clear iptables rules when the program exits
|
||||
clear_iptables()
|
||||
print("Iptables rules cleared.")
|
Loading…
Reference in New Issue