163 lines
3.0 KiB
Plaintext
Executable File
163 lines
3.0 KiB
Plaintext
Executable File
#!/mod/bin/jimsh
|
|
|
|
package require cgi
|
|
source /mod/webif/lib/setup
|
|
require system.class
|
|
|
|
set dir [cgi_get dir ""]
|
|
|
|
if {$dir eq "" && [llength $argv]} {
|
|
set dir [lindex $argv 0]
|
|
}
|
|
|
|
set root [system mediaroot]
|
|
|
|
if {$dir eq "" || $dir eq $root} {
|
|
set dir $root
|
|
set cf "/mod/etc/sweeper.conf"
|
|
} else {
|
|
set cf "$dir/.sweeper"
|
|
}
|
|
|
|
httpheader "application/json"
|
|
|
|
# Load rules
|
|
if {![file exists $cf]} {
|
|
set rules {}
|
|
} else {
|
|
if {[catch {set fp [open $cf r]} msg]} {
|
|
log "Error opening sweeper ruleset ($cf), $msg" 0
|
|
exit
|
|
}
|
|
set rules [split [$fp read] "\n"]
|
|
}
|
|
|
|
set lcomment ""
|
|
proc comment {id comment} {
|
|
set ::lcomment [string trim $comment]
|
|
}
|
|
|
|
set json ""
|
|
|
|
proc add_json {str} {
|
|
global json
|
|
|
|
append json $str
|
|
}
|
|
|
|
proc quot {str} {
|
|
return [cgi_quote_html $str]
|
|
}
|
|
|
|
set composite {and or}
|
|
|
|
proc clause {cmd arg {indent 6}} {
|
|
global lockfound composite
|
|
|
|
set istr [string repeat " " $indent]
|
|
|
|
if {[string index $cmd 0] eq "!"} {
|
|
set negate 1
|
|
set cmd [string range $cmd 1 end]
|
|
} else {
|
|
set negate 0
|
|
}
|
|
if {$cmd eq "lock"} { set lockfound $arg }
|
|
|
|
add_json "$istr{\n"
|
|
add_json "$istr \"negate\": $negate,\n"
|
|
add_json "$istr \"cmd\": \"[quot $cmd]\",\n"
|
|
add_json "$istr \"arg\": \"[quot $arg]\""
|
|
if {$cmd in $composite} {
|
|
add_json ",\n"
|
|
add_json "$istr \"criteria\": \[\n"
|
|
set c 0
|
|
while {[llength $arg] > 1} {
|
|
set arg [lassign $arg subcmd subarg]
|
|
if {$c} { add_json ",\n" }
|
|
incr c
|
|
clause $subcmd $subarg $($indent + 6)
|
|
}
|
|
add_json "\n$istr ]"
|
|
}
|
|
add_json "\n"
|
|
add_json "$istr}"
|
|
}
|
|
|
|
proc rule {id rule} {
|
|
global lcomment lockfound
|
|
|
|
set enabled 1
|
|
if {[lindex $rule 0] eq "##"} {
|
|
set enabled 0
|
|
set rule [lrange $rule 1 end]
|
|
}
|
|
|
|
if {$lcomment eq ""} { set lcomment "Unnamed rule" }
|
|
if {[lindex $rule 0] eq "folder"} {
|
|
set type "folder"
|
|
set rule [lrange $rule 1 end]
|
|
} else {
|
|
set type "file"
|
|
}
|
|
|
|
if {$id > 1} { add_json ",\n" }
|
|
add_json " {\n"
|
|
add_json " \"raw\": \"[quot $rule]\",\n"
|
|
add_json " \"name\": \"[quot $lcomment]\",\n"
|
|
add_json " \"type\": \"$type\",\n"
|
|
add_json " \"enabled\": \"$enabled\",\n"
|
|
add_json " \"criteria\": \[\n"
|
|
|
|
set lcomment ""
|
|
|
|
set c 0
|
|
set lockfound -1
|
|
while {[llength $rule] > 1} {
|
|
set rule [lassign $rule cmd arg]
|
|
if {$cmd eq "action"} break
|
|
if {$c} { add_json ",\n" }
|
|
incr c
|
|
|
|
clause $cmd $arg
|
|
}
|
|
add_json "\n"
|
|
if {$cmd ne "action"} {
|
|
if {$lockfound != -1} {
|
|
if {$lockfound == "1"} {
|
|
set arg "lock"
|
|
} else {
|
|
set arg "unlock"
|
|
}
|
|
} else {
|
|
set arg "continue"
|
|
}
|
|
}
|
|
lassign $arg cmd arg
|
|
if {$cmd eq "preserve"} { set cmd 'stop' }
|
|
add_json " ],\n"
|
|
add_json " \"action\": {\n"
|
|
add_json " \"cmd\": \"[quot $cmd]\",\n"
|
|
add_json " \"arg\": \"[quot $arg]\"\n"
|
|
add_json " }\n"
|
|
add_json " }"
|
|
}
|
|
|
|
add_json "\[\n"
|
|
set n 0
|
|
foreach rule $rules {
|
|
if {[string index $rule 0] eq "#"} {
|
|
if {[string index $rule 1] ne "#"} {
|
|
comment $n [string range $rule 1 end]
|
|
continue
|
|
}
|
|
}
|
|
if {[llength $rule] < 2} continue
|
|
incr n
|
|
rule $n $rule
|
|
}
|
|
add_json "\n]\n"
|
|
|
|
puts $json
|
|
|