diff --git a/lam/HISTORY b/lam/HISTORY index 019ae000..08be8570 100644 --- a/lam/HISTORY +++ b/lam/HISTORY @@ -4,6 +4,7 @@ September 2013 4.3 - Samba 3 groups: support local members - Kolab: support group accounts and allowed senders/receivers for users - SSH public key: support file upload and self service enhancements (RFE 101) + - DHCP: support more options (RFE 99) - LAM Pro: -> PPolicy: check password history for password reuse -> Custom fields: read-only fields for admin interface and file upload for binary data diff --git a/lam/lib/modules/dhcp_settings.inc b/lam/lib/modules/dhcp_settings.inc index cf895216..9d82376e 100644 --- a/lam/lib/modules/dhcp_settings.inc +++ b/lam/lib/modules/dhcp_settings.inc @@ -80,6 +80,8 @@ class dhcp_settings extends baseModule { /** all netbios node types */ private $all_netbios_node_types; + /** unknown-client options */ + private $allowDenyOptions; /** LDAP attributes */ public $attributes; @@ -96,6 +98,11 @@ class dhcp_settings extends baseModule { "4" => _("M-Node (0x04)"), "8" => _("H-Node (0x08)") ); + $this->allowDenyOptions = array( + '-' => '', + 'allow' => _("Allow"), + 'deny' => _("Deny"), + ); // call parent constructor parent::__construct($scope); } @@ -182,7 +189,11 @@ By default, the nodes are configured as H-Nodes which fits for small networks. I 'description' => array( "Headline" => _("Description"), 'attr' => 'dhcpComments', "Text" => _("Here you can enter a description for this DHCP entry.") - ) + ), + 'unknownClients' => array( + "Headline" => _("Unknown clients"), 'attr' => 'dhcpStatements', + "Text" => _("Specifies if unknown clients are allowed.") + ), ); // available PDF fields $return['PDF_fields'] = array( @@ -196,7 +207,8 @@ By default, the nodes are configured as H-Nodes which fits for small networks. I 'netbiosType' => _('Netbios node type'), 'subnetMask' => _('Subnet mask'), 'netMask' => _('Net mask'), - 'description' => _('Description') + 'description' => _('Description'), + 'unknownClients' => _('Unknown clients'), ); // profile elements $profileContainer = new htmlTable(); @@ -214,6 +226,9 @@ By default, the nodes are configured as H-Nodes which fits for small networks. I $profileContainer->addElement(new htmlTableExtendedInputField(_('Subnet mask'), 'subnet', null, 'subnetmask'), true); $return['profile_options'] = $profileContainer; // upload fields + $uploadAllowDenyOption = $this->allowDenyOptions; + unset($uploadAllowDenyOption['-']); + $uploadAllowDenyOption = implode(', ', $uploadAllowDenyOption); $return['upload_columns'] = array( array( 'name' => 'dhcp_settings_subnet', @@ -267,6 +282,12 @@ By default, the nodes are configured as H-Nodes which fits for small networks. I 'default' => 'H', 'values' => 'B, H, M, P' ), + array( + 'name' => 'dhcp_settings_unknownClients', + 'description' => _('Unknown clients'), + 'help' => 'unknownClients', + 'values' => $uploadAllowDenyOption + ), array( 'name' => 'dhcp_settings_subnetMask', 'description' => _('Subnet mask'), @@ -300,6 +321,7 @@ By default, the nodes are configured as H-Nodes which fits for small networks. I $this->messages['netbios'][0] = array('ERROR', _('The Netbios server is invalid.')); $this->messages['netbios'][1] = array('ERROR', _('Account %s:') . ' dhcp_settings_netbiosServer', _('The Netbios server is invalid.')); $this->messages['netbios_node_type'][1] = array('ERROR', _('Account %s:') . ' dhcp_settings_netbiosType', _('The entered Netbios node type does not exist.')); + $this->messages['unknownClients'][0] = array('ERROR', _('Account %s:') . ' dhcp_settings_unknownClients', _('Please enter a valid option.')); $this->messages['max_lease_time'][0] = array('ERROR', _('The maximum lease time is invalid.')); $this->messages['max_lease_time'][1] = array('ERROR', _('Account %s:') . ' dhcp_settings_maxLeaseTime', _('The maximum lease time is invalid.')); $this->messages['subnet'][0] = array('ERROR', _('The subnet mask is invalid.')); @@ -373,6 +395,7 @@ By default, the nodes are configured as H-Nodes which fits for small networks. I if ($this->getAccountContainer()->getAccountModule('fixed_ip')->reload_ips()) $errors[] = $this->messages['ips_reload'][0]; } + $this->setUnknownClients($_POST['unknownClients']); } // Check domainname: @@ -561,8 +584,17 @@ By default, the nodes are configured as H-Nodes which fits for small networks. I $nodeSelect = new htmlTableExtendedSelect('netbios_node_type', $nodeOptions, array($nodeType), _('Netbios node type'), 'netbios_type'); $nodeSelect->setHasDescriptiveElements(true); $return->addElement($nodeSelect, true); - + if ($this->getAccountContainer()->dn_orig!=$_SESSION['config']->get_suffix('dhcp')) { + // unknown clients + $unknownClients = $this->getUnknownClients(); + if (empty($unknownClients)) { + $unknownClients = '-'; + } + $unknownClientsOptions = array_flip($this->allowDenyOptions); + $unknownClientsSelect = new htmlTableExtendedSelect('unknownClients', $unknownClientsOptions, array($unknownClients), _('Unknown clients'), 'unknownClients'); + $unknownClientsSelect->setHasDescriptiveElements(true); + $return->addElement($unknownClientsSelect, true); // subnetmask $subnetMaskInput = new htmlTableExtendedInputField(_('Subnet mask'), 'subnet', $this->getDHCPOption('subnet-mask'), 'subnetmask'); $subnetMaskInput->setRequired(true); @@ -626,6 +658,11 @@ By default, the nodes are configured as H-Nodes which fits for small networks. I if (isset($this->all_netbios_node_types[$nodeType])) { $nodeTypeValue = $this->all_netbios_node_types[$nodeType]; } + $unknownClients = ''; + $unknownClientsVal = $this->getUnknownClients(); + if (!empty($unknownClientsVal)) { + $unknownClients = $this->allowDenyOptions[$unknownClientsVal]; + } $return = array( get_class($this) . '_domainName' => array('' . _('Domain name') . '' . $this->getDHCPOption('domain-name') . ''), get_class($this) . '_leaseTime' => array('' . _('Lease time') . '' . $this->getDefaultLeaseTime() . ''), @@ -635,7 +672,8 @@ By default, the nodes are configured as H-Nodes which fits for small networks. I get_class($this) . '_netbiosServer' => array('' . _('Netbios name servers') . '' . $this->getDHCPOption('netbios-name-servers') . ''), get_class($this) . '_netbiosType' => array('' . _('Netbios node type') . '' . $nodeTypeValue . ''), get_class($this) . '_subnetMask' => array('' . _('Subnet mask') . '' . $this->getDHCPOption('subnet-mask') . ''), - ); + get_class($this) . '_unknownClients' => array('' . _('Unknown clients') . '' . $unknownClients . ''), + ); $this->addSimplePDFField($return, 'description', _('Description'), 'dhcpComments'); $this->addSimplePDFField($return, 'subnet', _('Subnet'), 'cn'); $this->addSimplePDFField($return, 'netMask', _('Net mask'), 'dhcpNetMask'); @@ -652,8 +690,9 @@ By default, the nodes are configured as H-Nodes which fits for small networks. I $return = null; if (is_array($this->attributes['dhcpOption'])) { for ($i = 0; $i < sizeof($this->attributes['dhcpOption']); $i++) { - if (substr($this->attributes['dhcpOption'][$i], 0, strlen($name) + 1) == ($name . ' ')) { - $return = substr($this->attributes['dhcpOption'][$i], strlen($name) + 1); + $val = $this->attributes['dhcpOption'][$i]; + if (substr($val, 0, strlen($name) + 1) == ($name . ' ')) { + $return = substr($val, strlen($name) + 1); $return = str_replace('"', '', $return); break; } @@ -721,6 +760,46 @@ By default, the nodes are configured as H-Nodes which fits for small networks. I } } + /** + * Returns the unknown clients option. + * + * @return String unknown clients value + */ + private function getUnknownClients() { + $return = null; + if (is_array($this->attributes['dhcpStatements'])) { + for ($i = 0; $i < sizeof($this->attributes['dhcpStatements']); $i++) { + $val = $this->attributes['dhcpStatements'][$i]; + if (strpos($val, 'unknown-clients') === (strlen($val) - strlen('unknown-clients'))) { + $return = substr($val,0, (strlen($val) - strlen('unknown-clients') - 1)); + break; + } + } + } + return $return; + } + + /** + * Sets the unknown clients option. + * + * @param String $option allow/deny + */ + private function setUnknownClients($option) { + if (!is_array($this->attributes['dhcpStatements'])) { + $this->attributes['dhcpStatements'] = array(); + } + for ($i = 0; $i < sizeof($this->attributes['dhcpStatements']); $i++) { + $val = $this->attributes['dhcpStatements'][$i]; + if (strpos($val, 'unknown-clients') === (strlen($val) - strlen('unknown-clients'))) { + unset($this->attributes['dhcpStatements'][$i]); + $this->attributes['dhcpStatements'] = array_values($this->attributes['dhcpStatements']); + } + } + if (!empty($option) && ($option != '-')) { + $this->attributes['dhcpStatements'][] = $option . ' unknown-clients'; + } + } + /** * Returns the maximum lease time. * @@ -888,6 +967,19 @@ By default, the nodes are configured as H-Nodes which fits for small networks. I else { $partialAccounts[$i]['dhcpOption'][] = "netbios-node-type 8"; // default H } + // unknown clients + if (!empty($rawAccounts[$i][$ids['dhcp_settings_unknownClients']])) { + $unknownClients = $rawAccounts[$i][$ids['dhcp_settings_unknownClients']]; + if (in_array($unknownClients, $this->allowDenyOptions)) { + $allowDenyOptions = array_flip($this->allowDenyOptions); + $partialAccounts[$i]['dhcpStatements'][] = $allowDenyOptions[$unknownClients] . ' unknown-clients'; + } + else { + $error = $this->messages['unknownClients'][0]; + array_push($error, $i); + $messages[] = $error; + } + } // subnet mask if (check_ip($rawAccounts[$i][$ids['dhcp_settings_subnetMask']],true)) { $partialAccounts[$i]['dhcpOption'][] = "subnet-mask ".$rawAccounts[$i][$ids['dhcp_settings_subnetMask']]; diff --git a/lam/lib/modules/fixed_ip.inc b/lam/lib/modules/fixed_ip.inc index 257fdbe0..7d183b2f 100644 --- a/lam/lib/modules/fixed_ip.inc +++ b/lam/lib/modules/fixed_ip.inc @@ -4,7 +4,7 @@ $Id$ This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/) Copyright (C) 2008 Thomas Manninger - 2008 - 2012 Roland Gruber + 2008 - 2013 Roland Gruber This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,7 +24,7 @@ $Id$ /** -* Manages fixed IP addresses. +* Manages DHCP host entries. * * @package modules * @@ -33,7 +33,7 @@ $Id$ */ /** -* Manages fixed IP addresses. +* Manages DHCP host entries. * * @package modules */ @@ -84,16 +84,23 @@ class fixed_ip extends baseModule { $return['attributes'] = array('dhcpOption'); // help Entries $return['help'] = array( - 'pc' => array( - "Headline" => _("PC name"), + 'pc' => array( + "Headline" => _("PC name"), 'attr' => 'dhcpOption, host-name', "Text" => _("The name of the PC.") - ) , 'mac' => array( - "Headline" => _("MAC address"), + ), + 'mac' => array( + "Headline" => _("MAC address"), 'attr' => 'dhcpHWAddress', "Text" => _("The MAC address of the PC. Example: 11:22:33:44:55:aa") - ) , 'ip' => array( - "Headline" => _("IP address"), + ), + 'ip' => array( + "Headline" => _("IP address"), 'attr' => 'dhcpStatements, fixed-address', "Text" => _("The IP address of the PC.") - ) ); + ), + 'active' => array( + "Headline" => _("Active"), 'attr' => 'dhcpStatements, booting', + "Text" => _("Inactive hosts will not be able to get an address from the DHCP server.") + ), + ); // available PDF fields $return['PDF_fields'] = array('IPlist' => _('IP list')); return $return; @@ -208,15 +215,21 @@ class fixed_ip extends baseModule { for ($i=0; $i < sizeof($entries); $i++) { $dhcphwaddress = explode(" ", $entries[$i]['dhcphwaddress'][0]); $dhcphwaddress = array_pop($dhcphwaddress); - $dhcpstatements = explode(" ", $entries[$i]['dhcpstatements'][0]); - $dhcpstatements = array_pop($dhcpstatements); + $dhcpstatements = array(); + if (isset($entries[$i]['dhcpstatements'][0])) { + $dhcpstatements = $entries[$i]['dhcpstatements']; + } $this->fixed_ip[$i]['cn'] = $entries[$i]['cn'][0]; $this->fixed_ip[$i]['mac'] = $dhcphwaddress; - $this->fixed_ip[$i]['ip'] = $dhcpstatements; - + $this->fixed_ip[$i]['ip'] = self::extractIP($dhcpstatements); + $this->fixed_ip[$i]['active'] = self::isActive($dhcpstatements); + $this->fixed_ip[$i]['dhcpstatements'] = $dhcpstatements; + $this->orig_ips[$i]['cn'] = $entries[$i]['cn'][0]; $this->orig_ips[$i]['mac'] = $dhcphwaddress; - $this->orig_ips[$i]['ip'] = $dhcpstatements; + $this->orig_ips[$i]['ip'] = self::extractIP($dhcpstatements); + $this->orig_ips[$i]['active'] = self::isActive($dhcpstatements); + $this->orig_ips[$i]['dhcpstatements'] = $dhcpstatements; } } } @@ -311,7 +324,13 @@ class fixed_ip extends baseModule { // Add new IP if (isset($_POST['add_ip']) || ($_POST['pc_add'] != '') || ($_POST['mac_add'] != '')) { // Add IP: - $this->fixed_ip[] = array('cn' => $_POST['pc_add'], 'mac' => $_POST['mac_add'], 'ip' => $_POST['ip_add']); + $this->fixed_ip[] = array( + 'cn' => $_POST['pc_add'], + 'mac' => $_POST['mac_add'], + 'ip' => $_POST['ip_add'], + 'dhcpstatements' => array(), + 'active' => (isset($_POST['active_add']) && ($_POST['active_add'] == 'on')), + ); } } @@ -342,7 +361,11 @@ class fixed_ip extends baseModule { $ipContainer = new htmlTable(); $ipContainer->addElement(new htmlOutputText(_('IP address'))); $ipContainer->addElement(new htmlHelpLink('ip')); - $return->addElement($ipContainer, true); + $return->addElement($ipContainer); + $activeContainer = new htmlTable(); + $activeContainer->addElement(new htmlOutputText(_('Active'))); + $activeContainer->addElement(new htmlHelpLink('active')); + $return->addElement($activeContainer, true); // Reset oberlaped ips $this->reset_overlapd_ip(); @@ -409,6 +432,7 @@ class fixed_ip extends baseModule { $return->addElement(new htmlInputField('pc_'.$id, $this->fixed_ip[$id]['cn'])); $return->addElement(new htmlInputField('mac_'.$id, $this->fixed_ip[$id]['mac'])); $return->addElement(new htmlInputField('ip_'.$id, $this->fixed_ip[$id]['ip'])); + $return->addElement(new htmlInputCheckbox('active', $this->fixed_ip[$id]['active'])); $return->addElement(new htmlButton('drop_ip_'.$id, 'del.png', true)); $return->addElement(new htmlOutputText($error), true); } @@ -417,6 +441,7 @@ class fixed_ip extends baseModule { $return->addElement(new htmlInputField('pc_add', '')); $return->addElement(new htmlInputField('mac_add', '')); $return->addElement(new htmlInputField('ip_add', '')); + $return->addElement(new htmlInputCheckbox('active_add', true)); $return->addElement(new htmlButton('add_ip', 'add.png', true)); } return $return; @@ -449,25 +474,27 @@ class fixed_ip extends baseModule { */ public function postModifyActions($newAccount, $attributes) { if ($this->getAccountContainer()->dn_orig!=$_SESSION['config']->get_suffix('dhcp')) { + $ldapSuffix = ',cn=' . $this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0] . ',' . $_SESSION['config']->get_suffix('dhcp'); $add = array(); + $mod = array(); // DN => array(attr => values) $delete = array(); // Which dns are to delete and to add - foreach($this->orig_ips AS $id=>$arr) { + foreach($this->orig_ips AS $id => $arr) { // Exist cn still? $in_arr = false; - foreach($this->fixed_ip AS $idB=>$arr) { - if ($this->orig_ips[$id]['cn']==$this->fixed_ip[$idB]['cn']) { + foreach($this->fixed_ip AS $idB => $arr) { + if ($this->orig_ips[$id]['cn'] == $this->fixed_ip[$idB]['cn']) { $in_arr = true; // check if IP changed - if($this->orig_ips[$id]['ip']!=$this->fixed_ip[$idB]['ip']) { - $delete[] = $this->orig_ips[$id]['cn']; - $add[] = $this->fixed_ip[$idB]; + if($this->orig_ips[$id]['ip'] != $this->fixed_ip[$idB]['ip']) { + $this->setIP($this->fixed_ip[$idB]['dhcpstatements'], $this->fixed_ip[$idB]['ip']); + $mod['cn=' . $this->orig_ips[$id]['cn'] . $ldapSuffix]['dhcpstatements'] = $this->fixed_ip[$idB]['dhcpstatements']; } // check if MAC changed - elseif($this->orig_ips[$id]['mac']!=$this->fixed_ip[$idB]['mac']) { - $delete[] = $this->orig_ips[$id]['cn']; - $add[] = $this->fixed_ip[$idB]; + elseif($this->orig_ips[$id]['mac'] != $this->fixed_ip[$idB]['mac']) { + $mod['cn=' . $this->orig_ips[$id]['cn'] . $ldapSuffix]['dhcpHWAddress'] = array('ethernet ' . $this->fixed_ip[$idB]['mac']); } + break; } } if (!$in_arr) { @@ -479,10 +506,10 @@ class fixed_ip extends baseModule { $this->fixed_ip = array(); } // Which entrys are new: - foreach($this->fixed_ip AS $id=>$arr) { + foreach($this->fixed_ip AS $id => $arr) { $in_arr = false; - foreach($this->orig_ips AS $idB=>$arr) { - if ($this->orig_ips[$idB]['cn']==$this->fixed_ip[$id]['cn']) { + foreach($this->orig_ips AS $idB => $arr) { + if ($this->orig_ips[$idB]['cn'] == $this->fixed_ip[$id]['cn']) { $in_arr = true; } } @@ -491,22 +518,29 @@ class fixed_ip extends baseModule { } } - foreach($delete AS $dn) { - ldap_delete($_SESSION['ldap']->server(),'cn='.$dn.',cn='.$this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0].','.$_SESSION['config']->get_suffix('dhcp')); + foreach($delete AS $cn) { + ldap_delete($_SESSION['ldap']->server(), 'cn=' . $cn . $ldapSuffix); } - foreach($add AS $id=>$arr) { + foreach($add AS $id => $arr) { $attr = array(); $attr['cn'] = $add[$id]['cn']; $attr['objectClass'][0] = 'top'; $attr['objectClass'][1] = 'dhcpHost'; $attr['dhcpHWAddress'] = 'ethernet ' . $add[$id]['mac']; if ($add[$id]['ip'] != '') { - $attr['dhcpStatements'] = 'fixed-address '.$add[$id]['ip']; + $attr['dhcpStatements'][] = 'fixed-address ' . $add[$id]['ip']; + } + if ($add[$id]['active'] === false) { + $attr['dhcpStatements'][] = 'deny booting'; } $attr['dhcpOption'] = 'host-name "' . $add[$id]['cn'] . '"'; if ($attr['cn'] != "") - ldap_add($_SESSION['ldap']->server(),'cn='.$add[$id]['cn'].',cn='.$this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0].','.$_SESSION['config']->get_suffix('dhcp'),$attr); + ldap_add($_SESSION['ldap']->server(), 'cn=' . $add[$id]['cn'] . $ldapSuffix, $attr); + } + // entries to modify + foreach ($mod as $dn => $attrs) { + ldap_modify($_SESSION['ldap']->server(), $dn, $attrs); } } return array(); @@ -520,17 +554,106 @@ class fixed_ip extends baseModule { function get_pdfEntries() { $return = array(); if (is_array($this->fixed_ip) && (sizeof($this->fixed_ip) > 0)) { - $return[get_class($this) . '_IPlist'] = array('' . _('PC name') . "" . _('IP address') . "" . _('MAC address') . ''); + $return[get_class($this) . '_IPlist'] = array( + '' . + '' . _('PC name') . "" . + "" . _('IP address') . "" . + "" . _('MAC address') . '' . + "" . _('Active') . '' . + ''); for ($i = 0; $i < sizeof($this->fixed_ip); $i++) { $name = $this->fixed_ip[$i]['cn']; $mac = $this->fixed_ip[$i]['mac']; $ip = $this->fixed_ip[$i]['ip']; - $return[get_class($this) . '_IPlist'][] = '' . $name . "" . $ip . "" . $mac . ''; + $active = _('yes'); + if (!$this->fixed_ip[$i]['active']) { + $active = _('no'); + } + $return[get_class($this) . '_IPlist'][] = '' . + '' . $name . "" . + "" . $ip . " " . + "" . $mac . ''. + "" . $active . ''. + ''; } } return $return; } + /** + * Extracts the IP from a list of DHCP statements. + * + * @param array $dhcpStatements values of dhcpStatements attribute + */ + public static function extractIP($dhcpStatements) { + $return = null; + if (is_array($dhcpStatements)) { + for ($i = 0; $i < sizeof($dhcpStatements); $i++) { + if (strpos($dhcpStatements[$i], 'fixed-address ') === 0) { + $return = substr($dhcpStatements[$i], strlen('fixed-address') + 1); + break; + } + } + } + return $return; + } + + /** + * Sets the IP in a list of DHCP statements. + * + * @param array $dhcpStatements values of dhcpStatements attribute + * @param String $ip new IP + */ + private function setIP(&$dhcpStatements, $ip) { + for ($i = 0; $i < sizeof($dhcpStatements); $i++) { + if (strpos($dhcpStatements[$i], 'fixed-address ') === 0) { + unset($dhcpStatements[$i]); + $dhcpStatements = array_values($dhcpStatements); + } + } + if (!empty($ip)) { + $dhcpStatements[] = 'fixed-address ' . $ip; + } + } + + /** + * Returns if this host is active. + * + * @param array $dhcpStatements values of dhcpStatements attribute + */ + public static function isActive($dhcpStatements) { + if (is_array($dhcpStatements)) { + for ($i = 0; $i < sizeof($dhcpStatements); $i++) { + if (strpos($dhcpStatements[$i], ' booting') === (strlen($dhcpStatements[$i]) - strlen(' booting'))) { + $val = substr($dhcpStatements[$i], 0, (strlen($dhcpStatements[$i]) - strlen(' booting'))); + if ($val == 'deny') { + return false; + } + break; + } + } + } + return true; + } + + /** + * Sets if this host is active. + * + * @param array $dhcpStatements values of dhcpStatements attribute + * @param boolean $active is active + */ + private function setActive(&$dhcpStatements, $active) { + for ($i = 0; $i < sizeof($dhcpStatements); $i++) { + if (strpos($dhcpStatements[$i], ' booting') === (strlen($dhcpStatements[$i]) - strlen(' booting'))) { + unset($dhcpStatements[$i]); + $dhcpStatements = array_values($dhcpStatements); + } + } + if (!$active) { + $dhcpStatements[] = 'allow booting '; + } + } + } ?> diff --git a/lam/lib/types/dhcp.inc b/lam/lib/types/dhcp.inc index 1a862bbf..2642db6e 100644 --- a/lam/lib/types/dhcp.inc +++ b/lam/lib/types/dhcp.inc @@ -4,7 +4,7 @@ $Id$ This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/) Copyright (C) 2008 Thomas Manninger - 2009 - 2012 Roland Gruber + 2009 - 2013 Roland Gruber This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -188,12 +188,16 @@ class lamDHCPList extends lamList { if (sizeof($entries) > 0) { echo ""; for ($i = 0; $i < sizeof($entries); $i++) { - echo ""; - $dhcpstatements = array(''); + $dhcpstatements = array(); if (isset($entries[$i]['dhcpstatements'][0])) { - $dhcpstatements = explode(" ",$entries[$i]['dhcpstatements'][0]); + $dhcpstatements = $entries[$i]['dhcpstatements']; } - echo ""; + $style = ''; + if (!fixed_ip::isActive($dhcpstatements)) { + $style = 'style="text-decoration: line-through;"'; + } + echo ""; + echo ""; $dhcphwaddress = explode(" ",$entries[$i]['dhcphwaddress'][0]); echo ""; echo "";
".array_pop($dhcpstatements)."
" . fixed_ip::extractIP($dhcpstatements) . "".array_pop($dhcphwaddress)."".$entries[$i]['cn'][0]."