[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

cidr.rb: port of Perl's Net::CIDR v0.11 available

Jos Backus

11/29/2006 7:43:00 AM

Module:

http://www.catnook.com/progra...

Simple test program:

http://www.catnook.com/programs/c...

Not sure about the license. Hope this is useful to someone.

As an aside: anyone have a port of Net::Ping they are willing to share? I'm
trying to convert some code (and colleagues!) to Ruby and am running into the
"missing libraries" issue...

--
Jos Backus
jos at catnook.com

16 Answers

Dave Burt

11/29/2006 8:41:00 AM

0

Hi,

> As an aside: anyone have a port of Net::Ping they are willing to share? I'm
> trying to convert some code (and colleagues!) to Ruby and am running into the
> "missing libraries" issue...

Check the RAA (and Rubyforge).

For ping, there is 'ping' in the standard library, and 'net/ping' on the
RAA ('gem install net-ping').

Pat Eyler wrote in May about pushing an ICMP-capable version of net/ping
into the standard library for 1.8.6.

Cheers,
Dave

Daniel Berger

11/29/2006 4:03:00 PM

0

Dave Burt wrote:
> Hi,
>
> > As an aside: anyone have a port of Net::Ping they are willing to share? I'm
> > trying to convert some code (and colleagues!) to Ruby and am running into the
> > "missing libraries" issue...
>
> Check the RAA (and Rubyforge).
>
> For ping, there is 'ping' in the standard library, and 'net/ping' on the
> RAA ('gem install net-ping').
>
> Pat Eyler wrote in May about pushing an ICMP-capable version of net/ping
> into the standard library for 1.8.6.
>
> Cheers,
> Dave

Indeed, Pat talked to me about possibly including net-ping in the
standard lib, though it needs a PingICMP class. It could probably
stand a bit of reorganization, too.

In fact, I still have some code laying around that Sean Chittenden sent
to me a long time ago. Maybe it's time to revisit that. :)

Regards,

Dan

pat eyler

11/29/2006 4:11:00 PM

0

On 11/29/06, Daniel Berger <djberg96@gmail.com> wrote:
> Dave Burt wrote:
> > For ping, there is 'ping' in the standard library, and 'net/ping' on the
> > RAA ('gem install net-ping').

ugh! I hate ping.

> >
> > Pat Eyler wrote in May about pushing an ICMP-capable version of net/ping
> > into the standard library for 1.8.6.
> >
> > Cheers,
> > Dave
>
> Indeed, Pat talked to me about possibly including net-ping in the
> standard lib, though it needs a PingICMP class. It could probably
> stand a bit of reorganization, too.
>

I've actually done some work on the code, but it's in need of some
documentation and a bit more polish. The ICMP ping still needs
to be integrated as well.

I just have more ambition than time, talent, and energy. :(

> In fact, I still have some code laying around that Sean Chittenden sent
> to me a long time ago. Maybe it's time to revisit that. :)
>
> Regards,
>
> Dan
>
>
>


--
thanks,
-pate
-------------------------
http://on-ruby.bl...

Jos Backus

11/29/2006 5:58:00 PM

0

Hi Dave,

On Wed, Nov 29, 2006 at 05:35:13PM +0900, Dave Burt wrote:
> Hi,
>
> > As an aside: anyone have a port of Net::Ping they are willing to share? I'm
> > trying to convert some code (and colleagues!) to Ruby and am running into the
> > "missing libraries" issue...
>
> Check the RAA (and Rubyforge).
>
> For ping, there is 'ping' in the standard library, and 'net/ping' on the
> RAA ('gem install net-ping').

I'm aware of those but they lack some features the Perl version has. Notably
ICMP support and returning timing information.

It would also be nice for there to be a single Net::Ping class, just like the
Perl version provides, wrapping/hiding the specialized classes. That seems
like an easy addition.

> Pat Eyler wrote in May about pushing an ICMP-capable version of net/ping
> into the standard library for 1.8.6.

/me crosses fingers...

Cheers,
--
Jos Backus
jos at catnook.com

Dave Burt

11/29/2006 9:31:00 PM

0

pat eyler wrote:
>> Dave Burt wrote:
>> > For ping, there is 'ping' in the standard library, and 'net/ping' on
>> the
>> > RAA ('gem install net-ping').
>
> ugh! I hate ping.
>
> On 11/29/06, Daniel Berger <djberg96@gmail.com> wrote:
>> Indeed, Pat talked to me about possibly including net-ping in the
>> standard lib, though it needs a PingICMP class. It could probably
>> stand a bit of reorganization, too.
>
> I've actually done some work on the code, but it's in need of some
> documentation and a bit more polish. The ICMP ping still needs
> to be integrated as well.
>
> I just have more ambition than time, talent, and energy. :(

It sounds simple enough for a Ruby Quiz. Then we'd have not two, but a
dozen versions, possibly including a Net::Ping-interfaced one for Jos!

Dave

James Gray

11/29/2006 9:41:00 PM

0

On Nov 29, 2006, at 3:25 PM, Dave Burt wrote:

> pat eyler wrote:
>>> Dave Burt wrote:
>>>> For ping, there is 'ping' in the standard library, and 'net/
>>>> ping' on
>>> the
>>>> RAA ('gem install net-ping').
>>
>> ugh! I hate ping.
>>
>> On 11/29/06, Daniel Berger <djberg96@gmail.com> wrote:
>>> Indeed, Pat talked to me about possibly including net-ping in the
>>> standard lib, though it needs a PingICMP class. It could probably
>>> stand a bit of reorganization, too.
>>
>> I've actually done some work on the code, but it's in need of some
>> documentation and a bit more polish. The ICMP ping still needs
>> to be integrated as well.
>>
>> I just have more ambition than time, talent, and energy. :(
>
> It sounds simple enough for a Ruby Quiz. Then we'd have not two, but a
> dozen versions, possibly including a Net::Ping-interfaced one for Jos!

I'm a huge fan of using the Ruby Quiz to improve libraries like
this. I'm a Ping Dummy, so you guys put your heads together and
write up something that explains the goals and if I can understand
them, we've got a winner.

It takes a lot less time, talent, and energy to define the problem
well enough to get help from the whole community and the results
never cease to dazzle me...

James Edward Gray II


Daniel Berger

11/30/2006 3:21:00 PM

0

Jos Backus wrote:
> Hi Dave,
>
> On Wed, Nov 29, 2006 at 05:35:13PM +0900, Dave Burt wrote:
>
>> Hi,
>>
>>
>>> As an aside: anyone have a port of Net::Ping they are willing to share? I'm
>>> trying to convert some code (and colleagues!) to Ruby and am running into the
>>> "missing libraries" issue...
>>>
>> Check the RAA (and Rubyforge).
>>
>> For ping, there is 'ping' in the standard library, and 'net/ping' on the
>> RAA ('gem install net-ping').
>>
>
> I'm aware of those but they lack some features the Perl version has. Notably
> ICMP support and returning timing information.
>
Well, there is PingExternal for ICMP support. ;)

Seriously, though, both would be good additions.
> It would also be nice for there to be a single Net::Ping class, just like the
> Perl version provides, wrapping/hiding the specialized classes. That seems
> like an easy addition.
>
The API was modelled after the current ping.rb in the standard library
to try to keep things consistant and more portable for anyone switching
from ping.rb to my net-ping module. A factory pattern should be doable
if that's what folks want. In practice, however, I don't see it as a
major issue, and probably not worth the API breakage.

Regards,

Dan

Jos Backus

11/30/2006 5:35:00 PM

0

On Fri, Dec 01, 2006 at 12:20:36AM +0900, Daniel Berger wrote:
[snip]
> >I'm aware of those but they lack some features the Perl version has.
> >Notably
> >ICMP support and returning timing information.
> >
> Well, there is PingExternal for ICMP support. ;)
>
> Seriously, though, both would be good additions.

Indeed.

> >It would also be nice for there to be a single Net::Ping class, just like
> >the
> >Perl version provides, wrapping/hiding the specialized classes. That seems
> >like an easy addition.
> >
> The API was modelled after the current ping.rb in the standard library
> to try to keep things consistant and more portable for anyone switching
> from ping.rb to my net-ping module. A factory pattern should be doable
> if that's what folks want. In practice, however, I don't see it as a
> major issue, and probably not worth the API breakage.

It eases the transition from Perl, as in my case. If you mean something like
the following then that would be great:

lizzy:/tmp% cat r
class Ping
def self.create(type, *args)
case type
when :foo
FooPing.new
when :bar
BarPing.new
end
end
end

class FooPing < Ping
def ping(host)
puts "#{self.class}: pinging #{host}"
end
end

class BarPing < Ping
def ping(host)
puts "#{self.class}: pinging #{host}"
end
end

pinger = Ping.create(:bar)
pinger.ping("myhost")
lizzy:/tmp% ruby r
BarPing: pinging myhost
lizzy:/tmp%

Let me know what I can do to help move this along.

--
Jos Backus
jos at catnook.com

Daniel Berger

11/30/2006 7:47:00 PM

0

Jos Backus wrote:

<snip>
>> r issue, and probably not worth the API breakage.
>>
>
> It eases the transition from Perl, as in my case. If you mean something like
> the following then that would be great:
>
> lizzy:/tmp% cat r
> class Ping
> def self.create(type, *args)
> case type
> when :foo
> FooPing.new
> when :bar
> BarPing.new
> end
> end
> end
>
> class FooPing < Ping
> def ping(host)
> puts "#{self.class}: pinging #{host}"
> end
> end
>
> class BarPing < Ping
> def ping(host)
> puts "#{self.class}: pinging #{host}"
> end
> end
>
> pinger = Ping.create(:bar)
> pinger.ping("myhost")
> lizzy:/tmp% ruby r
> BarPing: pinging myhost
> lizzy:/tmp%
>
> Let me know what I can do to help move this along.
>
>
Well, you could start by porting the ping_icmp() function from Ping.pm
to Ruby. I started working on it but I got stuck and I need to work on
other things. Below is what I've got so far:

require 'net/ping'

module Net
class Ping::ICMP < Ping

ICMP_ECHOREPLY = 0
ICMP_ECHO = 8
ICMP_SUBCODE = 0
ICMP_FLAGS = 0
ICMP_PORT = 0

def initialize(*args)
super(args)
raise 'requires root privileges' if Process.euid > 0 # unsure
@seq = 0
@data_size = 0
@data = ""
end

def checksum(msg)
length = msg.length
num_short = length / 2
check = 0

msg.unpack("n#{num_short}").each do |short|
check += short
end

if length % 2 > 0
check += msg[length-1, 1].unpack('C') << 8
end

check = (check >> 16) + (check & 0xffff)
return (~((check >> 16) + check) & 0xffff)
end

def ping
socket = Socket.new(
Socket::PF_INET,
Socket::SOCK_RAW,
Socket::IPPROTO_ICMP
)

@seq = (@seq + 1) % 65536
checksum = 0

pstring = "C2 n3 A" << @data_size.to_s
pid = Process.pid

msg = [ICMP_ECHO, ICMP_SUBCODE, checksum, pid, @seq,
@data].pack(pstring)
# TODO: finish
end
end
end

Regards,

Dan

Jos Backus

12/1/2006 7:41:00 PM

0

On Fri, Dec 01, 2006 at 04:47:05AM +0900, Daniel Berger wrote:
> Well, you could start by porting the ping_icmp() function from Ping.pm
> to Ruby. I started working on it but I got stuck and I need to work on
> other things. Below is what I've got so far:

I've made some progress; see attached. Let me know what you think.

--
Jos Backus
jos at catnook.com