check for duplicate host name
This commit is contained in:
parent
2d3f584bb4
commit
bb9a1b1719
|
@ -7,7 +7,7 @@ $Id$
|
|||
|
||||
This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
|
||||
Copyright (C) 2008 Thomas Manninger
|
||||
2008 - 2017 Roland Gruber
|
||||
2008 - 2018 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
|
||||
|
@ -61,6 +61,9 @@ class fixed_ip extends baseModule {
|
|||
/** cached host entries (list of array('cn' => ..., 'iphostnumber' => ..., 'macaddress' => ...)) */
|
||||
private $hostCache = null;
|
||||
|
||||
/** cache for existing host entries */
|
||||
private $existingDhcpHostsCache = null;
|
||||
|
||||
/**
|
||||
* Returns true if this module can manage accounts of the current type, otherwise false.
|
||||
*
|
||||
|
@ -287,110 +290,111 @@ class fixed_ip extends baseModule {
|
|||
*/
|
||||
public function process_attributes() {
|
||||
$errors = array();
|
||||
if (!$this->isRootNode()) {
|
||||
$this->processed = true;
|
||||
if ($this->isRootNode()) {
|
||||
return $errors;
|
||||
}
|
||||
$this->processed = true;
|
||||
|
||||
$this->reset_overlapd_ip();
|
||||
$this->reset_overlapd_ip();
|
||||
|
||||
if ($this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0]!="") {
|
||||
if ($this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0]!="") {
|
||||
|
||||
$error = false; // errors by process_attributes()?
|
||||
$pcs = array();
|
||||
foreach($this->fixed_ip AS $id=>$arr) {
|
||||
$error = false; // errors by process_attributes()?
|
||||
$pcs = array();
|
||||
foreach($this->fixed_ip AS $id=>$arr) {
|
||||
|
||||
// Check if ip is to drop
|
||||
if (isset($_POST['drop_ip_'.$id])) {
|
||||
// Drop ip:
|
||||
unset($this->fixed_ip[$id]);
|
||||
continue;
|
||||
}
|
||||
// Check if ip is to drop
|
||||
if (isset($_POST['drop_ip_'.$id])) {
|
||||
// Drop ip:
|
||||
unset($this->fixed_ip[$id]);
|
||||
continue;
|
||||
}
|
||||
|
||||
// MAC address
|
||||
$_POST['mac_'.$id] = strtolower(trim($_POST['mac_'.$id]));
|
||||
// MAC address
|
||||
$_POST['mac_'.$id] = strtolower(trim($_POST['mac_'.$id]));
|
||||
|
||||
$invalid = $this->check_mac($_POST['mac_'.$id]);
|
||||
if ($invalid) {
|
||||
$invalid = $this->check_mac($_POST['mac_'.$id]);
|
||||
if ($invalid) {
|
||||
$error = true;
|
||||
}
|
||||
$this->fixed_ip[$id]['mac'] = $_POST['mac_'.$id];
|
||||
|
||||
// description
|
||||
if (!get_preg($_POST['description_'.$id], 'ascii')) {
|
||||
$error = true;
|
||||
}
|
||||
$this->fixed_ip[$id]['description'] = $_POST['description_'.$id];
|
||||
|
||||
// active
|
||||
$this->fixed_ip[$id]['active'] = (isset($_POST['active_' . $id]) && ($_POST['active_' . $id] == 'on'));
|
||||
|
||||
// Ip address
|
||||
if (!empty($_POST['ip_'.$id])) {
|
||||
$_POST['ip_'.$id] = trim($_POST['ip_'.$id]);
|
||||
}
|
||||
if (!empty($_POST['ip_'.$id]) && !(check_ip($_POST['ip_'.$id]))) {
|
||||
$error = true;
|
||||
$this->fixed_ip[$id]['ip'] = $_POST['ip_'.$id];
|
||||
}
|
||||
elseif (!empty($_POST['ip_'.$id]) && !$this->overlapd_ip($_POST['ip_'.$id])) {
|
||||
$error = true;
|
||||
$this->fixed_ip[$id]['ip'] = $_POST['ip_'.$id];
|
||||
}
|
||||
else {
|
||||
$this->fixed_ip[$id]['ip'] = $_POST['ip_'.$id];
|
||||
}
|
||||
|
||||
// Is ip correct with subnet:
|
||||
if (!empty($_POST['ip_'.$id]) && check_ip($_POST['ip_'.$id]) && !range::check_subnet_range($_POST['ip_'.$id],
|
||||
$this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0],
|
||||
$this->getAccountContainer()->getAccountModule('dhcp_settings')->getDHCPOption('subnet-mask'))) {
|
||||
$error = true;
|
||||
}
|
||||
|
||||
// cn:
|
||||
if (!empty($_POST['pc_'.$id])) $_POST['pc_'.$id] = trim($_POST['pc_'.$id]);
|
||||
if (!empty($_POST['pc_'.$id])) {
|
||||
|
||||
// name already in use
|
||||
if (in_array($_POST['pc_'.$id], $pcs) ) {
|
||||
$error = true;
|
||||
}
|
||||
$this->fixed_ip[$id]['mac'] = $_POST['mac_'.$id];
|
||||
|
||||
// description
|
||||
if (!get_preg($_POST['description_'.$id], 'ascii')) {
|
||||
$error = true;
|
||||
}
|
||||
$this->fixed_ip[$id]['description'] = $_POST['description_'.$id];
|
||||
|
||||
// active
|
||||
$this->fixed_ip[$id]['active'] = (isset($_POST['active_' . $id]) && ($_POST['active_' . $id] == 'on'));
|
||||
|
||||
// Ip address
|
||||
if (!empty($_POST['ip_'.$id])) {
|
||||
$_POST['ip_'.$id] = trim($_POST['ip_'.$id]);
|
||||
}
|
||||
if (!empty($_POST['ip_'.$id]) && !(check_ip($_POST['ip_'.$id]))) {
|
||||
$error = true;
|
||||
$this->fixed_ip[$id]['ip'] = $_POST['ip_'.$id];
|
||||
}
|
||||
elseif (!empty($_POST['ip_'.$id]) && !$this->overlapd_ip($_POST['ip_'.$id])) {
|
||||
$error = true;
|
||||
$this->fixed_ip[$id]['ip'] = $_POST['ip_'.$id];
|
||||
}
|
||||
else {
|
||||
$this->fixed_ip[$id]['ip'] = $_POST['ip_'.$id];
|
||||
$pcs[] = $_POST['pc_'.$id];
|
||||
}
|
||||
|
||||
// Is ip correct with subnet:
|
||||
if (!empty($_POST['ip_'.$id]) && check_ip($_POST['ip_'.$id]) && !range::check_subnet_range($_POST['ip_'.$id],
|
||||
$this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0],
|
||||
$this->getAccountContainer()->getAccountModule('dhcp_settings')->getDHCPOption('subnet-mask'))) {
|
||||
$error = true;
|
||||
}
|
||||
|
||||
// cn:
|
||||
if (!empty($_POST['pc_'.$id])) $_POST['pc_'.$id] = trim($_POST['pc_'.$id]);
|
||||
if (!empty($_POST['pc_'.$id])) {
|
||||
|
||||
// Already use?
|
||||
if (in_array($_POST['pc_'.$id], $pcs) ) {
|
||||
$error = true;
|
||||
}
|
||||
else {
|
||||
$pcs[] = $_POST['pc_'.$id];
|
||||
}
|
||||
}
|
||||
else {
|
||||
$error = true;
|
||||
}
|
||||
if (strlen($_POST['pc_'.$id])>30) {
|
||||
$error = true;
|
||||
}
|
||||
if (!preg_match("/^[A-Za-z0-9\\._-]*$/",$_POST['pc_'.$id])) {
|
||||
$error = true;
|
||||
}
|
||||
$this->fixed_ip[$id]['cn'] = $_POST['pc_'.$id];
|
||||
}
|
||||
if ($error) {
|
||||
$errors[] = $this->messages['errors'][0];
|
||||
else {
|
||||
$error = true;
|
||||
}
|
||||
if (strlen($_POST['pc_'.$id])>30) {
|
||||
$error = true;
|
||||
}
|
||||
if (!preg_match("/^[A-Za-z0-9\\._-]*$/",$_POST['pc_'.$id])) {
|
||||
$error = true;
|
||||
}
|
||||
$this->fixed_ip[$id]['cn'] = $_POST['pc_'.$id];
|
||||
}
|
||||
if ($error) {
|
||||
$errors[] = $this->messages['errors'][0];
|
||||
}
|
||||
}
|
||||
|
||||
// Add new IP
|
||||
if (isset($_POST['add_ip']) || ($_POST['pc_add'] != '') || ($_POST['mac_add'] != '')) {
|
||||
// Add IP:
|
||||
$active = (isset($_POST['active_add']) && ($_POST['active_add'] == 'on'));
|
||||
$dhcpstatements = array();
|
||||
$this->setActive($dhcpstatements, $active);
|
||||
$this->setIP($dhcpstatements, $_POST['ip_add']);
|
||||
$this->fixed_ip[] = array(
|
||||
'cn' => $_POST['pc_add'],
|
||||
'mac' => $_POST['mac_add'],
|
||||
'description' => $_POST['description_add'],
|
||||
'ip' => $_POST['ip_add'],
|
||||
'dhcpstatements' => $dhcpstatements,
|
||||
'active' => $active,
|
||||
);
|
||||
$this->orderByIP();
|
||||
}
|
||||
// Add new IP
|
||||
if (isset($_POST['add_ip']) || ($_POST['pc_add'] != '') || ($_POST['mac_add'] != '')) {
|
||||
// Add IP:
|
||||
$active = (isset($_POST['active_add']) && ($_POST['active_add'] == 'on'));
|
||||
$dhcpstatements = array();
|
||||
$this->setActive($dhcpstatements, $active);
|
||||
$this->setIP($dhcpstatements, $_POST['ip_add']);
|
||||
$this->fixed_ip[] = array(
|
||||
'cn' => $_POST['pc_add'],
|
||||
'mac' => $_POST['mac_add'],
|
||||
'description' => $_POST['description_add'],
|
||||
'ip' => $_POST['ip_add'],
|
||||
'dhcpstatements' => $dhcpstatements,
|
||||
'active' => $active,
|
||||
);
|
||||
$this->orderByIP();
|
||||
}
|
||||
|
||||
return $errors;
|
||||
|
@ -407,151 +411,202 @@ class fixed_ip extends baseModule {
|
|||
$return->addElement(new htmlStatusMessage('ERROR', _("Please fill out the DHCP settings first.")), true);
|
||||
return $return;
|
||||
}
|
||||
else {
|
||||
$this->initCache();
|
||||
// auto-completion for host names
|
||||
$autoNames = array();
|
||||
if (!empty($this->hostCache) && (sizeof($this->hostCache) < 200)) {
|
||||
foreach ($this->hostCache as $index => $attrs) {
|
||||
if (!empty($attrs['cn'][0])) {
|
||||
$autoNames[] = $attrs['cn'][0];
|
||||
}
|
||||
$this->initCache();
|
||||
// auto-completion for host names
|
||||
$autoNames = array();
|
||||
if (!empty($this->hostCache) && (sizeof($this->hostCache) < 200)) {
|
||||
foreach ($this->hostCache as $index => $attrs) {
|
||||
if (!empty($attrs['cn'][0])) {
|
||||
$autoNames[] = $attrs['cn'][0];
|
||||
}
|
||||
$autoNames = array_values(array_unique($autoNames));
|
||||
}
|
||||
// caption
|
||||
$ipContainer = new htmlTable();
|
||||
$ipContainer->addElement(new htmlOutputText(_('IP address')));
|
||||
$ipContainer->addElement(new htmlHelpLink('ip'));
|
||||
$return->addElement($ipContainer);
|
||||
$pcContainer = new htmlTable();
|
||||
$pcContainer->addElement(new htmlOutputText(_('PC name'), true, true));
|
||||
$pcContainer->addElement(new htmlHelpLink('pc'));
|
||||
$return->addElement($pcContainer);
|
||||
$macContainer = new htmlTable();
|
||||
$macContainer->addElement(new htmlOutputText(_('MAC address'), true, true));
|
||||
$macContainer->addElement(new htmlHelpLink('mac'));
|
||||
$return->addElement($macContainer);
|
||||
$commentContainer = new htmlTable();
|
||||
$commentContainer->addElement(new htmlOutputText(_('Description'), true));
|
||||
$commentContainer->addElement(new htmlHelpLink('description'));
|
||||
$return->addElement($commentContainer);
|
||||
$activeContainer = new htmlTable();
|
||||
$activeContainer->colspan = 2;
|
||||
$activeContainer->addElement(new htmlOutputText(_('Active')));
|
||||
$activeContainer->addElement(new htmlHelpLink('active'));
|
||||
$return->addElement($activeContainer, true);
|
||||
// Reset oberlaped ips
|
||||
$this->reset_overlapd_ip();
|
||||
$autoNames = array_values(array_unique($autoNames));
|
||||
}
|
||||
// caption
|
||||
$ipContainer = new htmlTable();
|
||||
$ipContainer->addElement(new htmlOutputText(_('IP address')));
|
||||
$ipContainer->addElement(new htmlHelpLink('ip'));
|
||||
$return->addElement($ipContainer);
|
||||
$pcContainer = new htmlTable();
|
||||
$pcContainer->addElement(new htmlOutputText(_('PC name'), true, true));
|
||||
$pcContainer->addElement(new htmlHelpLink('pc'));
|
||||
$return->addElement($pcContainer);
|
||||
$macContainer = new htmlTable();
|
||||
$macContainer->addElement(new htmlOutputText(_('MAC address'), true, true));
|
||||
$macContainer->addElement(new htmlHelpLink('mac'));
|
||||
$return->addElement($macContainer);
|
||||
$commentContainer = new htmlTable();
|
||||
$commentContainer->addElement(new htmlOutputText(_('Description'), true));
|
||||
$commentContainer->addElement(new htmlHelpLink('description'));
|
||||
$return->addElement($commentContainer);
|
||||
$activeContainer = new htmlTable();
|
||||
$activeContainer->colspan = 2;
|
||||
$activeContainer->addElement(new htmlOutputText(_('Active')));
|
||||
$activeContainer->addElement(new htmlHelpLink('active'));
|
||||
$return->addElement($activeContainer, true);
|
||||
// Reset oberlaped ips
|
||||
$this->reset_overlapd_ip();
|
||||
|
||||
// If $ranges is not a array, then create one:
|
||||
if (!is_array($this->fixed_ip)) {
|
||||
$this->fixed_ip = array();
|
||||
// If $ranges is not a array, then create one:
|
||||
if (!is_array($this->fixed_ip)) {
|
||||
$this->fixed_ip = array();
|
||||
}
|
||||
$pcs = array();
|
||||
foreach($this->fixed_ip AS $id=>$arr) {
|
||||
// pc name
|
||||
$pcError = "";
|
||||
$existsInDifferentDn = $this->hostNameExists($_POST['pc_'.$id]);
|
||||
if (!$this->processed) {
|
||||
$pcError = "";
|
||||
}
|
||||
$pcs = array();
|
||||
foreach($this->fixed_ip AS $id=>$arr) {
|
||||
// pc name
|
||||
$pcError = "";
|
||||
if (!$this->processed) {
|
||||
$pcError = "";
|
||||
}
|
||||
elseif (strlen($this->fixed_ip[$id]['cn'])>20) {
|
||||
$pcError = _("The PC name may not be longer than 20 characters.");
|
||||
}
|
||||
elseif (strlen($this->fixed_ip[$id]['cn'])<2) {
|
||||
$pcError = _("The PC name needs to be at least 2 characters long.");
|
||||
}
|
||||
elseif (in_array($this->fixed_ip[$id]['cn'], $pcs) ) {
|
||||
$pcError = _("This PC name already exists.");
|
||||
}
|
||||
elseif (isset($_POST['pc_'.$id]) && !preg_match("/^[A-Za-z0-9\\._-]*$/", $_POST['pc_'.$id])) {
|
||||
$pcError = _("The PC name may only contain A-Z, a-z and 0-9.");
|
||||
}
|
||||
$pcs[] = $this->fixed_ip[$id]['cn'];
|
||||
|
||||
// MAC address
|
||||
$macError = "";
|
||||
if (!$this->processed) {
|
||||
$macError = "";
|
||||
}
|
||||
elseif ($this->check_mac($this->fixed_ip[$id]['mac'])) {
|
||||
$macError = _("Invalid MAC address.");
|
||||
}
|
||||
|
||||
// descripton
|
||||
$descriptionError = "";
|
||||
if (!$this->processed) {
|
||||
$descriptionError = "";
|
||||
}
|
||||
elseif (!get_preg($this->fixed_ip[$id]['description'], 'ascii')) {
|
||||
$descriptionError = _("Invalid description.");
|
||||
}
|
||||
|
||||
// fixed ip
|
||||
$ipError = "";
|
||||
if (!$this->processed || ($this->fixed_ip[$id]['ip'] == '')) {
|
||||
$ipError = "";
|
||||
}
|
||||
elseif (!check_ip($this->fixed_ip[$id]['ip'])) {
|
||||
$ipError = _("The IP address is invalid.");
|
||||
}
|
||||
elseif (!range::check_subnet_range($this->fixed_ip[$id]['ip'],
|
||||
$this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0],
|
||||
$this->getAccountContainer()->getAccountModule('dhcp_settings')->getDHCPOption('subnet-mask'))) {
|
||||
$ipError = _("The IP address does not match the subnet.");
|
||||
}
|
||||
elseif (!$this->overlapd_ip($this->fixed_ip[$id]['ip'])) {
|
||||
$ipError = _("The IP address is already in use.");
|
||||
}
|
||||
$error = '';
|
||||
if ($pcError != '') {
|
||||
$error .= ' ' . $pcError;
|
||||
}
|
||||
if ($macError != '') {
|
||||
$error .= ' ' . $macError;
|
||||
}
|
||||
if ($ipError != '') {
|
||||
$error .= ' ' . $ipError;
|
||||
}
|
||||
if ($descriptionError != '') {
|
||||
$error .= ' ' . $descriptionError;
|
||||
}
|
||||
$return->addElement(new htmlInputField('ip_'.$id, $this->fixed_ip[$id]['ip'], 20));
|
||||
$pcInput = new htmlInputField('pc_'.$id, $this->fixed_ip[$id]['cn'], 20);
|
||||
if (!empty($autoNames)) {
|
||||
$pcInput->enableAutocompletion($autoNames);
|
||||
}
|
||||
$return->addElement($pcInput);
|
||||
$return->addElement(new htmlInputField('mac_'.$id, $this->fixed_ip[$id]['mac'], 20));
|
||||
$return->addElement(new htmlInputField('description_'.$id, $this->fixed_ip[$id]['description'], 20));
|
||||
$return->addElement(new htmlInputCheckbox('active_'.$id, $this->fixed_ip[$id]['active']));
|
||||
$return->addElement(new htmlButton('drop_ip_'.$id, 'del.png', true));
|
||||
$return->addElement(new htmlOutputText($error), true);
|
||||
elseif (strlen($this->fixed_ip[$id]['cn'])>20) {
|
||||
$pcError = _("The PC name may not be longer than 20 characters.");
|
||||
}
|
||||
$return->addElement(new htmlSpacer(null, '10px'), true);
|
||||
// add host
|
||||
$return->addElement(new htmlInputField('ip_add', '', 20));
|
||||
$newPCInput = new htmlInputField('pc_add', '', 20);
|
||||
elseif (strlen($this->fixed_ip[$id]['cn'])<2) {
|
||||
$pcError = _("The PC name needs to be at least 2 characters long.");
|
||||
}
|
||||
elseif (in_array($this->fixed_ip[$id]['cn'], $pcs) ) {
|
||||
$pcError = _("This PC name already exists.");
|
||||
}
|
||||
elseif (isset($_POST['pc_'.$id]) && !preg_match("/^[A-Za-z0-9\\._-]*$/", $_POST['pc_'.$id])) {
|
||||
$pcError = _("The PC name may only contain A-Z, a-z and 0-9.");
|
||||
}
|
||||
elseif ($existsInDifferentDn !== false) {
|
||||
$pcError = sprintf(_('This PC name already exists in %s. Use e.g. %s.'), $existsInDifferentDn[0], $existsInDifferentDn[1]);
|
||||
}
|
||||
$pcs[] = $this->fixed_ip[$id]['cn'];
|
||||
|
||||
// MAC address
|
||||
$macError = "";
|
||||
if (!$this->processed) {
|
||||
$macError = "";
|
||||
}
|
||||
elseif ($this->check_mac($this->fixed_ip[$id]['mac'])) {
|
||||
$macError = _("Invalid MAC address.");
|
||||
}
|
||||
|
||||
// descripton
|
||||
$descriptionError = "";
|
||||
if (!$this->processed) {
|
||||
$descriptionError = "";
|
||||
}
|
||||
elseif (!get_preg($this->fixed_ip[$id]['description'], 'ascii')) {
|
||||
$descriptionError = _("Invalid description.");
|
||||
}
|
||||
|
||||
// fixed ip
|
||||
$ipError = "";
|
||||
if (!$this->processed || ($this->fixed_ip[$id]['ip'] == '')) {
|
||||
$ipError = "";
|
||||
}
|
||||
elseif (!check_ip($this->fixed_ip[$id]['ip'])) {
|
||||
$ipError = _("The IP address is invalid.");
|
||||
}
|
||||
elseif (!range::check_subnet_range($this->fixed_ip[$id]['ip'],
|
||||
$this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0],
|
||||
$this->getAccountContainer()->getAccountModule('dhcp_settings')->getDHCPOption('subnet-mask'))) {
|
||||
$ipError = _("The IP address does not match the subnet.");
|
||||
}
|
||||
elseif (!$this->overlapd_ip($this->fixed_ip[$id]['ip'])) {
|
||||
$ipError = _("The IP address is already in use.");
|
||||
}
|
||||
$error = '';
|
||||
if ($pcError != '') {
|
||||
$error .= ' ' . $pcError;
|
||||
}
|
||||
if ($macError != '') {
|
||||
$error .= ' ' . $macError;
|
||||
}
|
||||
if ($ipError != '') {
|
||||
$error .= ' ' . $ipError;
|
||||
}
|
||||
if ($descriptionError != '') {
|
||||
$error .= ' ' . $descriptionError;
|
||||
}
|
||||
$return->addElement(new htmlInputField('ip_'.$id, $this->fixed_ip[$id]['ip'], 20));
|
||||
$pcInput = new htmlInputField('pc_'.$id, $this->fixed_ip[$id]['cn'], 20);
|
||||
if (!empty($autoNames)) {
|
||||
$newPCInput->enableAutocompletion($autoNames);
|
||||
$pcInput->enableAutocompletion($autoNames);
|
||||
}
|
||||
$return->addElement($newPCInput);
|
||||
$return->addElement(new htmlInputField('mac_add', '', 20));
|
||||
$return->addElement(new htmlInputField('description_add', '', 20));
|
||||
$return->addElement(new htmlInputCheckbox('active_add', true));
|
||||
$return->addElement(new htmlButton('add_ip', 'add.png', true), true);
|
||||
$return->addElement($pcInput);
|
||||
$return->addElement(new htmlInputField('mac_'.$id, $this->fixed_ip[$id]['mac'], 20));
|
||||
$return->addElement(new htmlInputField('description_'.$id, $this->fixed_ip[$id]['description'], 20));
|
||||
$return->addElement(new htmlInputCheckbox('active_'.$id, $this->fixed_ip[$id]['active']));
|
||||
$return->addElement(new htmlButton('drop_ip_'.$id, 'del.png', true));
|
||||
$return->addElement(new htmlOutputText($error), true);
|
||||
}
|
||||
$return->addElement(new htmlSpacer(null, '10px'), true);
|
||||
// add host
|
||||
$return->addElement(new htmlInputField('ip_add', '', 20));
|
||||
$newPCInput = new htmlInputField('pc_add', '', 20);
|
||||
if (!empty($autoNames)) {
|
||||
$newPCInput->enableAutocompletion($autoNames);
|
||||
}
|
||||
$return->addElement($newPCInput);
|
||||
$return->addElement(new htmlInputField('mac_add', '', 20));
|
||||
$return->addElement(new htmlInputField('description_add', '', 20));
|
||||
$return->addElement(new htmlInputCheckbox('active_add', true));
|
||||
$return->addElement(new htmlButton('add_ip', 'add.png', true), true);
|
||||
|
||||
// add existing host entry
|
||||
if (!empty($this->hostCache)) {
|
||||
$return->addVerticalSpace('20px');
|
||||
$addHostButton = new htmlAccountPageButton(get_class($this), 'addHost', 'add', _('Add existing host'));
|
||||
$addHostButton->setIconClass('createButton');
|
||||
$return->addElement($addHostButton , true);
|
||||
}
|
||||
// add existing host entry
|
||||
if (!empty($this->hostCache)) {
|
||||
$return->addVerticalSpace('20px');
|
||||
$addHostButton = new htmlAccountPageButton(get_class($this), 'addHost', 'add', _('Add existing host'));
|
||||
$addHostButton->setIconClass('createButton');
|
||||
$return->addElement($addHostButton , true);
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the given host name already exists.
|
||||
*
|
||||
* @param string $name host name
|
||||
* @return boolean|array false if not exists, DN + new name suggestion if exists
|
||||
*/
|
||||
private function hostNameExists($name) {
|
||||
$this->fillExistingDhcpHosts();
|
||||
foreach ($this->existingDhcpHostsCache as &$host) {
|
||||
if ($name === $host['name']) {
|
||||
$dn = $host['dn'];
|
||||
if ($this->getAccountContainer()->isNewAccount || strpos($dn, $this->getAccountContainer()->dn_orig) === false) {
|
||||
return array($dn, $this->getHostNameSuggestion($name));
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a suggestion for a free host name.
|
||||
*
|
||||
* @param string $name host name
|
||||
* @return string suggested new name
|
||||
*/
|
||||
private function getHostNameSuggestion($name) {
|
||||
$matches = array();
|
||||
$number = 0;
|
||||
$namePrefix = $name;
|
||||
if (preg_match('/(.*[^0-9])([0-9]+)/', $name, $matches)) {
|
||||
$namePrefix = $matches[1];
|
||||
$number = $matches[2];
|
||||
}
|
||||
while (true) {
|
||||
$number++;
|
||||
$newName = $namePrefix . $number;
|
||||
$found = false;
|
||||
foreach ($this->existingDhcpHostsCache as &$host) {
|
||||
if ($host['name'] === $newName) {
|
||||
$found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!$found) {
|
||||
return $newName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the HTML meta data for the add host page.
|
||||
*
|
||||
|
@ -869,6 +924,23 @@ class fixed_ip extends baseModule {
|
|||
return $this->getAccountContainer()->dn_orig == $rootSuffix;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fills the list of existing DHCP hosts.
|
||||
*/
|
||||
private function fillExistingDhcpHosts() {
|
||||
if ($this->existingDhcpHostsCache != null) {
|
||||
return $this->existingDhcpHostsCache;
|
||||
}
|
||||
$entries = searchLDAPByAttribute('cn', '*', 'dhcpHost', array('cn'), array('dhcp'));
|
||||
$this->existingDhcpHostsCache = array();
|
||||
foreach ($entries as $entry) {
|
||||
$this->existingDhcpHostsCache[] = array(
|
||||
'dn' => $entry['dn'],
|
||||
'name' => $entry['cn'][0]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
Loading…
Reference in New Issue