212 lines
6.0 KiB
Tcl
212 lines
6.0 KiB
Tcl
#----------------------------------------------------------------------------
|
|
# This is part of the WWW-interface to SICS. This interface allows to
|
|
# create batch files to be run automatically by SICS. These files are
|
|
# stored in a special directory as files with the ending .sip by the
|
|
# CGI-scripts or servlets creating them. Now, a system is needed which
|
|
# checks this directory regularly for new files and executes them in SICS.
|
|
# This is the purpose of the SICS-Tcl macros defined in this file.
|
|
#
|
|
# First edition: Mark Koennecke, December 1999
|
|
#----------------------------------------------------------------------------
|
|
|
|
#----------- !!!! the path where the automatic files reside
|
|
set autofpath "/data/koenneck/tmp/auto"
|
|
|
|
#------- a variable which defines if we should operate and the current file.
|
|
set __autofile_run 0
|
|
set __auto_exe_file ""
|
|
|
|
#!!!!!!!!!!!!!! WARNING !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
# There is a name command between the Tcl internal scan command and the
|
|
# SICS scan command. The Tcl internal has to be renamed. The following
|
|
# variable defines the name of the Tcl scan command
|
|
set tclscan stscan
|
|
|
|
#---------- do initializing things when called first time
|
|
set ret [catch [catch {autofile} msg]
|
|
if {$ret != 0} {
|
|
VarMake autofilepath Text Mugger
|
|
autofilepath $autofpath
|
|
autofilepath lock
|
|
Publish autofileexecute User
|
|
Publish autofile Mugger
|
|
Publish autostart User
|
|
Publish autoadd User
|
|
Publish autoend User
|
|
#------- for automatic file name creation
|
|
catch {MakeDataNumber autonumber $autofpath/autonumber.dat}
|
|
#------- check any 30 seconds
|
|
sicscron 30 autofileexecute
|
|
}
|
|
|
|
#--------------------------------------------------------------------------
|
|
proc autofile { {action null} } {
|
|
upvar #0 __autofile_run ar
|
|
|
|
if { [string compare $action start] == 0} {
|
|
set ar 1
|
|
return OK
|
|
} elseif { [string compare $action stop] == 0 } {
|
|
set ar 0
|
|
return OK
|
|
} else {
|
|
if {$ar == 1} {
|
|
return on
|
|
} else {
|
|
return off
|
|
}
|
|
}
|
|
}
|
|
|
|
#--------------------------------------------------------------------------
|
|
proc autofileexecute { } {
|
|
upvar #0 __autofile_run ar
|
|
upvar #0 __auto_exe_file aef
|
|
upvar #0 tclscan filescan
|
|
#--------- no operation if not activated
|
|
if {$ar != 1} {
|
|
return
|
|
}
|
|
#--------- aquire a list of candidate batch files
|
|
set tmp [autofilepath]
|
|
set ltmp [split $tmp =]
|
|
set tmp [lindex $ltmp 1]
|
|
set tmp2 [string trim $tmp]/*.inp
|
|
set ret [catch {set filelist [glob $tmp2]} msg]
|
|
if {$ret != 0} {
|
|
return "Nothing to do"
|
|
}
|
|
if { [llength $filelist] < 1 } {
|
|
return "Nothing to do"
|
|
}
|
|
#--------- now, in each file the second line contains the order number,
|
|
# find the lowest one which is the next one to execute
|
|
set minnum 999999
|
|
set file2exe null
|
|
foreach fil $filelist {
|
|
set f [open $fil r]
|
|
gets $f
|
|
set numline [gets $f]
|
|
set ret [catch {$filescan $numline "# %d" numi} msg]
|
|
close $f
|
|
if { $ret == 0 } {
|
|
if { $numi < $minnum } {
|
|
set minnum $numi
|
|
set file2exe $fil
|
|
}
|
|
} else {
|
|
ClientPut $msg
|
|
}
|
|
}
|
|
#------------ having found an input file, execute it
|
|
if { [string compare $file2exe null] != 0 } {
|
|
set aef $file2exe
|
|
set ret [catch {interneval $file2exe} msg]
|
|
#------ after execution rename it with a different extension
|
|
set fil2 [file rootname $file2exe].old
|
|
file rename -force $file2exe $fil2
|
|
if {$ret != 0 } {
|
|
error $msg
|
|
} else {
|
|
return $msg
|
|
}
|
|
}
|
|
return "Invalid autobatch files"
|
|
}
|
|
|
|
#=========================================================================
|
|
# File management functions
|
|
#
|
|
# autostart creates a fresh file. The data is stored in a SICS runbuffer.
|
|
# autoadd adds a line to the runbuffer
|
|
# autoend writes the file to disk then.
|
|
#=========================================================================
|
|
|
|
proc autostart {} {
|
|
catch {buf del autobuffer}
|
|
Buf new autobuffer
|
|
}
|
|
|
|
proc autoadd args {
|
|
autobuffer append $args
|
|
}
|
|
|
|
proc autoend {} {
|
|
upvar #0 autofpath ap
|
|
autonumber incr
|
|
set txt [autonumber]
|
|
set l [split $txt =]
|
|
set txt [string trim [lindex $l 1]]
|
|
set fil [format "$ap/auto%7.7d.inp" $txt]
|
|
set filnum [format "# %d" $txt]
|
|
autobuffer ins 1 $filnum
|
|
autobuffer save $fil
|
|
Buf del autobuffer
|
|
}
|
|
|
|
#============================================================================
|
|
# file list management
|
|
#============================================================================
|
|
|
|
proc buildsortedlist {filar} {
|
|
upvar #0 autofpath ap
|
|
upvar $filar list
|
|
set i 0
|
|
#----------- build arrays of all relevant files
|
|
set ret [catch {set l1 [glob $ap/*.inp]}]
|
|
if { $ret == 0 } {
|
|
foreach fil $l1 {
|
|
set list($i)
|
|
incr i
|
|
set f [open $fil r]
|
|
set $fil(title) [gets $f]
|
|
set txt [gets $f]
|
|
close $f
|
|
set ret [catch {$filescan $txt "# %d" numi} msg]
|
|
if { $ret == 0} {
|
|
set fil(no) $numi
|
|
}else {
|
|
set fil(no) -10
|
|
}
|
|
}
|
|
}
|
|
set ret [catch {set l1 [glob $ap/*.old]}]
|
|
if { $ret == 0 } {
|
|
foreach fil $l1 {
|
|
set list($i)
|
|
incr i
|
|
set f [open $fil r]
|
|
set $fil(title) [gets $f]
|
|
set txt [gets $f]
|
|
close $f
|
|
set ret [catch {$filescan $txt "# %d" numi} msg]
|
|
if { $ret == 0} {
|
|
set fil(no) $numi
|
|
}else {
|
|
set fil(no) -10
|
|
}
|
|
}
|
|
}
|
|
set nfil i
|
|
#--------- now selection sort this list
|
|
for {set i 0} { i < $nfil} {incr i} {
|
|
set min $i
|
|
set ff $list($min)
|
|
for {set j [expr $i + 1]} {$j < $nfil} {incr j} {
|
|
set ff $list($j)
|
|
set fff $list($min)
|
|
if { $ff(no) < $fff(no)} {
|
|
set min $j
|
|
}
|
|
}
|
|
set t $list($min)
|
|
set list($min) $list($min)
|
|
set list($i) $t
|
|
}
|
|
}
|
|
|
|
proc autolist {} {
|
|
|
|
}
|
|
|