255) // non-subnet must be > 0 on last digit || (!$subnet && ($i == 3) && ($part[$i] < 1)) // subnet must be >= 0 on last digit || ($subnet && ($i == 3) && ($part[$i] < 0))) { return false; } } } return true; } } /** * Manages DHCP entries. * * @package modules */ class dhcp_settings extends baseModule { /** all netbios node types */ private $all_netbios_node_types; /** unknown-client options */ private $allowDenyOptions; /** LDAP attributes */ public $attributes; /** * Creates a new dhcp_settings object. * * @param string $scope account type */ function __construct($scope) { // list of node types $this->all_netbios_node_types = array( "1" => _("B-Node (0x01)"), "2" => _("P-Node (0x02)"), "4" => _("M-Node (0x04)"), "8" => _("H-Node (0x08)") ); $this->allowDenyOptions = array( '-' => '', 'allow' => _("Allow"), 'deny' => _("Deny"), ); // call parent constructor parent::__construct($scope); } /** * Returns true if this module can manage accounts of the current type, otherwise false. * * @return boolean true if module fits */ public function can_manage() { return in_array($this->get_scope(), array('dhcp')); } /** * Returns meta data that is interpreted by parent class * * @return array array with meta data */ public function get_metaData() { $return = array(); // alias name $return["alias"] = _("DHCP settings"); // this is a base module $return["is_base"] = true; // icon $return['icon'] = 'dhcpBig.png'; // RDN attribute $return["RDN"] = array("cn" => "high"); // LDAP filter $return["ldap_filter"] = array(); // module dependencies $return['dependencies'] = array('depends' => array(), 'conflicts' => array()); // managed object classes $return['objectClasses'] = array('top', 'dhcpOptions', 'dhcpSubnet'); // managed attributes $return['attributes'] = array('cn', 'dhcpOption', 'dhcpComments', 'dhcpNetMask', 'dhcpStatements'); // help Entries $return['help'] = array( 'domainname' => array( "Headline" => _("Domain name"), "Text" => _("The domain name of the subnet.") ), 'subnet' => array( "Headline" => _("Subnet"), 'attr' => 'cn', "Text" => _("The name of the subnet. Example: 192.168.10.0") ), 'leasetime' => array( "Headline" => _("Lease time"), "Text" => _("The lease time specifies after how many seconds the client should request a new IP address.") ), 'max_leasetime' => array( "Headline" => _("Maximum lease time"), "Text" => _("The maximum lease time specifies after how many seconds the client must request a new IP address.") ), 'dns' => array( "Headline" => _("DNS (Domain Name System)"), "Text" => _("The IP addresses of the DNS servers. Multiple addresses are separated by \",\". Example: 192.168.0.10, 192.168.0.11") ), 'gateway' => array( "Headline" => _("Default gateway"), "Text" => _("Packets are sent to the default gateway if the receiver does not reside in the same network. The default gateway routes them to the target network.") ), 'netbios' => array( "Headline" => _("Netbios name servers"), "Text" => _("The IP addresses of the Netbios name servers (e.g. \"123.123.123.123, 123.123.123.124\").") ), 'netbios_type' => array( "Headline" => _("Netbios node type"), "Text" => _("B-Node (0x01): Broadcast.
The client tries to find other workstations via broadcasting (works only inside the same collision domain, viz. the same subnet).

P-Node (0x02): Point-To-Point
The client contacts a Netbios name server (NBNS) from Microsoft Windows Name Service (WINS) for name resolution.

M-Node (0x04): Mixed
The node tries broadcasting first. If that fails then it tries WINS.

H-Node (0x08): Hybrid
The node tries WINS first. If that fails it tries broadcasting.

By default, the nodes are configured as H-Nodes which fits for small networks. In large networks Point-to-Point (0x02) should be used.") ), 'subnetmask' => array( "Headline" => _("Subnet mask"), "Text" => _("The subnet mask of the network.") ), 'netmask' => array( "Headline" => _("Net mask"), 'attr' => 'dhcpNetMask', "Text" => _("The net mask is derived from the subnet mask. LAM will calculate it automatically.") ), '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.") ), 'INFO_domain-search' => array( 'Headline' => _('Search domains'), 'attr' => 'dhcpOptions', 'Text' => _('This is a list of domain names to be used by the client to locate not-fully-qualified domain names.') ), 'domain-search' => array( 'Headline' => _('Search domains'), 'attr' => 'dhcpOptions', 'Text' => _('This is a list of domain names to be used by the client to locate not-fully-qualified domain names.') . ' ' . _("Multiple values are separated by semicolon.") ), ); // available PDF fields $return['PDF_fields'] = array( 'subnet' => _('Subnet'), 'domainName' => _('Domain name'), 'leaseTime' => _('Lease time'), 'maxLeaseTime' => _('Maximum lease time'), 'DNSserver' => _('DNS'), 'gateway' => _('Default gateway'), 'netbiosServer' => _('Netbios name servers'), 'netbiosType' => _('Netbios node type'), 'subnetMask' => _('Subnet mask'), 'netMask' => _('Net mask'), 'description' => _('Description'), 'unknownClients' => _('Unknown clients'), 'domain-search' => _('Search domains'), ); // profile elements $profileContainer = new htmlResponsiveRow(); $profileContainer->add(new htmlResponsiveInputField(_('Subnet'), 'cn', null, 'subnet'), 12); $profileContainer->add(new htmlResponsiveInputField(_('Domain name'), 'domainname', null, 'domainname'), 12); $profileContainer->add(new htmlResponsiveInputField(_('Lease time'), 'lease_time', null, 'leasetime'), 12); $profileContainer->add(new htmlResponsiveInputField(_('Maximum lease time'), 'max_lease_time', null, 'max_leasetime'), 12); $profileContainer->add(new htmlResponsiveInputField(_('DNS'), 'dns', null, 'dns'), 12); $profileContainer->add(new htmlResponsiveInputField(_('Search domains'), 'domain-search', null, 'domain-search'), 12); $profileContainer->add(new htmlResponsiveInputField(_('Default gateway'), 'routers', null, 'gateway'), 12); $profileContainer->add(new htmlResponsiveInputField(_('Netbios name servers'), 'netbios', null, 'netbios'), 12); $nodeList = array_flip($this->all_netbios_node_types); $profileNodeSelect = new htmlResponsiveSelect('netbios_node_type', $nodeList, null, _('Netbios node type'), 'netbios_type'); $profileNodeSelect->setHasDescriptiveElements(true); $profileContainer->add($profileNodeSelect, 12); $profileContainer->add(new htmlResponsiveInputField(_('Subnet mask'), 'subnet', null, 'subnetmask'), 12); $return['profile_options'] = $profileContainer; // upload fields $uploadAllowDenyOption = $this->allowDenyOptions; unset($uploadAllowDenyOption['-']); $uploadAllowDenyOption = implode(', ', $uploadAllowDenyOption); $return['upload_columns'] = array( array( 'name' => 'dhcp_settings_subnet', 'description' => _('Subnet'), 'help' => 'subnet', 'example' => '192.168.10.0', 'required' => true, 'unique' => true ), array( 'name' => 'dhcp_settings_domainName', 'description' => _('Domain name'), 'help' => 'domainname', 'example' => 'mydomain.com', ), array( 'name' => 'dhcp_settings_leaseTime', 'description' => _('Lease time'), 'help' => 'leasetime', 'example' => '86400', ), array( 'name' => 'dhcp_settings_maxLeaseTime', 'description' => _('Maximum lease time'), 'help' => 'max_leasetime', 'example' => '172800', ), array( 'name' => 'dhcp_settings_DNSserver', 'description' => _('DNS'), 'help' => 'dns', 'example' => '192.168.10.250', ), array( 'name' => 'dhcp_settings_domain-search', 'description' => _('Search domains'), 'help' => 'domain-search', 'example' => 'example.com', ), array( 'name' => 'dhcp_settings_gateway', 'description' => _('Default gateway'), 'help' => 'gateway', 'example' => '192.168.10.251', ), array( 'name' => 'dhcp_settings_netbiosServer', 'description' => _('Netbios name servers'), 'help' => 'netbios', 'example' => '192.168.10.252, 192.168.10.253', ), array( 'name' => 'dhcp_settings_netbiosType', 'description' => _('Netbios node type'), 'help' => 'netbios_type', 'example' => 'M', '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'), 'help' => 'subnetmask', 'required' => true, 'example' => '255.255.255.0', ), array( 'name' => 'dhcp_settings_description', 'description' => _('Description'), 'help' => 'description', ), ); return $return; } /** * This function fills the message array. */ public function load_Messages() { $this->messages['cn'][0] = array('ERROR', _('No subnet entered.')); $this->messages['cn'][1] = array('ERROR', _('The subnet is already in use.')); $this->messages['cn'][2] = array('ERROR', _('The subnet is invalid.')); $this->messages['cn'][3] = array('ERROR', _('Account %s:') . ' dhcp_settings_subnet', _('The subnet is invalid.')); $this->messages['dns'][0] = array('ERROR', _('You entered one or more invalid DNS servers.')); $this->messages['dns'][1] = array('ERROR', _('Account %s:') . ' dhcp_settings_DNSserver', _('You entered one or more invalid DNS servers.')); $this->messages['lease_time'][0] = array('ERROR', _('The lease time is invalid.')); $this->messages['lease_time'][1] = array('ERROR', _('Account %s:') . ' dhcp_settings_leaseTime', _('The lease time is invalid.')); $this->messages['routers'][0] = array('ERROR', _('The default gateway is invalid.')); $this->messages['routers'][1] = array('ERROR', _('Account %s:') . ' dhcp_settings_gateway', _('The default gateway is invalid.')); $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.')); $this->messages['subnet'][1] = array('ERROR', _('Account %s:') . ' dhcp_settings_subnetMask', _('The subnet mask is invalid.')); $this->messages['ranges_reload'][0] = array('INFO', _('The DHCP ranges were changed to fit for the new subnet.')); $this->messages['ips_reload'][0] = array('INFO', _('The fixed IP addresses were changed to fit for the new subnet.')); $this->messages['domainname'][2] = array('ERROR', _('The domain name includes invalid characters. Valid characters are A-Z, a-z, 0-9, ".", "_","-".')); $this->messages['domainname'][5] = array('ERROR', _('Account %s:') . ' dhcp_settings_domainName', _('The domain name includes invalid characters. Valid characters are A-Z, a-z, 0-9, ".", "_","-".')); $this->messages['INFO_domain-search'][0] = array('ERROR', _('Please enter valid domain names for search domains.')); $this->messages['INFO_domain-search'][1] = array('ERROR', _('Account %s:') . ' dhcp_settings_domain-search', _('Please enter valid domain names for search domains.')); } /** * Returns a list of modifications which have to be made to the LDAP account. * * @return array list of modifications *
This function returns an array with 3 entries: *
array( DN1 ('add' => array($attr), 'remove' => array($attr), 'modify' => array($attr)), DN2 .... ) *
DN is the DN to change. It may be possible to change several DNs (e.g. create a new user and add him to some groups via attribute memberUid) *
"add" are attributes which have to be added to LDAP entry *
"remove" are attributes which have to be removed from LDAP entry *
"modify" are attributes which have to been modified in LDAP entry *
"info" are values with informational value (e.g. to be used later by pre/postModify actions) */ public function save_attributes() { // remove dhcpSubnet object class if only the DHCP settings were changed if ($this->isRootNode()) { if (!in_array_ignore_case("dhcpSubnet", $this->orig['objectClass']) && in_array_ignore_case("dhcpSubnet", $this->attributes['objectClass'])) { $this->attributes['objectClass'] = array_delete(array("dhcpSubnet"), $this->attributes['objectClass']); } } $return = parent::save_attributes(); return $return; } /** * Processes user input of the primary module 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_attributes() { // check if DHCP main settings and valid DHCP entry if ($this->isRootNode()) { if (!in_array_ignore_case('dhcpService', $this->attributes['objectClass']) && !in_array_ignore_case('dhcpServer', $this->attributes['objectClass'])) { return array(); } } $errors = array(); // Check if cn is not empty if (!$this->isRootNode()) { if (!empty($_POST['cn'])) $_POST['cn'] = trim($_POST['cn']); $this->attributes['cn'][0] = $_POST['cn']; if (empty($_POST['cn'])) { $errors[] = $this->messages['cn'][0]; } // Check, if cn is not already use: elseif ((sizeof(searchLDAPByAttribute('cn', $_POST['cn'], 'dhcpOptions', array('cn'), array('dhcp'))) > 0) && $this->orig['cn']['0']!=$_POST['cn']) { $errors[] = $this->messages['cn'][1]; } elseif (!check_ip($_POST['cn'],true)) { $errors[] = $this->messages['cn'][2]; } else { // if the cn was edit, reload the Ranges: if ($this->getAccountContainer()->getAccountModule('range')->reload_ranges()) $errors[] = $this->messages['ranges_reload'][0]; // if the cn was edit, reload the ips: if ($this->getAccountContainer()->getAccountModule('fixed_ip')->reload_ips()) $errors[] = $this->messages['ips_reload'][0]; } $this->setUnknownClients($_POST['unknownClients']); } // Check domainname: if (!empty($_POST['domainname'])) $_POST['domainname'] = trim($_POST['domainname']); if (!empty($_POST['domainname'])) { if (!preg_match("/^[A-Za-z0-9\\._-]*$/", $_POST['domainname'])) { $errors[] = $this->messages['domainname'][2]; } } $this->setDHCPOption('domain-name', '"' . $_POST['domainname'] . '"'); // Check DNS if (!empty($_POST['dns'])) { $_POST['dns'] = trim($_POST['dns']); $ex = explode(",", $_POST['dns']); $is_first=true; $invalid = false; foreach($ex AS $string) { if ($is_first) { $is_first=false; } if (!check_ip($string)) { $invalid = true; } } if ($invalid) { $errors[] = $this->messages['dns'][0]; } } $this->setDHCPOption('domain-name-servers', $_POST['dns']); // domain search $this->processMultiValueInputTextField('INFO_domain-search', $errors, 'domainname'); foreach ($this->attributes['INFO_domain-search'] as $key => $domainName) { $this->attributes['INFO_domain-search'][$key] = '"' . $domainName . '"'; } $domainSearch = implode(', ', $this->attributes['INFO_domain-search']); $this->setDHCPOption('domain-search', $domainSearch); unset($this->attributes['INFO_domain-search']); // Lease Time if (!empty($_POST['lease_time'])) { $_POST['lease_time'] = trim($_POST['lease_time']); } $this->setDefaultLeaseTime($_POST['lease_time']); if (!is_numeric($_POST['lease_time']) && !empty($_POST['lease_time'])) { $errors[] = $this->messages['lease_time'][0]; } // Max lease Time if (!empty($_POST['max_lease_time'])) { $_POST['max_lease_time'] = trim($_POST['max_lease_time']); } $this->setMaxLeaseTime($_POST['max_lease_time']); if (!is_numeric($_POST['max_lease_time']) && !empty($_POST['max_lease_time'])) { $errors[] = $this->messages['max_lease_time'][0]; } // Default Gateway if (!empty($_POST['routers'])) { $_POST['routers'] = trim($_POST['routers']); if (!check_ip($_POST['routers'])) { $errors[] = $this->messages['routers'][0]; } } $this->setDHCPOption('routers', $_POST['routers']); // Netbios if (!empty($_POST['netbios'])) $_POST['netbios'] = trim($_POST['netbios']); $netbiosServers = explode(', ', $_POST['netbios']); $netbiosServersOk = true; for ($i = 0; $i < sizeof($netbiosServers); $i++) { if (!check_ip($netbiosServers[$i]) && !get_preg($netbiosServers[$i], 'DNSname')) { $netbiosServersOk = false; break; } } if (!$netbiosServersOk && !empty($_POST['netbios'])) { $errors[] = $this->messages['netbios'][0]; } $this->setDHCPOption('netbios-name-servers', $_POST['netbios']); $this->setDHCPOption('netbios-node-type', $_POST['netbios_node_type']); if (!$this->isRootNode()) { // Check subnet $_POST['subnet'] = trim($_POST['subnet']); if (!$this->checkSubnetMask($_POST['subnet'])) { $errors[] = $this->messages['subnet'][0]; } $this->setDHCPOption('subnet-mask', $_POST['subnet']); // calculate netmask from subnet: if (!empty($_POST['subnet'])) { $this->attributes['dhcpNetMask'][0] = $this->calculateNetMask($_POST['subnet']); } } $this->attributes['dhcpComments'][0] = $_POST['description']; return $errors; } /** * Checks if the subnet mask is valid. * * @param String $mask subnet mask * @return boolean correct or incorrect */ private function checkSubnetMask($mask) { // check basic format if (!check_ip($mask, true)) { return false; } // check if bit order is 11...00... $parts = explode('.', $mask); $bits = ''; for ($i = 0; $i < sizeof($parts); $i++) { $bits .= decbin($parts[$i]); } return preg_match('/^1*0*$/', $bits); } /** * Calculates the net mask from the subnet. * * @param String $subnet subnet * @return integer netmask */ private function calculateNetMask($subnet) { $ex = explode(".", $subnet); $num = 0; foreach($ex AS $mask) { $binary = decbin($mask); $num += substr_count($binary, 1); } return $num; } /** * Returns the HTML meta data for the main account page. * * @return htmlElement HTML meta data */ public function display_html_attributes() { $return = new htmlResponsiveRow(); // check if DHCP main settings and valid DHCP entry if ($this->isRootNode()) { if (!in_array_ignore_case('dhcpService', $this->attributes['objectClass']) && !in_array_ignore_case('dhcpServer', $this->attributes['objectClass'])) { $return->add(new htmlStatusMessage('ERROR', _('Please set your LDAP suffix to an LDAP entry with object class "dhcpService" or "dhcpServer".')), 12); return $return; } } // Subnet name if (!$this->isRootNode()) { $cn = ''; if (isset($this->attributes['cn'][0])) { $cn = $this->attributes['cn'][0]; } $subnetInput = new htmlResponsiveInputField(_('Subnet'), 'cn', $cn, 'subnet'); $subnetInput->setRequired(true); $return->add($subnetInput, 12); } // domain name $return->add(new htmlResponsiveInputField(_('Domain name'), 'domainname', $this->getDHCPOption('domain-name'), 'domainname'), 12); // lease Time $leasetimeInput = new htmlResponsiveInputField(_('Lease time'), 'lease_time', $this->getDefaultLeaseTime(), 'leasetime'); $leasetimeInput->setValidationRule(htmlElement::VALIDATE_NUMERIC); $return->add($leasetimeInput, 12); // max lease time $max_leasetimeInput = new htmlResponsiveInputField(_('Maximum lease time'), 'max_lease_time', $this->getMaxLeaseTime(), 'max_leasetime'); $max_leasetimeInput->setValidationRule(htmlElement::VALIDATE_NUMERIC); $return->add($max_leasetimeInput, 12); // DNS $return->add(new htmlResponsiveInputField(_('DNS'), 'dns', $this->getDHCPOption('domain-name-servers'), 'dns'), 12); // domain search $domainSearchEntries = $this->getDHCPOption('domain-search'); if ($domainSearchEntries === null) { $domainSearchEntries = ''; } $domainSearchEntries = explode(', ', $domainSearchEntries); $this->attributes['INFO_domain-search'] = $domainSearchEntries; $this->addMultiValueInputTextField($return, 'INFO_domain-search', _('Search domains')); // gateway $return->add(new htmlResponsiveInputField(_('Default gateway'), 'routers', $this->getDHCPOption('routers'), 'gateway'), 12); // netbios name servers $return->add(new htmlResponsiveInputField(_('Netbios name servers'), 'netbios', $this->getDHCPOption('netbios-name-servers'), 'netbios'), 12); // netbios node type $nodeType = $this->getDHCPOption('netbios-node-type'); if ($nodeType == '') { $nodeType = 8; } $nodeOptions = array(); foreach ($this->all_netbios_node_types as $key => $value) { $nodeOptions[$value] = $key; } $nodeSelect = new htmlResponsiveSelect('netbios_node_type', $nodeOptions, array($nodeType), _('Netbios node type'), 'netbios_type'); $nodeSelect->setHasDescriptiveElements(true); $return->add($nodeSelect, 12); if (!$this->isRootNode()) { // unknown clients $unknownClients = $this->getUnknownClients(); if (empty($unknownClients)) { $unknownClients = '-'; } $unknownClientsOptions = array_flip($this->allowDenyOptions); $unknownClientsSelect = new htmlResponsiveSelect('unknownClients', $unknownClientsOptions, array($unknownClients), _('Unknown clients'), 'unknownClients'); $unknownClientsSelect->setHasDescriptiveElements(true); $return->add($unknownClientsSelect, 12); // subnetmask $subnetMaskInput = new htmlResponsiveInputField(_('Subnet mask'), 'subnet', $this->getDHCPOption('subnet-mask'), 'subnetmask'); $subnetMaskInput->setRequired(true); $return->add($subnetMaskInput, 12); } // description $description = ''; if (isset($this->attributes['dhcpComments'][0])) { $description = $this->attributes['dhcpComments'][0]; } $return->add(new htmlResponsiveInputField(_('Description'), 'description', $description, 'description'), 12); if (!$this->isRootNode()) { // netmask $return->addLabel(new htmlOutputText(_('Net mask'))); $return->addField(new htmlOutputText($this->attributes['dhcpNetMask'][0])); } return $return; } /** * Loads the values of an account profile into internal variables. * * @param array $profile hash array with profile values (identifier => value) */ function load_profile($profile) { // profile mappings in meta data parent::load_profile($profile); $this->attributes['cn'][0] = $profile['cn'][0]; $this->setDefaultLeaseTime($profile['lease_time'][0]); $this->setMaxLeaseTime($profile['max_lease_time'][0]); $this->setDHCPOption('domain-name', $profile['domainname'][0]); $this->setDHCPOption('domain-name-servers', $profile['dns'][0]); $this->setDHCPOption('routers', $profile['routers'][0]); $this->setDHCPOption('netbios-name-servers', $profile['netbios'][0]); $this->setDHCPOption('netbios-node-type', $profile['netbios_node_type'][0]); if (!empty($profile['domain-search'][0])) { $domains = '"' . $profile['domain-search'][0] . '"'; $domains = str_replace(';', '", "', $domains); $this->setDHCPOption('domain-search', $domains); } if (!$this->isRootNode()) { $this->setDHCPOption('subnet-mask', $profile['subnet'][0]); // calc the netmask: $ex=explode(".", $profile['subnet'][0]); $num = 0; foreach($ex AS $mask) { $binary = decbin($mask); $num += substr_count($binary, 1); } $this->attributes['dhcpNetMask'][0] = $num; } } /** * {@inheritDoc} * @see baseModule::get_pdfEntries() */ function get_pdfEntries($pdfKeys, $typeId) { $nodeType = $this->getDHCPOption('netbios-node-type'); $nodeTypeValue = ''; 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(); $this->addPDFKeyValue($return, 'domainName', _('Domain name'), $this->getDHCPOption('domain-name')); $this->addPDFKeyValue($return, 'leaseTime', _('Lease time'), $this->getDefaultLeaseTime()); $this->addPDFKeyValue($return, 'maxLeaseTime', _('Maximum lease time'), $this->getMaxLeaseTime()); $this->addPDFKeyValue($return, 'DNSserver', _('DNS'), $this->getDHCPOption('domain-name-servers')); $this->addPDFKeyValue($return, 'domain-search', _('Search domains'), $this->getDHCPOption('domain-search')); $this->addPDFKeyValue($return, 'gateway', _('Default gateway'), $this->getDHCPOption('routers')); $this->addPDFKeyValue($return, 'netbiosServer', _('Netbios name servers'), $this->getDHCPOption('netbios-name-servers')); $this->addPDFKeyValue($return, 'netbiosType', _('Netbios node type'), $nodeTypeValue); $this->addPDFKeyValue($return, 'subnetMask', _('Subnet mask'), $this->getDHCPOption('subnet-mask')); $this->addPDFKeyValue($return, 'unknownClients', _('Unknown clients'), $unknownClients); $this->addSimplePDFField($return, 'description', _('Description'), 'dhcpComments'); $this->addSimplePDFField($return, 'subnet', _('Subnet'), 'cn'); $this->addSimplePDFField($return, 'netMask', _('Net mask'), 'dhcpNetMask'); return $return; } /** * Returns a DHCP option. * * @param String $name option name * @return String value */ public function getDHCPOption($name) { $return = null; if (is_array($this->attributes['dhcpOption'])) { for ($i = 0; $i < sizeof($this->attributes['dhcpOption']); $i++) { $val = $this->attributes['dhcpOption'][$i]; if (substr($val, 0, strlen($name) + 1) == ($name . ' ')) { $return = substr($val, strlen($name) + 1); $return = str_replace('"', '', $return); break; } } } return $return; } /** * Sets a DHCP option. * * @param String $name option name * @param String $value option value */ private function setDHCPOption($name, $value) { if (empty($this->attributes['dhcpOption'])) { $this->attributes['dhcpOption'] = array(); } for ($i = 0; $i < sizeof($this->attributes['dhcpOption']); $i++) { if (substr($this->attributes['dhcpOption'][$i], 0, strlen($name) + 1) == ($name . ' ')) { unset($this->attributes['dhcpOption'][$i]); $this->attributes['dhcpOption'] = array_values($this->attributes['dhcpOption']); } } if (($value != null) && ($value != '')) { $this->attributes['dhcpOption'][] = $name . ' ' . $value; } } /** * Returns the default lease time. * * @return String time */ private function getDefaultLeaseTime() { $return = null; if (!empty($this->attributes['dhcpStatements'])) { for ($i = 0; $i < sizeof($this->attributes['dhcpStatements']); $i++) { if (substr($this->attributes['dhcpStatements'][$i], 0, 19) == 'default-lease-time ') { $return = substr($this->attributes['dhcpStatements'][$i],19); break; } } } return $return; } /** * Sets the default lease time. * * @param String $time time */ private function setDefaultLeaseTime($time) { if (empty($this->attributes['dhcpStatements'])) { $this->attributes['dhcpStatements'] = array(); } for ($i = 0; $i < sizeof($this->attributes['dhcpStatements']); $i++) { if (substr($this->attributes['dhcpStatements'][$i], 0, 19) == 'default-lease-time ') { unset($this->attributes['dhcpStatements'][$i]); $this->attributes['dhcpStatements'] = array_values($this->attributes['dhcpStatements']); } } if (($time != null) && ($time != '')) { $this->attributes['dhcpStatements'][] = 'default-lease-time ' . $time; } } /** * Returns the unknown clients option. * * @return String unknown clients value */ private function getUnknownClients() { $return = null; if (!empty($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 (!isset($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. * * @return String time */ private function getMaxLeaseTime() { $return = null; if (!empty($this->attributes['dhcpStatements'])) { for ($i = 0; $i < sizeof($this->attributes['dhcpStatements']); $i++) { if (substr($this->attributes['dhcpStatements'][$i], 0, 15) == 'max-lease-time ') { $return = substr($this->attributes['dhcpStatements'][$i],15); break; } } } return $return; } /** * Sets the maximum lease time. * * @param String $time time */ private function setMaxLeaseTime($time) { if (!is_array($this->attributes['dhcpStatements'])) { $this->attributes['dhcpStatements'] = array(); } for ($i = 0; $i < sizeof($this->attributes['dhcpStatements']); $i++) { if (substr($this->attributes['dhcpStatements'][$i], 0, 15) == 'max-lease-time ') { unset($this->attributes['dhcpStatements'][$i]); $this->attributes['dhcpStatements'] = array_values($this->attributes['dhcpStatements']); } } if (($time != null) && ($time != '')) { $this->attributes['dhcpStatements'][] = 'max-lease-time ' . $time; } } /** * {@inheritDoc} * @see baseModule::build_uploadAccounts() */ function build_uploadAccounts($rawAccounts, $ids, &$partialAccounts, $selectedModules, &$type) { $messages = array(); for ($i = 0; $i < sizeof($rawAccounts); $i++) { // add object class if (!in_array("dhcpOptions", $partialAccounts[$i]['objectClass'])) $partialAccounts[$i]['objectClass'][] = "dhcpOptions"; if (!in_array("dhcpSubnet", $partialAccounts[$i]['objectClass'])) $partialAccounts[$i]['objectClass'][] = "dhcpSubnet"; // subnet if (check_ip($rawAccounts[$i][$ids['dhcp_settings_subnet']],true)) { $partialAccounts[$i]['cn'] = $rawAccounts[$i][$ids['dhcp_settings_subnet']]; } else { $error = $this->messages['cn'][3]; array_push($error, $i); $messages[] = $error; } // domain name if ($rawAccounts[$i][$ids['dhcp_settings_domainName']] != "") { if (preg_match("/^[A-Za-z0-9\\._-]*$/", $rawAccounts[$i][$ids['dhcp_settings_domainName']])) { $partialAccounts[$i]['dhcpOption'][] = "domain-name \"".$rawAccounts[$i][$ids['dhcp_settings_domainName']]."\""; } else { $error = $this->messages['domainname'][5]; array_push($error, $i); $messages[] = $error; } } // lease time if ($rawAccounts[$i][$ids['dhcp_settings_leaseTime']] != '') { if (is_numeric($rawAccounts[$i][$ids['dhcp_settings_leaseTime']])) { $partialAccounts[$i]['dhcpStatements'][] = 'default-lease-time ' . $rawAccounts[$i][$ids['dhcp_settings_leaseTime']]; } else { $error = $this->messages['lease_time'][1]; array_push($error, $i); $messages[] = $error; } } // max lease time if ($rawAccounts[$i][$ids['dhcp_settings_maxLeaseTime']] != '') { if (is_numeric($rawAccounts[$i][$ids['dhcp_settings_maxLeaseTime']])) { $partialAccounts[$i]['dhcpStatements'][] = 'max-lease-time ' . $rawAccounts[$i][$ids['dhcp_settings_maxLeaseTime']]; } else { $error = $this->messages['max_lease_time'][1]; array_push($error, $i); $messages[] = $error; } } // DNS if ($rawAccounts[$i][$ids['dhcp_settings_DNSserver']] != '') { $ex = explode(",", $rawAccounts[$i][$ids['dhcp_settings_DNSserver']]); $invalid = false; foreach($ex AS $string) { if (!check_ip($string)) { $invalid = true; } } if (!$invalid) { $partialAccounts[$i]['dhcpOption'][] = 'domain-name-servers ' . $rawAccounts[$i][$ids['dhcp_settings_DNSserver']]; } else { $error = $this->messages['dns'][1]; array_push($error, $i); $messages[] = $error; } } // search domains if ($rawAccounts[$i][$ids['dhcp_settings_domain-search']] != '') { $domains = preg_split('/;[ ]*/', $rawAccounts[$i][$ids['dhcp_settings_domain-search']]); $invalid = false; foreach($domains AS $key => $name) { if (!get_preg($name, 'domainname')) { $invalid = true; } else { $domains[$key] = '"' . $name . '"'; } } if (!$invalid) { $partialAccounts[$i]['dhcpOption'][] = 'domain-search ' . implode(', ', $domains); } else { $error = $this->messages['INFO_domain-search'][1]; array_push($error, $i); $messages[] = $error; } } // gateway if ($rawAccounts[$i][$ids['dhcp_settings_gateway']] != '') { if (check_ip($rawAccounts[$i][$ids['dhcp_settings_gateway']])) { $partialAccounts[$i]['dhcpOption'][] = "routers ".$rawAccounts[$i][$ids['dhcp_settings_gateway']]; } else { $error = $this->messages['routers'][1]; array_push($error, $i); $messages[] = $error; } } // netbios name servers if ($rawAccounts[$i][$ids['dhcp_settings_netbiosServer']] != '') { $ex = explode(",", $rawAccounts[$i][$ids['dhcp_settings_netbiosServer']]); $invalid = false; foreach($ex AS $string) { if (!check_ip($string) && !get_preg($string, 'DNSname')) { $invalid = true; } } if (!$invalid) { $partialAccounts[$i]['dhcpOption'][] = "netbios-name-servers " . $rawAccounts[$i][$ids['dhcp_settings_netbiosServer']]; } else { $error = $this->messages['netbios'][1]; array_push($error, $i); $messages[] = $error; } } // node type if ($rawAccounts[$i][$ids['dhcp_settings_netbiosType']] != '') { if (in_array($rawAccounts[$i][$ids['dhcp_settings_netbiosType']], array('B', 'P', 'M', 'H'))) { if ($rawAccounts[$i][$ids['dhcp_settings_netbiosType']] == 'B') { $partialAccounts[$i]['dhcpOption'][] = "netbios-node-type 1"; } elseif ($rawAccounts[$i][$ids['dhcp_settings_netbiosType']] == 'P') { $partialAccounts[$i]['dhcpOption'][] = "netbios-node-type 2"; } elseif ($rawAccounts[$i][$ids['dhcp_settings_netbiosType']] == 'M') { $partialAccounts[$i]['dhcpOption'][] = "netbios-node-type 4"; } elseif ($rawAccounts[$i][$ids['dhcp_settings_netbiosType']] == 'H') { $partialAccounts[$i]['dhcpOption'][] = "netbios-node-type 8"; } } else { $error = $this->messages['netbios_node_type'][1]; array_push($error, $i); $messages[] = $error; } } 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']]; } else { $error = $this->messages['subnet'][1]; array_push($error, $i); $messages[] = $error; } // net mask $mask = $this->calculateNetMask($rawAccounts[$i][$ids['dhcp_settings_subnetMask']]); $partialAccounts[$i]['dhcpNetMask'][0] = $mask; // description if (isset($rawAccounts[$i][$ids['dhcp_settings_description']]) && ($rawAccounts[$i][$ids['dhcp_settings_description']] != '')) { $partialAccounts[$i]['dhcpComments'][0] = $rawAccounts[$i][$ids['dhcp_settings_description']]; } } return $messages; } /** * Returns if the current DN is the root entry. * * @return bool is root */ private function isRootNode() { $rootSuffix = $this->getAccountContainer()->get_type()->getSuffix(); return $this->getAccountContainer()->dn_orig == $rootSuffix; } } ?>