diff options
author | Jo-Philipp Wich <jow@openwrt.org> | 2011-06-10 16:47:00 +0000 |
---|---|---|
committer | Jo-Philipp Wich <jow@openwrt.org> | 2011-06-10 16:47:00 +0000 |
commit | 2dd1080cd670da260a36dbcc1d83ecedc8d9a332 (patch) | |
tree | 48fb866a761ffdedc8367859a99ba2a61e07dfee /applications/luci-ahcp | |
parent | 1d2f948280aeff5071ab890e4ac50fa2caf436f9 (diff) |
applications: add luci-ahcp, support for the AHCP server package
Diffstat (limited to 'applications/luci-ahcp')
-rw-r--r-- | applications/luci-ahcp/Makefile | 4 | ||||
-rw-r--r-- | applications/luci-ahcp/luasrc/controller/ahcp.lua | 63 | ||||
-rw-r--r-- | applications/luci-ahcp/luasrc/model/cbi/ahcp.lua | 121 | ||||
-rw-r--r-- | applications/luci-ahcp/luasrc/view/admin_status/index/ahcp.htm | 1 | ||||
-rw-r--r-- | applications/luci-ahcp/luasrc/view/ahcp_status.htm | 60 | ||||
-rwxr-xr-x | applications/luci-ahcp/root/etc/uci-defaults/luci-ahcp | 11 |
6 files changed, 260 insertions, 0 deletions
diff --git a/applications/luci-ahcp/Makefile b/applications/luci-ahcp/Makefile new file mode 100644 index 000000000..a70e950ad --- /dev/null +++ b/applications/luci-ahcp/Makefile @@ -0,0 +1,4 @@ +PO = ahcp + +include ../../build/config.mk +include ../../build/module.mk diff --git a/applications/luci-ahcp/luasrc/controller/ahcp.lua b/applications/luci-ahcp/luasrc/controller/ahcp.lua new file mode 100644 index 000000000..ea7390311 --- /dev/null +++ b/applications/luci-ahcp/luasrc/controller/ahcp.lua @@ -0,0 +1,63 @@ +--[[ +LuCI - Lua Configuration Interface + +Copyright 2011 Jo-Philipp Wich <xm@subsignal.org> + +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.ahcp", package.seeall) + +function index() + if not nixio.fs.access("/etc/config/ahcpd") then + return + end + + require("luci.i18n") + luci.i18n.loadc("ahcp") + + entry({"admin", "network", "ahcpd"}, cbi("ahcp"), luci.i18n.translate("AHCP Server"), 90).i18n = "ahcp" + entry({"admin", "network", "ahcpd", "status"}, call("ahcp_status")) +end + +function ahcp_status() + local nfs = require "nixio.fs" + local uci = require "luci.model.uci".cursor() + local lsd = uci:get_first("ahcpd", "ahcpd", "lease_dir") or "/var/lib/leases" + local idf = uci:get_first("ahcpd", "ahcpd", "id_file") or "/var/lib/ahcpd-unique-id" + + local rv = { + uid = "00:00:00:00:00:00:00:00", + leases = { } + } + + idf = nfs.readfile(idf) + if idf and #idf == 8 then + rv.uid = "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X" %{ idf:byte(1, 8) } + end + + local itr = nfs.dir(lsd) + if itr then + local addr + for addr in itr do + if addr:match("^%d+%.%d+%.%d+%.%d+$") then + local s = nfs.stat(lsd .. "/" .. addr) + rv.leases[#rv.leases+1] = { + addr = addr, + age = s and (os.time() - s.mtime) or 0 + } + end + end + end + + table.sort(rv.leases, function(a, b) return a.age < b.age end) + + luci.http.prepare_content("application/json") + luci.http.write_json(rv) +end diff --git a/applications/luci-ahcp/luasrc/model/cbi/ahcp.lua b/applications/luci-ahcp/luasrc/model/cbi/ahcp.lua new file mode 100644 index 000000000..18764a1f3 --- /dev/null +++ b/applications/luci-ahcp/luasrc/model/cbi/ahcp.lua @@ -0,0 +1,121 @@ +--[[ +LuCI - Lua Configuration Interface + +Copyright 2011 Jo-Philipp Wich <xm@subsignal.org> + +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 5764 2010-03-08 19:05:34Z jow $ +]]-- + +m = Map("ahcpd", translate("AHCP Server"), translate("AHCP is an autoconfiguration protocol " .. + "for IPv6 and dual-stack IPv6/IPv4 networks designed to be used in place of router " .. + "discovery and DHCP on networks where it is difficult or impossible to configure a " .. + "server within every link-layer broadcast domain, for example mobile ad-hoc networks.")) + + +m:section(SimpleSection).template = "ahcp_status" + +s = m:section(TypedSection, "ahcpd") +s:tab("general", translate("General Setup")) +s:tab("advanced", translate("Advanced Settings")) +s.addremove = false +s.anonymous = true + + +mode = s:taboption("general", ListValue, "mode", translate("Operation mode")) +mode:value("server", translate("Server")) +mode:value("forwarder", translate("Forwarder")) + +net = s:taboption("general", Value, "interface", translate("Served interfaces")) +net.template = "cbi/network_netlist" +net.widget = "checkbox" +net.nocreate = true + +function net.cfgvalue(self, section) + return m.uci:get("ahcpd", section, "interface") +end + +pfx = s:taboption("general", DynamicList, "prefix", translate("Announced prefixes"), + translate("Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation")) +pfx.optional = true +pfx.datatype = "ipaddr" +pfx:depends("mode", "server") + +nss = s:taboption("general", DynamicList, "name_server", translate("Announced DNS servers"), + translate("Specifies the announced IPv4 and IPv6 name servers")) +nss.optional = true +nss.datatype = "ipaddr" +nss:depends("mode", "server") + +ntp = s:taboption("general", DynamicList, "ntp_server", translate("Announced NTP servers"), + translate("Specifies the announced IPv4 and IPv6 NTP servers")) +ntp.optional = true +ntp.datatype = "ipaddr" +ntp:depends("mode", "server") + +mca = s:taboption("general", Value, "multicast_address", translate("Multicast address")) +mca.optional = true +mca.placeholder = "ff02::cca6:c0f9:e182:5359" +mca.datatype = "ip6addr" + +port = s:taboption("general", Value, "port", translate("Port")) +port.optional = true +port.placeholder = 5359 +port.datatype = "port" + +fam = s:taboption("general", ListValue, "_family", translate("Protocol family")) +fam:value("", translate("IPv4 and IPv6")) +fam:value("ipv4", translate("IPv4 only")) +fam:value("ipv6", translate("IPv6 only")) + +function fam.cfgvalue(self, section) + local v4 = m.uci:get_bool("ahcpd", section, "ipv4_only") + local v6 = m.uci:get_bool("ahcpd", section, "ipv6_only") + if v4 then + return "ipv4" + elseif v6 then + return "ipv6" + end + return "" +end + +function fam.write(self, section, value) + if value == "ipv4" then + m.uci:set("ahcpd", section, "ipv4_only", "true") + m.uci:delete("ahcpd", section, "ipv6_only") + elseif value == "ipv6" then + m.uci:set("ahcpd", section, "ipv6_only", "true") + m.uci:delete("ahcpd", section, "ipv4_only") + end +end + +function fam.remove(self, section) + m.uci:delete("ahcpd", section, "ipv4_only") + m.uci:delete("ahcpd", section, "ipv6_only") +end + +ltime = s:taboption("general", Value, "lease_time", translate("Lease validity time")) +ltime.optional = true +ltime.placeholder = 3666 +ltime.datatype = "uinteger" + + +ld = s:taboption("advanced", Value, "lease_dir", translate("Lease directory")) +ld.datatype = "directory" +ld.placeholder = "/var/lib/leases" + +id = s:taboption("advanced", Value, "id_file", translate("Unique ID file")) +--id.datatype = "file" +id.placeholder = "/var/lib/ahcpd-unique-id" + +log = s:taboption("advanced", Value, "log_file", translate("Log file")) +--log.datatype = "file" +log.placeholder = "/var/log/ahcpd.log" + + +return m diff --git a/applications/luci-ahcp/luasrc/view/admin_status/index/ahcp.htm b/applications/luci-ahcp/luasrc/view/admin_status/index/ahcp.htm new file mode 100644 index 000000000..ef4cfca56 --- /dev/null +++ b/applications/luci-ahcp/luasrc/view/admin_status/index/ahcp.htm @@ -0,0 +1 @@ +<%+ahcp_status%> diff --git a/applications/luci-ahcp/luasrc/view/ahcp_status.htm b/applications/luci-ahcp/luasrc/view/ahcp_status.htm new file mode 100644 index 000000000..bc595ce6c --- /dev/null +++ b/applications/luci-ahcp/luasrc/view/ahcp_status.htm @@ -0,0 +1,60 @@ +<script type="text/javascript">//<![CDATA[ + var stxhr = new XHR(); + var update_status = function() { + stxhr.get('<%=luci.dispatcher.build_url("admin", "network", "ahcpd", "status")%>', null, + function(x, st) + { + var tb = document.getElementById('ahcpd_status_table'); + var tx = document.getElementById('ahcpd_status_text'); + if (st && tb && tx) + { + /* clear all rows */ + while( tb.rows.length > 1 ) + tb.deleteRow(1); + + for( var i = 0; i < st.leases.length; i++ ) + { + var tr = tb.insertRow(-1); + tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1); + + tr.insertCell(-1).innerHTML = st.leases[i].addr; + tr.insertCell(-1).innerHTML = String.format('%t', st.leases[i].age); + } + + if( tb.rows.length == 1 ) + { + var tr = tb.insertRow(-1); + tr.className = 'cbi-section-table-row'; + + var td = tr.insertCell(-1); + td.colSpan = 2; + td.innerHTML = '<em><br /><%:There are no active leases.%></em>'; + } + + if( st.uid == '00:00:00:00:00:00:00:00' ) + tx.innerHTML = 'The AHCP Service is not running.'; + else + tx.innerHTML = String.format('The AHCP Service is running with ID %s.', st.uid); + } + + window.setTimeout(update_status, 5000); + } + ) + }; + + update_status(); +//]]></script> + +<fieldset class="cbi-section"> + <legend><%:Active AHCP Leases%></legend> + <p id="ahcpd_status_text"></p> + <table class="cbi-section-table" id="ahcpd_status_table"> + <tr class="cbi-section-table-titles"> + <th class="cbi-section-table-cell"><%:Address%></th> + <th class="cbi-section-table-cell"><%:Age%></th> + </tr> + <tr class="cbi-section-table-row"> + <td colspan="5"><em><br /><%:Collecting data...%></em></td> + </tr> + </table> +</fieldset> diff --git a/applications/luci-ahcp/root/etc/uci-defaults/luci-ahcp b/applications/luci-ahcp/root/etc/uci-defaults/luci-ahcp new file mode 100755 index 000000000..f2b2487ca --- /dev/null +++ b/applications/luci-ahcp/root/etc/uci-defaults/luci-ahcp @@ -0,0 +1,11 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@ahcpd[-1] + add ucitrack ahcpd + set ucitrack.@ahcpd[-1].init=ahcpd + commit ucitrack +EOF + +rm -f /tmp/luci-indexcache +exit 0 |