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

#==============================================================================
# ipscan: ping a una red usando fping
#------------------------------------------------------------------------------
# FJA - fja@neocipres.com                            Septiembre 2017
#==============================================================================

import sys
import subprocess


__uso__ = '''
            ============================================================
              ipscan <IP inicio> <IP final> [opciones de fping]
            ============================================================
            \n'''

__info__ = '''
     Algunas opciones de fping:
    -----------------------------------------------------------------
      -cn -> para establecer el número n de ping que enviamos
      -rn -> número n de reintentos
      -bn -> cantidad de datos para enviar, n en bytes
      -e  -> muestra el tiempo transcurrido de los paquetes de vuelta
      -s  -> muestra un informe
      -n  -> muestra los host por nombre
      -A  -> muestra la IP asociada a la dirección de un host
    -----------------------------------------------------------------
\n'''

if len(sys.argv) <= 2:
    print __uso__
    print __info__
    sys.exit(1)

try:
    ip0 = sys.argv[1]
    ip1 = sys.argv[2]
    listaop = ''
    if len(sys.argv) == 3:
            listaop = '-c1 -r1 -s'

    elif len(sys.argv) > 3:
        opfping = sys.argv[3:]
        for op in opfping:
            listaop = listaop + op + ' '

    if listaop.find('-u') != -1:
        listaop = listaop.replace('-u', '')

    cmd = 'fping' + ' ' + listaop + ' -g ' + ip0 + ' ' + ip1
    proc = subprocess.Popen(cmd,
            shell=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,  # PIPE STDOUT
            universal_newlines=True)

    out, err = proc.communicate()
    err = err.splitlines()
    for linea in err:
        if ('ICMP' not in linea) and ('loss' not in linea):
            print linea

    print '\n IPs activas:'
    print '-' * 60
    print out

except KeyboardInterrupt, ki:
        subprocess.call('clear', shell=True)
        print "\n\tError:", repr(ki)
        print("\n\t script interrumpido por el usuario.")
        print "\n", __uso__, "\n"
        sys.exit(1)

except Exception as e:
    print '\n\t'
    print '\t Error: ', e, sys.exc_info()[0], '\n'
    print __uso__
