HTML Fehler auf der Status-Seite

Hallo,

wenn der Knoten sehr stark ausgelastet ist, kommt es hin und wieder zu einer Fehlermeldung beim Aufruf von /cgi-bin/status. Der HTML-Code selbst scheint auch ein Fehler zu haben. Gleich nach dem Title-Tag (Zeile 7) will er wohl noch einmal mit dem Doctype anfangen. Zumindest der Chrome mag da nicht.

Firmware: 1.0.1~6 / gluon-1.0.0_104-7-g12219c8

Ich versuche mal den HTML-Code hier rein zu legen

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
	<head>
		<meta charset="utf-8" />
		<meta name="viewport" content="width=device-width, user-scalable=no" />

		<title><!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
	<head>
		<meta charset="utf-8" />
		<meta name="viewport" content="width=device-width, user-scalable=no" />

		<title>Fehler</title>

		<link rel="stylesheet" href="/static/status-page.css" type="text/css" />
	</head>
	<body>
		<header>
			<h1>Fehler</h1>
		</header>
		<div class="container">
			<div class="frame">
				<h2 name="content">500 Interner Serverfehler</h2>
<p>Entschuldigung, auf dem Server ist ein unerwarteter Fehler aufgetreten.</p>
<pre class="error500">Failed to execute dispatcher target for entry &#39;/&#39;.
The called action terminated with an exception:
/usr/lib/lua/gluon/web/template.lua:43: Failed to execute template &#39;status-page&#39;.
A runtime error occured: [string &#34;/lib/gluon/status-page/view/status-page.htm...&#34;]:79: attempt to index global &#39;nodeinfo&#39; (a nil value)</pre>

			</div>
		</div>
	</body>
</html>

Gruß,
Mike

Interessant. Der Webserver interpretiert den Lua-Code der Webseite, der doppelte Header kommt wohl, weil die Seite ausgegeben wurde bis zum <title>, dann nodeinfo.hostname ausgegeben werden soll (über den eingebauten Lua-Interpreter des Webservers) und dort dann der Laufzeitfehler “nodeinfo ist nicht gesetzt” auftritt:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
	<head>
		<meta charset="utf-8" />
		<meta name="viewport" content="width=device-width, user-scalable=no" />

		<title><%| nodeinfo.hostname %> - <%:Status%></title>

		<link rel="stylesheet" href="/static/status-page.css" type="text/css" />
	</head>

Allerdings sollte nodeinfo vor der Ausgabe der Seite gesetzt werden:

entry({}, call(function(http, renderer)
	local nodeinfo = json.parse(util.exec('exec gluon-neighbour-info -d ::1 -p 1001 -t 1 -c 1 -r nodeinfo'))

	local node_ip = parse_ip(http:getenv('SERVER_ADDR'))
	if node_ip and (
			match(node_ip, parse_ip(site.next_node.ip4()), 8) or
			match(node_ip, parse_ip(site.next_node.ip6()), 8)
	) then
		-- The user has visited the status page via a next-node address
		-- Redirect the user to a unique address to avoid switching nodes
		local prefix = parse_ip(site.prefix6():match('^[^/]+'))
		for _, addr in ipairs(nodeinfo.network.addresses) do
			if match(prefix, parse_ip(addr), 4) then
				http:header('Cache-Control', 'no-cache, no-store, must-revalidate')
				http:redirect('http://[' .. addr .. ']' .. http:getenv('REQUEST_URI'))
				http:close()
				return
			end
		end
	end


	renderer.render('status-page', { nodeinfo = nodeinfo }, 'gluon-status-page')
end))

Wie nodeinfo da leer sein kann, erschließt sich mir grade nicht :frowning:

Hallo,

es ist der MR3420, bei dem es mir aufgefallen ist. Schreit wohl nach einen Leistungsstärkeren…

Hmm, holt er den Namen übers Netzwerk? Dieser ist ja ausgelastet von den Clients. Kann man die info nicht ins environment beim boot legen? Wobei, wenn der RAM eh schon knapp ist… Vielleicht dann doch keine so gute Idee.

Gruß,
Mike

Der Webserver hat einen Interpreter für die Sprache Lua eingebaut (ist sowas ähnliches wie PHP, falls das bekannt ist), und die Statusseite nutzt diesen zur Ausgabe dynamischer Daten — eine Webseite ist ja eigentlich statisch, daher werden diese für aktuelle Informationen zur Laufzeit teils über Javascript, teils über (hier:) Lua erzeugt, bevor sie an den Client ausgeliefert werden.