This is a small utility I wrote in the process of my work. It is a bit ugly and nonetheless non-elegant and non-reliable, because the actual CPU utilization it measures for the switch also has the CPU needed to execute the “show system cpu” command from switch side.
Will be much more elegant if the switch reports the data to SNMP trap collector, but anyway. It will help you help yourself write your own script for this. This one is made to monitor the CPU while you work on other tasks.
The utility uses Tcl:Expect, Tcl:Math and Tcl:Tk. All of them are included in TclLibs package of your chosen distribution. The code is set to use SSH to the switch, but easily can be modified to work also with Telnet. Just un-comment the corresponding lines and set the “proto” value to be “telnet”. The other important values are ip, user, pass, enable, enablepass and the actual command the switch needs to show the CPU utilization. You can also tweak values of Delay and Width. I use 1000 and 600, because those are 10 minutes in one band-graph 100 pixels high.
Few disclaimers.
- The code is not very good and will raise exceptions if the switch does not respond in time.
- The code assumes that the result line will end in 1 to 3 digits followed by %-sign. (e.g. the result must say “current cpu is 100%” or “CPU 33%”)
- There is virtually no guarantee the code will show you accurate values. It is for monitoring only.
- When 10 minutes pass, the bar graph will start to scroll from right to left. No data is kept anywhere.
- Part of this code is copy&pasted verbatim from the Tcl forums and discussions
#!/usr/bin/wish package require Expect set proto ssh set ip 10.3.155.50 set user "admin" set pass "admin" set enable "enable" set enablepass "enableadmin" set cpu_command "show system cpu" # Uncomment next line in case of simple Telnet connection # spawn $proto $ip # Uncomment next line in case of SSH connection spawn $proto $user@$ip expect -re "name:" exp_send "$user\r" expect -re "word:" exp_send "$pass\r" # Uncomment in case you need "enable" and password #expect -re ">" #exp_send "$enable\r" #expect -re "word:" #exp_send "$enablepass\r" proc cpu {} { global cpu_command expect -re "#" exp_send "$cpu_command\r" expect -re "(\\d*)\\s*%" return $expect_out(1,string) } array set params \ { title {CPU utilization} width 600 height 100 delay 1000 plot [cpu] t0 0 t1 -1 } # compute heights set h $params(height) set h1 [expr {int($h * 0.5)}] ;# grey line @ 50% set h2 [expr {$h1 + 1}] # create canvas & bindings canvas .c -width $params(width) -height $h \ -xscrollincrement 1 -bg beige pack .c bind . { exit } # plotting itself wm title . $params(title) .c xview scroll $params(t0) unit set t $params(t0) while {$t != $params(t1)} \ { update after $params(delay) set v [expr ($h - $params(plot))] .c create line $t $h1 $t $h2 -fill gray .c create rectangle $t $v $t $h incr t if {$t > $params(width)} { .c xview scroll 1 unit } }