Untitled

 avatar
user_3431143
plain_text
a year ago
2.9 kB
1
Indexable
Never
import scapy.all as scapy 
import requests 
import json 
import time 
import os.path
import netifaces

WEBHOOK_URL = "https://your-webhook-url.com"
JSON_FILE = "devices.json"

def get_network_info():
    interfaces = netifaces.interfaces()
    for interface in interfaces:
        try:
            iface_data = netifaces.ifaddresses(interface)
            if iface_data.get(netifaces.AF_INET):
                ip_address = iface_data[netifaces.AF_INET][0]['addr']
                netmask = iface_data[netifaces.AF_INET][0]['netmask']
                network = netifaces.cidr_to_netmask(netmask)
                return ip_address, network
        except ValueError:
            pass
    return None, None

def get_ip_range(ip_address, network):
    ip_list = [int(i) for i in ip_address.split('.')]
    net_list = [int(i) for i in network.split('.')]
    start_ip = [str(ip_list[i] & net_list[i]) for i in range(4)]
    end_ip = [str((ip_list[i] & net_list[i]) | (~net_list[i] & 255)) for i in range(4)]
    return '.'.join(start_ip), '.'.join(end_ip)

def get_mac(ip):
    arp_request = scapy.ARP(pdst=ip)
    broadcast = scapy.Ether(dst="ff:ff:ff:ff:ff:ff")
    arp_request_broadcast = broadcast/arp_request
    answered_list = scapy.srp(arp_request_broadcast, timeout=1, verbose=False)[0]         
    return answered_list[0][1].hwsrc if answered_list else None

def scan_network():
    devices = []

    ip_address, network = get_network_info()
    if not ip_address:
        print("Could not determine network information.")
        return devices

    start_ip, end_ip = get_ip_range(ip_address, network)
    ip_range = f"{start_ip}-{end_ip}"

    arp_request = scapy.ARP(pdst=ip_range)
    broadcast = scapy.Ether(dst="ff:ff:ff:ff:ff:ff")
    arp_request_broadcast = broadcast/arp_request
    answered_list = scapy.srp(arp_request_broadcast, timeout=1, verbose=False)[0]

    for item in answered_list:
        mac_address = item[1].hwsrc
        ip_address = item[1].psrc
        device = {"ip": ip_address, "mac": mac_address, "status": "online"}
        devices.append(device)

    return devices

def send_webhook(devices):
    data = {"devices": devices}
    headers = {'Content-type': 'application/json'}

    response = requests.post(WEBHOOK_URL, data=json.dumps(data), headers=headers)

    if response.status_code == 200:
        print("Webhook sent successfully!")
    else:
        print(f"Failed to send webhook. Status code: {response.status_code}")

def save_devices(devices):
    with open(JSON_FILE, 'w') as f:
        json.dump(devices, f)

def load_devices():
    devices = []
    if os.path.isfile(JSON_FILE):
        with open(JSON_FILE, 'r') as f:
            try:
                devices = json.load(f)
            except json.JSONDecodeError:
                print(f"JSON file '{JSON_FILE}' is corrupt or empty.")
    return