import sys
import socket
from convert import *

def Args(args):
    '''handle arguments
    Parameters:
        args    -- arguments
    returns:
        command -- command (scan, ping, trace)
        hosts   -- hosts ('192.168.24.7', '10.0.0.0/8')
    '''
    command = 'scan'
    hosts = ''
    if len(args)==2:
        command = args[0]
        hosts = args[1]
    elif len(args)==1:
        hosts = args[0]
    else:
        raise SyntaxError('nscan.py ping example.com')  
    return hosts, command

def Hosts(host_list):
    '''
    input:
        host_list   -- hosts to scan ('10.0.0.0/8','10.0.0.0-10.255.255.255','192.168.1.23')
    output:
        hosts range -- start and end ip address (['10.0.0.0','10.255.255.255'])
    '''
    hosts = []
    if '/' in host_list:
        start, cidr = host_list.split('/')
        start = dot2dec(start) # start is the first ip address
        cidr = int(cidr)
        mask = int('1'*cidr + '0'*(32-cidr), 2)
        network_field = start & mask # fixed part
        host_field = 0xffffffff ^ mask  # variable part
        end = network_field | host_field # end is the last ip address
        hosts = [start, end+1]
    elif '-' in host_list:
        start, end = host_list.split('-')
        hosts = [dot2dec(start), dot2dec(end)+1]
    else:
        hosts = [dot2dec(host_list), dot2dec(host_list)+1]
    return hosts
    
def Ports(port_list):
    '''ports handler
    parameters:
        args    -- ports ('21-25,80,443')
    returns:
        ports   -- [[21, 25], [80], [443]]
    '''
    port_range = []
    if port_list:
        ports = port_list.replace(' ', '')
        ports = ports.split(',')
        for i in range(len(ports)):
            ports[i] = ports[i].split('-')
        for i in ports:
            if len(i)==1:
                port_range.append([int(i[0]), int(i[0])+1])
            else:
                port_range.append( [ int(i[0]), int(i[1])+1 ] )
    else:
        raise SyntaxError('-p, --port=21-25,80,443')
    return port_range

def Network():
    '''
        send a dns query and capture response packet
        Output:
            ifname: interface name
            ifaddr: interface ip address
            ifmac: interface mac address
            gateway: router mac address
    '''
    sniff = socket.socket(socket.AF_PACKET,
                        socket.SOCK_RAW,
                        socket.htons(0x800))
    while True:
        try:
            socket.gethostbyname('www.google.com')
            data, sa_ll = sniff.recvfrom(65535)
            if sa_ll[2] == socket.PACKET_HOST and sa_ll[0]!='lo':
                break
        except:
            print 'Check your internet connection'
            sniff.close()
            sys.exit()
    sniff.close()

    ifname = sa_ll[0] # interface name
    if 'ppp' in ifname:
        ifmac = mac2byte('00:00:00:00:00:00')
        gateway = mac2byte('00:00:00:00:00:00')
        IPHI = 0    # for ppp interfaces
    else:
        ifmac = data[:6] # interface mac address
        gateway = data[6:12] # gateway mac address
        IPHI = 14   # for eth interfaces
    ifaddr = socket.inet_ntoa(data[IPHI+16:IPHI+20]) # interface ip address
    return ifname, ifaddr, ifmac, gateway

def Imports(arg):
    '''
        Returns tuple of script name and port numbers
    '''
    if arg:
        imports = {}
        arg = arg.split('+')
        for i in range(len(arg)):
            arg[i] = arg[i].split(':')
        for i in arg:
            imports[i[0]] = Ports(i[1])
        return imports
    else:
        return None

def CoolDown(arg):
    npacket, sleep = arg.split(',')
    return int(npacket), float(sleep)