diff options
-rw-r--r-- | dhcp-controller.lua | 47 | ||||
-rw-r--r-- | dhcp-createnet-html.lsp | 12 | ||||
-rw-r--r-- | dhcp-editnet-html.lsp | 9 | ||||
-rw-r--r-- | dhcp-model.lua | 109 | ||||
-rw-r--r-- | dhcp-view-html.lsp | 4 |
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> |