Metabrik-Repository

 view release on metacpan or  search on metacpan

lib/Metabrik/System/Route.pm  view on Meta::CPAN

      require_binaries => {
         'sysctl' => [ ],
      },
   };
}

sub brik_use_properties {
   my $self = shift;

   return {
      attributes_default => {
         device => defined($self->global) && $self->global->device || 'eth0',
      },
   };
}

sub show {
   my $self = shift;

   print "show: IPv4 network routes:\n";

   my $nr4 = Net::Routing->new(
      target => Net::Routing::NR_TARGET_ALL(),
      family => Net::Routing::NR_FAMILY_INET4(),
   ) or return $self->log->error("show: Net::Routing new failed: [$Net::Routing::Error]");
   $nr4->list;

   print "\n";

   print "show: IPv6 network routes:\n";

   my $nr6 = Net::Routing->new(
      target => Net::Routing::NR_TARGET_ALL(),
      family => Net::Routing::NR_FAMILY_INET6(),
   ) or return $self->log->error("show: Net::Routing new failed: [$Net::Routing::Error]");
   $nr6->list;

   return 1;
}

sub list {
   my $self = shift;

   my $nr4 = Net::Routing->new(
      target => Net::Routing::NR_TARGET_ALL(),
      family => Net::Routing::NR_FAMILY_INET4(),
   ) or return $self->log->error("list: Net::Routing new failed: [$Net::Routing::Error]");
   my $route4 = $nr4->get || [];

   for (@$route4) {
      $_->{family} = 'inet4';
   }

   my $nr6 = Net::Routing->new(
      target => Net::Routing::NR_TARGET_ALL(),
      family => Net::Routing::NR_FAMILY_INET6(),
   ) or return $self->log->error("list: Net::Routing new failed: [$Net::Routing::Error]");
   my $route6 = $nr6->get || [];

   for (@$route6) {
      $_->{family} = 'inet6';
   }

   return [ @$route4, @$route6 ];
}

sub default_device {
   my $self = shift;
   my ($ip_address) = @_;

   my $nd = Metabrik::Network::Device->new_from_brik_init($self) or return;
   return $nd->default($ip_address);
}

sub default_ipv4_gateway {
   my $self = shift;
   my ($device) = @_;

   $device ||= '';

   my $routes = $self->list or return;
   for (@$routes) {
      next unless (length($device) && $_->{interface} eq $device || ! length($device));
      if ($_->{family} eq 'inet4' && $_->{default}) {
         return $_->{gateway};
      }
   }

   if (length($device)) {
      $self->log->info("default_ipv4_gateway: no default gateway found for device [$device]");
   }
   else {
      $self->log->info("default_ipv4_gateway: no default gateway found");
   }

   return 0;
}

sub default_ipv6_gateway {
   my $self = shift;
   my ($device) = @_;

   $device ||= '';

   my $routes = $self->list or return;
   for (@$routes) {
      next unless (length($device) && $_->{interface} eq $device || ! length($device));
      if ($_->{family} eq 'inet6' && $_->{default}) {
         return $_->{gateway};
      }
   }

   if (length($device)) {
      $self->log->info("default_ipv6_gateway: no default gateway found for device [$device]");
   }
   else {
      $self->log->info("default_ipv6_gateway: no default gateway found");
   }

   return 0;
}

sub is_router_ipv4 {
   my $self = shift;
   my ($device) = @_;

   $device ||= $self->device;
   $self->brik_help_run_undef_arg('is_router_ipv4', $device) or return;

   my $sc = Metabrik::Shell::Command->new_from_brik_init($self) or return;
   $sc->as_matrix(0);
   $sc->as_array(0);
   $sc->capture_stderr(1);

   my $cmd = "sysctl net.ipv4.conf.$device.forwarding";
   chomp(my $line = $sc->capture($cmd));

   $self->log->verbose("is_router_ipv4: cmd [$cmd]");
   $self->log->verbose("is_router_ipv4: returned [$line]");

   my @toks = split(/\s+/, $line);

   my $is_router = $toks[-1];

   $self->log->info("is_router_ipv4: ".($is_router ? "YES" : "NO"));

   return $is_router;
}

sub enable_router_ipv4 {
   my $self = shift;
   my ($device) = @_;

   $device ||= $self->device;
   $self->brik_help_run_undef_arg('enable_router_ipv4', $device) or return;

   my $sc = Metabrik::Shell::Command->new_from_brik_init($self) or return;
   $sc->as_matrix(0);
   $sc->as_array(0);
   $sc->capture_stderr(1);

   my $cmd = "sudo sysctl -w net.ipv4.conf.$device.forwarding=1";
   chomp(my $line = $sc->capture($cmd));

   $self->log->verbose("enable_router_ipv4: cmd [$cmd]"); 
   $self->log->verbose("enable_router_ipv4: returned [$line]");

   my @toks = split(/\s+/, $line);



( run in 0.480 second using v1.01-cache-2.11-cpan-39bf76dae61 )