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,110 +290,111 @@ class fixed_ip extends baseModule {
|
||||||
*/
|
*/
|
||||||
public function process_attributes() {
|
public function process_attributes() {
|
||||||
$errors = array();
|
$errors = array();
|
||||||
if (!$this->isRootNode()) {
|
if ($this->isRootNode()) {
|
||||||
$this->processed = true;
|
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()?
|
$error = false; // errors by process_attributes()?
|
||||||
$pcs = array();
|
$pcs = array();
|
||||||
foreach($this->fixed_ip AS $id=>$arr) {
|
foreach($this->fixed_ip AS $id=>$arr) {
|
||||||
|
|
||||||
// Check if ip is to drop
|
// Check if ip is to drop
|
||||||
if (isset($_POST['drop_ip_'.$id])) {
|
if (isset($_POST['drop_ip_'.$id])) {
|
||||||
// Drop ip:
|
// Drop ip:
|
||||||
unset($this->fixed_ip[$id]);
|
unset($this->fixed_ip[$id]);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// MAC address
|
// MAC address
|
||||||
$_POST['mac_'.$id] = strtolower(trim($_POST['mac_'.$id]));
|
$_POST['mac_'.$id] = strtolower(trim($_POST['mac_'.$id]));
|
||||||
|
|
||||||
$invalid = $this->check_mac($_POST['mac_'.$id]);
|
$invalid = $this->check_mac($_POST['mac_'.$id]);
|
||||||
if ($invalid) {
|
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;
|
$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 {
|
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) {
|
else {
|
||||||
$errors[] = $this->messages['errors'][0];
|
$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
|
// Add new IP
|
||||||
if (isset($_POST['add_ip']) || ($_POST['pc_add'] != '') || ($_POST['mac_add'] != '')) {
|
if (isset($_POST['add_ip']) || ($_POST['pc_add'] != '') || ($_POST['mac_add'] != '')) {
|
||||||
// Add IP:
|
// Add IP:
|
||||||
$active = (isset($_POST['active_add']) && ($_POST['active_add'] == 'on'));
|
$active = (isset($_POST['active_add']) && ($_POST['active_add'] == 'on'));
|
||||||
$dhcpstatements = array();
|
$dhcpstatements = array();
|
||||||
$this->setActive($dhcpstatements, $active);
|
$this->setActive($dhcpstatements, $active);
|
||||||
$this->setIP($dhcpstatements, $_POST['ip_add']);
|
$this->setIP($dhcpstatements, $_POST['ip_add']);
|
||||||
$this->fixed_ip[] = array(
|
$this->fixed_ip[] = array(
|
||||||
'cn' => $_POST['pc_add'],
|
'cn' => $_POST['pc_add'],
|
||||||
'mac' => $_POST['mac_add'],
|
'mac' => $_POST['mac_add'],
|
||||||
'description' => $_POST['description_add'],
|
'description' => $_POST['description_add'],
|
||||||
'ip' => $_POST['ip_add'],
|
'ip' => $_POST['ip_add'],
|
||||||
'dhcpstatements' => $dhcpstatements,
|
'dhcpstatements' => $dhcpstatements,
|
||||||
'active' => $active,
|
'active' => $active,
|
||||||
);
|
);
|
||||||
$this->orderByIP();
|
$this->orderByIP();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $errors;
|
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->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();
|
if (!empty($this->hostCache) && (sizeof($this->hostCache) < 200)) {
|
||||||
if (!empty($this->hostCache) && (sizeof($this->hostCache) < 200)) {
|
foreach ($this->hostCache as $index => $attrs) {
|
||||||
foreach ($this->hostCache as $index => $attrs) {
|
if (!empty($attrs['cn'][0])) {
|
||||||
if (!empty($attrs['cn'][0])) {
|
$autoNames[] = $attrs['cn'][0];
|
||||||
$autoNames[] = $attrs['cn'][0];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
$autoNames = array_values(array_unique($autoNames));
|
|
||||||
}
|
}
|
||||||
// caption
|
$autoNames = array_values(array_unique($autoNames));
|
||||||
$ipContainer = new htmlTable();
|
}
|
||||||
$ipContainer->addElement(new htmlOutputText(_('IP address')));
|
// caption
|
||||||
$ipContainer->addElement(new htmlHelpLink('ip'));
|
$ipContainer = new htmlTable();
|
||||||
$return->addElement($ipContainer);
|
$ipContainer->addElement(new htmlOutputText(_('IP address')));
|
||||||
$pcContainer = new htmlTable();
|
$ipContainer->addElement(new htmlHelpLink('ip'));
|
||||||
$pcContainer->addElement(new htmlOutputText(_('PC name'), true, true));
|
$return->addElement($ipContainer);
|
||||||
$pcContainer->addElement(new htmlHelpLink('pc'));
|
$pcContainer = new htmlTable();
|
||||||
$return->addElement($pcContainer);
|
$pcContainer->addElement(new htmlOutputText(_('PC name'), true, true));
|
||||||
$macContainer = new htmlTable();
|
$pcContainer->addElement(new htmlHelpLink('pc'));
|
||||||
$macContainer->addElement(new htmlOutputText(_('MAC address'), true, true));
|
$return->addElement($pcContainer);
|
||||||
$macContainer->addElement(new htmlHelpLink('mac'));
|
$macContainer = new htmlTable();
|
||||||
$return->addElement($macContainer);
|
$macContainer->addElement(new htmlOutputText(_('MAC address'), true, true));
|
||||||
$commentContainer = new htmlTable();
|
$macContainer->addElement(new htmlHelpLink('mac'));
|
||||||
$commentContainer->addElement(new htmlOutputText(_('Description'), true));
|
$return->addElement($macContainer);
|
||||||
$commentContainer->addElement(new htmlHelpLink('description'));
|
$commentContainer = new htmlTable();
|
||||||
$return->addElement($commentContainer);
|
$commentContainer->addElement(new htmlOutputText(_('Description'), true));
|
||||||
$activeContainer = new htmlTable();
|
$commentContainer->addElement(new htmlHelpLink('description'));
|
||||||
$activeContainer->colspan = 2;
|
$return->addElement($commentContainer);
|
||||||
$activeContainer->addElement(new htmlOutputText(_('Active')));
|
$activeContainer = new htmlTable();
|
||||||
$activeContainer->addElement(new htmlHelpLink('active'));
|
$activeContainer->colspan = 2;
|
||||||
$return->addElement($activeContainer, true);
|
$activeContainer->addElement(new htmlOutputText(_('Active')));
|
||||||
// Reset oberlaped ips
|
$activeContainer->addElement(new htmlHelpLink('active'));
|
||||||
$this->reset_overlapd_ip();
|
$return->addElement($activeContainer, true);
|
||||||
|
// Reset oberlaped ips
|
||||||
|
$this->reset_overlapd_ip();
|
||||||
|
|
||||||
// If $ranges is not a array, then create one:
|
// If $ranges is not a array, then create one:
|
||||||
if (!is_array($this->fixed_ip)) {
|
if (!is_array($this->fixed_ip)) {
|
||||||
$this->fixed_ip = array();
|
$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();
|
elseif (strlen($this->fixed_ip[$id]['cn'])>20) {
|
||||||
foreach($this->fixed_ip AS $id=>$arr) {
|
$pcError = _("The PC name may not be longer than 20 characters.");
|
||||||
// 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);
|
|
||||||
}
|
}
|
||||||
$return->addElement(new htmlSpacer(null, '10px'), true);
|
elseif (strlen($this->fixed_ip[$id]['cn'])<2) {
|
||||||
// add host
|
$pcError = _("The PC name needs to be at least 2 characters long.");
|
||||||
$return->addElement(new htmlInputField('ip_add', '', 20));
|
}
|
||||||
$newPCInput = new htmlInputField('pc_add', '', 20);
|
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)) {
|
if (!empty($autoNames)) {
|
||||||
$newPCInput->enableAutocompletion($autoNames);
|
$pcInput->enableAutocompletion($autoNames);
|
||||||
}
|
}
|
||||||
$return->addElement($newPCInput);
|
$return->addElement($pcInput);
|
||||||
$return->addElement(new htmlInputField('mac_add', '', 20));
|
$return->addElement(new htmlInputField('mac_'.$id, $this->fixed_ip[$id]['mac'], 20));
|
||||||
$return->addElement(new htmlInputField('description_add', '', 20));
|
$return->addElement(new htmlInputField('description_'.$id, $this->fixed_ip[$id]['description'], 20));
|
||||||
$return->addElement(new htmlInputCheckbox('active_add', true));
|
$return->addElement(new htmlInputCheckbox('active_'.$id, $this->fixed_ip[$id]['active']));
|
||||||
$return->addElement(new htmlButton('add_ip', 'add.png', true), true);
|
$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
|
// add existing host entry
|
||||||
if (!empty($this->hostCache)) {
|
if (!empty($this->hostCache)) {
|
||||||
$return->addVerticalSpace('20px');
|
$return->addVerticalSpace('20px');
|
||||||
$addHostButton = new htmlAccountPageButton(get_class($this), 'addHost', 'add', _('Add existing host'));
|
$addHostButton = new htmlAccountPageButton(get_class($this), 'addHost', 'add', _('Add existing host'));
|
||||||
$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