diff --git a/lam/HISTORY b/lam/HISTORY
index b1e0653e..1c8f582f 100644
--- a/lam/HISTORY
+++ b/lam/HISTORY
@@ -1,4 +1,5 @@
August 2008 2.4.0
+ - added DHCP management (donated by Siedl networks GmbH)
- requires PHP 5.1.2
- MHash dependendy replaced by Hash
- save last selected server profile from login page
diff --git a/lam/docs/README.schema.txt b/lam/docs/README.schema.txt
index 8f24f432..7348b710 100644
--- a/lam/docs/README.schema.txt
+++ b/lam/docs/README.schema.txt
@@ -69,3 +69,10 @@
These modules are only available in LAM Pro.
Schema: core.schema
Source: Part of OpenLDAP installation
+
+
+ 12. DHCP (modules dhcp_settings, ddns, fixed_ip, range)
+
+ Schema: dhcp.schema
+ Source: http://kalamazoolinux.org/projects/awilliam/ldap.html
+
diff --git a/lam/lib/modules/dhcp_settings.inc b/lam/lib/modules/dhcp_settings.inc
new file mode 100644
index 00000000..7018618d
--- /dev/null
+++ b/lam/lib/modules/dhcp_settings.inc
@@ -0,0 +1,872 @@
+ 255 || ($i==3 && (!$subnet && $part[$i]<1)) || ($i==3 && (!$subnet && $part[$i]<0))) {
+ return false;
+ }
+ }
+ }
+ }
+ return true;
+ }
+}
+
+class dhcp_settings extends baseModule {
+
+ // Netbios node type:
+ public $netbios_node_type;
+
+ // All netbios node types:
+ private $all_netbios_node_types;
+
+ // ALL DHCP Settings
+ public $dhcpSettings;
+
+ // All DHCP Statements
+ public $dhcpStatements;
+
+ // DN (cn=192.168.15.0,dc=entwicklung,dc=sin)
+ public $dn="";
+
+ public $attributes;
+
+ /**
+ * Creates a new dhcp_settings object.
+ *
+ * @param string $scope account type
+ */
+ function __construct($scope) {
+ // List of well known rids
+ $this->all_netbios_node_types = array(
+ "1" => _("B-Node (0x01)"),
+ "2" => _("P-Node (0x02)"),
+ "4" => _("M-Node (0x04)"),
+ "8" => _("H-Node (0x08)")
+ );
+ // call parent constructor
+ parent::__construct($scope);
+ }
+
+ public function get_metaData() {
+
+ $return = array();
+ // manages host accounts
+ $return["account_types"] = array("dhcp");
+ // alias name
+ $return["alias"] = _("DHCP settings");
+ // this is a base module
+ $return["is_base"] = true;
+ // RDN attribute
+ $return["RDN"] = array("cn" => "high");
+ // LDAP filter
+ $return["ldap_filter"] = array();
+ // module dependencies
+ $return['dependencies'] = array('depends' => array(), 'conflicts' => array());
+ // managed object classes
+ $return['objectClasses'] = array();
+ // managed attributes
+ $return['attributes'] = array('cn','dhcpOtions');
+ // help Entries
+ $return['help'] = array(
+ 'domainname' => array(
+ "Headline" => _("Domain name"),
+ "Text" => _("The domain name of the subnet.")
+ ) , 'subnet' => array(
+ "Headline" => _("Subnet"),
+ "Text" => _("The name of the subnet. Example: 192.168.10.0")
+ ) , 'leasetime' => array(
+ "Headline" => _("Lease time"),
+ "Text" => _("The lease time specifies after how many seconds the client should request a new IP address.")
+ ) , 'max_leasetime' => array(
+ "Headline" => _("Maximum lease time"),
+ "Text" => _("The maximum lease time specifies after how many seconds the client must request a new IP address.")
+ ) , 'dns' => array(
+ "Headline" => _("DNS (Domain Name System)"),
+ "Text" => _("The IP address(es) of the DNS servers. Multiple addresses are separated by \",\". Example: 192.168.0.10, 192.168.0.11")
+ ) , 'gateway' => array(
+ "Headline" => _("Default gateway"),
+ "Text" => _("Packages are sent to the default gateway if the receiver does not reside in the same network. The default gateway routes them to the target network.")
+ ) , 'netbios' => array(
+ "Headline" => _("Netbios name server"),
+ "Text" => _("The IP address of the Netbios name server.")
+ ) , 'netbios_type' => array(
+ "Headline" => _("Netbios node type"),
+ "Text" => ("B-Node (0x01): Broadcast.
The client tries to find other workstations via broadcasting
+(works only inside the same collision domain, viz. the same subnet).
+
+P-Node (0x02): Point-To-Point
+The client contacts a Netbios name server (NBNS) from Microsoft Windows Name Service (WINS) for name resolution.
+
+M-Node (0x04): Mixed
+The node tries broadcasting first. If that fails then it tries WINS.
+
+H-Node (0x08): Hybrid
+The node tries WINS first. If that fails it tries broadcasting.
+
+By default, the nodes are configured as H-Nodes which fits for small networks. In large networks Point-to-Point (0x02) should be used.")
+ ) , 'subnetmask' => array(
+ "Headline" => _("Subnet mask"),
+ "Text" => _("The subnet mask of the network.")
+ ) , 'netmask' => array(
+ "Headline" => _("Net mask"),
+ "Text" => _("The net mask is derived from the subnet mask. If you leave this field empty then LAM will calculate it for you.")
+ ) );
+ return $return;
+ }
+
+ /**
+ * This function fills the message array.
+ */
+ public function load_Messages() {
+ $this->messages['cn'][0] = array('ERROR', _('No subnet entered.'));
+ $this->messages['cn'][1] = array('ERROR', _('The subnet is already in use.'));
+ $this->messages['cn'][2] = array('ERROR', _('The subnet is invalid.'));
+ $this->messages['dns'][0] = array('ERROR', _('You entered one or more invalid DNS servers.'));
+ $this->messages['lease_time'][0] = array('ERROR', _('The lease time is invalid.'));
+ $this->messages['routers'][0] = array('ERROR', _('The default gateway is invalid.'));
+ $this->messages['netbios'][0] = array('ERROR', _('The Netbios server is invalid.'));
+ $this->messages['netbios_node_type'][0] = array('ERROR', _('The entered Netbios node type does not exist.'));
+ $this->messages['max_lease_time'][0] = array('ERROR', _('The maximum lease time is invalid.'));
+ $this->messages['subnet'][0] = array('ERROR', _('The subnet mask is invalid.'));
+ $this->messages['netmask'][0] = array('INFO', _('The netmask was set.'));
+ $this->messages['netmask'][1] = array('INFO', _('The net mask was invalid and was corrected.'));
+ $this->messages['ranges_reload'][0] = array('INFO', _('The DHCP ranges were changed to fit for the new subnet.'));
+ $this->messages['ips_reload'][0] = array('INFO', 'The fixed IP addresses were changed to fit for the new subnet.');
+ $this->messages['domainname'][0] = array('ERROR', _('The domain name needs to be shorter than 15 characters.'));
+ $this->messages['domainname'][1] = array('ERROR', _('The domain name needs to have at least 3 characters.'));
+ $this->messages['domainname'][2] = array('ERROR', _('The domain name includes invalid characters. Valid characters are A-Z, a-z, 0-9, ".", "_","-".'));
+ }
+
+ /**
+ * This functions returns true if all needed settings are done.
+ *
+ * @return boolean true if LDAP operation can be done
+ */
+ public function module_complete() {
+
+ if ($_SESSION['account']->getAccountModule('dhcp_settings')->dn!=$_SESSION['config']->get_suffix('dhcp')) {
+ if (!check_ip($this->attributes['cn'][0],true)) return false;
+ if (array_pop(explode(".", $this->attributes['cn'][0]))!=0) return false;
+ if ($_SESSION['cache']->in_cache($this->attributes['cn'][0],'cn', array('dhcp')) && $this->orig['cn']['0']!=$this->attributes['cn'][0]) return false;
+ if (!check_ip($this->subnet, true)) return false;
+ }
+
+ if (!empty($this->dhcpSettings['domainname']) && (strlen($this->dhcpSettings['domainname'])>15 ||
+ strlen($this->dhcpSettings['domainname'])<3 || !eregi("^[A-Za-z0-9\._-]*$", $this->dhcpSettings['domainname']))) return false;
+ //DNS
+ if (!empty($this->dhcpSettings['dns'])) {
+ $ex = explode(",", $this->dhcpSettings['dns']);
+ $dns = "";
+ $is_first=true;
+ $invalid = false;
+ foreach($ex AS $string) {
+ if ($is_first) {
+ $dns .= $string;
+ $is_first=false;
+ }
+ else
+ {
+ $dns .= ",$string";
+ }
+ if (!check_ip($string)) {
+ $invalid = true;
+ }
+ }
+ if ($invalid) {
+ return false;
+ }
+ }
+ if (!empty($this->dhcpStatements['lease_time']) && !is_numeric($this->dhcpStatements['lease_time'])) return false;
+ if (!empty($this->dhcpStatements['max_lease_time']) && !is_numeric($this->dhcpStatements['max_lease_time'])) return false;
+ if (!empty($this->dhcpSettings['routers']) && !check_ip($this->dhcpSettings['routers'])) return false;
+ if (!empty($this->dhcpSettings['netbios']) && !check_ip($this->dhcpSettings['netbios'])) return false;
+
+ return true;
+ }
+
+ /* This function returns an array with 4 entries:
+ * array( DN1 ('add' => array($attr), 'remove' => array($attr), 'modify' => array($attr), 'lamdaemon' => array(cmds)), DN2 .... )
+ * DN is the DN to change. It may be possible to change several DNs,
+ * e.g. create a new user and add him to some groups via attribute memberUid
+ * add are attributes which have to be added to ldap entry
+ * remove are attributes which have to be removed from ldap entry
+ * lamdaemon are lamdaemon commands to modify homedir, quotas, ...
+ */
+ public function save_attributes() {
+ // Get easy attributes
+ $this->attributes['objectClass'][0] = "top";
+ $this->attributes['objectClass'][1] = "dhcpOptions";
+
+ if ($_SESSION['account']->getAccountModule('dhcp_settings')->dn!=$_SESSION['config']->get_suffix('dhcp')) {
+ // Standard Things
+ $this->attributes['objectClass'][2] = "dhcpSubnet";
+ // sort to array:
+ if (is_array($this->attributes['dhcpOption'])) {
+ $i = 0;
+ foreach($this->attributes['dhcpOption'] AS $key=>$value) {
+ $this->attributestmp['dhcpOption'][$i] = $this->attributes['dhcpOption'][$key];
+ $i++;
+ }
+ unset($this->attributes['dhcpOption']);
+ $this->attributes['dhcpOption'] = $this->attributestmp['dhcpOption'];
+ unset($this->attributestmp['dhcpOption']);
+ }
+ if (is_array($this->attributes['dhcpStatements'])) {
+ $i = 0;
+ foreach($this->attributes['dhcpStatements'] AS $key=>$value) {
+ $this->attributestmp['dhcpStatements'][$i] = $this->attributes['dhcpStatements'][$key];
+ $i++;
+ }
+ unset($this->attributes['dhcpStatements']);
+ $this->attributes['dhcpStatements'] = $this->attributestmp['dhcpStatements'];
+ unset($this->attributestmp['dhcpStatements']);
+ }
+ $return = $this->getAccountContainer()->save_module_attributes($this->attributes, $this->orig);
+ }
+ else
+ {
+ // Basicsettings...
+
+ if (!isset($this->getAccountContainer()->dn_already_edit)) {
+ $a = explode(",", $this->getAccountContainer()->dn);
+ unset($a[0]);
+ //$this->getAccountContainer()->dn = implode(",", $a);
+ $this->getAccountContainer()->dn_already_edit = true;
+ }
+
+ if (is_array($this->attributes['dhcpOption'])) {
+ $i = 0;
+ foreach($this->attributes['dhcpOption'] AS $key=>$value) {
+ $this->attributestmp['dhcpOption'][$i] = $this->attributes['dhcpOption'][$key];
+ $i++;
+ }
+ unset($this->attributes['dhcpOption']);
+ $this->attributes['dhcpOption'] = $this->attributestmp['dhcpOption'];
+ unset($this->attributestmp['dhcpOption']);
+ }
+ if (is_array($this->attributes['dhcpStatements'])) {
+ $i = 0;
+ foreach($this->attributes['dhcpStatements'] AS $key=>$value) {
+ $this->attributestmp['dhcpStatements'][$i] = $this->attributes['dhcpStatements'][$key];
+ $i++;
+ }
+ unset($this->attributes['dhcpStatements']);
+ $this->attributes['dhcpStatements'] = $this->attributestmp['dhcpStatements'];
+ unset($this->attributestmp['dhcpStatements']);
+ }
+
+ $return = $this->getAccountContainer()->save_module_attributes($this->attributes, $this->orig);
+
+ }
+
+ // Return attributes
+ return $return;
+ }
+
+ /**
+ * This function loads all needed LDAP attributes.
+ *
+ * @param array $attr list of attributes
+ */
+ function load_attributes($attr) {
+
+ parent::load_attributes($attr);
+ // Load DHCP Options:
+ $this->dn = ereg_replace("'", "", $_GET['DN']);
+
+ if (!is_array($attr['dhcpOption'])) {
+ $attr['dhcpOption'] = array();
+ }
+
+ // Alles aus den DDNS Bereich löschen:
+ /*if (!is_array($attr['dhcpStatements'])) {
+ $attr['dhcpStatements'] = array();
+ }
+
+ foreach($attr['dhcpStatements'] AS $index=>$value) {
+ $ex = explode(" ", $value);
+
+ if ($ex[0]=="ignore") {
+ unset($attr['dhcpStatements'][$index]);
+ }
+ if ($ex[0]=="include") {
+ unset($attr['dhcpStatements'][$index]);
+ }
+ if ($ex[0]=="ddns-update-style") {
+ unset($attr['dhcpStatements'][$index]);
+ }
+ if ($ex[0]=="update-static-leases") {
+ unset($attr['dhcpStatements'][$index]);
+ }
+ }
+ */
+ if (count($attr['dhcpStatements']) == 0) {
+ unset($attr['dhcpStatements']);
+ }
+
+ if (is_array($attr['dhcpStatements'])) {
+ foreach($attr['dhcpStatements'] AS $id=>$value) {
+ $ex = explode(" ", $value);
+ // Is default lease time?
+ if ($ex[0]=="default-lease-time") {
+ $this->dhcpStatements['lease_time'] = $ex[1];
+ }
+ // Is max lease time?
+ if ($ex[0]=="max-lease-time") {
+ $this->dhcpStatements['max_lease_time'] = $ex[1];
+ }
+ }
+ }
+
+ if (is_array($attr['dhcpOption'])) {
+ foreach($attr['dhcpOption'] AS $id=>$value) {
+ $ex = explode(" ", $value);
+ // Is domainname?
+ if ($ex[0]=="domain-name") {
+ $this->dhcpSettings['domainname'] = $ex[1];
+ $attr[] = $value;
+ }
+ // Is Gateway?
+ if ($ex[0]=="routers") {
+ $this->dhcpSettings['routers'] = $ex[1];
+ }
+ // Is subnetmask?
+ if ($ex[0]=="subnet-mask") {
+ $this->subnet = $ex[1];
+ }
+ // Is domainname?
+ if ($ex[0]=="domain-name") {
+ $this->dhcpSettings['domainname'] = ereg_replace("\"","", $ex[1]);
+ }
+ // Is netbios-name-servers?
+ if ($ex[0]=="domain-name-servers") {
+
+ $this->dhcpSettings['dns'] = $ex[1];
+ }
+ // Is netbios-node-type?
+ if ($ex[0]=="netbios-node-type") {
+ $this->netbios_node_type = $this->all_netbios_node_types[$ex[1]];
+ }
+ // Is dns?
+ if ($ex[0]=="netbios-name-servers") {
+ $this->dhcpSettings['netbios'] = $ex[1];
+ }
+ }
+ }
+
+ // Load DHCP Statements
+ if (is_array($attr['dhcpStatements'])) {
+ foreach($attr['dhcpStatements'] AS $id=>$value) {
+ $ex = explode(" ", $value);
+ // Is default lease time?
+ if ($ex[0]=="default-lease-time") {
+ $this->dhcpStatements['lease_time'] = $ex[1];
+ }
+ // Is max lease time?
+ if ($ex[0]=="max-lease-time") {
+ $this->dhcpStatements['max_lease_time'] = $ex[1];
+ }
+ }
+ }
+
+ if ($_SESSION['account']->getAccountModule('dhcp_settings')->dn!=$_SESSION['config']->get_suffix('dhcp')) {
+ if (!is_array($attr['dhcpNetMask'])) {
+ $attr['dhcpNetMask'] = array();
+ }
+
+ // Load DHCP netmask
+ foreach($attr['dhcpNetMask'] AS $id=>$value) {
+ $ex = explode(" ", $value);
+ // netmask
+ $this->attributes['dhcpNetMask'][0] = $value;
+ }
+ }
+
+ $this->orig = $attr;
+ $this->attributes = $attr;
+ }
+
+ /**
+ * Processes user input of the primary module page.
+ * It checks if all input values are correct and updates the associated LDAP attributes.
+ *
+ * @return array list of info/error messages
+ */
+ public function process_attributes() {
+ $errors = array();
+
+ // Check if cn is not empty
+ if ($_SESSION['config']->get_suffix('dhcp') != $this->getAccountContainer()->dn_orig) {
+ if (!empty($_POST['cn'])) $_POST['cn'] = trim($_POST['cn']);
+ if (empty($_POST['cn'])) {
+ $errors[] = $this->messages['cn'][0];
+ $this->attributes['cn'][0] = $_POST['cn'];
+ }
+ // Check, if cn is not already use:
+ elseif ( $_SESSION['cache']->in_cache($_POST['cn'],'cn', array('dhcp')) && $this->orig['cn']['0']!=$_POST['cn'] ) {
+ $errors[] = $this->messages['cn'][1];
+ $this->attributes['cn'][0] = $_POST['cn'];
+ }
+ elseif (!check_ip($_POST['cn'],true)) {
+ $errors[] = $this->messages['cn'][2];
+ $this->attributes['cn'][0] = $_POST['cn'];
+ }
+ elseif (array_pop(explode(".", $_POST['cn']))!=0) {
+ $errors[] = $this->messages['cn'][2];
+ $this->attributes['cn'][0] = $_POST['cn'];
+ }
+ else
+ {
+ $this->attributes['cn'][0] = $_POST['cn'];
+ // if the cn was edit, reload the Ranges:
+ if ($_SESSION['account']->getAccountModule('range')->reload_ranges())
+ $errors[] = $this->messages['ranges_reload'][0];
+ // if the cn was edit, reload the ips:
+ if ($_SESSION['account']->getAccountModule('fixed_ip')->reload_ips())
+ $errors[] = $this->messages['ips_reload'][0];
+ }
+ }
+
+ // Check domainname:
+ if (!empty($_POST['domainname'])) $_POST['domainname'] = trim($_POST['domainname']);
+ if (!empty($_POST['domainname'])) {
+ if (strlen($_POST['domainname'])>15) {
+ $errors[] = $this->messages['domainname'][0];
+ $this->dhcpSettings['domainname'] = $_POST['domainname'];
+ unset($this->attributes['dhcpOption'][5]);
+ }
+ elseif (strlen($_POST['domainname'])<3)
+ {
+ $errors[] = $this->messages['domainname'][1];
+ $this->dhcpSettings['domainname'] = $_POST['domainname'];
+ unset($this->attributes['dhcpOption'][5]);
+ }
+ elseif (eregi("^[A-Za-z0-9\._-]*$", $_POST['domainname'])) {
+ $this->dhcpSettings['domainname'] = $_POST['domainname'];
+ $this->attributes['dhcpOption'][5] = "domain-name \"".$_POST['domainname']."\"";
+ }
+ else
+ {
+ $errors[] = $this->messages['domainname'][2];
+ $this->dhcpSettings['domainname'] = $_POST['domainname'];
+ unset($this->attributes['dhcpOption'][5]);
+ }
+ }
+ else
+ {
+ $this->dhcpSettings['domainname'] = "";
+ unset($this->attributes['dhcpOption'][5]);
+ }
+
+ // Check DNS
+ if (!empty($_POST['dns'])) $_POST['dns'] = trim($_POST['dns']);
+ if (empty($_POST['dns'])) {
+ unset($this->attributes['dhcpOption'][0]);
+ $this->dhcpSettings['dns'] = "";
+ }
+ else
+ {
+ $ex = explode(",", $_POST['dns']);
+ $dns = "";
+ $is_first=true;
+ $invalid = false;
+ foreach($ex AS $string) {
+ if ($is_first) {
+ $dns .= $string;
+ $is_first=false;
+ }
+ else
+ {
+ $dns .= ",$string";
+ }
+
+ if (!check_ip($string)) {
+ $invalid = true;
+ }
+ }
+ if ($invalid) {
+ $errors[] = $this->messages['dns'][0];
+ $this->dhcpSettings['dns'] = $dns;
+ }
+ else
+ {
+ $this->dhcpSettings['dns'] = $dns;
+ $this->attributes['dhcpOption'][0] = "domain-name-servers ".$dns."";
+ }
+ }
+
+ // Lease Time
+ if (!empty($_POST['lease_time'])) $_POST['lease_time'] = trim($_POST['lease_time']);
+ if (!is_numeric($_POST['lease_time']) && !empty($_POST['lease_time'])) {
+ $errors[] = $this->messages['lease_time'][0];
+ $this->dhcpStatements['lease_time'] = $_POST['lease_time'];
+ unset($this->attributes['dhcpStatements'][0]);
+ }
+ elseif (empty($_POST['lease_time'])) {
+ unset($this->dhcpStatements['lease_time']);
+ unset($this->attributes['dhcpStatements'][0]);
+ }
+ else
+ {
+ $this->dhcpStatements['lease_time'] = $_POST['lease_time'];
+ $this->attributes['dhcpStatements'][0] = "default-lease-time ".$_POST['lease_time'];
+ }
+
+ // Max lease Time
+ if (!empty($_POST['max_lease_time'])) $_POST['max_lease_time'] = trim($_POST['max_lease_time']);
+ if (!is_numeric($_POST['max_lease_time']) && !empty($_POST['max_lease_time'])) {
+ $errors[] = $this->messages['max_lease_time'][0];
+ $this->dhcpStatements['max_lease_time'] = $_POST['max_lease_time'];
+ unset($this->attributes['dhcpStatements'][1]);
+ }
+ elseif (empty($_POST['max_lease_time'])) {
+ unset($this->dhcpStatements['max_lease_time']);
+ unset($this->attributes['dhcpStatements'][1]);
+ }
+ else
+ {
+ $this->dhcpStatements['max_lease_time'] = $_POST['max_lease_time'];
+ $this->attributes['dhcpStatements'][1] = "max-lease-time ".$_POST['max_lease_time'];
+ }
+
+ // Default Gateway
+ if (!empty($_POST['routers'])) $_POST['routers'] = trim($_POST['routers']);
+ if (!check_ip($_POST['routers']) && !empty($_POST['routers'])) {
+ $errors[] = $this->messages['routers'][0];
+ $this->dhcpSettings['routers'] = $_POST['routers'];
+ unset($this->attributes['dhcpOption'][1]);
+ }
+ elseif (empty($_POST['routers'])) {
+ unset($this->dhcpSettings['routers']);
+ unset($this->attributes['dhcpOption'][1]);
+ }
+ else
+ {
+ $this->dhcpSettings['routers'] = $_POST['routers'];
+ $this->attributes['dhcpOption'][1] = "routers ".$_POST['routers'];
+ }
+
+ // Netbios
+ if (!empty($_POST['netbios'])) $_POST['netbios'] = trim($_POST['netbios']);
+ if (!check_ip($_POST['netbios']) && !empty($_POST['netbios'])) {
+ $errors[] = $this->messages['netbios'][0];
+ $this->dhcpSettings['netbios'] = $_POST['netbios'];
+ unset($this->attributes['dhcpOption'][2]);
+ }
+ elseif (empty($_POST['netbios'])) {
+ // Nix tuhen
+ unset($this->attributes['dhcpOption'][2]);
+ }
+ else
+ {
+ $this->dhcpSettings['netbios'] = $_POST['netbios'];
+ $this->attributes['dhcpOption'][2] = "netbios-name-servers ".$_POST['netbios'];
+ }
+
+ // Netbios Node Type:
+ if (in_array($_POST['netbios_node_type'],$this->all_netbios_node_types)) {
+ $this->netbios_node_type = $_POST['netbios_node_type'];
+ // Nummer ermitteln
+ $ex = explode("x", $_POST['netbios_node_type']);
+ $ex = explode(")", $ex['1']);
+ $netbios_node_type = (int) $ex['0'];
+ $this->attributes['dhcpOption'][3] = "netbios-node-type ".$netbios_node_type;
+ }
+ else
+ {
+ $errors[] = $this->messages['netbios_node_type'][0];
+ unset($this->attributes['dhcpOption'][3]);
+ }
+ if ($_SESSION['account']->getAccountModule('dhcp_settings')->dn!=$_SESSION['config']->get_suffix('dhcp')) {
+ // Check subnet
+ $_POST['subnet'] = trim($_POST['subnet']);
+ if (!check_ip($_POST['subnet'], true)) {
+ $errors[] = $this->messages['subnet'][0];
+ $this->subnet = $_POST['subnet'];
+ unset($this->attributes['dhcpOption'][4]);
+ }
+ else
+ {
+ $this->subnet = $_POST['subnet'];
+ $this->attributes['dhcpOption'][4] = "subnet-mask ".$_POST['subnet'];
+ }
+
+ // Check Netmask, obly for Range:
+ $_POST['netmask'] = trim($_POST['netmask']);
+ // calculate netmask from subnet:
+ if (!empty($this->attributes['dhcpOption'][4])) {
+ $ex=explode(".", $_POST['subnet']);
+ $num = 0;
+ foreach($ex AS $mask) {
+ $binär = decbin($mask);
+ $num += substr_count($binär, 1);
+ }
+ if (empty($_POST['netmask'])) {
+ $errors[] = $this->messages['netmask'][0];
+ }
+ elseif ($num!=$_POST['netmask']) {
+ $errors[] = $this->messages['netmask'][1];
+ }
+ $this->attributes['dhcpNetMask'][0] = $num;
+ }
+ else
+ {
+ unset($this->attributes['dhcpNetMask'][0]);
+ }
+ }
+
+ return $errors;
+ }
+
+ /* This function will create the html-page
+ * to show a page with all attributes.
+ * It will output a complete html-table
+ */
+ public function display_html_attributes() {
+ // user name if no posixAccount
+ $modules = $_SESSION['config']->get_AccountModules($this->get_scope());
+
+ // Subnetz name
+ if ($_SESSION['config']->get_suffix('dhcp') == $this->getAccountContainer()->dn_orig) {
+ $return[] = array(
+ array('kind' => 'text', 'text' => _('Subnet') . ":* "),
+ array('kind' => 'text', 'text' => $this->attributes['cn'][0]),
+ array('kind' => 'help', 'value' => 'subnet', 'scope' => 'user'));
+ }
+ else
+ {
+ $return[] = array(
+ array('kind' => 'text', 'text' => _('Subnet') . ":* "),
+ array('kind' => 'input', 'name' => 'cn', 'value' => $this->attributes['cn'][0]),
+ array('kind' => 'help', 'value' => 'subnet', 'scope' => 'user'),
+ array('kind' => 'text', 'text' => " " . _('Example') . ": 192.168.10.0") );
+ }
+
+ // Domainname
+ $return[] = array(
+ array('kind' => 'text', 'text' => _('Domain name') . ": "),
+ array('kind' => 'input', 'name' => 'domainname', 'value' => $this->dhcpSettings['domainname']),
+ array('kind' => 'help', 'value' => 'domainname', 'scope' => 'user'));
+
+ // Lease Time
+ $return[] = array(
+ array('kind' => 'text', 'text' => _('Lease time') . ": "),
+ array('kind' => 'input', 'name' => 'lease_time', 'value' => $this->dhcpStatements['lease_time']),
+ array('kind' => 'help', 'value' => 'leasetime', 'scope' => 'user'));
+
+ // Max lease Time
+ $return[] = array(
+ array('kind' => 'text', 'text' => _('Maximum lease time') . ": "),
+ array('kind' => 'input', 'name' => 'max_lease_time', 'value' => $this->dhcpStatements['max_lease_time']),
+ array('kind' => 'help', 'value' => 'max_leasetime', 'scope' => 'user'));
+
+ // DNS
+ $return[] = array(
+ array('kind' => 'text', 'text' => _('DNS') . ": "),
+ array('kind' => 'input', 'name' => 'dns', 'value' => $this->dhcpSettings['dns']),
+ array('kind' => 'help', 'value' => 'dns', 'scope' => 'user'));
+
+ // Gateway
+ $return[] = array(
+ array('kind' => 'text', 'text' => _('Default gateway') . ": "),
+ array('kind' => 'input', 'name' => 'routers', 'value' => $this->dhcpSettings['routers']),
+ array('kind' => 'help', 'value' => 'gateway', 'scope' => 'user'));
+
+ // Netbios Name Server
+ $return[] = array(
+ array('kind' => 'text', 'text' => _('Netbios name server') . ": "),
+ array('kind' => 'input', 'name' => 'netbios', 'value' => $this->dhcpSettings['netbios']),
+ array('kind' => 'help', 'value' => 'netbios', 'scope' => 'user'));
+
+ // Netbios Node Type
+ if(empty($this->netbios_node_type)) $this->netbios_node_type = _("H-Node (0x08)");
+ $return[] = array(
+ array('kind' => 'text', 'text' => _('Netbios node type') . ": "),
+ array('kind' => 'select', 'name' => 'netbios_node_type', 'options' => $this->all_netbios_node_types, 'options_selected' => array($this->netbios_node_type)),
+ array('kind' => 'help', 'value' => 'netbios_type', 'scope' => 'user'));
+
+ if ($_SESSION['account']->getAccountModule('dhcp_settings')->dn!=$_SESSION['config']->get_suffix('dhcp')) {
+ // subnetmask
+ $return[] = array(
+ array('kind' => 'text', 'text' => _('Subnet mask') . ":* "),
+ array('kind' => 'input', 'name' => 'subnet', 'value' => $this->subnet),
+ array('kind' => 'help', 'value' => 'subnetmask', 'scope' => 'user'));
+
+ // Netmask
+ if ($this->type!=_("Fix IP")) {
+ $return[] = array(
+ array('kind' => 'text', 'text' => _('Net mask') . ":* "),
+ array('kind' => 'input', 'name' => 'netmask', 'value' => $this->attributes['dhcpNetMask'][0]),
+ array('kind' => 'help', 'value' => 'netmask', 'scope' => 'user'));
+ }
+ }
+
+ return $return;
+ }
+
+ /**
+ * Returns a list of elements for the account profiles.
+ *
+ * @return profile elements
+ */
+ function get_profileOptions() {
+ $return = array();
+
+ // Subnetz name
+ $return[] = array(
+ array('kind' => 'text', 'text' => _('Subnet') . ": "),
+ array('kind' => 'input', 'name' => 'cn', 'type'=>'text','value' => $this->attributes['cn'][0]),
+ array('kind' => 'help', 'value' => 'subnet', 'scope' => 'user'));
+
+ // Domainname
+ $return[] = array(
+ array('kind' => 'text', 'text' => _('Domain name') . ": "),
+ array('kind' => 'input', 'name' => 'domainname', 'type'=>'text','value' => $this->dhcpSettings['domainname']),
+ array('kind' => 'help', 'value' => 'domainname', 'scope' => 'user'));
+
+ // Lease Time
+ $return[] = array(
+ array('kind' => 'text', 'text' => _('Lease time') . ": "),
+ array('kind' => 'input', 'name' => 'lease_time', 'type'=>'text','value' => $this->dhcpStatements['lease_time']),
+ array('kind' => 'help', 'value' => 'leasetime', 'scope' => 'user'));
+
+ // Max lease Time
+ $return[] = array(
+ array('kind' => 'text', 'text' => _('Maximum lease time') . ": "),
+ array('kind' => 'input', 'name' => 'max_lease_time', 'type'=>'text','value' => $this->dhcpStatements['max_lease_time']),
+ array('kind' => 'help', 'value' => 'max_leasetime', 'scope' => 'user'));
+
+ // DNS
+ $return[] = array(
+ array('kind' => 'text', 'text' => _('DNS') . ": "),
+ array('kind' => 'input', 'name' => 'dns', 'type'=>'text','value' => $this->dhcpSettings['dns']),
+ array('kind' => 'help', 'value' => 'dns', 'scope' => 'user'));
+
+ // Gateway
+ $return[] = array(
+ array('kind' => 'text', 'text' => _('Default gateway') . ": "),
+ array('kind' => 'input', 'name' => 'routers', 'type'=>'text','value' => $this->dhcpSettings['routers']),
+ array('kind' => 'help', 'value' => 'gateway', 'scope' => 'user'));
+
+ // Netbios Name Server
+ $return[] = array(
+ array('kind' => 'text', 'text' => _('Netbios name server') . ": "),
+ array('kind' => 'input', 'name' => 'netbios', 'type'=>'text','value' => $this->dhcpSettings['netbios']),
+ array('kind' => 'help', 'value' => 'netbios', 'scope' => 'user'));
+
+ // Netbios Node Type
+ $return[] = array(
+ array('kind' => 'text', 'text' => _('Netbios node type') . ": "),
+ array('kind' => 'select', 'name' => 'netbios_node_type', 'options' => $this->all_netbios_node_types, 'options_selected' => array($this->netbios_node_type)),
+ array('kind' => 'help', 'value' => 'netbios_type', 'scope' => 'user'));
+ // subnetmask
+ $return[] = array(
+ array('kind' => 'text', 'text' => _('Subnet mask') . ": "),
+ array('kind' => 'input', 'name' => 'subnet', 'type'=>'text','value' => $this->subnet),
+ array('kind' => 'help', 'value' => 'subnetmask', 'scope' => 'user'));
+ return $return;
+ }
+
+ /**
+ * Loads the values of an account profile into internal variables.
+ *
+ * @param array $profile hash array with profile values (identifier => value)
+ */
+ function load_profile($profile) {
+ // profile mappings in meta data
+ parent::load_profile($profile);
+ $this->attributes['cn'][0] = $profile['cn'][0];
+
+ $this->dhcpSettings['domainname'] = $profile['domainname'][0];
+ $this->attributes['dhcpOption'][5] = "domain-name \"". $profile['domainname'][0]."\"";
+
+ $this->dhcpStatements['lease_time'] = $profile['lease_time'][0];
+ $this->attributes['dhcpStatements'][0] = "default-lease-time ".$profile['lease_time'][0];
+
+ $this->dhcpStatements['max_lease_time'] = $profile['max_lease_time'][0];
+ $this->attributes['dhcpStatements'][1] = "max-lease-time ".$profile['max_lease_time'][0];
+
+ $this->dhcpSettings['dns'] = $profile['dns'][0];
+ $this->attributes['dhcpOption'][0] = "domain-name-servers ". $profile['dns'][0];
+
+ $this->dhcpSettings['routers'] = $profile['routers'][0];
+ $this->attributes['dhcpOption'][1] = "routers ".$profile['routers'][0];
+
+ $this->dhcpSettings['netbios'] = $profile['netbios'][0];
+ $this->attributes['dhcpOption'][2] = "netbios-name-servers ".$profile['netbios'][0];
+
+ $this->netbios_node_type = $profile['netbios_node_type'][0];
+ $this->attributes['dhcpOption'][3] = "netbios-node-type ".((int) array_shift(explode("(", array_pop(explode("x", $profile['netbios_node_type'][0])))));
+ if ($_SESSION['account']->getAccountModule('dhcp_settings')->dn!=$_SESSION['config']->get_suffix('dhcp')) {
+ $this->subnet = $profile['subnet'][0];
+ $this->attributes['dhcpOption'][4] = "subnet-mask ". $profile['subnet'][0];
+
+ // calc the netmask:
+ $ex=explode(".", $this->subnet);
+ $num = 0;
+ foreach($ex AS $mask) {
+ $binär = decbin($mask);
+ $num += substr_count($binär, 1);
+ }
+ $this->attributes['dhcpNetMask'][0] = $num;
+ }
+ }
+}
+?>
\ No newline at end of file