added description field, support to add existing host, fixed active flag
This commit is contained in:
		
							parent
							
								
									c2d22b6e46
								
							
						
					
					
						commit
						0ac34b07a4
					
				| 
						 | 
				
			
			@ -55,6 +55,7 @@ class fixed_ip extends baseModule {
 | 
			
		|||
	/** LDAP attributes */
 | 
			
		||||
	public $attributes;
 | 
			
		||||
	
 | 
			
		||||
	/** cached host entries (list of array('cn' => ..., 'iphostnumber' => ..., 'macaddress' => ...)) */
 | 
			
		||||
	private $hostCache = null;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
| 
						 | 
				
			
			@ -98,6 +99,10 @@ class fixed_ip extends baseModule {
 | 
			
		|||
				"Headline" => _("IP address"), 'attr' => 'dhcpStatements, fixed-address',
 | 
			
		||||
				"Text" => _("The IP address of the PC.")
 | 
			
		||||
			),
 | 
			
		||||
			'description' => array(
 | 
			
		||||
				"Headline" => _("Description"), 'attr' => 'dhcpComments',
 | 
			
		||||
				"Text" => _("Optional description for the PC.")
 | 
			
		||||
			),
 | 
			
		||||
			'active' => array(
 | 
			
		||||
				"Headline" => _("Active"), 'attr' => 'dhcpStatements, booting',
 | 
			
		||||
				"Text" => _("Inactive hosts will not be able to get an address from the DHCP server.")
 | 
			
		||||
| 
						 | 
				
			
			@ -213,7 +218,8 @@ class fixed_ip extends baseModule {
 | 
			
		|||
	 */
 | 
			
		||||
	function load_attributes($attr) {
 | 
			
		||||
	    if ($this->getAccountContainer()->dn_orig!=$_SESSION['config']->get_suffix('dhcp')) {
 | 
			
		||||
	    	$entries = searchLDAP($this->getAccountContainer()->dn_orig, '(objectClass=dhcpHost)', array('cn', 'dhcphwaddress', 'dhcpstatements'));
 | 
			
		||||
	    	$attributes = array('cn', 'dhcphwaddress', 'dhcpstatements', 'dhcpcomments');
 | 
			
		||||
	    	$entries = searchLDAP($this->getAccountContainer()->dn_orig, '(objectClass=dhcpHost)', $attributes);
 | 
			
		||||
			for ($i = 0; $i < sizeof($entries); $i++) {
 | 
			
		||||
				$dhcphwaddress = explode(" ", $entries[$i]['dhcphwaddress'][0]);
 | 
			
		||||
				$dhcphwaddress = array_pop($dhcphwaddress);
 | 
			
		||||
| 
						 | 
				
			
			@ -226,12 +232,18 @@ class fixed_ip extends baseModule {
 | 
			
		|||
				$this->fixed_ip[$i]['ip'] = self::extractIP($dhcpstatements);
 | 
			
		||||
				$this->fixed_ip[$i]['active'] = self::isActive($dhcpstatements);
 | 
			
		||||
				$this->fixed_ip[$i]['dhcpstatements'] = $dhcpstatements;
 | 
			
		||||
				$description = '';
 | 
			
		||||
				if (isset($entries[$i]['dhcpcomments'][0])) {
 | 
			
		||||
					$description = $entries[$i]['dhcpcomments'][0];
 | 
			
		||||
				}
 | 
			
		||||
				$this->fixed_ip[$i]['description'] = $description;
 | 
			
		||||
				
 | 
			
		||||
				$this->orig_ips[$i]['cn'] = $entries[$i]['cn'][0];
 | 
			
		||||
				$this->orig_ips[$i]['mac'] = $dhcphwaddress;
 | 
			
		||||
				$this->orig_ips[$i]['ip'] = self::extractIP($dhcpstatements);
 | 
			
		||||
				$this->orig_ips[$i]['active'] = self::isActive($dhcpstatements);
 | 
			
		||||
				$this->orig_ips[$i]['dhcpstatements'] = $dhcpstatements;
 | 
			
		||||
				$this->orig_ips[$i]['description'] = $description;
 | 
			
		||||
			}
 | 
			
		||||
			$this->orderByIP();
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -292,6 +304,15 @@ class fixed_ip extends baseModule {
 | 
			
		|||
					}
 | 
			
		||||
					$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]);
 | 
			
		||||
| 
						 | 
				
			
			@ -346,12 +367,17 @@ class fixed_ip extends baseModule {
 | 
			
		|||
			// 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' => array(),
 | 
			
		||||
					'active' => (isset($_POST['active_add']) && ($_POST['active_add'] == 'on')),
 | 
			
		||||
					'dhcpstatements' => $dhcpstatements,
 | 
			
		||||
					'active' => $active,
 | 
			
		||||
				);
 | 
			
		||||
				$this->orderByIP();
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -396,7 +422,12 @@ class fixed_ip extends baseModule {
 | 
			
		|||
        	$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);
 | 
			
		||||
| 
						 | 
				
			
			@ -437,6 +468,15 @@ class fixed_ip extends baseModule {
 | 
			
		|||
				    $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'] == '')) {
 | 
			
		||||
| 
						 | 
				
			
			@ -463,32 +503,111 @@ class fixed_ip extends baseModule {
 | 
			
		|||
				if ($ipError != '') {
 | 
			
		||||
					$error .= ' ' . $ipError;
 | 
			
		||||
				}
 | 
			
		||||
				$return->addElement(new htmlInputField('ip_'.$id, $this->fixed_ip[$id]['ip']));
 | 
			
		||||
				$pcInput = new htmlInputField('pc_'.$id, $this->fixed_ip[$id]['cn']);
 | 
			
		||||
				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']));
 | 
			
		||||
				$return->addElement(new htmlInputCheckbox('active', $this->fixed_ip[$id]['active']));
 | 
			
		||||
				$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', ''));
 | 
			
		||||
			$newPCInput = new htmlInputField('pc_add', '');
 | 
			
		||||
			// 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', ''));
 | 
			
		||||
			$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));
 | 
			
		||||
			$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);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return $return;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * Returns the HTML meta data for the add host page.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @return htmlElement HTML meta data
 | 
			
		||||
	 */
 | 
			
		||||
	public function display_html_addHost() {
 | 
			
		||||
		$return = new htmlTable();
 | 
			
		||||
		$this->initCache();
 | 
			
		||||
		$hostNames = array();
 | 
			
		||||
		$spacer = '####';
 | 
			
		||||
		foreach ($this->hostCache as $host) {
 | 
			
		||||
			if (!empty($host['cn'][0])) {
 | 
			
		||||
				$val = $host['cn'][0];
 | 
			
		||||
				if (!empty($host['iphostnumber'][0])) {
 | 
			
		||||
					$val .= $spacer . $host['iphostnumber'][0];
 | 
			
		||||
				}
 | 
			
		||||
				else {
 | 
			
		||||
					$val .= $spacer;
 | 
			
		||||
				}
 | 
			
		||||
				if (!empty($host['macaddress'][0])) {
 | 
			
		||||
					$val .= $spacer . $host['macaddress'][0];
 | 
			
		||||
				}
 | 
			
		||||
				else {
 | 
			
		||||
					$val .= $spacer;
 | 
			
		||||
				}
 | 
			
		||||
				$hostNames[$host['cn'][0]] = $val;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		$select = new htmlTableExtendedSelect('host', $hostNames, array(), _('Host'));
 | 
			
		||||
		$select->setHasDescriptiveElements(true);
 | 
			
		||||
		$return->addElement($select, true);
 | 
			
		||||
		$return->addVerticalSpace('20px');
 | 
			
		||||
		$buttonContainer = new htmlTable();
 | 
			
		||||
		$buttonContainer->colspan = 3;
 | 
			
		||||
		$buttonContainer->addElement(new htmlAccountPageButton(get_class($this), 'attributes', 'addHost', _('Add')));
 | 
			
		||||
		$buttonContainer->addElement(new htmlAccountPageButton(get_class($this), 'attributes', 'cancel', _('Cancel')));
 | 
			
		||||
		$return->addElement($buttonContainer, true);
 | 
			
		||||
		return $return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	* Processes user input of the add host 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_addHost() {
 | 
			
		||||
		$errors = array();
 | 
			
		||||
		if (isset($_POST['form_subpage_fixed_ip_attributes_addHost'])) {
 | 
			
		||||
			$val = explode('####', $_POST['host']);
 | 
			
		||||
		    $dhcpstatements = array();
 | 
			
		||||
		    $this->setActive($dhcpstatements, true);
 | 
			
		||||
		    $this->setIP($dhcpstatements, $val[1]);
 | 
			
		||||
			$this->fixed_ip[] = array(
 | 
			
		||||
				'cn' => $val[0],
 | 
			
		||||
				'mac' => $val[2],
 | 
			
		||||
				'description' => '',
 | 
			
		||||
				'ip' => $val[1],
 | 
			
		||||
				'dhcpstatements' => $dhcpstatements,
 | 
			
		||||
				'active' => true,
 | 
			
		||||
			);
 | 
			
		||||
			$this->orderByIP();
 | 
			
		||||
		}
 | 
			
		||||
		return $errors;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	* Returns a list of modifications which have to be made to the LDAP account.
 | 
			
		||||
	*
 | 
			
		||||
| 
						 | 
				
			
			@ -532,10 +651,19 @@ class fixed_ip extends baseModule {
 | 
			
		|||
							$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 active changed
 | 
			
		||||
						if($this->orig_ips[$id]['active'] != $this->fixed_ip[$idB]['active']) {
 | 
			
		||||
							$this->setActive($this->fixed_ip[$idB]['dhcpstatements'], $this->fixed_ip[$idB]['active']);
 | 
			
		||||
							$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']) {
 | 
			
		||||
						if($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']);
 | 
			
		||||
						}
 | 
			
		||||
						// check if description changed
 | 
			
		||||
						if($this->orig_ips[$id]['description'] != $this->fixed_ip[$idB]['description']) {
 | 
			
		||||
							$mod['cn=' . $this->orig_ips[$id]['cn'] . $ldapSuffix]['dhcpComments'][] = $this->fixed_ip[$idB]['description'];
 | 
			
		||||
						}
 | 
			
		||||
						break;
 | 
			
		||||
				    }
 | 
			
		||||
				}
 | 
			
		||||
| 
						 | 
				
			
			@ -577,8 +705,12 @@ class fixed_ip extends baseModule {
 | 
			
		|||
					$attr['dhcpStatements'][] = 'deny booting';
 | 
			
		||||
				}
 | 
			
		||||
				$attr['dhcpOption'] = 'host-name "' . $add[$id]['cn'] . '"';
 | 
			
		||||
				if ($attr['cn'] != "")
 | 
			
		||||
				if (!empty($arr['description'])) {
 | 
			
		||||
					$attr['dhcpComments'][] = $arr['description'];
 | 
			
		||||
				}
 | 
			
		||||
				if ($attr['cn'] != "") {
 | 
			
		||||
					ldap_add($_SESSION['ldap']->server(), 'cn=' . $add[$id]['cn'] . $ldapSuffix, $attr);
 | 
			
		||||
				}
 | 
			
		||||
		    }
 | 
			
		||||
		    // entries to modify
 | 
			
		||||
		    foreach ($mod as $dn => $attrs) {
 | 
			
		||||
| 
						 | 
				
			
			@ -601,7 +733,8 @@ class fixed_ip extends baseModule {
 | 
			
		|||
				'<td width="20%" align=\"L\"><b>' . _('PC name') . "</b></td>" .
 | 
			
		||||
				"<td width=\"20%\" align=\"L\"><b>" . _('IP address') . "</b></td>" .
 | 
			
		||||
				"<td width=\"20%\" align=\"L\"><b>" . _('MAC address') . '</b></td>' .
 | 
			
		||||
				"<td width=\"20%\" align=\"L\"><b>" . _('Active') . '</b></td>' .
 | 
			
		||||
				"<td width=\"10%\" align=\"L\"><b>" . _('Active') . '</b></td>' .
 | 
			
		||||
				"<td width=\"30%\" align=\"L\"><b>" . _('Description') . '</b></td>' .
 | 
			
		||||
			'</tr></block>');
 | 
			
		||||
			for ($i = 0; $i < sizeof($this->fixed_ip); $i++) {
 | 
			
		||||
				$name = $this->fixed_ip[$i]['cn'];
 | 
			
		||||
| 
						 | 
				
			
			@ -611,11 +744,13 @@ class fixed_ip extends baseModule {
 | 
			
		|||
				if (!$this->fixed_ip[$i]['active']) {
 | 
			
		||||
					$active = _('no');
 | 
			
		||||
				}
 | 
			
		||||
				$description = $this->fixed_ip[$i]['description'];
 | 
			
		||||
				$return[get_class($this) . '_IPlist'][] = '<block><tr>' .
 | 
			
		||||
					'<td width="20%" align=\"L\">' . $name . "</td>" .
 | 
			
		||||
					"<td width=\"20%\" align=\"L\">" . $ip . " </td>" .
 | 
			
		||||
					"<td width=\"20%\" align=\"L\">" . $mac . '</td>'. 
 | 
			
		||||
					"<td width=\"20%\" align=\"L\">" . $active . '</td>'. 
 | 
			
		||||
					"<td width=\"10%\" align=\"L\">" . $active . '</td>'. 
 | 
			
		||||
					"<td width=\"30%\" align=\"L\">" . $description . ' </td>'. 
 | 
			
		||||
				'</tr></block>';
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -686,13 +821,16 @@ class fixed_ip extends baseModule {
 | 
			
		|||
	 */
 | 
			
		||||
	private function setActive(&$dhcpStatements, $active) {
 | 
			
		||||
		for ($i = 0; $i < sizeof($dhcpStatements); $i++) {
 | 
			
		||||
			if (strpos($dhcpStatements[$i], ' booting') === (strlen($dhcpStatements[$i]) - strlen(' booting'))) {
 | 
			
		||||
			if (strpos($dhcpStatements[$i], ' booting') !== false) {
 | 
			
		||||
				unset($dhcpStatements[$i]);
 | 
			
		||||
				$dhcpStatements = array_values($dhcpStatements);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if (!$active) {
 | 
			
		||||
			$dhcpStatements[] = 'allow booting ';
 | 
			
		||||
		if ($active) {
 | 
			
		||||
			$dhcpStatements[] = 'allow booting';
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			$dhcpStatements[] = 'deny booting';
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue