#!/usr/bin/perl
use strict;
use warnings;
BEGIN {
$| = 1;
if ($> and ($^O ne 'VMS')) {
print "$0 requires root privilege\n";
exit 0;
}
};
use Net::Traceroute::PurePerl;
use Getopt::Long;
use vars qw($opt_V $opt_h $opt_f $opt_p $opt_m $opt_w $opt_q $opt_S $opt_i
$opt_l $opt_I $opt_D $opt_N $opt_n $host $VERSION);
$VERSION="1.0";
Getopt::Long::Configure('bundling');
GetOptions
(
"V" => \$opt_V, "version" => \$opt_V,
"h" => \$opt_h, "help" => \$opt_h,
"D+" => \$opt_D, "debug+" => \$opt_D,
"f=i" => \$opt_f, "firsthop=i" => \$opt_f,
"p=i" => \$opt_p, "baseport=i" => \$opt_p,
"m=i" => \$opt_m, "maxttl=i" => \$opt_m,
"w=i" => \$opt_w, "timeout=i" => \$opt_w,
"q=i" => \$opt_q, "nqueries=i" => \$opt_q,
"S=s" => \$opt_S, "sourceaddr=s" => \$opt_S,
"i=s" => \$opt_i, "interface=s" => \$opt_i,
"l=i" => \$opt_l, "packetlen=i" => \$opt_l,
"N=i" => \$opt_N, "concurrent=i" => \$opt_N,
"I" => \$opt_I, "icmp" => \$opt_I,
"n" => \$opt_n,
);
if ($opt_V) {
print "$0 version $VERSION\n";
exit 0;
}
if ($opt_h) {
usage();
exit 0;
}
my $debug = $opt_D || 0;
my $firsthop = $opt_f || 1;
my $baseport = $opt_p || 33434;
my $maxttl = $opt_m || 30;
my $qtimeout = $opt_w || 3;
my $queries = $opt_q || 3;
my $sourceaddr = $opt_S || '0.0.0.0';
my $interface = $opt_i || undef;
my $packetlen = $opt_l || 128;
my $useicmp = $opt_I || 0;
my $concurrent = $opt_N || 6;
my $resolve = ($opt_n) ? 0 : 1;
my $protocol = ($useicmp) ? 'icmp' : 'udp';
$host = $ARGV[0];
if (not $host)
{
usage();
exit 1;
}
my $t = Net::Traceroute::PurePerl->new(
host => $host,
debug => $debug,
first_hop => $firsthop,
base_port => $baseport,
max_ttl => $maxttl,
query_timeout => $qtimeout,
queries => $queries,
source_address => $sourceaddr,
packetlen => $packetlen,
protocol => $protocol,
concurrent_hops => $concurrent,
device => $interface,
);
$t->traceroute();
$t->pretty_print($resolve);
sub usage
{
print "usage: $0 [-hV] [-I] [-f first_ttl] [-m max_hops] [-p port]\n",
"\t[-S source_addr] [-i interface] [-l packetlen] [-N concurrent]\n",
"\t[-w timeout] [-q nqueries] host\n";
if ($opt_h)
{
print "\n",
" -h, --help display this help and exit\n",
" -V, --version display the version and exit\n",
" -n don't resolve router IPs to host names\n",
" -I, --icmp use ICMP instead of UDP\n",
" -f, --firsthop set the first hop TTL\n",
" -m, --maxttl set the maximum TTL before stopping\n",
" -p, --baseport set the first UDP port to use\n",
" -S, --sourceaddr set the source address to trace from\n",
" -i, --interface set the source interface to trace from\n",
" -l, --packetlen set the size of the packets to use\n",
" -w, --timeout set the query timeout\n",
" -q, --queries set the number of queries per hop\n";
" -N, --concurrent set the max number of concurrent queries\n";
}
}