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 )