mirror of
				https://github.com/Telecominfraproject/wlan-lanforge-scripts.git
				synced 2025-10-31 02:38:03 +00:00 
			
		
		
		
	 d824eb2e66
			
		
	
	d824eb2e66
	
	
	
		
			
			The 'use lib' logic happens in the pre-compile stage, so one cannot use normal 'if' logic to use a particular INC. Instead, just make sure that best dir is added to 'use lib' last since it prepends to INC.
		
			
				
	
	
		
			256 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			256 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/perl -w
 | |
| 
 | |
| # This program is used to create a hunt-script 
 | |
| # used for matrix load emulation on LANforge
 | |
| # (C) Candela Technologies 2015
 | |
| 
 | |
| use strict;
 | |
| use warnings;
 | |
| #use Carp;
 | |
| #$SIG{ __DIE__ } = sub { Carp::confess( @_ ) };
 | |
| 
 | |
| # Un-buffer output
 | |
| $| = 1;
 | |
| 
 | |
| # use lib prepends to @INC, so put lower priority first
 | |
| # This is before run-time, so cannot condition this with normal 'if' logic.
 | |
| use lib '/home/lanforge/scripts';
 | |
| use lib "./";
 | |
| 
 | |
| use LANforge::Endpoint;
 | |
| use LANforge::Port;
 | |
| use LANforge::Utils;
 | |
| use Net::Telnet ();
 | |
| use Getopt::Long;
 | |
| 
 | |
| use constant      NA          => "NA";
 | |
| use constant      NL          => "\n";
 | |
| use constant      shelf_num   => 1;
 | |
| 
 | |
| # Default values for ye ole cmd-line args.
 | |
| our $resource         = 1;
 | |
| our $quiet            = "yes";
 | |
| our $endp_name        = "";
 | |
| our $action           = "";
 | |
| our $lfmgr_host       = "localhost";
 | |
| our $lfmgr_port       = 4001;
 | |
| 
 | |
| our $script_name     = undef;
 | |
| our $script_type     = "";
 | |
| our $flags           = "";
 | |
| our $loops           = 0;
 | |
| our $private         = "";
 | |
| our $group_action    = "ALL";
 | |
| our $log_cli         = "unset"; # use ENV{LOG_CLI} elsewhere
 | |
| 
 | |
| ########################################################################
 | |
| # Nothing to configure below here, most likely.
 | |
| ########################################################################
 | |
| 
 | |
| =pod
 | |
| Below is an example of a set_script for script name bunny 
 | |
| set_script hunt-sta-A bunny 4096 ScriptHunt '60000 1000 50000,100000,500000,20,56000,30000,1,100000, 60,128,256,512,1024,1280,1460,1472,1514 60,128,256,512,1024,1280,1460,1472,1514 100,300,400,600,800,955 NONE' ALL 0
 | |
| which should follow this syntax:
 | |
| 
 | |
|    endp:          hunt-sta-A
 | |
|    name:          bunny
 | |
|    flags:         4096
 | |
|    type:          ScriptHunt
 | |
|    private:       '60000 1000 50000,100000,500000,20,56000,30000,1,100000, 60,128,256,512,1024,1280,1460,1472,1514 60,128,256,512,1024,1280,1460,1472,1514 100,300,400,600,800,955 NONE' 
 | |
|    group_action:  ALL
 | |
|    loop_count:    0
 | |
| 
 | |
| The private syntax is very opaque
 | |
|    ScriptHunt syntax is: run_duration pause_duration constraints payload_sizes_a payload_sizes_b attenuations attenuator
 | |
|    run_duration      60000
 | |
|    pause_duration    1000
 | |
|    constraints       50000,100000,500000,20,56000,30000,1,100000,
 | |
|    payload_sizes_a   60,128,256,512,1024,1280,1460,1472,1514 60,128,256,512,1024,1280,1460,1472,1514 100,300,400,600,800,955
 | |
|    payload_sizes_b   NONE
 | |
|    attenuations      ?
 | |
|    attenuator        ?
 | |
| =cut
 | |
| 
 | |
| 
 | |
| our $usage = qq<$0 ...
 | |
|   [--action { set_script|start_cx|quiece_cx|stop_cx|show_report|del_script } ]
 | |
|    set_script: configure a cx with script parameters set in script_type, script_flags
 | |
|    show_port:  show script report for cx
 | |
|    del_script: remove script from cx
 | |
|    start_cx:   start traffic on a connection (thus starting script)
 | |
|    quiece_cx:  stop transmitting traffic and wait a period before stopping connection recieve
 | |
|    stop_cx:    stop transmit and recieve immediately
 | |
|    # --action start_cx --cx_name bunbun
 | |
|   [--mgr          {host-name | IP}]
 | |
|   [--mgr_port     {ip port}]
 | |
|   [--resource     {number}]
 | |
|   [--quiet        { yes | no }]
 | |
|   [--endp_name    {endpoint name}]
 | |
|   [--cx_name      {endpoint name}]
 | |
|   [--script_type  {2544|Hunt|WanLink|Atten} ]
 | |
|                      2544        - RFC 2544 type script
 | |
|                      Hunt        - Hunt for maximum speed with constraints
 | |
|                      WanLink     - iterate thru wanlink settings
 | |
|                      Atten       - use with attenuators
 | |
|   [--flags        - see LF CLI User Guide script flags for set_port]
 | |
|   [--script_name  - script name]
 | |
|   [--loops        - how many time to loop before stopping; (0 is infinite)]
 | |
|   [--private      - the nested script-type parameters in a single string]
 | |
|   [--log_cli      {1|filename}]
 | |
| 
 | |
| Please refer to LANforge CLI Users Guide: http://www.candelatech.com/lfcli_ug.php#set_script
 | |
| 
 | |
| Examples:
 | |
| # add a script to an endpoint
 | |
| $0 --action set_script --script_type Hunt \\
 | |
|    --script_name bunny --endp_name cx3eth0 -loops 1 --flags 4096 \\
 | |
|    --private '60000 1000 50000,100000,500000,20,56000,30000,1,100000, 60,128,256,512,1024,1280,1460,1472,1514 60,128,256,512,1024,1280,1460,1472,1514 100,300,400,600,800,955 NONE' 
 | |
| 
 | |
| # start the cx to start the script:
 | |
| $0 --action start_cx --cx_name hunt-sta 
 | |
| 
 | |
| # quiesce the cx
 | |
| $0 --action quiece_cx --cx_name hunt-sta
 | |
| 
 | |
| # show the report
 | |
| $0 --action show_report --endp_name hunt-sta-A
 | |
| 
 | |
| # stop the cx
 | |
| $0 --action stop_cx --cx_name hunt-sta
 | |
| 
 | |
| # remove endpoint script
 | |
| $0 --action del_script --endp_name hunt-sta-A
 | |
| >;
 | |
| 
 | |
| my $i = 0;
 | |
| my $cmd;
 | |
| die($::usage) if (@ARGV < 2);
 | |
| 
 | |
| GetOptions
 | |
| (
 | |
|      'action|a=s'       => \$::action,
 | |
|      'mgr|m=s'          => \$::lfmgr_host,
 | |
|      'mgr_port|p=i'     => \$::lfmgr_port,
 | |
|      'resource|r=i'     => \$::resource,
 | |
|      'quiet|q=s'        => \$::quiet,
 | |
|      'endp_name|e=s'    => \$::endp_name,
 | |
|      'cx_name|c=s'      => \$::cx_name,
 | |
|      'script_type|t=s'  => \$::script_type,
 | |
|      'flags|f=i'        => \$::flags,
 | |
|      'script_name|n=s'  => \$::script_name,
 | |
|      'loops|l=i'        => \$::loops,
 | |
|      'private|b=s'      => \$::private,
 | |
|      'log_cli=s{0,1}'=> \$log_cli,
 | |
| ) || die("$::usage");
 | |
| 
 | |
| 
 | |
| die("please specify action\n$usage")
 | |
|    if (!defined $::action || $::action eq "");
 | |
| 
 | |
| if ($::action eq "set_script"
 | |
|    || $::action eq "show_report"
 | |
|    || $::action eq "del_script") {
 | |
|    die("please specify endpoint name\n$usage")
 | |
|       if (!defined $::endp_name || $::endp_name eq "");
 | |
| }
 | |
| if ($::action eq "set_script"
 | |
|    || $::action eq "del_script") {
 | |
| 
 | |
|    die("please specify script name\n$usage")
 | |
|       if (!defined $::script_name || $::script_name eq "");
 | |
| }
 | |
| 
 | |
| if (defined $log_cli) {
 | |
|   if ($log_cli ne "unset") {
 | |
|     # here is how we reset the variable if it was used as a flag
 | |
|     if ($log_cli eq "") {
 | |
|       $ENV{'LOG_CLI'} = 1;
 | |
|     }
 | |
|     else {
 | |
|       $ENV{'LOG_CLI'} = $log_cli;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| # Open connection to the LANforge server.
 | |
| 
 | |
| our $t = new Net::Telnet(Prompt => '/default\@btbits\>\>/',
 | |
|           Timeout => 20);
 | |
| $t->open(Host    => $lfmgr_host,
 | |
|          Port    => $lfmgr_port,
 | |
|          Timeout => 10);
 | |
| $t->waitfor("/btbits\>\>/");
 | |
| 
 | |
| # Configure our utils.
 | |
| our $utils = new LANforge::Utils();
 | |
| $utils->telnet($t);         # Set our telnet object.
 | |
| if ($::quiet eq "yes") {
 | |
|   $utils->cli_send_silent(1); # Do show input to CLI
 | |
|   $utils->cli_rcv_silent(1);  # Repress output from CLI ??
 | |
| }
 | |
| else {
 | |
|   $utils->cli_send_silent(0); # Do show input to CLI
 | |
|   $utils->cli_rcv_silent(0);  # Repress output from CLI ??
 | |
| }
 | |
| 
 | |
| $::utils->log_cli("# $0 ".`date "+%Y-%m-%d %H:%M:%S"`);
 | |
| our %script_types = (
 | |
|    "2544"         => "Script2544",
 | |
|    "Atten"        => "ScriptAtten",
 | |
|    "Hunt"         => "ScriptHunt",
 | |
|    "Script2544"   => "Script2544",
 | |
|    "ScriptAtten"  => "ScriptAtten",
 | |
|    "ScriptHunt"   => "ScriptHunt",
 | |
|    "ScriptWanLink"=> "ScriptWL",
 | |
|    "ScriptWL"     => "ScriptWL",
 | |
|    "WanLink"      => "ScriptWL",
 | |
| );
 | |
| 
 | |
| if ($::action eq "start_cx" 
 | |
|    || $::action eq "stop_cx"
 | |
|    || $::action eq "quiece_cx") {
 | |
|    die("Please state cx_name")
 | |
|       if (  !defined $::cx_name || $::cx_name eq "" );
 | |
| }
 | |
| 
 | |
| if ($::action eq "set_script") {
 | |
|    my $scr_type = $::script_types{ $::script_type };
 | |
|    die("Unknown script type [$::script_type]")
 | |
|       if (  !defined $::script_type
 | |
|          || !defined $scr_type
 | |
|          || $::script_type eq ""
 | |
|          || $scr_type eq "" );
 | |
|    die("Cannot use blank action.")
 | |
|       if (! defined $::private || $::private eq "");
 | |
| 
 | |
|    $cmd = $::utils->fmt_cmd("set_script", $::endp_name, "$::script_name", $::flags, $scr_type, "$::private", $::group_action, $::loops);
 | |
|    $::utils->doAsyncCmd($cmd);
 | |
| }
 | |
| elsif ($::action eq "show_report") {
 | |
|    $cmd = $::utils->fmt_cmd("show_script_results", $::endp_name);
 | |
|    $::utils->doAsyncCmd($cmd);
 | |
| }
 | |
| elsif ($::action eq "del_script") {
 | |
|    $cmd = $::utils->fmt_cmd("set_script", $::endp_name, "$::script_name", "0", "NA", "NONE");
 | |
|    $::utils->doAsyncCmd($cmd);
 | |
| }
 | |
| elsif ($::action eq "start_cx") {
 | |
|    $cmd = $::utils->fmt_cmd("set_cx_state", "ALL", $::cx_name, "RUNNING");
 | |
|    $::utils->doAsyncCmd($cmd);
 | |
| }
 | |
| elsif ($::action eq "quiece_cx") {
 | |
|    $cmd = $::utils->fmt_cmd("set_cx_state", "ALL", $::cx_name, "QUIESCE");
 | |
|    $::utils->doAsyncCmd($cmd);
 | |
| }
 | |
| elsif ($::action eq "stop_cx") {
 | |
|    $cmd = $::utils->fmt_cmd("set_cx_state", "ALL", $::cx_name, "STOPPED");
 | |
|    $::utils->doAsyncCmd($cmd);
 | |
| }
 | |
| else {
 | |
|    die( "Unknown action.\n$usage");
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| #eof
 |