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 ip} {} { if {[catch {set fp [open /etc/hosts r]}]} { set ip "127.0.0.1" } else { set ipl [lindex [split [$fp read] "\n"] 1] regsub -- {[[:space:]].*} $ipl "" ip } return $ip } 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 fhtcpversion} {} { set file "/etc/fhtcpversion" if {![file exists $file]} { set file "/root/fhtcpversion" } if {[catch {set fp [open $file r]}]} { set ver "?.??.??" } else { set ver [string trim [read $fp]] close $fp } return $ver } 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 free 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 free [lindex $fields 3] set perc [string trimright [lindex $fields 4] "%"] set fperc $(100 - $perc) break } } return [list $size $used $perc $free $fperc] } 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 anything using the file (used to only check the Humax binary)? # 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] "\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 param} {param {type Value} {tbl MENUCONFIG}} { if {[catch {set db [sqlite3.open /var/lib/humaxtv/setup.db]} msg]} { return 0 } set val 0 set ret [$db query " select item$type from TBL_$tbl where itemName = '$param' "] if {[llength $ret] == 1} { lassign [lindex $ret 0] x val } $db close return $val } proc {system padding} {} { return [list \ [system param START_PADDING_TIME] \ [system param STOP_PADDING_TIME] \ ] } proc {system instandby} {} { return [system param LAST_STANDBY Value USERCONFIG] } 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]] }