#!/bin/sh
# \
    exec oagtclsh "$0" "$@"

#
# $Log: not supported by cvs2svn $
# Revision 1.2  2008/01/17 16:45:30  soliday
# Updated by putting setfacl command inside of catch statement.
#
# Revision 1.1  2007/04/02 15:02:33  shang
# first verion, for removing expired OC, RTFB and RF configs.
#

set auto_path [linsert $auto_path 0 /usr/local/oag/apps/lib/$env(HOST_ARCH)]
set auto_path [linsert $auto_path 0 /usr/local/oag/lib_patch/$env(HOST_ARCH)]
#APSDebugPath

proc RemoveExpiredConfigs {args} {
    set dataDir "" 
    set type ""
    set deleteYear ""
    set test 1
    APSParseArguments {dataDir type deleteYear test}
    
    cd $dataDir
    if [file exist obselete] {
        if {[catch {exec rm -r obselete} results]} {
	    return
	}
    }
    if ![file exist obsolete] {
        if {[catch {exec mkdir obsolete} results]} {
	    return
	}
        #catch {exec setfacl -m mask:rwx obsolete}
    }
    set time [clock seconds]
    set hours [expr 3600 * 24]
    set tmpRoot /tmp/[APSTmpString]
    foreach plane {h v} {
        set ${plane}changed 0
        if {$type=="rfOrbitControllaw" && $plane=="v"} {
            continue
        }
        if [catch {APSUpdateConfigDescriptionDatabase -dataDir $dataDir -plane $plane -update 1} result] {
            puts $result
            continue
        }
        if ![file exist ${plane}configDesc.sdds] {
            continue
        }
        set time [clock seconds]
        set seconds [expr 24*3600]
         
        APSAddToTempFileList $tmpRoot.$plane.link
        if [catch {exec sddsprocess ${plane}configDesc.sdds $tmpRoot.$plane.link -filter=col,IsLink,1,1 \
                       -edit=col,LinkName,Description,Z>1d -nowarnings} result] {
            return -code error $result
        }
        APSAddToTempFileList $tmpRoot.$plane.nameconfig
        if [catch {exec sddsprocess ${plane}configDesc.sdds -pipe=out -filter=col,KeepDays,-1,0,! \
                       -filter=col,IsLink,0,0 \
                       -match=col,Filename=${plane}.????-????.??,! \
                       -nowarnings \
                       "-define=col,liveDays,$time CreationTime - $seconds /,type=long" \
                       | sddsprocess -pipe=in "-test=col,liveDays KeepDays >" \
                       $tmpRoot.$plane.nameconfig -nowarnings} result] {
            return -code error $result
        }
        set rows [exec sdds2stream -rows=bar $tmpRoot.$plane.nameconfig] 
        if $rows {
            set expiredConfigs [exec sdds2stream -col=Filename $tmpRoot.$plane.nameconfig]
            if !$test {
                catch {exec echo "Following $type configs expired: [join $expiredConfigs]\nPlease move them to obsolete." \
                           | mailx -s "$dataDir/$config has expired." -c schroeder@aps.anl.gov emery@aps.anl.gov} result
            }
        }
        set links [exec sdds2stream -rows=bar $tmpRoot.$plane.link]
        APSAddToTempFileList $tmpRoot.$plane.1
        if $links {
            if [catch {exec sddsprocess ${plane}configDesc.sdds -nowarnings -pipe=out \
                           -match=col,Filename=${plane}.\[0-9\]\[0-9\]\[0-9\]\[0-9\]-????.?? \
                           -scan=col,CreateYear,Filename,${plane}.%ld,type=long \
                           "-define=col,liveDays,$time CreationTime - $seconds /,type=long" \
                           | sddsselect -pipe=in $tmpRoot.$plane.link  $tmpRoot.$plane.1 \
                           -match=Filename -invert} result] {
                return -code error $result
            }
        } else {
            if [catch {exec sddsprocess ${plane}configDesc.sdds -nowarnings $tmpRoot.$plane.1 \
                           -match=col,Filename=${plane}.\[0-9\]\[0-9\]\[0-9\]\[0-9\]-????.?? \
                           -scan=col,CreateYear,Filename,${plane}.%ld,type=long \
                           "-define=col,liveDays,$time CreationTime - $seconds /,type=long"} result] {
                return -code error $result
            }
        }
        APSAddToTempFileList $tmpRoot.$plane.oldyears $tmpRoot.$plane.expired
        if [catch {exec sddsprocess $tmpRoot.$plane.1 $tmpRoot.$plane.oldyears \
                       "-test=col,CreateYear $deleteYear < CreateYear $deleteYear == ||" -nowarnings 
            exec sddsprocess  $tmpRoot.$plane.1 $tmpRoot.$plane.expired -filter=col,KeepDays,-1,0,! \
                       "-test=col,CreateYear $deleteYear >" -nowarnings \
                       "-test=col,liveDays KeepDays >"} result] {
            return -code error $result
        }
        set rows [exec sdds2stream -rows=bar $tmpRoot.$plane.oldyears]
        if $rows {
            puts "Remove old configs (before year [expr $deleteYear+1]) ..." 
            set configs [exec sdds2stream -col=Filename $tmpRoot.$plane.oldyears]
            foreach config $configs {
                puts "move $dataDir/$config to obsolete."
                if !$test {
                    if [catch {exec mv $config obsolete/} result] {
                        puts stderr "$result"
                    } else {
                        set ${plane}changed 1
                    }
                }
            }
        }
        set rows [exec sdds2stream -rows=bar $tmpRoot.$plane.expired]
        if $rows {
            puts "Remove expired configs..." 
            set configs [exec sdds2stream -col=Filename $tmpRoot.$plane.expired]
            foreach config $configs {
                puts "move $dataDir/$config to obsolete."
                if !$test {
                    if [catch {exec mv $config obsolete/} result] {
                        puts stderr $result
                    } else {
                        set ${plane}changed 1
                    }
                }
            }
        }
    }
    
    #update the configDesc.sdds  
    if $hchanged {
        if [catch {APSUpdateConfigDescriptionDatabase -dataDir $dataDir -plane h -update 1} result] {
            puts stderr $result
        }
    }
    if $vchanged {
        if [catch {APSUpdateConfigDescriptionDatabase -dataDir $dataDir -plane v -update 1} result] {
            puts stderr $result
        }
    }
}

APSStandardSetup

set args $argv
set deleteYear 2005
set test 0
set help 0
APSParseArguments {deleteYear test help}

if $help {
    puts "removedExipredConfigs -test <1|0> -deleteYear <year> -help <0|1>\n-help 1 prints the usage information.\n-test 1 print configs that will be removing without acting\n-test 0 the expired configs will be removed\n-dleteYear the configs that were created in the given year or before will be deleted even though they are not expired."
    exit
}
set mainDir /home/helios/oagData/sr

foreach type {orbitControllaw rtfeedback rfOrbitControllaw} {
    puts "Working on $type..."
    set dataDir $mainDir/$type/lattices
    cd $dataDir
    set dirs [glob *] 
    foreach dir $dirs {
        if {[file isdirectory $dataDir/$dir] && ![string match "*default*" $dir] && ![string match "*public*" $dir]} {
            puts "working on $dataDir/$dir"
            RemoveExpiredConfigs -dataDir $dataDir/$dir -type $type -deleteYear $deleteYear -test $test
        }
    }
}

exit
