import socket
from termcolor import colored
import argparse
import threading
import signal
from concurrent.futures import ThreadPoolExecutor
import sys

socket_conexion=[]

def handler(sig, frame):
    print(colored("Saliendo del programa tingling", 'red'))

    for socket in socket_conexion:
        socket.close()
    sys.exit()

signal.signal(signal.SIGINT, handler)

# ARGUMENTOS Y PANEL DE AYUDA
def get_arguments():
    parser = argparse.ArgumentParser( description=' FAST TCP PORT SCANNER')
    parser.add_argument("-t", "--target",required=True ,dest="target", help="VICTIM TARGET TO SCAN")
    parser.add_argument("-p", "--port",required=True ,dest="port", help="PORT RANGE")
    options = parser.parse_args()
    return options.target, options.port
# ARGUMENTOS Y PANEL DE AYUDA
#lOGICA DE ESCANEO DE PUERTOS

    #CREACION DE LA CONECION POR SOCKET TCP
def make_connection():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(0.5)
    socket_conexion.append(s)
    return s
    #lOGICA DE ESCANEO DE PUERTOS

    #ESCANEO DE LOS PUERTOS
def port_scanner(port, target ):
    s=make_connection()
    try:
        s.connect((target,port))
        s.sendall(b"HEAD / HTTP/1.0 \\r\\n\\r\\n")
        response = s.recv(1024)
        response = response.decode(errors='ignore').split('\\n')
        if response:
            print(colored(f"El puerto //{port}// Esta abierto", "green"))
            for line in response:
                print(colored(f"{line}", "cyan"))
        else:
            print(colored(f"El puerto ||{port} esta abiero"))
    except (socket.timeout, ConnectionRefusedError):
        pass
    finally:
        s.close()
    #lOGICA DE ESCANEO DE PUERTOS

    #LLAMADA A LA CREACION DE LOS OBJETOS A ESCANEAR
def scan_port(ports, target):
    with ThreadPoolExecutor(max_workers=50) as executor:
        executor.map(lambda port: port_scanner(port, target), ports)

    #LLAMADA A LA CREACION DE LOS OBJETOS A ESCANEAR

    #LECTURA DEL PARAMETRO -P --PORTS
def port_interartor(port):
    if '-' in port:
        stard,end=map(int, port.split('-')) 
        return range(stard, end+1)
    elif ',' in port:
        return map(int, port.split(','))
    else:
        return (int(port),)
    #LECTURA DEL PARAMETRO -P --PORTS

#lOGICA DE ESCANEO DE PUERTOS

def main():
    target, port = get_arguments()
    ports = port_interartor(port)
    scan_port(ports, target)

if __name__=='__main__':
    main()