NS script

#!/usr/bin/wish -f
     
# ----------------------------------------- 
# NS -- netstat output viewer
# -----------------------------------------
     
lappend auto_path "/usr/local/lib/tkextra"
     
# ------------------------------
# Application-specific globals
# ------------------------------
     
# options for the 'netstat' command, set by menu items, initially off 
set f_family " "
set n_addr " "
set P_proto " "
set verbose " "
     
# ------------------------------
# Application-specific routines
# ------------------------------
     
#
# Do a "netstat", collect the output, put into a list-box 
#
proc get_stat {opt} {
 global f_family n_addr P_proto verbose
     
 #
 # Generate the command line
 # (use "col -x" to expand the tabs in the 'statistics' output) 
 #
 set cmd "|netstat $verbose $f_family $n_addr $P_proto $opt | col -x"
     
 #
 # Let the user know that this might take awhile
 # Put a message heading at the top of the scroll box 
 # Reposition the scroll box so the top line shows
 # Refresh everything before running the command 
 #
 .ps.list delete 0 end
 .ps.list insert 0 "Please wait, getting information..." 
 .ps.list yview 0
 update
     
 #
 # Execute the command line
 # Collect the resulting list of lines 
 # Fill the list-box with the lines
 #
 fill_list  .ps.list  [read_list $cmd] 0 
}
     
     
# ------------------------------
# GUI Specific Routines
# ------------------------------
     
#
# Make the main control panel -- fill it with some controls 
#
proc make_control_panel { } {
 global f_family P_proto n_addr verbose
     
 #
 # Setup some window-manager options
 #
 wm title    . "NetStat"
 wm iconname . "NS"
 wm command  . "NetStat"
     
 #
 # Make the menu-bar, all the menus, and the menu-items 
 #
 menu_bar .mbar 0   \
  {menu File}   \
  {cmd  Quit exit}  \
  {end left}   \
  {menu Options}  \
  {check "Numeric Addrs" n_addr  " " "-n"} \ 
  {check "Verbose" verbose  " " "-v"} \
  {end left}      \
  {menu Family}      \
  {radio All  f_family " "}  \
  {sep}       \
  {radio INET  f_family "-f inet"} \
  {radio UNIX  f_family "-f unix"} \
  {end left}     \
  {menu Protocol}    \
  {radio All  P_proto " "}  \
  {sep}      \
  {radio UDP  P_proto "-P udp"} \
  {radio TCP  P_proto "-P tcp"} \
  {radio IP  P_proto "-P ip"} \
  {radio ICMP  P_proto "-P icmp"} \
  {radio GCMP  P_proto "-P gcmp"} \
  {end left}
     
 #
 # Make the scrolling list-box (resize it from the default 80x5) 
 #
 mk_list  .ps ""
 # For Tk3.6 .ps.list configure -geometry 80x12 
 .ps.list configure -height 12
     
 #
 # Make the control buttons
 #
 buttons .cmd "" left 0     \
  {width 4}     \
  {cmd Netstat    "get_stat \"\""} \
  {cmd MultiCast  "get_stat -g"}  \
  {cmd "TCP Infc" "get_stat -i"}  \
  {cmd Streams    "get_stat -m"}  \
  {cmd ARP        "get_stat -p"}  \
  {cmd Routes     "get_stat -r"}  \
  {cmd Stats      "get_stat -s"}  \
  {cmd Quit  exit }
     
 # pack menu   -> top
 # pack btns   -> on the bottom
 # pack scroll-box -> in the middle
     
 pack .mbar  -side top    -fill x 
 pack .ps    -side top    -fill both -expand yes 
 pack .cmd   -side bottom -fill x 
}
     
     
# ------------------------------
# M A I N - L I N E
# ------------------------------
     
#
# Create the GUI
# Fill the scroll-box
#
make_control_panel
get_stat ""
     
# ------------------------------
# The End.
# ------------------------------

-- 
Mike Hall
mghall@mcs.com
