#!/mod/bin/jimsh package require cgi source /mod/webif/lib/setup require system.class settings.class header set device [system disk] set settings [settings] set smart Unknown set line "" # smartctl uses non-zero exit status to indicate health hence catch. catch { set line [exec /mod/bin/smartctl -H $device | sed -n 5p] } msg if {$msg ne "" && $line eq ""} { set line $msg } if {$line ne ""} { set smart [string range [lindex [split $line :] 1] 1 end] $settings _tval_setting "SMART_status" $smart } puts "

SMART data read from device $device

Disk Information " foreach line [split [exec /mod/bin/smartctl -i $device] "\n"] { if {[string match "*Not in smartctl database*" $line]} continue if {[string match "*: *" $line]} { regsub -all -- {[[:space:]]+} $line " " line set fields [split $line ":"] puts "" puts "" } } puts {
SMART Status$smart
[lindex $fields 0][join [lrange $fields 1 end] :]
Attributes } #set flag_autokeep 0x20 #set flag_count 0x10 #set flag_rate 0x08 #set flag_speed 0x04 #set flag_online 0x02 #set flag_prefailure 0x01 set flaglist [split "POSRCK" ""] set flagdescr [list \ "P prefailure warning" \ "O updated online" \ "S speed/performance" \ "R error rate" \ "C event count" \ "K auto-keep" \ ] proc flags {val} { global flaglist flagdescr set f "" set fx "" loop i 0 [llength $flaglist] { if {[expr $val & (1 << $i)]} { append f [lindex $flaglist $i] append fx "[lindex $flagdescr $i]\n" } else { append f "-" } } return "$f" } set i 0 foreach line [split [exec /mod/bin/smartctl -A $device] "\n"] { regsub -all -- {[[:space:]]+} $line " " line regsub -all -- {^[[:space:]]+} $line "" line if {[incr i] < 8} continue lassign [split $line] \ id name flags val worst thresh type updated when rval set class normal switch $id { 5 { $settings _nval_setting "SMART_realloc" $rval if {$rval > 0} { set class orangeshade } } 197 { $settings _nval_setting "SMART_pending" $rval if {$rval > 0} { set class redshade } } 198 { $settings _nval_setting "SMART_offline" $rval if {$rval > 0} { set class redshade } } } puts "" puts " " } puts {
ID Name Flags Raw Value Value Worst Thresh Type Updated When Failed
$id $name [flags $flags] $rval $val $worst $thresh $type $updated $when
Self-test logs } if {[catch {set msg [exec /mod/bin/smartctl -l selftest $device]} xmsg]} { set msg $xmsg } set i 0 foreach line [split $msg "\n"] { regsub -all -- {[[:space:]][[:space:]]+} $line "|" line if {[incr i] < 7} continue lassign [split $line "|"] id name status remaining when lba if {[string length $id] > 10} continue puts "" } puts {
No. Description Status Remaining When First Error LBA
$id $name $status $remaining $when $lba
} footer