diff options
author | Andreas Brodmann <andreas.brodmann@gmail.com> | 2007-11-13 12:25:31 +0000 |
---|---|---|
committer | Andreas Brodmann <andreas.brodmann@gmail.com> | 2007-11-13 12:25:31 +0000 |
commit | 32d2ee7237a11a56918ba4c5f69870826f8dc7f8 (patch) | |
tree | 64175b6bd76923de1be214cecb6accba93a68484 | |
parent | a5145638e7e9d2d846c5c8dc9cf089435a9f6f1f (diff) | |
download | acf-dhcp-32d2ee7237a11a56918ba4c5f69870826f8dc7f8.tar.bz2 acf-dhcp-32d2ee7237a11a56918ba4c5f69870826f8dc7f8.tar.xz |
working beta release of dhcp config - special hosts config yet missing
git-svn-id: svn://svn.alpinelinux.org/acf/dhcp/trunk@300 ab2d0c66-481e-0410-8bed-d214d4d58bed
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | dhcp-controller.lua | 45 | ||||
-rw-r--r-- | dhcp-createnet-html.lsp | 14 | ||||
-rw-r--r-- | dhcp-delnet-html.lsp | 30 | ||||
-rw-r--r-- | dhcp-editnet-html.lsp | 21 | ||||
-rw-r--r-- | dhcp-home-html.lsp | 5 | ||||
-rw-r--r-- | dhcp-model.lua | 186 |
7 files changed, 239 insertions, 63 deletions
@@ -6,6 +6,7 @@ APP_DIST=dhcp-controller.lua \ dhcp-editnet-html.lsp \ dhcp-home-html.lsp \ dhcp-createnet-html.lsp \ + dhcp-delnet-html.lsp \ dhcp-view-html.lsp \ dhcp-dep-html.lsp \ dhcp-settings-html.lsp \ diff --git a/dhcp-controller.lua b/dhcp-controller.lua index cca9a98..5e7df8f 100644 --- a/dhcp-controller.lua +++ b/dhcp-controller.lua @@ -13,7 +13,7 @@ end local pvt = {} mvc= {} -mvc.on_load = function(self, parent) +mvc.on_load = function( self, parent ) -- If they try to run a bogus action, send them to read if ( rawget(self.worker, self.conf.action) == nil ) then list_redir(self) @@ -23,17 +23,17 @@ mvc.on_load = function(self, parent) end -mvc.pre_exec = function (self) +mvc.pre_exec = function( self ) logit ("dhcpd-controller pre_exec activated") -- pvt.parent_on_exec () end -mvc.post_exec = function ( self ) +mvc.post_exec = function( self ) logit ("dhcpd-controller post_exec activated") return pvt.parent_on_exec() end -dep = function ( self ) +dep = function( self ) -- do the dependancy check msg = self.model.dep_check() @@ -49,7 +49,36 @@ dep = function ( self ) return ( cfe ({ msg = msg }) ) end -settings = function ( self ) +delnet = function( self ) + + local net = {} + + if not self.clientdata.cmd then + list_redir(self) + end + if not self.clientdata.network then + list_redir(self) + end + + local option = { script = ENV["SCRIPT_NAME"], + prefix = self.conf.prefix, + controller = self.conf.controller, + action = self.conf.action, + extra = "" + } + + if self.clientdata.cmd == "delete" then + if self.clientdata.confirm == "yes" then + msg = self.model.subnet_delete( self.clientdata.network ) + list_redir(self) + else + net = self.model.subnet_read( self.clientdata.network ); + return ( cfe({ option = option, value = net, msg = msg }) ) + end + end +end + +settings = function( self ) if not self.clientdata.cmd then list_redir(self) @@ -156,6 +185,10 @@ home = function ( self ) srvctrl = self.model.service_control(self.clientdata.srvcmd) end end + + if self.clientdata.cmd == "generate" then + genmsg = self.model.config_generate() + end local option = { script = ENV["SCRIPT_NAME"], prefix = self.conf.prefix, @@ -169,7 +202,7 @@ home = function ( self ) end info.subnets = self.model.get_subnets() - return ( cfe({ option = option, value = "", info = info }) ) + return ( cfe({ option = option, value = "", genmsg = genmsg, info = info }) ) end view = function ( self ) diff --git a/dhcp-createnet-html.lsp b/dhcp-createnet-html.lsp index c3775f9..2fe5a45 100644 --- a/dhcp-createnet-html.lsp +++ b/dhcp-createnet-html.lsp @@ -24,19 +24,7 @@ <tr><td><nobr>Default Lease Time:</nobr></td><td><input type="text" name="defleasetime" value="<? io.write(net.defleasetime.value) ?>"></td></tr> <tr><td><nobr>Maximum Lease Time:</nobr></td><td><input type="text" name="maxleasetime" value="<? io.write(net.maxleasetime.value) ?>"></td></tr> <tr><td><nobr>Domain Name:</nobr></td><td><input type="text" name="domainname" value="<? io.write(net.domainname.value) ?>"></td></tr> - <tr><td><nobr>WPAD:</nobr></td><td> - <select name="wpad" size="1"> -<? - for k,v in ipairs(net.wpad.option) do - if (v == net.wpad.value) then - io.write("<option selected>" .. v .."</option>") - else - io.write("<option>" .. v .. "</option>") - end - end -?> - </select> - </td></tr> + <tr><td><nobr>WPAD:</nobr></td><td><input type="text" name="wpad" value="<? io.write(net.wpad.value) ?>"></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="create" style="width:100px"></form><form action="<? io.write(option.script .. option.prefix .. option.controller .. "/home") ?> method="POST"> diff --git a/dhcp-delnet-html.lsp b/dhcp-delnet-html.lsp new file mode 100644 index 0000000..3b666c5 --- /dev/null +++ b/dhcp-delnet-html.lsp @@ -0,0 +1,30 @@ +<? + local form = ... + local option = form.option; + local net = form.value + local msg = form.msg +?> +<h1>DHCPd Delete Subnet</h1> +<h2>Subnet: <? io.write(net.name.value) ?></h2> +<br> +<h3>Do you really want to delete this subnet?</h3><br> + +<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) ?>"> +<input type="hidden" name="network" value="<? io.write(net.name.value) ?>"> +<input type="hidden" name="confirm" value="yes"> +<table> + <tr><td><nobr>Subnet:</nobr></td><td>"<? io.write(net.subnet.value) ?>"</td></tr> + <tr><td><nobr>Netmask:</nobr></td><td>"<? io.write(net.netmask.value) ?>"</td></tr> + <tr><td><nobr>Gateway:</nobr></td><td>"<? io.write(net.gateway.value) ?>"</td></tr> + <tr><td><nobr>DNS Server 1:</nobr></td><td>"<? io.write(net.dnssrv1.value) ?>"</td></tr> + <tr><td><nobr>DNS Server 2:</nobr></td><td>"<? io.write(net.dnssrv2.value) ?>"</td></tr> + <tr><td><nobr>Default Lease Time:</nobr></td><td>"<? io.write(net.defleasetime.value) ?>"</td></tr> + <tr><td><nobr>Maximum Lease Time:</nobr></td><td>"<? io.write(net.maxleasetime.value) ?>"</td></tr> + <tr><td><nobr>Domain Name:</nobr></td><td>"<? io.write(net.domainname.value) ?>"</td></tr> + <tr><td><nobr>WPAD:</nobr></td><td>"<? io.write(net.wpad.value) ?>"</td></tr> + <tr><td><nobr>Lease Range Start:</nobr></td><td>"<? io.write(net.leaserangestart.value) ?>"</td></tr> + <tr><td><nobr>Lease Range End:</nobr></td><td>"<? io.write(net.leaserangeend.value) ?>"</td></tr> + <tr><td></td><td><input type=submit name=cmd value="delete" 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 31397d9..44d13be 100644 --- a/dhcp-editnet-html.lsp +++ b/dhcp-editnet-html.lsp @@ -25,20 +25,13 @@ <tr><td><nobr>Default Lease Time:</nobr></td><td><input type="text" name="defleasetime" value="<? io.write(net.defleasetime.value) ?>"></td></tr> <tr><td><nobr>Maximum Lease Time:</nobr></td><td><input type="text" name="maxleasetime" value="<? io.write(net.maxleasetime.value) ?>"></td></tr> <tr><td><nobr>Domain Name:</nobr></td><td><input type="text" name="domainname" value="<? io.write(net.domainname.value) ?>"></td></tr> - <tr><td><nobr>WPAD:</nobr></td><td> - <select name="wpad" size="1"> -<? - for k,v in ipairs(net.wpad.option) do - if (v == net.wpad.value) then - io.write("<option selected>" .. v .."</option>") - else - io.write("<option>" .. v .. "</option>") - end - end -?> - </select> - </td></tr> + <tr><td><nobr>WPAD:</nobr></td><td><input type="text" name="wpad" value="<? io.write(net.wpad.value) ?>"></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:100px"></form><form action="<? io.write(option.script .. option.prefix .. option.controller .. "/home") ?> method="POST"> + <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 .. "/delnet") ?>" method="POST"> + <input type=submit name="cmd" value="delete" style="width:100px"> + <input type=hidden name="network" value="<? io.write( net.name.value ) ?>"> + </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-home-html.lsp b/dhcp-home-html.lsp index 7a45b42..faf6c6a 100644 --- a/dhcp-home-html.lsp +++ b/dhcp-home-html.lsp @@ -21,9 +21,10 @@ <h2>DHCPd - Generate Configuration File</h2> <table> <form action="<? io.write(data.script .. data.prefix .. data.controller .. "/home") ?>" method="POST"> -<tr><td><input type=submit name="generate" value="generate" style="width:100px"></td></tr> +<tr><td><input type=submit name="cmd" value="generate" style="width:100px"></td></tr> </form> -</table><br> +</table> +<? if form.genmsg ~= nil then io.write( "<pre style=\"color: #ff2020\">" .. form.genmsg .. "</pre>" ) end ?><br> <h2>DHCPd - Global Settings</h2> <table> diff --git a/dhcp-model.lua b/dhcp-model.lua index ca02a08..9a0839c 100644 --- a/dhcp-model.lua +++ b/dhcp-model.lua @@ -2,10 +2,9 @@ -- Copyright(c) 2007 A. Brodmann - Licensed under terms of GPL2 module (..., package.seeall) -require("lfs") require("validator") -local subnet = { } +local subnet = {} local cfgdir = "/etc/dhcp/" dep_check = function () @@ -39,6 +38,108 @@ dep_check = function () return retval end +config_generate = function() + + msg = "" + tmpfilename = os.tmpname() + + -- create tmp config file + local tmpfile = io.open( tmpfilename, "w+" ) + + -- get, validate and write global settings to tmp config file + settings = read_settings() + s_msg, s_fields = validate_settings( settings ) + if #s_msg > 0 then + tmpfile:close() + os.remove( tmpfilename ) + msg = "Configuration Generation Failed!\n\n" .. + "Reason: Error in Global Settings\n" + return msg + end + + tmpfile:write( "authoritative;\n" ) + tmpfile:write( "ddns-update-style none;\n\n" ) + tmpfile:write( "option local-wpad-server code 252 = text;\n\n" ) + if #settings.domainname.value > 0 then + tmpfile:write( "option domain-name \"" .. settings.domainname.value .. "\";\n" ) + end + tmpfile:write( "default-lease-time " .. settings.defleasetime.value .. ";\n" ) + tmpfile:write( "max-lease-time " .. settings.maxleasetime.value .. ";\n\n" ) + + -- get, validate and write subnet configurations to tmp config file + subnets = get_subnets() + local numnetworks = 0 + for k,v in ipairs(subnets) do + numnetworks = numnetworks + 1 + net = subnet_read( v ) + sn_msg, sn_fields = validate_network( net ) + if #sn_msg > 0 then + tmpfile:close() + os.remove( tmpfilename ) + msg = "Configuration Generation Failed!\n\n" .. + "Reason: Error in Subnet '" .. v .. "'\n" + return msg + end + + tmpfile:write( "# " .. net.name.value .. "\n" ) + tmpfile:write( "subnet " .. net.subnet.value .. " netmask " .. net.netmask.value .. " {\n" ) + if #net.defleasetime.value > 0 then + tmpfile:write( " default-lease-time " .. net.defleasetime.value .. ";\n" ) + end + if #net.maxleasetime.value > 0 then + tmpfile:write( " max-lease-time " .. net.maxleasetime.value .. ";\n" ) + end + tmpfile:write( " option routers " .. net.gateway.value .. ";\n" ) + dnssrvrs = "" + if #net.dnssrv1.value > 0 then + dnssrvrs = net.dnssrv1.value + end + if #net.dnssrv2.value > 0 then + if #dnssrvrs > 0 then + dnssrvrs = dnssrvrs .. ", " .. net.dnssrv2.value + else + dnssrvrs = net.dnssrv2.value + end + end + if #dnssrvrs > 0 then + tmpfile:write( " option domain-name-servers " .. dnssrvrs .. ";\n" ) + end + if #net.domainname.value > 0 then + tmpfile:write( " option domain-name \"" .. net.domainname.value .. "\";\n" ) + end + if #net.leaserangestart.value > 0 then + tmpfile:write( " range " .. net.leaserangestart.value .. " " .. net.leaserangeend.value .. ";\n" ) + end + if #net.wpad.value > 0 then + tmpfile:write( " option local-wpad-server \"" .. net.wpad.value .. "\\n\";\n" ) + end + tmpfile:write( "}\n\n" ) + end + + if numnetworks <= 0 then + tmpfile:close() + os.remove( tmpfilename ) + msg = "Configuration Generation Failed!\n\n" .. + "Reason: No Subnets defined!\n" + return msg + end + + io.close( tmpfile ) + os.rename( tmpfilename, "/etc/dhcp/dhcpd.conf" ) + + return "Configuration Generation Successful!\n" +end + +subnet_delete = function( name ) + + local msg = "" + + local filename = cfgdir .. name .. ".subnet" + os.remove( filename ) + + return msg +end + subnet_read = function( name ) local filename = cfgdir .. name .. ".subnet" local net = { name = cfe({ type="message", value=name, label="Name" }), @@ -52,7 +153,7 @@ subnet_read = function( name ) netmask = cfe({ label="Netmask" }), leaserangestart = cfe({ label="Lease Range Start" }), leaserangeend = cfe({ label="Lease Range End" }), - wpad = cfe({ label="Web Proxy Auto Discovery", type="select", option = { "yes", "no" } }) + wpad = cfe({ label="Web Proxy Auto Discovery", type="text", value="" }) } for line in io.lines(filename) do @@ -158,29 +259,39 @@ end validate_network = function( net ) fields = {} msg = "" - if #net.name.value < 4 then + if #net.name.value < 3 then table.insert(fields, "name") - msg = msg .. "Minimum network name length is 4 characters!\n" + msg = msg .. "Minimum network name length is 3 characters!\n" + end + if not is_valid_netname( net.name.value ) then + table.insert( fields, "name" ) + msg = msg .. "Invalid network name: allowed characters are: 'a..z', '0..9', '-'\n" end if net.name.value == "<new>" then table.insert(fields, "name") msg = msg .. "<new> is not a valid network name!\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" + if #net.defleasetime.value > 0 then + 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 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" + if #net.maxleasetime.value > 0 then + 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 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" + if #net.dnssrv1.value > 0 then + if not validator.is_ipv4(net.dnssrv1.value) then + table.insert(fields, "dnssrv1") + msg = msg .. "DNS Server 1: invalid IPv4 address!\n" + end end if not validator.is_ipv4(net.dnssrv2.value) then if #net.dnssrv2.value > 0 then @@ -196,14 +307,14 @@ validate_network = function( net ) 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 + if #net.leaserangestart.value > 0 then + if not validator.is_ipv4(net.leaserangestart.value) 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 + if #net.leaserangeend.value > 0 then + if not validator.is_ipv4(net.leaserangeend.value) then table.insert(fields, "leaserangeend") msg = msg .. "Lease-Range-End: invalid IPv4 address!\n" end @@ -256,7 +367,7 @@ end get_dhcpd_version = function() local retval = "dhcpd" - local file = io.popen("/usr/sbin/dhcpd --version") + local file = io.popen("/usr/sbin/dhcpd --version 2>&1") if file ~= nil then local line = file:read( "*a" ) if #line > 0 then @@ -296,11 +407,13 @@ end get_subnets = function () - local retval = retval or {} + local retval = {} - for sn in lfs.dir( cfgdir ) do - if string.sub(sn, -7) == ".subnet" then - table.insert(retval, string.sub(sn, 1, -8)) + lpos = require "posix" + files = lpos.dir( "/etc/dhcp" ) + for k,v in ipairs(files) do + if string.sub(v, -7) == ".subnet" then + table.insert(retval, string.sub(v, 1, -8)) end end @@ -319,12 +432,8 @@ create_new_net = function( name, defleasetime, maxleasetime, gateway, domainname 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"} } + wpad = { label="Web Proxy Auto Discovery", value=nonil(wpad), value=nonil(wpad) } } - if net.wpad.value == "" then - net.wpad.value = "no" - end return net end @@ -380,4 +489,25 @@ is_valid_hostname = function ( hostname ) return retval end + +is_valid_netname = function ( netname ) + + local retval = true + + name = string.lower( netname ) + 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 == "-") then + + else + retval = false + end + lap = lap + 1 + end + + return retval +end |