107 lines
2.6 KiB
Plaintext
107 lines
2.6 KiB
Plaintext
|
|
proc ::shrink::dequeue {q ts} {
|
|
global tsgroup
|
|
namespace import ::auto::log
|
|
|
|
set tmp $::auto::tmp
|
|
set file [$ts get file]
|
|
|
|
if {[$ts flag "Shrunk"]} {
|
|
return {"OK" "Already shrunk"}
|
|
}
|
|
|
|
if {[queue check $ts decrypt]} {
|
|
return {"DEFER" "Deferring shrink until decrypted"}
|
|
}
|
|
|
|
# If the directory is flagged for decryption as well as shrink
|
|
# then check to see if decryption has already occured. If not,
|
|
# defer the shrink for now.
|
|
set dir [file dirname $file]
|
|
if {[file exists "$dir/.autodecrypt"] ||
|
|
[::auto::autoflagscanup $dir decrypt] == 1} {
|
|
log " $dir is also set for decryption." 2
|
|
if {[$ts flag "ODEncrypted"]} {
|
|
return {"DEFER" "Deferring shrink until decrypted"}
|
|
}
|
|
}
|
|
|
|
set file [file rootname [$ts get file]]
|
|
|
|
if {[::auto::inuse $ts]} {
|
|
return {"DEFER" "Recording in use"}
|
|
}
|
|
|
|
if {[catch {
|
|
set perc [exec /mod/bin/stripts -aq $file]
|
|
} msg]} {
|
|
return [list "FAILED" $msg]
|
|
}
|
|
if {[string match {*%} $perc]} {
|
|
set perc [string range $perc 0 end-1]
|
|
} else {
|
|
set perc 0
|
|
}
|
|
|
|
if {$perc == 0} {
|
|
log " $file - already shrunk." 2
|
|
$ts set_shrunk
|
|
return {"OK" "Already shrunk"}
|
|
}
|
|
set size [$ts size]
|
|
::auto::dsc $size
|
|
system startop shrink [$ts get file]
|
|
::auto::startclock
|
|
log " SHRINK: $file" 0
|
|
log " Estimate $perc% saving." 0
|
|
log " Shrinking..." 0
|
|
if {[catch {
|
|
foreach line [split \
|
|
[system qexec nice -n 19 /mod/bin/stripts -q $file $tmp/shrunk] \
|
|
"\n"] {
|
|
set stats [string trim $line]
|
|
log $stats 0
|
|
}
|
|
} msg]} {
|
|
log "Error during shrink: $msg" 0
|
|
system notify "$file - auto-shrink - error $msg."
|
|
system endop shrink
|
|
return [list "FAILED" $msg]
|
|
}
|
|
|
|
# The following steps are structured to minimise the risk of
|
|
# things being left in an inconsistent state if the system goes
|
|
# into standby. Renames within the same filesystem are very
|
|
# quick so the risk is small, but even so...
|
|
|
|
# Move the shrunken version back to the local directory.
|
|
foreach f [glob "$tmp/shrunk.*"] {
|
|
set ext [file extension $f]
|
|
file rename -force $f "${file}_shrunk${ext}"
|
|
# Set the file time to match the old file
|
|
file touch "${file}_shrunk${ext}" [$ts get file]
|
|
}
|
|
|
|
# Remove the old recording (-> bin if undelete is installed)
|
|
if {[$::auto::settings autoskipbin]} {
|
|
$ts delete
|
|
} else {
|
|
safe_delete [$ts get file] "webif_autoshrink"
|
|
}
|
|
|
|
# Finally, rename the shrunken recording again.
|
|
foreach ext $tsgroup {
|
|
set f "${file}_shrunk.$ext"
|
|
if {[file exists $f]} {
|
|
file rename -force $f "${file}.$ext"
|
|
}
|
|
}
|
|
$ts set_shrunk
|
|
set summary [::auto::endclock $size]
|
|
system endop shrink
|
|
return [list "OK" "$summary $stats"]
|
|
}
|
|
|
|
::auto::register shrink 400
|
|
|