From b737fa5be7a5761ee9c1cad60d65ca8d0c066306 Mon Sep 17 00:00:00 2001 From: settlej <53984619+settlej@users.noreply.github.com> Date: Thu, 4 Jun 2020 23:04:05 -0400 Subject: [PATCH 01/14] Update capture_program.tcl --- capture_program.tcl | 1242 ++++++++++++++++++------------------------- 1 file changed, 531 insertions(+), 711 deletions(-) diff --git a/capture_program.tcl b/capture_program.tcl index 5a05ac9..e4d3cb3 100644 --- a/capture_program.tcl +++ b/capture_program.tcl @@ -41,11 +41,19 @@ proc progressbar {cur tot count} { puts -nonewline stderr $str } - -proc main {version protocol ipsource {ipdest any} {sinterface nothing} {duration {}} {size {}} } { +proc clear_screen {} { ios_config "line vty 0 15" "international" puts "\x1B\x5B\x32\x4A\x1B\x5B\x30\x3B\x30\x48" - ios_config "line vty 0 15" "no international" + ios_config "line vty 0 15" "no international" +} + +proc debugputs {msg} { + if {$debug == 1} { + puts $msg + } +} + +proc main {version protocol ipsource {ipdest any} {sinterface nothing} {duration {}} {size {}} } { if {$sinterface == "nothing"} { puts "\nCapture Type:\n 1.\) Interface \[default\]\n 2.\) Control-Plane" puts -nonewline "\nSelection: " @@ -58,7 +66,7 @@ proc main {version protocol ipsource {ipdest any} {sinterface nothing} {duration # get list of interfaces if {$ctype == "Interface"} { puts "\nAvailable Interfaces:" - set foundinterfaces [regexp -all -inline {[A-Za-z]+\d\/+[\d\/]+\s} [exec "show ip int br"]] + set foundinterfaces [regexp -all -inline {[A-Za-z]+\d\/+[\d\/]+\s} [exec "show ip int br"]] #set foundinterfaces [regexp -all -inline {([A-Za-z]+\d\/)+[\d\/]+} [exec "show ip int br"]] foreach {a b c d e f g} [join $foundinterfaces ","] {puts "$a $b $c $d $e $f $g"} set i 0 @@ -101,16 +109,16 @@ proc main {version protocol ipsource {ipdest any} {sinterface nothing} {duration proc versionsearch {version protocol ipsource ipdest ctype sinterface duration size} { switch -glob $version { - 9* {capture_commands9000 $protocol $ipsource $ipdest $ctype $sinterface $duration $size} - 44* {capture_commands4400 $protocol $ipsource $ipdest $ctype $sinterface $duration $size} - 1004 {capture_commands4400 $protocol $ipsource $ipdest $ctype $sinterface $duration $size} - 45* {capture_commands4500 $protocol $ipsource $ipdest $ctype $sinterface $duration $size} - 38* {capture_commands3800 $protocol $ipsource $ipdest $ctype $sinterface $duration $size} - 3* {capture_commands3000 $protocol $ipsource $ipdest $ctype $sinterface $duration $size} + 9* {capture_commands9000 $protocol $ipsource $ipdest $ctype $sinterface $duration $size} + 44* {capture_commands4400 $protocol $ipsource $ipdest $ctype $sinterface $duration $size} + 1004 {capture_commands4400 $protocol $ipsource $ipdest $ctype $sinterface $duration $size} + 45* {capture_commands4500 $protocol $ipsource $ipdest $ctype $sinterface $duration $size} + 38* {capture_commands3800 $protocol $ipsource $ipdest $ctype $sinterface $duration $size} + 3* {capture_commands3000 $protocol $ipsource $ipdest $ctype $sinterface $duration $size} 100* {capture_commands1000 $protocol $ipsource $ipdest $ctype $sinterface $duration $size} default {puts "Unsupported Version!"} - } - } + } +} proc startcapture {version protocol ipsource ipdest ctype sinterface duration size} { @@ -118,757 +126,555 @@ proc startcapture {version protocol ipsource ipdest ctype sinterface duration si puts [string repeat - 37] if {$sinterface != "nothing" || $sinterface == "control"} { puts "Capture: $sinterface \nDuration: $duration Sec \nFile Size: $size MB" - } else { + } else { puts "Capture Type: Control-Plane \nDuration: $duration Sec \nFile Size: $size MB" - } + } if { $ipsource == "any" && $ipdest == "any" } { puts "Capture ACL: $protocol any any" } else { puts "Capture ACL: $protocol $ipsource $ipdest - $protocol $ipdest $ipsource" + $protocol $ipdest $ipsource" } puts "Capture location: flash:CAPTURE.pcap" puts [string repeat - 37] puts "" - if {$protocol == "ip" && $ipsource == "any" && $ipdest == "any"} { - puts "****WARNING!**** Using \"ip any any\" may create stress on CPU, if possible try to limit to tcp/udp/eigrp/ospf/icmp. - Also make sure time duration is at a reasonable time if monitoring high load interface."} - if {[expr $duration > 300]} {puts "***TERMINIATING! Duration is greater than 300 sec ***"; return} + if {$protocol == "ip" && $ipsource == "any" && $ipdest == "any"} { + puts "****WARNING!**** Using \"ip any any\" may create stress on CPU, if possible try to limit to tcp/udp/eigrp/ospf/icmp. + Also make sure time duration is at a reasonable time if monitoring high load interface." + } + if {[expr $duration > 300]} { + puts "***TERMINIATING! Duration is greater than 300 sec ***"; return + } if [catch {exec "dir flash: | i free"} result] { - set result [exec "dir bootflash: | i free"] - } - set flashsize $result + set result [exec "dir bootflash: | i free"] + } + set flashsize $result set bytesizefree [lindex [regexp -all -inline {\S+} [lindex [split $flashsize {(}] 1]] 0] - set bytesizefree "${bytesizefree}.0" - if {[expr [expr $bytesizefree - $size] < 10000]} {puts "***TERMINATING! Not enought Free Space Available*** "; return} - if {[expr $size > 99]} {puts "***TERMINATING! Size is greater than 99 MB ***"; return} - if {[expr $duration > 120]} {puts "***WARNING! Greater than 120 sec capture, use with Caution ***"} - if {[expr $size > 70]} {puts "***WARNING! File size greater than 70 MB will be saved to flash make sure flash has enough room!***"} - puts "" + set bytesizefree "${bytesizefree}.0" + if {[expr [expr $bytesizefree - $size] < 10000]} { + puts "***TERMINATING! Not enought Free Space Available*** "; return + } + if {[expr $size > 99]} { + puts "***TERMINATING! Size is greater than 99 MB ***"; return + } + if {[expr $duration > 120]} { + puts "***WARNING! Greater than 120 sec capture, use with Caution ***" + } + if {[expr $size > 70]} { + puts "***WARNING! File size greater than 70 MB will be saved to flash make sure flash has enough room!***" + } + puts "" puts -nonewline "Start? \[yes\|no\]: " flush stdout gets stdin {start} switch -glob $start { - y* {versionsearch $version $protocol $ipsource $ipdest $ctype $sinterface $duration $size} - default { - puts "\nCanceling!" - } - } + y* { versionsearch $version $protocol $ipsource $ipdest $ctype $sinterface $duration $size} + default { puts "\nCanceling!" } + } } - - - -proc capture_commands3000 { protocol ipsource ipdest ctype sinterface duration size} { - exec "monitor capture point stop all" - ios_config "no access-list 199" - ios_config "access-list 199" - if { $ipsource == "any" && $ipdest == "any" } { - set any_s_d " permit $protocol any any" - } else { - if { $ipsource != "any" && $ipdest != "any" } { - if { $protocol == "tcp" || $protocol == "udp" } { - if { [regexp -nocase {\:} $ipsource] && [regexp -nocase {\:} $ipdest] } { - set sourcesplit [ split $ipsource {:} ] - set destsplit [ split $ipdest {:} ] - set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] host [lindex $destsplit 0] eq [lindex $destsplit 1]" - set dest_source "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - - } else { - if { [regexp -nocase {\:} $ipsource] || [regexp -nocase {\:} $ipdest] } { - if { [regexp -nocase {\:} $ipsource] } { - set sourcesplit [ split $ipsource {:} ] - set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] host $ipdest" - set dest_source "permit $protocol host $ipdest host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - } else { - set destsplit [ split $ipdest {:} ] - set source_dest "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] host $ipsource" - set dest_source "permit $protocol host $ipsource host [lindex $destsplit 0] eq [lindex $destsplit 1]" - } - } - } - } else { - set source_dest "permit ip host $ipsource host $ipdest" - set dest_source "permit ip host $ipdest host $ipsource" - } - } else { - if { $ipsource == "any" && $ipdest != "any" } { + +proc acl_generator {protocol ipsource ipdest} { + if { $ipsource == "any" && $ipdest == "any" } { + set any_s_d " permit $protocol any any" + } else { + if { $ipsource != "any" && $ipdest != "any" } { if { $protocol == "tcp" || $protocol == "udp" } { - if { [regexp -nocase {\:} $ipdest ] } { - set destsplit [ split $ipdest {:} ] - set dest_source "permit $protocol $ipsource host [lindex $destsplit 0] eq [lindex $destsplit 1]" - if {[regexp -nocase {any} $ipdest]} { - set source_dest "permit $protocol $ipsource [lindex $destsplit 0] eq [lindex $destsplit 1]" - } else { - set source_dest "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] $ipsource" - } - } else { - set source_dest " permit $protocol any host $ipdest" - set dest_source " permit $protocol host $ipdest any" + if { [regexp {\:} $ipsource] && [regexp {\:} $ipdest] } { + set sourcesplit [ split $ipsource {:} ] + set destsplit [ split $ipdest {:} ] + if {[regexp -nocase {any} $ipdest] || [regexp -nocase {any} $ipsource]} { + if {[regexp -nocase {any} $ipdest]} { + set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] [lindex $destsplit 0] eq [lindex $destsplit 1]" + set dest_source "permit $protocol [lindex $destsplit 0] eq [lindex $destsplit 1] host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" + } else { + set source_dest "permit $protocol [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] host [lindex $destsplit 0] eq [lindex $destsplit 1]" + set dest_source "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" + } + } else { + set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] host [lindex $destsplit 0] eq [lindex $destsplit 1]" + set dest_source "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" + } + + + } else { + if { [regexp {\:} $ipsource] || [regexp {\:} $ipdest] } { + if { [regexp {\:} $ipsource] } { + set sourcesplit [ split $ipsource {:} ] + if {[regexp -nocase {any} $ipsource] } { + if {[regexp -nocase {any} $ipsource] } { + set source_dest "permit $protocol [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] host $ipdest" + set dest_source "permit $protocol host $ipdest [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" + } else { + set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] $ipdest" + set dest_source "permit $protocol $ipdest host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" + } + } else { + # set destsplit [ split $ipdest {:} ] + if {[regexp -nocase {any} $ipdest] } { + set source_dest "permit $protocol $ipdest host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" + set dest_source "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] $ipdest" + } else { + set source_dest "permit $protocol host $ipdest host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" + set dest_source "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] host $ipdest" + } + } + } else { + set destsplit [ split $ipdest {:} ] + if {[regexp -nocase {any} $ipdest] } { + set source_dest "permit $protocol [lindex $destsplit 0] eq [lindex $destsplit 1] host $ipsource" + set dest_source "permit $protocol host $ipsource [lindex $destsplit 0] eq [lindex $destsplit 1]" + } else { + set source_dest "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] host $ipsource" + set dest_source "permit $protocol host $ipsource host [lindex $destsplit 0] eq [lindex $destsplit 1]" + } + } + } else { + set source_dest "permit $protocol host $ipsource host $ipdest" + set dest_source "permit $protocol host $ipdest host $ipsource" + } } } else { - set source_dest "permit ip any host $ipdest" - set dest_source "permit ip host $ipdest any" - } - } else { - if { $protocol == "tcp" || $protocol == "udp" } { - if { [regexp -nocase {\:} $ipsource ] } { - set sourcesplit [ split $ipsource {:} ] - set f 4 - set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] any" - if {[regexp -nocase {any} $ipsource]} { - set dest_source "permit $protocol any [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - } else { - set dest_source "permit $protocol any host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - } - } else { - set source_dest " permit $protocol any host $ipsource" - set dest_source " permit $protocol host $ipsource any" - } + set source_dest "permit ip host $ipsource host $ipdest" + set dest_source "permit ip host $ipdest host $ipsource" + } + } else { + if { $ipsource == "any" && $ipdest != "any" } { + if { $protocol == "tcp" || $protocol == "udp" } { + if { [regexp {\:} $ipdest ] } { + set destsplit [ split $ipdest {:} ] + if {[regexp -nocase {any} $ipdest]} { + set source_dest "permit $protocol $ipsource [lindex $destsplit 0] eq [lindex $destsplit 1]" + set dest_source "permit $protocol [lindex $destsplit 0] eq [lindex $destsplit 1] $ipsource" + } else { + set source_dest "permit $protocol $ipsource host [lindex $destsplit 0] eq [lindex $destsplit 1]" + set dest_source "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] $ipsource" + } + } else { + set source_dest " permit $protocol any host $ipdest" + set dest_source " permit $protocol host $ipdest any" + } + } else { + set source_dest "permit ip any host $ipdest" + set dest_source "permit ip host $ipdest any" + } } else { - set source_dest "permit ip host $ipsource any" - set dest_source "permit ip $ipdest any host $ipsource" + if { $protocol == "tcp" || $protocol == "udp" } { + if { [regexp {\:} $ipsource ] } { + set sourcesplit [ split $ipsource {:} ] + if {[regexp -nocase {any} $ipsource]} { + set source_dest "permit $protocol [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] $ipdest" + set dest_source "permit $protocol $ipdest [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" + } else { + set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] $ipdest" + set dest_source "permit $protocol $ipdest host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" + } + } else { + set source_dest " permit $protocol any host $ipsource" + set dest_source " permit $protocol host $ipsource any" + } + } else { + set source_dest "permit ip host $ipsource any" + set dest_source "permit ip $ipdest any host $ipsource" + } } - } + } } - } if {[info exists any_s_d]} { - ios_config "access-list 199 $any_s_d" + return $any_s_d } else { - puts "$source_dest | $dest_source" - ios_config "access-list 199 $source_dest" - ios_config "access-list 199 $dest_source" + return "$source_dest:$dest_source" } - exec "monitor capture buffer BUFF linear" - exec "monitor capture buffer BUFF filter access-list 199" - set buffsize [expr $size * 1000] - exec "monitor capture buffer BUFF size $buffsize" - # <256-102400 Kbytes> - exec "monitor capture buffer BUFF limit duration $duration" - # <1-2000 sec> - exec "monitor capture buffer BUFF max-size 1600" - if {$ctype == "control"} { - exec "monitor capture point ip process-switched POINT both" - } else { - exec "monitor capture point ip cef POINT $sinterface both" +} + +proc capture_commands3000 { protocol ipsource ipdest ctype sinterface duration size} { + exec "monitor capture point stop all" + ios_config "no access-list 199" + ios_config "access-list 199" + set aclresults [split [acl_generator $protocol $ipsource $ipdest] ":"] + if {[llength $aclresults] == 1} { + set any_s_d [lindex $aclresults 0] + } else { + set source_dest [lindex $aclresults 0] + set dest_source [lindex $aclresults 1] } - exec "monitor capture point associate POINT BUFF" - # show monitor capture buffer BUFF parameters - # or show monitor capture buffer BUFF dump - exec "monitor capture point start POINT" - set total $duration - for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "Starting!\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} - puts "" - set check [exec "show monitor capture point POINT"] - set stop 0 - while {$stop < 2} { - if {[regexp {Inactive} $check]} { - set stop 3; - } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture point POINT"]; incr stop} - } - puts "Exporting capture to flash:CAPTURE.pcap" - exec "monitor capture point stop POINT" - exec "monitor capture buffer BUFF export flash:CAPTURE.pcap" - if {$ctype == "control"} { - exec "no monitor capture point ip process-switched POINT both" - } else { - exec "no monitor capture point ip cef POINT $sinterface both" - } - exec "no monitor capture buffer BUFF" - puts "\nDone!\n" - finish_statement + if {[info exists any_s_d]} { + ios_config "access-list 199 $any_s_d" + } else { + puts "$source_dest | $dest_source" + ios_config "access-list 199 $source_dest" + ios_config "access-list 199 $dest_source" + } + exec "monitor capture buffer BUFF linear" + exec "monitor capture buffer BUFF filter access-list 199" + set buffsize [expr $size * 1000] + exec "monitor capture buffer BUFF size $buffsize" + # <256-102400 Kbytes> + exec "monitor capture buffer BUFF limit duration $duration" + # <1-2000 sec> + exec "monitor capture buffer BUFF max-size 1600" + if {$ctype == "control"} { + exec "monitor capture point ip process-switched POINT both" + } else { + exec "monitor capture point ip cef POINT $sinterface both" + } + exec "monitor capture point associate POINT BUFF" + # show monitor capture buffer BUFF parameters + # or show monitor capture buffer BUFF dump + exec "monitor capture point start POINT" + set total $duration + for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "Starting!\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} + puts "" + set check [exec "show monitor capture point POINT"] + set stop 0 + while {$stop < 2} { + if {[regexp {Inactive} $check]} { + set stop 3; + } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture point POINT"]; incr stop} + } + puts "Exporting capture to flash:CAPTURE.pcap" + exec "monitor capture point stop POINT" + exec "monitor capture buffer BUFF export flash:CAPTURE.pcap" + if {$ctype == "control"} { + exec "no monitor capture point ip process-switched POINT both" + } else { + exec "no monitor capture point ip cef POINT $sinterface both" + } + exec "no monitor capture buffer BUFF" + puts "\nDone!\n" + finish_statement } + + +proc find_dest_next_hop_interface {destlookupnexthop} { + set lookup [exec "show ip cef $destlookupnexthop detail | i nexthop"] + set nexthopinterface [lindex [split $lookup ] end] + if {[regexp {[V|v]lan} $nexthopinterface]} { + set arpaddr [lindex [split $lookup ] end-1] + set mac [lindex [regexp -inline -all {\S+} [exec "sho ip arp | i $arpaddr"] ] 3] + set vlannum [regexp -inline -all {\d+} $nexthopinterface] + set macoutput [exec "show mac add vlan $vlannum | i $mac"] + set interface [lindex [regexp -inline -all {\S+} $macoutput ] end] + return $interface + } else { + return $nexthopinterface + } +} proc capture_commands4500 { protocol ipsource ipdest ctype sinterface duration size} { - if { $ipsource == "any" && $ipdest == "any" } { - set any_s_d " permit $protocol any any" + if {$ctype != "control"} { + if {[regexp {any} $ipdest]} { + set destlookupnexthop "0.0.0.0/0" + } else { + if {[regexp {:} $ipdest]} { + set destlookupnexthop [lindex [split $ipdest {:}] 0] + } else { + set destlookupnexthop $ipdest + } + } + set interfaceresult [find_dest_next_hop_interface $destlookupnexthop] + if {$interfaceresult != ""}{ + set additionalinterface $interfaceresult + puts "Found Reverse Interface: $additionalinterface \n" + } + } + + set aclresults [split [acl_generator $protocol $ipsource $ipdest] ":"] + if {[llength $aclresults] == 1} { + set any_s_d [lindex $aclresults 0] } else { - if { $ipsource != "any" && $ipdest != "any" } { - if { $protocol == "tcp" || $protocol == "udp" } { - if { [regexp -nocase {\:} $ipsource] && [regexp -nocase {\:} $ipdest] } { - set sourcesplit [ split $ipsource {:} ] - set destsplit [ split $ipdest {:} ] - set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] host [lindex $destsplit 0] eq [lindex $destsplit 1]" - set dest_source "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - } else { - if { [regexp -nocase {\:} $ipsource] || [regexp -nocase {\:} $ipdest] } { - if { [regexp -nocase {\:} $ipsource] } { - set sourcesplit [ split $ipsource {:} ] - set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] host $ipdest" - set dest_source "permit $protocol host $ipdest host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - } else { - set destsplit [ split $ipdest {:} ] - set source_dest "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] host $ipsource" - set dest_source "permit $protocol host $ipsource host [lindex $destsplit 0] eq [lindex $destsplit 1]" - } - } - } - } else { - set source_dest "permit ip host $ipsource host $ipdest" - set dest_source "permit ip host $ipdest host $ipsource" - } + set source_dest [lindex $aclresults 0] + set dest_source [lindex $aclresults 1] + } + if { [info exists any_s_d] } { + ios_config "ip access-list ex CAPTURE-FILTER" "$any_s_d" + set captureacl "$any_s_d" } else { - if { $ipsource == "any" && $ipdest != "any" } { - if { $protocol == "tcp" || $protocol == "udp" } { - if { [regexp -nocase {\:} $ipdest ] } { - set destsplit [ split $ipdest {:} ] - set dest_source "permit $protocol $ipsource host [lindex $destsplit 0] eq [lindex $destsplit 1]" - if {[regexp -nocase {any} $ipdest]} { - set source_dest "permit $protocol $ipsource [lindex $destsplit 0] eq [lindex $destsplit 1]" - } else { - set source_dest "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] $ipsource" - } - } else { - set source_dest " permit $protocol any host $ipdest" - set dest_source " permit $protocol host $ipdest any" - } - } else { - set source_dest "permit ip any host $ipdest" - set dest_source "permit ip host $ipdest any" - } - } else { - if { $protocol == "tcp" || $protocol == "udp" } { - if { [regexp -nocase {\:} $ipsource ] } { - set sourcesplit [ split $ipsource {:} ] - set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] any" - if {[regexp -nocase {any} $ipsource]} { - set dest_source "permit $protocol any [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - } else { - set dest_source "permit $protocol any host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - } - } else { - set source_dest " permit $protocol any host $ipsource" - set dest_source " permit $protocol host $ipsource any" - } - } else { - set source_dest "permit ip host $ipsource any" - set dest_source "permit ip $ipdest any host $ipsource" - } - } + ios_config "ip access-list ex CAPTURE-FILTER" "$source_dest" "$dest_source" + set captureacl "$source_dest \n $dest_source" + } + + no monitor capture CAPTURE + if {[file exists bootflash:CAPTURE.pcap]} { + file delete -force -- bootflash:CAPTURE.pcap + } + ios_config "class-map CAPTURE_CLASS_MAP" "match access-group name CAPTURE-FILTER" + set buffersize [expr $size + 10] + if {$ctype == "control"} { + monitor capture CAPTURE class-map CAPTURE_CLASS_MAP + monitor capture CAPTURE file location bootflash:CAPTURE.pcap buffer-size $buffersize size $size control-plane both + monitor capture CAPTURE limit duration $duration packet-len 1600 + } else { + monitor capture CAPTURE class-map CAPTURE_CLASS_MAP + monitor capture CAPTURE limit packet-len 1600 + monitor capture CAPTURE interface $sinterface both file location bootflash:CAPTURE.pcap buffer-size $size limit duration $duration + if {[info exists $additionalinterface]} { + monitor capture CAPTURE interface $additionalinterface in } - } - if { [info exists any_s_d] } { - ios_config "ip access-list ex CAPTURE-FILTER" "$any_s_d" - set captureacl "$any_s_d" - } else { - ios_config "ip access-list ex CAPTURE-FILTER" "$source_dest" "$dest_source" - set captureacl "$source_dest \n $dest_source" } - exec "no monitor capture CAPTURE" - if {[file exists bootflash:CAPTURE.pcap]} { - file delete -force -- bootflash:CAPTURE.pcap - } - ios_config "class-map CAPTURE_CLASS_MAP" "match access-group name CAPTURE-FILTER" - set buffersize [expr $size + 10] - if {$ctype == "control"} { - monitor capture CAPTURE class-map CAPTURE_CLASS_MAP - monitor capture CAPTURE file location bootflash:CAPTURE.pcap buffer-size $buffersize size $size control-plane both - monitor capture CAPTURE limit duration $duration packet-len 1600 - } else { - monitor capture CAPTURE class-map CAPTURE_CLASS_MAP - monitor capture CAPTURE limit packet-len 1600 - monitor capture CAPTURE interface $sinterface both file location bootflash:CAPTURE.pcap buffer-size $size limit duration $duration + monitor capture CAPTURE start + set total $duration + for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "Starting!\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} + puts "" + set check [exec "show monitor capture CAPTURE"] + set stop 0 + while {$stop < 2} { + if {[regexp {Inactive} $check]} { + set stop 3; + } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop} } - - monitor capture CAPTURE start - set total $duration - for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "Starting!\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} - puts "" - set check [exec "show monitor capture CAPTURE"] - set stop 0 - while {$stop < 2} { - if {[regexp {Inactive} $check]} { - set stop 3; - } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop} - } - exec "monitor capture CAPTURE stop" - after 1000 - exec "no monitor capture CAPTURE" - exec "no monitor capture CAPTURE" - ios_config "no ip access-list extended CAPTURE-FILTER" - puts "\nDone!\n" - finish_statement + exec "monitor capture CAPTURE stop" + after 1000 + exec "no monitor capture CAPTURE" + exec "no monitor capture CAPTURE" + ios_config "no ip access-list extended CAPTURE-FILTER" + puts "\nDone!\n" + finish_statement } proc capture_commands9000 { protocol ipsource ipdest ctype sinterface duration size} { - if { $ipsource == "any" && $ipdest == "any" } { - set any_s_d " permit $protocol any any" + set aclresults [split [acl_generator $protocol $ipsource $ipdest] ":"] + if {[llength $aclresults] == 1} { + set any_s_d [lindex $aclresults 0] } else { - if { $ipsource != "any" && $ipdest != "any" } { - if { $protocol == "tcp" || $protocol == "udp" } { - if { [regexp -nocase {\:} $ipsource] && [regexp -nocase {\:} $ipdest] } { - set sourcesplit [ split $ipsource {:} ] - set destsplit [ split $ipdest {:} ] - set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] host [lindex $destsplit 0] eq [lindex $destsplit 1]" - set dest_source "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - } else { - if { [regexp -nocase {\:} $ipsource] || [regexp -nocase {\:} $ipdest] } { - if { [regexp -nocase {\:} $ipsource] } { - set sourcesplit [ split $ipsource {:} ] - set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] host $ipdest" - set dest_source "permit $protocol host $ipdest host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - } else { - set destsplit [ split $ipdest {:} ] - set source_dest "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] host $ipsource" - set dest_source "permit $protocol host $ipsource host [lindex $destsplit 0] eq [lindex $destsplit 1]" - } - } - } - } else { - set source_dest "permit ip host $ipsource host $ipdest" - set dest_source "permit ip host $ipdest host $ipsource" - } + set source_dest [lindex $aclresults 0] + set dest_source [lindex $aclresults 1] + } + if { [info exists any_s_d] } { + ios_config "ip access-list ex CAPTURE-FILTER" "$any_s_d" + set captureacl "$any_s_d" } else { - if { $ipsource == "any" && $ipdest != "any" } { - if { $protocol == "tcp" || $protocol == "udp" } { - if { [regexp -nocase {\:} $ipdest ] } { - set destsplit [ split $ipdest {:} ] - set dest_source "permit $protocol $ipsource host [lindex $destsplit 0] eq [lindex $destsplit 1]" - if {[regexp -nocase {any} $ipdest]} { - set source_dest "permit $protocol $ipsource [lindex $destsplit 0] eq [lindex $destsplit 1]" - } else { - set source_dest "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] $ipsource" - } - } else { - set source_dest " permit $protocol any host $ipdest" - set dest_source " permit $protocol host $ipdest any" - } - } else { - set source_dest "permit ip any host $ipdest" - set dest_source "permit ip host $ipdest any" - } - } else { - if { $protocol == "tcp" || $protocol == "udp" } { - if { [regexp -nocase {\:} $ipsource ] } { - set sourcesplit [ split $ipsource {:} ] - set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] any" - if {[regexp -nocase {any} $ipsource]} { - set dest_source "permit $protocol any [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - } else { - set dest_source "permit $protocol any host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - } - } else { - set source_dest " permit $protocol any host $ipsource" - set dest_source " permit $protocol host $ipsource any" - } - } else { - set source_dest "permit ip host $ipsource any" - set dest_source "permit ip $ipdest any host $ipsource" - } - } + ios_config "ip access-list ex CAPTURE-FILTER" "$source_dest" "$dest_source" + set captureacl "$source_dest \n $dest_source" } - } - if { [info exists any_s_d] } { - ios_config "ip access-list ex CAPTURE-FILTER" "$any_s_d" - set captureacl "$any_s_d" - } else { - ios_config "ip access-list ex CAPTURE-FILTER" "$source_dest" "$dest_source" - set captureacl "$source_dest \n $dest_source" - } - - exec "no monitor capture CAPTURE" - if {[file exists flash:CAPTURE.pcap]} { - file delete -force -- flash:CAPTURE.pcap + + exec "no monitor capture CAPTURE" + if {[file exists flash:CAPTURE.pcap]} { + file delete -force -- flash:CAPTURE.pcap + } + set buffsize [expr $size * 1000] + monitor capture CAPTURE access-list CAPTURE-FILTER + monitor capture CAPTURE file location flash:CAPTURE.pcap buffer-size $size size $size + monitor capture CAPTURE limit duration $duration packet-len 1600 + if {$ctype == "control"} { + monitor capture CAPTURE control-plane both + } else { + monitor capture CAPTURE interface $sinterface both } - set buffsize [expr $size * 1000] - monitor capture CAPTURE access-list CAPTURE-FILTER - monitor capture CAPTURE file location flash:CAPTURE.pcap buffer-size $size size $size - monitor capture CAPTURE limit duration $duration packet-len 1600 - if {$ctype == "control"} { - monitor capture CAPTURE control-plane both - } else { - monitor capture CAPTURE interface $sinterface both + monitor capture CAPTURE start + set total $duration + for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "Starting!\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} + puts "" + set check [exec "show monitor capture CAPTURE"] + set stop 0 + while {$stop < 2} { + if {[regexp {Inactive} $check]} { + set stop 3; + } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop} } - monitor capture CAPTURE start - set total $duration - for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "Starting!\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} - puts "" - set check [exec "show monitor capture CAPTURE"] - set stop 0 - while {$stop < 2} { - if {[regexp {Inactive} $check]} { - set stop 3; - } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop} - } - puts "Exporting capture to flash:CAPTURE.pcap" - exec "monitor capture CAPTURE stop" - exec "no monitor capture CAPTURE" - ios_config "no ip access-list extended CAPTURE-FILTER" - puts "\nDone!\n" - puts "'show monitor capture file flash:CAPTURE.pcap' to see local wireshark summary" - finish_statement + puts "Exporting capture to flash:CAPTURE.pcap" + exec "monitor capture CAPTURE stop" + exec "no monitor capture CAPTURE" + ios_config "no ip access-list extended CAPTURE-FILTER" + puts "\nDone!\n" + puts "'show monitor capture file flash:CAPTURE.pcap' to see local wireshark summary" + finish_statement } proc capture_commands3800 { protocol ipsource ipdest ctype sinterface duration size} { - if { $ipsource == "any" && $ipdest == "any" } { - set any_s_d " permit $protocol any any" + set aclresults [split [acl_generator $protocol $ipsource $ipdest] ":"] + if {[llength $aclresults] == 1} { + set any_s_d [lindex $aclresults 0] } else { - if { $ipsource != "any" && $ipdest != "any" } { - if { $protocol == "tcp" || $protocol == "udp" } { - if { [regexp -nocase {\:} $ipsource] && [regexp -nocase {\:} $ipdest] } { - set sourcesplit [ split $ipsource {:} ] - set destsplit [ split $ipdest {:} ] - set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] host [lindex $destsplit 0] eq [lindex $destsplit 1]" - set dest_source "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - } else { - if { [regexp -nocase {\:} $ipsource] || [regexp -nocase {\:} $ipdest] } { - if { [regexp -nocase {\:} $ipsource] } { - set sourcesplit [ split $ipsource {:} ] - set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] host $ipdest" - set dest_source "permit $protocol host $ipdest host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - } else { - set destsplit [ split $ipdest {:} ] - set source_dest "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] host $ipsource" - set dest_source "permit $protocol host $ipsource host [lindex $destsplit 0] eq [lindex $destsplit 1]" - } - } - } - } else { - set source_dest "permit ip host $ipsource host $ipdest" - set dest_source "permit ip host $ipdest host $ipsource" - } + set source_dest [lindex $aclresults 0] + set dest_source [lindex $aclresults 1] + } + if { [info exists any_s_d] } { + ios_config "ip access-list ex CAPTURE-FILTER" "$any_s_d" + set captureacl "$any_s_d" } else { - if { $ipsource == "any" && $ipdest != "any" } { - if { $protocol == "tcp" || $protocol == "udp" } { - if { [regexp -nocase {\:} $ipdest ] } { - set destsplit [ split $ipdest {:} ] - set dest_source "permit $protocol $ipsource host [lindex $destsplit 0] eq [lindex $destsplit 1]" - if {[regexp -nocase {any} $ipdest]} { - set source_dest "permit $protocol $ipsource [lindex $destsplit 0] eq [lindex $destsplit 1]" - } else { - set source_dest "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] $ipsource" - } - } else { - set source_dest " permit $protocol any host $ipdest" - set dest_source " permit $protocol host $ipdest any" - } - } else { - set source_dest "permit ip any host $ipdest" - set dest_source "permit ip host $ipdest any" - } - } else { - if { $protocol == "tcp" || $protocol == "udp" } { - if { [regexp -nocase {\:} $ipsource ] } { - set sourcesplit [ split $ipsource {:} ] - set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] any" - if {[regexp -nocase {any} $ipsource]} { - set dest_source "permit $protocol any [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - } else { - set dest_source "permit $protocol any host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - } - } else { - set source_dest " permit $protocol any host $ipsource" - set dest_source " permit $protocol host $ipsource any" - } - } else { - set source_dest "permit ip host $ipsource any" - set dest_source "permit ip $ipdest any host $ipsource" - } - } + ios_config "ip access-list ex CAPTURE-FILTER" "$source_dest" "$dest_source" + set captureacl "$source_dest \n $dest_source" } - } - if { [info exists any_s_d] } { - ios_config "ip access-list ex CAPTURE-FILTER" "$any_s_d" - set captureacl "$any_s_d" - } else { - ios_config "ip access-list ex CAPTURE-FILTER" "$source_dest" "$dest_source" - set captureacl "$source_dest \n $dest_source" - } - - exec "no monitor capture CAPTURE" - if {[file exists flash:CAPTURE.pcap]} { - file delete -force -- flash:CAPTURE.pcap + + exec "no monitor capture CAPTURE" + if {[file exists flash:CAPTURE.pcap]} { + file delete -force -- flash:CAPTURE.pcap + } + ios_config "class-map CAPTURE_CLASS_MAP" "match access-group name CAPTURE-FILTER" + if {$ctype == "control"} { + monitor capture CAPTURE class-map CAPTURE_CLASS_MAP + monitor capture CAPTURE limit packet-len 1600 + monitor capture CAPTURE file location flash:CAPTURE.pcap buffer-size $size limit duration $duration + monitor capture CAPTURE control-plane both + + } else { + monitor capture CAPTURE class-map CAPTURE_CLASS_MAP + monitor capture CAPTURE limit packet-len 1600 + monitor capture CAPTURE file location flash:CAPTURE.pcap buffer-size $size limit duration $duration + monitor capture CAPTURE interface $sinterface both } - ios_config "class-map CAPTURE_CLASS_MAP" "match access-group name CAPTURE-FILTER" - if {$ctype == "control"} { - monitor capture CAPTURE class-map CAPTURE_CLASS_MAP - monitor capture CAPTURE limit packet-len 1600 - monitor capture CAPTURE file location flash:CAPTURE.pcap buffer-size $size limit duration $duration - monitor capture CAPTURE control-plane both - - } else { - monitor capture CAPTURE class-map CAPTURE_CLASS_MAP - monitor capture CAPTURE limit packet-len 1600 - monitor capture CAPTURE file location flash:CAPTURE.pcap buffer-size $size limit duration $duration - monitor capture CAPTURE interface $sinterface both + + monitor capture CAPTURE start + set total $duration + for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} + puts "" + set check [exec "show monitor capture CAPTURE"] + set stop 0 + while {$stop < 2} { + if {[regexp {Inactive} $check]} { + set stop 3; + } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop} } - - monitor capture CAPTURE start - set total $duration - for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} - puts "" - set check [exec "show monitor capture CAPTURE"] - set stop 0 - while {$stop < 2} { - if {[regexp {Inactive} $check]} { - set stop 3; - } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop} - } - exec "monitor capture CAPTURE stop" - #puts "Exporting capture to flash:CAPTURE.pcap" - #exec "monitor capture CAPTURE export location flash:CAPTURE.pcap" - exec "no monitor capture CAPTURE" - ios_config "no ip access-list extended CAPTURE-FILTER" - puts "\nDone!\n" - finish_statement + exec "monitor capture CAPTURE stop" + #puts "Exporting capture to flash:CAPTURE.pcap" + #exec "monitor capture CAPTURE export location flash:CAPTURE.pcap" + exec "no monitor capture CAPTURE" + ios_config "no ip access-list extended CAPTURE-FILTER" + puts "\nDone!\n" + finish_statement } proc capture_commands4400 { protocol ipsource ipdest ctype sinterface duration size} { - if { $ipsource == "any" && $ipdest == "any" } { - set any_s_d " permit $protocol any any" - } else { - if { $ipsource != "any" && $ipdest != "any" } { - if { $protocol == "tcp" || $protocol == "udp" } { - if { [regexp -nocase {\:} $ipsource] && [regexp -nocase {\:} $ipdest] } { - set sourcesplit [ split $ipsource {:} ] - set destsplit [ split $ipdest {:} ] - set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] host [lindex $destsplit 0] eq [lindex $destsplit 1]" - set dest_source "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - - } else { - if { [regexp -nocase {\:} $ipsource] || [regexp -nocase {\:} $ipdest] } { - if { [regexp -nocase {\:} $ipsource] } { - set sourcesplit [ split $ipsource {:} ] - set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] host $ipdest" - set dest_source "permit $protocol host $ipdest host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - } else { - set destsplit [ split $ipdest {:} ] - set source_dest "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] host $ipsource" - set dest_source "permit $protocol host $ipsource host [lindex $destsplit 0] eq [lindex $destsplit 1]" - } - } - } - } else { - set source_dest "permit ip host $ipsource host $ipdest" - set dest_source "permit ip host $ipdest host $ipsource" - } - } else { - if { $ipsource == "any" && $ipdest != "any" } { - if { $protocol == "tcp" || $protocol == "udp" } { - if { [regexp -nocase {\:} $ipdest ] } { - set destsplit [ split $ipdest {:} ] - set dest_source "permit $protocol $ipsource host [lindex $destsplit 0] eq [lindex $destsplit 1]" - if {[regexp -nocase {any} $ipdest]} { - set source_dest "permit $protocol $ipsource [lindex $destsplit 0] eq [lindex $destsplit 1]" - } else { - set source_dest "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] $ipsource" - } - } else { - set source_dest " permit $protocol any host $ipdest" - set dest_source " permit $protocol host $ipdest any" - } - } else { - set source_dest "permit ip any host $ipdest" - set dest_source "permit ip host $ipdest any" - } - } else { - if { $protocol == "tcp" || $protocol == "udp" } { - if { [regexp -nocase {\:} $ipsource ] } { - set sourcesplit [ split $ipsource {:} ] - set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] any" - if {[regexp -nocase {any} $ipsource]} { - set dest_source "permit $protocol any [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - } else { - set dest_source "permit $protocol any host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - } - } else { - set source_dest " permit $protocol any host $ipsource" - set dest_source " permit $protocol host $ipsource any" - } - } else { - set source_dest "permit ip host $ipsource any" - set dest_source "permit ip $ipdest any host $ipsource" - } - } - } - } - -if { [info exists any_s_d] } { - ios_config "ip access-list ex CAPTURE-FILTER" "$any_s_d" - set captureacl "$any_s_d" + set aclresults [split [acl_generator $protocol $ipsource $ipdest] ":"] + if {[llength $aclresults] == 1} { + set any_s_d [lindex $aclresults 0] } else { - ios_config "ip access-list ex CAPTURE-FILTER" "$source_dest" "$dest_source" - set captureacl "$source_dest \n $dest_source" + set source_dest [lindex $aclresults 0] + set dest_source [lindex $aclresults 1] } - - exec "no monitor capture CAPTURE" - if {[file exists flash:CAPTURE.pcap]} { - file delete -force -- flash:CAPTURE.pcap + if { [info exists any_s_d] } { + ios_config "ip access-list ex CAPTURE-FILTER" "$any_s_d" + set captureacl "$any_s_d" + } else { + ios_config "ip access-list ex CAPTURE-FILTER" "$source_dest" "$dest_source" + set captureacl "$source_dest \n $dest_source" + } + + exec "no monitor capture CAPTURE" + if {[file exists flash:CAPTURE.pcap]} { + file delete -force -- flash:CAPTURE.pcap + } + + if {$ctype == "control"} { + monitor capture CAPTURE limit packet-len 1600 duration $duration + monitor capture CAPTURE access-list CAPTURE-FILTER buffer size $size control-plane both + + } else { + monitor capture CAPTURE limit packet-len 1600 duration $duration + monitor capture CAPTURE access-list CAPTURE-FILTER buffer size $size interface $sinterface both } - - if {$ctype == "control"} { - monitor capture CAPTURE limit packet-len 1600 duration $duration access-list CAPTURE-FILTER buffer size $size control-plane both - - } else { - monitor capture CAPTURE limit packet-len 1600 limit duration $duration access-list CAPTURE-FILTER buffer size $size interface $sinterface both + monitor capture CAPTURE start + set total $duration + for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "Starting!\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} + puts "" + set check [exec "show monitor capture CAPTURE"] + set stop 0 + while {$stop < 2} { + if {[regexp {Inactive} $check]} { + set stop 3; + } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop} } - monitor capture CAPTURE start - set total $duration - for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "Starting!\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} - puts "" - set check [exec "show monitor capture CAPTURE"] - set stop 0 - while {$stop < 2} { - if {[regexp {Inactive} $check]} { - set stop 3; - } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop} - } - puts "Exporting capture to bootflash:CAPTURE.pcap" - exec "monitor capture CAPTURE stop" - exec "monitor capture CAPTURE export bootflash:CAPTURE.pcap" - exec "no monitor capture CAPTURE" - ios_config "no ip access-list extended CAPTURE-FILTER" - puts "\nDone!\n" - finish_statement + puts "Exporting capture to bootflash:CAPTURE.pcap" + exec "monitor capture CAPTURE stop" + exec "monitor capture CAPTURE export bootflash:CAPTURE.pcap" + exec "no monitor capture CAPTURE" + ios_config "no ip access-list extended CAPTURE-FILTER" + puts "\nDone!\n" + finish_statement } proc capture_commands1000 { protocol ipsource ipdest ctype sinterface duration size} { - if { $ipsource == "any" && $ipdest == "any" } { - set any_s_d " permit $protocol any any" - } else { - if { $ipsource != "any" && $ipdest != "any" } { - if { $protocol == "tcp" || $protocol == "udp" } { - if { [regexp -nocase {\:} $ipsource] && [regexp -nocase {\:} $ipdest] } { - set sourcesplit [ split $ipsource {:} ] - set destsplit [ split $ipdest {:} ] - set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] host [lindex $destsplit 0] eq [lindex $destsplit 1]" - set dest_source "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - - } else { - if { [regexp -nocase {\:} $ipsource] || [regexp -nocase {\:} $ipdest] } { - if { [regexp -nocase {\:} $ipsource] } { - set sourcesplit [ split $ipsource {:} ] - set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] host $ipdest" - set dest_source "permit $protocol host $ipdest host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - } else { - set destsplit [ split $ipdest {:} ] - set source_dest "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] host $ipsource" - set dest_source "permit $protocol host $ipsource host [lindex $destsplit 0] eq [lindex $destsplit 1]" - } - } - } - } else { - set source_dest "permit ip host $ipsource host $ipdest" - set dest_source "permit ip host $ipdest host $ipsource" - } - } else { - if { $ipsource == "any" && $ipdest != "any" } { - if { $protocol == "tcp" || $protocol == "udp" } { - if { [regexp -nocase {\:} $ipdest ] } { - set destsplit [ split $ipdest {:} ] - set dest_source "permit $protocol $ipsource host [lindex $destsplit 0] eq [lindex $destsplit 1]" - if {[regexp -nocase {any} $ipdest]} { - set source_dest "permit $protocol $ipsource [lindex $destsplit 0] eq [lindex $destsplit 1]" - } else { - set source_dest "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] $ipsource" - } - } else { - set source_dest " permit $protocol any host $ipdest" - set dest_source " permit $protocol host $ipdest any" - } - } else { - set source_dest "permit ip any host $ipdest" - set dest_source "permit ip host $ipdest any" - } - } else { - if { $protocol == "tcp" || $protocol == "udp" } { - if { [regexp -nocase {\:} $ipsource ] } { - set sourcesplit [ split $ipsource {:} ] - set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] any" - if {[regexp -nocase {any} $ipsource]} { - set dest_source "permit $protocol any [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - } else { - set dest_source "permit $protocol any host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" - } - } else { - set source_dest " permit $protocol any host $ipsource" - set dest_source " permit $protocol host $ipsource any" - } - } else { - set source_dest "permit ip host $ipsource any" - set dest_source "permit ip $ipdest any host $ipsource" - } - } - } - } - -if { [info exists any_s_d] } { - ios_config "ip access-list ex CAPTURE-FILTER" "$any_s_d" - set captureacl "$any_s_d" + set aclresults [split [acl_generator $protocol $ipsource $ipdest] ":"] + if {[llength $aclresults] == 1} { + set any_s_d [lindex $aclresults 0] } else { - ios_config "ip access-list ex CAPTURE-FILTER" "$source_dest" "$dest_source" - set captureacl "$source_dest \n $dest_source" + set source_dest [lindex $aclresults 0] + set dest_source [lindex $aclresults 1] } - - exec "no monitor capture CAPTURE" - if {[file exists flash:CAPTURE.pcap]} { - file delete -force -- flash:CAPTURE.pcap + if { [info exists any_s_d] } { + ios_config "ip access-list ex CAPTURE-FILTER" "$any_s_d" + set captureacl "$any_s_d" + } else { + ios_config "ip access-list ex CAPTURE-FILTER" "$source_dest" "$dest_source" + set captureacl "$source_dest \n $dest_source" + } + + exec "no monitor capture CAPTURE" + if {[file exists flash:CAPTURE.pcap]} { + file delete -force -- flash:CAPTURE.pcap + } + monitor capture CAPTURE limit packet-len 1600 + monitor capture CAPTURE access-list CAPTURE-FILTER + monitor capture CAPTURE buffer size $size + monitor capture CAPTURE limit duration $duration + + if {$ctype == "control"} { + monitor capture CAPTURE control-plane both + } else { + monitor capture CAPTURE interface $sinterface both } - monitor capture CAPTURE limit packet-len 1600 - monitor capture CAPTURE access-list CAPTURE-FILTER - monitor capture CAPTURE buffer size $size - monitor capture CAPTURE limit duration $duration - - if {$ctype == "control"} { - monitor capture CAPTURE control-plane both - } else { - monitor capture CAPTURE interface $sinterface both + monitor capture CAPTURE start + set total $duration + for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "Starting!\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} + puts "" + set check [exec "show monitor capture CAPTURE"] + set stop 0 + while {$stop < 2} { + if {[regexp {Inactive} $check]} { + set stop 3; + } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop} } - monitor capture CAPTURE start - set total $duration - for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "Starting!\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} - puts "" - set check [exec "show monitor capture CAPTURE"] - set stop 0 - while {$stop < 2} { - if {[regexp {Inactive} $check]} { - set stop 3; - } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop} - } - puts "Exporting capture to flash:CAPTURE.pcap" - exec "monitor capture CAPTURE stop" - exec "monitor capture CAPTURE export flash:CAPTURE.pcap" - exec "no monitor capture CAPTURE" - ios_config "no ip access-list extended CAPTURE-FILTER" - puts "\nDone!\n" - finish_statement + puts "Exporting capture to flash:CAPTURE.pcap" + exec "monitor capture CAPTURE stop" + exec "monitor capture CAPTURE export flash:CAPTURE.pcap" + exec "no monitor capture CAPTURE" + ios_config "no ip access-list extended CAPTURE-FILTER" + puts "\nDone!\n" + finish_statement } proc finish_statement {} { - set allusers [exec "who"] - set current_user [foreach {line} [split $allusers "\n"] {if {[regexp {\*} $line]} {set foundx $line; set user [regexp -all -inline {\S+} $foundx]}}; lindex $user 4] - set allusers [exec "show aaa user all | i $current_user"] - set current_user [string trim [lindex [split $allusers "="] 1]] - set showip [exec "show tcp br"] - set current_ip [foreach {line} [split $showip "\n"] {if {[regexp {\.22\s} $line]} {set foundx $line; set ip [regexp -all -inline {\S+} $foundx]}}; lindex $ip 1] - puts [string repeat * 20] - puts "Get copy of pcap from flash via \"scp\" or SecureFx" - set cmdhelper "Windows CMD \'scp $current_user" - append cmdhelper "@" - append cmdhelper [string range $current_ip 0 end-3] - append cmdhelper ":CAPTURE.pcap . & .\\CAPTURE.pcap'" - puts $cmdhelper - set cmdhelper "Windows Powershell \'scp $current_user" - append cmdhelper "@" - append cmdhelper [string range $current_ip 0 end-3] - append cmdhelper ":CAPTURE.pcap . ; .\\CAPTURE.pcap'" - puts $cmdhelper + set allusers [exec "who"] + set current_user [foreach {line} [split $allusers "\n"] { + if {[regexp {\*} $line]} { + set foundx $line; set user [regexp -all -inline {\S+} $foundx]} + }; lindex $user 4] + set allusers [exec "show aaa user all | i $current_user"] + set current_user [string trim [lindex [split $allusers "="] 1]] + set showip [exec "show tcp br"] + set current_ip [foreach {line} [split $showip "\n"] { + if {[regexp {\.22\s} $line]} { + set foundx $line; set ip [regexp -all -inline {\S+} $foundx]} + }; lindex $ip 1] + puts [string repeat * 20] + puts "Get copy of pcap from flash via \"scp\" or SecureFx" + set cmdhelper "Windows CMD \'scp $current_user" + append cmdhelper "@" + append cmdhelper [string range $current_ip 0 end-3] + append cmdhelper ":CAPTURE.pcap . & .\\CAPTURE.pcap'" + puts $cmdhelper + set cmdhelper "Windows Powershell \'scp $current_user" + append cmdhelper "@" + append cmdhelper [string range $current_ip 0 end-3] + append cmdhelper ":CAPTURE.pcap . ; .\\CAPTURE.pcap'" + puts $cmdhelper } proc display_cli_packet_search { version } { - switch -glob $version { - 9* {flash_devices} - 45* {bootflash_devices} - 38* {flash_devices} - 3* {flash_devices} - 1004 {puts "CLI File Display Unsupported. Must SCP to local Computer!"} - 100* {flash_devices} - default {puts "CLI File Display Unsupported. Must SCP to local Computer!"} - } + switch -glob $version { + 9* {flash_devices} + 45* {bootflash_devices} + 38* {flash_devices} + 3* {flash_devices} + 1004 {puts "CLI File Display Unsupported. Must SCP to local Computer!"} + 100* {flash_devices} + default {puts "CLI File Display Unsupported. Must SCP to local Computer!"} + } } proc flash_devices {} { @@ -961,48 +767,62 @@ if {$::argc == 0} {puts "\[HELP\]:\nProvide source and destination {ip|any} with ***If you want display pcap on cli examples type: wireshark filter - - " - + + " + } else { set get_version [exec "show ver"] foreach {line} [split $get_version "\n"] { if {[regexp -nocase "model number" $line]} { set found_version [lindex [regexp -all -inline {\S+} $line] 3] - } - } + } + } if {![info exists found_version]} { foreach {line} [split $get_version "\n"] { - if {[regexp {(CSR1000V)|(C45\d\d)|(ASR100\d)} $line]} { - #|| [regexp {C45\d\d} $line] || [regexp {ISR44} $line] + if {[regexp {(CSR1000V)|(C45\d\d)|(ASR100\d)|(ISR44\d\d)} $line]} { set found_version [lindex [regexp -all -inline {\S+} $line] 1] } } - } + } if {![info exists found_version]} { puts "Unable to determine platform. " - return - #puts -nonewline "Please enter platform number \[example: for csr1000v enter 1000\]:" - #flush stdout - #gets stdin {askversion} - #set found_version $askversion + return } if {[regexp {\d\d\d\d*} $found_version]} { set device_string "Device version: " set version [lindex [regexp -inline {\d\d\d\d} $found_version] 0] append device_string $version - puts $device_string - if {$::argc == 1 && [lindex $argv 0] == "filter"} {display_cli_packet_search $version ; return } - if {[expr $::argc > 1] && [expr $::argc < 3]} {puts "\nMissing one of the required arguments \ \ \" - } else { - if {$::argc == 3} {main $version [lindex $argv 0] [lindex $argv 1] [lindex $argv 2]} else {main $version [lindex $argv 0] [lindex $argv 1] [lindex $argv 2] [lindex $argv 3] [lindex $argv 4] [lindex $argv 5]} - } + } else { + puts "Unable to determine platform. " + return + } + + if {$::argc == 1 && [lindex $argv 0] == "filter"} { + display_cli_packet_search $version ; return + } + if {[expr $::argc > 1] && [expr $::argc < 3]} { + puts "\nMissing one of the required arguments \ \ \"; return + } else { + set debugfound [lsearch $argv "debug"] + if {$debugfound != -1} { + global debug; set debug 1; puts "debugging" + set newarglist [list] + foreach {argfound} $argv { + if {$argfound == "debug"} {} else { + lappend newarglist $argfound + } + } + + if {$::argc == 3} { + clear_screen + puts $device_string + main $version [lindex $newarglist 0] [lindex $newarglist 1] [lindex $newarglist 2] + } else { + main $version [lindex $newarglist 0] [lindex $newarglist 1] [lindex $newarglist 2] [lindex $newarglist 3] [lindex $newarglist 4] [lindex $newarglist 5] + } + } } } tclquit - - - - From a55dde06a4b7ca6c2c52fa53604a9056e05fa111 Mon Sep 17 00:00:00 2001 From: settlej <53984619+settlej@users.noreply.github.com> Date: Fri, 5 Jun 2020 23:04:11 -0400 Subject: [PATCH 02/14] Update capture_program.tcl --- capture_program.tcl | 446 ++++++++++++++++++++++++++------------------ 1 file changed, 267 insertions(+), 179 deletions(-) diff --git a/capture_program.tcl b/capture_program.tcl index e4d3cb3..f154eca 100644 --- a/capture_program.tcl +++ b/capture_program.tcl @@ -48,12 +48,26 @@ proc clear_screen {} { } proc debugputs {msg} { - if {$debug == 1} { - puts $msg + if {$::debug == 1} { + puts "\[DEBUG\]\: $msg" } } -proc main {version protocol ipsource {ipdest any} {sinterface nothing} {duration {}} {size {}} } { +proc noexec_perform {event} { + debugputs $event + $event +} + +proc perform {event {iosconfig { }} } { + debugputs $event + if {$iosconfig != { }} { + ios_config $event + } else { + exec $event + } +} + +proc gatherinformation_and_begin_capture {version protocol ipsource {ipdest any} {sinterface nothing} {duration {}} {size {}} } { if {$sinterface == "nothing"} { puts "\nCapture Type:\n 1.\) Interface \[default\]\n 2.\) Control-Plane" puts -nonewline "\nSelection: " @@ -66,9 +80,9 @@ proc main {version protocol ipsource {ipdest any} {sinterface nothing} {duration # get list of interfaces if {$ctype == "Interface"} { puts "\nAvailable Interfaces:" - set foundinterfaces [regexp -all -inline {[A-Za-z]+\d\/+[\d\/]+\s} [exec "show ip int br"]] + set foundinterfaces [regexp -all -inline {[A-Za-z-]+\d\/?\d?\/?\d?\/?\d?\d?} [exec "show ip int br"]] #set foundinterfaces [regexp -all -inline {([A-Za-z]+\d\/)+[\d\/]+} [exec "show ip int br"]] - foreach {a b c d e f g} [join $foundinterfaces ","] {puts "$a $b $c $d $e $f $g"} + foreach {a b c d e f g} [join $foundinterfaces ", "] {puts "$a $b $c $d $e $f $g"} set i 0 puts " " while {$i < 1} { @@ -78,7 +92,7 @@ proc main {version protocol ipsource {ipdest any} {sinterface nothing} {duration gets stdin {sinterface} if {$sinterface == "exit"} {incr i} else {} if {$i > 0} {continue} else {} - if {[lsearch -exact $foundinterfaces "$sinterface "] == -1} { puts "\nInterface Not found...\n"} else {incr i} + if {[lsearch -exact $foundinterfaces "$sinterface"] == -1} { puts "\nInterface Not found...\n"} else {incr i} } } } else { @@ -89,17 +103,17 @@ proc main {version protocol ipsource {ipdest any} {sinterface nothing} {duration if { $duration == {} || $size == {} } { if {$duration == {}} { - puts -nonewline "\nHow long to run capture? <1-300 seconds> \[Default=30\] : " + puts -nonewline "\nHow long to run capture? <1-300 seconds> \[Default=20\] : " flush stdout gets stdin {duration} if {[string trim $duration] > 0} { - } else {set duration 30;} + } else {set duration 20;} } if {$size == {}} { - puts -nonewline "\nMax Capture size? <1-50 MB> \[Default=30\] : " + puts -nonewline "\nMax Capture size? <1-50 MB> \[Default=10\] : " flush stdout gets stdin {size} - if {[string trim $size] > 0} {} else {set size 30} + if {[string trim $size] > 0} {} else {set size 10} } startcapture $version $protocol $ipsource $ipdest $ctype $sinterface $duration $size } else { @@ -133,14 +147,14 @@ proc startcapture {version protocol ipsource ipdest ctype sinterface duration si puts "Capture ACL: $protocol any any" } else { puts "Capture ACL: $protocol $ipsource $ipdest - $protocol $ipdest $ipsource" + $protocol $ipdest $ipsource" } puts "Capture location: flash:CAPTURE.pcap" puts [string repeat - 37] puts "" if {$protocol == "ip" && $ipsource == "any" && $ipdest == "any"} { puts "****WARNING!**** Using \"ip any any\" may create stress on CPU, if possible try to limit to tcp/udp/eigrp/ospf/icmp. - Also make sure time duration is at a reasonable time if monitoring high load interface." + Also make sure time duration is at a reasonable time if monitoring high load interface." } if {[expr $duration > 300]} { puts "***TERMINIATING! Duration is greater than 300 sec ***"; return @@ -287,9 +301,8 @@ proc acl_generator {protocol ipsource ipdest} { } proc capture_commands3000 { protocol ipsource ipdest ctype sinterface duration size} { - exec "monitor capture point stop all" - ios_config "no access-list 199" - ios_config "access-list 199" + perform "monitor capture point stop all" + perform "no access-list 199" iosconfig set aclresults [split [acl_generator $protocol $ipsource $ipdest] ":"] if {[llength $aclresults] == 1} { set any_s_d [lindex $aclresults 0] @@ -298,48 +311,51 @@ proc capture_commands3000 { protocol ipsource ipdest ctype sinterface duration s set dest_source [lindex $aclresults 1] } if {[info exists any_s_d]} { - ios_config "access-list 199 $any_s_d" + perform "access-list 199 $any_s_d" iosconfig } else { - puts "$source_dest | $dest_source" - ios_config "access-list 199 $source_dest" - ios_config "access-list 199 $dest_source" + perform "access-list 199 $source_dest" iosconfig + perform "access-list 199 $dest_source" iosconfig } - exec "monitor capture buffer BUFF linear" - exec "monitor capture buffer BUFF filter access-list 199" + perform "monitor capture buffer BUFF linear" + perform "monitor capture buffer BUFF filter access-list 199" set buffsize [expr $size * 1000] - exec "monitor capture buffer BUFF size $buffsize" + debugputs "\(INFO\) Buffer-size $buffsize KB" + perform "monitor capture buffer BUFF size $buffsize" # <256-102400 Kbytes> - exec "monitor capture buffer BUFF limit duration $duration" + perform "monitor capture buffer BUFF limit duration $duration" # <1-2000 sec> - exec "monitor capture buffer BUFF max-size 1600" + debugputs "\(INFO\) Max MTU capture set to 172" + perform "monitor capture buffer BUFF max-size 172" if {$ctype == "control"} { - exec "monitor capture point ip process-switched POINT both" + perform "monitor capture point ip process-switched POINT both" } else { - exec "monitor capture point ip cef POINT $sinterface both" + perform "monitor capture point ip cef POINT $sinterface both" } - exec "monitor capture point associate POINT BUFF" + perform "monitor capture point associate POINT BUFF" # show monitor capture buffer BUFF parameters # or show monitor capture buffer BUFF dump - exec "monitor capture point start POINT" + perform "monitor capture point start POINT" set total $duration for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "Starting!\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} puts "" - set check [exec "show monitor capture point POINT"] + debugputs "\(INFO\) Checking capture status" + set check [perform "show monitor capture point POINT"] set stop 0 while {$stop < 2} { if {[regexp {Inactive} $check]} { set stop 3; } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture point POINT"]; incr stop} } - puts "Exporting capture to flash:CAPTURE.pcap" - exec "monitor capture point stop POINT" - exec "monitor capture buffer BUFF export flash:CAPTURE.pcap" + perform "monitor capture point stop POINT" + debugputs "\(INFO\) Exporting capture to flash:CAPTURE.pcap" + perform "monitor capture buffer BUFF export flash:CAPTURE.pcap" if {$ctype == "control"} { - exec "no monitor capture point ip process-switched POINT both" + perform "no monitor capture point ip process-switched POINT both" } else { - exec "no monitor capture point ip cef POINT $sinterface both" + perform "no monitor capture point ip cef POINT $sinterface both" } - exec "no monitor capture buffer BUFF" + perform "no monitor capture buffer BUFF" + perform "no access-list 199" iosconfig puts "\nDone!\n" finish_statement } @@ -362,6 +378,16 @@ proc find_dest_next_hop_interface {destlookupnexthop} { } proc capture_commands4500 { protocol ipsource ipdest ctype sinterface duration size} { + perform "no ip access-list extended CAPTURE-FILTER" iosconfig + if {[regexp {any} $ipsource] && [regexp {any} $ipdest]} { + puts "\n" + puts "***FAILURE*** Both IP source and IP destination are \"any any\", needs to have single SOURCE IP. \n\n\[ENDING PROGRAM\]" + perform "no monitor capture CAPTURE" + perform "no ip access-list extended CAPTURE-FILTER" iosconfig + perform "no class-map CAPTURE_CLASS_MAP" iosconfig + return + } + if {$ctype != "control"} { if {[regexp {any} $ipdest]} { set destlookupnexthop "0.0.0.0/0" @@ -373,9 +399,15 @@ proc capture_commands4500 { protocol ipsource ipdest ctype sinterface duration s } } set interfaceresult [find_dest_next_hop_interface $destlookupnexthop] - if {$interfaceresult != ""}{ + if {$interfaceresult != ""} { set additionalinterface $interfaceresult - puts "Found Reverse Interface: $additionalinterface \n" + debugputs "\(INFO\) Found Reverse Interface: $additionalinterface" + } else { + puts "\n" + puts "***FAILURE*** Failed to find Reverse Interface!!" + puts "\n" + puts "\[ENDING PROGRAM\]" + return } } @@ -388,53 +420,63 @@ proc capture_commands4500 { protocol ipsource ipdest ctype sinterface duration s } if { [info exists any_s_d] } { ios_config "ip access-list ex CAPTURE-FILTER" "$any_s_d" + debugputs "ip access-list ex CAPTURE-FILTER $any_s_d" set captureacl "$any_s_d" - } else { + } else { ios_config "ip access-list ex CAPTURE-FILTER" "$source_dest" "$dest_source" + debugputs "ip access-list ex CAPTURE-FILTER" + debugputs " $source_dest" + debugputs " $dest_source" set captureacl "$source_dest \n $dest_source" - } + } - no monitor capture CAPTURE + perform "no monitor capture CAPTURE" + perform "no class-map CAPTURE_CLASS_MAP" iosconfig if {[file exists bootflash:CAPTURE.pcap]} { file delete -force -- bootflash:CAPTURE.pcap } ios_config "class-map CAPTURE_CLASS_MAP" "match access-group name CAPTURE-FILTER" + debugputs "class-map CAPTURE_CLASS_MAP" + debugputs " match access-group name CAPTURE-FILTER" set buffersize [expr $size + 10] + debugputs "\(INFO\) Buffersize additon 10 + $size = $buffersize MB" if {$ctype == "control"} { - monitor capture CAPTURE class-map CAPTURE_CLASS_MAP - monitor capture CAPTURE file location bootflash:CAPTURE.pcap buffer-size $buffersize size $size control-plane both - monitor capture CAPTURE limit duration $duration packet-len 1600 + noexec_perform "monitor capture CAPTURE class-map CAPTURE_CLASS_MAP" + noexec_perform "monitor capture CAPTURE file location bootflash:CAPTURE.pcap buffer-size $buffersize size $size control-plane both " + noexec_perform "monitor capture CAPTURE limit duration $duration packet-len 172" } else { - monitor capture CAPTURE class-map CAPTURE_CLASS_MAP - monitor capture CAPTURE limit packet-len 1600 - monitor capture CAPTURE interface $sinterface both file location bootflash:CAPTURE.pcap buffer-size $size limit duration $duration - if {[info exists $additionalinterface]} { - monitor capture CAPTURE interface $additionalinterface in - } + noexec_perform "monitor capture CAPTURE class-map CAPTURE_CLASS_MAP" + noexec_perform "monitor capture CAPTURE limit packet-len 172" + noexec_perform "monitor capture CAPTURE interface $sinterface both file location bootflash:CAPTURE.pcap buffer-size $buffersize size $size limit duration $duration" + if {[info exists additionalinterface]} { + noexec_perform "monitor capture CAPTURE interface $additionalinterface in" + } } - monitor capture CAPTURE start + noexec_perform "monitor capture CAPTURE start" set total $duration for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "Starting!\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} puts "" - set check [exec "show monitor capture CAPTURE"] + set check [perform "show monitor capture CAPTURE"] set stop 0 while {$stop < 2} { if {[regexp {Inactive} $check]} { set stop 3; } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop} } - exec "monitor capture CAPTURE stop" + perform "monitor capture CAPTURE stop" after 1000 - exec "no monitor capture CAPTURE" - exec "no monitor capture CAPTURE" - ios_config "no ip access-list extended CAPTURE-FILTER" + perform "no monitor capture CAPTURE" + perform "no monitor capture CAPTURE" + perform "no ip access-list extended CAPTURE-FILTER" iosconfig + perform "no class-map CAPTURE_CLASS_MAP" iosconfig puts "\nDone!\n" finish_statement } proc capture_commands9000 { protocol ipsource ipdest ctype sinterface duration size} { + perform "no ip access-list extended CAPTURE-FILTER" iosconfig set aclresults [split [acl_generator $protocol $ipsource $ipdest] ":"] if {[llength $aclresults] == 1} { set any_s_d [lindex $aclresults 0] @@ -444,30 +486,35 @@ proc capture_commands9000 { protocol ipsource ipdest ctype sinterface duration s } if { [info exists any_s_d] } { ios_config "ip access-list ex CAPTURE-FILTER" "$any_s_d" + debugputs "ip access-list ex CAPTURE-FILTER $any_s_d" set captureacl "$any_s_d" - } else { + } else { ios_config "ip access-list ex CAPTURE-FILTER" "$source_dest" "$dest_source" + debugputs "ip access-list ex CAPTURE-FILTER" + debugputs " $source_dest" + debugputs " $dest_source" set captureacl "$source_dest \n $dest_source" - } - - exec "no monitor capture CAPTURE" + } + + perform "no monitor capture CAPTURE" + puts "" if {[file exists flash:CAPTURE.pcap]} { file delete -force -- flash:CAPTURE.pcap } set buffsize [expr $size * 1000] - monitor capture CAPTURE access-list CAPTURE-FILTER - monitor capture CAPTURE file location flash:CAPTURE.pcap buffer-size $size size $size - monitor capture CAPTURE limit duration $duration packet-len 1600 + noexec_perform "monitor capture CAPTURE access-list CAPTURE-FILTER" + noexec_perform "monitor capture CAPTURE file location flash:CAPTURE.pcap buffer-size $size size $size" + noexec_perform "monitor capture CAPTURE limit duration $duration packet-len 172" if {$ctype == "control"} { - monitor capture CAPTURE control-plane both + noexec_perform "monitor capture CAPTURE control-plane both" } else { - monitor capture CAPTURE interface $sinterface both + noexec_perform "monitor capture CAPTURE interface $sinterface both" } - monitor capture CAPTURE start + noexec_perform "monitor capture CAPTURE start" set total $duration for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "Starting!\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} puts "" - set check [exec "show monitor capture CAPTURE"] + set check [perform "show monitor capture CAPTURE"] set stop 0 while {$stop < 2} { if {[regexp {Inactive} $check]} { @@ -475,15 +522,16 @@ proc capture_commands9000 { protocol ipsource ipdest ctype sinterface duration s } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop} } puts "Exporting capture to flash:CAPTURE.pcap" - exec "monitor capture CAPTURE stop" - exec "no monitor capture CAPTURE" - ios_config "no ip access-list extended CAPTURE-FILTER" + perform "monitor capture CAPTURE stop" + perform "no monitor capture CAPTURE" + perform "no ip access-list extended CAPTURE-FILTER" iosconfig puts "\nDone!\n" puts "'show monitor capture file flash:CAPTURE.pcap' to see local wireshark summary" finish_statement } proc capture_commands3800 { protocol ipsource ipdest ctype sinterface duration size} { + perform "no ip access-list extended CAPTURE-FILTER" iosconfig set aclresults [split [acl_generator $protocol $ipsource $ipdest] ":"] if {[llength $aclresults] == 1} { set any_s_d [lindex $aclresults 0] @@ -493,51 +541,59 @@ proc capture_commands3800 { protocol ipsource ipdest ctype sinterface duration s } if { [info exists any_s_d] } { ios_config "ip access-list ex CAPTURE-FILTER" "$any_s_d" + debugputs "ip access-list ex CAPTURE-FILTER $any_s_d" set captureacl "$any_s_d" - } else { + } else { ios_config "ip access-list ex CAPTURE-FILTER" "$source_dest" "$dest_source" + debugputs "ip access-list ex CAPTURE-FILTER" + debugputs " $source_dest" + debugputs " $dest_source" set captureacl "$source_dest \n $dest_source" - } - - exec "no monitor capture CAPTURE" + } + + perform "no monitor capture CAPTURE" + perform "no class-map CAPTURE_CLASS_MAP" iosconfig + if {[file exists flash:CAPTURE.pcap]} { file delete -force -- flash:CAPTURE.pcap } ios_config "class-map CAPTURE_CLASS_MAP" "match access-group name CAPTURE-FILTER" + debugputs "class-map CAPTURE_CLASS_MAP" + debugputs " match access-group name CAPTURE-FILTER" if {$ctype == "control"} { - monitor capture CAPTURE class-map CAPTURE_CLASS_MAP - monitor capture CAPTURE limit packet-len 1600 - monitor capture CAPTURE file location flash:CAPTURE.pcap buffer-size $size limit duration $duration - monitor capture CAPTURE control-plane both + noexec_perform "monitor capture CAPTURE class-map CAPTURE_CLASS_MAP " + noexec_perform "monitor capture CAPTURE limit packet-len 172" + noexec_perform "monitor capture CAPTURE file location flash:CAPTURE.pcap buffer-size $size limit duration $duration" + noexec_perform "monitor capture CAPTURE control-plane both " } else { - monitor capture CAPTURE class-map CAPTURE_CLASS_MAP - monitor capture CAPTURE limit packet-len 1600 - monitor capture CAPTURE file location flash:CAPTURE.pcap buffer-size $size limit duration $duration - monitor capture CAPTURE interface $sinterface both + noexec_perform "monitor capture CAPTURE class-map CAPTURE_CLASS_MAP" + noexec_perform "monitor capture CAPTURE limit packet-len 172" + noexec_perform "monitor capture CAPTURE file location flash:CAPTURE.pcap buffer-size $size limit duration $duration" + noexec_perform "monitor capture CAPTURE interface $sinterface both " } - monitor capture CAPTURE start + noexec_perform "monitor capture CAPTURE start" set total $duration for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} puts "" - set check [exec "show monitor capture CAPTURE"] + set check [perform "show monitor capture CAPTURE"] set stop 0 while {$stop < 2} { if {[regexp {Inactive} $check]} { set stop 3; } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop} } - exec "monitor capture CAPTURE stop" - #puts "Exporting capture to flash:CAPTURE.pcap" - #exec "monitor capture CAPTURE export location flash:CAPTURE.pcap" - exec "no monitor capture CAPTURE" - ios_config "no ip access-list extended CAPTURE-FILTER" + perform "monitor capture CAPTURE stop" + perform "no monitor capture CAPTURE" + perform "no ip access-list extended CAPTURE-FILTER" iosconfig + perform "class-map CAPTURE_CLASS_MAP" iosconfig puts "\nDone!\n" finish_statement } proc capture_commands4400 { protocol ipsource ipdest ctype sinterface duration size} { + perform "no ip access-list extended CAPTURE-FILTER" iosconfig set aclresults [split [acl_generator $protocol $ipsource $ipdest] ":"] if {[llength $aclresults] == 1} { set any_s_d [lindex $aclresults 0] @@ -547,46 +603,53 @@ proc capture_commands4400 { protocol ipsource ipdest ctype sinterface duration s } if { [info exists any_s_d] } { ios_config "ip access-list ex CAPTURE-FILTER" "$any_s_d" + debugputs "ip access-list ex CAPTURE-FILTER $any_s_d" set captureacl "$any_s_d" } else { - ios_config "ip access-list ex CAPTURE-FILTER" "$source_dest" "$dest_source" + ios_config "ip access-list ex CAPTURE-FILTER" "$source_dest" "$dest_source" + debugputs "ip access-list ex CAPTURE-FILTER" + debugputs " $source_dest" + debugputs " $dest_source" set captureacl "$source_dest \n $dest_source" } - exec "no monitor capture CAPTURE" + perform "no monitor capture CAPTURE" + puts "" + if {[file exists flash:CAPTURE.pcap]} { file delete -force -- flash:CAPTURE.pcap } if {$ctype == "control"} { - monitor capture CAPTURE limit packet-len 1600 duration $duration - monitor capture CAPTURE access-list CAPTURE-FILTER buffer size $size control-plane both + noexec_perform "monitor capture CAPTURE limit packet-len 172 duration $duration" + noexec_perform "monitor capture CAPTURE access-list CAPTURE-FILTER buffer size $size control-plane both" } else { - monitor capture CAPTURE limit packet-len 1600 duration $duration - monitor capture CAPTURE access-list CAPTURE-FILTER buffer size $size interface $sinterface both + noexec_perform "monitor capture CAPTURE limit packet-len 172 duration $duration " + noexec_perform "monitor capture CAPTURE access-list CAPTURE-FILTER buffer size $size interface $sinterface both" } - monitor capture CAPTURE start + noexec_perform "monitor capture CAPTURE start" set total $duration for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "Starting!\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} puts "" - set check [exec "show monitor capture CAPTURE"] + set check [perform "show monitor capture CAPTURE"] set stop 0 while {$stop < 2} { if {[regexp {Inactive} $check]} { set stop 3; } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop} } - puts "Exporting capture to bootflash:CAPTURE.pcap" - exec "monitor capture CAPTURE stop" - exec "monitor capture CAPTURE export bootflash:CAPTURE.pcap" - exec "no monitor capture CAPTURE" - ios_config "no ip access-list extended CAPTURE-FILTER" + debugputs "\(INFO\) Exporting capture to bootflash:CAPTURE.pcap" + perform "monitor capture CAPTURE stop" + perform "monitor capture CAPTURE export bootflash:CAPTURE.pcap" + perform "no monitor capture CAPTURE" + perform "no ip access-list extended CAPTURE-FILTER" iosconfig puts "\nDone!\n" finish_statement } proc capture_commands1000 { protocol ipsource ipdest ctype sinterface duration size} { + perform "no ip access-list extended CAPTURE-FILTER" iosconfig set aclresults [split [acl_generator $protocol $ipsource $ipdest] ":"] if {[llength $aclresults] == 1} { set any_s_d [lindex $aclresults 0] @@ -595,55 +658,62 @@ proc capture_commands1000 { protocol ipsource ipdest ctype sinterface duration s set dest_source [lindex $aclresults 1] } if { [info exists any_s_d] } { - ios_config "ip access-list ex CAPTURE-FILTER" "$any_s_d" - set captureacl "$any_s_d" + ios_config "ip access-list ex CAPTURE-FILTER" "$any_s_d" + debugputs "ip access-list ex CAPTURE-FILTER $any_s_d" + set captureacl "$any_s_d" } else { - ios_config "ip access-list ex CAPTURE-FILTER" "$source_dest" "$dest_source" - set captureacl "$source_dest \n $dest_source" + ios_config "ip access-list ex CAPTURE-FILTER" "$source_dest" "$dest_source" + debugputs "ip access-list ex CAPTURE-FILTER" + debugputs " $source_dest" + debugputs " $dest_source" + set captureacl "$source_dest \n $dest_source" } - exec "no monitor capture CAPTURE" + perform "no monitor capture CAPTURE" if {[file exists flash:CAPTURE.pcap]} { file delete -force -- flash:CAPTURE.pcap } - monitor capture CAPTURE limit packet-len 1600 - monitor capture CAPTURE access-list CAPTURE-FILTER - monitor capture CAPTURE buffer size $size - monitor capture CAPTURE limit duration $duration + noexec_perform "monitor capture CAPTURE limit packet-len 172" + noexec_perform "monitor capture CAPTURE access-list CAPTURE-FILTER" + noexec_perform "monitor capture CAPTURE buffer size $size" + noexec_perform "monitor capture CAPTURE limit duration $duration" if {$ctype == "control"} { - monitor capture CAPTURE control-plane both + noexec_perform "monitor capture CAPTURE control-plane both" } else { - monitor capture CAPTURE interface $sinterface both + noexec_perform "monitor capture CAPTURE interface $sinterface both" } - monitor capture CAPTURE start + noexec_perform "monitor capture CAPTURE start" set total $duration for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "Starting!\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} puts "" - set check [exec "show monitor capture CAPTURE"] + set check [perform "show monitor capture CAPTURE"] set stop 0 while {$stop < 2} { if {[regexp {Inactive} $check]} { set stop 3; } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop} } - puts "Exporting capture to flash:CAPTURE.pcap" - exec "monitor capture CAPTURE stop" - exec "monitor capture CAPTURE export flash:CAPTURE.pcap" - exec "no monitor capture CAPTURE" - ios_config "no ip access-list extended CAPTURE-FILTER" + debugputs "\(INFO\)Exporting capture to flash:CAPTURE.pcap" + perform "monitor capture CAPTURE stop" + perform "monitor capture CAPTURE export flash:CAPTURE.pcap" + perform "no monitor capture CAPTURE" + perform "no ip access-list extended CAPTURE-FILTER" iosconfig puts "\nDone!\n" finish_statement } proc finish_statement {} { set allusers [exec "who"] - set current_user [foreach {line} [split $allusers "\n"] { - if {[regexp {\*} $line]} { - set foundx $line; set user [regexp -all -inline {\S+} $foundx]} - }; lindex $user 4] - set allusers [exec "show aaa user all | i $current_user"] - set current_user [string trim [lindex [split $allusers "="] 1]] + set who_user [foreach {line} [split $allusers "\n"] {if {[regexp {\*} $line]} { set foundx $line; set user [regexp -all -inline {\S+} $foundx]}}; lindex $user 4] + set allusers [exec "show aaa sessions | i $who_user"] + set current_user [string trim [lindex [split $allusers ":"] 1]] + set temp [string trim [lindex [split $allusers ":"] 1]] + if {[string first "\n" $temp] == -1} { + set current_user $temp + } else { + set current_user [string trim [string range $temp 0 [string first "\n" $temp]]] + } set showip [exec "show tcp br"] set current_ip [foreach {line} [split $showip "\n"] { if {[regexp {\.22\s} $line]} { @@ -665,7 +735,7 @@ proc finish_statement {} { } -proc display_cli_packet_search { version } { +proc cli_show_filters { version } { switch -glob $version { 9* {flash_devices} 45* {bootflash_devices} @@ -744,33 +814,36 @@ proc bootflash_devices {} { " } - +proc displayhelp {} { + puts "\n\[HELP\]:\nProvide source and destination {ip|any} with optional interface + \n Examples: + \[syntax\] wireshark + wireshark ip any any + wireshark ip 192.168.25.2 any + wireshark ip 192.168.25.2 192.168.30.20 Gi1/0/1 + wireshark ip 192.168.25.2 192.168.30.20 Gi1/0/1 40 10 + wireshark ip 192.168.25.2 192.168.30.20 control 60 30 + + wireshark tcp any any + wireshark tcp 192.168.25.2 any + wireshark tcp 192.168.25.2 192.168.30.20:443 Gi1/0/1 + wireshark tcp 192.168.25.2:443 192.168.30.20 Gi1/0/1 40 10 + + wireshark udp any any + wireshark udp 192.168.25.2 any + wireshark udp 192.168.25.2 192.168.30.20:53 Gi1/0/1 + wireshark udp 192.168.25.2:53 192.168.30.20 Gi1/0/1 40 10 + + ***If you want display pcap on cli examples type: + wireshark filter -if {$::argc == 0} {puts "\[HELP\]:\nProvide source and destination {ip|any} with optional interface - \n Examples: - \[syntax\] wireshark - wireshark ip any any - wireshark ip 192.168.25.2 any - wireshark ip 192.168.25.2 192.168.30.20 Gi1/0/1 - wireshark ip 192.168.25.2 192.168.30.20 Gi1/0/1 40 10 - wireshark ip 192.168.25.2 192.168.30.20 control 60 30 - - wireshark tcp any any - wireshark tcp 192.168.25.2 any - wireshark tcp 192.168.25.2 192.168.30.20:443 Gi1/0/1 - wireshark tcp 192.168.25.2:443 192.168.30.20 Gi1/0/1 40 10 - - wireshark udp any any - wireshark udp 192.168.25.2 any - wireshark udp 192.168.25.2 192.168.30.20:53 Gi1/0/1 - wireshark udp 192.168.25.2:53 192.168.30.20 Gi1/0/1 40 10 - - ***If you want display pcap on cli examples type: - wireshark filter - - " - -} else { + ***If you want to see commands sent to IOS: + wireshark --debug + + " +} + +proc getversion {} { set get_version [exec "show ver"] foreach {line} [split $get_version "\n"] { if {[regexp -nocase "model number" $line]} { @@ -785,44 +858,59 @@ if {$::argc == 0} {puts "\[HELP\]:\nProvide source and destination {ip|any} with } } if {![info exists found_version]} { - puts "Unable to determine platform. " - return + puts "Unable to determine platform. " + return 0 } if {[regexp {\d\d\d\d*} $found_version]} { - set device_string "Device version: " set version [lindex [regexp -inline {\d\d\d\d} $found_version] 0] - append device_string $version + puts "Device version: $version" + return "$version" } else { puts "Unable to determine platform. " - return + return 0 } - - if {$::argc == 1 && [lindex $argv 0] == "filter"} { - display_cli_packet_search $version ; return +} + + +proc main {} { + if {$::argc == 0} { + displayhelp; return } - if {[expr $::argc > 1] && [expr $::argc < 3]} { - puts "\nMissing one of the required arguments \ \ \"; return - } else { - set debugfound [lsearch $argv "debug"] - if {$debugfound != -1} { - global debug; set debug 1; puts "debugging" - set newarglist [list] - foreach {argfound} $argv { - if {$argfound == "debug"} {} else { - lappend newarglist $argfound - } - } - - if {$::argc == 3} { - clear_screen - puts $device_string - main $version [lindex $newarglist 0] [lindex $newarglist 1] [lindex $newarglist 2] + set version [getversion] + if {$::argc == 1 && [lindex $::argv 0] == "filter"} { + cli_show_filters $version; return + } + if {[lindex $::argv 0] == "--debug"} { + if {[expr $::argc < 4]} { + puts "\nMissing one of the required arguments \ \ \"; return } else { - main $version [lindex $newarglist 0] [lindex $newarglist 1] [lindex $newarglist 2] [lindex $newarglist 3] [lindex $newarglist 4] [lindex $newarglist 5] + clear_screen + global debug; set debug 1; puts "\[Debugging mode\]" + if {$version == 0} { return } + if {[expr $::argc == 4]} { + gatherinformation_and_begin_capture $version [lindex $::argv 1] [lindex $::argv 2] [lindex $::argv 3] + } else { + gatherinformation_and_begin_capture $version [lindex $::argv 1] [lindex $::argv 2] [lindex $::argv 3] [lindex $::argv 4] [lindex $::argv 5] [lindex $::argv 6] + } } + return + } else { + if {$::argc < 3} { + puts "\nMissing one of the required arguments \ \ \"; return + } else { + global debug; set debug 0 + clear_screen + if {$version == 0} { return } + if {[expr $::argc == 3]} { + gatherinformation_and_begin_capture $version [lindex $::argv 0] [lindex $::argv 1] [lindex $::argv 2] + } else { + gatherinformation_and_begin_capture $version [lindex $::argv 0] [lindex $::argv 1] [lindex $::argv 2] [lindex $::argv 3] [lindex $::argv 4] [lindex $::argv 5] + } } - } + } } + +main tclquit From 8ca9d86e8fd2c172cb8ff2692c9f9de396339251 Mon Sep 17 00:00:00 2001 From: settlej Date: Sun, 7 Jun 2020 23:28:43 -0400 Subject: [PATCH 03/14] improving progress --- capture_program.tcl | 151 ++++++++++++++++++++++++++------------------ 1 file changed, 90 insertions(+), 61 deletions(-) diff --git a/capture_program.tcl b/capture_program.tcl index a6266db..3c6f8c6 100644 --- a/capture_program.tcl +++ b/capture_program.tcl @@ -24,6 +24,9 @@ # # Simple Cisco Packet Capture. + +# prints progressbar to count down time until program is done captureing +# progress is based on the $duration variable. proc progressbar {cur tot count} { # if you don't want to redraw all the time, uncomment and change ferquency #if {$cur % ($tot/300)} { return } @@ -32,10 +35,6 @@ proc progressbar {cur tot count} { set half [expr {$total/2}] set percent [expr {100.*$cur/$tot}] set val (\ [format "%6.2f%%" $percent]\ ) - #set str "[string repeat \b 50] ) |[string repeat = [ - # expr {round($percent*$total/100)}]][ - # string repeat { } [expr {$total-round($percent*$total/100)}]]| [string repeat \b 52]" - #set str "[string range $str 0 $half]$val[string range $str [expr {$half+[string length $val]-1}] end]" set str "|[string repeat = [expr {round($percent*$total/100)}]][string repeat { } [expr {$total-round($percent*$total/100)}]]|[string repeat \b 110]" set str "$val [string range $str 0 $half][string range $str [expr {$half+[string length $val]-1}] end]" puts -nonewline stderr $str @@ -47,17 +46,23 @@ proc clear_screen {} { ios_config "line vty 0 15" "no international" } +# function to display string only when debug variable set to "1" proc debugputs {msg} { if {$::debug == 1} { puts "\[DEBUG\]\: $msg" } } +# function to send to debug checker for display or not then execute IOS command without using "exec" tcl command +# Some IOS commands requried confirmation and "exec" puts command in blocking state until done, which is not +# useful when needing to see output on stdout. proc noexec_perform {event} { debugputs $event $event } +# function to send to debug checker for display or not then execute IOS command using "exec" tcl command +# exec allows for output capture to variables. proc perform {event {iosconfig { }} } { debugputs $event if {$iosconfig != { }} { @@ -300,6 +305,17 @@ proc acl_generator {protocol ipsource ipdest} { } } +proc check_capture_stats {} { + switch -glob $::version { + 3* {set status [exec "show monitor capture point POINT"]} + default {set status [exec "show monitor capture CAPTURE"]} } + if {[regexp {Inactive} $status]} { + return 0 + } else { + return 1 + } +} + proc capture_commands3000 { protocol ipsource ipdest ctype sinterface duration size} { perform "monitor capture point stop all" perform "no access-list 199" iosconfig @@ -330,13 +346,36 @@ proc capture_commands3000 { protocol ipsource ipdest ctype sinterface duration s perform "monitor capture point ip process-switched POINT both" } else { perform "monitor capture point ip cef POINT $sinterface both" - } + } perform "monitor capture point associate POINT BUFF" # show monitor capture buffer BUFF parameters # or show monitor capture buffer BUFF dump perform "monitor capture point start POINT" + set total $duration - for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "Starting!\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} + for {set i 0 } {$i <= [expr $total} {incr i} { + if {$i == 0} {puts "Starting!\n"} + progressbar $i $total $duration + flush stdout + after 1000; incr duration -1 + if {$duration == 3} {set startcheck [check_capture_stats]} + if {$startcheck == 1} { + set started_succesfully 1 + } else { + set started_succesfully 0 + } + # if { [expr {($x % 3) == 0}] } { + # #check every 4 seconds if completed or never started. + # set status [check_capture_stats] + # if {$status == 0 && $started_succesfully == 1} {set i [expr $total - 1]} + # #progressbar $total $total $total; set i [expr $total + 1] + # if {$status == 0 && $started_succesfully == 0 && $i < [expr $total - 2]} { + # puts "" + # puts "Something may have went wrong, please check logging" + # set i [expr $total + 1] + # } + # } + } puts "" debugputs "\(INFO\) Checking capture status" set check [perform "show monitor capture point POINT"] @@ -721,11 +760,13 @@ proc finish_statement {} { }; lindex $ip 1] puts [string repeat * 20] puts "Get copy of pcap from flash via \"scp\" or SecureFx" + # Display output for Windows Command Promtp, cut and paste set cmdhelper "Windows CMD \'scp $current_user" append cmdhelper "@" append cmdhelper [string range $current_ip 0 end-3] append cmdhelper ":CAPTURE.pcap . & .\\CAPTURE.pcap'" puts $cmdhelper + # Display output for Powershell, cut and paste set cmdhelper "Windows Powershell \'scp $current_user" append cmdhelper "@" append cmdhelper [string range $current_ip 0 end-3] @@ -736,86 +777,56 @@ proc finish_statement {} { proc cli_show_filters { version } { + # version will determine which help to display + # Using switch loop to display correct filter, glob argument provides a regex like match switch -glob $version { - 9* {flash_devices} - 45* {bootflash_devices} - 38* {flash_devices} - 3* {flash_devices} - 1004 {puts "CLI File Display Unsupported. Must SCP to local Computer!"} - 100* {flash_devices} - default {puts "CLI File Display Unsupported. Must SCP to local Computer!"} + 9* {cli_filter_help} + # bootflash is string argument passed to cli_filter_help + 45* {cli_filter_help bootflash} + 38* {cli_filter_help} + 356* {puts "CLI File Display on this device type is Unsupported. Must SCP to local Computer!"} + 1004 {puts "CLI File Display on this device type is Unsupported. Must SCP to local Computer!"} + 100* {cli_filter_help} + default {puts "CLI File Display on this device type is Unsupported. Must SCP to local Computer!"} } } -proc flash_devices {} { +proc cli_filter_help {{storage flash}} { puts " #Basic filters - show monitor capture file bootflash:CAPTURE.pcap brief - show monitor capture file flash:CAPTURE.pcap display-filter icmp - show monitor capture file flash:CAPTURE.pcap display-filter tcp - show monitor capture file flash:CAPTURE.pcap display-filter udp + show monitor capture file $storage:CAPTURE.pcap brief + show monitor capture file $storage:CAPTURE.pcap display-filter icmp + show monitor capture file $storage:CAPTURE.pcap display-filter tcp + show monitor capture file $storage:CAPTURE.pcap display-filter udp #Routing protocols - show monitor capture file flash:CAPTURE.pcap display-filter \"eigrp || ospf || tcp.port == 179\" + show monitor capture file $storage:CAPTURE.pcap display-filter \"eigrp || ospf || tcp.port == 179\" #Web traffic - show monitor capture file flash:CAPTURE.pcap display-filter \"tcp.port == 80 || tcp.port == 443\" + show monitor capture file $storage:CAPTURE.pcap display-filter \"tcp.port == 80 || tcp.port == 443\" #DHCP - show monitor capture file flash:CAPTURE.pcap display-filter dhcp + show monitor capture file $storage:CAPTURE.pcap display-filter dhcp #DNS - show monitor capture file flash:CAPTURE.pcap display-filter \"udp.port == 53\" + show monitor capture file $storage:CAPTURE.pcap display-filter \"udp.port == 53\" #Traffic to or from IP \[First example does src \'and\' dst for 1.1.1.1 use ip.addr\] - show monitor capture file flash:CAPTURE.pcap display-filter \"ip.addr == 1.1.1.1\" - show monitor capture file flash:CAPTURE.pcap display-filter \"ip.src_host == 1.1.1.1\" - show monitor capture file flash:CAPTURE.pcap display-filter \"ip.dst_host == 1.1.1.1\" + show monitor capture file $storage:CAPTURE.pcap display-filter \"ip.addr == 1.1.1.1\" + show monitor capture file $storage:CAPTURE.pcap display-filter \"ip.src_host == 1.1.1.1\" + show monitor capture file $storage:CAPTURE.pcap display-filter \"ip.dst_host == 1.1.1.1\" #TCP Rest Flag - Show monitor capture file flash:CAPTURE.pcap display-filter \"tcp.flags.reset == 1\" + Show monitor capture file $storage:CAPTURE.pcap display-filter \"tcp.flags.reset == 1\" " } -proc bootflash_devices {} { - puts " - - #Basic filters - show monitor capture file bootflash:CAPTURE.pcap brief - show monitor capture file bootflash:CAPTURE.pcap display-filter icmp - show monitor capture file bootflash:CAPTURE.pcap display-filter tcp - show monitor capture file bootflash:CAPTURE.pcap display-filter udp - - #Routing protocols - show monitor capture file bootflash:CAPTURE.pcap display-filter \"eigrp || ospf || tcp.port == 179\" - - #Web traffic - show monitor capture file bootflash:CAPTURE.pcap display-filter \"tcp.port == 80 || tcp.port == 443\" - - #DHCP - show monitor capture file bootflash:CAPTURE.pcap display-filter dhcp - - #DNS - show monitor capture file bootflash:CAPTURE.pcap display-filter \"udp.port == 53\" - - #Traffic to or from IP - \[First example does src \'and\' dst for 1.1.1.1 use ip.addr\] - show monitor capture file bootflash:CAPTURE.pcap display-filter \"ip.addr == 1.1.1.1\" - show monitor capture file bootflash:CAPTURE.pcap display-filter \"ip.src_host == 1.1.1.1\" - show monitor capture file bootflash:CAPTURE.pcap display-filter \"ip.dst_host == 1.1.1.1\" - - #TCP Rest Flag - Show monitor capture file bootflash:CAPTURE.pcap display-filter \"tcp.flags.reset == 1\" - - " -} - proc displayhelp {} { - #puts "\n\[HELP\]:\nProvide source and destination {ip|any} with optional interface + # Help output for methods and option for useage puts "\n\n Examples: \[syntax\] wireshark 20 sec 10 MB 172 mtu @@ -847,12 +858,19 @@ proc displayhelp {} { } proc getversion {} { + # Find version of device, "show version" then regex find in output the version, + # Search for model number line that contain model type. Usually 3560, 9300, 9400 + # Foreach will loop through every line via "\n" from output and look for "model + # number", once found split the line via spaces in regex -inline -all and gather + # 3rd element. set get_version [exec "show ver"] foreach {line} [split $get_version "\n"] { if {[regexp -nocase "model number" $line]} { set found_version [lindex [regexp -all -inline {\S+} $line] 3] } } + # Most Platforms do not have 'model number' line, + # manual search for supported platforms via regex if {![info exists found_version]} { foreach {line} [split $get_version "\n"] { if {[regexp {(CSR1000V)|(C45\d\d)|(ASR100\d)|(ISR44\d\d)} $line]} { @@ -860,12 +878,15 @@ proc getversion {} { } } } + # Stop program an inform user device will not work. + # Checking to see if found_version variable is created if {![info exists found_version]} { puts "Unable to determine platform. " return 0 } - + # If device is found get version number and save to $version variable if {[regexp {\d\d\d\d*} $found_version]} { + global version set version [lindex [regexp -inline {\d\d\d\d} $found_version] 0] puts "Device version: $version" return "$version" @@ -877,18 +898,24 @@ proc getversion {} { proc main {} { + # If no arguments passed to program, display help function to provide help examples. + # Stop program after help is dispalyed. if {$::argc == 0} { displayhelp; return } set version [getversion] + # If 1 argument and if is the word 'filter' will dispaly helper function for show commands + # Stop program after help is dispalyed. if {$::argc == 1 && [lindex $::argv 0] == "filter"} { cli_show_filters $version; return } + # debug will display commands used during program run if {[lindex $::argv 0] == "--debug"} { if {[expr $::argc < 4]} { puts "\nMissing one of the required arguments \ \ \"; return } else { clear_screen + #turn on debug for stdout global debug; set debug 1; puts "\[Debugging mode\]" if {$version == 0} { return } if {[expr $::argc == 4]} { @@ -899,9 +926,11 @@ proc main {} { } return } else { + # if protocol with src and dest, not provide, inform user and end program if {$::argc < 3} { puts "\nMissing one of the required arguments \ \ \"; return } else { + #turn off debug for stdout global debug; set debug 0 clear_screen if {$version == 0} { return } From 129816304f463497302756900d770a1756effbf6 Mon Sep 17 00:00:00 2001 From: settlej Date: Sun, 7 Jun 2020 23:56:54 -0400 Subject: [PATCH 04/14] progress debug --- capture_program.tcl | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/capture_program.tcl b/capture_program.tcl index 3c6f8c6..922ad1a 100644 --- a/capture_program.tcl +++ b/capture_program.tcl @@ -306,12 +306,15 @@ proc acl_generator {protocol ipsource ipdest} { } proc check_capture_stats {} { + puts $::version switch -glob $::version { - 3* {set status [exec "show monitor capture point POINT"]} - default {set status [exec "show monitor capture CAPTURE"]} } + 3* {set status [perform "show monitor capture point POINT"]} + default {set status [perform "show monitor capture CAPTURE"]} } if {[regexp {Inactive} $status]} { + puts "failed" return 0 } else { + puts "success" return 1 } } @@ -351,9 +354,9 @@ proc capture_commands3000 { protocol ipsource ipdest ctype sinterface duration s # show monitor capture buffer BUFF parameters # or show monitor capture buffer BUFF dump perform "monitor capture point start POINT" - + set startcheck 0 set total $duration - for {set i 0 } {$i <= [expr $total} {incr i} { + for {set i 0 } {$i <= [expr $total]} {incr i} { if {$i == 0} {puts "Starting!\n"} progressbar $i $total $duration flush stdout @@ -364,17 +367,18 @@ proc capture_commands3000 { protocol ipsource ipdest ctype sinterface duration s } else { set started_succesfully 0 } - # if { [expr {($x % 3) == 0}] } { - # #check every 4 seconds if completed or never started. - # set status [check_capture_stats] - # if {$status == 0 && $started_succesfully == 1} {set i [expr $total - 1]} - # #progressbar $total $total $total; set i [expr $total + 1] - # if {$status == 0 && $started_succesfully == 0 && $i < [expr $total - 2]} { - # puts "" - # puts "Something may have went wrong, please check logging" - # set i [expr $total + 1] - # } - # } + if { [expr {($i % 3) == 0}] } { + #check every 4 seconds if completed or never started. + set status [check_capture_stats] + if {$status == 0 && $started_succesfully == 1} {set i [expr $total - 1]} + #progressbar $total $total $total; set i [expr $total + 1] + if {$status == 0 && $started_succesfully == 0 && $i < [expr $total - 2]} { + puts "" + puts "Something may have went wrong, please check logging" + set i [expr $total + 1] + } + } + puts $started_succesfully } puts "" debugputs "\(INFO\) Checking capture status" From 75b4932e29b5aa370d39185f4a42c31e721f32fd Mon Sep 17 00:00:00 2001 From: settlej <53984619+settlej@users.noreply.github.com> Date: Mon, 8 Jun 2020 22:51:37 -0400 Subject: [PATCH 05/14] Update capture_program.tcl --- capture_program.tcl | 458 +++++++++++++++++++++++++++----------------- 1 file changed, 285 insertions(+), 173 deletions(-) diff --git a/capture_program.tcl b/capture_program.tcl index 922ad1a..9411255 100644 --- a/capture_program.tcl +++ b/capture_program.tcl @@ -25,9 +25,23 @@ # Simple Cisco Packet Capture. +############################################################################### +# +# Created to simplify packet capture program on Cisco devices that support +# native packet capture. Many Cisco platforms reqiure different commands +# to start packet capture. There was also the issue of requring +# multiple commands up to 14 different commands to start capturing. This is +# depending on how grainularity of capture. This project was created to simplify +# said operations in a "common" user friendly interface on any supported +# platform. Capture can happen in just 2 user inputs (initial decleration and +# approving capture confirmation) +# +############################################################################### + + # prints progressbar to count down time until program is done captureing # progress is based on the $duration variable. -proc progressbar {cur tot count} { +proc progressbar {cur tot} { # if you don't want to redraw all the time, uncomment and change ferquency #if {$cur % ($tot/300)} { return } # set to total width of progress bar @@ -35,14 +49,18 @@ proc progressbar {cur tot count} { set half [expr {$total/2}] set percent [expr {100.*$cur/$tot}] set val (\ [format "%6.2f%%" $percent]\ ) - set str "|[string repeat = [expr {round($percent*$total/100)}]][string repeat { } [expr {$total-round($percent*$total/100)}]]|[string repeat \b 110]" - set str "$val [string range $str 0 $half][string range $str [expr {$half+[string length $val]-1}] end]" - puts -nonewline stderr $str + # '\b' is backspace in tcl on the terminal to continue using same terminal line for progress bar progression, by placing the cursor to the beginning + set bar "|[string repeat = [expr {round($percent*$total/100)}]][string repeat { } [expr {$total-round($percent*$total/100)}]]|[string repeat \b 110]" + set bar "$val [string range $bar 0 $half][string range $bar [expr {$half+[string length $val]-1}] end]" + puts -nonewline stderr $bar } +# function to clear screen but only displaying capture section proc clear_screen {} { + # requires enabling 8 bit support which is not on by default in vty lines ios_config "line vty 0 15" "international" puts "\x1B\x5B\x32\x4A\x1B\x5B\x30\x3B\x30\x48" + # remove once cleared ios_config "line vty 0 15" "no international" } @@ -72,81 +90,119 @@ proc perform {event {iosconfig { }} } { } } -proc gatherinformation_and_begin_capture {version protocol ipsource {ipdest any} {sinterface nothing} {duration {}} {size {}} } { +proc getlargest_interface {interfacelist} { + # declaring starting numbers + set currentmax 0 + set largestinterface "" + foreach {interface} $interfacelist { + # if interface is longer than previous largest known interface, declare new interface as largest + if {[expr [string bytelength $interface] > $currentmax]} { + set largestinterface $interface + set currentmax [string bytelength $interface] + } + } + return $currentmax +} + +# function to parse and search inital capture declaration, if any missing info request via question dialog +proc gatherinformation_and_begin_capture {version protocol ipsource ipdest {sinterface nothing} {duration {}} {size {}} {mtu 172}} { if {$sinterface == "nothing"} { + # If interface not provide at start ask for interface or control-plane capture puts "\nCapture Type:\n 1.\) Interface \[default\]\n 2.\) Control-Plane" + # puts nonewline will not include "\n" at the end but you need to do a "flush" to empty the stdout channel for print on screen puts -nonewline "\nSelection: " flush stdout + # Ask user input with "gets", it will look at the standard-in channel + # depending if type is interface vs control-plane capture will determint capture commands gets stdin {ctype} switch $ctype { "1" {set ctype "Interface"} "2" {set ctype "control"} default {set ctype "Interface"}} - # get list of interfaces if {$ctype == "Interface"} { puts "\nAvailable Interfaces:" + # Grab interfaces from "show ip interface brief" and using regex to grap interface names into a list set foundinterfaces [regexp -all -inline {[A-Za-z-]+\d\/?\d?\/?\d?\/?\d?\d?} [exec "show ip int br"]] - #set foundinterfaces [regexp -all -inline {([A-Za-z]+\d\/)+[\d\/]+} [exec "show ip int br"]] - foreach {a b c d e f g} [join $foundinterfaces ", "] {puts "$a $b $c $d $e $f $g"} + # find longest interface name for padding on display, used in format below + set largestinterfacesize [expr [getlargest_interface $foundinterfaces] + 2] + foreach {a b c d e} [join $foundinterfaces " "] { + # add padding for clean looking screen display + set a [format {%-*s} $largestinterfacesize $a] + set b [format {%-*s} $largestinterfacesize $b] + set c [format {%-*s} $largestinterfacesize $c] + set d [format {%-*s} $largestinterfacesize $d] + set e [format {%-*s} $largestinterfacesize $e] + # creates 5 column print based on padding + puts "$a $b $c $d $e"} set i 0 puts " " while {$i < 1} { - puts "Which interface to packet capture \[exact syntax needed\]?" + puts "Which interface to packet capture \[exact name needed\]?" puts -nonewline "\nSelection: " flush stdout gets stdin {sinterface} if {$sinterface == "exit"} {incr i} else {} if {$i > 0} {continue} else {} + # simple error checking via searching interface list with its exact name from user input if {[lsearch -exact $foundinterfaces "$sinterface"] == -1} { puts "\nInterface Not found...\n"} else {incr i} } } } else { - switch -glob $sinterface { - [c|C]ontrol* {set ctype control} - default {set ctype Interface} - }} - + # if original argument includes a $sinterface based on what was defined set the capture-type (ctype) + switch -glob $sinterface { + [c|C]ontrol* {set ctype control} + default {set ctype Interface} + } + } + # if duration or size were not initially defined ask user if { $duration == {} || $size == {} } { - if {$duration == {}} { - puts -nonewline "\nHow long to run capture? <1-300 seconds> \[Default=20\] : " - flush stdout - gets stdin {duration} - if {[string trim $duration] > 0} { - } else {set duration 20;} - } - if {$size == {}} { - puts -nonewline "\nMax Capture size? <1-50 MB> \[Default=10\] : " - flush stdout - gets stdin {size} - if {[string trim $size] > 0} {} else {set size 10} - } - startcapture $version $protocol $ipsource $ipdest $ctype $sinterface $duration $size + if {$duration == {}} { + puts -nonewline "\nHow long to run capture? <1-300 seconds> \[Default=20\] : " + flush stdout + gets stdin {duration} + if {[string trim $duration] > 0} { + } else {set duration 20;} + } + if {$size == {}} { + puts -nonewline "\nMax Capture size? <1-50 MB> \[Default=10\] : " + flush stdout + gets stdin {size} + if {[string trim $size] > 0} {} else {set size 10} + } + startcapture $version $protocol $ipsource $ipdest $ctype $sinterface $duration $size $mtu } else { - startcapture $version $protocol $ipsource $ipdest $ctype $sinterface $duration $size + startcapture $version $protocol $ipsource $ipdest $ctype $sinterface $duration $size $mtu } } -proc versionsearch {version protocol ipsource ipdest ctype sinterface duration size} { +# redirect program to function that houses commands needed to do packet capture based on paltform version +proc versionsearch {version protocol ipsource ipdest ctype sinterface duration size mtu} { + # -glob will provide regex searching via wildcard matching "*" + # if no match inform platform is unsupported switch -glob $version { - 9* {capture_commands9000 $protocol $ipsource $ipdest $ctype $sinterface $duration $size} - 44* {capture_commands4400 $protocol $ipsource $ipdest $ctype $sinterface $duration $size} - 1004 {capture_commands4400 $protocol $ipsource $ipdest $ctype $sinterface $duration $size} - 45* {capture_commands4500 $protocol $ipsource $ipdest $ctype $sinterface $duration $size} - 38* {capture_commands3800 $protocol $ipsource $ipdest $ctype $sinterface $duration $size} - 3* {capture_commands3000 $protocol $ipsource $ipdest $ctype $sinterface $duration $size} - 100* {capture_commands1000 $protocol $ipsource $ipdest $ctype $sinterface $duration $size} + 9* {capture_commands9000 $protocol $ipsource $ipdest $ctype $sinterface $duration $size $mtu} + 44* {capture_commands4400 $protocol $ipsource $ipdest $ctype $sinterface $duration $size $mtu} + 1004 {capture_commands4400 $protocol $ipsource $ipdest $ctype $sinterface $duration $size $mtu} + 45* {capture_commands4500 $protocol $ipsource $ipdest $ctype $sinterface $duration $size $mtu} + 38* {capture_commands3800 $protocol $ipsource $ipdest $ctype $sinterface $duration $size $mtu} + 3* {capture_commands3000 $protocol $ipsource $ipdest $ctype $sinterface $duration $size $mtu} + 100* {capture_commands1000 $protocol $ipsource $ipdest $ctype $sinterface $duration $size $mtu} default {puts "Unsupported Version!"} } } -proc startcapture {version protocol ipsource ipdest ctype sinterface duration size} { +# function to provide confirmation before execution of capture commands +proc startcapture {version protocol ipsource ipdest ctype sinterface duration size mtu} { + # provided print out on screen what the capture will 'capture' and what are the limitations + # Includes warnings and termination messages if user requrements are in question or unreasonable puts "Capture Overview\n" + # 'repeat' will print the '-' based on the number of times declared next to it puts [string repeat - 37] if {$sinterface != "nothing" || $sinterface == "control"} { - puts "Capture: $sinterface \nDuration: $duration Sec \nFile Size: $size MB" + puts "Capture: $sinterface \nDuration: $duration Sec \nFile Size: $size MB \nMax Packet Size: $mtu bytes" } else { - puts "Capture Type: Control-Plane \nDuration: $duration Sec \nFile Size: $size MB" + puts "Capture Type: Control-Plane \nDuration: $duration Sec \nFile Size: $size MB\nMax Packet Size: $mtu bytes" } if { $ipsource == "any" && $ipdest == "any" } { puts "Capture ACL: $protocol any any" @@ -170,6 +226,7 @@ proc startcapture {version protocol ipsource ipdest ctype sinterface duration si set flashsize $result set bytesizefree [lindex [regexp -all -inline {\S+} [lindex [split $flashsize {(}] 1]] 0] set bytesizefree "${bytesizefree}.0" + # want to make sure there is enough storage if {[expr [expr $bytesizefree - $size] < 10000]} { puts "***TERMINATING! Not enought Free Space Available*** "; return } @@ -187,11 +244,12 @@ proc startcapture {version protocol ipsource ipdest ctype sinterface duration si flush stdout gets stdin {start} switch -glob $start { - y* { versionsearch $version $protocol $ipsource $ipdest $ctype $sinterface $duration $size} + y* { versionsearch $version $protocol $ipsource $ipdest $ctype $sinterface $duration $size $mtu} default { puts "\nCanceling!" } } } - + +# function to build acl format to create acl to filter captured packets proc acl_generator {protocol ipsource ipdest} { if { $ipsource == "any" && $ipdest == "any" } { set any_s_d " permit $protocol any any" @@ -213,8 +271,6 @@ proc acl_generator {protocol ipsource ipdest} { set source_dest "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] host [lindex $destsplit 0] eq [lindex $destsplit 1]" set dest_source "permit $protocol host [lindex $destsplit 0] eq [lindex $destsplit 1] host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" } - - } else { if { [regexp {\:} $ipsource] || [regexp {\:} $ipdest] } { if { [regexp {\:} $ipsource] } { @@ -228,7 +284,6 @@ proc acl_generator {protocol ipsource ipdest} { set dest_source "permit $protocol $ipdest host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" } } else { - # set destsplit [ split $ipdest {:} ] if {[regexp -nocase {any} $ipdest] } { set source_dest "permit $protocol $ipdest host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1]" set dest_source "permit $protocol host [lindex $sourcesplit 0] eq [lindex $sourcesplit 1] $ipdest" @@ -305,21 +360,64 @@ proc acl_generator {protocol ipsource ipdest} { } } -proc check_capture_stats {} { - puts $::version +# function to provide status of capture session +proc check_capture_status {} { switch -glob $::version { - 3* {set status [perform "show monitor capture point POINT"]} - default {set status [perform "show monitor capture CAPTURE"]} } + 3* {set status [exec "show monitor capture point POINT"]} + default {set status [exec "show monitor capture CAPTURE"]} } if {[regexp {Inactive} $status]} { - puts "failed" + # capture is not operational return 0 } else { - puts "success" + # capture is operational return 1 } } -proc capture_commands3000 { protocol ipsource ipdest ctype sinterface duration size} { +# function to display moving progress bar +# will check to see if capture is actually running, +# usually will run for the full duration time period +proc run_progress_bar {total} { + set startcheck 0 + set started_succesfully -1 + for {set i 0} {$i <= [expr $total]} {incr i} { + if {$i == 0} {puts "\nStarting!\n"} + progressbar $i $total + flush stdout + after 1000 + if {$i == 1} {set startcheck [check_capture_status] + if {$startcheck == 1} { + set started_succesfully 1 + } else { + after 2000 + set startcheck [check_capture_status] + if {$startcheck == 1} { + set started_succesfully 1 + } else { + set started_succesfully 0 + puts "\nFailed to start capture, check logs and investigate\n" + } + } + } + if { [expr {($i % 3) == 0}] } { + #check every 3 seconds if completed or never started. + set currentstatus [check_capture_status] + # If started_successfully is 1 then capture was "Active" based on show command + # is currentstatus changes to 0 then capture is "Inactive" based on show command + # if 1 and 0 then capture may have reached size limit and early terminated capture + # else 0 and 0 then capture didn't seem to start 3 secs into start + if { $started_succesfully == 1 && $currentstatus == 0} {set i [expr $total - 1]} + if { $started_succesfully == 0 && $currentstatus == 0 && $i < [expr $total - 2]} { + puts "" + puts "Capture didn't seem to start, please check logs" + set i [expr $total + 1] + } + } + } +} + +# function for capture commands on 3000 series switches except for 3850 +proc capture_commands3000 { protocol ipsource ipdest ctype sinterface duration size mtu} { perform "monitor capture point stop all" perform "no access-list 199" iosconfig set aclresults [split [acl_generator $protocol $ipsource $ipdest] ":"] @@ -343,8 +441,8 @@ proc capture_commands3000 { protocol ipsource ipdest ctype sinterface duration s # <256-102400 Kbytes> perform "monitor capture buffer BUFF limit duration $duration" # <1-2000 sec> - debugputs "\(INFO\) Max MTU capture set to 172" - perform "monitor capture buffer BUFF max-size 172" + debugputs "\(INFO\) Max MTU capture set to $mtu" + perform "monitor capture buffer BUFF max-size $mtu" if {$ctype == "control"} { perform "monitor capture point ip process-switched POINT both" } else { @@ -354,44 +452,25 @@ proc capture_commands3000 { protocol ipsource ipdest ctype sinterface duration s # show monitor capture buffer BUFF parameters # or show monitor capture buffer BUFF dump perform "monitor capture point start POINT" - set startcheck 0 - set total $duration - for {set i 0 } {$i <= [expr $total]} {incr i} { - if {$i == 0} {puts "Starting!\n"} - progressbar $i $total $duration - flush stdout - after 1000; incr duration -1 - if {$duration == 3} {set startcheck [check_capture_stats]} - if {$startcheck == 1} { - set started_succesfully 1 - } else { - set started_succesfully 0 - } - if { [expr {($i % 3) == 0}] } { - #check every 4 seconds if completed or never started. - set status [check_capture_stats] - if {$status == 0 && $started_succesfully == 1} {set i [expr $total - 1]} - #progressbar $total $total $total; set i [expr $total + 1] - if {$status == 0 && $started_succesfully == 0 && $i < [expr $total - 2]} { - puts "" - puts "Something may have went wrong, please check logging" - set i [expr $total + 1] - } - } - puts $started_succesfully - } + run_progress_bar $duration puts "" debugputs "\(INFO\) Checking capture status" set check [perform "show monitor capture point POINT"] set stop 0 while {$stop < 2} { - if {[regexp {Inactive} $check]} { - set stop 3; - } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture point POINT"]; incr stop} + # if the progress bar is done, need to check if the device correctly stops the capture, possible it needs to convert + # capture to pcap output. If the capture is still running after 2 intervals of 3 seconds (6 sec) then manually stop capture + if {[regexp {Inactive} $check]} { + set stop 3; + } else { + puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop + } } perform "monitor capture point stop POINT" debugputs "\(INFO\) Exporting capture to flash:CAPTURE.pcap" + # export packets in memory to flash as a pcap file perform "monitor capture buffer BUFF export flash:CAPTURE.pcap" + # delete all capture commands and ACL if {$ctype == "control"} { perform "no monitor capture point ip process-switched POINT both" } else { @@ -404,7 +483,7 @@ proc capture_commands3000 { protocol ipsource ipdest ctype sinterface duration s } - +# 4500 switches need a secondary interface to get bi-directional traffic (read on capture_commands4500 function comments) proc find_dest_next_hop_interface {destlookupnexthop} { set lookup [exec "show ip cef $destlookupnexthop detail | i nexthop"] set nexthopinterface [lindex [split $lookup ] end] @@ -419,19 +498,27 @@ proc find_dest_next_hop_interface {destlookupnexthop} { return $nexthopinterface } } - -proc capture_commands4500 { protocol ipsource ipdest ctype sinterface duration size} { + +# function to perform capturing commands on the catalyst 4500 platform +proc capture_commands4500 { protocol ipsource ipdest ctype sinterface duration size mtu} { perform "no ip access-list extended CAPTURE-FILTER" iosconfig - if {[regexp {any} $ipsource] && [regexp {any} $ipdest]} { + # 4500 seems to have any 'inbound' only limitation for capturing TCP traffic. + # In order to capture bi-directional traffic need to capture on 2nd interface inbound where its going and coming. + # Because 2 interfaces are monitored there needs to be filtering to capture only traffic destined to monitor interface + # and if 'any any' is defined then you might capture lots of irrelivant information. Single SOURCE IP is a protection + # for busy uplink interfaces if monitoring an access port + if {[regexp {any} $ipsource] && [regexp {any} $ipdest]} { puts "\n" puts "***FAILURE*** Both IP source and IP destination are \"any any\", needs to have single SOURCE IP. \n\n\[ENDING PROGRAM\]" perform "no monitor capture CAPTURE" perform "no ip access-list extended CAPTURE-FILTER" iosconfig perform "no class-map CAPTURE_CLASS_MAP" iosconfig - return + return } - if {$ctype != "control"} { + # using destlookupnexthop funtion to search and return nexthop interface to monitor + # if no destination ip is provide look for the default route nexthop interface + # else provide the next hop for the destination ip provided if {[regexp {any} $ipdest]} { set destlookupnexthop "0.0.0.0/0" } else { @@ -448,12 +535,11 @@ proc capture_commands4500 { protocol ipsource ipdest ctype sinterface duration s } else { puts "\n" puts "***FAILURE*** Failed to find Reverse Interface!!" - puts "\n" - puts "\[ENDING PROGRAM\]" + puts "\n" + puts "\[ENDING PROGRAM\]" return } } - set aclresults [split [acl_generator $protocol $ipsource $ipdest] ":"] if {[llength $aclresults] == 1} { set any_s_d [lindex $aclresults 0] @@ -462,19 +548,19 @@ proc capture_commands4500 { protocol ipsource ipdest ctype sinterface duration s set dest_source [lindex $aclresults 1] } if { [info exists any_s_d] } { - ios_config "ip access-list ex CAPTURE-FILTER" "$any_s_d" - debugputs "ip access-list ex CAPTURE-FILTER $any_s_d" + ios_config "ip access-list extended CAPTURE-FILTER" "$any_s_d" + debugputs "ip access-list extended CAPTURE-FILTER $any_s_d" set captureacl "$any_s_d" } else { - ios_config "ip access-list ex CAPTURE-FILTER" "$source_dest" "$dest_source" - debugputs "ip access-list ex CAPTURE-FILTER" + ios_config "ip access-list extended CAPTURE-FILTER" "$source_dest" "$dest_source" + debugputs "ip access-list extended CAPTURE-FILTER" debugputs " $source_dest" debugputs " $dest_source" set captureacl "$source_dest \n $dest_source" } perform "no monitor capture CAPTURE" - perform "no class-map CAPTURE_CLASS_MAP" iosconfig + perform "no class-map CAPTURE_CLASS_MAP" iosconfig if {[file exists bootflash:CAPTURE.pcap]} { file delete -force -- bootflash:CAPTURE.pcap } @@ -486,10 +572,10 @@ proc capture_commands4500 { protocol ipsource ipdest ctype sinterface duration s if {$ctype == "control"} { noexec_perform "monitor capture CAPTURE class-map CAPTURE_CLASS_MAP" noexec_perform "monitor capture CAPTURE file location bootflash:CAPTURE.pcap buffer-size $buffersize size $size control-plane both " - noexec_perform "monitor capture CAPTURE limit duration $duration packet-len 172" + noexec_perform "monitor capture CAPTURE limit duration $duration packet-len $mtu" } else { noexec_perform "monitor capture CAPTURE class-map CAPTURE_CLASS_MAP" - noexec_perform "monitor capture CAPTURE limit packet-len 172" + noexec_perform "monitor capture CAPTURE limit packet-len $mtu" noexec_perform "monitor capture CAPTURE interface $sinterface both file location bootflash:CAPTURE.pcap buffer-size $buffersize size $size limit duration $duration" if {[info exists additionalinterface]} { noexec_perform "monitor capture CAPTURE interface $additionalinterface in" @@ -497,15 +583,18 @@ proc capture_commands4500 { protocol ipsource ipdest ctype sinterface duration s } noexec_perform "monitor capture CAPTURE start" - set total $duration - for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "Starting!\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} + run_progress_bar $duration puts "" set check [perform "show monitor capture CAPTURE"] set stop 0 while {$stop < 2} { - if {[regexp {Inactive} $check]} { - set stop 3; - } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop} + # if the progress bar is done, need to check if the device correctly stops the capture, possible it needs to convert + # capture to pcap output. If the capture is still running after 2 intervals of 3 seconds (6 sec) then manually stop capture + if {[regexp {Inactive} $check]} { + set stop 3; + } else { + puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop + } } perform "monitor capture CAPTURE stop" after 1000 @@ -518,7 +607,7 @@ proc capture_commands4500 { protocol ipsource ipdest ctype sinterface duration s } -proc capture_commands9000 { protocol ipsource ipdest ctype sinterface duration size} { +proc capture_commands9000 { protocol ipsource ipdest ctype sinterface duration size mtu} { perform "no ip access-list extended CAPTURE-FILTER" iosconfig set aclresults [split [acl_generator $protocol $ipsource $ipdest] ":"] if {[llength $aclresults] == 1} { @@ -528,41 +617,44 @@ proc capture_commands9000 { protocol ipsource ipdest ctype sinterface duration s set dest_source [lindex $aclresults 1] } if { [info exists any_s_d] } { - ios_config "ip access-list ex CAPTURE-FILTER" "$any_s_d" - debugputs "ip access-list ex CAPTURE-FILTER $any_s_d" + ios_config "ip access-list extended CAPTURE-FILTER" "$any_s_d" + debugputs "ip access-list extended CAPTURE-FILTER $any_s_d" set captureacl "$any_s_d" } else { - ios_config "ip access-list ex CAPTURE-FILTER" "$source_dest" "$dest_source" - debugputs "ip access-list ex CAPTURE-FILTER" + ios_config "ip access-list extended CAPTURE-FILTER" "$source_dest" "$dest_source" + debugputs "ip access-list extended CAPTURE-FILTER" debugputs " $source_dest" debugputs " $dest_source" set captureacl "$source_dest \n $dest_source" } perform "no monitor capture CAPTURE" - puts "" + puts "" if {[file exists flash:CAPTURE.pcap]} { file delete -force -- flash:CAPTURE.pcap } set buffsize [expr $size * 1000] noexec_perform "monitor capture CAPTURE access-list CAPTURE-FILTER" noexec_perform "monitor capture CAPTURE file location flash:CAPTURE.pcap buffer-size $size size $size" - noexec_perform "monitor capture CAPTURE limit duration $duration packet-len 172" + noexec_perform "monitor capture CAPTURE limit duration $duration packet-len $mtu" if {$ctype == "control"} { noexec_perform "monitor capture CAPTURE control-plane both" } else { noexec_perform "monitor capture CAPTURE interface $sinterface both" } noexec_perform "monitor capture CAPTURE start" - set total $duration - for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "Starting!\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} + run_progress_bar $duration puts "" set check [perform "show monitor capture CAPTURE"] set stop 0 while {$stop < 2} { - if {[regexp {Inactive} $check]} { - set stop 3; - } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop} + # if the progress bar is done, need to check if the device correctly stops the capture, possible it needs to convert + # capture to pcap output. If the capture is still running after 2 intervals of 3 seconds (6 sec) then manually stop capture + if {[regexp {Inactive} $check]} { + set stop 3; + } else { + puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop + } } puts "Exporting capture to flash:CAPTURE.pcap" perform "monitor capture CAPTURE stop" @@ -573,7 +665,8 @@ proc capture_commands9000 { protocol ipsource ipdest ctype sinterface duration s finish_statement } -proc capture_commands3800 { protocol ipsource ipdest ctype sinterface duration size} { +# function for 3850 platform +proc capture_commands3800 { protocol ipsource ipdest ctype sinterface duration size mtu} { perform "no ip access-list extended CAPTURE-FILTER" iosconfig set aclresults [split [acl_generator $protocol $ipsource $ipdest] ":"] if {[llength $aclresults] == 1} { @@ -583,49 +676,48 @@ proc capture_commands3800 { protocol ipsource ipdest ctype sinterface duration s set dest_source [lindex $aclresults 1] } if { [info exists any_s_d] } { - ios_config "ip access-list ex CAPTURE-FILTER" "$any_s_d" - debugputs "ip access-list ex CAPTURE-FILTER $any_s_d" + ios_config "ip access-list extended CAPTURE-FILTER" "$any_s_d" + debugputs "ip access-list extended CAPTURE-FILTER $any_s_d" set captureacl "$any_s_d" } else { - ios_config "ip access-list ex CAPTURE-FILTER" "$source_dest" "$dest_source" - debugputs "ip access-list ex CAPTURE-FILTER" + ios_config "ip access-list extended CAPTURE-FILTER" "$source_dest" "$dest_source" + debugputs "ip access-list extended CAPTURE-FILTER" debugputs " $source_dest" debugputs " $dest_source" set captureacl "$source_dest \n $dest_source" } - perform "no monitor capture CAPTURE" perform "no class-map CAPTURE_CLASS_MAP" iosconfig - if {[file exists flash:CAPTURE.pcap]} { file delete -force -- flash:CAPTURE.pcap } ios_config "class-map CAPTURE_CLASS_MAP" "match access-group name CAPTURE-FILTER" debugputs "class-map CAPTURE_CLASS_MAP" - debugputs " match access-group name CAPTURE-FILTER" + debugputs " match access-group name CAPTURE-FILTER" if {$ctype == "control"} { noexec_perform "monitor capture CAPTURE class-map CAPTURE_CLASS_MAP " - noexec_perform "monitor capture CAPTURE limit packet-len 172" + noexec_perform "monitor capture CAPTURE limit packet-len $mtu" noexec_perform "monitor capture CAPTURE file location flash:CAPTURE.pcap buffer-size $size limit duration $duration" noexec_perform "monitor capture CAPTURE control-plane both " - } else { noexec_perform "monitor capture CAPTURE class-map CAPTURE_CLASS_MAP" - noexec_perform "monitor capture CAPTURE limit packet-len 172" + noexec_perform "monitor capture CAPTURE limit packet-len $mtu" noexec_perform "monitor capture CAPTURE file location flash:CAPTURE.pcap buffer-size $size limit duration $duration" noexec_perform "monitor capture CAPTURE interface $sinterface both " } - noexec_perform "monitor capture CAPTURE start" - set total $duration - for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} + run_progress_bar $duration puts "" set check [perform "show monitor capture CAPTURE"] set stop 0 while {$stop < 2} { - if {[regexp {Inactive} $check]} { - set stop 3; - } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop} + # if the progress bar is done, need to check if the device correctly stops the capture, possible it needs to convert + # capture to pcap output. If the capture is still running after 2 intervals of 3 seconds (6 sec) then manually stop capture + if {[regexp {Inactive} $check]} { + set stop 3; + } else { + puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop + } } perform "monitor capture CAPTURE stop" perform "no monitor capture CAPTURE" @@ -635,7 +727,9 @@ proc capture_commands3800 { protocol ipsource ipdest ctype sinterface duration s finish_statement } -proc capture_commands4400 { protocol ipsource ipdest ctype sinterface duration size} { +# function to run capture commands for 4400 platform +proc capture_commands4400 { protocol ipsource ipdest ctype sinterface duration size mtu} { + # make sure not left over config from previous session perform "no ip access-list extended CAPTURE-FILTER" iosconfig set aclresults [split [acl_generator $protocol $ipsource $ipdest] ":"] if {[llength $aclresults] == 1} { @@ -645,53 +739,54 @@ proc capture_commands4400 { protocol ipsource ipdest ctype sinterface duration s set dest_source [lindex $aclresults 1] } if { [info exists any_s_d] } { - ios_config "ip access-list ex CAPTURE-FILTER" "$any_s_d" - debugputs "ip access-list ex CAPTURE-FILTER $any_s_d" - set captureacl "$any_s_d" + ios_config "ip access-list extended CAPTURE-FILTER" "$any_s_d" + debugputs "ip access-list extended CAPTURE-FILTER $any_s_d" + set captureacl "$any_s_d" } else { - ios_config "ip access-list ex CAPTURE-FILTER" "$source_dest" "$dest_source" - debugputs "ip access-list ex CAPTURE-FILTER" + ios_config "ip access-list extended CAPTURE-FILTER" "$source_dest" "$dest_source" + debugputs "ip access-list extended CAPTURE-FILTER" debugputs " $source_dest" debugputs " $dest_source" - set captureacl "$source_dest \n $dest_source" + set captureacl "$source_dest \n $dest_source" } - + # make sure no capture session is running by deleting it perform "no monitor capture CAPTURE" - puts "" - + puts "" if {[file exists flash:CAPTURE.pcap]} { file delete -force -- flash:CAPTURE.pcap } - if {$ctype == "control"} { - noexec_perform "monitor capture CAPTURE limit packet-len 172 duration $duration" + noexec_perform "monitor capture CAPTURE limit packet-len $mtu duration $duration" noexec_perform "monitor capture CAPTURE access-list CAPTURE-FILTER buffer size $size control-plane both" - } else { - noexec_perform "monitor capture CAPTURE limit packet-len 172 duration $duration " + noexec_perform "monitor capture CAPTURE limit packet-len $mtu duration $duration " noexec_perform "monitor capture CAPTURE access-list CAPTURE-FILTER buffer size $size interface $sinterface both" } noexec_perform "monitor capture CAPTURE start" - set total $duration - for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "Starting!\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} + run_progress_bar $duration puts "" set check [perform "show monitor capture CAPTURE"] set stop 0 while {$stop < 2} { - if {[regexp {Inactive} $check]} { - set stop 3; - } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop} + # if the progress bar is done, need to check if the device correctly stops the capture, possible it needs to convert + # capture to pcap output. If the capture is still running after 2 intervals of 3 seconds (6 sec) then manually stop capture + if {[regexp {Inactive} $check]} { + set stop 3; + } else { + puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop + } } debugputs "\(INFO\) Exporting capture to bootflash:CAPTURE.pcap" perform "monitor capture CAPTURE stop" perform "monitor capture CAPTURE export bootflash:CAPTURE.pcap" + # delete all capture commands and ACL perform "no monitor capture CAPTURE" perform "no ip access-list extended CAPTURE-FILTER" iosconfig puts "\nDone!\n" finish_statement } -proc capture_commands1000 { protocol ipsource ipdest ctype sinterface duration size} { +proc capture_commands1000 { protocol ipsource ipdest ctype sinterface duration size mtu} { perform "no ip access-list extended CAPTURE-FILTER" iosconfig set aclresults [split [acl_generator $protocol $ipsource $ipdest] ":"] if {[llength $aclresults] == 1} { @@ -701,22 +796,22 @@ proc capture_commands1000 { protocol ipsource ipdest ctype sinterface duration s set dest_source [lindex $aclresults 1] } if { [info exists any_s_d] } { - ios_config "ip access-list ex CAPTURE-FILTER" "$any_s_d" - debugputs "ip access-list ex CAPTURE-FILTER $any_s_d" + ios_config "ip access-list extended CAPTURE-FILTER" "$any_s_d" + debugputs "ip access-list extended CAPTURE-FILTER $any_s_d" set captureacl "$any_s_d" - } else { - ios_config "ip access-list ex CAPTURE-FILTER" "$source_dest" "$dest_source" - debugputs "ip access-list ex CAPTURE-FILTER" + } else { + ios_config "ip access-list extended CAPTURE-FILTER" "$source_dest" "$dest_source" + debugputs "ip access-list extended CAPTURE-FILTER" debugputs " $source_dest" debugputs " $dest_source" set captureacl "$source_dest \n $dest_source" - } + } perform "no monitor capture CAPTURE" if {[file exists flash:CAPTURE.pcap]} { file delete -force -- flash:CAPTURE.pcap - } - noexec_perform "monitor capture CAPTURE limit packet-len 172" + } + noexec_perform "monitor capture CAPTURE limit packet-len $mtu" noexec_perform "monitor capture CAPTURE access-list CAPTURE-FILTER" noexec_perform "monitor capture CAPTURE buffer size $size" noexec_perform "monitor capture CAPTURE limit duration $duration" @@ -725,21 +820,26 @@ proc capture_commands1000 { protocol ipsource ipdest ctype sinterface duration s noexec_perform "monitor capture CAPTURE control-plane both" } else { noexec_perform "monitor capture CAPTURE interface $sinterface both" - } + } noexec_perform "monitor capture CAPTURE start" - set total $duration - for {set i 0 } {$i <= $total} {incr i} {if {$i == 0} {puts "Starting!\n"}; progressbar $i $total $duration; flush stdout ; after 1000; incr duration -1} + # diplay a progress bar passing how long it will run + run_progress_bar $duration puts "" set check [perform "show monitor capture CAPTURE"] set stop 0 while {$stop < 2} { - if {[regexp {Inactive} $check]} { - set stop 3; - } else {puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop} + # if the progress bar is done, need to check if the device correctly stops the capture, possible it needs to convert + # capture to pcap output. If the capture is still running after 2 intervals of 3 seconds (6 sec) then manually stop capture + if {[regexp {Inactive} $check]} { + set stop 3; + } else { + puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop + } } debugputs "\(INFO\)Exporting capture to flash:CAPTURE.pcap" perform "monitor capture CAPTURE stop" perform "monitor capture CAPTURE export flash:CAPTURE.pcap" + # delete all capture commands and ACL perform "no monitor capture CAPTURE" perform "no ip access-list extended CAPTURE-FILTER" iosconfig puts "\nDone!\n" @@ -747,6 +847,10 @@ proc capture_commands1000 { protocol ipsource ipdest ctype sinterface duration s } proc finish_statement {} { + # find current logged in user using "who" and locating astriek * next to username + # sometimes the username is cut off if name is too long, so need to use secondary lookup via "aaa sessions" + # there are times when logged in multiple times to same device can cause multiple aaa sessions, so filter multiple results + # to first found username that matches if multiple returned set allusers [exec "who"] set who_user [foreach {line} [split $allusers "\n"] {if {[regexp {\*} $line]} { set foundx $line; set user [regexp -all -inline {\S+} $foundx]}}; lindex $user 4] set allusers [exec "show aaa sessions | i $who_user"] @@ -764,13 +868,13 @@ proc finish_statement {} { }; lindex $ip 1] puts [string repeat * 20] puts "Get copy of pcap from flash via \"scp\" or SecureFx" - # Display output for Windows Command Promtp, cut and paste + # Display output for Windows Command Prompt, cut and paste to get pcap and opens wireshark set cmdhelper "Windows CMD \'scp $current_user" append cmdhelper "@" append cmdhelper [string range $current_ip 0 end-3] append cmdhelper ":CAPTURE.pcap . & .\\CAPTURE.pcap'" puts $cmdhelper - # Display output for Powershell, cut and paste + # Display output for Powershell, cut and paste to get pcap and opens wireshark set cmdhelper "Windows Powershell \'scp $current_user" append cmdhelper "@" append cmdhelper [string range $current_ip 0 end-3] @@ -783,9 +887,9 @@ proc finish_statement {} { proc cli_show_filters { version } { # version will determine which help to display # Using switch loop to display correct filter, glob argument provides a regex like match + # bootflash is string argument passed to cli_filter_help switch -glob $version { 9* {cli_filter_help} - # bootflash is string argument passed to cli_filter_help 45* {cli_filter_help bootflash} 38* {cli_filter_help} 356* {puts "CLI File Display on this device type is Unsupported. Must SCP to local Computer!"} @@ -925,14 +1029,18 @@ proc main {} { if {[expr $::argc == 4]} { gatherinformation_and_begin_capture $version [lindex $::argv 1] [lindex $::argv 2] [lindex $::argv 3] } else { - gatherinformation_and_begin_capture $version [lindex $::argv 1] [lindex $::argv 2] [lindex $::argv 3] [lindex $::argv 4] [lindex $::argv 5] [lindex $::argv 6] + if {[expr $::argc <= 6]} { + gatherinformation_and_begin_capture $version [lindex $::argv 1] [lindex $::argv 2] [lindex $::argv 3] [lindex $::argv 4] [lindex $::argv 5] [lindex $::argv 6] + } else { + gatherinformation_and_begin_capture $version [lindex $::argv 1] [lindex $::argv 2] [lindex $::argv 3] [lindex $::argv 4] [lindex $::argv 5] [lindex $::argv 6] [lindex $::argv 7] + } } } return } else { # if protocol with src and dest, not provide, inform user and end program if {$::argc < 3} { - puts "\nMissing one of the required arguments \ \ \"; return + puts "\nMissing one of the required arguments \ \ \"; return } else { #turn off debug for stdout global debug; set debug 0 @@ -941,7 +1049,11 @@ proc main {} { if {[expr $::argc == 3]} { gatherinformation_and_begin_capture $version [lindex $::argv 0] [lindex $::argv 1] [lindex $::argv 2] } else { - gatherinformation_and_begin_capture $version [lindex $::argv 0] [lindex $::argv 1] [lindex $::argv 2] [lindex $::argv 3] [lindex $::argv 4] [lindex $::argv 5] + if {[expr $::argc <= 6]} { + gatherinformation_and_begin_capture $version [lindex $::argv 0] [lindex $::argv 1] [lindex $::argv 2] [lindex $::argv 3] [lindex $::argv 4] [lindex $::argv 5] + } else { + gatherinformation_and_begin_capture $version [lindex $::argv 0] [lindex $::argv 1] [lindex $::argv 2] [lindex $::argv 3] [lindex $::argv 4] [lindex $::argv 5] [lindex $::argv 6] + } } } } From 7b1b2e146cc099ce4b424b30a31153beb42f788c Mon Sep 17 00:00:00 2001 From: settlej <53984619+settlej@users.noreply.github.com> Date: Tue, 16 Jun 2020 00:27:32 -0400 Subject: [PATCH 06/14] Update capture_program.tcl --- capture_program.tcl | 216 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 202 insertions(+), 14 deletions(-) diff --git a/capture_program.tcl b/capture_program.tcl index 9411255..5c12ce8 100644 --- a/capture_program.tcl +++ b/capture_program.tcl @@ -308,8 +308,8 @@ proc acl_generator {protocol ipsource ipdest} { } } } else { - set source_dest "permit ip host $ipsource host $ipdest" - set dest_source "permit ip host $ipdest host $ipsource" + set source_dest "permit $protocol host $ipsource host $ipdest" + set dest_source "permit $protocol host $ipdest host $ipsource" } } else { if { $ipsource == "any" && $ipdest != "any" } { @@ -328,8 +328,8 @@ proc acl_generator {protocol ipsource ipdest} { set dest_source " permit $protocol host $ipdest any" } } else { - set source_dest "permit ip any host $ipdest" - set dest_source "permit ip host $ipdest any" + set source_dest "permit $protocol any host $ipdest" + set dest_source "permit $protocol host $ipdest any" } } else { if { $protocol == "tcp" || $protocol == "udp" } { @@ -347,8 +347,8 @@ proc acl_generator {protocol ipsource ipdest} { set dest_source " permit $protocol host $ipsource any" } } else { - set source_dest "permit ip host $ipsource any" - set dest_source "permit ip $ipdest any host $ipsource" + set source_dest "permit $protocol host $ipsource any" + set dest_source "permit $protocol any host $ipsource" } } } @@ -372,18 +372,21 @@ proc check_capture_status {} { # capture is operational return 1 } + puts status } # function to display moving progress bar # will check to see if capture is actually running, # usually will run for the full duration time period proc run_progress_bar {total} { + set finished "false" set startcheck 0 set started_succesfully -1 for {set i 0} {$i <= [expr $total]} {incr i} { if {$i == 0} {puts "\nStarting!\n"} progressbar $i $total flush stdout + if {$finished == "true"} { return } after 1000 if {$i == 1} {set startcheck [check_capture_status] if {$startcheck == 1} { @@ -399,18 +402,19 @@ proc run_progress_bar {total} { } } } - if { [expr {($i % 3) == 0}] } { + if { [expr {($i % 3) == 0}]} { #check every 3 seconds if completed or never started. set currentstatus [check_capture_status] # If started_successfully is 1 then capture was "Active" based on show command # is currentstatus changes to 0 then capture is "Inactive" based on show command # if 1 and 0 then capture may have reached size limit and early terminated capture # else 0 and 0 then capture didn't seem to start 3 secs into start - if { $started_succesfully == 1 && $currentstatus == 0} {set i [expr $total - 1]} + if { $started_succesfully == 1 && $currentstatus == 0} {set i [expr $total - 1]; set finished "true"} if { $started_succesfully == 0 && $currentstatus == 0 && $i < [expr $total - 2]} { puts "" puts "Capture didn't seem to start, please check logs" set i [expr $total + 1] + set finished "true" } } } @@ -419,6 +423,10 @@ proc run_progress_bar {total} { # function for capture commands on 3000 series switches except for 3850 proc capture_commands3000 { protocol ipsource ipdest ctype sinterface duration size mtu} { perform "monitor capture point stop all" + if {[file exists flash:CAPTURE.pcap]} { + debugputs "Deleting flash:CAPTURE.pcap" + file delete -force -- flash:CAPTURE.pcap + } perform "no access-list 199" iosconfig set aclresults [split [acl_generator $protocol $ipsource $ipdest] ":"] if {[llength $aclresults] == 1} { @@ -463,11 +471,11 @@ proc capture_commands3000 { protocol ipsource ipdest ctype sinterface duration s if {[regexp {Inactive} $check]} { set stop 3; } else { - puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop + puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture point POINT"]; incr stop } } perform "monitor capture point stop POINT" - debugputs "\(INFO\) Exporting capture to flash:CAPTURE.pcap" + puts "Exporting capture to flash:CAPTURE.pcap" # export packets in memory to flash as a pcap file perform "monitor capture buffer BUFF export flash:CAPTURE.pcap" # delete all capture commands and ACL @@ -507,7 +515,7 @@ proc capture_commands4500 { protocol ipsource ipdest ctype sinterface duration s # Because 2 interfaces are monitored there needs to be filtering to capture only traffic destined to monitor interface # and if 'any any' is defined then you might capture lots of irrelivant information. Single SOURCE IP is a protection # for busy uplink interfaces if monitoring an access port - if {[regexp {any} $ipsource] && [regexp {any} $ipdest]} { + if {[regexp {any} $ipsource] && [regexp {any} $ipdest] && $ctype != "control"} { puts "\n" puts "***FAILURE*** Both IP source and IP destination are \"any any\", needs to have single SOURCE IP. \n\n\[ENDING PROGRAM\]" perform "no monitor capture CAPTURE" @@ -562,6 +570,7 @@ proc capture_commands4500 { protocol ipsource ipdest ctype sinterface duration s perform "no monitor capture CAPTURE" perform "no class-map CAPTURE_CLASS_MAP" iosconfig if {[file exists bootflash:CAPTURE.pcap]} { + debugputs "Deleting bootflash:CAPTURE.pcap" file delete -force -- bootflash:CAPTURE.pcap } ios_config "class-map CAPTURE_CLASS_MAP" "match access-group name CAPTURE-FILTER" @@ -631,6 +640,7 @@ proc capture_commands9000 { protocol ipsource ipdest ctype sinterface duration s perform "no monitor capture CAPTURE" puts "" if {[file exists flash:CAPTURE.pcap]} { + debugputs "Deleting flash:CAPTURE.pcap" file delete -force -- flash:CAPTURE.pcap } set buffsize [expr $size * 1000] @@ -656,7 +666,7 @@ proc capture_commands9000 { protocol ipsource ipdest ctype sinterface duration s puts "Compiling packet capture to pcap format..."; after 3000; set check [exec "show monitor capture CAPTURE"]; incr stop } } - puts "Exporting capture to flash:CAPTURE.pcap" + puts "Exporting capture to flash:CAPTURE.pcap \(Warning slow\)" perform "monitor capture CAPTURE stop" perform "no monitor capture CAPTURE" perform "no ip access-list extended CAPTURE-FILTER" iosconfig @@ -689,6 +699,7 @@ proc capture_commands3800 { protocol ipsource ipdest ctype sinterface duration s perform "no monitor capture CAPTURE" perform "no class-map CAPTURE_CLASS_MAP" iosconfig if {[file exists flash:CAPTURE.pcap]} { + debugputs "Deleting flash:CAPTURE.pcap" file delete -force -- flash:CAPTURE.pcap } ios_config "class-map CAPTURE_CLASS_MAP" "match access-group name CAPTURE-FILTER" @@ -753,6 +764,7 @@ proc capture_commands4400 { protocol ipsource ipdest ctype sinterface duration s perform "no monitor capture CAPTURE" puts "" if {[file exists flash:CAPTURE.pcap]} { + debugputs "Deleting flash:CAPTURE.pcap" file delete -force -- flash:CAPTURE.pcap } if {$ctype == "control"} { @@ -809,6 +821,7 @@ proc capture_commands1000 { protocol ipsource ipdest ctype sinterface duration s perform "no monitor capture CAPTURE" if {[file exists flash:CAPTURE.pcap]} { + debugputs "Deleting flash:CAPTURE.pcap" file delete -force -- flash:CAPTURE.pcap } noexec_perform "monitor capture CAPTURE limit packet-len $mtu" @@ -953,7 +966,14 @@ proc displayhelp {} { wireshark udp 192.168.25.2 any wireshark udp 192.168.25.2 192.168.30.20:53 Gi1/0/1 wireshark udp 192.168.25.2:53 192.168.30.20 Gi1/0/1 40 10 - + + \[syntax\] wireshark erspan + wireshark erspan ip any any + wireshark erspan ip any any Gi1/0/1 + wireshark erspan ip any any Gi1/0/1 192.168.1.100 + wireshark erspan ip any any Gi1/0/1 192.168.1.100 50 + wireshark erspan --debug tcp any any + ***If you want display pcap on cli examples: wireshark filter @@ -1004,6 +1024,152 @@ proc getversion {} { } } +proc erspan_16code {protocol ipsource ipdest erspandest {sinterface {}} {duration 30}} { + if {$sinterface == {}} { + # If interface not provide at start ask for interface + puts "\nAvailable Interfaces:" + # Grab interfaces from "show ip interface brief" and using regex to grap interface names into a list + set foundinterfaces [regexp -all -inline {[A-Za-z-]+\d\/?\d?\/?\d?\/?\d?\d?} [exec "show ip int br"]] + # find longest interface name for padding on display, used in format below + set largestinterfacesize [expr [getlargest_interface $foundinterfaces] + 2] + foreach {a b c d e} [join $foundinterfaces " "] { + # add padding for clean looking screen display + set a [format {%-*s} $largestinterfacesize $a] + set b [format {%-*s} $largestinterfacesize $b] + set c [format {%-*s} $largestinterfacesize $c] + set d [format {%-*s} $largestinterfacesize $d] + set e [format {%-*s} $largestinterfacesize $e] + # creates 5 column print based on padding + puts "$a $b $c $d $e"} + set i 0 + puts " " + while {$i < 1} { + puts "Which interface to ERSPAN Monitor \[exact name needed\]?" + puts -nonewline "\nSelection: " + flush stdout + gets stdin {sinterface} + if {$i > 0} {continue} else {} + # simple error checking via searching interface list with its exact name from user input + if {[lsearch -exact $foundinterfaces "$sinterface"] == -1} { puts "\nInterface Not found...\n"} else {incr i} + } + } + set ipaddress_available [perform "show ip int br | i Loopback"] + if {$ipaddress_available != ""} { + set originip [lindex [regexp -all -inline {\S+} $line] 1] + } else { + puts -nonewline "Unable to located loopback IP. What ip will the ERSPAN session use as source IP: " + flush stdout + gets stdin {originip} + } + if {$duration == 30} { + puts -nonewline "For safety measure how long to run ERSPAN, in seconds <5-300 recommended> \[Default 30\]: " + flush stdout + gets stdin {duration} + if {$duration == ""} { + set duration 30 + } + } + # Monitor session variables + set monitor_session "monitor session 15 type erspan-source" + set monitor_description "description tcl created erspan via wireshark program" + set monitor_source "source interface $sinterface both" + set monitor_filter "filter ip access-group ERSPAN-FILTER" + set monitor_destination "destination" + set monitor_destip "ip address $erspandest" + set monitor_id "erspan-id 15" + set monitor_origin "origin ip address $originip" + set monitor_ttl "ip ttl 10" + set monitor_end "end" + # Applet EEM variables + set emergancy_timer [expr $duration + 10] + set applet_name "event manager applet ERSPAN_TIMER" + set applet_descr "description EMERGANCY ERSPAN stop timer" + set applet_event "event timer countdown time $emergancy_timer" + set applet_action1 "action 1.0 cli command \"en\"" + set applet_action2 "action 2.0 cli command \"config t\"" + set applet_action3 "action 3.0 cli command \"monitor session 15 type erspan-source\"" + set applet_action4 "action 4.0 cli command \"shutdown\"" + perform "no $applet_name" iosconfig + after 1000 + debugputs "$applet_name " + debugputs " $applet_descr " + debugputs " $applet_event " + debugputs " $applet_action1" + debugputs " $applet_action2" + debugputs " $applet_action3" + debugputs " $applet_action4" + debugputs " end" + ios_config $applet_name $applet_event $applet_descr $applet_action1 $applet_action2 $applet_action3 $applet_action4 "end" + + perform "no ip access-list extended ERSPAN-FILTER" iosconfig + set aclresults [split [acl_generator $protocol $ipsource $ipdest] ":"] + if {[llength $aclresults] == 1} { + set any_s_d [lindex $aclresults 0] + } else { + set source_dest [lindex $aclresults 0] + set dest_source [lindex $aclresults 1] + } + if { [info exists any_s_d] } { + ios_config "ip access-list extended ERSPAN-FILTER" "$any_s_d" + debugputs "ip access-list extended ERSPAN-FILTER $any_s_d" + set erspanacl "$any_s_d" + } else { + ios_config "ip access-list extended ERSPAN-FILTER" "$source_dest" "$dest_source" + debugputs "ip access-list extended ERSPAN-FILTER" + debugputs " $source_dest" + debugputs " $dest_source" + set erspanacl "$source_dest \n $dest_source" + } + debugputs "$monitor_session" + debugputs " $monitor_description " + debugputs " $monitor_source " + debugputs " $monitor_filter " + debugputs " no shutdown" + debugputs " $monitor_destination" + debugputs " $monitor_destip" + debugputs " $monitor_id" + debugputs " $monitor_origin" + debugputs " $monitor_ttl " + debugputs " exit" + debugputs " $monitor_end" + ios_config $monitor_session $monitor_description $monitor_source $monitor_filter "no shut" $monitor_destination $monitor_destip $monitor_id $monitor_ttl monitor_end + ios_config $monitor_session $monitor_destination $monitor_origin + puts "" + puts [string repeat * 20] + puts "\n If ERSPAN is destined to local computer with wireshark in default location + you can open 'CMD' or 'Powershell' \: \"C:\\Program Files\\Wireshark\\Wireshark.exe\" -f \"ip proto 0x2f\"" + puts "" + puts [string repeat * 20] + puts "" + puts "Erspan session will run for $duration seconds" + puts "" + run_progress_bar $duration + puts "\n" + ios_config $monitor_session "shutdown" + debugputs "$monitor_session" + debugputs " shutdown" + perform "no $monitor_session" iosconfig + perform "no ip access-list extended ERSPAN-FILTER" iosconfig + perform "no event manager applet ERSPAN_TIMER" iosconfig + puts "\nDone!\n" +} + + +proc erspan_setup {protocol ipsource ipdest erspandest {sinterface {}} {duration 30}} { + # version will determine which help to display + # Using switch loop to display correct filter, glob argument provides a regex like match + # bootflash is string argument passed to cli_filter_help + set version [getversion] + switch -glob $version { + 9* {erspan_16code $protocol $ipsource $ipdest $erspandest $sinterface $duration} + 45* {erspan_16code $protocol $ipsource $ipdest $erspandest $sinterface $duration} + 38* {cli_filter_help} + 356* {puts "CLI File Display on this device type is Unsupported. Must SCP to local Computer!"} + 1004 {puts "CLI File Display on this device type is Unsupported. Must SCP to local Computer!"} + 100* {cli_filter_help} + default {puts "CLI File Display on this device type is Unsupported. Must SCP to local Computer!"} + } +} proc main {} { # If no arguments passed to program, display help function to provide help examples. @@ -1017,6 +1183,28 @@ proc main {} { if {$::argc == 1 && [lindex $::argv 0] == "filter"} { cli_show_filters $version; return } + if {([lindex $::argv 0] == "erspan" || [lindex $::argv 1] == "--debug") && $::argc < 5} { + puts "\nMissing one of the required arguments \ \ \ "; return + } else { + if {[lindex $::argv 0] == "erspan" && [lindex $::argv 1] == "--debug"} { + if {[lindex $::argv 0] == "erspan"} { + clear_screen + global debug; set debug 1 + erspan_setup [lindex $::argv 2] [lindex $::argv 3] [lindex $::argv 4] [lindex $::argv 5] [lindex $::argv 6] + return + } else { + puts "\nInvalid option arrangment"; return + } + } + } + + if {[lindex $::argv 0] == "erspan" && $::argc < 5} { + puts "\nMissing one of the required arguments \ \ \ "; return + + clear_screen + global debug; set debug 0 + erspan_setup [lindex $::argv 1] [lindex $::argv 2] [lindex $::argv 3] [lindex $::argv 4] + } # debug will display commands used during program run if {[lindex $::argv 0] == "--debug"} { if {[expr $::argc < 4]} { @@ -1029,7 +1217,7 @@ proc main {} { if {[expr $::argc == 4]} { gatherinformation_and_begin_capture $version [lindex $::argv 1] [lindex $::argv 2] [lindex $::argv 3] } else { - if {[expr $::argc <= 6]} { + if {[expr $::argc <= 7]} { gatherinformation_and_begin_capture $version [lindex $::argv 1] [lindex $::argv 2] [lindex $::argv 3] [lindex $::argv 4] [lindex $::argv 5] [lindex $::argv 6] } else { gatherinformation_and_begin_capture $version [lindex $::argv 1] [lindex $::argv 2] [lindex $::argv 3] [lindex $::argv 4] [lindex $::argv 5] [lindex $::argv 6] [lindex $::argv 7] From 7a9ae142cf16ca4cc010e29a50d7c0ebd9443102 Mon Sep 17 00:00:00 2001 From: settlej <53984619+settlej@users.noreply.github.com> Date: Mon, 6 Jul 2020 23:01:54 -0400 Subject: [PATCH 07/14] Update capture_program.tcl --- capture_program.tcl | 290 +++++++++++++++++++++++++++++++++----------- 1 file changed, 220 insertions(+), 70 deletions(-) diff --git a/capture_program.tcl b/capture_program.tcl index 5c12ce8..61e109e 100644 --- a/capture_program.tcl +++ b/capture_program.tcl @@ -157,18 +157,42 @@ proc gatherinformation_and_begin_capture {version protocol ipsource ipdest {sint # if duration or size were not initially defined ask user if { $duration == {} || $size == {} } { if {$duration == {}} { - puts -nonewline "\nHow long to run capture? <1-300 seconds> \[Default=20\] : " - flush stdout - gets stdin {duration} - if {[string trim $duration] > 0} { - } else {set duration 20;} + set valid_num 0 + while {$valid_num == 0} { + puts -nonewline "\nHow long to run capture? <5-300 seconds> \[Default=20\] : " + flush stdout + gets stdin {duration} + if {$duration == ""} { + set duration 20 + incr valid_num + } + set results [verify_number_range [string trim $duration] 5 300] + if {$results == 0} { + puts "Invalid Duration Time" + } else { + incr valid_num + } + } } if {$size == {}} { - puts -nonewline "\nMax Capture size? <1-50 MB> \[Default=10\] : " - flush stdout - gets stdin {size} - if {[string trim $size] > 0} {} else {set size 10} + set valid_num 0 + while {$valid_num == 0} { + puts -nonewline "\nMax Capture size? <1-50 MB> \[Default=10\] : " + flush stdout + gets stdin {size} + if {$size == ""} { + set size 10 + incr valid_num + } + set results [verify_number_range [string trim $size] 1 50] + if {$results == 0} { + puts "Invalid Size" + } else { + incr valid_num + } } + if {[string trim $size] > 0} {} else {set size 10} + } startcapture $version $protocol $ipsource $ipdest $ctype $sinterface $duration $size $mtu } else { startcapture $version $protocol $ipsource $ipdest $ctype $sinterface $duration $size $mtu @@ -363,7 +387,7 @@ proc acl_generator {protocol ipsource ipdest} { # function to provide status of capture session proc check_capture_status {} { switch -glob $::version { - 3* {set status [exec "show monitor capture point POINT"]} + 356* {set status [exec "show monitor capture point POINT"]} default {set status [exec "show monitor capture CAPTURE"]} } if {[regexp {Inactive} $status]} { # capture is not operational @@ -1016,7 +1040,6 @@ proc getversion {} { if {[regexp {\d\d\d\d*} $found_version]} { global version set version [lindex [regexp -inline {\d\d\d\d} $found_version] 0] - puts "Device version: $version" return "$version" } else { puts "Unable to determine platform. " @@ -1024,8 +1047,9 @@ proc getversion {} { } } -proc erspan_16code {protocol ipsource ipdest erspandest {sinterface {}} {duration 30}} { - if {$sinterface == {}} { +proc erspan_16code {protocol ipsource ipdest erspandest {sinterface ""} {originip ""} {duration ""}} { + + if {$sinterface == ""} { # If interface not provide at start ask for interface puts "\nAvailable Interfaces:" # Grab interfaces from "show ip interface brief" and using regex to grap interface names into a list @@ -1053,26 +1077,69 @@ proc erspan_16code {protocol ipsource ipdest erspandest {sinterface {}} {duratio if {[lsearch -exact $foundinterfaces "$sinterface"] == -1} { puts "\nInterface Not found...\n"} else {incr i} } } - set ipaddress_available [perform "show ip int br | i Loopback"] - if {$ipaddress_available != ""} { - set originip [lindex [regexp -all -inline {\S+} $line] 1] - } else { - puts -nonewline "Unable to located loopback IP. What ip will the ERSPAN session use as source IP: " - flush stdout - gets stdin {originip} - } - if {$duration == 30} { - puts -nonewline "For safety measure how long to run ERSPAN, in seconds <5-300 recommended> \[Default 30\]: " - flush stdout - gets stdin {duration} - if {$duration == ""} { - set duration 30 + if {$originip == ""} { + set ipaddress_available [perform "show ip int br | i Loopback"] + set valid_ip 0 + if {$ipaddress_available != "" && [lindex [regexp -all -inline {\S+} $ipaddress_available] 1] != "unassigned"} { + set originip [lindex [regexp -all -inline {\S+} $ipaddress_available] 1] + } else { + while {$valid_ip < 1} { + puts -nonewline "Unable to located loopback IP. What ip will the ERSPAN session use as source IP: " + flush stdout + gets stdin {originip} + set valid_ip [verify_valid_ip $originip] + } + } + } + if {$duration == ""} { + set valid_num 0 + while {$valid_num == 0} { + puts -nonewline "For safety measure how long to run ERSPAN, in seconds <5-300 recommended> \[Default 30\]: " + flush stdout + gets stdin {duration} + if {$duration == ""} { + set duration 30 + incr valid_num + } + set results [verify_number_range $duration 5 300] + if {$results == 0} { + puts "Invalid Duration Time" + } else { + incr valid_num + } } } + puts "\n" + puts [string repeat * 50] + puts "ERSPAN Montior Interface: $sinterface " + if { $ipsource == "any" && $ipdest == "any" } { + puts "ERSPAN ACL: $protocol any any" + } else { + puts "ERSPAN ACL: $protocol $ipsource $ipdest + $protocol $ipdest $ipsource" + } + puts "ERSPAN Destination: $erspandest " + puts "ERSPAN Origin IP: $originip " + puts "ERSPAN max duration: $duration sec" + puts [string repeat * 50] + puts "\n" + puts "" + puts -nonewline "Start? \[yes\|no\]: " + flush stdout + gets stdin {start} + switch -glob $start { + y* {puts "\nStarting..."} + default { puts "\nCanceling!"; return } + } # Monitor session variables set monitor_session "monitor session 15 type erspan-source" set monitor_description "description tcl created erspan via wireshark program" - set monitor_source "source interface $sinterface both" + if {[regexp {[V|v]lan} $sinterface]} { + set vlannum [string range $sinterface 4 end] + set monitor_source "source vlan $vlannum both" + } else { + set monitor_source "source interface $sinterface both" + } set monitor_filter "filter ip access-group ERSPAN-FILTER" set monitor_destination "destination" set monitor_destip "ip address $erspandest" @@ -1081,26 +1148,28 @@ proc erspan_16code {protocol ipsource ipdest erspandest {sinterface {}} {duratio set monitor_ttl "ip ttl 10" set monitor_end "end" # Applet EEM variables - set emergancy_timer [expr $duration + 10] + set emergancy_timer [expr $duration + 5] set applet_name "event manager applet ERSPAN_TIMER" set applet_descr "description EMERGANCY ERSPAN stop timer" - set applet_event "event timer countdown time $emergancy_timer" + set applet_event "event timer countdown time $emergancy_timer " set applet_action1 "action 1.0 cli command \"en\"" set applet_action2 "action 2.0 cli command \"config t\"" set applet_action3 "action 3.0 cli command \"monitor session 15 type erspan-source\"" set applet_action4 "action 4.0 cli command \"shutdown\"" + set applet_action5 "action 5.0 syslog msg \" STOPPING ERSAPN\"" perform "no $applet_name" iosconfig after 1000 debugputs "$applet_name " debugputs " $applet_descr " - debugputs " $applet_event " + debugputs " $applet_event" debugputs " $applet_action1" debugputs " $applet_action2" debugputs " $applet_action3" debugputs " $applet_action4" - debugputs " end" - ios_config $applet_name $applet_event $applet_descr $applet_action1 $applet_action2 $applet_action3 $applet_action4 "end" - + debugputs " $applet_action5" + debugputs " exit" + ios_config $applet_name $applet_descr $applet_action1 $applet_action2 $applet_action3 $applet_action4 $applet_action5 $applet_descr "exit" + ios_config $applet_name $applet_event "exit" perform "no ip access-list extended ERSPAN-FILTER" iosconfig set aclresults [split [acl_generator $protocol $ipsource $ipdest] ":"] if {[llength $aclresults] == 1} { @@ -1135,11 +1204,11 @@ proc erspan_16code {protocol ipsource ipdest erspandest {sinterface {}} {duratio ios_config $monitor_session $monitor_description $monitor_source $monitor_filter "no shut" $monitor_destination $monitor_destip $monitor_id $monitor_ttl monitor_end ios_config $monitor_session $monitor_destination $monitor_origin puts "" - puts [string repeat * 20] - puts "\n If ERSPAN is destined to local computer with wireshark in default location + puts [string repeat * 50] + puts "\n If ERSPAN is destined to local computer with wireshark in default location you can open 'CMD' or 'Powershell' \: \"C:\\Program Files\\Wireshark\\Wireshark.exe\" -f \"ip proto 0x2f\"" puts "" - puts [string repeat * 20] + puts [string repeat * 50] puts "" puts "Erspan session will run for $duration seconds" puts "" @@ -1150,24 +1219,61 @@ proc erspan_16code {protocol ipsource ipdest erspandest {sinterface {}} {duratio debugputs " shutdown" perform "no $monitor_session" iosconfig perform "no ip access-list extended ERSPAN-FILTER" iosconfig - perform "no event manager applet ERSPAN_TIMER" iosconfig + perform "no event manager applet ERSPAN_TIMER" iosconfig puts "\nDone!\n" } -proc erspan_setup {protocol ipsource ipdest erspandest {sinterface {}} {duration 30}} { +proc erspan_setup {protocol ipsource ipdest erspandest {sinterface ""} {originip ""} {duration ""}} { # version will determine which help to display # Using switch loop to display correct filter, glob argument provides a regex like match # bootflash is string argument passed to cli_filter_help set version [getversion] + puts "Device version: $version" switch -glob $version { - 9* {erspan_16code $protocol $ipsource $ipdest $erspandest $sinterface $duration} - 45* {erspan_16code $protocol $ipsource $ipdest $erspandest $sinterface $duration} - 38* {cli_filter_help} - 356* {puts "CLI File Display on this device type is Unsupported. Must SCP to local Computer!"} - 1004 {puts "CLI File Display on this device type is Unsupported. Must SCP to local Computer!"} + 9* {erspan_16code $protocol $ipsource $ipdest $erspandest $sinterface $originip $duration} + 45* {erspan_4500_15code $protocol $ipsource $ipdest $erspandest $sinterface $originip $duration} + 38* {cli_filter_help} + 1004 { $protocol $ipsource $ipdest $erspandest $sinterface $originip $duration} 100* {cli_filter_help} - default {puts "CLI File Display on this device type is Unsupported. Must SCP to local Computer!"} + default {puts "ERSPAN setup not supported on this device!"} + } +} + +proc verify_valid_ip {ip} { + regexp {^(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}$} $ip match + if {[info exists match]} { + return 1 + } else { + return 0 + } +} + +proc verify_number_range {provided beginning ending} { + set bresult [string is digit -strict $beginning] + set eresult [string is digit -strict $ending] + set rprovided [string is digit -strict $provided] + if {$bresult == 0 || $eresult == 0 || $rprovided == 0 } { + return 0 + } else { + if {[expr $provided >= $beginning] == 1 && [expr $provided <= $ending] == 1} { + return 1 + } else { + return 0 + } + + } +} + +proc verify_valid_aclip {ip} { + if {$ip == "any"} { + return 1 + } + set ipverify [verify_valid_ip $ip] + if {$ipverify == 1} { + return 1 + } else { + return 0 } } @@ -1190,39 +1296,79 @@ proc main {} { if {[lindex $::argv 0] == "erspan"} { clear_screen global debug; set debug 1 - erspan_setup [lindex $::argv 2] [lindex $::argv 3] [lindex $::argv 4] [lindex $::argv 5] [lindex $::argv 6] + eval erspan_setup [lrange $::argv 2 end] return } else { puts "\nInvalid option arrangment"; return } } } - if {[lindex $::argv 0] == "erspan" && $::argc < 5} { puts "\nMissing one of the required arguments \ \ \ "; return - - clear_screen + } elseif {[lindex $::argv 0] == "erspan" && $::argc > 8} { + puts "\nToo Many arguments. \ \ \ \ \ \ \"; return + } elseif {[lindex $::argv 0] == "erspan" && $::argc >= 5} { global debug; set debug 0 - erspan_setup [lindex $::argv 1] [lindex $::argv 2] [lindex $::argv 3] [lindex $::argv 4] + set valid_acl_sourceip 0 + set valid_acl_sourceip [verify_valid_aclip [lindex $::argv 2]] + if {$valid_acl_sourceip == 0} { + puts "Invalid ACL Source IP!" + return + } + set valid_acl_destip 0 + set valid_acl_destip [verify_valid_aclip [lindex $::argv 3]] + if {$valid_acl_destip == 0} { + puts "Invalid ACL Destination IP!" + return + } + set valid_erspan_destip 0 + set valid_erspan_destip [verify_valid_ip [lindex $::argv 4]] + if {$valid_erspan_destip == 0} { + puts "Invalid ERSPAN Destination IP!" + return + } + set valid_erspan_sourceip 0 + if {$::argc >= 7} { + set valid_erspan_sourceip [verify_valid_ip [lindex $::argv 6]] + if {$valid_erspan_sourceip == 0} { + puts "Invalid ERSPAN Source IP!" + return + } + if {$::argc == 8} { + set results [verify_number_range [lindex $::argv 7] 5 300] + if {$results == 0} { + puts "Invalid Duration Time" + return + } + } + } + clear_screen + eval erspan_setup [lrange $::argv 1 end] + return + #[lindex $::argv 1] [lindex $::argv 2] [lindex $::argv 3] [lindex $::argv 4] } - # debug will display commands used during program run + #debug will display commands used during program run if {[lindex $::argv 0] == "--debug"} { if {[expr $::argc < 4]} { puts "\nMissing one of the required arguments \ \ \"; return } else { + if {$version == 0} { return } + set valid_acl_sourceip 0 + set valid_acl_sourceip [verify_valid_aclip [lindex $::argv 2]] + if {$valid_acl_sourceip == 0} { + puts "Invalid ACL Source IP!" + return + } + set valid_acl_destip 0 + set valid_acl_destip [verify_valid_aclip [lindex $::argv 3]] + if {$valid_acl_destip == 0} { + puts "Invalid ACL Destination IP!" + return + } clear_screen #turn on debug for stdout global debug; set debug 1; puts "\[Debugging mode\]" - if {$version == 0} { return } - if {[expr $::argc == 4]} { - gatherinformation_and_begin_capture $version [lindex $::argv 1] [lindex $::argv 2] [lindex $::argv 3] - } else { - if {[expr $::argc <= 7]} { - gatherinformation_and_begin_capture $version [lindex $::argv 1] [lindex $::argv 2] [lindex $::argv 3] [lindex $::argv 4] [lindex $::argv 5] [lindex $::argv 6] - } else { - gatherinformation_and_begin_capture $version [lindex $::argv 1] [lindex $::argv 2] [lindex $::argv 3] [lindex $::argv 4] [lindex $::argv 5] [lindex $::argv 6] [lindex $::argv 7] - } - } + eval gatherinformation_and_begin_capture $version [lrange $::argv 1 end] } return } else { @@ -1232,17 +1378,21 @@ proc main {} { } else { #turn off debug for stdout global debug; set debug 0 - clear_screen if {$version == 0} { return } - if {[expr $::argc == 3]} { - gatherinformation_and_begin_capture $version [lindex $::argv 0] [lindex $::argv 1] [lindex $::argv 2] - } else { - if {[expr $::argc <= 6]} { - gatherinformation_and_begin_capture $version [lindex $::argv 0] [lindex $::argv 1] [lindex $::argv 2] [lindex $::argv 3] [lindex $::argv 4] [lindex $::argv 5] - } else { - gatherinformation_and_begin_capture $version [lindex $::argv 0] [lindex $::argv 1] [lindex $::argv 2] [lindex $::argv 3] [lindex $::argv 4] [lindex $::argv 5] [lindex $::argv 6] - } + set valid_acl_sourceip 0 + set valid_acl_sourceip [verify_valid_aclip [lindex $::argv 1]] + if {$valid_acl_sourceip == 0} { + puts "Invalid ACL Source IP!" + return } + set valid_acl_destip 0 + set valid_acl_destip [verify_valid_aclip [lindex $::argv 2]] + if {$valid_acl_destip == 0} { + puts "Invalid ACL Destination IP!" + return + } + clear_screen + eval gatherinformation_and_begin_capture $version [lrange $::argv 0 end] } } } From 9e5cbf1042fcc4f858139d6eb38110a021d08c3f Mon Sep 17 00:00:00 2001 From: settlej <53984619+settlej@users.noreply.github.com> Date: Mon, 6 Jul 2020 23:02:57 -0400 Subject: [PATCH 08/14] Update capture_program.tcl --- capture_program.tcl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/capture_program.tcl b/capture_program.tcl index 61e109e..147c0fb 100644 --- a/capture_program.tcl +++ b/capture_program.tcl @@ -29,7 +29,7 @@ # # Created to simplify packet capture program on Cisco devices that support # native packet capture. Many Cisco platforms reqiure different commands -# to start packet capture. There was also the issue of requring +# to start packet capture. There was also the issue of requiring # multiple commands up to 14 different commands to start capturing. This is # depending on how grainularity of capture. This project was created to simplify # said operations in a "common" user friendly interface on any supported From bbf7d7c1c6a9da0b2929c6f1b973b48846928c3f Mon Sep 17 00:00:00 2001 From: settlej <53984619+settlej@users.noreply.github.com> Date: Tue, 7 Jul 2020 23:07:52 -0400 Subject: [PATCH 09/14] Update capture_program.tcl --- capture_program.tcl | 85 ++++++++++++++++++++++++++++++++------------- 1 file changed, 61 insertions(+), 24 deletions(-) diff --git a/capture_program.tcl b/capture_program.tcl index 147c0fb..3ea9a4b 100644 --- a/capture_program.tcl +++ b/capture_program.tcl @@ -991,12 +991,13 @@ proc displayhelp {} { wireshark udp 192.168.25.2 192.168.30.20:53 Gi1/0/1 wireshark udp 192.168.25.2:53 192.168.30.20 Gi1/0/1 40 10 - \[syntax\] wireshark erspan + \[syntax\] wireshark erspan \ wireshark erspan ip any any - wireshark erspan ip any any Gi1/0/1 - wireshark erspan ip any any Gi1/0/1 192.168.1.100 - wireshark erspan ip any any Gi1/0/1 192.168.1.100 50 - wireshark erspan --debug tcp any any + wireshark erspan ip any any 172.33.11.23 Gi1/0/1 + wireshark erspan ip any any 172.33.11.23 Gi1/0/1 2.2.2.2 + wireshark erspan ip any any 172.33.11.23 Gi1/0/1 2.2.2.2 50 + wireshark erspan ip any any 172.33.11.23 Gi1/0/1 2.2.2.2 50 rx + wireshark erspan --debug tcp any any 172.33.11.23 ***If you want display pcap on cli examples: wireshark filter @@ -1047,7 +1048,7 @@ proc getversion {} { } } -proc erspan_16code {protocol ipsource ipdest erspandest {sinterface ""} {originip ""} {duration ""}} { +proc erspan_16code {protocol ipsource ipdest erspandest {sinterface ""} {originip ""} {duration ""} {direction ""}} { if {$sinterface == ""} { # If interface not provide at start ask for interface @@ -1084,9 +1085,12 @@ proc erspan_16code {protocol ipsource ipdest erspandest {sinterface ""} {origini set originip [lindex [regexp -all -inline {\S+} $ipaddress_available] 1] } else { while {$valid_ip < 1} { - puts -nonewline "Unable to located loopback IP. What ip will the ERSPAN session use as source IP: " + puts -nonewline "Unable to located loopback IP. What ip will the ERSPAN session use as source IP \[Default=1.1.1.1\] : " flush stdout gets stdin {originip} + if {$originip == ""} { + set originip "1.1.1.1" + } set valid_ip [verify_valid_ip $originip] } } @@ -1109,20 +1113,44 @@ proc erspan_16code {protocol ipsource ipdest erspandest {sinterface ""} {origini } } } + if {$direction == ""} { + set transmit 0 + while {$transmit == 0} { + puts -nonewline "Capture Direction (rx,tx,both) \[Default=both\]: " + flush stdout + gets stdin {direction} + if {$direction == ""} { + set direction both + incr transmit + } + if {[string trim $direction] == "rx" || [string trim $direction] == "tx" || [string trim $direction] == "both"} { + incr transmit + } else { + puts "Invalid direction" + } + } + } puts "\n" puts [string repeat * 50] puts "ERSPAN Montior Interface: $sinterface " + puts "ERSPAN Direction Cap: $direction" if { $ipsource == "any" && $ipdest == "any" } { puts "ERSPAN ACL: $protocol any any" } else { puts "ERSPAN ACL: $protocol $ipsource $ipdest - $protocol $ipdest $ipsource" + $protocol $ipdest $ipsource" } puts "ERSPAN Destination: $erspandest " puts "ERSPAN Origin IP: $originip " puts "ERSPAN max duration: $duration sec" puts [string repeat * 50] - puts "\n" + puts "" + #puts [string repeat * 50] + puts "\n If ERSPAN is destined to local computer with wireshark in default location + you can open 'CMD' or 'Powershell' \: \"C:\\Program Files\\Wireshark\\Wireshark.exe\" -f \"ip proto 0x2f\"" + puts " \[IMPORTANT\] ERSPAN encapsulates with GRE headers, verify firewalls on network allow GRE traffic" + puts "" + #puts [string repeat * 50] puts "" puts -nonewline "Start? \[yes\|no\]: " flush stdout @@ -1136,9 +1164,9 @@ proc erspan_16code {protocol ipsource ipdest erspandest {sinterface ""} {origini set monitor_description "description tcl created erspan via wireshark program" if {[regexp {[V|v]lan} $sinterface]} { set vlannum [string range $sinterface 4 end] - set monitor_source "source vlan $vlannum both" + set monitor_source "source vlan $vlannum $direction" } else { - set monitor_source "source interface $sinterface both" + set monitor_source "source interface $sinterface $direction" } set monitor_filter "filter ip access-group ERSPAN-FILTER" set monitor_destination "destination" @@ -1203,12 +1231,12 @@ proc erspan_16code {protocol ipsource ipdest erspandest {sinterface ""} {origini debugputs " $monitor_end" ios_config $monitor_session $monitor_description $monitor_source $monitor_filter "no shut" $monitor_destination $monitor_destip $monitor_id $monitor_ttl monitor_end ios_config $monitor_session $monitor_destination $monitor_origin - puts "" - puts [string repeat * 50] - puts "\n If ERSPAN is destined to local computer with wireshark in default location - you can open 'CMD' or 'Powershell' \: \"C:\\Program Files\\Wireshark\\Wireshark.exe\" -f \"ip proto 0x2f\"" - puts "" - puts [string repeat * 50] + #puts "" + #puts [string repeat * 50] + #puts "\n If ERSPAN is destined to local computer with wireshark in default location + #you can open 'CMD' or 'Powershell' \: \"C:\\Program Files\\Wireshark\\Wireshark.exe\" -f \"ip proto 0x2f\"" + #puts "" + #puts [string repeat * 50] puts "" puts "Erspan session will run for $duration seconds" puts "" @@ -1224,17 +1252,17 @@ proc erspan_16code {protocol ipsource ipdest erspandest {sinterface ""} {origini } -proc erspan_setup {protocol ipsource ipdest erspandest {sinterface ""} {originip ""} {duration ""}} { +proc erspan_setup {protocol ipsource ipdest erspandest {sinterface ""} {originip ""} {duration ""} {direction ""}} { # version will determine which help to display # Using switch loop to display correct filter, glob argument provides a regex like match # bootflash is string argument passed to cli_filter_help set version [getversion] puts "Device version: $version" switch -glob $version { - 9* {erspan_16code $protocol $ipsource $ipdest $erspandest $sinterface $originip $duration} - 45* {erspan_4500_15code $protocol $ipsource $ipdest $erspandest $sinterface $originip $duration} - 38* {cli_filter_help} - 1004 { $protocol $ipsource $ipdest $erspandest $sinterface $originip $duration} + 9* {erspan_16code $protocol $ipsource $ipdest $erspandest $sinterface $originip $duration $direction} + 45* {erspan_4500_15code $protocol $ipsource $ipdest $erspandest $sinterface $originip $duration $direction} + 38* {erspan_16code $protocol $ipsource $ipdest $erspandest $sinterface $originip $duration $direction} + 1004 {erspan_16code $protocol $ipsource $ipdest $erspandest $sinterface $originip $duration $direction} 100* {cli_filter_help} default {puts "ERSPAN setup not supported on this device!"} } @@ -1272,9 +1300,19 @@ proc verify_valid_aclip {ip} { set ipverify [verify_valid_ip $ip] if {$ipverify == 1} { return 1 + } + if {[string match *:* $ip]} { + set dividedstring [split $ip :] + if {[lindex $dividedstring 0] == "any" && [string is digit -strict [lindex $dividedstring 1]]} { + return 1 + } + if {[verify_valid_ip [lindex $dividedstring 0]] && [string is digit -strict [lindex $dividedstring 1]]} { + return 1 + } } else { return 0 } + return 0 } proc main {} { @@ -1305,7 +1343,7 @@ proc main {} { } if {[lindex $::argv 0] == "erspan" && $::argc < 5} { puts "\nMissing one of the required arguments \ \ \ "; return - } elseif {[lindex $::argv 0] == "erspan" && $::argc > 8} { + } elseif {[lindex $::argv 0] == "erspan" && $::argc > 9} { puts "\nToo Many arguments. \ \ \ \ \ \ \"; return } elseif {[lindex $::argv 0] == "erspan" && $::argc >= 5} { global debug; set debug 0 @@ -1345,7 +1383,6 @@ proc main {} { clear_screen eval erspan_setup [lrange $::argv 1 end] return - #[lindex $::argv 1] [lindex $::argv 2] [lindex $::argv 3] [lindex $::argv 4] } #debug will display commands used during program run if {[lindex $::argv 0] == "--debug"} { From 410b9933f7749b88072c35db074eca3a0fa08c1f Mon Sep 17 00:00:00 2001 From: settlej <53984619+settlej@users.noreply.github.com> Date: Wed, 8 Jul 2020 19:48:42 -0400 Subject: [PATCH 10/14] Update capture_program.tcl --- capture_program.tcl | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/capture_program.tcl b/capture_program.tcl index 3ea9a4b..95a763a 100644 --- a/capture_program.tcl +++ b/capture_program.tcl @@ -1048,7 +1048,7 @@ proc getversion {} { } } -proc erspan_16code {protocol ipsource ipdest erspandest {sinterface ""} {originip ""} {duration ""} {direction ""}} { +proc erspan_16code {protocol ipsource ipdest erspandest {sinterface ""} {originip ""} {duration ""} {direction ""} {silent ""}} { if {$sinterface == ""} { # If interface not provide at start ask for interface @@ -1152,13 +1152,15 @@ proc erspan_16code {protocol ipsource ipdest erspandest {sinterface ""} {origini puts "" #puts [string repeat * 50] puts "" - puts -nonewline "Start? \[yes\|no\]: " - flush stdout - gets stdin {start} - switch -glob $start { - y* {puts "\nStarting..."} - default { puts "\nCanceling!"; return } - } + if {[string trim $silent] != "silent"} { + puts -nonewline "Start? \[yes\|no\]: " + flush stdout + gets stdin {start} + switch -glob $start { + y* {puts "\nStarting..."} + default { puts "\nCanceling!"; return } + } + } else { puts "Silent Mode: on" } # Monitor session variables set monitor_session "monitor session 15 type erspan-source" set monitor_description "description tcl created erspan via wireshark program" @@ -1252,17 +1254,17 @@ proc erspan_16code {protocol ipsource ipdest erspandest {sinterface ""} {origini } -proc erspan_setup {protocol ipsource ipdest erspandest {sinterface ""} {originip ""} {duration ""} {direction ""}} { +proc erspan_setup {protocol ipsource ipdest erspandest {sinterface ""} {originip ""} {duration ""} {direction ""} {silent ""}} { # version will determine which help to display # Using switch loop to display correct filter, glob argument provides a regex like match # bootflash is string argument passed to cli_filter_help set version [getversion] puts "Device version: $version" switch -glob $version { - 9* {erspan_16code $protocol $ipsource $ipdest $erspandest $sinterface $originip $duration $direction} - 45* {erspan_4500_15code $protocol $ipsource $ipdest $erspandest $sinterface $originip $duration $direction} - 38* {erspan_16code $protocol $ipsource $ipdest $erspandest $sinterface $originip $duration $direction} - 1004 {erspan_16code $protocol $ipsource $ipdest $erspandest $sinterface $originip $duration $direction} + 9* {erspan_16code $protocol $ipsource $ipdest $erspandest $sinterface $originip $duration $direction $silent} + 45* {erspan_4500_15code $protocol $ipsource $ipdest $erspandest $sinterface $originip $duration $direction $silent} + 38* {erspan_16code $protocol $ipsource $ipdest $erspandest $sinterface $originip $duration $direction $silent} + 1004 {erspan_16code $protocol $ipsource $ipdest $erspandest $sinterface $originip $duration $direction $silent} 100* {cli_filter_help} default {puts "ERSPAN setup not supported on this device!"} } @@ -1343,7 +1345,7 @@ proc main {} { } if {[lindex $::argv 0] == "erspan" && $::argc < 5} { puts "\nMissing one of the required arguments \ \ \ "; return - } elseif {[lindex $::argv 0] == "erspan" && $::argc > 9} { + } elseif {[lindex $::argv 0] == "erspan" && $::argc > 10} { puts "\nToo Many arguments. \ \ \ \ \ \ \"; return } elseif {[lindex $::argv 0] == "erspan" && $::argc >= 5} { global debug; set debug 0 From 70963fbfcf4d7b44a1a9d18fabeb4484f1ef8fda Mon Sep 17 00:00:00 2001 From: settlej <53984619+settlej@users.noreply.github.com> Date: Wed, 8 Jul 2020 19:50:21 -0400 Subject: [PATCH 11/14] Update README.md --- README.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 274c94a..29e0d76 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ switch# wireshark
Examples: [syntax] wireshark - + wireshark ip any any wireshark ip 192.168.25.2 any wireshark ip 192.168.25.2 192.168.30.20 Gi1/0/1 @@ -29,7 +29,15 @@ switch# wireshark
wireshark udp 192.168.25.2 any wireshark udp 192.168.25.2 192.168.30.20:53 Gi1/0/1 wireshark udp 192.168.25.2:53 192.168.30.20 Gi1/0/1 40 10 - + + [syntax] wireshark erspan + wireshark erspan ip any any + wireshark erspan ip any any 172.33.11.23 Gi1/0/1 + wireshark erspan ip any any 172.33.11.23 Gi1/0/1 2.2.2.2 + wireshark erspan ip any any 172.33.11.23 Gi1/0/1 2.2.2.2 50 + wireshark erspan ip any any 172.33.11.23 Gi1/0/1 2.2.2.2 50 rx + wireshark erspan --debug tcp any any 172.33.11.23 + ***If you want display pcap on cli examples: wireshark filter From b35152ffc236cce1accb07a7d9c28f1aa7fcc612 Mon Sep 17 00:00:00 2001 From: settlej <53984619+settlej@users.noreply.github.com> Date: Wed, 8 Jul 2020 20:53:01 -0400 Subject: [PATCH 12/14] Add files via upload --- screen_shots/erspandemo.gif | Bin 0 -> 236275 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 screen_shots/erspandemo.gif diff --git a/screen_shots/erspandemo.gif b/screen_shots/erspandemo.gif new file mode 100644 index 0000000000000000000000000000000000000000..c30298149265f5e0f42c5f6f5e4513880d9f1d77 GIT binary patch literal 236275 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ⅈ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 Ip`b)ltX+=b^vLE3~M0k=<2#|z{*ntrs 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 Bwjcli literal 0 HcmV?d00001 From eb3b81eab8f92f2358f9007f08cb48aefe9caa83 Mon Sep 17 00:00:00 2001 From: settlej <53984619+settlej@users.noreply.github.com> Date: Wed, 8 Jul 2020 20:53:58 -0400 Subject: [PATCH 13/14] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 29e0d76..a4b4355 100644 --- a/README.md +++ b/README.md @@ -53,3 +53,5 @@ switch# wireshark
![Image of Help](https://github.com/settlej/Simple_Packet_Capture/blob/master/screen_shots/normal.gif)

# Debug Run ![Image of Help](https://github.com/settlej/Simple_Packet_Capture/blob/master/screen_shots/debug.gif)

+# ERSPAN Run +![Image of Help](https://github.com/settlej/Simple_Packet_Capture/blob/master/screen_shots/erspandemo.gif)

From 5d4a2e6b5567eaa660a43a10ad9536302c3c1786 Mon Sep 17 00:00:00 2001 From: settlej <53984619+settlej@users.noreply.github.com> Date: Wed, 8 Jul 2020 20:59:32 -0400 Subject: [PATCH 14/14] Update capture_program.tcl --- capture_program.tcl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/capture_program.tcl b/capture_program.tcl index 95a763a..cf9c3eb 100644 --- a/capture_program.tcl +++ b/capture_program.tcl @@ -28,12 +28,12 @@ ############################################################################### # # Created to simplify packet capture program on Cisco devices that support -# native packet capture. Many Cisco platforms reqiure different commands +# native packet capture. Many Cisco platforms require different commands # to start packet capture. There was also the issue of requiring # multiple commands up to 14 different commands to start capturing. This is -# depending on how grainularity of capture. This project was created to simplify +# depending on how granularity of capture. This project was created to simplify # said operations in a "common" user friendly interface on any supported -# platform. Capture can happen in just 2 user inputs (initial decleration and +# platform. Capture can happen in just 2 user inputs (initial deceleration and # approving capture confirmation) # ###############################################################################