#!/usr/bin/ruby -w

#=======================================================
# ipscan.rb - script para detectar ip activas
#-------------------------------------------------------
# ipscan usa fping - http://fping.sourceforge.net/
#=======================================================
# FJA - neocipres@gmail.com 	Marzo de 2010
#=======================================================

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

cmd = ''
listaop = ''
listah = []
salida = ''

begin
 raise if ARGV.size < 2
 ip0 = ARGV[0]
 ip1 = ARGV[1]
 opfping = ARGV[2..-1]
 opfping.each{|opcion| listaop << opcion << " "}
 listaop = listaop.sub('-u','') if listaop.include?('-u')
 listaop = listaop.sub('-a','') if listaop.include?('-a')

 cmd << "fping #{listaop} -g #{ip0} #{ip1}" 
 salida = `#{cmd}` # En sustitución de system(cmd). Nos permite recoger la salida del comando y analizarla.
 salida.each{|host| listah << host.sub('is alive','') if host.include?('alive')}
 puts "\n IPs activas:"
 puts "#{"="*61} "
 if listaop.include?('-c')
  puts salida
 else
  print "\t", listah.join("\t")
 end
 puts "#{"="*61} "
 
rescue
 if ARGV.size < 2
	puts "\n\t #{"="*70} "
	puts "\t > Uso: ipscan <IP inicial> <IP final> [opciones de fping] \n" 
	puts "\n #{info}"
 	puts "\t #{"="*70} \n\n"
 else
 	print "\n\t Error-> ", $!, "\n\n"
	
 end

end