3web2ldap plugin classes for attributes defined for DHCP service
5See https://datatracker.ietf.org/doc/html/draft-ietf-dhc-ldap-schema
10from typing
import Dict
14from ..searchform
import (
16 SEARCH_OPT_BEGINS_WITH,
18from ..schema.syntaxes
import (
32 oid: str =
'DHCPConfigStatement-oid'
33 desc: str =
'DHCP configuration statement'
37 res = [
'<code>%s</code>' % (
38 MultilineText.display(self, vidx, links)
42 dhcp_type, dhcp_value = self.
av_u.split(
' ', 1)
44 dhcp_type, dhcp_value = self.
av_u,
''
45 dhcp_type = dhcp_type.lower().strip()
46 dhcp_value = dhcp_value.replace(
'"',
'').strip()
47 if dhcp_type ==
'host-name':
48 host_name = dhcp_value.lower().split(
'.', 1)[0]
49 res.append(self.
_app.anchor(
52 (
'dn',
str(self.
_app.naming_context)),
53 (
'searchform_mode',
'adv'),
54 (
'search_mode',
'(|%s)'),
55 (
'search_attr',
'dc'),
56 (
'search_option', SEARCH_OPT_IS_EQUAL),
57 (
'search_string', host_name),
58 (
'search_attr',
'pTRRecord'),
59 (
'search_option', SEARCH_OPT_BEGINS_WITH),
60 (
'search_string', host_name+
'.'),
61 (
'search_attr',
'associatedDomain'),
62 (
'search_option', SEARCH_OPT_BEGINS_WITH),
63 (
'search_string', host_name+
'.'),
65 title=
'Search related DNS RR entry',
67 elif dhcp_type ==
'fixed-address':
69 (
'dn',
str(self.
_app.naming_context)),
70 (
'searchform_mode',
'adv'),
71 (
'search_mode',
'(|%s)'),
72 (
'search_attr',
'aRecord'),
73 (
'search_option', SEARCH_OPT_IS_EQUAL),
74 (
'search_string', dhcp_value),
75 (
'search_attr',
'aAAARecord'),
76 (
'search_option', SEARCH_OPT_IS_EQUAL),
77 (
'search_string', dhcp_value),
80 reverse_dns = ipaddress.ip_address(dhcp_value).reverse_pointer
84 search_params.extend((
85 (
'search_attr',
'associatedDomain'),
86 (
'search_option', SEARCH_OPT_IS_EQUAL),
87 (
'search_string', reverse_dns),
93 title=
'Search related DNS RR entries',
96 return web2ldapcnf.command_link_separator.join(res)
98syntax_registry.reg_at(
99 DHCPConfigStatement.oid, [
100 '2.16.840.1.113719.1.203.4.3',
101 '2.16.840.1.113719.1.203.6.9',
102 '2.16.840.1.113719.1.203.4.7',
108 oid: str =
'DHCPServerDN-oid'
109 desc: str =
'DN of DHCP server entry'
110 ldap_url =
'ldap:///_?cn?sub?(objectClass=dhcpServer)'
112syntax_registry.reg_at(
114 '2.16.840.1.113719.1.203.4.1',
115 '2.16.840.1.113719.1.203.4.2',
116 '2.16.840.1.113719.1.203.4.54',
122 oid: str =
'DHCPOptionsDN-oid'
123 desc: str =
'DN of DHCP option object'
124 ldap_url =
'ldap:///_?cn?sub?(objectClass=dhcpOptions)'
126syntax_registry.reg_at(
128 '2.16.840.1.113719.1.203.4.9',
134 oid: str =
'DHCPHostDN-oid'
135 desc: str =
'DN of DHCP host object'
136 ldap_url =
'ldap:///_?cn?sub?(objectClass=dhcpHost)'
138syntax_registry.reg_at(
140 '2.16.840.1.113719.1.203.4.10',
141 '2.16.840.1.113719.1.203.4.31',
142 '2.16.840.1.113719.1.203.4.32',
148 oid: str =
'DHCPPoolDN-oid'
149 desc: str =
'DN of DHCP pool object'
150 ldap_url =
'ldap:///_??sub?(objectClass=dhcpPool)'
152syntax_registry.reg_at(
154 '2.16.840.1.113719.1.203.4.11',
160 oid: str =
'DHCPGroupDN-oid'
161 desc: str =
'DN of DHCP group object'
162 ldap_url =
'ldap:///_?cn?sub?(objectClass=dhcpGroup)'
164syntax_registry.reg_at(
166 '2.16.840.1.113719.1.203.4.12',
172 oid: str =
'DHCPSubnetDN-oid'
173 desc: str =
'DN of DHCP subnet object'
174 ldap_url =
'ldap:///_?cn?sub?(objectClass=dhcpSubnet)'
176syntax_registry.reg_at(
178 '2.16.840.1.113719.1.203.4.13',
184 oid: str =
'DHCPLeasesDN-oid'
185 desc: str =
'DN of DHCP leases object'
186 ldap_url =
'ldap:///_?cn?sub?(objectClass=dhcpLeases)'
188syntax_registry.reg_at(
190 '2.16.840.1.113719.1.203.4.14',
191 '2.16.840.1.113719.1.203.4.15',
197 oid: str =
'DHCPClassesDN-oid'
198 desc: str =
'DN of DHCP classes object'
199 ldap_url =
'ldap:///_?cn?sub?(objectClass=dhcpClass)'
201syntax_registry.reg_at(
203 '2.16.840.1.113719.1.203.4.16',
209 oid: str =
'DHCPSubclassesDN-oid'
210 desc: str =
'DN of DHCP Subclasses object'
211 ldap_url =
'ldap:///_?cn?sub?(objectClass=dhcpSubclass)'
213syntax_registry.reg_at(
214 DHCPSubclassesDN.oid, [
215 '2.16.840.1.113719.1.203.4.17',
221 oid: str =
'DHCPSharedNetworkDN-oid'
222 desc: str =
'DN of DHCP shared network object'
223 ldap_url =
'ldap:///_?cn?sub?(objectClass=dhcpSharedNetwork)'
225syntax_registry.reg_at(
226 DHCPSharedNetworkDN.oid, [
227 '2.16.840.1.113719.1.203.4.18',
233 oid: str =
'DHCPServiceDN-oid'
234 desc: str =
'DN of DHCP service object'
235 ldap_url =
'ldap:///_?cn?sub?(objectClass=dhcpService)'
237syntax_registry.reg_at(
239 '2.16.840.1.113719.1.203.4.19',
245 oid: str =
'DHCPHWAddress-oid'
246 desc: str =
'Network classifier and MAC address'
248 pattern = re.compile(
r'^(ethernet|token-ring|fddi) ([0-9a-fA-F]{2}\:){5}[0-9a-fA-F]{2}$')
251 attr_value = attr_value.strip()
252 if len(attr_value) == 17:
253 return b
'ethernet %s' % attr_value
256syntax_registry.reg_at(
258 '2.16.840.1.113719.1.203.4.34',
264 oid: str =
'DHCPNetMask-oid'
265 desc: str =
'Network address mask bits'
273syntax_registry.reg_at(
275 '2.16.840.1.113719.1.203.4.6',
281 oid: str =
'DHCPRange-oid'
282 desc: str =
'Network address range'
285 name = self.
_entry[
'cn'][0].strip().decode(
'ascii')
286 net_mask = self.
_entry[
'dhcpNetMask'][0].strip().decode(
'ascii')
287 return ipaddress.ip_network((
'%s/%s' % (name, net_mask)), strict=
False)
290 fval = IA5String.form_value(self)
294 first_address = next(ipv4_hosts)
297 last_address = next(ipv4_hosts)
298 except StopIteration:
300 fval =
'{0} {1}'.format(first_address, last_address)
301 except ipaddress.AddressValueError:
306 return attr_value.strip().replace(b
' ', b
' ').replace(b
'-', b
' ').replace(b
'..', b
' ')
310 l_s, h_s = attr_value.decode(self.
_app.ls.charset).split(
' ', 1)
311 except (IndexError, ValueError):
314 l_a = ipaddress.ip_address(l_s)
315 h_a = ipaddress.ip_address(h_s)
325 return l_a
in ipv4_network
and h_a
in ipv4_network
328syntax_registry.reg_at(
330 '2.16.840.1.113719.1.203.4.4',
336 oid: str =
'DHCPAddressState-oid'
337 desc: str =
'DHCP address state'
339 attr_value_dict: Dict[str, str] = {
343 'EXPIRED':
'EXPIRED',
344 'RELEASED':
'RELEASED',
346 'ABANDONED':
'ABANDONED',
348 'UNKNOWN':
'UNKNOWN',
349 'RESERVED':
'RESERVED (address managed by DHCP that is reserved for a specific client)',
350 'RESERVED-ACTIVE':
'RESERVED-ACTIVE (same as reserved, but address is currently in use)',
351 'ASSIGNED':
'ASSIGNED (assigned manually or by some other mechanism)',
352 'UNASSIGNED':
'UNASSIGNED',
353 'NOTASSIGNABLE':
'NOTASSIGNABLE',
359 0 (C): name to address (such as A RR) update successfully completed
360 1 (A): Server
is controlling A RR on behalf of the client
361 2 (D): address to name (such
as PTR RR) update successfully completed (Done)
362 3 (P): Server
is controlling PTR RR on behalf of the client
365 oid: str = 'DHCPDnsStatus-oid'
367 (
'(C): name to address (such as A RR) update successfully completed', 0x0001),
368 (
'(A): Server is controlling A RR on behalf of the client', 0x0002),
369 (
'(D): address to name (such as PTR RR) update successfully completed (Done)', 0x0004),
370 (
'(P): Server is controlling PTR RR on behalf of the client', 0x0008),
373syntax_registry.reg_at(
375 '2.16.840.1.113719.1.203.4.28',
380syntax_registry.reg_at(
382 '2.16.840.1.113719.1.203.4.27',
387syntax_registry.reg_at(
388 DHCPAddressState.oid, [
389 '2.16.840.1.113719.1.203.4.22',
395syntax_registry.reg_syntaxes(__name__)
str display(self, vidx, links)
bytes sanitize(self, bytes attr_value)
bool _validate(self, bytes attr_value)
bytes sanitize(self, bytes attr_value)