[Home]Self Modifying Code

 #!/bin/sh
 # the next line restarts using -*-Tcl-*-sh \
 exec tclsh "$0" ${1+"$@"}
 # This is a driver script for LDAS jobs that can self-modify,
 # adding new command strings as required without editing the
 # file
 if { $argc == 0 } {
   set fid [ open $argv0 r ]
   while { ! [ eof $fid ] } {
      gets $fid line
      if { [ regexp {^set cmd\d+\s+} $line ] } {
         puts stdout "$line\n"
      }
      if { [ regexp {^set sid \[} $line ] } { exit }
   }
 }

 if { $argc > 0 } {
   set N [ lindex $argv 0 ]
 } else {
   set N 1
 }
 if { $argc > 1 && $argc < 4 } {
   set system [ lindex $argv 1 ]
 } else {
   set system ldas-dev
 }

 if { $argc == 3 } {
   set newcmd [ lindex $argv 2 ]
 }

 set bp1 "ldasJob { -name phil -password ***** -email pehrens@ligo.caltech.edu } { "

 set bp2 " }"
 ## hand added commands go here (please comment)
 set cmd1 "getFrameElements -outputformat {ilwd ascii} -framequery { R H {} {714384016-714384019} Adc(H0:PEM-LVEA_SEISX) }"

 set cmd2 "getFrameElements -outputformat {ilwd ascii} -framequery { R H {} {714384016-714384019} Adc(H0:PEM-LVEA_SEISX) }"
 ###########################################
 # self modifiying code driver
 if { [ info exists newcmd ] } {
   if { [ info complete $newcmd ] } {
      set script $argv0
      set fid [ open $script r ]
      set old [ read $fid [ file size $script ] ]
      close $fid
      set fid [ open $script w ]
      set done 0
      set trigger "## END OF AUTO ADDED COMMANDS"
      foreach line [ split $old "\n" ] {
         regexp {\s+cmd(\d+)\s+} $line -> n
         if { ! $done && [ string equal $trigger $line ] } {
            set newcmd "set cmd[ incr n ] \"$newcmd\""
            eval $newcmd
            puts $fid "$newcmd\n"
            set done 1
         }
         puts $fid $line
      }
      close $fid
   }
 }
 ## BEGIN AUTO ADDED COMMANDS
 set cmd3 "set foo bar"
 ## END AUTO ADDED COMMANDS

 set sid [ socket $system 10001 ]

 fconfigure $sid -blocking off
 fconfigure $sid -buffering line

 if { [ info exists n ] } { set N $n }

 puts $sid $bp1[ set [ subst cmd$N ]]$bp2

 fileevent $sid readable [ list set done 1 ]
 vwait done

 puts stdout [ read $sid ] 
 close $sid
 exit

Silverlake Linux Users Group Wiki | Recent Changes | Preferences
Password required to edit | View other revisions
Last edited March 18, 2003 2:43 pm by marfik.ligo.caltech.edu (diff)
Search: