diff options
-rw-r--r-- | FS/FS/Mason.pm | 12 | ||||
-rw-r--r-- | httemplate/elements/popup_link-ping.html | 30 | ||||
-rw-r--r-- | httemplate/misc/ping.html | 102 | ||||
-rw-r--r-- | httemplate/misc/xmlhttp-ping.html | 20 | ||||
-rw-r--r-- | httemplate/view/cust_main/packages/services.html | 9 | ||||
-rw-r--r-- | httemplate/view/svc_broadband.cgi | 9 |
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">( <% include('/elements/popup_link-ping.html', 'ip'=> $ip_addr ) %> )</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">( <A HREF="<% $svc_manage_link %>">Manage Device</A> )</FONT> % } - % if ( $curuser->access_right('Unprovision customer service') ) { <FONT SIZE="-2">( <%svc_unprovision_link($cust_svc)%> )</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> |