mirror of
				https://github.com/Telecominfraproject/wlan-lanforge-scripts.git
				synced 2025-10-31 18:58:01 +00:00 
			
		
		
		
	lf_generic_ping.pl: various:
- improves sketchy port maching, fixes skipping ports lacking IP address - improves help
This commit is contained in:
		| @@ -24,8 +24,8 @@ | |||||||
| # done | # done | ||||||
| package main; | package main; | ||||||
| use strict; | use strict; | ||||||
| use diagnostics; |  | ||||||
| use warnings; | use warnings; | ||||||
|  | use diagnostics; | ||||||
| use Carp; | use Carp; | ||||||
| use Data::Dumper; | use Data::Dumper; | ||||||
| $SIG{ __DIE__ }   = sub { Carp::confess( @_ )}; | $SIG{ __DIE__ }   = sub { Carp::confess( @_ )}; | ||||||
| @@ -53,9 +53,10 @@ $0 --mgr {host-name | IP} | |||||||
|    --radio {wiphy} | --parent {eth} |    --radio {wiphy} | --parent {eth} | ||||||
|    --match {simple prefix, no stars or questions marks} |    --match {simple prefix, no stars or questions marks} | ||||||
|    --cmd {"double quoted command"} # can contain special parameters |    --cmd {"double quoted command"} # can contain special parameters | ||||||
|  |    --name {prefix to name connection, appended with padded number} | ||||||
|  |  | ||||||
|  Examples: |  Examples: | ||||||
|   $0 --mgr localhost --resource 1 --dest 192.168.0.1 -i wlan0 -i sta3000 |   $0 --mgr localhost --resource 1 --dest 192.168.0.1 -i wlan0 -i sta3000 --name "wlan_ping" | ||||||
|   This will match just sta3000 |   This will match just sta3000 | ||||||
|  |  | ||||||
|  All interfaces on a parent radio or MAC VLANs on parent Ethernet port: |  All interfaces on a parent radio or MAC VLANs on parent Ethernet port: | ||||||
| @@ -74,9 +75,13 @@ $0 --mgr {host-name | IP} | |||||||
|    %i port IPv4 address |    %i port IPv4 address | ||||||
|    %p port name |    %p port name | ||||||
|  |  | ||||||
|  Example command |  Example with curl wrapper provides better feedback to LANforge: | ||||||
|  $0 --cmd "curl -sqL --dns-ipv4-addr %i --dns-interface %p --interface %p --localaddr %i -o /tmp/results-%p http://%d/" |  $0 --mgr cholla-f19 -r 2 -n curl_ex_ --match 'eth2#' \\ | ||||||
|  |    --cmd './scripts/lf_curl.sh -n 10 -o /tmp/curl_%p.out -i %i -p %p -d %d' --dest http://localhost/ | ||||||
|  |  | ||||||
|  |  Example curl command doesn't provide good feedback to LANforge: | ||||||
|  |  $0 --cmd "curl -sqL --dns-ipv4-addr %i --dns-interface %p \\ | ||||||
|  |    --interface %p --localaddr %i -o /tmp/results-%p http://%d/" | ||||||
|  |  | ||||||
|  The default name of the generic endpoints given will be "lfping_[port]". |  The default name of the generic endpoints given will be "lfping_[port]". | ||||||
|  You can create multiple generic connections per port by altering |  You can create multiple generic connections per port by altering | ||||||
| @@ -108,6 +113,8 @@ our $radio        = ''; | |||||||
| our $pattern      = ''; | our $pattern      = ''; | ||||||
| our $name_pref    = "lfping"; | our $name_pref    = "lfping"; | ||||||
| our $ref_cmd      = ''; # user supplied command | our $ref_cmd      = ''; # user supplied command | ||||||
|  | our $ref_name     = ''; | ||||||
|  | our $verbose      = ((defined $ENV{'DEBUG'}) && ($ENV{'DEBUG'} eq "1")) ? 1:0; | ||||||
| my $help; | my $help; | ||||||
|  |  | ||||||
| if (@ARGV < 2) { | if (@ARGV < 2) { | ||||||
| @@ -120,6 +127,7 @@ GetOptions | |||||||
|   'mgr_port|p=i'              => \$lfmgr_port, |   'mgr_port|p=i'              => \$lfmgr_port, | ||||||
|   'resource|r=i'              => \$::resource, |   'resource|r=i'              => \$::resource, | ||||||
|   'quiet|q'                   => \$::quiet, |   'quiet|q'                   => \$::quiet, | ||||||
|  |   'verbose|v'                 => \$::verbose, | ||||||
|   'radio|parent|o=s'          => \$::radio, |   'radio|parent|o=s'          => \$::radio, | ||||||
|   'match=s'                   => \$::pattern, |   'match=s'                   => \$::pattern, | ||||||
|   'interface|intf|int|i=s'    => \@::interfaces, |   'interface|intf|int|i=s'    => \@::interfaces, | ||||||
| @@ -182,22 +190,22 @@ $utils->log_cli("# $0 ".`date "+%Y-%m-%d %H:%M:%S"`); | |||||||
| our @ports_lines = split("\n", $::utils->doAsyncCmd("nc_show_ports 1 $::resource ALL")); | our @ports_lines = split("\n", $::utils->doAsyncCmd("nc_show_ports 1 $::resource ALL")); | ||||||
| chomp(@ports_lines); | chomp(@ports_lines); | ||||||
| our %eid_map = (); | our %eid_map = (); | ||||||
| my ($eid, $card, $port, $type, $mac, $dev, $rh_eid, $parent, $ip); | my ($eid, $card, $port, $type, $mac, $dev, $parent, $ip); | ||||||
| foreach my $line (@ports_lines) { | foreach my $line (@ports_lines) { | ||||||
|   # collect all stations on that radio add them to @interfaces |   # collect all stations on that radio add them to @interfaces | ||||||
|   if ($line =~ /^Shelf: /) { |   if ($line =~ /^Shelf: /) { | ||||||
|     $card = undef; $port = undef; |     $card = undef; $port = undef; | ||||||
|     $type = undef; $parent = undef; |     $type = undef; $parent = undef; | ||||||
|     $eid = undef; $mac = undef; |     $eid = undef; $mac = undef; | ||||||
|     $dev = undef; $rh_eid = undef; |     $dev = undef; | ||||||
|     $ip = undef; |     $ip = undef; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   # careful about that comma after card! |   # careful about that comma after card! | ||||||
|   ($card, $port, $type) = $line =~ m/ Card: (\d+), +Port: (\d+) +Type: (\w+) /; |   ($card, $port, $type) = $line =~ m/^Shelf: 1, Card: (\d+), +Port: (\d+) +Type: (\w+) /; | ||||||
|   if ((defined $card) && ($card ne "") && (defined $port) && ($port ne "")) { |   if ((defined $card) && ($card ne "") && (defined $port) && ($port ne "")) { | ||||||
|     $eid = "1.${card}.${port}"; |     $eid = "1.${card}.${port}"; | ||||||
|     $rh_eid = { |     my $rh_eid = { | ||||||
|       eid => $eid, |       eid => $eid, | ||||||
|       type => $type, |       type => $type, | ||||||
|       parent => undef, |       parent => undef, | ||||||
| @@ -208,26 +216,28 @@ foreach my $line (@ports_lines) { | |||||||
|  |  | ||||||
|   ($mac, $dev) = $line =~ / MAC: ([0-9:a-fA-F]+)\s+DEV: (\S+)/; |   ($mac, $dev) = $line =~ / MAC: ([0-9:a-fA-F]+)\s+DEV: (\S+)/; | ||||||
|   if ((defined $mac) && ($mac ne "")) { |   if ((defined $mac) && ($mac ne "")) { | ||||||
|     $rh_eid->{mac} = $mac; |     $::eid_map{$eid}->{mac} = $mac; | ||||||
|     $rh_eid->{dev} = $dev; |     $::eid_map{$eid}->{dev} = $dev; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   ($parent) = $line =~ / Parent.Peer: (\S+) /; |   ($parent) = $line =~ / Parent.Peer: (\S+) /; | ||||||
|   if ((defined $parent) && ($parent ne "")) { |   if ((defined $parent) && ($parent ne "")) { | ||||||
|     $rh_eid->{parent} = $parent; |     $::eid_map{$eid}->{parent} = $parent; | ||||||
|   } |   } | ||||||
|   ($ip) = $line =~ m/ IP: ([^ ]+) +MASK: /; |  | ||||||
|  |   ($ip) = $line =~ m/ IP: *([^ ]+) */; | ||||||
|   if ((defined $ip) && ($ip ne "")) { |   if ((defined $ip) && ($ip ne "")) { | ||||||
|     $rh_eid->{ip} = $ip; |     $::eid_map{$eid}->{ip} = $ip; | ||||||
|   } |   } | ||||||
| } | } # foreach | ||||||
|  |  | ||||||
| #foreach $eid (keys %eid_map) { | #foreach $eid (keys %eid_map) { | ||||||
| #  print "eid $eid "; | #  print "eid $eid "; | ||||||
| #} | #} | ||||||
|  |  | ||||||
|  |  | ||||||
| if (defined $::radio) { | if (defined $::radio) { | ||||||
|   while (($eid, $rh_eid) = each %::eid_map) { |   while (my ($eid, $rh_eid) = each %::eid_map) { | ||||||
|     if ((defined $rh_eid->{parent}) && ($rh_eid->{parent} eq $::radio)) { |     if ((defined $rh_eid->{parent}) && ($rh_eid->{parent} eq $::radio)) { | ||||||
|       push(@interfaces, $rh_eid->{dev}); |       push(@interfaces, $rh_eid->{dev}); | ||||||
|     } |     } | ||||||
| @@ -238,7 +248,7 @@ if (defined $::pattern && $pattern ne "") { | |||||||
|    my $pat = $::pattern; |    my $pat = $::pattern; | ||||||
|    $pat =~ s/[+]//g; |    $pat =~ s/[+]//g; | ||||||
|    # collect all stations on that resource add them to @interfaces |    # collect all stations on that resource add them to @interfaces | ||||||
|    while (($eid, $rh_eid) = each %::eid_map) { |    while (my($eid, $rh_eid) = each %::eid_map) { | ||||||
|      if ((defined $rh_eid->{dev}) && ($rh_eid->{dev} =~ /$pat/)) { |      if ((defined $rh_eid->{dev}) && ($rh_eid->{dev} =~ /$pat/)) { | ||||||
|        push(@interfaces, $rh_eid->{dev}); |        push(@interfaces, $rh_eid->{dev}); | ||||||
|      } |      } | ||||||
| @@ -277,11 +287,16 @@ Parameters that can be replaced: | |||||||
| =cut | =cut | ||||||
| sub create_generic { | sub create_generic { | ||||||
|    my ($name, $port_name, $eid)=@_; |    my ($name, $port_name, $eid)=@_; | ||||||
|  |    #print "= 1 =====================================================\n"; | ||||||
|  |    #print Dumper($eid); | ||||||
|    my $endp_name = "${name_pref}_${port_name}"; |    my $endp_name = "${name_pref}_${port_name}"; | ||||||
|    my $type = "gen_generic"; |    my $type = "gen_generic"; | ||||||
|    my $rh_eid = $::eid_map{$eid}; |    my $rh_idr = $::eid_map{$eid}; | ||||||
|    my $port_ip = $rh_eid->{ip}; |    my $port_ip = $rh_idr->{'ip'}; | ||||||
|    #print Dumper($rh_eid); |    #print Dumper($rh_idr); | ||||||
|  |    #print Dumper($rh_idr->{'ip'}); | ||||||
|  |    #print "$endp_name PORT_IP $port_ip \n"; | ||||||
|  |    #print "= 2 =====================================================\n"; | ||||||
|    my $ping_cmd = "lfping -I $port_name $::dest_ip"; |    my $ping_cmd = "lfping -I $port_name $::dest_ip"; | ||||||
|    if ((defined $::ref_cmd) && ($::ref_cmd ne "")) { |    if ((defined $::ref_cmd) && ($::ref_cmd ne "")) { | ||||||
|       $ping_cmd = $::ref_cmd; |       $ping_cmd = $::ref_cmd; | ||||||
| @@ -306,7 +321,8 @@ sub create_generic { | |||||||
|       } |       } | ||||||
|    } |    } | ||||||
|    $::command_map{$eid} = $ping_cmd; |    $::command_map{$eid} = $ping_cmd; | ||||||
|    print "CMD: $ping_cmd\n"; |     | ||||||
|  |    print "CMD: $ping_cmd\n" if ($::verbose); | ||||||
|  |  | ||||||
|    $::utils->doCmd($::utils->fmt_cmd("add_gen_endp", $endp_name, 1, $::resource, $port_name, $type)); |    $::utils->doCmd($::utils->fmt_cmd("add_gen_endp", $endp_name, 1, $::resource, $port_name, $type)); | ||||||
|    $::utils->doCmd("set_gen_cmd $endp_name $ping_cmd"); |    $::utils->doCmd("set_gen_cmd $endp_name $ping_cmd"); | ||||||
| @@ -329,17 +345,38 @@ sub create_generic { | |||||||
| #print Dumper(\@interfaces); | #print Dumper(\@interfaces); | ||||||
| #print Dumper(\%::eid_map); | #print Dumper(\%::eid_map); | ||||||
| our %command_map = (); | our %command_map = (); | ||||||
| #my $type = "gen_generic"; | my @map_keys = sort keys %eid_map; | ||||||
| for my $port (sort @interfaces) { | for my $port (sort @interfaces) { | ||||||
|    my $endp_name = "${name_pref}_$port"; |    my $endp_name = "${name_pref}_$port"; | ||||||
|    my $matching_eid = ""; |    my $matching_eid = ""; | ||||||
|    while (my ($eid, $rh_eid) = each %eid_map) { |    #print "Searching for port $port "; | ||||||
|       if ($rh_eid->{dev} eq $port) { |    #while (my ($eid, $rh_pid) = each %eid_map) { | ||||||
|  |    for my $eid (@map_keys) { | ||||||
|  |       my $rh_pid = $eid_map{$eid}; | ||||||
|  |       #print " $port/$rh_pid->{dev} "; | ||||||
|  |       if ("$port" eq "$rh_pid->{dev}") { | ||||||
|  |          #print " ** "; | ||||||
|          $matching_eid = $eid; |          $matching_eid = $eid; | ||||||
|          last; |          last; | ||||||
|       } |       } | ||||||
|    } |    } | ||||||
|    print "EID $matching_eid\n"; |    if ($matching_eid eq "") { | ||||||
|  |       print "\nSkipping $port no eid [$matching_eid]\n"; | ||||||
|  |       next; | ||||||
|  |    } | ||||||
|  |    #print "\n= 3 =====================================================\n"; | ||||||
|  |    #print " $matching_eid => ".$eid_map{$matching_eid}->{dev}."\n"; | ||||||
|  |    #print Dumper($eid_map{$matching_eid}); | ||||||
|  |    #print "= 4 =====================================================\n"; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |    if (! (defined $eid_map{$matching_eid}->{ip})  | ||||||
|  |       || $eid_map{$matching_eid}->{ip} eq "" | ||||||
|  |       || $eid_map{$matching_eid}->{ip} eq "0.0.0.0") { | ||||||
|  |       print "\nSkipping $port: ".$eid_map{$matching_eid}->{ip}."\n"; | ||||||
|  |       sleep 1; | ||||||
|  |       next; | ||||||
|  |    } | ||||||
|    create_generic($endp_name, $port, $matching_eid); |    create_generic($endp_name, $port, $matching_eid); | ||||||
| } | } | ||||||
| #print Dumper(\%command_map); | #print Dumper(\%command_map); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Jed Reynolds
					Jed Reynolds