# # (c) Jan Gehring <jan.gehring@gmail.com> # # vim: set ts=2 sw=2 tw=0: # vim: set expandtab: package Rex::Hardware::Network::OpenBSD; use strict; use warnings; our $VERSION = '1.7.0'; # VERSION use Rex::Logger; use Rex::Helper::Run; use Rex::Helper::Array; use Rex::Hardware::Network::FreeBSD; sub get_network_devices { return Rex::Hardware::Network::FreeBSD::get_network_devices(); } sub get_network_configuration { return Rex::Hardware::Network::FreeBSD::get_network_configuration(); } sub route { my @route = i_run "netstat -nr", fail_ok => 1; my @ret; if ( $? != 0 ) { die("Error running netstat"); } my ( $in_v6, $in_v4 ); for my $route_entry (@route) { if ( $route_entry eq "Internet:" ) { $in_v4 = 1; next; } if ( $route_entry eq "Internet6:" ) { $in_v6 = 1; $in_v4 = 0; next; } if ( $route_entry =~ m/^$/ ) { $in_v6 = 0; $in_v4 = 0; next; } if ( $route_entry =~ m/^AppleTalk/ ) { # kein appletalk ... next; } if ( $route_entry =~ m/^Destination/ ) { next; } if ($in_v4) { my ( $dest, $gw, $flags, $refs, $use, $mtu, $prio, $netif ) = split( /\s+/, $route_entry, 8 ); push( @ret, { destination => $dest, gateway => $gw, flags => $flags, iface => $netif, refs => $refs, mtu => $mtu, priority => $prio, } ); next; } if ($in_v6) { my ( $dest, $gw, $flags, $refs, $use, $mtu, $prio, $netif ) = split( /\s+/, $route_entry, 8 ); push( @ret, { destination => $dest, gateway => $gw, flags => $flags, iface => $netif, refs => $refs, mtu => $mtu, priority => $prio, } ); } } return @ret; } sub default_gateway { my ( $class, $new_default_gw ) = @_; if ($new_default_gw) { if ( default_gateway() ) { i_run "route delete default", fail_ok => 1; if ( $? != 0 ) { die("Error running route delete default"); } } i_run "route add default $new_default_gw", fail_ok => 1; if ( $? != 0 ) { die("Error route add default"); } } else { my @route = route(); my ($default_route) = grep { $_->{"flags"} =~ m/UG/ && ( $_->{"destination"} eq "0.0.0.0" || $_->{"destination"} eq "default" ) } @route; return $default_route->{"gateway"} if $default_route; } } sub netstat { my @ret; my @netstat = i_run "netstat -na", fail_ok => 1; if ( $? != 0 ) { die("Error running netstat"); } shift @netstat; my ( $in_inet, $in_unix ) = ( 0, 0 ); for my $line (@netstat) { if ( $line =~ m/^Proto\s*Recv/ ) { $in_inet = 1; next; } if ( $line =~ m/^Active Internet/ ) { next; } if ( $line =~ m/^Active UNIX/ ) { $in_inet = 0; $in_unix = 1; next; } if ( $line =~ m/^Address\s*Type/ ) { next; } if ($in_inet) { my ( $proto, $recvq, $sendq, $local_addr, $foreign_addr, $state ) = split( /\s+/, $line, 6 ); if ( $proto eq "tcp4" ) { $proto = "tcp"; } push( @ret, { proto => $proto, recvq => $recvq, sendq => $sendq, local_addr => $local_addr, foreign_addr => $foreign_addr, state => $state, } ); next; } if ($in_unix) { my ( $address, $type, $recvq, $sendq, $inode, $conn, $refs, $nextref, $addr ) = split( /\s+/, $line, 9 ); push( @ret, { proto => "unix", address => $address, refcnt => $refs, type => $type, inode => $inode, path => $addr, recvq => $recvq, sendq => $sendq, conn => $conn, nextref => $nextref, } ); next; } } return @ret; } 1; 1;