diff options
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | dhcp-controller.lua | 25 | ||||
-rw-r--r-- | dhcp-model.lua | 92 | ||||
-rw-r--r-- | dhcp-settings-html.lsp | 24 |
4 files changed, 138 insertions, 4 deletions
@@ -8,6 +8,7 @@ APP_DIST=dhcp-controller.lua \ dhcp-createnet-html.lsp \ dhcp-view-html.lsp \ dhcp-dep-html.lsp \ + dhcp-settings-html.lsp \ dhcp-model.lua \ dhcp.menu diff --git a/dhcp-controller.lua b/dhcp-controller.lua index 0542150..cca9a98 100644 --- a/dhcp-controller.lua +++ b/dhcp-controller.lua @@ -49,6 +49,31 @@ dep = function ( self ) return ( cfe ({ msg = msg }) ) end +settings = function ( self ) + + if not self.clientdata.cmd then + list_redir(self) + end + + local settings = {} + local option = { script = ENV["SCRIPT_NAME"], + prefix = self.conf.prefix, + controller = self.conf.controller, + action = self.conf.action, + extra = "" + } + + if self.clientdata.cmd == "update" then + tmp = self.clientdata + settings = self.model.create_new_settings( tmp.defleasetime, tmp.maxleasetime, tmp.domainname ) + errcode, settings = self.model.update_settings( settings ) + return ( cfe ({ option = option, value = settings, errcode = errcode })) + else + settings = self.model.read_settings() + return ( cfe ({ option = option, value = settings, errcode = { msg = "", fields={} }}) ) + end +end + editnet = function ( self ) if not self.clientdata.cmd then diff --git a/dhcp-model.lua b/dhcp-model.lua index 90374a9..544f1b4 100644 --- a/dhcp-model.lua +++ b/dhcp-model.lua @@ -84,6 +84,24 @@ subnet_read = function( name ) return net end +read_settings = function() + local filename = cfgdir .. "globalsettings.conf" + local settings = create_new_settings( nil, nil, nil ) + if file_exists( filename ) then + for line in io.lines(filename) do + if (string.sub(line, 1, 15) == "def-lease-time:") then + settings.defleasetime.value = string.sub(line, 17) + elseif (string.sub(line, 1, 15) == "max-lease-time:") then + settings.maxleasetime.value = string.sub(line, 17) + elseif (string.sub(line, 1, 12) == "domain-name:") then + settings.domainname.value = string.sub(line, 14) + end + end + end + + return settings +end + subnet_write = function( net ) msg, fields = validate_network( net ) if #msg > 0 then @@ -106,8 +124,23 @@ subnet_write = function( net ) return cfe({ msg = "", fields = {}}), net end +update_settings = function ( settings ) + + msg, fields = validate_settings ( settings ) + if #msg > 0 then + return cfe({ msg = msg, fields = fields }), settings + end + local filename = cfgdir .. "globalsettings.conf" + local file = io.open( filename, "w+" ) + file:write( "def-lease-time: " .. settings.defleasetime.value .. "\n" ) + file:write( "max-lease-time: " .. settings.maxleasetime.value .. "\n" ) + file:write( "domain-name: " .. settings.domainname.value .. "\n" ) + return cfe({ msg = "", fields = {}}), settings +end + + subnet_create = function( net ) - if file_exists( net.name.value ) then + if file_exists( cfgdir .. net.name.value .. ".subnet" ) then return cfe({ msg = "This subnet already exists!", fields = {}}), net end retcode, net = subnet_write( net ) @@ -123,7 +156,7 @@ _tonumber = function( value ) end validate_network = function( net ) - fields = { "none" } + fields = {} msg = "" if #net.name.value < 4 then table.insert(fields, "name") @@ -181,9 +214,8 @@ end file_exists = function( filename ) retval = false - fn = cfgdir .. net.name.value .. ".subnet" lpos = require "posix" - ptr, msg, code = lpos.access(fn) + ptr, msg, code = lpos.access( filename ) if ptr ~= nil then retval = true end @@ -296,4 +328,56 @@ create_new_net = function( name, defleasetime, maxleasetime, gateway, domainname return net end + +create_new_settings = function( defleasetime, maxleasetime, domainname ) + settings = { domainname = { label="Domainname", type="text", value=nonil(domainname) }, + defleasetime = { label="Default Lease Time", type="text", value=nonil(defleasetime) }, + maxleasetime = { label="Maximum Lease Time", type="text", value=nonil(maxleasetime) } + } + return settings +end + +validate_settings = function ( settings ) + + msg = "" + fields = {} + + if not validator.is_integer_in_range(_tonumber(settings.defleasetime.value), 1800, 86400) then + msg = msg .. "Default Lease Time: Out of range 1800 < x < 86400 or not integer\n" + table.insert( fields, "defleasetime" ) + end + if not validator.is_integer_in_range(_tonumber(settings.maxleasetime.value), 1800, 86400) then + msg = msg .. "Maximum Lease Time: Out of range 1800 < x < 86400 or not integer\n" + table.insert( fields, "maxleasetime" ) + end + if not is_valid_hostname( settings.domainname.value ) then + if #settings.domainname.value > 0 then + msg = msg .. "Invalid domainname: valid chars are 'a..z', '0..9', '.', '-'\n" + table.insert( fields, "domainname" ) + end + end + + return msg, fields +end + +is_valid_hostname = function ( hostname ) + + local retval = true + + name = string.lower( hostname ) + lap = 1 + while lap <= #name do + chr = string.sub(name, lap, lap) + if (chr >= "a" and chr <= "z") or + (chr >= "0" and chr <= "9") or + (chr == ".") or (chr == "-") then + + else + retval = false + end + lap = lap + 1 + end + + return retval +end diff --git a/dhcp-settings-html.lsp b/dhcp-settings-html.lsp new file mode 100644 index 0000000..73b377d --- /dev/null +++ b/dhcp-settings-html.lsp @@ -0,0 +1,24 @@ +<? + local form = ... + local option = form.option + local settings = form.value + local errcode = form.errcode +?> +<h1>Global Settings</h1> + +<? + if #errcode.msg > 0 then + io.write("<pre style=\"color: #ff2020\">" .. errcode.msg .. "</pre><br>") + end +?> + +<form action="<? io.write(option.script .. option.prefix .. + option.controller .. "/" .. option.action .. option.extra) ?>" method="POST"> +<table> + <tr><td><nobr>Default Lease Time:</nobr></td><td><input type="text" name="defleasetime" value="<? io.write(settings.defleasetime.value) ?>"></td></tr> + <tr><td><nobr>Maximum Lease Time:</nobr></td><td><input type="text" name="maxleasetime" value="<? io.write(settings.maxleasetime.value) ?>"></td></tr> + <tr><td><nobr>Domain Name:</nobr></td><td><input type="text" name="domainname" value="<? io.write(settings.domainname.value) ?>"></td></tr> + <tr><td></td><td><input type=submit name=cmd value="update" 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> + |