From 1bc30bff86b085525afdc7c4ba894739d120e876 Mon Sep 17 00:00:00 2001 From: hummypkg Date: Fri, 29 Apr 2016 19:26:07 +0000 Subject: [PATCH] 2.0.17 - recurse rules --- CONTROL/control | 2 +- webif/plugin/sweeper/action.js | 10 -- webif/plugin/sweeper/auto.hook | 188 ++++++++++++++++------------ webif/plugin/sweeper/edit.jim | 25 ++-- webif/plugin/sweeper/rules_json.jim | 15 ++- webif/plugin/sweeper/script.js | 91 ++++++++++++-- 6 files changed, 218 insertions(+), 113 deletions(-) diff --git a/CONTROL/control b/CONTROL/control index 2058b92..b726daa 100644 --- a/CONTROL/control +++ b/CONTROL/control @@ -1,7 +1,7 @@ Package: sweeper Priority: optional Section: misc -Version: 2.0.16 +Version: 2.0.17 Architecture: mipsel Maintainer: af123@hummypkg.org.uk Depends: webif(>=1.2.5-10) diff --git a/webif/plugin/sweeper/action.js b/webif/plugin/sweeper/action.js index 2ab6d97..53f01c2 100644 --- a/webif/plugin/sweeper/action.js +++ b/webif/plugin/sweeper/action.js @@ -1,7 +1,6 @@ var select_file_criteria = {}; var select_folder_criteria = {}; -var select_global_criteria = {}; $.each(schema.criterion, function(k, v) { if (v.deprecated) return; @@ -13,20 +12,15 @@ $.each(schema.criterion, function(k, v) { case 'folder': select_folder_criteria[k] = v.desc; break; - case 'global': - select_global_criteria[k] = v.desc; - break; case 'all': select_file_criteria[k] = v.desc; select_folder_criteria[k] = v.desc; - select_global_criteria[k] = v.desc; break; } }); var select_file_actions = {}; var select_folder_actions = {}; -var select_global_actions = {}; $.each(schema.action, function(k, v) { if (v.deprecated) return; @@ -38,13 +32,9 @@ $.each(schema.action, function(k, v) { case 'folder': select_folder_actions[k] = v.desc; break; - case 'global': - select_global_actions[k] = v.desc; - break; case 'all': select_file_actions[k] = v.desc; select_folder_actions[k] = v.desc; - select_global_actions[k] = v.desc; break; } }); diff --git a/webif/plugin/sweeper/auto.hook b/webif/plugin/sweeper/auto.hook index 1930e37..455cfd0 100644 --- a/webif/plugin/sweeper/auto.hook +++ b/webif/plugin/sweeper/auto.hook @@ -3,6 +3,7 @@ set ::sweeper::cf "/mod/etc/sweeper.conf" set ::sweeper::dryrun 0 set ::sweeper::lastruleresult 0 set ::sweeper::stack {} +set ::sweeper::dustbin [system dustbin 1] proc ::sweeper::unknown {cmd args} { log "Unknown sweeper rule clause '$cmd'" 0 @@ -12,6 +13,12 @@ proc ::sweeper::unknown {cmd args} { ###################################################################### # Utility functions +proc ::sweeper::skipdir {e} { + if {[string match {\[*} [string trimleft $e]]} { return 1 } + if {$e eq $::sweeper::dustbin} { return 1 } + return 0 +} + # Perform an integer comparison. proc ::sweeper::intcomp {ref val} { lassign $val op num @@ -326,12 +333,10 @@ proc ::sweeper::moveset {ts dst {op rename}} { # Search for a folder with name 'target' under 'root', skipping 'orig' proc ::sweeper::find {root target orig} { - set dustbin [system dustbin 1] foreach e [readdir -nocomplain $root] { regsub -all -- {//} "$root/$e" "/" entry if {![file isdirectory $entry]} continue - if {[string match {\[*} [string trimleft $e]]} continue - if {$e eq $dustbin} continue + if {[::sweeper::skipdir $e]} continue if {$entry eq $orig} continue if {$e eq $target} { return $entry } @@ -920,79 +925,15 @@ proc ::sweeper::runrule {ts rule folder} { return 0 } -proc ::sweeper::apply {dir cf} { - if {[catch {set fp [open $cf r]} msg]} { - log "Error opening sweeper ruleset ($cf), $msg" 0 - return - } - - set ::sweeper::recalc {} - - set rules [split [read $fp] "\n"] - $fp close - - set runfolder 0 - set nrules 0 - foreach rule $rules { - switch -- [lindex $rule 0] { - folder - - global { incr runfolder } - } - if {[string index $rule 0] ne "#" && [llength $rule] > 1} { - incr nrules - } - } - - if {!$nrules} return +proc ::sweeper::apply_folder_rules {dir rules} { log "" 2 - log "--- SWEEP SCAN STARTING FOR $dir ($nrules) ---" 2 + log " -- FOLDER RULES --" 2 log "" 2 - foreach e [readdir -nocomplain $dir] { - set entry "$dir/$e" - if {[file isdirectory $entry]} continue - if {![string match {*.ts} $entry]} continue - - log "+ Sweeper processing $entry" 2 - - if {[catch {set ts [ts fetch $entry]} msg]} { - log "Error reading TS file, $msg" 0 - continue - } - - if {$ts == "0"} { - log "Invalid TS file." 2 - continue - } - - if {[$ts inuse]} { - log "Recording in use." 2 - continue - } - - set ::sweeper::stack {} - foreach rule $rules { - if {[string index $rule 0] eq "#" || - [llength $rule] < 2} continue - switch -- [lindex $rule 0] { - folder continue - global { set rule [lrange $rule 1 end] } - } - if {[::sweeper::runrule $ts $rule 0]} break - } - } - - if {$runfolder > 0} { - log "" 2 - log " -- FOLDER RULES --" 2 - log "" 2 - set dustbin [system dustbin 1] - foreach e [readdir -nocomplain $dir] { set entry "$dir/$e" if {![file isdirectory $entry]} continue - if {[string match {\[*} [string trimleft $e]]} continue - if {$e eq $dustbin} continue + if {[::sweeper::skipdir $e]} continue log "" 2 log "==== folder $entry ====" 2 @@ -1005,10 +946,10 @@ proc ::sweeper::apply {dir cf} { set ts 0 foreach de [lsort -command [lambda {a b} { - upvar entry e - return $([file mtime "$e/$b"] - [file mtime "$e/$a"]) - }] [lsearch -glob -all -inline \ - [readdir -nocomplain $entry] {*.ts}]] { + upvar entry e + return $([file mtime "$e/$b"] - [file mtime "$e/$a"]) + }] [lsearch -glob -all -inline \ + [readdir -nocomplain $entry] {*.ts}]] { set dentry "$entry/$de" log " --- Considering $dentry" 2 @@ -1038,17 +979,100 @@ proc ::sweeper::apply {dir cf} { set ::sweeper::stack {} foreach rule $rules { - if {[string index $rule 0] eq "#" || - [llength $rule] < 3} continue - switch -- [lindex $rule 0] { - folder - - global { set rule [lrange $rule 1 end] } - default continue - } + if {[llength $rule] < 1} continue if {[::sweeper::runrule $ts $rule 1]} break } + } +} - } +proc ::sweeper::apply_rules {dir rules {depth 0}} { + + log "" 2 + log "--- SWEEP($depth) STARTING FOR $dir ---" 2 + log "" 2 + + if {$depth > 20} { + log "ERROR: Maximum recursion depth exceeded." 0 + return + } + + set moredepth 0 + set dirs {} + foreach e [readdir -nocomplain $dir] { + set entry "$dir/$e" + if {[file isdirectory $entry]} { + if {![::sweeper::skipdir $e] && + ![file exists "$entry/.nosweep"]} { + lappend dirs $entry + } + continue + } + if {![string match {*.ts} $entry]} continue + + log "+ Sweeper processing $entry" 2 + + if {[catch {set ts [ts fetch $entry]} msg]} { + log "Error reading TS file, $msg" 0 + continue + } + + if {$ts == "0"} { + log "Invalid TS file." 2 + continue + } + + if {[$ts inuse]} { + log "Recording in use." 2 + continue + } + + set ::sweeper::stack {} + foreach rule $rules { + if {[llength $rule] < 3} continue + set rule [lassign $rule level] + if {$level < $depth} continue + if {$level > $depth} { incr moredepth } + if {[::sweeper::runrule $ts $rule 0]} break + } + } + + # No rules require greater recursion + if {!$moredepth} return + + foreach dir $dirs { + ::sweeper::apply_rules $dir $rules $($depth + 1) + } +} + +proc ::sweeper::apply {dir cf} { + if {[catch {set fp [open $cf r]} msg]} { + log "Error opening sweeper ruleset ($cf), $msg" 0 + return + } + + set ::sweeper::recalc {} + + set _rules [split [read $fp] "\n"] + $fp close + + set rules {} + set folder_rules {} + foreach rule $_rules { + if {[string index $rule 0] eq "#"} continue + switch -- [lindex $rule 0] { + folder { lappend folder_rules [lrange $rule 1 end] } + global { lset rule 0 1; lappend rules $rule } + recurse { lappend rules [lrange $rule 1 end] } + default { lappend rules [linsert $rule 0 0] } + } + } + + if {[llength $rules]} { + ::sweeper::apply_rules $dir $rules + } + + if {[llength $folder_rules]} { + ::sweeper::apply_folder_rules $dir $folder_rules } foreach dir $::sweeper::recalc { diff --git a/webif/plugin/sweeper/edit.jim b/webif/plugin/sweeper/edit.jim index 0b1c077..f8c9096 100755 --- a/webif/plugin/sweeper/edit.jim +++ b/webif/plugin/sweeper/edit.jim @@ -58,10 +58,10 @@ Add pre-defined ruleset:
-