<%#
LuCI - Lua Configuration Interface
Copyright 2008 Steven Barth <steven@midlink.org>
Copyright 2008 Jo-Philipp Wich <xm@leipzig.freifunk.net>
Copyright 2011 Manuel Munz <freifunk at somakoma dot de>

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
-%>

<%
local sys = require "luci.sys"
local utl = require "luci.util"
local fs = require "luci.fs"
 
function get_version()
        local data = utl.split((utl.trim(sys.exec("/usr/sbin/olsrd -v"))))
        local buildfull = utl.trim(utl.split(data[2],": ")[2])
        local ver = {
                version = utl.trim(utl.split(data[1]," - ")[2]),
                date = utl.trim(utl.split(buildfull, " ")[1]),
                time = utl.trim(utl.split(buildfull, " ")[2]),
                host = utl.trim(utl.split(buildfull, " ")[4])
        }
        return ver
end
local ver = get_version()

local ifaces = fetch_txtinfo("int")
if not ifaces or not ifaces.Interfaces then
	luci.template.render("status-olsr/error_olsr")
	return nil
end
local interfaces = ""
for k,v in pairs(ifaces.Interfaces) do
	interfaces = utl.trim(interfaces.." "..v.Name)
end
interfaces = string.gsub(interfaces, " ", ", ")
local nr_ifaces = #ifaces.Interfaces

local links = fetch_txtinfo("links")
local nr_neigh = #links.Links
local neighbors = ""
for k,v in pairs(links.Links) do
	local link
	if v.Hostname then
		link = v.Hostname
	else
		link = v["Remote IP"]
	end
	neighbors = utl.trim("<a href=http://"..link.."/cgi-bin-status.html>"..link.."</a> "..neighbors)
end

local data = fetch_txtinfo("topology")
local nr_topo = #data.Topology
local utable = {}
for k,v in pairs(data.Topology) do
	if utl.contains(utable, v["Dest. IP"]) == false then
		table.insert(utable, v["Dest. IP"])
	end
end
local nr_nodes = #utable

local data = fetch_txtinfo("hna")
local nr_hna = #data.HNA

local meshfactor = string.format("%.2f", nr_topo / nr_nodes)

if luci.http.formvalue("status") == "1" then
	rv = {
		nr_neighbors = nr_neigbors,
		neighbors = neighbors,
		interfaces = interfaces,
		nr_ifaces = nr_ifaces,
		nr_links = nr_links,
		nr_topo = nr_topo,
		nr_nodes = nr_nodes,
		meshfactor = meshfactor
	}
	luci.http.prepare_content("application/json")
	luci.http.write_json(rv)
	return
end
	

local ipv = luci.model.uci.cursor():get_first("olsrd", "olsrd", "IpVersion", "4")

function write_conf(conf, file)
	if fs.access(conf) then
		luci.http.header("Content-Disposition", "attachment; filename="..file)
		luci.http.prepare_content("text/plain")
		luci.http.write(fs.readfile(conf))
	end
end

conf = luci.http.formvalue()

if conf.openwrt then
	write_conf("/etc/config/olsrd", "olsrd")
	return false
end

if conf.conf_v4 then   
	write_conf("/var/etc/olsrd.conf.ipv4", "olsrd.conf.ipv4")
	return false
end

if conf.conf_v6 then
	write_conf("/var/etc/olsrd.conf.ipv6", "olsrd.conf.ipv6")
	return false
end

if conf.conf then
	write_conf("/var/etc/olsrd.conf", "olsrd.conf")
	return false
end

%>

<%+header%>

<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
<script type="text/javascript">//<![CDATA[

XHR.poll(30, '<%=REQUEST_URI%>', { status: 1 },
                function(x, info)
                {
		var e;

		if (e = document.getElementById('nr_neighbors'))
			e.innerHTML = info.nr_neighbors;

		if (e = document.getElementById('neighbors'))
			e.innerHTML = info.neighbors;

		if (e = document.getElementById('nr_ifaces'))
			e.innerHTML = info.nr_ifaces;

		if (e = document.getElementById('interfaces'))
			e.innerHTML = info.interfaces;

		if (e = document.getElementById('nr_links'))
			e.innerHTML = info.nr_links;

		if (e = document.getElementById('nr_topo'))
			e.innerHTML = info.nr_topo;

		if (e = document.getElementById('nr_nodes'))
			e.innerHTML = info.nr_nodes;

		if (e = document.getElementById('meshfactor'))
			e.innerHTML = info.meshfactor;
		}
	);
//]]></script>


<h2><a id="content" name="content">OLSR <%:Overview%></a></h2>

<div class="cbi-map">
	<div class="cbi-section-node">
		<div class="cbi-value">
			<div style="width: 15em; float:left;">
				<label class="cbi-value-title"><%:Interfaces%></label>
			</div>
			<div class="cbi-value-field">
				<div style="width: 6em; float:left;">
					<a href="<%=luci.dispatcher.build_url("freifunk", "olsr", "interfaces")%>">
						<span id="nr_ifaces">
							<%=nr_ifaces%>
						<span>
					</a>
				</div>
				<div style="padding-left: 21em;">
					<span id="interfaces">
						<%=interfaces%>
					</span>
				</div>
			</div>
			<br/>
		</div>

		<div class="cbi-value">
			<div style="width: 15em; float:left;">
				<%:Neighbors%>
			</div>
			<div class="cbi-value-field">
				<div style="width: 6em; float:left;">
					<a href="<%=luci.dispatcher.build_url("freifunk", "olsr", "neighbors")%>">
						<span id="nr_neigh">
							<%=nr_neigh%>
						</span>
					</a>
				</div>
				<div style="padding-left: 21em;">
					<span id="neighbors">
						<%=neighbors%>
					</span>
				</div>
			</div>
			<br/>
		</div>

		<div class="cbi-value">
			<div style="width: 15em; float:left;">
				<%:Nodes%>
			</div>
			<div class="cbi-value-field">
				<div style="width: 6em; float:left;">
					<a href="<%=luci.dispatcher.build_url("freifunk", "olsr", "topology")%>">
						<span id="nr_nodes">
							<%=nr_nodes%>
						</span>
					</a>
				</div>
			</div>
			<br/>
		</div>

		<div class="cbi-value">
			<div style="width: 15em; float:left;">
				<%:HNA%>
			</div>
			<div class="cbi-value-field">
				<div style="width: 6em; float:left;">
					<a href="<%=luci.dispatcher.build_url("freifunk", "olsr", "hna")%>">
						<span id="nr_hna">
							<%=nr_hna%>
						</span>
					</a>
				</div>
			</div>
			<br/>
		</div>

		<div class="cbi-value">
			<div style="width: 15em; float:left;">
				<%:Links total%>
			</div>
			<div class="cbi-value-field">
				<div style="width: 6em; float:left;">
					<a href="<%=luci.dispatcher.build_url("freifunk", "olsr", "topology")%>">
						<span id="nr_topo">
							<%=nr_topo%>
						</span>
					</a>
				</div>
			</div>
			<br/>
		</div>

		<div class="cbi-value">
			<div style="width: 15em; float:left;">
				<%:Links per node (average)%>
			</div>
			<div class="cbi-value-field">
				<div style="width: 6em; float:left;">
					<span id="meshfactor">
						<%=meshfactor%>
					</span>
				</div>
			</div>
			<br/>
		</div>
	</div>
</div>
<br/>

<h2><a id="content" name="content">OLSR <%:Configuration%></a></h2>

<div class="cbi-map">
	<div class="cbi-section-node">
		<div class="cbi-value">
			<div style="width: 15em; float:left;">
				<%:Version%>
			</div>
			<div class="cbi-value-field">
				<%=ver.version%> (built <%=ver.date%> on <%=ver.host%>)
			</div>
			<br/>
		</div>

		<div class="cbi-value">
			<div style="width: 15em; float:left;">
				<%:Download Config%>
			</div>
			<div class="cbi-value-field">
				<a href="<%=REQUEST_URI%>?openwrt">OpenWrt</a>,
				<% if ipv == "6and4" then %>
					<a href="<%=REQUEST_URI%>?conf_v4">OLSRD IPv4</a>,
					<a href="<%=REQUEST_URI%>?conf_v6">OLSRD IPv6</a>
				<% else %>
					<a href="<%=REQUEST_URI%>?conf">OLSRD</a>
				<% end %>
			</div>
			<br/>
		</div>
	</div>
</div>

<%+footer%>