mirror of
https://github.com/Telecominfraproject/wlan-lanforge-scripts.git
synced 2025-10-28 17:32:35 +00:00
260 lines
8.1 KiB
Perl
Executable File
260 lines
8.1 KiB
Perl
Executable File
#!/usr/bin/perl -w
|
|
# This program is used to monitor and manage Layer4 connections
|
|
#
|
|
# Written by Candela Technologies Inc.
|
|
|
|
use strict;
|
|
use warnings;
|
|
use Carp;
|
|
# Un-buffer output
|
|
$| = 1;
|
|
use lib '/home/lanforge/scripts';
|
|
use LANforge::Endpoint;
|
|
use LANforge::Port;
|
|
use LANforge::Utils;
|
|
use Net::Telnet ();
|
|
use Getopt::Long;
|
|
|
|
use constant NA => "NA";
|
|
use constant NL => "\n";
|
|
our $shelf_num = 1;
|
|
our $utils;
|
|
# Default values for ye ole cmd-line args.
|
|
our $resource = 1;
|
|
our $quiet = "yes";
|
|
our $cx_name = "";
|
|
our $do_cmd = NA;
|
|
our $action = "show_port";
|
|
our $lfmgr_host = "localhost";
|
|
our $lfmgr_port = 4001;
|
|
our $cx_vals = undef;
|
|
our $stop_at = "";
|
|
our $fail_msg = "";
|
|
our $interval = 10;
|
|
our $reqs_sufx = qq<reqs*|requests*|urls*>;
|
|
our $bytes_sufx = qq<bytes*>;
|
|
our $secs_sufx = qq<secs*|seconds*>;
|
|
our $known_suffixes = qq<$reqs_sufx|$bytes_sufx|$secs_sufx>;
|
|
|
|
our $rx_bytes = 0;
|
|
our $url_count = 0;
|
|
our $runtime = 0;
|
|
our $is_running = 0;
|
|
|
|
########################################################################
|
|
# Nothing to configure below here, most likely.
|
|
########################################################################
|
|
# nice but not requested
|
|
# show_endp output can be narrowed with key-value arguments
|
|
#[--cx_vals {key,key,key,key}]
|
|
# Examples:
|
|
# --action show_cx --cx_vals MinTxRate,DestMAC,Avg-Jitter
|
|
|
|
my $usage = "$0 --action { show_cx | watch_cx | list_cx } ]
|
|
[--mgr {host-name | IP}]
|
|
[--mgr_port {ip port}]
|
|
[--cx_name {name}]
|
|
[--resource {number}]
|
|
[--interval {number of seconds}]
|
|
[--stop_at {[seconds]sec | [requests]req | [transferred]bytes}
|
|
req can also be: requests reqs url urls
|
|
[--quiet { yes | no }]
|
|
|
|
Example:
|
|
$0 --mgr jedtest --action watch_cx --cx_name gl4g00 --interval 2 --stop_at 3urls
|
|
";
|
|
|
|
my $i = 0;
|
|
|
|
GetOptions
|
|
(
|
|
'action|a=s' => \$action,
|
|
'cx_name|e=s' => \$cx_name,
|
|
'cx_vals|o=s' => \$cx_vals,
|
|
'mgr|m=s' => \$lfmgr_host,
|
|
'mgr_port|p=i' => \$lfmgr_port,
|
|
'resource|r=i' => \$resource,
|
|
'quiet|q=s' => \$quiet,
|
|
'stop_at|s=s' => \$stop_at,
|
|
'interval|i=i' => \$interval,
|
|
) || do_err_exit("$usage");
|
|
|
|
if ($do_cmd ne "NA") {
|
|
$action = "do_cmd";
|
|
}
|
|
|
|
if (!(($action eq "show_cx") ||
|
|
($action eq "watch_cx") ||
|
|
($action eq "list_cx") ||
|
|
($action eq "list_ports"))) {
|
|
do_err_exit("Invalid action: $action\n$usage\n");
|
|
}
|
|
|
|
do_err_exit("mgr should not be empty; $usage") if ("$lfmgr_host" eq "" );
|
|
do_err_exit("mgr_port should not be empty; $usage") if ("$lfmgr_port" eq "" );
|
|
do_err_exit("resource should not be empty; $usage") if ("$resource" eq "" );
|
|
|
|
if ($action eq "show_cx") {
|
|
do_err_exit("cx_name should not be empty; $usage") if ("$cx_name" eq "" );
|
|
}
|
|
elsif( $action eq "watch_cx") {
|
|
do_err_exit("stop_at should be greater than zero; $usage") if ("$stop_at" eq "");
|
|
do_err_exit("interval should be greater than zero; $usage") if ($interval < 1 );
|
|
do_err_exit("cx_name should not be empty; $usage") if ("$cx_name" eq "" );
|
|
|
|
if ($stop_at !~ /^\d+($known_suffixes)$/) {
|
|
do_err_exit("stop_at should not have spaces and should end with $known_suffixes; $usage");
|
|
}
|
|
}
|
|
|
|
## ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
|
|
sub do_err_exit {
|
|
my $errmsg = shift;
|
|
print $errmsg.NL;
|
|
exit(1);
|
|
}
|
|
|
|
## ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
|
|
# Open connection to the LANforge server.
|
|
# Wait up to 20 seconds when requesting info from LANforge.
|
|
sub init {
|
|
my $t = new Net::Telnet(Prompt => '/default\@btbits\>\>/',
|
|
Timeout => 20);
|
|
|
|
$t->open(Host => $lfmgr_host,
|
|
Port => $lfmgr_port,
|
|
Timeout => 10);
|
|
|
|
$t->waitfor("/btbits\>\>/");
|
|
|
|
$::utils = new LANforge::Utils();
|
|
$::utils->connect($lfmgr_host, $lfmgr_port);
|
|
}
|
|
## ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
|
|
|
|
## ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
|
|
sub stop_cx {
|
|
my $_name = $::cx_name;
|
|
$_name = "CX_".$::cx_name if ( $::cx_name !~ /^CX_/);
|
|
my $result = $utils->doAsyncCmd("set_cx_state default_tm $_name STOPPED");
|
|
print $result.NL;
|
|
}
|
|
## ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
|
|
|
|
## ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
|
|
sub summarize_cx {
|
|
my $name = $::cx_name;
|
|
do_err_exit("please call summarize_cx() with endpoint name") if (!defined $name || "$name" eq "");
|
|
|
|
$name = "CX_".$::cx_name if ( $::cx_name !~ /^CX_/);
|
|
my @lines = split(NL, $::utils->doAsyncCmd("show_cxe default_tm $name"));
|
|
|
|
for my $line (@lines) {
|
|
chomp $line;
|
|
if ( $line =~ /^L4Endp /) {
|
|
($line =~ /^L4Endp .*? \((\w+)\)/);
|
|
$::is_running = ("$1" eq "RUNNING") ? 1 : 0;
|
|
}
|
|
if ( $line =~ / RunningFor: /) {
|
|
($::runtime) = ($line =~ / RunningFor: (\d+s) /);
|
|
}
|
|
if ( $line =~ / URLs Processed: / ) {
|
|
($::url_count) = ($line =~ / Total: (\d+) /);
|
|
}
|
|
if ( $line =~ / Bytes Read: / ) {
|
|
($::rx_bytes) = ($line =~ / Total: (\d+) /);
|
|
}
|
|
}
|
|
}
|
|
## ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
|
|
|
|
|
|
|
|
## ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
|
|
##
|
|
## M A I N
|
|
##
|
|
## ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
|
|
|
|
# begin our connection.
|
|
init();
|
|
|
|
## ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
|
|
if( $action eq "list_cx") {
|
|
my @lines = split(NL, $utils->doAsyncCmd("show_endpoints"));
|
|
my $msg = "";
|
|
my $l4_flag = 0;
|
|
my $print_flag = 0;
|
|
for my $line (@lines) {
|
|
chomp $line;
|
|
|
|
$l4_flag = 1 if ( $line =~ /^L4Endp /);
|
|
next if (! $l4_flag);
|
|
|
|
if ( $line =~ /^L4Endp /) {
|
|
($msg) = ($line =~ /^L4Endp (.*)$/);
|
|
}
|
|
if ( $line =~ /^\s+URL: /) {
|
|
(my $u) = ($line =~ /^\s+URL: \S+ (\S+) /);
|
|
$msg .= " $u";
|
|
$print_flag = 1;
|
|
}
|
|
if ( $print_flag ) {
|
|
print $msg . NL;
|
|
$l4_flag = 0;
|
|
$print_flag = 0;
|
|
$msg = '';
|
|
}
|
|
}
|
|
exit 0;
|
|
}
|
|
|
|
## ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
|
|
if ($action eq "show_cx") {
|
|
my $_name = $::cx_name;
|
|
$_name = "CX_".$::cx_name if ( $::cx_name !~ /^CX_/);
|
|
print $utils->doAsyncCmd("show_cxe default_tm $_name") . NL;
|
|
exit 0;
|
|
}
|
|
|
|
if( $action eq "watch_cx") {
|
|
my $thresh;
|
|
($thresh) = ( $stop_at =~ /^(\d+)\w+$/);
|
|
do_err_exit("stop_at should be greater than zero; $usage") if ("$stop_at" eq "");
|
|
do_err_exit("stop_at should be greater than zero; $usage") if ($thresh < 1);
|
|
do_err_exit("interval should be greater than zero; $usage") if ($interval < 1 );
|
|
do_err_exit("cx_name should not be empty; $usage") if ("$cx_name" eq "" );
|
|
|
|
summarize_cx( $cx_name );
|
|
my $continue = 1;
|
|
while ($continue) {
|
|
sleep $interval;
|
|
summarize_cx( $cx_name );
|
|
print "$cx_name: " .($is_running ? "active":"inactive");
|
|
print " $::runtime, $::url_count urls, $::rx_bytes bytes\n";
|
|
|
|
# now check for bailout
|
|
#print "Thresh $thresh | $stop_at | runtime $::runtime urls $::url_count rx $::rx_bytes\n";
|
|
if ( $stop_at =~ /^\d+$secs_sufx$/ ) {
|
|
my ($rtime) = ($::runtime =~ /^(\d+)s/);
|
|
if ($rtime >= $thresh) {
|
|
$continue = 0;
|
|
}
|
|
}
|
|
elsif ( $stop_at =~ /^\d+($reqs_sufx)$/) {
|
|
if ($::url_count >= $thresh) {
|
|
$continue = 0;
|
|
}
|
|
}
|
|
elsif ( $stop_at =~ /^\d+$bytes_sufx*$/ ) {
|
|
if ($::rx_bytes >= $thresh) {
|
|
$continue = 0;
|
|
}
|
|
}
|
|
}
|
|
stop_cx();
|
|
print "connection $cx_name stopped.\n";
|
|
}
|
|
|
|
#eof
|