diff options
-rw-r--r-- | Makefile | 47 | ||||
-rw-r--r-- | config.mk | 10 | ||||
-rw-r--r-- | dhcp-controller.lua | 121 | ||||
-rw-r--r-- | dhcp-editnet-html.lsp | 23 | ||||
-rw-r--r-- | dhcp-home-html.lsp | 61 | ||||
-rw-r--r-- | dhcp-model.lua | 142 | ||||
-rw-r--r-- | dhcp-view-html.lsp | 18 | ||||
-rw-r--r-- | dhcp.menu | 3 |
8 files changed, 425 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..eb2fb69 --- /dev/null +++ b/Makefile @@ -0,0 +1,47 @@ +APP_NAME=dhcp +PACKAGE=acf-$(APP_NAME) +VERSION=1.0_alpha1 + +APP_DIST=dhcp-controller.lua \ + dhcp-editnet-html.lsp \ + dhcp-home-html.lsp \ + dhcp-view-html.lsp \ + dhcp-model.lua \ + dhcp.menu + +EXTRA_DIST=README Makefile config.mk + +DISTFILES=$(APP_DIST) $(EXTRA_DIST) + +TAR=tar + +P=$(PACKAGE)-$(VERSION) +tarball=$(P).tar.bz2 +install_dir=$(DESTDIR)/$(appdir)/$(APP_NAME) + +all: +clean: + rm -rf $(tarball) $(P) + +dist: $(tarball) + +install: + mkdir -p "$(install_dir)" + cp -a $(APP_DIST) "$(install_dir)" + +$(tarball): $(DISTFILES) + rm -rf $(P) + mkdir -p $(P) + cp $(DISTFILES) $(P) + $(TAR) -jcf $@ $(P) + rm -rf $(P) + +# target that creates a tar package, unpacks is and install from package +dist-install: $(tarball) + $(TAR) -jxf $(tarball) + $(MAKE) -C $(P) install DESTDIR=$(DESTDIR) + rm -rf $(P) + +include config.mk + +.PHONY: all clean dist install dist-install diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..45f4d21 --- /dev/null +++ b/config.mk @@ -0,0 +1,10 @@ +prefix=/usr +datadir=${prefix}/share +sysconfdir=${prefix}/etc +localstatedir=${prefix}/var +acfdir=${datadir}/acf +wwwdir=${acfdir}/www +cgibindir=${acfdir}/cgi-bin +appdir=${acfdir}/app +acflibdir=${acfdir}/lib +sessionsdir=${localstatedir}/lib/acf/sessions diff --git a/dhcp-controller.lua b/dhcp-controller.lua new file mode 100644 index 0000000..c0be37d --- /dev/null +++ b/dhcp-controller.lua @@ -0,0 +1,121 @@ +-- the dhcpd controller + +module (..., package.seeall) + +-- Cause an http redirect to our "read" action +-- We use the self.conf table because it already has prefix,controller,etc +-- The redir code is defined in the application error handler (acf-controller) +local list_redir = function (self) + self.conf.action = "home" + self.conf.type = "redir" + error (self.conf) +end + +local pvt = {} +mvc= {} +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) + end + pvt.parent_on_exec = parent.worker.mvc.post_exec + logit ("dhcpd controller on_load has finished") +end + + +mvc.pre_exec = function (self) + logit ("dhcpd-controller pre_exec activated") + -- pvt.parent_on_exec () +end + +mvc.post_exec = function ( self ) + logit ("dhcpd-controller post_exec activated") + return pvt.parent_on_exec() +end + +editnet = function ( self ) + + local net = {} + local option = { script = ENV["SCRIPT_NAME"], + prefix = self.conf.prefix, + controller = self.conf.controller, + action = self.conf.action, + extra = "" + } + + if self.clientdata.network then + if self.clientdata.network == "choose" then + list_redir(self) + end + end + + if self.clientdata.cmd then + 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="text" } + } + self.model.subnet_write( net ) + return ( cfe({ option = option, value = net, error = { value = nil, fields = nil }}) ) + end + end + + net = self.model.subnet_read( self.clientdata.network ); + return ( cfe({ option = option, value = net, error = { value=nil, fields=nil }}) ) +end + +home = function ( self ) + + local srvctrl = "" + if self.clientdata.srvcmd then + srvctrl = self.model.service_control(self.clientdata.srvcmd) + end + + local option = { script = ENV["SCRIPT_NAME"], + prefix = self.conf.prefix, + controller = self.conf.controller, + action = self.conf.action, + extra = "" + } + local info = { status = { value = "stopped" }, version = { value = self.model.get_dhcpd_version() }, srvctrl = { value = srvctrl} }; + if self.model.is_running( "dhcpd" ) then + info.status.value = "running" + end + + return ( cfe({ option = option, value = "", info = info }) ) +end + +view = function ( self ) + + local filename = "" + if self.clientdata.conf then + filename = "/etc/dhcp/dhcpd.conf" + elseif self.clientdata.leases then + filename = "/var/lib/dhcpd/dhcpd.leases"; + else + list_redir(self) + end + + local option = { script = ENV["SCRIPT_NAME"], + prefix = self.conf.prefix, + controller = self.conf.controller, + action = self.conf.action, + extra = "" + } + + local value = { filename = { value=filename }, + contents = { value=self.model.read_file(filename) } + } + + return ( cfe({ option = option, value = value }) ) +end + diff --git a/dhcp-editnet-html.lsp b/dhcp-editnet-html.lsp new file mode 100644 index 0000000..296d614 --- /dev/null +++ b/dhcp-editnet-html.lsp @@ -0,0 +1,23 @@ +<? + local form = ... + local option = form.option; + local net = form.value +?> +<h1>Basic Configuration</h1> +<h2>Subnet: <? io.write(net.name.value) ?></h2> + +<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) ?>"> +<table> + <tr><td><nobr>Subnet:</nobr></td><td><input type="text" name="subnet" value="<? io.write(net.subnet.value) ?>"></td></tr> + <tr><td><nobr>Netmask:</nobr></td><td><input type="text" name="netmask" value="<? io.write(net.netmask.value) ?>"></td></tr> + <tr><td><nobr>Gateway:</nobr></td><td><input type="text" name="gateway" value="<? io.write(net.gateway.value) ?>"></td></tr> + <tr><td><nobr>DNS Server 1:</nobr></td><td><input type="text" name="dnssrv1" value="<? io.write(net.dnssrv1.value) ?>"></td></tr> + <tr><td><nobr>DNS Server 2:</nobr></td><td><input type="text" name="dnssrv2" value="<? io.write(net.dnssrv2.value) ?>"></td></tr> + <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><input type="text" name="wpad" value="<? io.write(net.wpad.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-home-html.lsp b/dhcp-home-html.lsp new file mode 100644 index 0000000..25757ee --- /dev/null +++ b/dhcp-home-html.lsp @@ -0,0 +1,61 @@ +<? + local form = ... + local data = form.option +?> +<h1>Home</h1> +<h2>DHCPd - Status</h2> +<? io.write(form.info.version.value) ?> is: <b><? io.write( form.info.status.value ) ?></b><br><br> + +<h2>DHCPd - Daemon Control</h2> +<table> +<form action="" method="POST"> +<tr> +<td><input type=submit name="srvcmd" value="start" style="width:100px"></td> +<td><input type=submit name="srvcmd" value="stop" style="width:100px"></td> +<td><input type=submit name="srvcmd" value="restart" style="width:100px"></td> +</tr> +</form> +</table> +<pre><? io.write( form.info.srvctrl.value ) ?></pre><br> + +<h2>DHCPd - General</h2> +<table> +<form action="<? io.write(data.script .. data.prefix .. data.controller .. "/settings") ?>" method="POST"> +<tr><td><input type=submit name="cmd" value="Edit Settings" style="width:200px"></td></tr> +</form> +</table><br> + +<h2>DHCPd - View Files</h2> +<table> +<form action="<? io.write(data.script .. data.prefix .. data.controller .. "/view") ?>" method="POST"> +<tr><td><input type=submit name="conf" value="View dhcpd.conf" style="width:200px"></td></tr> +<tr><td><input type=submit name="leases" value="View dhcpd.leases" style="width:200px"></td></tr> +</form> +</table><br> + +<h2>DHCPd - Add New Subnet</h2> +<table> +<form action="" method="POST"> +<tr> + <td>Network Name</td> + <td><input type=text name="name" value="" style="width:300px"></td> + <td><input type=submit name="cmd" value="Create" style="width:200px"></td> +</tr> +</form> +</table> +<br><br> + +<h2>DHCPd - Edit Subnet</h2> +<table> +<form action="<? io.write(data.script .. data.prefix .. data.controller .. "/editnet") ?>" method="POST"> +<tr><td>Network to modify<td> +<td><select name="network" size="1"> + <option value="choose">-- Choose Network --</option> + <option>default</option> + <option>ism</option> + <option>telephony</option> + <option>housecontrol</option> +</select></td> +<td><input type=submit name="cmd" value="Edit" style="width:200px"></td> +</form> +</table> diff --git a/dhcp-model.lua b/dhcp-model.lua new file mode 100644 index 0000000..2a952f7 --- /dev/null +++ b/dhcp-model.lua @@ -0,0 +1,142 @@ +-- acf model for /etc/dhcp/* +-- Copyright(c) 2007 A. Brodmann - Licensed under terms of GPL2 +module (..., package.seeall) + +local subnet = { } +local cfgdir = "/etc/dhcp/" + +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" }) + } + + for line in io.lines(filename) do + if (string.sub(line, 1, 15) == "def-lease-time:") then + net.defleasetime.value = string.sub(line, 17) + elseif (string.sub(line, 1, 15) == "max-lease-time:") then + net.maxleasetime.value = string.sub(line, 17) + elseif (string.sub(line, 1, 8) == "gateway:") then + net.gateway.value = string.sub(line, 10) + elseif (string.sub(line, 1, 12) == "domain-name:") then + net.domainname.value = string.sub(line, 14) + elseif (string.sub(line, 1, 10) == "dns-srv-1:") then + net.dnssrv1.value = string.sub(line, 12) + elseif (string.sub(line, 1, 10) == "dns-srv-2:") then + net.dnssrv2.value = string.sub(line, 12) + elseif (string.sub(line, 1, 7) == "subnet:") then + net.subnet.value = string.sub(line, 9) + elseif (string.sub(line, 1, 8) == "netmask:") then + net.netmask.value = string.sub(line, 10) + elseif (string.sub(line, 1, 18) == "lease-range-start:") then + net.leaserangestart.value = string.sub(line, 20) + elseif (string.sub(line, 1, 16) == "lease-range-end:") then + net.leaserangeend.value = string.sub(line, 18) + elseif (string.sub(line, 1, 5) == "wpad:") then + net.wpad.value = string.sub(line, 7) + end + end + + return net +end + +subnet_write = function( net ) + local filename = cfgdir .. net.name.value .. ".subnet" + local file = io.open( filename, "w+" ) + file:write( "def-lease-time: " .. net.defleasetime.value .. "\n" ) + file:write( "max-lease-time: " .. net.maxleasetime.value .. "\n" ) + file:write( "gateway: " .. net.gateway.value .. "\n" ) + file:write( "domain-name: " .. net.domainname.value .. "\n" ) + file:write( "dns-srv-1: " .. net.dnssrv1.value .. "\n" ) + file:write( "dns-srv-2: " .. net.dnssrv2.value .. "\n" ) + file:write( "subnet: " .. net.subnet.value .. "\n" ) + file:write( "netmask: " .. net.netmask.value .. "\n" ) + file:write( "lease-range-start: " .. net.leaserangestart.value .. "\n" ) + file:write( "lease-range-end: " .. net.leaserangeend.value .. "\n" ) + file:write( "wpad: " .. net.wpad.value .. "\n" ) + file:close() + return net +end + +read_file = function ( filename ) + local contents = "" + local line = "" + local file = io.open( filename, "r" ) + if file ~= nil then + line = file:read( "*l" ) + while line ~= nil do + contents = contents .. "\n" .. line + line = file:read( "*l" ) + end + file:close() + else + contents = "\n Error: File not found!\n\n" + end + + return contents +end + +is_running = function( process ) + local retval = false + local file = io.popen("pidof " .. process) + if file ~= nil then + local line = file:read( "*l" ) + file:close() + if #line > 0 then + retval = true + end + end + + return retval +end + +get_dhcpd_version = function() + local retval = "dhcpd" + local file = io.popen("/usr/sbin/dhcpd --version") + if file ~= nil then + local line = file:read( "*a" ) + if #line > 0 then + retval = line + end + file:close() + end + + return retval +end + +service_control = function ( command ) + + local retval = "" + local line = "" + local file = io.popen( "/etc/init.d/dhcpd " .. command ) + if file ~= nil then + line = file:read( "*l" ) + while line ~= nil do + retval = retval .. "\n" .. line + line = file:read( "*l" ) + end + file:close() + end + + return retval +end + +function nonil( value ) + local retval = "" + if value ~= nil then + retval = value + end + + return retval +end + diff --git a/dhcp-view-html.lsp b/dhcp-view-html.lsp new file mode 100644 index 0000000..34906fc --- /dev/null +++ b/dhcp-view-html.lsp @@ -0,0 +1,18 @@ +<? + local form = ... + local option = form.option + local value = form.value +?> +<h1>View <? io.write(value.filename.value) ?></h1> + +<table> +<tr><td> +<textarea name=""><? 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"> +</form> +</td></tr> +</table> + diff --git a/dhcp.menu b/dhcp.menu new file mode 100644 index 0000000..c180961 --- /dev/null +++ b/dhcp.menu @@ -0,0 +1,3 @@ +# Prefix and controller are already known at this point +# Cat Group Tab Action +Networking DHCP Server Home home |