#!/usr/bin/wish -f # # startool -- Si-Package tool: # Install, Uninstall, run batch and graph mode. # created by: Valentin E. Kuznetsov # date: September 21, 1997 ######################################################################## #### Set title and allow window resizing. wm title . "STAR package manager" wm iconname . "startool" wm geometry . +10+10 #### General settings set userdir [pwd] set workdir [pwd] set starfzdir "/pool/star2/STAR_FZ/" set aug_nus "/pool/star2/STAR_FZ/aug_nus/" set aug_mus "/pool/star2/STAR_FZ/aug_mus/" set stargraph "/star/stargraph" set starbatch "/star/star" set stardir "/pool/star2/valya/nomad_star/packages/star" set startar "/pool/star2/valya/nomad_star/packages/tar/starnew.tar" set startcl "/pool/star2/valya/nomad_star/tcl_tk" set dcdir "/pool/star2/valya/nomad_star/packages/dc" set dctar "/pool/star2/valya/nomad_star/packages/tar/dcnew.tar" set font -Adobe-Helvetica-Medium-R-Normal--*-180-*-*-*-*-*-* set font170 -Adobe-Helvetica-Medium-R-Normal--*-170-*-*-*-*-*-* set font160 -Adobe-Helvetica-Medium-R-Normal--*-160-*-*-*-*-*-* set font150 -Adobe-Helvetica-Medium-R-Normal--*-160-*-*-*-*-*-* set font140 -Adobe-Courier-Bold-R-Normal--*-140-*-*-*-*-*-* set font130 -Adobe-Courier-Bold-R-Normal--*-130-*-*-*-*-*-* set font100 -Adobe-Courier-Bold-R-Normal--*-100-*-*-*-*-*-* set data /pool/star2/STAR_FZ/aug_mus_jj/r15920_nu.fz set bgcol gray85 set fgcol gray80 set file "empty" #### Create a frame for buttons and entry. frame .top -borderwidth 20 -bg gray85 pack .top -side top -fill x # -padx 300 -pady 40 #### Create a message text message .top.msg -aspect 1000 -bg gray85 -text "Si-package Development Kit" pack .top.msg -side top -fill x #### Create the Help menu menubutton .top.mh -padx 3 -pady 2 -relief raised -bg gray85 \ -text "Help" -menu .top.mh.menu set mh [menu .top.mh.menu -tearoff 1] $mh add command -label "About" -command { set mes "NOMAD-STAR\nValentin E. Kuznetsov\n\ Email: valya@nu.jinr.ru" set confirm [tk_dialog .message {Confirm!} $mes warning 0 OK Quit] } $mh add command -label "How to use" -command HelpManager $mh add command -label "Si-Package" -command { set mes "Not implemented at the moment, sorry" set confirm [tk_dialog .message {Confirm!} $mes warning 0 OK Quit] } $mh add command -label "Communication" -command MailManager #### Create the Make menu menubutton .top.mm -padx 3 -pady 2 -relief raised \ -bg gray85 -text "Make" -menu .top.mm.menu set mm [menu .top.mm.menu -tearoff 1] $mm add cascade -label Install -menu $mm.sub1 set m1 [menu $mm.sub1 -tearoff 0] $m1 add command -label "Si-Package" \ -command {SiManager $workdir "install"} $m1 add command -label "Dc-Package" \ -command {DcManager $workdir "install"} $mm add separator $mm add cascade -label Update -menu $mm.sub2 set m2 [menu $mm.sub2 -tearoff 0] $m2 add command -label "Si-Package" \ -command {SiManager $workdir "update"} $m2 add command -label "Dc-Package" \ -command {DcManager $workdir "update"} $mm add separator $mm add cascade -label Compile -menu $mm.sub3 set m3 [menu $mm.sub3 -tearoff 0] $m3 add command -label "Si-Package" \ -command {SiManager $workdir "compile"} $m3 add command -label "Dc-Package" \ -command {DcManager $workdir "compile"} $mm add separator $mm add cascade -label Remove -menu $mm.sub4 set m4 [menu $mm.sub4 -tearoff 0] $m4 add command -label "Si-Package" \ -command {SiManager $workdir "remove"} $m4 add command -label "Dc-Package" \ -command {DcManager $workdir "remove"} $m4 add command -label "Everything" \ -command {"/bin/rm -rf $workdir/*"} #### Create the Run menu menubutton .top.mr -padx 3 -pady 2 -relief raised \ -bg gray85 -text "Run" -menu .top.mr.menu set mr [menu .top.mr.menu -tearoff 1] $mr add command -label "StarGraph" \ -command {RunManager $stargraph} $mr add command -label "FileOpen" -command { feedback_sit "Open input file" set file [tk_getOpenFile -initialdir $starfzdir] feedback_sit "" } $mr add command -label "StarBatch" -command {RunManager $starbatch} $mr add command -label "Send job to NQS" -command SendtoNQS $mr add command -label "StatusNQS" -command StatusNQS $mr add command -label "StageTape" -command StageTape $mr add command -label "Status ps" -command \ {Run "ps auxw | grep $env(USER)"} #### Create the Debug menu menubutton .top.md -padx 3 -pady 2 -relief raised \ -bg gray85 -text "Debug" -menu .top.md.menu set md [menu .top.md.menu -tearoff 1] $md add command -label "StarGraph" \ -command {DebbugManager $stargraph} $md add command -label "StarBatch" \ -command {DebbugManager $starbatch} button .top.quit -padx 3 -pady 2 -bg gray85 -text Quit -command exit # ToolTips popups for the buttons. if [file exist $startcl/tooltips.tcl] { source $startcl/tooltips.tcl set_tooltips .top.mh \ {{Introduction how to use this package}} set_tooltips .top.mm \ {{install, uninstall, update, compile menu}} set_tooltips .top.mr \ {{run Si-package in different mode}} set_tooltips .top.md \ {{run Si-package with debugger in different mode}} set_tooltips .top.quit \ {{Exit of startool}} } #### Configuration of geometry for buttons and menus pack .top.quit -ipady 3 -ipadx 10 -padx 20 -side right pack .top.md -ipady 3 -ipadx 10 -padx 20 -side right pack .top.mr -ipady 3 -ipadx 10 -padx 20 -side right pack .top.mm -ipady 3 -ipadx 10 -padx 20 -side right pack .top.mh -ipady 3 -ipadx 10 -padx 20 -side right #### Entry widget used by feedback frame .bottom; frame .center pack .bottom -in .center -side bottom -fill x pack .center -side left -fill both -expand yes set feedback(sit) [entry .feedback -width 55] pack .feedback -in .bottom -side bottom -fill x -expand yes ############################################################## #### Create startool settings window set w .settings toplevel $w wm title $w "StarTool Settings" wm geometry $w +300+300 frame $w.top -borderwidth 40 -bg gray85 pack $w.top -side top -fill x # Create a labeled entry for the install directory label $w.top.l -text "Enter install directory:" -padx 0 -bg gray85 entry $w.top.cmd -width 50 -relief sunken -bg gray85 \ -textvariable workdir #bind $w.top.cmd <Return> {gets $workdir line} bind $w.top.cmd <Return> { set userdir [file join $workdir "work"] destroy $w } focus $w.top.cmd button $w.top.ok -text Ok -bg gray80 -command { if ![file exists [file join $workdir "work"]] { eval exec "/bin/mkdir $workdir/work" } set userdir [file join $workdir "work"] destroy $w set confirm [tk_dialog .message {Confirm!} \ "Your working directori is $workdir,\n\ all results will be in\n $userdir" \ warning 0 OK Quit] } pack $w.top.l -side left pack $w.top.cmd -side left -fill x -expand true pack $w.top.ok -side right ############################################################## #### Definition of functions are followed below this line #### # #### The HelpManager procedure proc HelpManager { } { global font100 set w .helpmanager createWindow $w "Help Manager" message $w.top.msg -aspect 300 -font $font100 -bg gray85 -text \ "This is simple tool to install and start Si package on your site \ with stable up-date version of Dc as well as Si packages. \ The Make menu contains: install (cvs checkout of packages), \ update (cvs update), compile and remove options. Choose one of \ them for your purpose. The compilations takes some of your time \ since it run make, please be patient and use only axnd02 machine \ for this goal to avoid any problems. The Run menu contains \ stargraph and starbatch program, please chose one of them to run \ program. In the case of starbatch you need to specify input file \ from FileOpen menu. The stargraph has familar friendly OnX interface. \ If you got a crash of your program at some point, you have a \ possibility to run it again using Debug menu. \ Everywhere to exit type Quit.\n\n\ In the case of any problems send me Email with short description \ of your problem.\nGood luck, Valentin." button $w.top.quit -text Quit -command "destroy $w" -bg gray80 pack $w.top.quit $w.top.msg -side bottom } #### The Status Window proc StatusWindow { textinwindow } { global font workdir set w .statwin createWindow $w "Status Window" message $w.msg -aspect 1000 -justify center \ -text $textinwindow -font $font -bg gray85 button $w.top.quit -text Quit -bg gray80 -command "destroy $w" pack $w.top.quit $w.msg -side top } #### The Install procedure proc SetWorkDir { } { global workdir set w .setworkdir createWindow $w "Settings" # Create a labeled entry for the install directory label $w.top.l -text "Enter install directory:" -padx 0 -bg gray85 entry $w.top.cmd -width 20 -relief sunken -bg gray85 \ -textvariable workdir bind $w.top.cmd <Return> {gets $workdir line} focus $w.top.cmd pack $w.top.l -side left pack $w.top.cmd -side left -fill x -expand true button $w.top.ok -text Ok -bg gray80 -command "destroy $w" pack $w.top.ok -side right } #### The RunManager procedure proc RunManager { com } { global stargraph starbatch file env workdir userdir global output redirect redfile f_e f_n f_p set events 0; set noise 0; set pedestals 0; set redfile " " set f_e ""; set f_n ""; set f_p ""; set output "Redirect output to" set w .runmanager createWindow $w "Run Manager" cd $userdir if { $com == $starbatch } { button $w.top.opt -bg gray80 -text "Activate Flags" -command { set w2 .flagsmanager createWindow $w2 "Activate Flags" scale $w2.s1 -from 0 -to 100 -length 400 \ -variable events -orient horizontal \ -label "# of events" \ -tickinterval 10 -showvalue true scale $w2.s2 -from 0 -to 400 -length 400 \ -variable noise -orient horizontal \ -label "# of evt. for noise.data" \ -tickinterval 40 -showvalue true scale $w2.s3 -from 0 -to 200 -length 400 \ -variable pedestals -orient horizontal \ -label "# of evt. for pedestals.data" \ -tickinterval 20 -showvalue true pack $w2.s1 $w2.s2 $w2.s3 -side top frame $w2.left pack $w2.left -side top -expand yes -pady .5c -padx .5c foreach redirect {tofile stdout} { set lower [string tolower $redirect] radiobutton $w2.left.$lower -text "$output $redirect" \ -variable redirect -value $lower pack $w2.left.$lower -side top -pady 2 -anchor w } button $w2.b -bg gray80 -text Ok -command "destroy $w2" pack $w2.b -side top } button $w.top.start -bg gray80 -text Start -command { SetEnvironment $workdir if {$file == "empty"} { set confirm [tk_dialog .message {Confirm!} \ {Please specify input file in [Run->FileOpen] menu} \ warning 0 OK Quit] } else { if { $events != 0 } {set f_e "-e $events"} if { $noise != 0 } {set f_n "-n $noise"} if { $pedestals != 0 } {set f_p "-p $pedestals"} if {$redirect == "tofile"} { set name [file tail $file] set name [file join $userdir $name] set redfile " >& $name.output" } elseif {$redirect == "stdout"} { set redfile "" } set name "$workdir/$starbatch" set program "$name -i $file $f_e $f_n $f_p $redfile" if [file exist "$name.output"] { eval exec "/bin/rm -f $name.output" } feedback_sit "Running Si-Package in batch mode" Run $program feedback_sit "" } } pack $w.top.start $w.top.opt -side left } else { button $w.top.start -bg gray80 -text Start -command { feedback_sit "Running Si-Package in graph mode" SetEnvironment $workdir Run "$workdir/$stargraph" feedback_sit "" } pack $w.top.start -side left } button $w.top.clean -bg gray80 -text Clean -command { feedback_sit "Cleaning" eval exec "/bin/rm -f $userdir/qq*" eval exec "/bin/rm -f $userdir/fort.50" eval exec "/bin/rm -f job.*" feedback_sit "" } button $w.top.quit -bg gray80 -text Quit -command "destroy $w" pack $w.top.clean $w.top.quit -side left } #### The DebbugManager procedure proc DebbugManager { com } { global stargraph starbatch file env workdir userdir cd $userdir if { $com == $starbatch } { feedback_sit "Running Si-Package in batch mode using gdb debbuger" SetEnvironment $workdir eval exec "xterm -e gdb --quiet $workdir/$starbatch" feedback_sit "" } else { feedback_sit "Running Si-Package in graph mode using gdb debbuger" SetEnvironment $workdir if [catch {open $workdir/$stargraph r} fileId] { puts stdout "Cannot open file $workdir/$stargraph: $fileId" } else { if [file exists "$workdir/env.csh"] { eval exec "/bin/rm -f $workdir/env.csh" } eval exec "touch $workdir/env.csh" eval exec "echo #!/bin/csh -f >> $workdir/env.csh" while {[gets $fileId line] >= 0} { if [scan $line {%[a-z]} result] { eval exec "echo $line >> $workdir/env.csh" } } eval exec "chmod a+x $workdir/env.csh" eval exec "$workdir/env.csh" close $fileId } eval exec "echo echo USAGE inside of gdb: run -show display.oui >> $workdir/env.csh" eval exec "echo gdb --quiet $workdir/star/OSF1/sigraphdev.exe >> $workdir/env.csh" cd $workdir/star eval exec "xterm -e $workdir/env.csh" eval exec "rm -rf qq* fort.50" cd $userdir feedback_sit "" } } #### We make position at the center of screen proc positionWindow w { wm geometry $w +300+300 } #### We create a new Window each time we need proc createWindow { w wtitle } { catch {destroy $w} toplevel $w wm title $w $wtitle positionWindow $w frame $w.top -borderwidth 40 -bg gray85 pack $w.top -side top -fill x } #### Create a new widget with scrollbar proc displayWindow { flytext font {run Running} } { global log run_command set w .displaymanager catch {destroy $w} feedback_sit $run toplevel $w wm title $w "Display Window" wm geometry $w +63+280 # positionWindow $w frame $w.t -borderwidth 5 -bg gray85 pack $w.t -side bottom -fill x # Create a frame for text widget frame $w.top set log [text $w.log -setgrid true -wrap word -width 100 -height 14 \ -font $font -borderwidth 2 -relief sunken -bg gray85 \ -yscrollcommand "$w.sy set"] scrollbar $w.sy -orient vert -bg gray80 -command "$w.log yview" $log insert end $flytext # Text_Dump $log stdout pack $w.sy -side right -fill y pack $w.log -side left -fill both -expand true pack $w.top -side top -fill both -expand true feedback_sit "" # Create a frame where buttom Quit placed button $w.t.quit -bg gray80 -text Quit -command "destroy $w" pack $w.t.quit -side right } #### Install or Update Si-package from CVS repository proc SiManager { dir com } { global env userdir SetEnvironment $dir set env(CVSROOT) "/nomad/cvsroot" if { $com == "install" } { feedback_sit "Installing Si-Package, please wait" cd $dir eval exec "cvs co -r v8r2 star >& /dev/null" feedback_sit "" } elseif { $com == "update" } { feedback_sit "Updating Si-Package, please wait" cd $dir/star eval exec "cvs up >& /dev/null" feedback_sit "" } elseif { $com == "remove" } { feedback_sit "Removing Si-Package, please wait" cd $dir eval exec "/bin/rm -rf star >& /dev/null" feedback_sit "" } elseif { $com == "compile" } { if ![file exist $dir/lib] { eval exec "/usr/bin/mkdir $dir/lib" } if ![file exist $dir/lib/libdcdev.a] { set mes "In order to install Si-package you need first\ install Dc-package" set confirm [tk_dialog .message {Confirm!} $mes warning 0 OK Quit] } else { feedback_sit "Compiling Si-Package, please wait" cd $dir/star eval exec "/usr/local/bin/gmake CC=gcc main graph -f Makefile >& make.log" feedback_sit "" } } cd $userdir } #### Install or Update Dc-package from CVS repository proc DcManager { dir com } { global env userdir if ![file exist ~/.cvspass] { eval exec "touch ~/.cvspass" set cvspass {:pserver:pariscvs@lpnax1.in2p3.fr:/home/users/nomad/master A+y%d'} eval exec "echo $cvspass >> ~/.cvspass" } SetEnvironment $dir set env(CVSROOT) {:pserver:pariscvs@lpnax1.in2p3.fr:/home/users/nomad/master} if { $com == "install" } { feedback_sit "Installing Dc-Package, please wait" cd $dir eval exec "cvs co -r v7r7a-star dc >& /dev/null" feedback_sit "" } elseif { $com == "update" } { feedback_sit "Updating Dc-Package, please wait" cd $dir/dc eval exec "cvs up >& /dev/null" feedback_sit "" } elseif { $com == "remove" } { feedback_sit "Removing Dc-Package, please wait" cd $dir eval exec "/bin/rm -rf dc >& /dev/null" feedback_sit "" } elseif { $com == "compile" } { if ![file exist $dir/lib] { eval exec "/usr/bin/mkdir $dir/lib" } feedback_sit "Compiling Dc-Package, please wait" cd "$dir/star" eval exec "ln -s . include" cd $dir/dc eval exec "/usr/local/bin/gmake CC=gcc -f Makefile >& make.log" feedback_sit "" } cd $userdir } #### The Status of NQS query proc StatusNQS { } { global font100 userdir feedback_sit "Running qstat, please wait a moment..." set qstat /usr/local/bin/qstat set fileq [file join $userdir qstat.csh] if [file exist $fileq] {eval exec "/bin/rm -f $fileq"} eval exec "touch $fileq" eval exec "echo #!/bin/csh -f >> $fileq" foreach I {1 2 3 4 5 6 7 9} { eval exec "echo $qstat -a -h axnd0$I >> $fileq" } set I 10; while {$I<35} { eval exec "echo $qstat -a -h axnd$I >> $fileq" incr I } eval exec "chmod a+x $fileq" Run $fileq $font100 feedback_sit "" } #### The Send command to NQS query proc SendtoNQS { } { global font100 userdir workdir set w .nqsmanager createWindow $w "NQS Manager" frame $w.top.f1 -bd 2 label $w.top.f1.l1 -text "Input File:" -padx 0 -bg gray85 entry $w.top.f1.e1 -width 40 -relief sunken -bg gray85 \ -textvariable userdata bind $w.top.f1.e1 <Return> {set data $userdata} focus $w.top.f1.e1 button $w.top.f1.b1 -text Browse -bg gray80 -command { feedback_sit "Open input file" set userdata [tk_getOpenFile -initialdir $starfzdir] feedback_sit "" } pack $w.top.f1.l1 -side left pack $w.top.f1.b1 -side left pack $w.top.f1.e1 -side right foreach i {f2 f3 f4 f5} { frame $w.top.$i -bd 2 entry $w.top.$i.entry -relief sunken -width 40 -textvariable u$i label $w.top.$i.label pack $w.top.$i.entry -side right pack $w.top.$i.label -side left } $w.top.f2.label config -text "# of events to proceed:" $w.top.f3.label config -text "# of events to noise:" $w.top.f4.label config -text "# of events to pedestals:" $w.top.f5.label config -text "# of CPU time to run (sec):" message $w.top.msg -aspect 1000 -justify center -bg gray85 \ -text "Please specify the variable below" frame $w.top.final -bd 2 button $w.top.final.quit -text Quit -bg gray80 -command "destroy $w" button $w.top.final.ok -text Ok -bg gray80 -command { set user_e ""; set user_n ""; set user_p ""; set usertime 1000; if {$uf2 != 0 && $uf2 != ""} {set user_e "-e $uf2"} if {$uf3 != 0 && $uf3 != ""} {set user_n "-n $uf3"} if {$uf4 != 0 && $uf4 != ""} {set user_p "-p $uf4"} if {$uf5 != 0 && $uf5 != ""} {set usertime $uf5} set usertime 1000 set userflags "-i $userdata $user_e $user_n $user_p" feedback_sit "Running qsub, please wait" set prog [file join [file join $workdir star] OSF1] set prog [file join $prog simaindev.exe] set fileq [file join $userdir job.nqs] if [file exist $fileq] {eval exec "/bin/rm -f $fileq"} eval exec "touch $fileq" set str {$prog $FLAGS >& job.out} if [catch {open $fileq w} fileId] { puts stdout "Cannot open file $fileq: $fileId" } else { puts $fileId "# NQS job" puts $fileId "# @$ -lt $usertime" puts $fileId "# @$ -me" puts $fileId "# @$" puts $fileId "setenv STARSRC $workdir/star" puts $fileId "setenv DATA $userdata" puts $fileId "setenv FLAGS '$userflags'" puts $fileId "setenv prog $prog" puts $fileId "cd $userdir" puts $fileId "/bin/rm -rf job.out" puts $fileId $str puts $fileId exit } close $fileId eval exec "chmod a+x $fileq" cd $userdir if {$usertime < 1000} { eval exec "/usr/local/bin/qsub job.nqs" } else { eval exec "/usr/local/bin/qsub -q cpqL job.nqs" } feedback_sit "" } pack $w.top.msg -side top pack $w.top.f1 $w.top.f2 $w.top.f3 $w.top.f4 $w.top.f5 -side top -fill x pack $w.top.final.ok -ipadx 7 -padx 60 -side left pack $w.top.final.quit -padx 60 -side right pack $w.top.final -side top } #### The stagein command proc StageTape { } { global font100 userdir workdir set w .stagemanager createWindow $w "Stage Manager" foreach i {f1 f2 f3} { frame $w.top.$i -bd 2 entry $w.top.$i.entry -relief sunken -width 40 -textvariable u$i label $w.top.$i.label pack $w.top.$i.entry -side right pack $w.top.$i.label -side left } $w.top.f1.label config -text "Tape name:" $w.top.f2.label config -text "Data size:" $w.top.f3.label config -text "Link name:" message $w.top.msg -aspect 1000 -justify center -bg gray85 \ -text "Please specify the variable below" frame $w.top.final -bd 2 button $w.top.final.quit -text Quit -bg gray80 -command "destroy $w" button $w.top.final.ok -text Ok -bg gray80 -command { set stage "-V $uf1 -q 9 -l sl -F F -L 28800 \ -s $uf2 $uf3 &" feedback_sit "Running stagein, please wait" cd $userdir eval exec "/usr/local/bin/stagein $stage" feedback_sit "" } pack $w.top.msg -side top pack $w.top.f1 $w.top.f2 $w.top.f3 -side top -fill x pack $w.top.final.ok -ipadx 7 -padx 60 -side left pack $w.top.final.quit -padx 60 -side right pack $w.top.final -side top } #### Set environment variables proc SetEnvironment { dir } { global env set env(STARSRC) $dir/star set env(USERSRCDIR) $dir set env(USERLIBDIR) $dir/lib } #### Run the program and arrange to read its input proc Run { command {font $font100} } { global input font100 run_command set run_command $command if [catch {open "|$command |& cat"} input] { displayWindow $command $font100 } else { fileevent $input readable Log displayWindow "" $font100 } } #### Read and log output from the program to displayWindow proc Log {} { global input log if [eof $input] { feedback_sit "Running" catch {close $input} feedback_sit "" } else { feedback_sit "Running" gets $input line $log insert end $line\n $log see end # $text_global insert end $line\n # $text_global see end # Text_Dump $log stdout # puts $line feedback_sit "" } } #### Printing environment variable values proc printenv { args } { global env set maxl 0 if {[llength $args] == 0} { set args [lsort [array names env]] } foreach x $args { if {[string length $x] > $maxl} { set maxl [string length $x] } } incr maxl 2 foreach x $args { puts stdout [format "%*s = %s" $maxl $x $env($x)] } } proc feedback_sit { message } { ####################################################################### # This code is adapted from the text "Practical Programming in # Tcl and Tk", by Brent B. Welch (see page 440) ####################################################################### global feedback set e $feedback(sit) $e config -state normal $e delete 0 end $e insert 0 $message # Leave the entry in a read-only state $e config -state disabled # Force a disable update update idletasks } #### Mail program proc MailManager { } { global stargraph starbatch file env workdir userdir t set w .mailmanager createWindow $w "Mail Manager" cd $userdir frame $w.top.t pack $w.top.t -side top -fill both -expand true message $w.top.t.m -aspect 500 -justify center \ -text "Print your bug and touch Send" pack $w.top.t.m -side top -fill x set t [text $w.top.t.t -setgrid true -wrap word -width 42 -height 14 \ -yscrollcommand "$w.top.t.sy set"] scrollbar $w.top.t.sy -orient vert -command "$w.top.t yview" pack $w.top.t.sy -side right -fill y pack $w.top.t.t -side left -fill both -expand true button $w.top.quit -bg gray85 -text Quit -command "destroy $w" button $w.top.send -bg gray85 -text Send -command { if [file exists "$workdir/mail.bug"] { eval exec "/bin/rm -f $workdir/mail.bug" } else { eval exec "touch $workdir/env.csh" } if [catch {open $workdir/mail.bug w} fileId] { puts stdout "Cannot open file $workdir/mail.bug: $fileId" } else { set d [exec date] puts $fileId $d puts $fileId " " Text_Dump $t $fileId close $fileId } eval exec "mail Valentin.Kouznetsov@cern.ch < mail.bug" eval exec "/bin/rm -f $workdir/mail.bug" } pack $w.top.quit -side right pack $w.top.send -side left } ####################################################################### #### This code is adapted from the text "Practical Programming in #### Tcl and Tk", by Brent B. Welch second edition(see page 384) #### Author: Valentin E. Kuznetsov, NOMAD-STAR, Sep. 21, 1997 ####################################################################### #### Dump of the text t to channel (may be stdout, stderr, fileId etc.) proc Text_Dump {t channel {start 1.0} {end end}} { foreach {key value index} [$t dump $start $end] { if {$key == "text"} { puts $channel $value } } }