Net-Ifconfig-Wrapper-0.26/0000755000175000017500000000000013640125301014670 5ustar martinmartinNet-Ifconfig-Wrapper-0.26/dist.ini0000644000175000017500000000071013640125301016332 0ustar martinmartin name = Net-Ifconfig-Wrapper version = 0.26 license = Perl_5 author = Daniel Podolsky, tpaba@cpan.org maintainer = Martin Thurn, mthurn@cpan.org copyright_holder = Daniel Podolsky, tpaba@cpan.org [GatherDir] [MetaYAML] [MakeMaker] [Manifest] [PruneCruft] [Prereqs] POSIX = 0 Net::Netmask = 0 [OSPrereqs / MSWin32] Win32::API = 0 Win32::WinError = 0 [OSPrereqs / cygwin] Win32::API = 0 Win32::WinError = 0 [TestRelease] [ConfirmRelease] [UploadToCPAN] Net-Ifconfig-Wrapper-0.26/xt/0000755000175000017500000000000013640125301015323 5ustar martinmartinNet-Ifconfig-Wrapper-0.26/xt/test.pl0000644000175000017500000001043613640125301016643 0ustar martinmartin# Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl test.pl' ######################### # change 'tests => 1' to 'tests => last_test_to_print'; use Test; BEGIN { plan tests => 5 }; $^W++; my %IfCfgCmd = ('freebsd' => '/sbin/ifconfig -a', 'solaris' => '/sbin/ifconfig -a', 'openbsd' => '/sbin/ifconfig -A', 'linux' => '/sbin/ifconfig -a', 'darwin' => '/sbin/ifconfig -a', ); print 'Loading Net::Ifconfig::Wrapper........'; use Net::Ifconfig::Wrapper; ok(1); # If we made it this far, we're ok. print 'Geting information about interfaces...'; my $Info = Net::Ifconfig::Wrapper::Ifconfig('list') or die $@; ok(1); if ($IfCfgCmd{$^O}) { print "\n== '".$IfCfgCmd{$^O}. "' command output ==\n"; system($IfCfgCmd{$^O}); print "======================================\n"; }; print "\n== Net\:\:Ifconfig\:\:Wrapper info output ==\n"; foreach (sort(keys(%{$Info}))) { print IfaceInfo($Info, $_); }; print "======================================\n"; print "Is Net\:\:Ifconfig\:\:Wrapper info output correct? Y/N:"; while () { $_ =~ m/\A\s*y(es)?\s*\n?\Z/i and last; $_ =~ m/\A\s*n(o)?\s*\n?\Z/i and die "Net\:\:Ifconfig\:\:Wrapper info is incorrect!"; print "Is Net\:\:Ifconfig\:\:Wrapper info output correct? Y/N:"; }; print "\nInformation displayed correctly......."; ok(1); if (($^O eq "MSWin32") || ($> == 0)) { print "\nPlease choose the interface for add/remove alias function test\n"; my @Ifaces = ('skip test'); push(@Ifaces, sort(keys(%{$Info}))); my $DefIface = ''; for (my $RI = 0; defined($Ifaces[$RI]); $RI++) { (($Ifaces[$RI] =~ m/\Alo/i) && !length($DefIface)) and $DefIface = $RI; print "$RI:\t".$Ifaces[$RI]."\n"; }; print "($DefIface):"; while () { if (($_ =~ m/\A\s*\n?\Z/i) && length($DefIface)) { last; } elsif (($_ =~ m/\A\s*(\d+)\s*\n?\Z/i) && defined($Ifaces[$1])) { $DefIface = $1; last; }; print "Please choose the interface for add/remove alias function tests\n"; for (my $RI = 0; defined($Ifaces[$RI]); $RI++) { print "$RI:\t".$Ifaces[$RI]."\n"; }; print "($DefIface):"; }; if (!$DefIface) { print "add/remove alias function tests (4,5) skipped\n"; exit 0; }; my $Addr = '192.168.192.168'; my $Mask = '255.255.255.0'; print "Please choose address and mask for test alias\n($Addr:$Mask):"; while () { $_ =~ m/\A\s*\n?\Z/i and last; if ($_ =~ m/\A\s*(\d{1,3}(?:\.\d{1,3}){3})\s*\:?\s*(\d{1,3}(?:\.\d{1,3}){3})\s*\n?\Z/i) { $Addr = $1; $Mask = $2; last; }; print "Please choose address and mask for test alias\n($Addr:$Mask):"; }; print "\nAdding alias '$Addr:$Mask' to interface ".$Ifaces[$DefIface]."..."; Net::Ifconfig::Wrapper::Ifconfig('+alias', $Ifaces[$DefIface], $Addr, $Mask) or die $@; $Info = Net::Ifconfig::Wrapper::Ifconfig('list') or die $@; defined($Info->{$Ifaces[$DefIface]}->{'inet'}->{$Addr}) && ($Info->{$Ifaces[$DefIface]}->{'inet'}->{$Addr} eq $Mask) or die "Can not find recently added address '$Addr:$Mask' on interface ".$Ifaces[$DefIface]; ok(1); print "Removing alias '$Addr:$Mask' from interface ".$Ifaces[$DefIface]."..."; Net::Ifconfig::Wrapper::Ifconfig('-alias', $Ifaces[$DefIface], $Addr, '') or die $@; $Info = Net::Ifconfig::Wrapper::Ifconfig('list') or die $@; defined($Info->{$Ifaces[$DefIface]}->{'inet'}->{$Addr}) and die "Can not remove recently added address '$Addr:$Mask' from interface ".$Ifaces[$DefIface]; ok(1); } else { print "add/remove alias function tests (4,5) skipped: insufficient privileges\n"; exit 0; }; #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; };Net-Ifconfig-Wrapper-0.26/t/0000755000175000017500000000000013640125301015133 5ustar martinmartinNet-Ifconfig-Wrapper-0.26/t/20_list.t0000644000175000017500000000126213640125301016575 0ustar martinmartin use warnings; use strict; use Data::Dumper; use Test::More; use blib; use Net::Ifconfig::Wrapper qw( Ifconfig ); my $sSkip = q//; my $rh = Ifconfig('list'); if ($@ =~ m'/sbin/ifconfig: not found') { $sSkip = "/sbin/ifconfig is not available on this system; skipping content-based tests"; diag $sSkip; # BAIL_OUT; } # if subtest 'skippable' => sub { if ($sSkip ne q//) { plan skip_all => $sSkip; } else { isa_ok($rh, 'HASH'); # warn Dumper($rh); my @a = keys %$rh; my $iCount = scalar @a; diag "found $iCount adapters"; cmp_ok(1, '<=', $iCount, 'at least one adapter found'); } # else } # skippable ; done_testing(); __END__ Net-Ifconfig-Wrapper-0.26/t/00_useall.t0000644000175000017500000000007713640125301017110 0ustar martinmartinuse strict; use Test::UseAllModules; BEGIN { all_uses_ok(); } Net-Ifconfig-Wrapper-0.26/t/uni-ifconfig.pl0000644000175000017500000000555713640125301020061 0ustar martinmartin#!/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 # Print info obout specified interface uni-ifconfig.pl down # Bring specified interface down uni-ifconfig.pl inet mask # Set the specified address on the specified interface # and bring this interface up uni-ifconfig.pl inet mask [+]alias # Set the specified alias address # on the specified interface uni-ifconfig.pl inet [mask ] -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 $@; 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; }; __END__ Net-Ifconfig-Wrapper-0.26/Changes0000644000175000017500000000046613640125301016171 0ustar martinmartin2020-02-16 Kingpin * Wrapper.pm: fall back to /sbin/ip if /sbin/ifconfig is not installed (linux only) * Wrapper.pm: allow IP address to be expressed as a netmask 2016-02-06 Kingpin * Wrapper.pm (if_ipaddr): force locale when running ifconfig command Net-Ifconfig-Wrapper-0.26/META.yml0000644000175000017500000000112113640125301016134 0ustar martinmartin--- abstract: 'provides a unified way to configure network interfaces on FreeBSD, OpenBSD, Solaris, Linux, OS X, and WinNT (from Win2K). ' author: - 'Daniel Podolsky, tpaba@cpan.org' build_requires: {} configure_requires: ExtUtils::MakeMaker: '0' dynamic_config: 1 generated_by: 'Dist::Zilla version 6.010, CPAN::Meta::Converter version 2.150010' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: Net-Ifconfig-Wrapper requires: Net::Netmask: '0' POSIX: '0' version: '0.26' x_serialization_backend: 'YAML::Tiny version 1.70' Net-Ifconfig-Wrapper-0.26/lib/0000755000175000017500000000000013640125301015436 5ustar martinmartinNet-Ifconfig-Wrapper-0.26/lib/Net/0000755000175000017500000000000013640125301016164 5ustar martinmartinNet-Ifconfig-Wrapper-0.26/lib/Net/Ifconfig/0000755000175000017500000000000013640125301017710 5ustar martinmartinNet-Ifconfig-Wrapper-0.26/lib/Net/Ifconfig/Wrapper.pm0000644000175000017500000010331413640125301021670 0ustar martinmartinpackage Net::Ifconfig::Wrapper; use warnings; use strict; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS @EXPORT_FAIL); $VERSION = 0.25; require Exporter; @ISA = qw(Exporter); # Items to export into caller's namespace by default. Note: do not export # names by default without a very good reason. Use EXPORT_OK instead. # Do not simply export all your public functions/methods/constants. @EXPORT = qw(); %EXPORT_TAGS = ('Ifconfig' => [qw(Ifconfig)]); foreach (keys(%EXPORT_TAGS)) { push(@{$EXPORT_TAGS{'all'}}, @{$EXPORT_TAGS{$_}}); }; $EXPORT_TAGS{'all'} and @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); my $DEBUG = 0; use POSIX; my ($OsName, $OsVers) = (POSIX::uname())[0,2]; my $Win32_FormatMessage = undef; my %Win32API = (); my %ToLoad = ('iphlpapi' => {'GetAdaptersInfo' => [['P','P'], 'N'], #'GetIpAddrTable' => [['P','P','I'], 'N'], 'AddIPAddress' => [['N','N','N','P','P'], 'N'], 'DeleteIPAddress' => [['N'], 'N'], }, ); my $Win32_ERROR_BUFFER_OVERFLOW = undef; my $Win32_ERROR_INSUFFICIENT_BUFFER = undef; my $Win32_NO_ERROR = undef; my $ETHERNET = 'ff:ff:ff:ff:ff:ff'; (($^O eq 'openbsd') && (`/usr/sbin/arp -a 2>&1` =~ m/(?:\A|\n).+\s+at\s+([a-f\d]{1,2}(?:\:[a-f\d]{1,2}){5})\s+static\s*(?:\n|\Z)/i)) and $ETHERNET = $1; if (($^O eq 'MSWin32') || ($^O eq 'cygwin')) { eval 'use Win32::API; use Win32::WinError; Win32::IsWinNT() or die "Only WinNT (from Win2K) is supported"; $Win32_FormatMessage = sub { return Win32::FormatMessage(@_); }; $Win32_ERROR_BUFFER_OVERFLOW = ERROR_BUFFER_OVERFLOW; $Win32_ERROR_INSUFFICIENT_BUFFER = ERROR_INSUFFICIENT_BUFFER; $Win32_NO_ERROR = NO_ERROR; foreach my $DLib (keys(%ToLoad)) { foreach my $Func (keys(%{$ToLoad{$DLib}})) { $Win32API{$DLib}{$Func} = Win32::API->new($DLib, $Func, $ToLoad{$DLib}{$Func}->[0], $ToLoad{$DLib}{$Func}->[1]) or die "Cannot import function \'$Func\' from \'$DLib\' DLL: $^E"; }; }; '; $@ and die $@; }; my $MAXLOGIC = 65535; my %Hex2Mask = ('00000000' => '0.0.0.0', '80000000' => '128.0.0.0', 'c0000000' => '192.0.0.0', 'e0000000' => '224.0.0.0', 'f0000000' => '240.0.0.0', 'f8000000' => '248.0.0.0', 'fc000000' => '252.0.0.0', 'fe000000' => '254.0.0.0', 'ff000000' => '255.0.0.0', 'ff800000' => '255.128.0.0', 'ffc00000' => '255.192.0.0', 'ffe00000' => '255.224.0.0', 'fff00000' => '255.240.0.0', 'fff80000' => '255.248.0.0', 'fffc0000' => '255.252.0.0', 'fffe0000' => '255.254.0.0', 'ffff0000' => '255.255.0.0', 'ffff8000' => '255.255.128.0', 'ffffc000' => '255.255.192.0', 'ffffe000' => '255.255.224.0', 'fffff000' => '255.255.240.0', 'fffff800' => '255.255.248.0', 'fffffc00' => '255.255.252.0', 'fffffe00' => '255.255.254.0', 'ffffff00' => '255.255.255.0', 'ffffff80' => '255.255.255.128', 'ffffffc0' => '255.255.255.192', 'ffffffe0' => '255.255.255.224', 'fffffff0' => '255.255.255.240', 'fffffff8' => '255.255.255.248', 'fffffffc' => '255.255.255.252', 'fffffffe' => '255.255.255.254', 'ffffffff' => '255.255.255.255', ); my $Inet2Logic = undef; my $Logic2Inet = undef; my $Name2Index = undef; my %Ifconfig = (); my $RunCmd = sub($$) { my ($CName, $Iface, $Logic, $Addr, $Mask) = @_; my $Cmd = (defined($Ifconfig{$CName}{$^O}{$OsName}{$OsVers}{'ifconfig'}) ? $Ifconfig{$CName}{$^O}{$OsName}{$OsVers}{'ifconfig'} : $Ifconfig{$CName}{$^O}{'ifconfig'}).' 2>&1'; $DEBUG && print STDERR "\n=== RunCmd ===\n\$CName: $CName, \$Iface: $Iface, \$Logic: $Logic, \$Addr: $Addr, \$Mask: $Mask\n"; $Cmd =~ s{%Iface%}{$Iface}gsex; $Cmd =~ s{%Logic%}{$Logic}gsex; $Cmd =~ s{%Addr%}{$Addr}gsex; $Cmd =~ s{%Mask%}{$Mask}gsex; $DEBUG && print STDERR "Cmd is ==$Cmd==\n"; my $saveLang = $ENV{'LANG'} || ''; $ENV{'LANG'} = 'C'; my @Output = `$Cmd`; $ENV{'LANG'} = $saveLang; $@ = "Command '$Cmd', exit code '".(defined($?) ? $? : '!UNDEFINED!')."'".join("\t", @Output); $? ? return : return \@Output; }; # RunCmd my $SolarisList = sub($$$$) { $Inet2Logic = undef; $Logic2Inet = undef; my $Output = &{$RunCmd}('list', '', '', '', '') or return; $Inet2Logic = {}; $Logic2Inet = {}; my $Iface = undef; my $Logic = undef; my $LogUp = undef; my $Info = {}; foreach (@{$Output}) { if ( ($_ =~ m/\A([a-z]+\d+)(?:\:(\d+))?\:\s+flags=[^\<]+\<(?:\w+\,)*(up)?(?:\,\w+)*\>.*\n?\Z/io) || ($_ =~ m/\A([a-z]+\d+)(?:\:(\d+))?\:\s+flags=[^\<]+\<(?:\w+(?:\,\w+)*)*\>.*\n?\Z/io) ) { $Iface = $1; $Logic = defined($2) ? $2 : ''; $LogUp = 1 && $3; #$Info->{$Iface}{'status'} = ($Info->{$Iface}{'status'} || $LogUp) ? 1 : 0; $Info->{$Iface}{'status'} = $Info->{$Iface}{'status'} || $LogUp; } elsif (!$Iface) { next; } elsif ( ($_ =~ m/\A\s+inet\s+(\d{1,3}(?:\.\d{1,3}){3})\s+netmask\s+(?:0x)?([a-f\d]{8})(?:\s.*)?\n?\Z/io) || 0 ) { $LogUp and $Info->{$Iface}{'inet'}{$1} = $Hex2Mask{$2}; $Inet2Logic->{$Iface}{$1} = $Logic; $Logic2Inet->{$Iface}{$Logic} = $1; } elsif (($_ =~ m/\A\s+media\:?\s+(ethernet.*)\s*\n?\Z/io) && !$Info->{$Iface}{'ether'}) { $Info->{$Iface}{'ether'} = $ETHERNET; if (!$Info->{$Iface}{'media'}) {$Info->{$Iface}{'media'} = $1; }; } elsif (($_ =~ m/\A\s+supported\s+media\:?\s+(.*)\s*\n?\Z/io) && !$Info->{$Iface}{'media'}) { $Info->{$Iface}{'media'} = $1; } elsif ($_ =~ m/\A\s+ether\s+([a-f\d]{1,2}(?:\:[a-f\d]{1,2}){5})(?:\s.*)?\n?\Z/io) { $Info->{$Iface}{'ether'} = $1; }; }; return $Info; }; # SolarisList my $LinuxList = sub($$$$) { # warn " DDD start sub LinuxList...\n"; $Inet2Logic = undef; $Logic2Inet = undef; my $Output = &{$RunCmd}('list', '', '', '', '') or return; $Inet2Logic = {}; $Logic2Inet = {}; my $Iface = undef; my $Logic = undef; my $Info = {}; foreach (@{$Output}) { $DEBUG && warn " DDD looking at line of Output=$_"; if ( ($_ =~ m/\A([a-z0-9]+)(?:\:(\d+))?\s+link\s+encap\:(?:ethernet\s+hwaddr\s+([a-f\d]{1,2}(?:\:[a-f\d]{1,2}){5}))?.*\n?\Z/io) || # German locale de_DE.UTF-8 ($_ =~ m/\A([a-z0-9]+)(?:\:(\d+))?\s+Link\s+encap\:(?:Ethernet\s+Hardware\s+Adresse\s+([a-f\d]{1,2}(?:\:[a-f\d]{1,2}){5}))?.*\n?\Z/io) || # /sbin/ip on some linux systems: ($_ =~ m/link\/ether\s+([a-f\d]{1,2}(?:\:[a-f\d]{1,2}){5})\s/io) ) { $Iface = $1; $Logic = defined($2) ? $2 : ''; defined($3) and $Info->{$Iface}{'ether'} = $3; $Info->{$Iface}{'status'} = 0; } elsif ( ($_ =~ m/\A([a-z0-9]+)(?:\:(\d+))?\:\s+flags=\d+<(\w+(?:,\w+)*)*>.*\n?\Z/io) ) { $Iface = $1; $Logic = defined($2) ? $2 : ''; my $sFlags = $3; $DEBUG && warn " DDD matched 'flags' line, Iface=$Iface, sFlags=$sFlags\n"; $Info->{$Iface}{'status'} = 1 if ($sFlags =~ m/\bUP\b/); } elsif (!$Iface) { next; } elsif ( # RHEL 6 et alia: ($_ =~ m/\A\s+inet\s+addr\:(\d{1,3}(?:\.\d{1,3}){3})\s+(?:.*\s)?mask\:(\d{1,3}(?:\.\d{1,3}){3}).*\n?\Z/io) || # RHEL 7 et alia: ($_ =~ m/\A\s+inet\s+(\d{1,3}(?:\.\d{1,3}){3})\s+netmask\s+(\d{1,3}(?:\.\d{1,3}){3})(?:\s.*)?\n?\Z/io) || # German locale de_DE.UTF-8 ($_ =~ m/\A\s+inet\s+Adresse\:(\d{1,3}(?:\.\d{1,3}){3})\s+(?:.*\s)?Maske\:(\d{1,3}(?:\.\d{1,3}){3}).*\n?\Z/io) || ($_ =~ m/\sinet\s+(\d{1,3}(?:\.\d{1,3}){3})\/(\d+)\s/io) ) { my $sIP = $1; my $sNetmask = $2; $DEBUG && warn " DDD matched 'netmask' line, sIP=$sIP, sNetmask=$sNetmask\n"; if ($sNetmask =~ m/\A\d+\z/) { # The netmask appeared as a slash/number at the end of the IP # address; convert it to an IP "address" quad string: use Net::Netmask; my $block = new Net::Netmask("$sIP/$sNetmask"); $sNetmask = $block->mask(); } # if $Info->{$Iface}{'inet'}{$sIP} = $sNetmask; $Inet2Logic->{$Iface}{$sIP} = $Logic; $Logic2Inet->{$Iface}{$Logic} = $sIP; } elsif ($_ =~ m/\A\s+ether\s+([a-f0-9]{1,2}(?:\:[a-f0-9]{1,2}){5})(?:\s|\n|\Z)/io) { $Info->{$Iface}{'ether'} = $1; } elsif ($_ =~ m/\A\s+up(?:\s+[^\s]+)*\s*\n?\Z/io) { $DEBUG && warn " DDD matched 'up' line\n"; $Info->{$Iface}{'status'} = 1; }; }; return $Info; }; # LinuxList # 64-bit Windows support added by Laurent Aml: use 'Q' for pointers, # and align to 8 bytes. my ($LQ, @pad) = (length(pack('P')) == 4) ? ('L') : ('Q', '_pad' => 'L'); my $st_IP_ADDR_STRING = ['Next' => $LQ, #struct _IP_ADDR_STRING* 'IpAddress' => 'a16', #IP_ADDRESS_STRING 'IpMask' => 'a16', #IP_MASK_STRING 'Context' => 'L', #DWORD @pad, ]; my $MAX_ADAPTER_NAME_LENGTH = 256; my $MAX_ADAPTER_DESCRIPTION_LENGTH = 128; my $MAX_ADAPTER_ADDRESS_LENGTH = 8; my $st_IP_ADAPTER_INFO = ['Next' => $LQ, #struct _IP_ADAPTER_INFO* 'ComboIndex' => 'L', #DWORD 'AdapterName' => 'a'.($MAX_ADAPTER_NAME_LENGTH+4), #char[MAX_ADAPTER_NAME_LENGTH + 4] 'Description' => 'a'.($MAX_ADAPTER_DESCRIPTION_LENGTH+4), #char[MAX_ADAPTER_DESCRIPTION_LENGTH + 4] 'AddressLength' => 'L', #UINT 'Address' => 'a'.$MAX_ADAPTER_ADDRESS_LENGTH, #BYTE[MAX_ADAPTER_ADDRESS_LENGTH] 'Index' => 'L', #DWORD 'Type' => 'L', #UINT 'DhcpEnabled' => 'L', #UINT @pad, 'CurrentIpAddress' => $LQ, #PIP_ADDR_STRING 'IpAddressList' => $st_IP_ADDR_STRING, #IP_ADDR_STRING 'GatewayList' => $st_IP_ADDR_STRING, #IP_ADDR_STRING 'DhcpServer' => $st_IP_ADDR_STRING, #IP_ADDR_STRING 'HaveWins' => 'L', #BOOL @pad, 'PrimaryWinsServer' => $st_IP_ADDR_STRING, #IP_ADDR_STRING 'SecondaryWinsServer' => $st_IP_ADDR_STRING, #IP_ADDR_STRING 'LeaseObtained' => $LQ, #time_t 'LeaseExpires' => $LQ, #time_t ]; #my $st_MIB_IPADDRROW = # ['dwAddr' => 'L', #DWORD # 'dwIndex' => 'L', #DWORD # 'dwMask' => 'L', #DWORD # 'dwBCastAddr' => 'L', #DWORD # 'dwReasmSize' => 'L', #DWORD # 'unused1' => 'S', #unsigned short # 'unused2' => 'S', #unsigned short # ]; my %UnpackStrCache = (); my $UnpackStr = undef; $UnpackStr = sub($$) { my ($Struct, $Repeat) = @_; $Repeat or $Repeat = 1; my $StructUpStr = ''; if (!defined($UnpackStrCache{$Struct})) { for (my $RI = 1; defined($Struct->[$RI]); $RI += 2) { $StructUpStr .= ref($Struct->[$RI]) ? &{$UnpackStr}($Struct->[$RI], 1) : $Struct->[$RI]; }; $UnpackStrCache{$Struct} = $StructUpStr; } else { $StructUpStr = $UnpackStrCache{$Struct}; }; my $UpStr = ''; for (; $Repeat > 0; $Repeat--) { $UpStr .= $StructUpStr; }; return $UpStr; }; # $Unpackstr my $ShiftStruct = undef; $ShiftStruct = sub($$) { my ($Array, $Struct) = @_; my $Result = {}; #tie(%{$Result}, 'Tie::IxHash'); for (my $RI = 0; defined($Struct->[$RI]); $RI += 2) { $Result->{$Struct->[$RI]} = ref($Struct->[$RI+1]) ? &{$ShiftStruct}($Array, $Struct->[$RI+1]) : shift(@{$Array}); }; return $Result; }; my $UnpackStruct = sub($$) { my ($pBuff, $Struct) = @_; my $UpStr = &{$UnpackStr}($Struct); my @Array = unpack($UpStr, ${$pBuff}); substr(${$pBuff}, 0, length(pack($UpStr)), ''); return &{$ShiftStruct}(\@Array, $Struct); }; my $if_hwaddr = sub($$) { my($len, $addr) = @_; return join(':', map {sprintf '%02x', $_ } unpack('C' x $len, $addr)); }; sub if_ipaddr { my ($addr) = @_; return join(".", unpack("C4", pack("L", $addr))); }; my $Win32List = sub($$$$) { $Inet2Logic = undef; $Logic2Inet = undef; $Name2Index = undef; my $Buff = ''; my $BuffLen = pack('L', 0); my $Res = $Win32API{'iphlpapi'}{'GetAdaptersInfo'}->Call(0, $BuffLen); while ($Res == $Win32_ERROR_BUFFER_OVERFLOW) { $Buff = "\0" x unpack("L", $BuffLen); $Res = $Win32API{'iphlpapi'}{'GetAdaptersInfo'}->Call($Buff, $BuffLen); } # while if ($Res != $Win32_NO_ERROR) { $! = $Res; $@ = "Error running 'GetAdaptersInfo' function: ".&{$Win32_FormatMessage}($Res); return; } # if my $Info = {}; $Inet2Logic = {}; $Logic2Inet = {}; $Name2Index = {}; while (1) { my $ADAPTER_INFO = &{$UnpackStruct}(\$Buff, $st_IP_ADAPTER_INFO); foreach my $Field ('AdapterName', 'Description') { $ADAPTER_INFO->{$Field} =~ s/\x00+\Z//o; }; foreach my $AddrField ('IpAddressList', 'GatewayList', 'DhcpServer', 'PrimaryWinsServer', 'SecondaryWinsServer') { foreach my $Field ('IpAddress', 'IpMask') { $ADAPTER_INFO->{$AddrField}{$Field} =~ s/\x00+\Z//o; }; }; $ADAPTER_INFO->{'Address'} = &{$if_hwaddr}($ADAPTER_INFO->{'AddressLength'}, $ADAPTER_INFO->{'Address'}); foreach my $IpList ('IpAddressList', 'GatewayList') { my $ADDR_STRING = $ADAPTER_INFO->{$IpList}; $ADAPTER_INFO->{$IpList} = [$ADDR_STRING,]; while ($ADDR_STRING->{'Next'}) { $ADDR_STRING = &{$UnpackStruct}(\$Buff, $st_IP_ADDR_STRING); foreach my $Field ('IpAddress', 'IpMask') { $ADDR_STRING->{$Field} =~ s/\x00+\Z//o; } # foreach push(@{$ADAPTER_INFO->{$IpList}}, $ADDR_STRING); } # while } # foreach my $Iface = $ADAPTER_INFO->{'AdapterName'}; $Info->{$Iface}{'descr'} = $ADAPTER_INFO->{'Description'}; $Info->{$Iface}{'ether'} = $ADAPTER_INFO->{'Address'}; $Info->{$Iface}{'status'} = 1; foreach my $Addr (@{$ADAPTER_INFO->{'IpAddressList'}}) { ($Addr->{'IpAddress'} eq '0.0.0.0') and next; $Info->{$Iface}{'inet'}{$Addr->{'IpAddress'}} = $Addr->{'IpMask'}; $Inet2Logic->{$Iface}{$Addr->{'IpAddress'}} = $Addr->{'Context'}; $Logic2Inet->{$Iface}{$Addr->{'Context'}} = $Addr->{'IpAddress'}; } # foreach $Name2Index->{$Iface} = $ADAPTER_INFO->{'Index'}; $ADAPTER_INFO->{'Next'} or last; } # while #$Buff = ''; #$BuffLen = pack('L', 0); #$Res = $Win32API{'iphlpapi'}{'GetIpAddrTable'}->Call($Buff, $BuffLen, 0); # #while ($Res == ERROR_INSUFFICIENT_BUFFER) # { # $Buff = "\0" x unpack("L", $BuffLen); # $Res = $Win32API{'iphlpapi'}{'GetIpAddrTable'}->Call($Buff, $BuffLen, 0); # }; # #if ($Res != $Win32_NO_ERROR) # { # $! = $Res; # $@ = "Error running 'GetIpAddrTable' function: ".&{$Win32_FormatMessage}($Res); # return; # }; # #my $IpAddrTable = &{$UnpackStruct}(\$Buff, ['Len' => 'L']); #my %Info1 = (); #for (; $IpAddrTable->{'Len'} > 0; $IpAddrTable->{'Len'}--) # { # my $IPADDRROW = &{$UnpackStruct}(\$Buff, $st_MIB_IPADDRROW); # $Info->{$IPADDRROW->{'dwIndex'}} # and next; # $Info1{$IPADDRROW->{'dwIndex'}}{'inet'}{if_ipaddr($IPADDRROW->{'dwAddr'})} = if_ipaddr($IPADDRROW->{'dwMask'}); # }; # #foreach my $Iface (keys(%Info1)) # { $Info->{$Iface} = $Info1{$Iface}; }; return wantarray ? %{$Info} : $Info; }; # Win32List my $IFCONFIG = '/sbin/ifconfig'; $Ifconfig{'list'} = {'solaris' => {'ifconfig' => qq/LC_ALL=C $IFCONFIG -a/, 'function' => $SolarisList}, 'openbsd' => {'ifconfig' => qq/LC_ALL=C $IFCONFIG -A/, 'function' => $SolarisList}, 'linux' => {'ifconfig' => qq/LC_ALL=C $IFCONFIG -a/, 'function' => $LinuxList}, 'MSWin32' => {'ifconfig' => '', 'function' => $Win32List,}, }; $Ifconfig{'list'}{'freebsd'} = $Ifconfig{'list'}{'solaris'}; $Ifconfig{'list'}{'darwin'} = $Ifconfig{'list'}{'solaris'}; $Ifconfig{'list'}{'cygwin'} = $Ifconfig{'list'}{'MSWin32'}; my $UpDown = sub($$$$) { my ($CName, $Iface, $Addr, $Mask) = @_; if (!(defined($Iface) && defined($Addr) && defined($Mask))) { $@ = "Command '$CName': interface, inet address and netmask have to be defined"; return; }; my $Output = &{$RunCmd}($CName, $Iface, '', $Addr, $Mask); $Inet2Logic = undef; $Logic2Inet = undef; $Output ? return $Output : return; }; # $UpDown my $UpDownNewLog = sub($$$$) { my ($CName, $Iface, $Addr, $Mask) = @_; if (!(defined($Iface) && defined($Addr) && defined($Mask))) { $@ = "Command '$CName': interface, inet address and netmask have to be defined"; return; }; defined($Inet2Logic) or (defined($Ifconfig{'list'}{$^O}{$OsName}{$OsVers}{'function'}) ? &{$Ifconfig{'list'}{$^O}{$OsName}{$OsVers}{'function'}}() : &{$Ifconfig{'list'}{$^O}{'function'}}()) or return; my $Logic = $Inet2Logic->{$Iface}{$Addr}; my $RunIndex = 1; for(; !defined($Logic); $RunIndex++) { if ($RunIndex > $MAXLOGIC) { $@ = "Command '$CName': maximum number of logic interfaces ($MAXLOGIC) on interface '$Iface' exceeded"; return; }; defined($Logic2Inet->{$Iface}{$RunIndex}) or $Logic = $RunIndex; }; my $Output = &{$RunCmd}($CName, $Iface, $Logic, $Addr, $Mask); $Inet2Logic = undef; $Logic2Inet = undef; $Output ? return $Output : return; }; # $UpDownNewLog my $UpDownReqLog = sub($$$$) { my ($CName, $Iface, $Addr, $Mask) = @_; if (!(defined($Iface) && defined($Addr) && defined($Mask))) { $@ = "Command '$CName': interface, inet address and netmask have to be defined"; return; }; defined($Inet2Logic) or (defined($Ifconfig{'list'}{$^O}{$OsName}{$OsVers}{'function'}) ? &{$Ifconfig{'list'}{$^O}{$OsName}{$OsVers}{'function'}}() : &{$Ifconfig{'list'}{$^O}{'function'}}()) or return; my $Logic = $Inet2Logic->{$Iface}{$Addr}; if (!defined($Logic)) { $@ = "Command '$CName': can not get logic interface for interface '$Iface', inet address '$Addr'"; return; }; my $Output = &{$RunCmd}($CName, $Iface, $Logic, $Addr, $Mask); $Inet2Logic = undef; $Logic2Inet = undef; $Output ? return $Output : return; }; # $UpDownReqLog #my $Win32UpDown = sub($$) # { # my ($Iface, $State) = @_; # # # }; # #my $Win32Inet = sub($$$$) # { # my ($CName, $Iface, $Addr, $Mask) = @_; # # # if (!(defined($Iface) && defined($Addr) && defined($Mask))) # { # $@ = "Command '$CName': interface, inet address and netmask have to be defined"; # return; # }; # # $Win32Up($Iface) # or return; # # $Win32AddIP($Iface, $Addr, $Mask) # or return; # my $Output = &{$RunCmd}('inet', '$Iface', '', '$Addr', '$Mask'); # # $Inet2Logic = undef; # $Logic2Inet = undef; # # $Output ? return $Output : return; # }; my $PackIP = sub($) { my @Bytes = split('\.', $_[0]); return unpack("L", pack('C4', @Bytes)); }; my $Win32AddAlias = sub($$$$) { my ($CName, $Iface, $Addr, $Mask) = @_; if (!(defined($Iface) && defined($Addr) && defined($Mask))) { $@ = "Command '$CName': interface, inet address and netmask have to be defined"; return; }; defined($Inet2Logic) or (defined($Ifconfig{'list'}{$^O}{$OsName}{$OsVers}{'function'}) ? &{$Ifconfig{'list'}{$^O}{$OsName}{$OsVers}{'function'}}() : &{$Ifconfig{'list'}{$^O}{'function'}}()) or return; my $NTEContext = pack('L', 0); my $NTEInstance = pack('L', 0); my $Index = $Name2Index->{$Iface}; if (!defined($Index)) { $@ = "Command '$CName': can not get interface index for interface '$Iface'"; return; }; my $Res = $Win32API{'iphlpapi'}{'AddIPAddress'}->Call(&{$PackIP}($Addr), &{$PackIP}($Mask), $Index, $NTEContext, $NTEInstance); if ($Res != $Win32_NO_ERROR) { $! = $Res; $@ = &{$Win32_FormatMessage}($Res) or $@ = 'Unknown error :('; return; }; $Inet2Logic = undef; $Logic2Inet = undef; return ['Command completed successfully']; }; my $Win32RemAlias = sub($$$$) { my ($CName, $Iface, $Addr, $Mask) = @_; if (!(defined($Iface) && defined($Addr) && defined($Mask))) { $@ = "Command '$CName': interface, inet address and netmask have to be defined"; return; }; defined($Inet2Logic) or (defined($Ifconfig{'list'}{$^O}{$OsName}{$OsVers}{'function'}) ? &{$Ifconfig{'list'}{$^O}{$OsName}{$OsVers}{'function'}}() : &{$Ifconfig{'list'}{$^O}{'function'}}()) or return; my $Logic = $Inet2Logic->{$Iface}{$Addr}; if (!defined($Logic)) { $@ = "Command '$CName': can not get logic interface for interface '$Iface', inet address '$Addr'"; return; }; my $Res = $Win32API{'iphlpapi'}{'DeleteIPAddress'}->Call($Logic); if ($Res != $Win32_NO_ERROR) { $! = $Res; $@ = &{$Win32_FormatMessage}($Res); return; }; $Inet2Logic = undef; $Logic2Inet = undef; return ['Command completed successfully']; }; $Ifconfig{'inet'} = {'solaris' => {'ifconfig' => $IFCONFIG .' %Iface% inet %Addr% netmask %Mask% up', 'function' => $UpDown}, # 'MSWin32' => {'ifconfig' => '', # 'function' => $Win32Inet,}, }; $Ifconfig{'inet'}{'freebsd'} = $Ifconfig{'inet'}{'solaris'}; $Ifconfig{'inet'}{'openbsd'} = $Ifconfig{'inet'}{'solaris'}; $Ifconfig{'inet'}{'linux'} = $Ifconfig{'inet'}{'solaris'}; $Ifconfig{'inet'}{'darwin'} = $Ifconfig{'inet'}{'solaris'}; $Ifconfig{'up'} = $Ifconfig{'inet'}; $Ifconfig{'down'}{'solaris'} = {'ifconfig' => $IFCONFIG .' %Iface% down', 'function' => $UpDown, }; $Ifconfig{'down'}{'freebsd'} = $Ifconfig{'down'}{'solaris'}; $Ifconfig{'down'}{'openbsd'} = $Ifconfig{'down'}{'solaris'}; $Ifconfig{'down'}{'linux'} = $Ifconfig{'down'}{'solaris'}; $Ifconfig{'down'}{'darwin'} = $Ifconfig{'down'}{'solaris'}; $Ifconfig{'+alias'} = {'freebsd' => {'ifconfig' => $IFCONFIG .' %Iface% inet %Addr% netmask %Mask% alias', 'function' => $UpDown}, 'solaris' => {'ifconfig' => $IFCONFIG .' %Iface%:%Logic% inet %Addr% netmask %Mask% up', 'function' => $UpDownNewLog}, 'MSWin32' => {'ifconfig' => '', 'function' => $Win32AddAlias,}, }; $Ifconfig{'+alias'}{'openbsd'} = $Ifconfig{'+alias'}{'freebsd'}; $Ifconfig{'+alias'}{'linux'} = $Ifconfig{'+alias'}{'solaris'}; $Ifconfig{'+alias'}{'darwin'} = $Ifconfig{'+alias'}{'freebsd'}; $Ifconfig{'+alias'}{'solaris'}{'SunOS'}{'5.8'}{'ifconfig'} = $IFCONFIG .' %Iface%:%Logic% plumb; '. $IFCONFIG .' %Iface%:%Logic% inet %Addr% netmask %Mask% up'; $Ifconfig{'+alias'}{'solaris'}{'SunOS'}{'5.9'}{'ifconfig'} = $Ifconfig{'+alias'}{'solaris'}{'SunOS'}{'5.8'}{'ifconfig'}; $Ifconfig{'+alias'}{'solaris'}{'SunOS'}{'5.10'}{'ifconfig'} = $Ifconfig{'+alias'}{'solaris'}{'SunOS'}{'5.8'}{'ifconfig'}; $Ifconfig{'alias'} = $Ifconfig{'+alias'}; $Ifconfig{'-alias'} = {'freebsd' => {'ifconfig' => $IFCONFIG .' %Iface% inet %Addr% -alias', 'function' => $UpDown}, 'solaris' => {'ifconfig' => $IFCONFIG .' %Iface%:%Logic% down', 'function' => $UpDownReqLog}, 'MSWin32' => {'ifconfig' => '', 'function' => $Win32RemAlias,}, }; $Ifconfig{'-alias'}{'openbsd'} = $Ifconfig{'-alias'}{'freebsd'}; $Ifconfig{'-alias'}{'linux'} = $Ifconfig{'-alias'}{'solaris'}; $Ifconfig{'-alias'}{'darwin'} = $Ifconfig{'-alias'}{'freebsd'}; $Ifconfig{'-alias'}{'solaris'}{'SunOS'}{'5.9'}{'ifconfig'} = $IFCONFIG .' %Iface%:%Logic% unplumb'; sub Ifconfig { my ($CName, $Iface, $Addr, $Mask) = @_; if (!($CName && $Ifconfig{$CName} && $Ifconfig{$CName}{$^O})) { $@ = "Command '$CName' is not defined for system '$^O'"; return; }; defined($Inet2Logic) or (defined($Ifconfig{'list'}{$^O}{$OsName}{$OsVers}{'function'}) ? &{$Ifconfig{'list'}{$^O}{$OsName}{$OsVers}{'function'}}() : &{$Ifconfig{'list'}{$^O}{'function'}}()) or return; my $Output = (defined($Ifconfig{$CName}{$^O}{$OsName}{$OsVers}{'function'}) ? &{$Ifconfig{$CName}{$^O}{$OsName}{$OsVers}{'function'}}($CName, $Iface, $Addr, $Mask) : &{$Ifconfig{$CName}{$^O}{'function'}}($CName, $Iface, $Addr, $Mask)); $Output ? return $Output : return; } 1; __END__ =head1 NAME Net::Ifconfig::Wrapper - provides a unified way to configure network interfaces on FreeBSD, OpenBSD, Solaris, Linux, OS X, and WinNT (from Win2K). =head1 SYNOPSIS use Net::Ifconfig::Wrapper; my $rhInfo = Net::Ifconfig::Wrapper::Ifconfig('list'); =head1 DESCRIPTION This module provides a unified way to configure the network interfaces on FreeBSD, OpenBSD, Solaris, Linux, OS X, and WinNT (from Win2K) systems. I (IPv4) and C (MAC) addresses are supported at this time>> On Unix, this module calls the system C command to gather the information. On Windows, the functions from IpHlpAPI.DLL are called. For all supported Unixes, C expects the C command to be C. See the top-level README file for a list of tested OSes. I =head1 The Net::Ifconfig::Wrapper methods =over 4 =item C, I, I
, I);> The one and only method of the C module. Does all the jobs. The particular action is described by the C<$Command> parameter. C<$Command> could be: =over 8 =item 'list' C will return a reference to a hash containing 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, ... }, ... }; I, I
, I parameters are ignored. The following shows what program is called for each OS: =over 12 =item FreeBSD C =item Solaris C =item OpenBSD C =item Linux C =item OS X C =item MSWin32 C function from C =back Known Limitations: OpenBSD: C command is not returning information about MAC addresses so we are trying to get it from C<'/usr/sbin/arp -a'> command (first I> entry). If no one present the I> address is returned. MSWin32: C function is not returning information about the interface which has address C<127.0.0.1> bound to it, so we have no way to return it. Not a limitation, but a small problem: in MSWin32, interface names are not human-readable, they look like C<{843C2077-30EC-4C56-A401-658BB1E42BC7}> (on Win2K at least). =item 'inet' This function is used to set IPv4 address on interface. It is called as Ifconfig('inet', $IfaceName, $Addr, $Mask); I> is an interface name as displayed by C<'list'> command I> is an IPv4 address in the C notation I> is an IPv4 subnet mask in the C notation In order to accomplish this, the following actual C programs are called: =over 12 =item FreeBSD C =item Solaris C =item OpenBSD C =item Linux C =item OS X C =item MSWin32: nothing :( =back Known Limitations: MSWin32: I did not find a reliable way to recognize the "main" address on the Win32 network interface, so I have disabled this functionality. If you know how, please let me know. =item 'up' Just a synonym for C<'inet'> =item 'down' This function is used to bring specified interface down. It is called as Ifconfig('inet', $IfaceName, '', ''); I> is an interface name as displayed by C<'list'> command Last two arguments are ignored. In order to accomplish this, the following programs are called: =over 12 =item FreeBSD C =item Solaris C =item OpenBSD C =item Linux C =item OS X C =item MSWin32 Sorry, this function is not possible. =back Known Limitations: MSWin32: I did not find the way to implement the C<'up'> command so I did not implement C<'down'>. =item '+alias' This function is used to set IPv4 alias address on interface. It have to be called as Ifconfig('+alias', $IfaceName, $Addr, $Mask); I> is an interface name as displayed by C<'list'> command I> is an IPv4 address in the C notation I> is an IPv4 subnet mask in the C notation In order to accomplish this, the following C programs are called: =over 12 =item FreeBSD C =item Solaris C =item OpenBSD C =item Linux C =item OS X C =item MSWin32 C function from C =back I =item 'alias' Just a synonim for C<'+alias'> =item '-alias' This function is used to remove IPv4 alias address from interface. It have to be called as Ifconfig('-alias', $IfaceName, $Addr, ''); I> is an interface name as displayed by C<'list'> command. I> is an IPv4 address in the C notation. Last argument is ignored if present. In order to accomplish this, the following C programs are called: =over 12 =item FreeBSD C =item Solaris C =item OpenBSD C =item Linux C =item OS X C =item MSWin32 C function from C =back I =back On success, the C function returns the defined value. Actually, it is a reference to the array containing the output of the actual I> program called. In case of error, C returns C<'undef'> value, and the C<$@> variable contains the error message. =back =head2 EXPORT None by default. =head1 AUTHOR Daniel Podolsky, Etpaba@cpan.orgE As of 2015-11, maintained by Martin Thurn Emthurn@cpan.orgE =head1 SEE ALSO L(8), I in I. =cut Net-Ifconfig-Wrapper-0.26/README0000644000175000017500000000176213640125301015556 0ustar martinmartinNet::IfConfig::Wrapper ====================== This module can be used to call the ifconfig command on different Unix systems and Windows NT systems. It provided a unified way to obtain info from ifconfig, create and delete the IP aliases on interfaces, etc. At certain times in the past, this module was tested (successfully) on the following OSes and versions: CentOS 7.1 FreeBSD 4.7 FreeBSD 4.8 FreeBSD 5.3 FreeBSD 6.2 FreeBSD 7.2 OpenBSD 3.1 OS X 10.3 (aka Panther) OS X 10.4 (aka Tiger) OS X 10.5 (aka Leopard) RedHat 6.2 RedHat 7.3 RedHat 8.0 Solaris 7 Windows 2000 Pro Windows XP Pro Windows 7 INSTALLATION To install this module type the following: perl Makefile.PL make make test make install DEPENDENCIES This module requires these other modules: POSIX Win32::API (on Win32 or cygwin) Win32::WinError (on Win32 or cygwin) COPYRIGHT AND LICENCE Copyright: Daniel Podolsky , 2003 Licence: Same as perl itself 21 Jan 2003, Daniel Podolsky Net-Ifconfig-Wrapper-0.26/README.md0000644000175000017500000000022313640125301016144 0ustar martinmartin# Net-Ifconfig-Wrapper Perl module Net::Ifconfig::Wrapper written by Daniel Podolsky, tpaba@cpan.org maintained by Martin Thurn, mthurn@cpan.org Net-Ifconfig-Wrapper-0.26/Makefile.PL0000644000175000017500000000271013640125301016642 0ustar martinmartin# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.010. use strict; use warnings; use ExtUtils::MakeMaker; my %WriteMakefileArgs = ( "ABSTRACT" => "provides a unified way to configure network interfaces on FreeBSD, OpenBSD, Solaris, Linux, OS X, and WinNT (from Win2K). ", "AUTHOR" => "Daniel Podolsky, tpaba\@cpan.org", "CONFIGURE_REQUIRES" => { "ExtUtils::MakeMaker" => 0 }, "DISTNAME" => "Net-Ifconfig-Wrapper", "LICENSE" => "perl", "NAME" => "Net::Ifconfig::Wrapper", "PREREQ_PM" => { "Net::Netmask" => 0, "POSIX" => 0 }, "VERSION" => "0.26", "test" => { "TESTS" => "t/*.t" } ); my %FallbackPrereqs = ( "Net::Netmask" => 0, "POSIX" => 0 ); unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) { delete $WriteMakefileArgs{TEST_REQUIRES}; delete $WriteMakefileArgs{BUILD_REQUIRES}; $WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs; } delete $WriteMakefileArgs{CONFIGURE_REQUIRES} unless eval { ExtUtils::MakeMaker->VERSION(6.52) }; if ( $^O eq 'MSWin32' ) { $WriteMakefileArgs{PREREQ_PM}{'Win32::API'} = $FallbackPrereqs{'Win32::API'} = '0'; $WriteMakefileArgs{PREREQ_PM}{'Win32::WinError'} = $FallbackPrereqs{'Win32::WinError'} = '0'; } if ( $^O eq 'cygwin' ) { $WriteMakefileArgs{PREREQ_PM}{'Win32::API'} = $FallbackPrereqs{'Win32::API'} = '0'; $WriteMakefileArgs{PREREQ_PM}{'Win32::WinError'} = $FallbackPrereqs{'Win32::WinError'} = '0'; } WriteMakefile(%WriteMakefileArgs); Net-Ifconfig-Wrapper-0.26/MANIFEST0000644000175000017500000000034413640125301016022 0ustar martinmartin# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.010. Changes MANIFEST META.yml Makefile.PL README README.md dist.ini lib/Net/Ifconfig/Wrapper.pm t/00_useall.t t/20_list.t t/uni-ifconfig.pl xt/test.pl