--[[
LuCI - Lua Configuration Interface - smartctl support

Script by animefans_xj @ nvacg.org (af_xj@hotmail.com , xujun@smm.cn)

Licensed under the GNU GPL License, Version 3 (the "license");
you may not use this file except in compliance with the License.
you may obtain a copy of the License at

	http://www.gnu.org/licenses/gpl.txt

$Id$
]]--


module("luci.controller.smartinfo",package.seeall)

function index()
	require("luci.i18n")
	luci.i18n.loadc("smartinfo")
	if not nixio.fs.access("/etc/config/smartinfo") then
		return
	end
	
	local page = entry({"admin","nas","smartinfo"},cbi("smartinfo"),_("S.M.A.R.T Info"))
	page.i18n="smartinfo"
	page.dependent=true
	entry({"admin","nas","smartinfo","smartdetail"},call("smart_detail")).leaf = true

	entry({"admin","nas","smartinfo","status"}, call("smart_status")).leaf = true
	entry({"admin","nas","smartinfo","run"},call("run_smart")).leaf=true
	entry({"admin","nas","smartinfo","smartattr"},call("smart_attr")).leaf=true

end


function smart_status()
  local cmd = io.popen("/usr/lib/smartinfo/smart_status.sh")
  if cmd then
    local dev = { }
    while true do
      local ln = cmd:read("*l")
      if not ln then
        break
      elseif ln:match("^/%l+/%l+:%a+") then
        local name,status = ln:match("^/%l+/(%l+):(%a+)")
        local model,size
        
        if (status=="OK" or status=="Failed" or status=="Unsupported") then
          model="%s %s" % {nixio.fs.readfile("/sys/class/block/%s/device/vendor" % name), nixio.fs.readfile("/sys/class/block/%s/device/model" % name)}
          local s = tonumber((nixio.fs.readfile("/sys/class/block/%s/size" % name)))
          size = "%s MB" % {s and math.floor(s / 2048)}
        else
          model="Unavailabled"
          size="Unavailabled"
        end
        
        if name and status then
            dev[#dev+1]= {
              name = name,
              model = model,
              size  = size,
              status  = status
            }
        end
      else
      
      end
    end
  
  cmd:close()
  luci.http.prepare_content("application/json")
  luci.http.write_json(dev)
  end
end

function run_smart(dev)
  local cmd = io.popen("smartctl --attributes -d sat /dev/%s" % dev)
  if cmd then
    local report = {}
    local ln = cmd:read("*all")
    report = {
                out = ln
              }
    cmd:close()
    luci.http.prepare_content("application/json")
    luci.http.write_json(report)
  end
end

function smart_detail(dev)
  luci.template.render("smartinfo/smart_detail", {dev=dev})
end

function smart_attr(dev)
  local cmd = io.popen("smartctl --attributes -d sat /dev/%s" % dev)
  if cmd then
    local attr = { }
    while true do
      local ln = cmd:read("*l")
      if not ln then
        break
      elseif ln:match("^.*%d+%s+.+%s+.+%s+.+%s+.+%s+.+%s+.+%s+.+%s+.+%s+.+") then
        local id,attrbute,flag,value,worst,thresh,type,updated,raw = ln:match("^%s*(%d+)%s+([%a%p]+)%s+(%w+)%s+(%d+)%s+(%d+)%s+(%d+)%s+([%a%p]+)%s+(%a+)%s+[%w%p]+%s+(.+)")

        id= "%x" % id
        if not id:match("^%w%w") then
          id = "0%s" % id
        end

        attr[#attr+1]= {
            id = id:upper(),
            attrbute = attrbute,
            flag  = flag,
            value = value,
            worst = worst,
            thresh  = thresh,
            type = type,
            updated = updated,
            raw  = raw
          }
      else
      
      end
    end
  
  cmd:close()
  luci.http.prepare_content("application/json")
  luci.http.write_json(attr)
  end

end
