summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Brodmann <andreas.brodmann@gmail.com>2007-11-13 12:25:31 +0000
committerAndreas Brodmann <andreas.brodmann@gmail.com>2007-11-13 12:25:31 +0000
commit32d2ee7237a11a56918ba4c5f69870826f8dc7f8 (patch)
tree64175b6bd76923de1be214cecb6accba93a68484
parenta5145638e7e9d2d846c5c8dc9cf089435a9f6f1f (diff)
downloadacf-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--Makefile1
-rw-r--r--dhcp-controller.lua45
-rw-r--r--dhcp-createnet-html.lsp14
-rw-r--r--dhcp-delnet-html.lsp30
-rw-r--r--dhcp-editnet-html.lsp21
-rw-r--r--dhcp-home-html.lsp5
-rw-r--r--dhcp-model.lua186
7 files changed, 239 insertions, 63 deletions
diff --git a/Makefile b/Makefile
index 90b40f2..332a627 100644
--- a/Makefile
+++ b/Makefile
@@ -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 .. "&lt;new&gt; 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