|
Net::Ifconfig::Wrapper - provides a unified way to configure network interfaces on FreeBSD, OpenBSD, Solaris, Linux, OS X, and WinNT. |
Net::Ifconfig::Wrapper - provides a unified way to configure network interfaces on FreeBSD, OpenBSD, Solaris, Linux, OS X, and WinNT (from Win2K).
Version 0.09
#!/usr/local/bin/perl -w # uni-ifconfig.pl # The unified ifconfig command. # Works the same way on FreeBSD, OpenBSD, Solaris, Linux, OS X, WinNT (from Win2K). # Note: due of Net::Ifconfig::Wrapper limitations 'inet' and 'down' commands # are not working on WinNT. +/-alias are working, of course.
use strict;
use Net::Ifconfig::Wrapper;
my $Usage = << 'EndOfText';
uni-ifconfig.pl # Print this notice
uni-ifconfig.pl -a # Print info about all interfaces
uni-ifconfig.pl <iface> # Print info obout specified interface
uni-ifconfig.pl <iface> down
# Bring specified interface down
uni-ifconfig.pl <iface> inet <AAA.AAA.AAA.AAA> mask <MMM.MMM.MMM.MMM>
# Set the specified address on the specified interface
# and bring this interface up
uni-ifconfig.pl <iface> inet <AAA.AAA.AAA.AAA> mask <MMM.MMM.MMM.MMM> [+]alias
# Set the specified alias address
# on the specified interface
uni-ifconfig.pl <iface> inet <AAA.AAA.AAA.AAA> [mask <MMM.MMM.MMM.MMM>] -alias
# Remove specified alias address
# from the specified interface
EndOfText
my $Info = Net::Ifconfig::Wrapper::Ifconfig('list', '', '', '')
or die $@;
scalar(keys(%{$Info}))
or die "No one interface found. Something wrong?\n";
if (!scalar(@ARGV))
{
print $Usage;
exit 0;
}
if ($ARGV[0] eq '-a')
{
defined($ARGV[1])
and die $Usage;
foreach (sort(keys(%{$Info})))
{ print IfaceInfo($Info, $_); };
exit 0;
};
$Info->{$ARGV[0]}
or die "Interface '$ARGV[0]' is unknown\n";
if (!defined($ARGV[1]))
{
print IfaceInfo($Info, $ARGV[0]);
exit 0;
}
my $CmdLine = join(' ', @ARGV);
my $Result = undef;
if ($CmdLine =~ m/\A\s*([\w\{\}\-]+)\s+down\s*\Z/i)
{
$Result = Net::Ifconfig::Wrapper::Ifconfig('down', $1, '', '');
}
elsif ($CmdLine =~ m/\A\s*([\w\{\}\-]+)\s+inet\s+(\d{1,3}(?:\.\d{1,3}){3})\s+mask\s+(\d{1,3}(?:\.\d{1,3}){3})\s*\Z/i)
{
$Result = Net::Ifconfig::Wrapper::Ifconfig('inet', $1, $2, $3);
}
elsif ($CmdLine =~ m/\A\s*([\w\{\}\-]+)\s+inet\s+(\d{1,3}(?:\.\d{1,3}){3})\s+mask\s+(\d{1,3}(?:\.\d{1,3}){3})\s+\+?alias\s*\Z/i)
{
$Result = Net::Ifconfig::Wrapper::Ifconfig('+alias', $1, $2, $3);
}
elsif ($CmdLine =~ m/\A\s*([\w\{\}\-]+)\s+inet\s+(\d{1,3}(?:\.\d{1,3}){3})\s+(:?mask\s+(\d{1,3}(?:\.\d{1,3}){3})\s+)?\-alias\s*\Z/i)
{
$Result = Net::Ifconfig::Wrapper::Ifconfig('-alias', $1, $2, '');
}
else
{ die $Usage; };
$Result
or die $@;
exit 0;
sub IfaceInfo
{
my ($Info, $Iface) = @_;
my $Res = "$Iface:\t".($Info->{$Iface}{'status'} ? 'UP' : 'DOWN')."\n";
while (my ($Addr, $Mask) = each(%{$Info->{$Iface}{'inet'}}))
{ $Res .= sprintf("\tinet %-15s mask $Mask\n", $Addr); };
$Info->{$Iface}{'ether'}
and $Res .= "\tether ".$Info->{$Iface}{'ether'}."\n";
$Info->{$Iface}{'descr'}
and $Res .= "\tdescr '".$Info->{$Iface}{'descr'}."'\n";
return $Res;
};
This module provides a unified way to configure the network interfaces on FreeBSD, OpenBSD, Solaris, Linux, OS X, and WinNT (from Win2K) systems.
Only inet (IPv4) and ether (MAC) addresses are supported at the moment
On Unixes this module calls the system ifconfig command to perform the actions.
On Windows the functions from IpHlpAPI.DLL are called.
For all supported Unixes Net::Ifconfig::Wrapper expect ifconfig
command to be /sbin/ifconfig.
Module was tested on FreeBSD 4.7,4.8,5.3 (Intel), RedHat 6.2,7.3,8.0 (Intel), Win2000 Pro (Intel), OpenBSD 3.1 (SPARC), Solaris 7 (SPARC), OS X 10.3 (aka Panther), OS X 10.4 (aka Tiger).
In MSWin32 family only WinNT is supported. In WinNT family only Win2K or later is supported.
Ifconfig(Command, Interface, Address, Netmask);Net::Ifconfig::Wrapper module. Do all the job.
The particular action is described by the $Command parameter.
$Command could be:
Ifconfig('list', '', '', '') will return the reference to the hash
contains the information about interfaces.
The structure of this hash is the following:
{IfaceName => {'status' => 0|1 # The status of the interface. 0 means down, 1 means up
'ether' => MACaddr, # The ethernet address of the interface if available
'descr' => Description, # The description of the interface if available
'inet' => {IPaddr1 => NetMask, # The IP address and his netmask, both are in AAA.BBB.CCC.DDD notation
IPaddr2 => NetMask,
...
},
...
};
Interface, Address, Netmask parameters are ignored.
The following programs are called:
/sbin/ifconfig -a
/sbin/ifconfig -a
/sbin/ifconfig -A
/sbin/ifconfig -a
C</sbin/ifconfig -a>
=item MSWin32
GetAdaptersInfo function from IpHlpAPI.DLL
Limitations:
OpenBSD: /sbin/ifconfig -A command is not returning information about MAC addresses
so we are trying to get it from '/usr/sbin/arp -a' command (first 'static' entry).
If no one present the 'ff:ff:ff:ff:ff' address is returned.
MSWin32: GetAdaptersInfo function is not returning information about interface
which have address 127.0.0.1 binded
so Net::Ifconfig::Wrapper have no ability to display it.
Not limitation but little problem: MSWin32 interface names are not human-readable,
they looks like {843C2077-30EC-4C56-A401-658BB1E42BC7} (on Win2K at least).
Ifconfig('inet', $IfaceName, $Addr, $Mask);
$IfaceName is an interface name as displayed by 'list' command
$Addr is an IPv4 address in the AAA.AAA.AAA.AAA notation
$Mask is an IPv4 subnet mask in the MMM.MMM.MMM.MMM notation
The following actual ifconfig programs are called
/sbin/ifconfig %Iface% inet %Addr% netmask %Mask% up
/sbin/ifconfig %Iface% inet %Addr% netmask %Mask% up
/sbin/ifconfig %Iface% inet %Addr% netmask %Mask% up
/sbin/ifconfig %Iface% inet %Addr% netmask %Mask% up
C</sbin/ifconfig %Iface% inet %Addr% netmask %Mask% up>
=item MSWin32:
nothing :(
Limitations:
MSWin32: I did not find the relaible way to recognize the ``main'' address on the Win32 network interface, so I have disabled this functionality. If you know the way please let me know.
'inet'
Ifconfig('inet', $IfaceName, '', '');
$IfaceName is an interface name as displayed by 'list' command
Address and Netmask are ignored.
The following actual ifconfig programs are called
/sbin/ifconfig %Iface% down
/sbin/ifconfig %Iface% down
/sbin/ifconfig %Iface% down
/sbin/ifconfig %Iface% down
C</sbin/ifconfig %Iface% down>
=item MSWin32
nothing :(
Limitations:
MSWin32: I did not find the way to implement the 'up' command so I did not implement 'down'.
Ifconfig('+alias', $IfaceName, $Addr, $Mask);
$IfaceName is an interface name as displayed by 'list' command
$Addr is an IPv4 address in the AAA.AAA.AAA.AAA notation
$Mask is an IPv4 subnet mask in the MMM.MMM.MMM.MMM notation
The following actual ifconfig programs are called
/sbin/ifconfig %Iface% inet %Addr% netmask %Mask% alias
/sbin/ifconfig %Iface%:%Logic% inet %Addr% netmask %Mask% up
/sbin/ifconfig %Iface% inet %Addr% netmask %Mask% alias
/sbin/ifconfig %Iface%:%Logic% inet %Addr% netmask %Mask% up
C</sbin/ifconfig %Iface% inet %Addr% netmask %Mask% alias>
=item MSWin32
AddIPAddress function from IpHlpAPI.DLL
First available logic interface is taken automaticaly for Solaris and Linux
'+alias'
Ifconfig('-alias', $IfaceName, $Addr, '');
$IfaceName is an interface name as displayed by 'list' command
$Addr is an IPv4 address in the AAA.AAA.AAA.AAA notation
Netmask> parameter is ignored
The following actual ifconfig programs are called
/sbin/ifconfig %Iface% inet %Addr% -alias
/sbin/ifconfig %Iface%:%Logic% down
/sbin/ifconfig %Iface% inet %Addr% -alias
/sbin/ifconfig %Iface%:%Logic% down
C</sbin/ifconfig %Iface% inet %Addr% -alias>
=item MSWin32
DeleteIPAddress function from IpHlpAPI.DLL
Appropriate logic interface is obtained automaticaly for Solaris and Linux
On success Ifconfig(...) returns the defined value.
Actually, it is a reference to the array contains the output
of the actual ifconfig program called.
In case of troubles Ifconfig(...) returns 'undef' value,
$@ variable contains the error message.
None by default.
Daniel Podolsky, <tpaba@cpan.org>
the ifconfig manpage(8), Internet Protocol Helper in Platform SDK.
|
Net::Ifconfig::Wrapper - provides a unified way to configure network interfaces on FreeBSD, OpenBSD, Solaris, Linux, OS X, and WinNT. |