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/)
|
This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
|
||||||
Copyright (C) 2008 Thomas Manninger
|
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
|
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
|
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' => ...)) */
|
/** cached host entries (list of array('cn' => ..., 'iphostnumber' => ..., 'macaddress' => ...)) */
|
||||||
private $hostCache = null;
|
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.
|
* Returns true if this module can manage accounts of the current type, otherwise false.
|
||||||
*
|
*
|
||||||
|
@ -287,7 +290,9 @@ class fixed_ip extends baseModule {
|
||||||
*/
|
*/
|
||||||
public function process_attributes() {
|
public function process_attributes() {
|
||||||
$errors = array();
|
$errors = array();
|
||||||
if (!$this->isRootNode()) {
|
if ($this->isRootNode()) {
|
||||||
|
return $errors;
|
||||||
|
}
|
||||||
$this->processed = true;
|
$this->processed = true;
|
||||||
|
|
||||||
$this->reset_overlapd_ip();
|
$this->reset_overlapd_ip();
|
||||||
|
@ -350,7 +355,7 @@ class fixed_ip extends baseModule {
|
||||||
if (!empty($_POST['pc_'.$id])) $_POST['pc_'.$id] = trim($_POST['pc_'.$id]);
|
if (!empty($_POST['pc_'.$id])) $_POST['pc_'.$id] = trim($_POST['pc_'.$id]);
|
||||||
if (!empty($_POST['pc_'.$id])) {
|
if (!empty($_POST['pc_'.$id])) {
|
||||||
|
|
||||||
// Already use?
|
// name already in use
|
||||||
if (in_array($_POST['pc_'.$id], $pcs) ) {
|
if (in_array($_POST['pc_'.$id], $pcs) ) {
|
||||||
$error = true;
|
$error = true;
|
||||||
}
|
}
|
||||||
|
@ -391,7 +396,6 @@ class fixed_ip extends baseModule {
|
||||||
);
|
);
|
||||||
$this->orderByIP();
|
$this->orderByIP();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return $errors;
|
return $errors;
|
||||||
}
|
}
|
||||||
|
@ -407,7 +411,6 @@ class fixed_ip extends baseModule {
|
||||||
$return->addElement(new htmlStatusMessage('ERROR', _("Please fill out the DHCP settings first.")), true);
|
$return->addElement(new htmlStatusMessage('ERROR', _("Please fill out the DHCP settings first.")), true);
|
||||||
return $return;
|
return $return;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
$this->initCache();
|
$this->initCache();
|
||||||
// auto-completion for host names
|
// auto-completion for host names
|
||||||
$autoNames = array();
|
$autoNames = array();
|
||||||
|
@ -452,6 +455,7 @@ class fixed_ip extends baseModule {
|
||||||
foreach($this->fixed_ip AS $id=>$arr) {
|
foreach($this->fixed_ip AS $id=>$arr) {
|
||||||
// pc name
|
// pc name
|
||||||
$pcError = "";
|
$pcError = "";
|
||||||
|
$existsInDifferentDn = $this->hostNameExists($_POST['pc_'.$id]);
|
||||||
if (!$this->processed) {
|
if (!$this->processed) {
|
||||||
$pcError = "";
|
$pcError = "";
|
||||||
}
|
}
|
||||||
|
@ -467,6 +471,9 @@ class fixed_ip extends baseModule {
|
||||||
elseif (isset($_POST['pc_'.$id]) && !preg_match("/^[A-Za-z0-9\\._-]*$/", $_POST['pc_'.$id])) {
|
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.");
|
$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'];
|
$pcs[] = $this->fixed_ip[$id]['cn'];
|
||||||
|
|
||||||
// MAC address
|
// MAC address
|
||||||
|
@ -548,10 +555,58 @@ class fixed_ip extends baseModule {
|
||||||
$addHostButton->setIconClass('createButton');
|
$addHostButton->setIconClass('createButton');
|
||||||
$return->addElement($addHostButton , true);
|
$return->addElement($addHostButton , true);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return $return;
|
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.
|
* 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;
|
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