if {![exists -proc class]} { package require oo } if {![exists -proc sqlite3.open]} { package require sqlite3 } class system {} proc {system model} {} { if {[catch {set fp [open /etc/model r]}]} { set model {HD[R]} } else { set model [string trim [read $fp]] close $fp } return $model } proc {system hostname} {} { if {[catch {set hostname [string trim [exec hostname]]}]} { set hostname "humax" } return $hostname } proc {system modversion} {{short 0}} { if {[catch {set fp [open /etc/modversion r]}]} { set modver "102" } else { set modver [string trim [read $fp]] close $fp } if {$short} { return $modver } lassign [split $modver ""] a b c return [format "%d.%d%d" $a $b $c] } proc {system pkgver} {{pkg webif}} { return [lrange [split [exec opkg list-installed $pkg] " "] 2 end] } proc {system pkginst} {pkg} { if {[exec opkg list-installed $pkg] ne ""} { return 1 } else { return 0 } } proc {system mediaroot} {} { switch [system model] { HDR { return "/media/My Video" } HD { return "/media/drive1/Video" } } return "" } proc {system dustbin} {{short 0}} { set dustbin "\[Deleted Items\]" if {![catch {set fd [open "/mod/boot/dustbin.name" r]}]} { set dustbin [lindex [split [read $fd] "\n"] 0] $fd close } if {$short} { return $dustbin } return "[system mediaroot]/$dustbin" } proc {system diskspace} {} { switch [system model] { HDR { set part /mnt/hd2 } HD { set part /media/drive1 } } set size 0 set used 0 set perc 0 foreach line [split [exec /mod/bin/busybox/df -h $part 2>>/dev/null] "\n\r"] { if {[string match "/*" $line]} { regsub -all -- {[[:space:]]+} $line " " line set fields [split $line] set size [lindex $fields 1] set used [lindex $fields 2] set perc [string trimright [lindex $fields 4] "%"] break } } return [list $size $used $perc] } proc {system busy} {} { # Is humaxtv doing anything important? if {[catch {set pid [exec /mod/bin/busybox/pgrep humaxtv]}]} { return 0 } set c 0 foreach line [split [exec /mod/bin/lsof -p $pid] "\n"] { if {[string match {*Video*.ts} $line]} { incr c } } if {$c > 0} { return 1 } return 0 } proc {system inuse} {file} { # Is humaxtv using the file? if {[catch {set pid [exec /mod/bin/busybox/pgrep humaxtv]}]} { return 0 } regsub -all {([\\["$])} [file rootname [file tail $file]] {\\\1} file set c 0 foreach line [split [exec /mod/bin/lsof -p $pid] "\n"] { if {[string match "*$file*" $line]} { incr c } } if {$c > 0} { return 1 } return 0 } proc {system reboot} {} { exec /etc/init.d/S90settop shut exec /sbin/reboot } proc {system restartpending} {} { close [open /tmp/.restartpending w] } proc {system padding} {} { set start 0 set stop 0 if {[catch {set db [sqlite3.open /var/lib/humaxtv/setup.db]} msg]} { return {0 0} } foreach l [$db query " select itemName, itemValue from TBL_MENUCONFIG where itemName in ('START_PADDING_TIME', 'STOP_PADDING_TIME') "] { lassign $l x name x val switch $name { "START_PADDING_TIME" { set start $val } "STOP_PADDING_TIME" { set stop $val } } } $db close return [list $start $stop] } proc {system mkdir_p} {dir} { exec /mod/bin/busybox/mkdir -p $dir } proc {system listening} {{mport 0}} { set ret {} foreach line [split [exec /mod/bin/busybox/netstat -lntpw] "\n"] { # Remove repeated spaces regsub -all -- {[[:space:]]+} $line " " line # tcp 0 0 0.0.0.0:9955 0.0.0.0:* LISTEN 169/humaxtv lassign [split $line " "] x x x port x type app if {$type ne "LISTEN"} { continue } lassign [split $port ":"] x port if {$mport && $mport != $port} { continue } lappend ret [list $port [split $app "/"]] } return $ret } proc {system is_listening} {mport} { return [llength [system listening $mport]] }