Useful TCL script?

Thomas Magill tmagill at providecommerce.com
Thu May 20 23:05:58 UTC 2010


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