summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dhcp-controller.lua47
-rw-r--r--dhcp-createnet-html.lsp12
-rw-r--r--dhcp-editnet-html.lsp9
-rw-r--r--dhcp-model.lua109
-rw-r--r--dhcp-view-html.lsp4
5 files changed, 143 insertions, 38 deletions
diff --git a/dhcp-controller.lua b/dhcp-controller.lua
index 35014c4..4135364 100644
--- a/dhcp-controller.lua
+++ b/dhcp-controller.lua
@@ -54,22 +54,12 @@ editnet = function ( self )
end
if self.clientdata.cmd == "Update" then
- net = { name = { label="Name", value=self.model.nonil(self.clientdata.name), type="message" },
- defleasetime = { label="Default Lease Time", value=self.model.nonil(self.clientdata.defleasetime), type="text" },
- maxleasetime = { label="Maximum Lease Time", value=self.model.nonil(self.clientdata.maxleasetime), type="text" },
- gateway = { label="Gateway", value=self.model.nonil(self.clientdata.gateway), type="text" },
- domainname = { label="Domainname", value=self.model.nonil(self.clientdata.domainname), type="text" },
- dnssrv1 = { label="DNS Server 1", value=self.model.nonil(self.clientdata.dnssrv1), type="text" },
- dnssrv2 = { label="DNS Server 2", value=self.model.nonil(self.clientdata.dnssrv2), type="text" },
- subnet = { label="Subnet", value=self.model.nonil(self.clientdata.subnet), type="text" },
- netmask = { label="Netmask", value=self.model.nonil(self.clientdata.netmask), type="text" },
- leaserangestart = { label="Lease Range Start", value=self.model.nonil(self.clientdata.leaserangestart), type="text" },
- leaserangeend = { label="Lease Range End", value=self.model.nonil(self.clientdata.leaserangeend), type="text" },
- wpad = { label="Web Proxy Auto Discovery", value=self.model.nonil(self.clientdata.wpad),
- type="select", option = { "yes", "no"} }
- }
- self.model.subnet_write( net )
- return ( cfe({ option = option, value = net, error = { value = nil, fields = nil }}) )
+ tmp = self.cientdata
+ net = self.model.create_new_net( tmp.name, tmp.defleasetime, tmp.maxleasetime, tmp.gateway,
+ tmp.domainname, tmp.dnssrv1, tmp.dnssrv2, tmp.subnet, tmp.netmask, tmp.leaserangestart,
+ tmp.leaserangeend, tmp.wpad )
+ errcode, net = self.model.subnet_write( net )
+ return ( cfe({ option = option, value = net, errcode = errcode }) )
end
net = self.model.subnet_read( self.clientdata.network );
@@ -89,25 +79,16 @@ createnet = function ( self )
extra = ""
}
- net = { name = { label="Name", value=self.model.nonil(self.clientdata.name), type="message" },
- defleasetime = { label="Default Lease Time", value=self.model.nonil(self.clientdata.defleasetime), type="text" },
- maxleasetime = { label="Maximum Lease Time", value=self.model.nonil(self.clientdata.maxleasetime), type="text" },
- gateway = { label="Gateway", value=self.model.nonil(self.clientdata.gateway), type="text" },
- domainname = { label="Domainname", value=self.model.nonil(self.clientdata.domainname), type="text" },
- dnssrv1 = { label="DNS Server 1", value=self.model.nonil(self.clientdata.dnssrv1), type="text" },
- dnssrv2 = { label="DNS Server 2", value=self.model.nonil(self.clientdata.dnssrv2), type="text" },
- subnet = { label="Subnet", value=self.model.nonil(self.clientdata.subnet), type="text" },
- netmask = { label="Netmask", value=self.model.nonil(self.clientdata.netmask), type="text" },
- leaserangestart = { label="Lease Range Start", value=self.model.nonil(self.clientdata.leaserangestart), type="text" },
- leaserangeend = { label="Lease Range End", value=self.model.nonil(self.clientdata.leaserangeend), type="text" },
- wpad = { label="Web Proxy Auto Discovery", value=self.model.nonil(self.clientdata.wpad),
- type="select", option = { "yes", "no"} }
- }
-
if self.clientdata.cmd == "new" then
- return ( cfe({ option = option, value = net, error = { value = nil, fields = nil }}) )
+ net = self.model.create_new_net( "<new>", nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil )
+ return ( cfe({ option = option, value = net, errcode = { msg = "", fields = nil }}) )
elseif self.clientdata.cmd == "create" then
- return ( cfe({ option = option, value = net, error = { value = nil, fields = nil }}) )
+ tmp = self.clientdata
+ net = self.model.create_new_net( tmp.name, tmp.defleasetime, tmp.maxleasetime,
+ tmp.gateway, tmp.domainname, tmp.dnssrv1, tmp.dnssrv2, tmp.subnet,
+ tmp.netmask, tmp.leaserangestart, tmp.leaserangeend, tmp.wpad )
+ errcode, net = self.model.subnet_create( net )
+ return ( cfe({ option = option, value = net, errcode = errcode }) )
end
end
diff --git a/dhcp-createnet-html.lsp b/dhcp-createnet-html.lsp
index aadc2c8..c3775f9 100644
--- a/dhcp-createnet-html.lsp
+++ b/dhcp-createnet-html.lsp
@@ -6,6 +6,12 @@
<h1>Create New Subnet</h1>
<h2>Subnet: new</h2>
+<?
+ if #form.errcode.msg > 0 then
+ io.write("<pre style=\"color: #ff2020\">" .. form.errcode.msg .. "</pre><br>")
+ end
+?>
+
<form action="<? io.write(option.script .. option.prefix ..
option.controller .. "/" .. option.action .. option.extra) ?>" method="POST">
<table>
@@ -31,5 +37,7 @@
?>
</select>
</td></tr>
- <tr><td></td><td><input type=submit name=cmd value="create" style="width:300px"></form><form action="<? io.write(option.script .. option.prefix .. option.controller .. "/home") ?> method="POST">
-<input type=submit name="cmd" value="back" style="width:300px"></form></td></tr></table>
+ <tr><td><nobr>Lease Range Start:</nobr></td><td><input type="text" name="leaserangestart" value="<? io.write(net.leaserangestart.value) ?>"></td></tr>
+ <tr><td><nobr>Lease Range End:</nobr></td><td><input type="text" name="leaserangeend" value="<? io.write(net.leaserangeend.value) ?>"></td></tr>
+ <tr><td></td><td><input type=submit name=cmd value="create" style="width:100px"></form><form action="<? io.write(option.script .. option.prefix .. option.controller .. "/home") ?> method="POST">
+<input type=submit name="cmd" value="back" style="width:100px"></form></td></tr></table>
diff --git a/dhcp-editnet-html.lsp b/dhcp-editnet-html.lsp
index 8330c31..e58bcd9 100644
--- a/dhcp-editnet-html.lsp
+++ b/dhcp-editnet-html.lsp
@@ -2,10 +2,17 @@
local form = ...
local option = form.option;
local net = form.value
+ local erroce = form.errcode
?>
<h1>Basic Configuration</h1>
<h2>Subnet: <? io.write(net.name.value) ?></h2>
+<?
+ if #errcode.msg > 0 then
+ io.write("<textarea style=\"width:600px\">" .. errcode.msg .. "</textarea><br>")
+ end
+?>
+
<form action="<? io.write(option.script .. option.prefix ..
option.controller .. "/" .. option.action .. option.extra) ?>" method="POST">
<input type="hidden" name="name" value="<? io.write(net.name.value) ?>">
@@ -31,5 +38,7 @@
?>
</select>
</td></tr>
+ <tr><td><nobr>Lease Range Start:</nobr></td><td><input type="text" name="leaserangestart" value="<? io.write(net.leaserangestart.value) ?>"></td></tr>
+ <tr><td><nobr>Lease Range End:</nobr></td><td><input type="text" name="leaserangeend" value="<? io.write(net.leaserangeend.value) ?>"></td></tr>
<tr><td></td><td><input type=submit name=cmd value="Update" style="width:300px"></form><form action="<? io.write(option.script .. option.prefix .. option.controller .. "/home") ?> method="POST">
<input type=submit name="cmd" value="Back" style="width:300px"></form></td></tr></table>
diff --git a/dhcp-model.lua b/dhcp-model.lua
index 4fca1a9..60fb86a 100644
--- a/dhcp-model.lua
+++ b/dhcp-model.lua
@@ -3,6 +3,7 @@
module (..., package.seeall)
require("lfs")
+require("validator")
local subnet = { }
local cfgdir = "/etc/dhcp/"
@@ -53,6 +54,10 @@ subnet_read = function( name )
end
subnet_write = function( net )
+ msg, fields = validate_network( net )
+ if #msg > 0 then
+ return cfe({ msg = msg, fields = fields }), net
+ end
local filename = cfgdir .. net.name.value .. ".subnet"
local file = io.open( filename, "w+" )
file:write( "def-lease-time: " .. net.defleasetime.value .. "\n" )
@@ -67,7 +72,87 @@ subnet_write = function( net )
file:write( "lease-range-end: " .. net.leaserangeend.value .. "\n" )
file:write( "wpad: " .. net.wpad.value .. "\n" )
file:close()
- return net
+ return cfe({ msg = "", fields = {}}), net
+end
+
+subnet_create = function( net )
+ if file_exists( net.name.value ) then
+ return cfe({ msg = "This subnet already exists!", fields = {}}), net
+ end
+ retcode, net = subnet_write( net )
+ return retcode, net
+end
+
+_tonumber = function( value )
+ ret = tonumber( value )
+ if (ret == nil) then
+ ret = 0
+ end
+ return ret
+end
+
+validate_network = function( net )
+ fields = {}
+ msg = ""
+ if #net.name.value < 4 then
+ table.insert(fields, "name")
+ msg = msg .. "Minimum network name length is 4 characters!\n"
+ end
+ if not validator.is_integer_in_range(_tonumber(net.defleasetime.value), 1800, 86400) then
+ table.insert(fields, "defleasetime")
+ msg = msg .. "Default-Lease-Time must be: 1800 < x < 86400\n"
+ end
+ if not validator.is_integer_in_range(_tonumber(net.maxleasetime.value), 1800, 86400) then
+ table.insert(fields, "maxleasetime")
+ msg = msg .. "Maximum-Lease-Time must be: 1800 < x < 86400\n"
+ end
+ if not validator.is_ipv4(net.gateway.value) then
+ table.insert(fields, "gateway")
+ msg = msg .. "Gateway: invalid IPv4 address!\n"
+ end
+ if not validator.is_ipv4(net.dnssrv1.value) then
+ table.insert(fields, "dnssrv1")
+ msg = msg .. "DNS Server 1: invalid IPv4 address!\n"
+ end
+ if not validator.is_ipv4(net.dnssrv2.value) then
+ if #net.dnssrv2.value > 0 then
+ table.insert(fields, "dnssrv2")
+ msg = msg .. "DNS Server 2: invalid IPv4 address!\n"
+ end
+ end
+ if not validator.is_ipv4(net.subnet.value) then
+ table.insert(fields, "subnet")
+ msg = msg .. "Subnet: invalid IPv4 address!\n"
+ end
+ if not validator.is_ipv4(net.netmask.value) then
+ table.insert(fields, "netmask")
+ msg = msg .. "Netmask: invalid IPv4 address!\n"
+ end
+ if not validator.is_ipv4(net.leaserangestart.value) then
+ if #net.leaserangestart.value > 0 then
+ table.insert(fields, "leaserangestart")
+ msg = msg .. "Lease-Range-Start: invalid IPv4 address!\n"
+ end
+ end
+ if not validator.is_ipv4(net.leaserangeend.value) then
+ if #net.leaserangeend.value > 0 then
+ table.insert(fields, "leaserangeend")
+ msg = msg .. "Lease-Range-End: invalid IPv4 address!\n"
+ end
+ end
+
+ return msg, fields
+end
+
+file_exists = function( filename )
+ retval = false
+ fn = cfgdir .. net.name.value .. ".subnet"
+ file = io.open( fn, "r" )
+ if file ~= nil then
+ retval = true
+ file:close()
+ end
+ return retval
end
read_file = function ( filename )
@@ -154,4 +239,26 @@ get_subnets = function ()
return retval
end
+
+create_new_net = function( name, defleasetime, maxleasetime, gateway, domainname, dnssrv1, dnssrv2, subnet, netmask, leaserangestart, leaserangeend, wpad )
+ net = { name = { label="Name", value=nonil(name), type="message" },
+ defleasetime = { label="Default Lease Time", value=nonil(defleasetime), type="text" },
+ maxleasetime = { label="Maximum Lease Time", value=nonil(maxleasetime), type="text" },
+ gateway = { label="Gateway", value=nonil(gateway), type="text" },
+ domainname = { label="Domainname", value=nonil(domainname), type="text" },
+ dnssrv1 = { label="DNS Server 1", value=nonil(dnssrv1), type="text" },
+ dnssrv2 = { label="DNS Server 2", value=nonil(dnssrv2), type="text" },
+ subnet = { label="Subnet", value=nonil(subnet), type="text" },
+ netmask = { label="Netmask", value=nonil(netmask), type="text" },
+ leaserangestart = { label="Lease Range Start", value=nonil(leaserangestart), type="text" },
+ leaserangeend = { label="Lease Range End", value=nonil(leaserangeend), type="text" },
+ wpad = { label="Web Proxy Auto Discovery", value=nonil(wpad),
+ type="select", value=nonil(wpad), option = { "yes", "no"} }
+ }
+ if net.wpad.value == "" then
+ net.wpad.value = "no"
+ end
+
+ return net
+end
diff --git a/dhcp-view-html.lsp b/dhcp-view-html.lsp
index 34906fc..bc188c1 100644
--- a/dhcp-view-html.lsp
+++ b/dhcp-view-html.lsp
@@ -7,11 +7,11 @@
<table>
<tr><td>
-<textarea name=""><? io.write(value.contents.value) ?></textarea>
+<textarea name="" style="width:600px"><? io.write(value.contents.value) ?></textarea>
</td></tr>
<tr><td>
<form action="<? io.write(option.script .. option.prefix .. option.controller .. "/home") ?>" method="POST">
- <input type=submit name="cmd" value="Back">
+ <input type=submit name="cmd" value="Back" style="width:600px">
</form>
</td></tr>
</table>