Your problem is that there is way too much nesting within your
methods. You lost track of which "end" maps to which "do" and "begin"
in numerous places. As a general rule, if you're nesting more than
two levels deep within a method, you just made your method a lot more
difficult to maintain. The below version fixes your nesting issues
(but does not correct them for maintainability).
require 'socket'
require 'timeout'
class Scanner
def initialize
@hosts,@ports = Array($*)
end
def portarrange
case @ports
when /^.+[..]/
@ports = @ports.split("..")
@ports = @ports[0].to_i..@ports[1].to_i
when /^.+[,]/
@ports = @ports.split(",")
else
@ports = Array(@ports)
end
end
def hostarrange
case @hosts
when /^.+[,]/
@hosts = @hosts.split(",")
else
@hosts = Array(@hosts)
end
end
def output(state,port)
printed = false
portsfile = File.new("ports", "r")
scanpat = "^.+ #{port}/tcp"
begin
portsfile.each_line do |line|
if line =~ Regexp.new(scanpat)
puts "#{state} : #{line}"
printed = true
end
puts "#{state} : #{port}" if printed == false
end
ensure
portsfile.close
end
end
def scanning(hosts,ports)
hosts.each do |host|
begin
puts "scanning #{host}:"
ports.each do |port|
begin
Timeout::timeout(10){TCPSocket.new(host, port)}
rescue Timeout::Error
output("filtered",port)
rescue
output("closed",port)
else
output("open",port)
end
end
end
end
end
end
##################### code start #####################
puts "no arguments past,correct usage:\nruby #{$0} [hosts] [ports]\n"
if
!ARGV[1]
my_scanner = Scanner.new
hosts = my_scanner.hostarrange
ports = my_scanner.portarrange
=begin
puts "debugging: "
puts hosts
puts ports
# everything alright until here
=end
my_scanner.scanning(hosts,ports)
##################### eof #####################