In current 2.0BETA3, it seems that there's no way to write one's own
configuration settings into dhcpd.conf.  For example, if I want to
chain-load gPXE, there's nowhere to put the following:

if exists user-class and option user-class = "gPXE" {
        filename "http://www.lesaz.loc/netboot/pxelinux.0";;
} else {
        filename "gpxe.pxe";
}

I've added a "Custom DHCP configuration" that will be inserted at the
end of the subnet declaration.  To be honest, this feels a bit hackish
(why at that location), but I'm not sure of any better place to put it.

I did modify xmlparse.inc to make any name that ends as "_cdata" a CDATA
type, as that was the most logical way that I could think of to maintain
newlines.  If there's a better way, please correct it (or let me know
and I'll correct it).

Jonathan
diff -urb new/etc/inc/services.inc custom/etc/inc/services.inc
--- new/etc/inc/services.inc	2010-07-12 13:25:12.450445328 +0300
+++ custom/etc/inc/services.inc	2010-07-12 16:17:42.112987836 +0300
@@ -315,11 +315,13 @@
       		}
 		}
 		
+		/* Custom dhcp data goes here */
+		$dhcpdconf .= $dhcpifconf['custom_cdata'];
+
 		$dhcpdconf .= <<<EOD
 }
 
 EOD;
-
 		/* add static mappings */
 		if (is_array($dhcpifconf['staticmap'])) {
 
diff -urb new/etc/inc/xmlparse.inc custom/etc/inc/xmlparse.inc
--- new/etc/inc/xmlparse.inc	2010-07-12 15:21:49.444916086 +0300
+++ custom/etc/inc/xmlparse.inc	2010-07-12 15:20:23.244665781 +0300
@@ -261,7 +261,7 @@
 						$xmlconfig .= str_repeat("\t", $indent);
 						if((is_bool($cval) && $cval == true) || ($cval === "")) {
 							$xmlconfig .= "<$ent/>\n";
-						} else if (substr($ent, 0, 5) == "descr") {
+						} else if (substr($ent, 0, 5) == "descr" or substr($ent, -6) == "_cdata") {
 							$xmlconfig .= "<$ent><![CDATA[" . htmlentities($cval) . "]]></$ent>\n";
 						} else {
 							$xmlconfig .= "<$ent>" . htmlentities($cval) . "</$ent>\n";
@@ -285,7 +285,7 @@
 				$xmlconfig .= "<$ent/>\n";
 			} else if (!is_bool($val)) {
 				$xmlconfig .= str_repeat("\t", $indent);
-				if (substr($ent, 0, 5) == "descr")
+				if (substr($ent, 0, 5) == "descr" or substr($ent, -6) == "_cdata")
 					$xmlconfig .= "<$ent><![CDATA[" . htmlentities($val) . "]]></$ent>\n";
 				else
 					$xmlconfig .= "<$ent>" . htmlentities($val) . "</$ent>\n";
diff -urb new/usr/local/www/services_dhcp.php custom/usr/local/www/services_dhcp.php
--- new/usr/local/www/services_dhcp.php	2010-07-12 13:56:38.907508685 +0300
+++ custom/usr/local/www/services_dhcp.php	2010-07-12 16:21:51.004988888 +0300
@@ -155,6 +155,7 @@
 	$pconfig['rootpath'] = $config['dhcpd'][$if]['rootpath'];
 	$pconfig['failover_peerip'] = $config['dhcpd'][$if]['failover_peerip'];
 	$pconfig['netmask'] = $config['dhcpd'][$if]['netmask'];
+	$pconfig['custom_cdata'] = $config['dhcpd'][$if]['custom_cdata'];
 	$pconfig['numberoptions'] = $config['dhcpd'][$if]['numberoptions'];
 	if (!is_array($config['dhcpd'][$if]['staticmap']))
 		$config['dhcpd'][$if]['staticmap'] = array();
@@ -321,6 +322,7 @@
 		$config['dhcpd'][$if]['next-server'] = $_POST['nextserver'];
 		$config['dhcpd'][$if]['filename'] = $_POST['filename'];
 		$config['dhcpd'][$if]['rootpath'] = $_POST['rootpath'];
+		$config['dhcpd'][$if]['custom_cdata'] = $_POST['custom_cdata'];
 
 		// Handle the custom options rowhelper
 		if(isset($config['dhcpd'][$if]['numberoptions']['item']))
@@ -457,6 +459,12 @@
 		aodiv = document.getElementById('shownetboot');
 		aodiv.style.display = "block";
 	}
+
+	function show_custom_config() {
+		document.getElementById("showcustombox").innerHTML='';
+		aodiv = document.getElementById('showcustom');
+		aodiv.style.display = "block";
+	}
 </script>
 
 <body link="#0000CC" vlink="#0000CC" alink="#0000CC">
@@ -793,6 +801,18 @@
 				</td>
 			</tr>
 			<tr>
+			<td width="22%" valign="top" class="vncell">Custom DHCP configuration</td>
+			<td width="78%" class="vtable">
+                                <div id="showcustombox">
+                                        <input type="button" onClick="show_custom_config()" value="Advanced"></input> - Show custom DHCP configuration</a>
+                                </div>
+                                <div id="showcustom" style="display:none">
+                                        <textarea name="custom_cdata" cols="65" rows="4" class="formpre" id="custom_cdata"><?=htmlspecialchars($pconfig['custom_cdata']);?></textarea><br>
+                                        Use this to input any ISC DHCP settings that don't fit in the above settings.  If you don't know what this means, don't use this.  Settings here are not checked for validity, so you may break your DHCP setup.  The contents of this box will be inserted into dhcpd.conf as part of the subnet.
+                                </div>
+                        </td>
+			</tr>
+			<tr>
 			<td width="22%" valign="top">&nbsp;</td>
 			<td width="78%">
 				<input name="if" type="hidden" value="<?=$if;?>">

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to