summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Brodmann <andreas.brodmann@gmail.com>2007-11-15 23:45:25 +0000
committerAndreas Brodmann <andreas.brodmann@gmail.com>2007-11-15 23:45:25 +0000
commitab94e4fd57a3ab52d36d5cadbdb7ce5216a78f70 (patch)
tree65e3a7dbf07dd801d0b5a65eee3ec23e00fd11ae
parent32d2ee7237a11a56918ba4c5f69870826f8dc7f8 (diff)
downloadacf-dhcp-ab94e4fd57a3ab52d36d5cadbdb7ce5216a78f70.tar.bz2
acf-dhcp-ab94e4fd57a3ab52d36d5cadbdb7ce5216a78f70.tar.xz
/acf/dhcp: integrated special hosts (fixed ip's, known mac's, etc.)
git-svn-id: svn://svn.alpinelinux.org/acf/dhcp/trunk@311 ab2d0c66-481e-0410-8bed-d214d4d58bed
-rw-r--r--dhcp-controller.lua6
-rw-r--r--dhcp-editnet-html.lsp26
-rw-r--r--dhcp-model.lua210
3 files changed, 216 insertions, 26 deletions
diff --git a/dhcp-controller.lua b/dhcp-controller.lua
index 5e7df8f..664cd52 100644
--- a/dhcp-controller.lua
+++ b/dhcp-controller.lua
@@ -127,7 +127,7 @@ editnet = function ( self )
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 )
+ tmp.leaserangeend, tmp.wpad, tmp.spechosts )
errcode, net = self.model.subnet_write( net )
return ( cfe({ option = option, value = net, errcode = errcode }) )
end
@@ -150,13 +150,13 @@ createnet = function ( self )
}
if self.clientdata.cmd == "new" then
- net = self.model.create_new_net( "<new>", nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil )
+ net = self.model.create_new_net( "<new>", nil, 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
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 )
+ tmp.netmask, tmp.leaserangestart, tmp.leaserangeend, tmp.wpad, "" )
errcode, net = self.model.subnet_create( net )
if #errcode.msg == 0 then
self.conf.type = "redir"
diff --git a/dhcp-editnet-html.lsp b/dhcp-editnet-html.lsp
index 44d13be..ea281a0 100644
--- a/dhcp-editnet-html.lsp
+++ b/dhcp-editnet-html.lsp
@@ -28,10 +28,24 @@
<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 .. "/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>
+</td></tr></table>
+
+<br><br>
+<h2>Subnet: Special Hosts</h2>
+Enter one host per line in the format: <i>hostname;ip;mac;comment</i><br>
+<table>
+<tr><td>Hostname</td><td>[a-z], [0-9], -</td></tr>
+<tr><td>IP</td><td>xxx.xxx.xxx.xxx</td></tr>
+<tr><td>MAC</td><td>XX:XX:XX:XX:XX:XX</td></tr>
+</table>
+<table>
+<tr><td><textarea name="spechosts" style="width:600px;"><? io.write( net.spechosts.value ) ?></textarea></td></tr>
+<tr><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>
+</form>
diff --git a/dhcp-model.lua b/dhcp-model.lua
index 9a0839c..ceb4390 100644
--- a/dhcp-model.lua
+++ b/dhcp-model.lua
@@ -2,11 +2,55 @@
-- Copyright(c) 2007 A. Brodmann - Licensed under terms of GPL2
module (..., package.seeall)
+--- get additional libraries
require("validator")
local subnet = {}
local cfgdir = "/etc/dhcp/"
+--- the tokenizer functions - must be dislocated into a library later
+tokenizer = {}
+
+tokenizer.new = function( str, delim )
+ local token = {}
+ token.value = str;
+ token.delim = delim;
+ token.pos = 1
+ return token
+end
+
+tokenizer.pos = function( value, substr, pos )
+ local retval = pos
+ local done = false
+ while not done and retval <= #value do
+ if string.sub( value, retval, retval ) == substr then
+ done = true
+ else
+ retval = retval + 1
+ end
+ end
+
+ return retval
+end
+
+tokenizer.next = function( token )
+ if token.pos > #token.value then
+ return token, nil
+ end
+
+ local strpos = tokenizer.pos( token.value, token.delim, token.pos )
+ retval = string.sub(token.value, token.pos, strpos-1)
+ if retval == token.delim then
+ retval = ""
+ token.pos = token.pos + 1
+ else
+ token.pos = strpos + 1
+ end
+
+ return token, retval
+end
+---
+
dep_check = function ()
icode = 0
@@ -124,7 +168,59 @@ config_generate = function()
return msg
end
- io.close( tmpfile )
+ --- generate special hosts
+ subnets = get_subnets()
+ for k,v in ipairs( subnets ) do
+ spechostsfile = io.open( cfgdir .. v .. ".spechosts", "r" )
+ if spechostsfile ~= nil then
+ spechosts = spechostsfile:read( "*a" )
+ if spechosts == nil then
+ spechostsfile:close()
+ tmpfile:close()
+ os.remove( tmpfilename )
+ msg = "Configuration Generation Failed!\n\n" ..
+ "Reason: failed to read special hosts file for '" .. v .. "'"
+ return msg
+ end
+ msg = validate_spechosts( spechosts )
+ if #msg > 0 then
+ spechostsfile:close()
+ tmpfile:close()
+ os.remove( tmpfilename )
+ msg = "Configuration Generation Failed!\n\n" ..
+ "Reason: " .. msg
+ return msg
+ end
+
+ --- loop through all hosts
+ tmpfile:write("group {\n")
+ done = false
+ hosttoken = tokenizer.new( spechosts, "\n" )
+ while not done do
+ hosttoken, nexthost = tokenizer.next( hosttoken )
+ if nexthost ~= nil then
+ if string.sub( nexthost, 1, 1) ~= "#" then
+ spectoken = tokenizer.new( nexthost, ";" )
+ spectoken, hostname = tokenizer.next( spectoken )
+ spectoken, ip = tokenizer.next( spectoken )
+ spectoken, mac = tokenizer.next( spectoken )
+ spectoken, comment = tokenizer.next( spectoken )
+ tmpfile:write(" host " .. hostname .. " {\n")
+ tmpfile:write(" hardware ethernet " .. mac .. ";\n")
+ tmpfile:write(" fixed-address " .. ip .. ";\n")
+ tmpfile:write(" }\n")
+ end
+ else
+ done = true
+ end
+ end
+ spechostsfile:close()
+ tmpfile:write("}\n\n")
+ end
+ end
+ ---
+
+ tmpfile:close()
os.rename( tmpfilename, "/etc/dhcp/dhcpd.conf" )
return "Configuration Generation Successful!\n"
@@ -142,19 +238,7 @@ end
subnet_read = function( name )
local filename = cfgdir .. name .. ".subnet"
- local net = { name = cfe({ type="message", value=name, label="Name" }),
- defleasetime = cfe({ label="Default Lease Time" }),
- maxleasetime = cfe({ label="Maximum Lease Time" }),
- gateway = cfe({ label="Gateway"}),
- domainname = cfe({ label="Domainname" }),
- dnssrv1 = cfe({ label="DNS Server 1" }),
- dnssrv2 = cfe({ label="DNS Server 2" }),
- subnet = cfe({ label="Subnet" }),
- netmask = cfe({ label="Netmask" }),
- leaserangestart = cfe({ label="Lease Range Start" }),
- leaserangeend = cfe({ label="Lease Range End" }),
- wpad = cfe({ label="Web Proxy Auto Discovery", type="text", value="" })
- }
+ local net = create_new_net( name, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil )
for line in io.lines(filename) do
if (string.sub(line, 1, 15) == "def-lease-time:") then
@@ -182,9 +266,43 @@ subnet_read = function( name )
end
end
+ net.spechosts.value = subnet_get_spechosts( name )
+
return net
end
+subnet_get_spechosts = function( name )
+ local retval = ""
+ local filename = cfgdir .. name .. ".spechosts"
+ if file_exists( filename ) then
+ local file = io.open( filename, "r" )
+ if file ~= nil then
+ msg = file:read( "*a" )
+ if msg ~= nil then
+ retval = msg
+ end
+ file:close()
+ end
+ end
+
+ return retval
+end
+
+subnet_update_spechosts = function( name, spechosts )
+ local msg = "";
+ local filename = cfgdir .. name .. ".spechosts"
+
+ file, errmsg = io.open( filename, "wb+" )
+ if file == nil then
+ msg = "Error: Failed to open " .. filename .. "(" .. errmsg .. ")!"
+ else
+ file:write( spechosts )
+ file:close()
+ end
+
+ return msg
+end
+
read_settings = function()
local filename = cfgdir .. "globalsettings.conf"
local settings = create_new_settings( nil, nil, nil )
@@ -222,7 +340,64 @@ subnet_write = function( net )
file:write( "lease-range-end: " .. net.leaserangeend.value .. "\n" )
file:write( "wpad: " .. net.wpad.value .. "\n" )
file:close()
- return cfe({ msg = "", fields = {}}), net
+ spec_msg = validate_spechosts( net.spechosts.value )
+ if #spec_msg == 0 then
+ spec_msg = subnet_update_spechosts( net.name.value, net.spechosts.value )
+ if #spec_msg > 0 then
+ msg = spec_msg
+ table.insert( fields, "spechosts" )
+ end
+ else
+ msg = spec_msg
+ table.insert( fields, "spechosts" )
+ end
+ return cfe({ msg = msg, fields = {}}), net
+end
+
+validate_spechosts = function( spechosts )
+
+ local line = 1
+ local msg = ""
+ local done = false
+ hosttoken = tokenizer.new( spechosts, "\n")
+ while not done do
+ hosttoken, nexthost = tokenizer.next( hosttoken )
+ if nexthost ~= nil then
+ if string.sub(nexthost, 1, 1) ~= "#" then
+ fieldtoken = tokenizer.new( nexthost, ";")
+ fieldtoken, hostname = tokenizer.next( fieldtoken )
+ fieldtoken, ip = tokenizer.next( fieldtoken )
+ fieldtoken, mac = tokenizer.next( fieldtoken )
+ fieldtoken, comment = tokenizer.next( fieldtoken )
+ if hostname == nil then
+ msg = msg .. "hostname missing on line " .. line .. "!\n"
+ else
+ if not is_valid_hostname( hostname ) then
+ msg = msg .. "Invalid hostname on line " .. line .. "!\n"
+ end
+ end
+ if ip == nil then
+ msg = msg .. "ip missing on line " .. line .. "!\n"
+ else
+ if not validator.is_ipv4( ip ) then
+ msg = msg .. "Invalid ip on line " .. line .. "!\n"
+ end
+ end
+ if mac == nil then
+ msg = msg .. "mac missing on line " .. line .. "!\n"
+ else
+ if not validator.is_mac( mac ) then
+ msg = msg .. "Invalid mac on line " .. line .. "!\n"
+ end
+ end
+ end
+ line = line + 1
+ else
+ done = true
+ end
+ end
+
+ return msg
end
update_settings = function ( settings )
@@ -420,7 +595,7 @@ get_subnets = function ()
return retval
end
-create_new_net = function( name, defleasetime, maxleasetime, gateway, domainname, dnssrv1, dnssrv2, subnet, netmask, leaserangestart, leaserangeend, wpad )
+create_new_net = function( name, defleasetime, maxleasetime, gateway, domainname, dnssrv1, dnssrv2, subnet, netmask, leaserangestart, leaserangeend, wpad, spechosts )
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" },
@@ -432,7 +607,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), value=nonil(wpad) }
+ wpad = { label="Web Proxy Auto Discovery", value=nonil(wpad), type="text" },
+ spechosts = { label="Special Hosts Config", value=nonil(spechosts), type="text" }
}
return net