summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile47
-rw-r--r--config.mk10
-rw-r--r--dhcp-controller.lua121
-rw-r--r--dhcp-editnet-html.lsp23
-rw-r--r--dhcp-home-html.lsp61
-rw-r--r--dhcp-model.lua142
-rw-r--r--dhcp-view-html.lsp18
-rw-r--r--dhcp.menu3
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