luci-0.10: merge r7113, r7114, r7115, r7116 and r7117

This commit is contained in:
Jo-Philipp Wich 2011-06-10 23:17:39 +00:00
parent 9857d8d55d
commit b23b669ffb
10 changed files with 354 additions and 27 deletions

View file

@ -0,0 +1,4 @@
PO = ahcp
include ../../build/config.mk
include ../../build/module.mk

View file

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

View file

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

View file

@ -0,0 +1 @@
<%+ahcp_status%>

View file

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

View file

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

View file

@ -58,6 +58,7 @@ local knownParams = {
{ Flag, "client_disconnect", 0 },
{ Value, "learn_address", "/usr/bin/ovpn-learnaddress" },
{ Value, "auth_user_pass_verify", "/usr/bin/ovpn-userpass via-env" },
{ ListValue, "script_security", { 0, 1, 2, 3 }, {mode="server" } },
} },
{ "networking", {
@ -115,6 +116,7 @@ local knownParams = {
{ Flag, "management_query_passwords", 0 }, -- management
{ Flag, "management_hold", 0 }, -- management
{ Flag, "management_log_cache", 100 }, -- management
{ ListValue, "topology", { "net30", "p2p", "subnet" }, {dev_type="tun" } },
} },
{ "vpn", {

View file

@ -7,7 +7,7 @@ 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
http://www.apache.org/licenses/LICENSE-2.0
$Id$
]]--
@ -17,36 +17,36 @@ require("luci.model.uci")
local basicParams = {
--
-- Widget, Name, Default(s), Description
--
-- Widget Name Optn. Default(s)
--
{ ListValue, "verb", { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }, translate("Set output verbosity") },
{ Value, "nice",0, translate("Change process priority") },
{ Value,"port",1194, translate("TCP/UDP port # for both local and remote") },
{ ListValue,"dev_type",{ "tun", "tap" }, translate("Type of used device") },
{ Flag,"tun_ipv6",0, translate("Make tun device IPv6 capable") },
{ ListValue, "verb", { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 } },
{ Value, "nice", 0 },
{ Value, "port", 1194 },
{ ListValue, "dev_type", { "tun", "tap" } },
{ Flag, "tun_ipv6", 0 },
{ Value,"ifconfig","10.200.200.3 10.200.200.1", translate("") },
{ Value,"server","10.200.200.0 255.255.255.0", translate("Configure server mode") },
{ Value,"server_bridge","192.168.1.1 255.255.255.0 192.168.1.128 192.168.1.254", translate("Configure server bridge") },
{ Flag,"nobind",0, translate("Do not bind to local address and port") },
{ Value, "ifconfig", "10.200.200.3 10.200.200.1" },
{ Value, "server", "10.200.200.0 255.255.255.0" },
{ Value, "server_bridge", "192.168.1.1 255.255.255.0 192.168.1.128 192.168.1.254" },
{ Flag, "nobind", 0 },
{ Flag,"comp_lzo",0, translate("Use fast LZO compression") },
{ Value,"keepalive","10 60", translate("") },
{ Flag, "comp_lzo", 0 },
{ Value, "keepalive", "10 60" },
{ ListValue,"proto",{ "udp", "tcp" }, translate("Use protocol") },
{ ListValue, "proto", { "udp", "tcp" } },
{ Flag,"client",0, translate("Configure client mode") },
{ Flag,"client_to_client",0, translate("Allow client-to-client traffic") },
{ DynamicList,"remote","vpnserver.example.org", translate("Remote host name or ip address") },
{ Flag, "client", 0 },
{ Flag, "client_to_client", 0 },
{ DynamicList, "remote", "vpnserver.example.org" },
{ FileUpload, "secret", "/etc/openvpn/secret.key 1" },
{ FileUpload, "pkcs12", "/etc/easy-rsa/keys/some-client.pk12" },
{ FileUpload, "ca", "/etc/easy-rsa/keys/ca.crt" },
{ FileUpload, "dh", "/etc/easy-rsa/keys/dh1024.pem" },
{ FileUpload, "cert", "/etc/easy-rsa/keys/some-client.crt" },
{ FileUpload, "key", "/etc/easy-rsa/keys/some-client.key" },
{ FileUpload,"secret","/etc/openvpn/secret.key 1", translate("Enable Static Key encryption mode (non-TLS)") },
{ FileUpload,"pkcs12","/etc/easy-rsa/keys/some-client.pk12", translate("PKCS#12 file containing keys") },
{ FileUpload,"ca","/etc/easy-rsa/keys/ca.crt", translate("Certificate authority") },
{ FileUpload,"dh","/etc/easy-rsa/keys/dh1024.pem", translate("Diffie Hellman parameters") },
{ FileUpload,"cert","/etc/easy-rsa/keys/some-client.crt", translate("Local certificate") },
{ FileUpload,"key","/etc/easy-rsa/keys/some-client.key", translate("Local private key") },
}
@ -63,8 +63,7 @@ local s = m:section( NamedSection, arg[1], "openvpn" )
for _, option in ipairs(basicParams) do
local o = s:option(
option[1], option[2],
translate("openvpn_param_%s" % option[2]),
translate("openvpn_param_%s_desc" % option[2])
option[2], option[4]
)
o.optional = true
@ -100,3 +99,4 @@ for _, option in ipairs(basicParams) do
end
return m

View file

@ -400,6 +400,9 @@ $(eval $(call application,vnstat,LuCI Support for VnStat,\
$(eval $(call application,radvd,LuCI Support for Radvd,\
+luci-mod-admin-full +PACKAGE_luci-app-radvd:radvd))
$(eval $(call application,ahcp,LuCI Support for AHCPd,\
+luci-mod-admin-full +PACKAGE_luci-app-ahcp:ahcpd))
$(eval $(call application,lqtapifoss,Lantiq voip))
### Server Gateway Interfaces ###

View file

@ -33,6 +33,7 @@ local has_ipv6 = fs.access("/proc/net/ipv6_route")
local has_6in4 = fs.access("/lib/network/6in4.sh")
local has_6to4 = fs.access("/lib/network/6to4.sh")
local has_relay = fs.access("/lib/network/relay.sh")
local has_ahcp = fs.access("/lib/network/ahcp.sh")
m = Map("network", translate("Interfaces") .. " - " .. arg[1]:upper(), translate("On this page you can configure the network interfaces. You can bridge several interfaces by ticking the \"bridge interfaces\" field and enter the names of several network interfaces separated by spaces. You can also use <abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation <samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: <samp>eth0.1</samp>)."))
m:chain("wireless")
@ -68,6 +69,7 @@ if has_pppd then s:tab("ppp", translate("PPP Settings")) end
if has_pppoa then s:tab("atm", translate("ATM Settings")) end
if has_6in4 or has_6to4 then s:tab("tunnel", translate("Tunnel Settings")) end
if has_relay then s:tab("relay", translate("Relay Settings")) end
if has_ahcp then s:tab("ahcp", translate("AHCP Settings")) end
s:tab("physical", translate("Physical Settings"))
if has_firewall then s:tab("firewall", translate("Firewall Settings")) end
@ -94,6 +96,7 @@ if has_pptp then p:value("pptp", "PPTP") end
if has_6in4 then p:value("6in4", "6in4") end
if has_6to4 then p:value("6to4", "6to4") end
if has_relay then p:value("relay", "Relay") end
if has_ahcp then p:value("ahcp", "AHCP") end
p:value("none", translate("none"))
if not ( has_pppd and has_pppoe and has_pppoa and has_3g and has_pptp ) then
@ -122,6 +125,7 @@ ifname_single:depends({ type = "", proto = "static" })
ifname_single:depends({ type = "", proto = "dhcp" })
ifname_single:depends({ type = "", proto = "pppoe" })
ifname_single:depends({ type = "", proto = "pppoa" })
ifname_single:depends({ type = "", proto = "ahcp" })
ifname_single:depends({ type = "", proto = "none" })
function ifname_single.cfgvalue(self, s)
@ -541,6 +545,64 @@ if has_relay then
table:depends("proto", "relay")
end
if has_ahcp then
mca = s:taboption("ahcp", Value, "multicast_address", translate("Multicast address"))
mca.optional = true
mca.placeholder = "ff02::cca6:c0f9:e182:5359"
mca.datatype = "ip6addr"
mca:depends("proto", "ahcp")
port = s:taboption("ahcp", Value, "port", translate("Port"))
port.optional = true
port.placeholder = 5359
port.datatype = "port"
port:depends("proto", "ahcp")
fam = s:taboption("ahcp", ListValue, "_family", translate("Protocol family"))
fam:value("", translate("IPv4 and IPv6"))
fam:value("ipv4", translate("IPv4 only"))
fam:value("ipv6", translate("IPv6 only"))
fam:depends("proto", "ahcp")
function fam.cfgvalue(self, section)
local v4 = m.uci:get_bool("network", section, "ipv4_only")
local v6 = m.uci:get_bool("network", 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("network", section, "ipv4_only", "true")
m.uci:delete("network", section, "ipv6_only")
elseif value == "ipv6" then
m.uci:set("network", section, "ipv6_only", "true")
m.uci:delete("network", section, "ipv4_only")
end
end
function fam.remove(self, section)
m.uci:delete("network", section, "ipv4_only")
m.uci:delete("network", section, "ipv6_only")
end
nodns = s:taboption("ahcp", Flag, "no_dns", translate("Disable DNS setup"))
nodns.optional = true
nodns.enabled = "true"
nodns.disabled = "false"
nodns.default = nodns.disabled
nodns:depends("proto", "ahcp")
ltime = s:taboption("ahcp", Value, "lease_time", translate("Lease validity time"))
ltime.optional = true
ltime.placeholder = 3666
ltime.datatype = "uinteger"
ltime:depends("proto", "ahcp")
end
if net:proto() ~= "relay" then
s2 = m:section(TypedSection, "alias", translate("IP-Aliases"))