[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

How can I get the local machine's netmask programmatically?

wolfram

6/13/2007 8:28:00 PM

I'm working on a Rails app that needs to restrict certain privileged
operations/requests to only those requests that originate from within
the local subnet.

How can I find out the machine's netmask programmatically?

Thanks,

Wolf

7 Answers

Jano Svitok

6/13/2007 9:09:00 PM

0

On 6/13/07, wolfram <wolframarnold@gmail.com> wrote:
> I'm working on a Rails app that needs to restrict certain privileged
> operations/requests to only those requests that originate from within
> the local subnet.
>
> How can I find out the machine's netmask programmatically?

Hi,

what operating system? windows/linux(distribution?)/osx?
how many network adapters are in the machine?

on windows use `ipconfig /all` and parse output or WMI through Win32OLE
on unix `/sbin/ifconfig -a`

If there are more adapters, you have to choose the right one (or allow
all local nets).

J.

wolfram

6/13/2007 10:45:00 PM

0

> what operating system? windows/linux(distribution?)/osx?
> how many network adapters are in the machine?

Linux.

> on windows use `ipconfig /all` and parse output or WMI through Win32OLE
> on unix `/sbin/ifconfig -a`

I know about the system commands. Is there a library/API to get these
programmatically without having to parse output from a sytem command?

Thanks,
W.

Reid Thompson

6/13/2007 11:30:00 PM

0

On Thu, 2007-06-14 at 07:45 +0900, wolfram wrote:
> > what operating system? windows/linux(distribution?)/osx?
> > how many network adapters are in the machine?
>
> Linux.
>
> > on windows use `ipconfig /all` and parse output or WMI through Win32OLE
> > on unix `/sbin/ifconfig -a`
>
> I know about the system commands. Is there a library/API to get these
> programmatically without having to parse output from a sytem command?
>
> Thanks,
> W.
>
Create a socket and pull it from the socket structure.


Reid Thompson

6/14/2007 1:18:00 AM

0

On Thu, 2007-06-14 at 08:30 +0900, Reid Thompson wrote:
> On Thu, 2007-06-14 at 07:45 +0900, wolfram wrote:
> > > what operating system? windows/linux(distribution?)/osx?
> > > how many network adapters are in the machine?
> >
> > Linux.
> >
> > > on windows use `ipconfig /all` and parse output or WMI through Win32OLE
> > > on unix `/sbin/ifconfig -a`
> >
> > I know about the system commands. Is there a library/API to get these
> > programmatically without having to parse output from a sytem command?
> >
> > Thanks,
> > W.
> >
> Create a socket and pull it from the socket structure.
>
see if this works....????

rthompso@shienar ~ $ cat getnetmask.rb
require 'rubygems'
require "inline"

class NetMask
inline do |builder|
builder.include '<sys/types.h>'
builder.include '<sys/socket.h>'
builder.include '<sys/ioctl.h>'
builder.include '<netinet/in.h>'
builder.include '<net/if.h>'
builder.c "

char * nmask() {
int fd;
struct ifreq ifr;

fd = socket(AF_INET, SOCK_DGRAM, 0);
ifr.ifr_addr.sa_family = AF_INET;
strncpy(ifr.ifr_name, \"eth0\", IFNAMSIZ-1);
ioctl(fd, SIOCGIFNETMASK, &ifr);
close(fd);

return (char *)inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr);
}"
end
end

nm = NetMask.new()
nmaa = nm.nmask()
puts nmaa

rthompso@shienar ~ $ ruby getnetmask.rb
255.255.255.0



list. rb

6/14/2007 4:49:00 PM

0

I spent quite a bit of time last night trying to figure this out to no
avail.

Reid, how long did it take you to come up with this? Could anyone
without C experience figured this out?

On Jun 13, 9:18 pm, Reid Thompson <Reid.Thomp...@ateb.com> wrote:
> On Thu, 2007-06-14 at 08:30 +0900, Reid Thompson wrote:
> > On Thu, 2007-06-14 at 07:45 +0900, wolfram wrote:
> > > > what operating system? windows/linux(distribution?)/osx?
> > > > how many network adapters are in the machine?
>
> > > Linux.
>
> > > > on windows use `ipconfig /all` and parse output or WMI through Win32OLE
> > > > on unix `/sbin/ifconfig -a`
>
> > > I know about the system commands. Is there a library/API to get these
> > > programmatically without having to parse output from a sytem command?
>
> > > Thanks,
> > > W.
>
> > Create a socket and pull it from the socket structure.
>
> see if this works....????
>
> rthompso@shienar ~ $ cat getnetmask.rb
> require 'rubygems'
> require "inline"
>
> class NetMask
> inline do |builder|
> builder.include '<sys/types.h>'
> builder.include '<sys/socket.h>'
> builder.include '<sys/ioctl.h>'
> builder.include '<netinet/in.h>'
> builder.include '<net/if.h>'
> builder.c "
>
> char * nmask() {
> int fd;
> struct ifreq ifr;
>
> fd = socket(AF_INET, SOCK_DGRAM, 0);
> ifr.ifr_addr.sa_family = AF_INET;
> strncpy(ifr.ifr_name, \"eth0\", IFNAMSIZ-1);
> ioctl(fd, SIOCGIFNETMASK, &ifr);
> close(fd);
>
> return (char *)inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr);
> }"
> end
> end
>
> nm = NetMask.new()
> nmaa = nm.nmask()
> puts nmaa
>
> rthompso@shienar ~ $ ruby getnetmask.rb
> 255.255.255.0


Reid Thompson

6/14/2007 5:22:00 PM

0

On Fri, 2007-06-15 at 01:48 +0900, list.rb@gmail.com wrote:
> I spent quite a bit of time last night trying to figure this out to no
> avail.
>
> Reid, how long did it take you to come up with this? Could anyone
> without C experience figured this out?
>
> >
> > see if this works....????
> >
> > rthompso@shienar ~ $ cat getnetmask.rb
> > require 'rubygems'
> > require "inline"
> >
> > class NetMask
> > inline do |builder|
> > builder.include '<sys/types.h>'
> > builder.include '<sys/socket.h>'
> > builder.include '<sys/ioctl.h>'
> > builder.include '<netinet/in.h>'
> > builder.include '<net/if.h>'
> > builder.c "
> >
> > char * nmask() {
> > int fd;
> > struct ifreq ifr;
> >
> > fd = socket(AF_INET, SOCK_DGRAM, 0);
> > ifr.ifr_addr.sa_family = AF_INET;
> > strncpy(ifr.ifr_name, \"eth0\", IFNAMSIZ-1);
> > ioctl(fd, SIOCGIFNETMASK, &ifr);
> > close(fd);
> >
> > return (char *)inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr);
> > }"
> > end
> > end
> >
> > nm = NetMask.new()
> > nmaa = nm.nmask()
> > puts nmaa
> >
> > rthompso@shienar ~ $ ruby getnetmask.rb
> > 255.255.255.0
>

1) I was previously aware of RubyInline -- so didn't have to
'find/research' it

2) I knew that getting the info in C code was doable
3) I googled for examples of getting socket info
4) it took me about 15 minutes probably

4a) I think a non-C programmer could have figured it out in time
I basically copied the C RubyInline example ( the factorial one )
and pasted in the socket code.

The gotcha's would probably have been
a)figuring out to use the builder.include, described in the C++
example, to get the header files included
b)getting rid of a warning message due to the original C code not
casting to (char *) the return value of inet_ntoa()

5) Ruby's various socket classes probably provide access to the same
info - but I couldn't find out how to get at it ( like you, I spent
waaaay more time trying to find a pure ruby way of getting the info than
coding the example ) i.e. Ruby's Socket class has a getsockname which
returns the struct sockaddr packed into a string -- It may have all the
info needed, but I'm not familiar enough with unpacking a sockaddr
structure to try to figure it out ( or unpacking anything in Ruby for
that matter :) ).


Reid Thompson

6/14/2007 5:44:00 PM

0

On Fri, 2007-06-15 at 01:48 +0900, list.rb@gmail.com wrote:
> I spent quite a bit of time last night trying to figure this out to no
> avail.
>
> Reid, how long did it take you to come up with this? Could anyone
> without C experience figured this out?
>
> On Jun 13, 9:18 pm, Reid Thompson <Reid.Thomp...@ateb.com> wrote:
> > On Thu, 2007-06-14 at 08:30 +0900, Reid Thompson wrote:
> > > On Thu, 2007-06-14 at 07:45 +0900, wolfram wrote:
> > > > > what operating system? windows/linux(distribution?)/osx?
> > > > > how many network adapters are in the machine?
> >
> > > > Linux.
> >
> > > > > on windows use `ipconfig /all` and parse output or WMI through Win32OLE
> > > > > on unix `/sbin/ifconfig -a`
> >
> > > > I know about the system commands. Is there a library/API to get these
> > > > programmatically without having to parse output from a sytem command?
> >
> > > > Thanks,
> > > > W.
> >
> > > Create a socket and pull it from the socket structure.
> >
> > see if this works....????
> >
> > rthompso@shienar ~ $ cat getnetmask.rb
> > require 'rubygems'
> > require "inline"
> >
> > class NetMask
> > inline do |builder|
> > builder.include '<sys/types.h>'
> > builder.include '<sys/socket.h>'
> > builder.include '<sys/ioctl.h>'
> > builder.include '<netinet/in.h>'
> > builder.include '<net/if.h>'
> > builder.c "
> >
> > char * nmask() {
> > int fd;
> > struct ifreq ifr;
> >
> > fd = socket(AF_INET, SOCK_DGRAM, 0);
> > ifr.ifr_addr.sa_family = AF_INET;
> > strncpy(ifr.ifr_name, \"eth0\", IFNAMSIZ-1);
> > ioctl(fd, SIOCGIFNETMASK, &ifr);
> > close(fd);
> >
> > return (char *)inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr);
> > }"
> > end
> > end
> >
> > nm = NetMask.new()
> > nmaa = nm.nmask()
> > puts nmaa
> >
> > rthompso@shienar ~ $ ruby getnetmask.rb
> > 255.255.255.0
>

http://www.hashcode.et... makes an interesting read also