Useful TCL script?

Christopher Gatlin chris at travelingtech.net
Sun May 23 22:16:58 UTC 2010


That is a stellar TCL script!

I generally use netflow to glean information regarding average packet size.

show ip cache-flow will provide it via the CLI, or a netflow collector will
graph it statistically over time.


Chris


On Thu, May 20, 2010 at 6:05 PM, Thomas Magill
<tmagill at providecommerce.com>wrote:

> I had to come up with a way to monitor average packet size on an
> interface so I wrote the following script (cisco devices).  I don't know
> if anyone finds it useful, but here it is if so.  Also, there is one
> issue with it where if the total number of packets an interface has seen
> is over 7 digits, it will not calculate it.  This appears to be a
> limitation of the expr command used in cisco TCL and mpexpr is not
> supported.  If anyone else knows a way to bypass this issue I would be
> glad to hear it.  For now it just tells you that the value is too high.
> I am also considering creating a job that can input the value into an
> OID that we can poll but not exactly sure how to do that so if anyone
> has any experience or good references (other than the cisco stuff I find
> on google) I would be thankful.
>
>
>
> I save this to flash: or disk: (depending on default tcl location per
> device) and assign the alias:
>
>
>
> alias exec psize tclsh psize.tcl
>
>
>
> Then use it like:
>
>
>
> Router#psize psize tun1
>
>
>
> Packet Size Information for Tunnel1
>
> ----------------------------------------------------
>
>  5 minute input bits/sec = 43000
>
>  5 minute input packets/sec  = 30
>
>  5 minute average packet size = 179 Bytes
>
> ----------------------------------------------------
>
>  5 minute output bits/sec = 3000
>
>  5 minute output packets/sec  = 3
>
>  5 minute average packet size = 125 Bytes
>
> ----------------------------------------------------
>
>  Total input bytes = 1678803
>
>  Total input packets  = 7761
>
>  Total average packet size = 216 Bytes
>
> ----------------------------------------------------
>
>  Total output bytes = 133316
>
>  Total output packets  = 1041
>
>  Total average packet size = 128 Bytes
>
> ----------------------------------------------------
>
>
>
> This is my first attempt at a script this complex so if you have any
> input/suggestions they are welcome.
>
>
>
> ########################################################################
> #####
>
> #
> #
>
> # psize.tcl
> #
>
> # By Thomas Magill - 5/7/2010
> #
>
> #
> #
>
> ########################################################################
> #####
>
> #
>
> # Get input from command line
>
> set ifname $argv
>
> # Check interface name for errors
>
> if {[string equal $ifname ""]} { puts "Usage: psize ifname"; return; }
>
> if { [ catch { exec "show ip interface $ifname" } errmsg ] } {
>
> puts "Invalid interface $ifname, command failed"; return}
>
> set cmdtext [ exec "show interface $ifname" ]
>
> # Pull interface information and calculate
>
> foreach line [split $cmdtext "\n"] {
>
>  if {[regexp -nocase {^(\S+) is (.*), line protocol is (\S+)} $line
> ignore ifnamefull ifstatus iflinkstatus]} {
>
> }
>
>  if {[regexp -nocase {5 minute input rate ([0-9]+) bits/sec, ([0-9]+)
> packets/sec} $line ignore bpsinfive ppsinfive]} {
>
>  if {$ppsinfive == "0"} {set psizeinfive "0"} else {set psizeinfive
> [expr $bpsinfive / $ppsinfive]}
>
>  set psizeinfive [expr $psizeinfive / 8]
>
> }
>
>  if {[regexp -nocase {5 minute output rate ([0-9]+) bits/sec, ([0-9]+)
> packets/sec} $line ignore bpsoutfive ppsoutfive]} {
>
>  if {$ppsoutfive == "0"} {set psizeoutfive "0"} else {set psizeoutfive
> [expr $bpsoutfive / $ppsoutfive]}
>
>  set psizeoutfive [expr $psizeoutfive / 8]
>
> }
>
>  if {[regexp -nocase {([0-9]+) packets input, ([0-9]+) bytes} $line
> ignore ppsintotal bpsintotal]} {
>
>  if {$ppsintotal > "9999999"} {set psizeintotal "Too Large to Find"}
> elseif {$ppsintotal == "0"} {set psizeintotal "0"} else {set
> psizeintotal [expr $bpsintotal / $ppsintotal]}
>
> }
>
>  if {[regexp -nocase {([0-9]+) packets output, ([0-9]+) bytes} $line
> ignore ppsouttotal bpsouttotal]} {
>
>  if {$ppsouttotal > "9999999"} {set psizeouttotal "Too Large to Find"}
> elseif {$ppsouttotal == "0"} {set psizeouttotal "0"} else {set
> psizeouttotal [expr $bpsouttotal / $ppsouttotal]}
>
> }
>
>  }
>
> # Output Data
>
>  puts "\n\nPacket Size Information for $ifnamefull"
>
>  puts "---------------------------------------------------------"
>
>  puts "  5 minute input bits/sec = $bpsinfive                   "
>
>  puts "  5 minute input packets/sec  = $ppsinfive               "
>
>  puts "  5 minute average packet size = $psizeinfive Bytes      "
>
>  puts "---------------------------------------------------------"
>
>  puts "  5 minute output bits/sec = $bpsoutfive                 "
>
>  puts "  5 minute output packets/sec  = $ppsoutfive             "
>
>  puts "  5 minute average packet size = $psizeoutfive Bytes     "
>
>  puts "---------------------------------------------------------"
>
>  puts "  Total input bytes = $bpsintotal                        "
>
>  puts "  Total input packets  = $ppsintotal                     "
>
>  puts "  Total average packet size = $psizeintotal Bytes        "
>
>  puts "---------------------------------------------------------"
>
>  puts "  Total output bytes = $bpsouttotal                      "
>
>  puts "  Total output packets  = $ppsouttotal                   "
>
>  puts "  Total average packet size = $psizeouttotal Bytes       "
>
>  puts "---------------------------------------------------------"
>
>
>
>
>
>
>
> Thomas Magill
> Network Engineer
>
> Office: (858) 909-3777
>
> Cell: (858) 869-9685
> mailto:tmagill at providecommerce.com <mailto:tmagill at providecommerce.com>
>
>
> provide-commerce
> 4840 Eastgate Mall
>
> San Diego, CA  92121
>
>
>
> ProFlowers <http://www.proflowers.com/>  | redENVELOPE
> <http://www.redenvelope.com/>  | Cherry Moon Farms
> <http://www.cherrymoonfarms.com/>  | Shari's Berries
> <http://www.berries.com/>
>
>
>
>


--



More information about the NANOG mailing list