OpenWrt Forum Archive

Topic: Luci server failure on "http://192.168.1.1/cgi-bin/luci"

The content of this topic has been archived on 23 Apr 2018. There are no obvious gaps in this topic, but there may still be some posts missing at the end.

I use openwrt v12.09. Hardware platform is the "ubunt routerstation pro". I downloaded an image with luci to my hardware platform. When I logoned it with  "http://192.168.1.1/cgi-bin/luci", an error issued:


/usr/lib/lua/luci/dispatcher.lua:460: Failed to execute function dispatcher target for entry '/'. The called action terminalted with an exception: usr/lib/lua/luci/template.lua:97: Failed to execute template 'sysauth'.
A runtime error occured: usr/lib/lua/luci/template.lua:97: Failed to execute template 'header'.
A runtime error occured: usr/lib/lua/luci/template.lua:97: Failed to execute template 'themes/bootstrap/header'.
A runtime error occured: [string "/usr/lib/lua/luci//view/themes/bootstrap/hea..."]:150: attempt to index local 'boardinfo' (a nil value) stack traceback: [C]: in fuction 'assert' /usr/lib/lua/luci/dispatcher.lua:460: in function 'dispatch' usr/lib/lua/luci/template.lua:141: in function </usr/lib/lua/luci/dispatcher.lua:140>


It seems some bootstrap problems.
Could anyone help me?

Some slips in spelling. Corrected here:

/usr/lib/lua/luci/dispatcher.lua:460: Failed to execute function dispatcher target for entry '/'. The called action terminalted with an exception: usr/lib/lua/luci/template.lua:97: Failed to execute template 'sysauth'.
A runtime error occured: usr/lib/lua/luci/template.lua:97: Failed to execute template 'header'.
A runtime error occured: usr/lib/lua/luci/template.lua:97: Failed to execute template 'themes/bootstrap/header'.
A runtime error occured: [string "/usr/lib/lua/luci/view/themes/bootstrap/hea..."]:150: attempt to index local 'boardinfo' (a nil value) stack traceback: [C]: in fuction 'assert' /usr/lib/lua/luci/dispatcher.lua:460: in function 'dispatch' usr/lib/lua/luci/dispatcher.lua:141: in function </usr/lib/lua/luci/dispatcher.lua:140>

I digged into luci source files "./luci/modules/luci-base/luasrc/", and I found errors are among "dispatcher.lua", "template.lua",  "head.htm".

/usr/lib/lua/luci/dispatcher.lua:460: Failed to execute function dispatcher target for entry '/'. The called action terminalted with an exception:
/usr/lib/lua/luci/template.lua:97: Failed to execute template 'sysauth'.A runtime error occured:
/usr/lib/lua/luci/template.lua:97: Failed to execute template 'header'.A runtime error occured:
/usr/lib/lua/luci/template.lua:97: Failed to execute template 'themes/bootstrap/header'.A runtime error occured:
[string "/usr/lib/lua/luci/view/themes/bootstrap/hea..."]:150: attempt to index local 'boardinfo' (a nil value) stack traceback: [C]: in fuction 'assert'
/usr/lib/lua/luci/dispatcher.lua:460: in function 'dispatch'
/usr/lib/lua/luci/dispatcher.lua:141: in function </usr/lib/lua/luci/dispatcher.lua:140>


Source files are here:

//template.lua////////////////////


function Template.render(self, scope)
    scope = scope or getfenv(2)
   
    -- Put our predefined objects in the scope of the template
    setfenv(self.template, setmetatable({}, {__index =
        function(tbl, key)
            return rawget(tbl, key) or self.viewns[key] or scope[key]
        end}))
   
    -- Now finally render the thing
    local stat, err = util.copcall(self.template)
    if not stat then
        error("Failed to execute template '" .. self.name .. "'.\n" ..
              "A runtime error occured: " .. tostring(err or "(nil)"))
    end
end




//dispatcher.lua////////////////////


function httpdispatch(request, prefix)
    http.context.request = request

    local r = {}
    context.request = r

    local pathinfo = http.urldecode(request:getenv("PATH_INFO") or "", true)

    if prefix then
        for _, node in ipairs(prefix) do
            r[#r+1] = node
        end
    end

    for node in pathinfo:gmatch("[^/]+") do
        r[#r+1] = node
    end

    local stat, err = util.coxpcall(function()
        dispatch(context.request)
    end, error500)

    http.close()

    --context._disable_memtrace()
end


function dispatch(request)
    --context._disable_memtrace = require "luci.debug".trap_memtrace("l")
    local ctx = context
    ctx.path = request
......
        assert(ok,
               "Failed to execute " .. (type(c.target) == "function" and "function" or c.target.type or "unknown") ..
               " dispatcher target for entry '/" .. table.concat(request, "/") .. "'.\n" ..
               "The called action terminated with an exception:\n" .. tostring(err or "(unknown)"))



//header.htm////////////////////

            if ucichanges > 0 then
                write('<a class="label notice" href="%s?redir=%s">%s: %d</a>' %{
                    url(category, 'uci/changes'),
                    http.urlencode(http.formvalue('redir') or REQUEST_URI),
                    translate('Unsaved Changes'),
                    ucichanges
                })



I'm not familiar with Lua and Luci. Any tips for that?

The error says that inside the file header.htm, on line: 150, the variable "boardinfo" is empty ..
Can you post your header.htm here??

For "openwrt v12.09", in the beginning,it did not work just running scripts below:
"./scripts/feeds install -a -p luci" (no luci installed)
So I changed the file "feeds.conf.default" --- refered to a new luci source cord repertory:
"src-git luci http://git.openwrt.org/project/luci.git"
Now it works running scripts below:
"./scripts/feeds install -a -p luci" (luci installed)

Now, though luci installed, errors occur on "http://192.168.1.1/cgi-bin/luci" as listed above.

I wonder if there is any mismatching between "openwrt v12.09" and "current luci repertory"?

head.htm:


<%#
Copyright 2008 Steven Barth <steven@midlink.org>
Copyright 2008-2016 Jo-Philipp Wich <jow@openwrt.org>
Copyright 2012 David Menting <david@nut-bolt.nl>
Licensed to the public under the Apache License 2.0.
-%>

<%
    local sys  = require "luci.sys"
    local util = require "luci.util"
    local http = require "luci.http"
    local disp = require "luci.dispatcher"

    local boardinfo = util.ubus("system", "board")

    local request  = disp.context.path
    local request2 = disp.context.request

    local category = request[1]
    local cattree  = category and disp.node(category)

    local leaf = request2[#request2]

    local tree = disp.node()
    local node = disp.context.dispatched

    local categories = disp.node_childs(tree)

    local c = tree
    local i, r

    -- tag all nodes leading to this page
    for i, r in ipairs(request) do
        if c.nodes and c.nodes[r] then
            c = c.nodes[r]
            c._menu_selected = true
        end
    end

    -- send as HTML5
    http.prepare_content("text/html")

    local function nodeurl(prefix, name, query)
        local u = url(prefix, name)
        if query then
            u = u .. http.build_querystring(query)
        end
        return pcdata(u)
    end

    local function render_tabmenu(prefix, node, level)
        if not level then
            level = 1
        end

        local childs = disp.node_childs(node)
        if #childs > 0 then
            if level > 2 then
                write('<ul class="tabs">')
            end

            local selected_node
            local selected_name
            local i, v

            for i, v in ipairs(childs) do
                local nnode = node.nodes[v]
                if nnode._menu_selected then
                    selected_node = nnode
                    selected_name = v
                end

                if level > 2 then
                    write('<li class="tabmenu-item-%s %s"><a href="%s">%s</a></li>' %{
                        v, (nnode._menu_selected or (node.leaf and v == leaf)) and 'active' or '',
                        nodeurl(prefix, v, nnode.query),
                        striptags(translate(nnode.title))
                    })
                end
            end

            if level > 2 then
                write('</ul>')
            end

            if selected_node then
                render_tabmenu(prefix .. "/" .. selected_name, selected_node, level + 1)
            end
        end
    end

    local function render_submenu(prefix, node)
        local childs = disp.node_childs(node)
        if #childs > 0 then
            write('<ul class="dropdown-menu">')

            for i, r in ipairs(childs) do
                local nnode = node.nodes[r]
                write('<li><a href="%s">%s</a></li>' %{
                    nodeurl(prefix, r, nnode.query),
                    pcdata(striptags(translate(nnode.title)))
                })
            end

            write('</ul>')
        end
    end

    local function render_topmenu()
        local childs = disp.node_childs(cattree)
        if #childs > 0 then
            write('<ul class="nav">')

            for i, r in ipairs(childs) do
                local nnode = cattree.nodes[r]
                local grandchildren = disp.node_childs(nnode)

                if #grandchildren > 0 then
                    write('<li class="dropdown"><a class="menu" href="#">%s</a>' % pcdata(striptags(translate(nnode.title))))
                    render_submenu(category .. "/" .. r, nnode)
                    write('</li>')
                else
                    write('<li><a href="%s">%s</a></li>' %{
                        nodeurl(category, r, nnode.query),
                        pcdata(striptags(translate(nnode.title)))
                    })
                end
            end

            write('</ul>')
        end
    end

    local function render_changes()
        -- calculate the number of unsaved changes
        if tree.nodes[category] and tree.nodes[category].ucidata then
            local ucichanges = 0

            for i, j in pairs(require("luci.model.uci").cursor():changes()) do
                for k, l in pairs(j) do
                    for m, n in pairs(l) do
                        ucichanges = ucichanges + 1;
                    end
                end
            end

            if ucichanges > 0 then
                write('<a class="label notice" href="%s?redir=%s">%s: %d</a>' %{
                    url(category, 'uci/changes'),
                    http.urlencode(http.formvalue('redir') or REQUEST_URI),
                    translate('Unsaved Changes'),
                    ucichanges
                })
            end
        end
    end
-%>
<!DOCTYPE html>
<html lang="<%=luci.i18n.context.lang%>">
    <head>
        <meta charset="utf-8">
        <title><%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI</title>
        <!--[if lt IE 9]><script src="<%=media%>/html5.js"></script><![endif]-->
        <meta name="viewport" content="initial-scale=1.0">
        <link rel="stylesheet" href="<%=media%>/cascade.css">
        <link rel="stylesheet" media="only screen and (max-device-width: 854px)" href="<%=media%>/mobile.css" type="text/css" />
        <link rel="shortcut icon" href="<%=media%>/favicon.ico">
        <% if node and node.css then %>
            <link rel="stylesheet" href="<%=resource%>/<%=node.css%>">
        <% end -%>
        <% if css then %>
            <style title="text/css"><%= css %></style>
        <% end -%>
        <script src="<%=resource%>/xhr.js"></script>
    </head>

    <body class="lang_<%=luci.i18n.context.lang%> <%- if node then %><%= striptags( node.title ) %><%- end %>">
        <header>
            <div class="fill">
                <div class="container">
                    <a class="brand" href="#"><%=boardinfo.hostname or "?"%></a>
                    <% render_topmenu() %>
                    <div class="pull-right">
                        <% render_changes() %>
                        <span id="xhr_poll_status" style="display:none" onclick="XHR.running() ? XHR.halt() : XHR.run()">
                            <span class="label success" id="xhr_poll_status_on"><%:Auto Refresh%> <%:on%></span>
                            <span class="label" id="xhr_poll_status_off" style="display:none"><%:Auto Refresh%> <%:off%></span>
                        </span>
                    </div>
                </div>
            </div>
        </header>

        <%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%>
            <div class="container">
                <div class="alert-message warning">
                    <h4><%:No password set!%></h4>
                    <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%><br>
                    <a href="<%=pcdata(luci.dispatcher.build_url("admin/system/admin"))%>"><%:Go to password configuration...%></a>
                </div>
            </div>
        <%- end -%>

        <div id="maincontent" class="container">
            <% if category then render_tabmenu(category, cattree) end %>

It should be "header.htm" above

I've solved this problem with modifying line 14 in /usr/lib/lua/luci/view/themes/bootstrap/header.htm
from   

local boardinfo = util.ubus("system", "board")

to       

local boardinfo = util.ubus("system", "board") or { }

as it's in /usr/lib/lua/luci/view/themes/openwrt.org/header.htm

Thanks!

The discussion might have continued from here.