#! /bin/tcsh -f # # print out a label for a CD/DVD-R # # goto Setup ################################################################# Help: cat << EOF usage: $0 files.txt OR $0 /data/whatever/directory EOF exit 9 ################################################################# Setup: # preferred settings for DVD labels set dpi = 200 set fileslots = 14 set sumopts = "" set media = DVD set beamline = "" set labels = 0 set titles = "" set note = "" set slotfile = "" set dvdnum = "" set label1 = "" set label2 = "" set filesource = "" # establish temporary file location if(! -e /tmp/$USER) mkdir /tmp/$USER #rm -rf /tmp/${USER}/autolabel_temp* >& /dev/null set tempfile = /tmp/${USER}/autolabel_temp$$ rm -rf ${tempfile}* >& /dev/null #set tempfile = tempfile set pwd = `pwd`/ mkdir -p ${tempfile}labelgen # make sure we don't double-label if ( $#argv != 0) then set others = `ps -ea | awk -v us=$$ '/autolabel.com/ && $1 != us {print $1}'` if ( "$others" != "") then echo "WARNING: other labelers running at: $others" # echo killing $others # kill -9 $others endif endif set i = 0 while ( $i < $#argv ) @ i = ( $i + 1 ) @ j = ( $i + 1 ) set arg = "$argv[$i]" cd $pwd rm -f ${tempfile}.filenames >& /dev/null if("$arg" =~ *dpi) then set dpi = `echo $arg | awk '{print $1+0}'` continue endif if("$arg" == "CD") then set media = "CD" continue endif if("$arg" == "DVD") then set media = "DVD" continue endif if("$arg" == "bmp") then setenv printer "bmp file" continue endif if("$arg" =~ *.bmp) then setenv printer "bmp file" set dir = `dirname $arg` set dir = `cd $dir | pwd` set base = `basename $arg` set outfilename = ${dir}/${base} continue endif if("$arg" == "double") then set DOUBLE continue endif if("$arg" == "-title" && $#argv > $j) then if("$titles" == "") then set titles = "$argv[$j]" else set titles = ( "$titles" "$argv[$j]" ) endif @ i = ( $i + 1 ) continue endif if("$arg" == "-note" && $#argv > $j) then set note = "$argv[$j]" @ i = ( $i + 1 ) continue endif if("$arg" == "-beamline" && $#argv > $j) then set beamline = "$argv[$j]" set USER_beamline @ i = ( $i + 1 ) continue endif if("$arg" == "-serial" && $#argv > $j) then set dvdnum = "$argv[$j]" continue endif if("$arg" == "-slotfile" && $#argv > $j) then if(-e "$argv[$j]") then set slotfile = "$argv[$j]" else echo "WARNING: $argv[$j] does not exist" endif @ i = ( $i + 1 ) continue endif if("$arg" == "-nodatasets") then set sumopts = "-nodatasets" continue endif set temp = `echo $arg | awk -F "[.]" 'NF==3 && $1+0>0 && $1+0<13 && $2!~/[^0-9]/ && $3!~/[^0-9]/'` if("$temp" != "") then set beamline = "$arg" set USER_beamline @ i = ( $i + 1 ) continue endif if(-d "$arg" ) then if("$arg" !~ */) set arg = "${arg}/" find $arg -type f >! ${tempfile}.filenames set extra = `echo $arg | awk '{print length($1)}'` set filesource = "$arg" # set extra = 0 endif if(-f "$arg" ) then # list of files cat "$arg" >! ${tempfile}.filenames set filesource = "$arg" set extra = 0 endif if(! -e ${tempfile}.filenames) then continue endif if(! $?printer) then # try to use the cheap printer setenv printer hp1200 # fail over to the networked printer grep hp1200 /etc/printcap >& /dev/null if($status) setenv printer hp2100tn endif echo "preparing label for $printer" # this is going to be a label @ labels = ( $labels + 1 ) if("$beamline" == "") then # default to beamline this computer belongs to setenv beamline `beamline.com` if($status) then echo "ERROR: $beamline" endif endif if("$beamline" == "") set beamline = 831 set beamline = `echo $beamline | awk '{l=length($1); print substr($1,1,l-2)"."substr($1,l-1,1)"."substr($1,l,1)}'` echo "using beamline: $beamline" # sort filenames chronologicaly cat ${tempfile}.filenames |\ awk '{print "puts \"[file mtime", $1 "] "$1"\""}' |\ tclsh |&\ sort -n |\ awk -v extra=$extra '{$NF=substr($NF,extra+1); print}' |\ tee ${tempfile}.dated |\ awk '{print $NF}' >! ${tempfile}.sorted egrep "^could not read" ${tempfile}.dated >& /dev/null if(! $status) then # couldn't read the files! echo "WARNING: cannot read files in $filesource" cat $filesource |\ awk -v extra=$extra '{$NF=substr($NF,extra+1); print}' |\ tee ${tempfile}.dated |\ awk '{print $NF}' >! ${tempfile}.sorted set UNREADABLE_FILES endif if("$dvdnum" == "") then # look for this "filesystem" in the previous DVD log? set sum = `sort ${tempfile}.sorted | md5sum | awk '{print $1}'` set dvdSN = `grep $sum /data/log/dvd_filesystem_sums.log | awk -F "[_.]" '{print $2}' | sort -n` if("$dvdSN" != "") then echo "previous SN: $dvdSN" set dvdnum = `echo $dvdSN | awk '{print $1}'` endif endif if("$dvdnum" == "") then # extract some kind of descriptive number to match disk with label set dvdnum = `basename "$arg" | awk '{print substr($1,match($1,"[0-9]"))}' | awk '{print substr($1,1,match($1,"[^0-9/]")-1)}'` endif echo "using serial number: $dvdnum" # obtain default titles if ("$titles" == "") then echo "deriving default title" set titles = `titles.com ${tempfile}.sorted` endif echo "using titles: $titles" if(-e "$slotfile") then # use the user-specified file sumaries echo "using label text in $slotfile" cp $slotfile ${tempfile}.patterns else # simplify file names to $fileslots patterns echo "deriving label text from filename patterns..." sumarize.com $sumopts ${tempfile}.sorted $fileslots >! ${tempfile}.patterns endif # sumarize the dates set sdate = `head -1 ${tempfile}.dated | awk '{print "puts [clock format "$1" -format \"%a %b %d %T %Z %Y\"]"}' | tclsh |& awk '$NF+0>1900{print $2,$3+0,$NF}'` set edate = `tail -1 ${tempfile}.dated | awk '{print "puts [clock format "$1" -format \"%a %b %d %T %Z %Y\"]"}' | tclsh |& awk '$NF+0>1900{print $2,$3+0,$NF}'` # default to today if we can't get a date if($#sdate < 3) then echo "WARNING: using today as the disk date" set sdate = `date "+%b %e %Y"` endif if($#edate < 3) set edate = `date "+%b %e %Y"` set date = "$sdate" if("$sdate[2]" != "$edate[2]") set date = "$sdate[1] $sdate[2]-$edate[2] $edate[3]" if("$sdate[1]" != "$edate[1]") set date = "$sdate[1] $sdate[2] - $edate" if("$sdate[3]" != "$edate[3]") set date = "$sdate - $edate" # $date is now in a nice format # maybe change the beamline? set imgfile = `egrep '_[0-9][0-9][0-9][.]img$' ${tempfile}.filenames | head -1` if ( -e "$imgfile" && ! $?USER_beamline ) then if ("$imgfile" =~ /821*) set beamline = "8.2.1" if ("$imgfile" =~ /822*) set beamline = "8.2.2" if ("$imgfile" =~ /831*) set beamline = "8.3.1" if ("$imgfile" =~ /501*) set beamline = "5.0.1" if ("$imgfile" =~ /502*) set beamline = "5.0.2" if ("$imgfile" =~ /503*) set beamline = "5.0.3" if ("$imgfile" =~ /1231*) set beamline = "12.3.1" endif if ( -e "$imgfile" && ! $?USER_beamline && ! $?UNREADABLE_FILES ) then set safehead = `od -cv $imgfile | awk '{for(i=2;i<=NF;++i) print $i}' | awk '/\\n/{++n;c=0} {++c} c>1000{exit} END{print n+0}'` set SN = `head -$safehead $imgfile | awk -F "[=]" '/DETECTOR_SN/{print $2+0}'` if("$SN" == 907) set beamline = 12.3.1 if("$SN" == 442) set beamline = 8.3.1 if("$SN" == 401) set beamline = 5.0.2 if("$SN" == 445) set beamline = 8.2.1 if("$SN" == 905) set beamline = 8.2.2 if("$SN" == 402) set beamline = 5.0.1 if("$SN" == 447) set beamline = 5.0.2 if("$SN" == 423) set beamline = 5.0.3 endif rm -f ${tempfile}.sorted >& /dev/null rm -f ${tempfile}.dated >& /dev/null rm -f ${tempfile}.filenames >& /dev/null # generate the graphics cd ${tempfile}labelgen makelabel.com ${dpi}dpi $beamline $media datestamp.com label.miff $date if($#titles <= 1) then titlestamp.com label.miff "$titles" else titlestamp.com label.miff "$titles[1]" "$titles[2]" endif filestamp.com label.miff ${tempfile}.patterns midstamp.com label.miff $dvdnum textstamp.com label.miff -label "$note SN: $dvdnum" -pos 3.75,2.75 -maxwidth 1.5 -pointsize 10 rm -f ${tempfile}.patterns >& /dev/null set titles = "" if("$label1" == "") then mv label.miff label1.miff set label1 = label1.miff else mv label.miff label2.miff set label2 = label2.miff endif if("$printer" == "bmp file") then set suffix = $dvdnum if("$suffix" == "") set suffix = $titles[1] convert $label1 label.bmp set label1 = "" # now... what to do with the output file? unset SAVED if ($?outfilename) then mkdir -p `dirname $outfilename` mv label.bmp $outfilename >& /dev/null if(! $status) then set SAVED echo "$outfilename is ready" endif else foreach dir ( $pwd ~/ /tmp/${USER}/ /tmp/ ) mv label.bmp $dir >& /dev/null if(! $status) then set SAVED echo "${dir}label.bmp is ready" break endif end endif # uh oh... if(! $?SAVED) then echo "ERROR: unable to save output file" pwd ls -l echo "$outfilename" endif continue endif if(($labels % 2 == 0)||($?DOUBLE)) then meritline.com $label1 $label2 lp -d $printer meritline.ps # rm -f meritline.gif $label1 $label2 set printing = 1 while ($printing) sleep 10 lpstat -t $printer | grep "no printable jobs in queue" if(! $status) set printing = 0 end set label1 = "" set label2 = "" endif end if("$label1" == "") goto exit if("$printer" == "bmp file") then convert $label1 label.bmp echo "label.bmp is ready" exit endif # finally, print out last labels meritline.com $label1 $label2 lp -d $printer meritline.ps #rm -f meritline.gif $label1 $label2 set printing = 1 while ($printing) sleep 10 lpstat -t $printer | grep "no printable jobs in queue" if(! $status) set printing = 0 end exit: cd $pwd rm -rf ${tempfile}* >& /dev/null