#!/usr/bin/perl # # $Id: dnet.pl 19 2008-12-06 17:06:25Z gomor $ # use strict; use warnings; my $opt = shift || die("Usage"); my $cmd = shift || die("Usage"); my $arg = "@ARGV"; use Net::Libdnet qw(:consts); if ($opt =~ /intf/i) { intf_opt ($cmd, $arg) } elsif ($opt =~ /route/i) { route_opt($cmd, $arg) } elsif ($opt =~ /arp/i) { arp_opt ($cmd, $arg) } elsif ($opt =~ /fw/i) { fw_opt ($cmd, $arg) } elsif ($opt =~ /ip/i) { ip_opt ($cmd, $arg) } elsif ($opt =~ /eth/i) { eth_opt ($cmd, $arg) } #else { print_usage() } # # intf option handling # sub intf_opt { my ($cmd) = @_; use Net::Libdnet::Intf; my $h = Net::Libdnet::Intf->new; if ($cmd =~ /show/i) { $h->loop(\&intf_print); } elsif ($cmd =~ /get/i) { my $e = $h->get($arg); $e && intf_print($e); } elsif ($cmd =~ /set/i) { my $s = $h->set($arg); print $s ? "Success\n" : "Failed\n"; } elsif ($cmd =~ /src/i) { my $e = $h->getSrc($arg); $e && intf_print($e); } elsif ($cmd =~ /dst/i) { my $e = $h->getDst($arg); $e && intf_print($e); } #else { #intf_usage(); #} } sub intf_print { my ($e, $data) = @_; if (ref($e) eq 'HASH') { use Net::Libdnet::Entry::Intf; $e = Net::Libdnet::Entry::Intf->newFromHash($e); } print $e->print."\n"; } # # route handling # sub route_opt { my ($cmd) = @_; use Net::Libdnet::Route; my $h = Net::Libdnet::Route->new; if ($cmd =~ /show/i) { printf("%-30s %-30s\n", "Destination", "Gateway"); $h->loop(\&route_print); } elsif ($cmd =~ /get/i) { my $e = $h->get($arg); print $e ? "Gateway: $e\n" : "Same subnet\n"; } elsif ($cmd =~ /add/i) { my $s = $h->add(split(/ +/, $arg)); print $s ? "Success\n" : "Failed\n"; } elsif ($cmd =~ /delete/i) { my $s = $h->delete(split(/ +/, $arg)); print $s ? "Success\n" : "Failed\n"; } #else { #route_usage(); #} } sub route_print { my ($e, $data) = @_; printf("%-30s %-30s\n", $e->{route_dst}, $e->{route_gw}); } # # arp handling # sub arp_opt { my ($cmd) = @_; use Net::Libdnet::Arp; my $h = Net::Libdnet::Arp->new; if ($cmd =~ /show/i) { $h->loop(\&arp_print); } elsif ($cmd =~ /get/i) { my $e = $h->get($arg); print $e ? "link: $e\n" : "No link found\n"; } elsif ($cmd =~ /add/i) { my $s = $h->add(split(/ +/, $arg)); print $s ? "Success\n" : "Failed\n"; } elsif ($cmd =~ /delete/i) { my $s = $h->delete(split(/ +/, $arg)); print $s ? "Success\n" : "Failed\n"; } #else { #arp_usage(); #} } sub arp_print { my ($e, $data) = @_; printf("%s at %s\n", $e->{arp_pa}, $e->{arp_ha}); } # # fw handling # sub fw_opt { my ($cmd) = @_; use Net::Libdnet::Fw; my $h = Net::Libdnet::Fw->new; if ($cmd =~ /show/i) { $h->loop(\&fw_print); } elsif ($cmd =~ /add/i) { my $s = $h->add($arg); print $s ? "Success\n" : "Failed\n"; } elsif ($cmd =~ /delete/i) { my $s = $h->delete($arg); print $s ? "Success\n" : "Failed\n"; } #else { #fw_usage(); #} } sub fw_print { my ($e, $data) = @_; my $device = $e->{fw_device}; my $op = $e->{fw_op}; my $dir = $e->{fw_dir}; my $proto = $e->{fw_proto}; my $src = $e->{fw_src}; my $dst = $e->{fw_dst}; my $sport = $e->{fw_sport}; my $dport = $e->{fw_dport}; if ($op == DNET_FW_OP_ALLOW) { $op = "allow" } elsif ($op == DNET_FW_OP_BLOCK) { $op = "block" } if ($dir == DNET_FW_DIR_IN) { $dir = "in" } elsif ($dir == DNET_FW_DIR_OUT) { $dir = "out" } if ($proto == 6) { $proto = "tcp" } elsif ($proto == 17) { $proto = "udp" } elsif ($proto == 1) { $proto = "icmp" } $src = $src.':'.join('-', @$sport); $dst = $dst.':'.join('-', @$dport); print "$op $dir $device $proto $src $dst\n"; } # # ip handling # sub ip_opt { my ($cmd) = @_; use Net::Libdnet::Ip; my $h = Net::Libdnet::Ip->new; $h->send($cmd); } # # eth handling # sub eth_opt { my ($cmd, $arg) = @_; use Net::Libdnet::Eth; print "[$cmd] [$arg]\n"; my $h = Net::Libdnet::Eth->new(device => $cmd); $h->send($arg); }