#! /usr/bin/env python
# -*- coding: utf-8 -*-

#==========================================================
# scanhost.py - script para el uso del módulo nmap
#----------------------------------------------------------
# FJA - fja@neocipres.com           Mayo de 2015 (17/12/15)
#==========================================================

import sys
import argparse
import nmap    

descripcion = ('%(prog)s es un ejemplo para el uso del módulo nmap')
parser = argparse.ArgumentParser(description=descripcion)

parser.add_argument('-H', '--host',  \
                    help='IP del host a escanear, por defecto 127.0.0.1', \
                    type=str, default='127.0.0.1')

parser.add_argument('-P', '--puerto',  \
                    help='Puerto final de escaneo, por defecto es el 443', \
                    type=str, default='443')

parser.add_argument('-p', '--ping',  \
                    help='Activa el ping sobre la red', \
                    action='store_true', default=False)
                    
args = parser.parse_args()

pts = '21-' + args.puerto

try:
    nm = nmap.PortScanner()         
except nmap.PortScannerError:
    print('Nmap no encontrado', sys.exc_info()[0])
    sys.exit(0)
except:
    print("Error:", sys.exc_info()[0])
    sys.exit(0)


def raya(n, ca='='):
    rep = lambda p: p[0]*p[1]
    return rep((n, ca))
    
def scan(host, puertos):
    try:
        nm.scan(host, puertos)
        nm.command_line() 
        nm.scaninfo()
        print '\n',  raya(60, '#')
        print('Host : %s (%s)' % (host, nm[host].hostname()))
        print('Estado: %s' % nm[host].state())
        print raya(60)
        for proto in nm[host].all_protocols():
            print('Protocolo: %s' % proto)
            print raya(60, '-')
            lport = nm[host][proto].keys()
            lport.sort()
            for port in lport:
                print('puerto: %s\testado: %s' % \
                  (port, nm[host][proto][port]['state']))
        print raya(60, '#'),  '\n'
    except:
        print '\n\t'
        print 'Error: ', sys.exc_info()[0]
        sys.exit(0)
           
        
def ping(host):
    hosts = host + '/24'
    try:
        nm.scan(hosts, arguments='-n -sP -PE -PA21,23,80,3389')
        hosts_list = [(x, nm[x]['status']['state']) for x in nm.all_hosts()]
        print '\n Comenzando ping a la red %s' % (hosts)
        print raya(60)
        for host, status in hosts_list:
            print('{0}: {1}'.format(host, status))
        print raya(60, '#'),  '\n'
    except:
        print '\n\t'
        print 'Error: ', sys.exc_info()[0]
        sys.exit(0)

if __name__ == '__main__':
    scan(args.host, pts)
    if args.ping:
        ping(args.host)