summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--FS/FS/Mason.pm12
-rw-r--r--httemplate/elements/popup_link-ping.html30
-rw-r--r--httemplate/misc/ping.html102
-rw-r--r--httemplate/misc/xmlhttp-ping.html20
-rw-r--r--httemplate/view/cust_main/packages/services.html9
-rw-r--r--httemplate/view/svc_broadband.cgi9
6 files changed, 178 insertions, 4 deletions
diff --git a/FS/FS/Mason.pm b/FS/FS/Mason.pm
index f71db20..1918d9d 100644
--- a/FS/FS/Mason.pm
+++ b/FS/FS/Mason.pm
@@ -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
index 0000000..9e5f143
--- /dev/null
+++ b/httemplate/elements/popup_link-ping.html
@@ -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
index 0000000..4f0360e
--- /dev/null
+++ b/httemplate/misc/ping.html
@@ -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
index 0000000..e993032
--- /dev/null
+++ b/httemplate/misc/xmlhttp-ping.html
@@ -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>
diff --git a/httemplate/view/cust_main/packages/services.html b/httemplate/view/cust_main/packages/services.html
index 37cd615..0fe7931 100644
--- a/httemplate/view/cust_main/packages/services.html
+++ b/httemplate/view/cust_main/packages/services.html
@@ -41,15 +41,20 @@
<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>
% }
diff --git a/httemplate/view/svc_broadband.cgi b/httemplate/view/svc_broadband.cgi
index 0e9656b..1463925 100644
--- a/httemplate/view/svc_broadband.cgi
+++ b/httemplate/view/svc_broadband.cgi
@@ -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>
@@ -42,7 +44,10 @@
% 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>