!/usr/bin/perl
use strict;
$l++;
use CGI qw(:all); # import shortcuts
use Fcntl qw(:flock); # imports LOCK_EX, LOCK_SH, LOCK_NB
use CGI::Carp qw(warningsToBrowser fatalsToBrowser); # For Debugging
use Net::SSH::Perl;
use CGI qw(:all delete_all escapeHTML);
use Net::SSH::Perl::Constants qw( :msg );
my ($TITLE,$DeploySvr,$KIT,$ssh,$UNM,$Pass,$stdout,$stderr,$exit,$cmd,$session,$cache,$data,$pid,$packet,);
if (my $session = param('session'))
{ # returning to pick up session data
$cache = get_cache_handle();
$data = $cache->get($session);
unless ($data and ref $data eq "ARRAY")
{ # something is wrong
exit 0;
}
print header;
print start_html(-title => "Logging...",($data->[0] ? () : (-head => [""])));
print h1("Logging...");
print pre(escapeHTML($data->[1]));
print p(i("... continuing ...")) unless $data->[0];
print end_html;
}
else
{
$session = get_session_id();
$cache = get_cache_handle();
$cache->set($session, [0, ""]); # no data yet
$DeploySvr=param('DrpServer');
$KIT=param('TxtKit');
$UNM=param('username');
$Pass=param('password');
if ($pid = fork)
{ # parent does
delete_all(); # clear parameters
param('session', $session);
print redirect(self_url());
}
elsif (defined $pid)
{ # child does
close STDOUT; # so parent can go on
$DeploySvr="113.128.122.27";
unless (open F, "-|")
{
open STDERR, ">&=1";
exec "/usr/sbin/traceroute", $DeploySvr;
die "Cannot execute traceroute: $!";
}
my $buf = "";
while ()
{
$buf .= $_;
$cache->set($session, [0, $buf]);
}
$cache->set($session, [1, $buf]);
}
else
{
die "Cannot fork: $!";
}
}
sub get_cache_handle
{
require Cache::FileCache;
Cache::FileCache->new
({
namespace => 'LogOutput',
username => 'nobody',
default_expires_in => '30 minutes',
auto_purge_interval => '4 hours',
})
}
sub get_session_id
{
require Digest::MD5;
Digest::MD5::md5_hex(Digest::MD5::md5_hex(time().{}.rand().$$));
}