From: Glen Holcomb Date: 2008-09-19T05:53:33+09:00 Subject: Re: Reliable ping method from Windows? ------=_Part_7214_21789375.1221771671045 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline On Thu, Sep 18, 2008 at 2:09 PM, Glen Holcomb wrote: > Is there a reliable "Ruby" method for pinging/checking whether hosts are > up? > > I have been using Net::PingExternal as I'm pinging Windows machines and not > all of them have port 7 open. However when I try to check 900 or so > machines I get a SocketError after a while. It complains that there is no > such service echo/tcp. When I try similar code in irb I get the socket > error after a few minutes then if I try the loop again I get the socket > error immediately. > > I've tried a generic ICMP packet but that doesn't work under Windows with > the standard Ruby build and I don't have the tools/time to build it my self > under Windows. > > -- > "Hey brother Christian with your high and mighty errand, Your actions speak > so loud, I can't hear a word you're saying." > > -Greg Graffin (Bad Religion) > Here is the full method if anyone wants more context: # Lets find MAC addresses for the machines in the list def find_macs # This technique will only give MAC addresses for the machines on our subnet. # However since those are the only ones we can wake it doesn't really matter. # It is nasty slow and a better way should be found some day. DB[:computers].each do |computer| begin Net::PingExternal.new(computer[:name]).ping rescue SocketError => exception next end end arp_table = `arp -a`.split("\n")[2..-1] arp_table.each do |address| full_name = Socket.gethostbyname(address.split(' ')[0]) comp = Computer.find :name => full_name.split('.')[0] comp.mac = address.split(' ')[1].gsub!('-', ':') comp.save end close() end # find_macs -- "Hey brother Christian with your high and mighty errand, Your actions speak so loud, I can't hear a word you're saying." -Greg Graffin (Bad Religion) ------=_Part_7214_21789375.1221771671045--