Net-Libdnet6

 view release on metacpan or  search on metacpan

lib/Net/Libdnet6.pm  view on Meta::CPAN


   my $buf = `$_pathIfconfig $dev 2> /dev/null`;
   return unless $buf;

   my @ip6 = ();
   for (split('\n', $buf)) {
      my $prefixLenFound;
      my $lastIp6;
      for (split(/\s+/)) {
         s/(?:%[a-z0-9]+)$//; # This removes %lnc0 on BSD systems

         # Some Linux systems do not put the prefix with /number
         if (/^[0-9a-f:]+$/i && Net::IPv6Addr::is_ipv6($_)) {
            $lastIp6 = lc($_);
         }
         # Some newer Linux systems do it
         elsif (/^[0-9a-f:]+\/(\d+)$/i && Net::IPv6Addr::is_ipv6($_)) {
            $lastIp6 = lc($_);
         }

         # Gather prefixlen on *BSD systems
         if (/^\d+$/ && $prefixLenFound) {
            $lastIp6 .= '/'.$_;
            --$prefixLenFound;
         }
         ++$prefixLenFound if /^prefixlen$/i;
      }
      push @ip6, $lastIp6 if $lastIp6;
   }

   # We return the first IP as the main address, others as aliases
   if (@ip6 > 1) {
      return $ip6[0], [ @ip6[1..$#ip6] ];
   }
   elsif (@ip6 == 1) {
      return $ip6[0];
   }
   return;
}

sub intf_get6 {
   my $dev = shift;

   confess('Usage: intf_get6($networkInterface)'."\n")
      unless $dev;

   my $dnet = intf_get($dev) or return;
   my ($ip, $aliases) = _get_ip6($dev);
   $dnet->{addr6}    = $ip      if $ip;
   $dnet->{aliases6} = $aliases if $aliases;

   return $dnet;
}

# XXX: not supported yet
sub _get_routes_other { return; }

sub _get_routes_linux {
   return unless $_pathNetstat;

   my $buf = `$_pathNetstat -rnA inet6 2> /dev/null`;
   return unless $buf;

   my @ifRoutes = ();
   my %devIps;
   for (split('\n', $buf)) {
      my @elts = split(/\s+/);
      if ($elts[0]) {
         if ($elts[0] eq '::/0') { # Default route
            my $route = {
               destination => 'default',
               interface   => $elts[-1],
            };
            if (Net::IPv6Addr::is_ipv6($elts[1])) {
               $route->{nextHop} = $elts[1];
            }
            push @ifRoutes, $route;
         }
         elsif (Net::IPv6Addr::is_ipv6($elts[0])) {
            my $route = {
               destination => $elts[0],
               interface   => $elts[-1],
            };
            if (Net::IPv6Addr::is_ipv6($elts[1])) {
               $route->{nextHop} = $elts[1];
            }
            push @ifRoutes, $route;
         }
      }
   }

   if (@ifRoutes > 1) {
      return \@ifRoutes;
   }

   return;
}

sub _get_routes_bsd {
   return unless $_pathNetstat;

   my $buf = `$_pathNetstat -rnf inet6 2> /dev/null`;
   return unless $buf;

   my @ifRoutes = ();
   my %devIps;
   for (split('\n', $buf)) {
      my @elts = split(/\s+/);

      my $destination = $elts[0] || undef;
      my $gateway = $elts[1] || undef;
      my $flags = $elts[2] || undef;
      my $if = $elts[3] || undef;

      if (defined($destination)) {
         $destination =~ s/%[a-z]+[0-9]+//;
      }
      if (defined($gateway)) {
         $gateway =~ s/%[a-z]+[0-9]+//;
      }

      next if ! defined($destination);

      # FreeBSD > 9.x has a new scheme for default routes:
      # it uses the MAC address of default interface
      if ($gateway
      &&  $gateway =~ /^[a-z0-9]{2}:[a-z0-9]{2}:[a-z0-9]{2}:[a-z0-9]{2}:[a-z0-9]{2}:[a-z0-9]{2}$/i) {
         my $route = {
            destination => 'default',
            interface => $if,
         };
         if (Net::IPv6Addr::is_ipv6($elts[1])) {
            $route->{nextHop} = $destination;
         }
         push @ifRoutes, $route;
      }
      elsif (Net::IPv6Addr::is_ipv6($destination)) {
         my $route = {
            destination => $destination,
            interface   => $if,
         };
         if (Net::IPv6Addr::is_ipv6($gateway)) {
            $route->{nextHop} = $gateway;
         }
         push @ifRoutes, $route;
      }
      elsif ($destination eq 'default') {
         my $route = {
            destination => $destination,
            interface => $if,
         };
         if (Net::IPv6Addr::is_ipv6($gateway)) {
            $route->{nextHop} = $gateway;
         }
         push @ifRoutes, $route;
      }
   }

   if (@ifRoutes > 1) {
      return \@ifRoutes;
   }



( run in 1.351 second using v1.01-cache-2.11-cpan-483215c6ad5 )