163 lines
4.9 KiB
Tcl
163 lines
4.9 KiB
Tcl
#!/usr/local/bin/wish
|
|
#
|
|
# syslogtk a simple tcl/tk script which is used to continuously display
|
|
# a syslog logging file
|
|
#
|
|
# Author: John M. Fisk <fiskjm@ctrvax.vanderbilt.edu>
|
|
# Version: $Id: syslogtk,v 1.1.1.1 2002/08/14 22:26:58 dan Exp $
|
|
|
|
#############################################################################
|
|
# SET GLOBAL VARIABLES #
|
|
#############################################################################
|
|
|
|
# path to initial log file
|
|
set logFile /var/adm/syslog
|
|
|
|
# number of rows in Maximized and Minimized window
|
|
set maxRows 25
|
|
set minRows 5
|
|
|
|
# initial number of rows & cols and the number of lines to 'tail'
|
|
set initRows $minRows
|
|
set initCols 80
|
|
set tailLines 200
|
|
|
|
# on occasion, tail seems to "hang" after pppd terminates; as a kludge, set
|
|
# up "auto-update" which restarts the tail process every autoUpdateMIN minutes
|
|
set autoUpdateMIN 20
|
|
|
|
#############################################################################
|
|
# PROCEDURE DEFINITIONS #
|
|
#############################################################################
|
|
|
|
proc CreateWindow { rows cols } {
|
|
#
|
|
# creates the primary set of widgets and displays the main window --
|
|
# it accepts two arguments: the no. of rows and cols of the text
|
|
# widget in which the file is displayed
|
|
|
|
global logFile maxRows minRows tailLines fileList
|
|
|
|
# FRAMES
|
|
frame .mbar -relief raised -bd 2
|
|
frame .info -relief flat
|
|
frame .text -relief groove -bd 2
|
|
frame .btn -relief sunken -bd 2
|
|
pack .mbar .info .text .btn \
|
|
-side top -fill x -padx 1m -pady 1m
|
|
|
|
# MENUBAR
|
|
menubutton .mbar.file -text "File" -underline 0 -menu .mbar.file.menu
|
|
pack .mbar.file -side left
|
|
|
|
# ADD FILES IN /var/adm TO MENU
|
|
# for this to work, the user must have read permission on the files in
|
|
# /var/adm
|
|
menu .mbar.file.menu -tearoff false
|
|
foreach f [lsort [glob /var/adm/*]] {
|
|
if {[file isfile $f] && [file readable $f]} {
|
|
.mbar.file.menu add command -label $f \
|
|
-command [list ViewFile $f]
|
|
}
|
|
}
|
|
.mbar.file.menu add separator
|
|
.mbar.file.menu add command -label "Exit" -command { exit }
|
|
|
|
tk_menuBar .mbar .mbar.file
|
|
|
|
# FILENAME LABEL
|
|
label .info.lbl -text "System Log File: "
|
|
entry .info.ent -textvariable logFile -relief flat
|
|
pack .info.lbl .info.ent -side left
|
|
|
|
# TEXT AND SCROLLBAR WIDGETS
|
|
text .text.txt -relief raised -bd 2 -yscrollcommand ".text.sB set" \
|
|
-width $cols -height $rows -wrap word
|
|
scrollbar .text.sB -command ".text.txt yview"
|
|
pack .text.sB -side right -fill y
|
|
pack .text.txt -side left
|
|
|
|
# OPERATION BUTTONS
|
|
button .btn.head -text "Goto Head" -command { .text.txt see 1.0 }
|
|
button .btn.tail -text "Goto End" -command { .text.txt see end }
|
|
button .btn.incr -text "Maximize Window" -command {
|
|
.text.txt configure -height $maxRows
|
|
.text.txt see end
|
|
}
|
|
button .btn.decr -text "Minimize Window" -command {
|
|
.text.txt configure -height $minRows
|
|
update
|
|
.text.txt see end
|
|
}
|
|
button .btn.update -text "Update" -command {
|
|
KillTail
|
|
LoadFile $logFile $tailLines
|
|
}
|
|
button .btn.quit -text "QUIT" -command {
|
|
KillTail
|
|
exit
|
|
}
|
|
pack .btn.head .btn.tail .btn.incr .btn.decr .btn.update .btn.quit \
|
|
-side left -padx 1m -pady 2m -fill x -expand TRUE
|
|
}
|
|
|
|
proc LoadFile { file lines } {
|
|
#
|
|
# uses ``tail'' to display the file and ``fileevent'' to continuously
|
|
# update the display. it takes two arguments: the path to file which
|
|
# is to be displayed and the number of lines to tail
|
|
|
|
global logFD tailPID
|
|
|
|
if [catch { open "|tail -n $lines -f $file" RDONLY } logFD] {
|
|
puts stderr $logFD
|
|
} else {
|
|
.text.txt delete 1.0 end
|
|
set tailPID [pid $logFD]
|
|
fileevent $logFD readable {
|
|
gets $logFD line
|
|
.text.txt insert end $line\n
|
|
.text.txt see end
|
|
}
|
|
}
|
|
}
|
|
|
|
proc ViewFile { filename } {
|
|
#
|
|
# This loads another log file in /var/adm by killing the current tail
|
|
# process and then loading up the file specified by "filename"
|
|
|
|
global logFile tailLines
|
|
|
|
set logFile $filename
|
|
KillTail
|
|
LoadFile $filename $tailLines
|
|
}
|
|
|
|
proc KillTail {} {
|
|
#
|
|
# Kills the tail process and closes the file
|
|
|
|
global logFD tailPID
|
|
|
|
catch {exec kill -SIGTERM $tailPID}
|
|
catch {close $logFD}
|
|
}
|
|
|
|
proc AutoUpdate { intervalMIN } {
|
|
#
|
|
# This automatically updates the display every ``interval'' minutes
|
|
|
|
.btn.update invoke
|
|
after [expr $intervalMIN * 60 * 1000 ] AutoUpdate $intervalMIN
|
|
}
|
|
|
|
#############################################################################
|
|
# MAIN PROGRAM #
|
|
#############################################################################
|
|
|
|
# create window, load the default logfile, and start auto-updating
|
|
CreateWindow $initRows $initCols
|
|
LoadFile $logFile $tailLines
|
|
AutoUpdate $autoUpdateMIN
|