webif/webif/lib/auto/util.jim

165 lines
3.6 KiB
Plaintext

set ::auto::logfile "/mod/tmp/auto.log"
set ::auto::logfd "unset"
set ::auto::logprefix ""
set ::auto::loglevel 1
proc ::auto::loginit {} {
# Rotate log file if large enough.
if {[file exists $::auto::logfile] &&
[file size $::auto::logfile] > 2097152} {
file copy -force $::auto::logfile "/mod/tmp/auto_old.log"
file delete $::auto::logfile
}
# Open log file
if {$::auto::logfd eq "unset"} {
set ::auto::logfd [open "/mod/tmp/auto.log" "a+"]
}
}
proc ::auto::log {msg {level 1}} {
variable loglevel
if {$level > $loglevel} return
variable logfd
variable logprefix
puts $logfd "[system logtimestamp] - $logprefix$msg"
flush $logfd
}
proc ::auto::tmpdir {dir} {
set ::auto::tmp "/mod/tmp/$dir"
if {![file exists $::auto::tmp]} {
if {[catch {file mkdir $::auto::tmp} msg]} {
log "Cannot create temporary directory -"\
" $::auto::tmp ($msg)" 0
exit
}
} elseif {![file isdirectory $::auto::tmp]} {
log "Cannot create temporary directory -"\
" $::auto::tmp (file exists)" 0
exit
}
# Clean-up the temporary directory
foreach file [readdir -nocomplain $::auto::tmp] {
file tdelete "$::auto::tmp/$file"
}
}
proc ::auto::oktorun {} {
variable settings
set now [clock seconds]
# Ongoing scheduled recording
if {[$settings noautorec]} {
# Use redring helper files if available.
set recs [glob -nocomplain /tmp/.rec*]
set events [rsv list tbl_reservation \
" where ersvtype = 3
and nsttime - ulPreOffset <= $now
and nsttime + nduration + ulPostOffset >= $now "]
if {[llength $recs] || [llength $events]} {
log "Aborted, recording in progress." 2
exit
}
}
# Imminent recording
if {[$settings noautorecimm]} {
set autorecperiod $([$settings autorecperiod] * 60)
set events [rsv list tbl_reservation \
" where ersvtype = 3
and nsttime - $now < $autorecperiod
and nsttime > $now "]
if {[llength $events]} {
set event [lindex $events 0]
log [concat \
"Aborted, will record '[$event name]' " \
"on [$event channel_name] at " \
"[clock format [$event get nsttime] -format {%H:%M}]" \
] 2
exit
}
}
# Non-running hours
set hour $([clock format [clock seconds] -format %H] + 0)
if {$hour in [$settings noautohours]} {
log "Aborted, not running during hour $hour" 2
exit
}
}
proc ::auto::dsc {{size 0}} {
set free [system diskfree]
# Required disk space is 1GiB + 3 times the file size.
set req $($size * 3 + 1073741824)
if {$free < $req} {
log "Insufficient disk space. Require=$req, Free=$free" 0
exit
}
}
proc ::auto::inuse {ts} {
set retries 5
while {$retries > 0 && [$ts inuse]} {
log "inuse($retries) - [$ts get file]"
incr retries -1
sleep 1
}
return [$ts inuse]
}
proc ::auto::specialdir {dir} {
if {[string match {\[*} [string trimleft [file tail $dir]]]} {
return 1
}
return 0
}
proc ::auto::elapsed {start} {
return $(([clock milliseconds] - $start) / 1000.0)
}
proc ::auto::startclock {} {
set ::startclock_s [clock milliseconds]
}
proc ::auto::endclock {size} {
set el [elapsed $::startclock_s]
set rate $($size / $el)
return "[pretty_size $size] in $el seconds - [pretty_size $rate]/s"
}
proc ::auto::autoflagscanup {dir flag} {
variable root
set rl [string length $root]
while {[string length $dir] >= $rl} {
if {[specialdir $dir]} {
return -1
}
if {[file exists "$dir/.auto${flag}r"]} {
log "scanup: Found ${flag}r ($dir)" 2
return 1
}
set dir [file dirname $dir]
}
return 0
}
proc ::auto::date {{s 0}} {
if {!$s} { set s [clock seconds] }
return [clock format $s -format "%d/%m/%Y %H:%M:%S"]
}