123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- --[[
- LuCI - Lua Configuration Interface
- Copyright 2014 Mikeqin <Fengling.Qin@gmail.com>
- Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- $Id: init.lua 6731 2011-01-14 19:44:03Z soma $
- ]]--
- module("luci.controller.avalon", package.seeall)
- function index()
- local page = node("avalon")
- page.target = firstchild()
- page.title = _("Avalon")
- page.order = 8
- page.sysauth = "root"
- page.sysauth_authenticator = "avalonauth"
- entry({"avalon"}, alias("avalon", "page", "index"), nil, 90).dependent=false
- entry({"avalon", "page", "index"}, template("page/index"), _("Dashboard"))
- entry({"avalon", "page", "passwdchange"}, cbi("passwdchange"))
- entry({"avalon", "page", "network"}, cbi("network"), _("Network"))
- entry({"avalon", "page", "configure"}, cbi("cgsetting"), _("Configuration"))
- entry({"avalon", "api", "getstatus"}, call("api_getstatus"), nil)
- entry({"avalon", "api", "getlog"}, call("api_getlog"), nil)
- entry({"avalon", "api", "logout"}, call("action_logout"), _("Logout"))
- end
- function api_getstatus()
- local status = {
- elapsed = nil,
- ghsav = nil,
- ghsmm = nil,
- temp = nil,
- fan = nil,
- voltage = nil,
- modularcnt = 0,
- network = {},
- pool = {},
- openwrtver = nil,
- systime = nil,
- }
- -- Hashrate
- local summary = luci.util.execi("/usr/bin/cgminer-api -o summary | sed \"s/|/\\n/g\" ")
- if summary then
- for line in summary do
- local elapsed, ghsav = line:match(".*," ..
- "Elapsed=(-?[%d]+)," ..
- "MHS av=(-?[%d%.]+),")
- if ghsav then
- status.elapsed = tonumber(elapsed)
- status.ghsav = ghsav and (ghsav / 1000) or 0
- end
- end
- end
- -- Modulars information
- local stats = luci.util.execi("/usr/bin/cgminer-api -o estats | sed \"s/|/\\n/g\" | grep AV4 ")
- local devdata = {}
- if stats then
- for line in stats do
- local id = line:match(".*," ..
- "ID=AV4([%d]+),")
- if id then
- local istart, iend = line:find("MM ID")
- while (istart) do
- local istr = line:sub(istart)
- local index, temp, temp0, temp1, fan, v, ghsmm =
- istr:match("MM ID(%d+)=" ..
- ".-" ..
- "Temp%[(-?%d+)%]" ..
- ".-" ..
- "Temp0%[(-?%d+)%]" ..
- ".-" ..
- "Temp1%[(-?%d+)%]" ..
- ".-" ..
- "Fan%[(-?%d+)%]" ..
- ".-" ..
- "Vol%[(-?[%.%d]+)%]" ..
- ".-" ..
- "GHSmm%[(-?[%.%d]+)%]")
- devdata[#devdata+1] = {
- temp = tonumber(temp),
- temp0 = tonumber(temp0),
- temp1 = tonumber(temp1),
- fan = tonumber(fan),
- v = tonumber(v),
- ghsmm = tonumber(ghsmm)
- }
- istart, iend = line:find("MM ID", iend + 1)
- end
- end
- end
- end
- local modularcnt = table.getn(devdata)
- if modularcnt ~= 0 then
- local temp, fan, v, ghsmm = 0, 0, 0, 0;
- status.modularcnt = modularcnt
- for i, item in ipairs(devdata) do
- if temp < tonumber(item.temp) then
- temp = tonumber(item.temp)
- end
- if temp < tonumber(item.temp0) then
- temp = tonumber(item.temp0)
- end
- if temp < tonumber(item.temp1) then
- temp = tonumber(item.temp1)
- end
- if fan < tonumber(item.fan) then
- fan = tonumber(item.fan)
- end
- if i == 1 then
- v = tonumber(item.v)
- end
- if v > tonumber(item.v) then
- v = tonumber(item.v)
- end
- ghsmm = ghsmm + item.ghsmm
- end
- status.temp = tonumber(temp)
- status.ghsmm = tonumber(ghsmm)
- status.fan = tonumber(fan)
- status.voltage = tonumber(v)
- end
- -- pool info
- local data = {}
- local pools = luci.util.execi("/usr/bin/cgminer-api -o pools | sed \"s/|/\\n/g\" ")
- if pools then
- for line in pools do
- local pool, url, user, diff, accept =
- line:match("POOL=(-?%d+)," ..
- "URL=(.-)," ..
- "Status=Alive.-" ..
- "User=(.-)," ..
- ".-" ..
- "Diff1 Shares=(-?%d+)," ..
- ".-," ..
- "Difficulty Accepted=(-?%d+)[%.%d]+," ..
- ".-" ..
- "Stratum Active=true")
- if pool then
- status.pool[#status.pool+1] = {
- ['pool'] = pool,
- ['url'] = url,
- ['user'] = user,
- ['diff'] = tonumber(diff),
- ['accept'] = tonumber(accept)
- }
- end
- end
- end
- -- network info
- if nixio.fs.access("/bin/ubus") then
- local netm = require "luci.model.network".init()
- local net = netm:get_network("lan")
- local device = net and net:get_interface()
- if device then
- status.network['mac'] = device:mac()
- local _, a
- for _, a in ipairs(device:ipaddrs()) do
- status.network['ip4'] = a:host():string()
- end
- for _, a in ipairs(device:ip6addrs()) do
- if not a:is6linklocal() then
- status.network['ip6'] = a:host():string()
- end
- end
- end
- end
- local releasedate = io.popen("cat /etc/avalon_version")
- status.openwrtver = releasedate:read("*line")
- releasedate:close()
- status.systime = os.date("%c")
- luci.http.prepare_content("application/json")
- luci.http.write_json(status)
- end
- function api_getlog()
- local msg = {}
- local pp = io.popen("echo -n \"[Firmware Version] => \"; cat /etc/avalon_version; /usr/bin/cgminer-api stats;")
- msg.log = pp:read("*a")
- pp:close()
- luci.http.prepare_content("application/json")
- luci.http.write_json(msg)
- end
- function action_logout()
- local dsp = require "luci.dispatcher"
- local sauth = require "luci.sauth"
- if dsp.context.authsession then
- sauth.kill(dsp.context.authsession)
- dsp.context.urltoken.stok = nil
- end
- luci.http.header("Set-Cookie", "sysauth=; path=" .. dsp.build_url())
- luci.http.redirect(luci.dispatcher.build_url("avalon", "page", "index"))
- end
|