Traceroute Ping and wget
#!/usr/bin/perl -Tw
use strict;
use CGI qw(:all delete_all escapeHTML);
$|++;
$ENV{PATH} = "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/
+sbin";
my %progs = (
'Traceroute' => 'traceroute',
'Ping' => 'ping -c 15',
'wget' => 'wget -q -O -'
);
my $cache = get_cache_handle();
if (my $session = param('session')) {
my $data = $cache->get($session);
unless ($data and ref $data eq "ARRAY") {
show_form();
}
print header(),
start_html(
-title => 'Results',
($data->[0] ? () : (-head => ["<meta http-equiv=refresh content=
+5>"]))
),
h1('Results'),
pre( escapeHTML($data->[1]) );
print p( em('... continuing ...')) unless $data->[0];
print end_html();
exit 0;
} elsif (my $host = param('host')) {
($host) = $host =~ /^([a-zA-Z0-9.\-]{1,100})\z/ ?
$1 : show_form();
my $session = get_session_id();
$cache->set($session, [0, ""]);
if (my $pid = fork) {
delete_all();
param('session', $session);
print redirect(self_url());
} elsif (defined $pid) {
close STDOUT; close STDERR;
my ($prog) = grep { param($_) } keys %progs;
show_form() unless $prog;
open STDOUT, "$progs{$prog} $host |";
my $buf;
while (<STDOUT>) {
$buf .= $_;
$cache->set($session, [0, $buf]);
}
$cache->set($session, [1, $buf]);
exit 0;
} else {
die "Cannot fork: $!";
}
} else {
show_form();
}
sub show_form {
print header(),
start_html('Select Tool'),
h1('Enter Host and Select Tool'),
start_form(),
textfield('host'), ' ',
submit('Traceroute'), ' ',
submit('Ping'), ' ',
submit('wget'),
end_form(),
end_html();
exit 0;
}
sub get_cache_handle {
require Cache::FileCache;
Cache::FileCache->new({
namespace => 'tools',
username => 'nobody',
default_expires_in => '10 minutes',
auto_purge_interval => '2 hours',
});
}
sub get_session_id {
require Digest::MD5;
Digest::MD5::md5_hex(
Digest::MD5::md5_hex(time().{}.rand().$$)
);
}