ping tool, RT#5845
authorivan <ivan>
Mon, 14 Sep 2009 23:52:01 +0000 (23:52 +0000)
committerivan <ivan>
Mon, 14 Sep 2009 23:52:01 +0000 (23:52 +0000)
FS/FS/Mason.pm
httemplate/elements/popup_link-ping.html [new file with mode: 0644]
httemplate/misc/ping.html [new file with mode: 0644]
httemplate/misc/xmlhttp-ping.html [new file with mode: 0644]
httemplate/view/cust_main/packages/services.html
httemplate/view/svc_broadband.cgi

index f71db20..1918d9d 100644 (file)
@@ -52,6 +52,7 @@ Initializes the Mason environment, loads all Freeside and RT libraries, etc.
   use Date::Format;
   use Date::Parse;
   use Time::Local;
+  use Time::HiRes;
   use Time::Duration;
   use DateTime;
   use DateTime::Format::Strptime;
@@ -77,6 +78,17 @@ Initializes the Mason environment, loads all Freeside and RT libraries, etc.
   use Spreadsheet::WriteExcel;
   use Business::CreditCard 0.30; #for mask-aware cardtype()
   use NetAddr::IP;
+  use Net::Ping;
+  use Net::Ping::External;
+  #if CPAN #7815 ever gets fixed# if ( $Net::Ping::External::VERSION <= 0.12 ) {
+    eval 'sub Net::Ping::External::_ping_linux { 
+            my %args = @_;
+            my $command = "ping -s $args{size} -c $args{count} -w $args{timeout} $args{host}";
+            return Net::Ping::External::_ping_system($command, 0);
+          }
+         ';
+    die $@ if $@;
+  #}
   use String::Approx qw(amatch);
   use Chart::LinesPoints;
   use Chart::Mountain;
diff --git a/httemplate/elements/popup_link-ping.html b/httemplate/elements/popup_link-ping.html
new file mode 100644 (file)
index 0000000..9e5f143
--- /dev/null
@@ -0,0 +1,30 @@
+<%doc>
+
+Example:
+
+  include('/elements/init_overlib.html')
+
+  include( '/elements/popup_link-ping.html', { #hashref or a list, either way
+             'ip' => '10.9.8.7',
+  })
+
+</%doc>
+<% include('/elements/popup_link.html', $params ) %>\
+<%init>
+
+my $params = { 'closetext' => 'Close' };
+
+if (ref($_[0]) eq 'HASH') {
+  $params = { %$params, %{ $_[0] } };
+} else {
+  $params = { %$params, @_ };
+}
+
+$params->{'label'} ||= 'ping';
+$params->{'actionlabel'} ||= 'Ping '. $params->{'ip'};
+$params->{'width'} ||= 350;
+$params->{'height'} ||= 220;
+
+$params->{'action'} = $p. 'misc/ping.html?'. $params->{'ip'};
+
+</%init>
diff --git a/httemplate/misc/ping.html b/httemplate/misc/ping.html
new file mode 100644 (file)
index 0000000..4f0360e
--- /dev/null
@@ -0,0 +1,102 @@
+<% include('/elements/header-popup.html', "Ping $ip" ) %>
+
+<% include('/elements/xmlhttp.html',
+             'url'  => $p. 'misc/xmlhttp-ping.html',
+             'subs' => [ 'ping' ],
+          )
+%>
+
+%# <img src="<%$p%>images/bullet_red.png" border=0>
+
+
+<%ntable("#cccccc", 2)%>
+
+<TR>
+  <TD>Status</TD>
+  <TD BGCOLOR="#ffffff" ID="ping_status">Checking...</TD>
+</TR>
+<TR>
+  <TD>Packet loss</TD>
+  <TD BGCOLOR="#ffffff" ID="ping_packetloss"></TD>
+</TR>
+<TR>
+  <TD>Latency</TD>
+  <TD BGCOLOR="#ffffff" ID="ping_latency"></TD>
+</TR>
+<TR>
+  <TD>Packets</TD>
+  <TD BGCOLOR="#ffffff" ID="ping_packets"></TD>
+</TR>
+
+</TABLE>
+
+<BR>
+<CENTER>
+<INPUT TYPE="button" VALUE="Close" onClick="parent.nd(1);">
+</CENTER>
+
+<SCRIPT TYPE="text/javascript">
+
+  var fails = 0;
+  var pongs = 0;
+  var totaltime = 0;
+  var avg = 0;
+
+  function ping_update ( updatetext ) {
+    var pingArray = eval('(' + updatetext + ')');
+    var status = pingArray[0];
+    var rtt = pingArray[1];
+
+    if ( status == 0 ) {
+      fails++;
+    } else if ( status == 1 ) {
+      pongs++;
+      totaltime = totaltime + rtt;
+      avg = totaltime / pongs;
+    }
+
+    var loss = 100 * fails / ( fails + pongs );
+
+    var statusCell     = document.getElementById('ping_status');
+    var packetlossCell = document.getElementById('ping_packetloss');
+    var latencyCell    = document.getElementById('ping_latency');
+    var packetsCell    = document.getElementById('ping_packets');
+
+    var status = '';
+    // red conditions
+    if ( loss == 100 ) {
+      status = '<FONT COLOR="#ff0000">Unreachable</FONT>';
+    } else
+    // yellow conditions
+    if ( loss > 50 ) {
+      status = '<FONT COLOR="#ff9900">High packet loss</FONT>';
+    } else
+    if ( avg > 1 ) {
+      status = '<FONT COLOR="#ff9900">High latency</FONT>';
+    } else {
+      status = '<FONT COLOR="#00cc00">Up</FONT>';
+    }
+
+    statusCell.innerHTML = '<B>' + status + '</B>';
+    packetlossCell.innerHTML = '<B>' + Math.round(loss) + '%</B>';
+    if ( avg > 0 ) {
+      latencyCell.innerHTML = '<B>' + Math.round( avg*1000 ) + 'ms</B>';
+    }
+    var packets = fails + pongs;
+    packetsCell.innerHTML = '<B>' + packets + '</B>';
+
+    setTimeout( "ping('<%$ip%>', ping_update)", 1000 );
+
+  }
+
+  ping( '<%$ip%>', ping_update );
+
+</SCRIPT>
+
+<%init>
+
+my($query) = $cgi->keywords;
+$query =~ /^([\d\.]+)$/ or die 'Illegal IP';
+my $ip = $1;
+
+</%init>
diff --git a/httemplate/misc/xmlhttp-ping.html b/httemplate/misc/xmlhttp-ping.html
new file mode 100644 (file)
index 0000000..e993032
--- /dev/null
@@ -0,0 +1,20 @@
+<% objToJson($return) %>
+<%init>
+
+my $conf = new FS::Conf;
+
+my $sub = $cgi->param('sub');
+
+die "$sub not supported" unless $sub eq 'ping';
+
+my $ip = $cgi->param('arg');
+
+my $ping = new Net::Ping('external', 5);
+$ping->hires(1);
+#my $a=time; warn "pinging\n";
+my ($ret, $duration, $ip2) = $ping->ping($ip);
+#warn "done pinging (". int(time-$a). "s)\n";
+
+my $return = [ $ret, $duration ];
+
+</%init>
index 37cd615..0fe7931 100644 (file)
 
           <TD ALIGN="right" VALIGN="top" STYLE="padding-bottom:5px;padding-top:0px">
 
+%           my $ip_addr = $cust_svc->svc_x->ip_addr;
+
+%           if ( $part_svc->svcdb eq 'svc_broadband' ) {
+              <FONT SIZE="-1" STYLE="float:left">(&nbsp;<% include('/elements/popup_link-ping.html', 'ip'=> $ip_addr ) %>&nbsp;)</FONT>
+
+%           }
+
 %           my $manage_link = $opt{'svc_broadband-manage_link'};
 %           if ( $manage_link && $part_svc->svcdb eq 'svc_broadband' ) {
-%             my $ip_addr = $cust_svc->svc_x->ip_addr;
 %             my $svc_manage_link = eval(qq("$manage_link"));
               <FONT SIZE="-1" STYLE="float:left">(&nbsp;<A HREF="<% $svc_manage_link %>">Manage Device</A>&nbsp;)</FONT>
 
 %           }
 
-
 %           if ( $curuser->access_right('Unprovision customer service') ) { 
               <FONT SIZE="-2">(&nbsp;<%svc_unprovision_link($cust_svc)%>&nbsp;)</FONT>
 %           } 
index 0e9656b..1463925 100644 (file)
@@ -8,7 +8,9 @@
 ))
 %>
 
-<A HREF="<%${p}%>edit/svc_broadband.cgi?<%$svcnum%>">Edit this information</A>
+<% include('/elements/init_overlib.html') %>
+
+<A HREF="<%$p%>edit/svc_broadband.cgi?<%$svcnum%>">Edit this information</A>
 <BR>
 <%ntable("#cccccc")%>
   <TR>
 %       if ( $ip_addr ) { 
           <TR>
             <TD ALIGN="right">IP Address</TD>
-            <TD BGCOLOR="#ffffff"><%$ip_addr%></TD>
+            <TD BGCOLOR="#ffffff">
+              <%$ip_addr%>
+              (<% include('/elements/popup_link-ping.html', 'ip'=>$ip_addr ) %>)
+            </TD>
           </TR>
           <TR>
             <TD ALIGN="right">IP Netmask</TD>