class dnsserver(LDAPObject): """ DNS Servers """ container_dn = api.env.container_dnsservers object_name = _('DNS server') object_name_plural = _('DNS servers') object_class = dnsserver_object_class default_attributes = [ 'idnsServerId', 'idnsSOAmName', 'idnsForwarders', 'idnsForwardPolicy', ] label = _('DNS Servers') label_singular = _('DNS Server') permission_filter_objectclasses = ['idnsServerConfigObject'] managed_permissions = { 'System: Read DNS Servers Configuration': { 'ipapermright': {'read', 'search', 'compare'}, 'ipapermdefaultattr': { 'objectclass', 'idnsServerId', 'idnsSOAmName', 'idnsForwarders', 'idnsForwardPolicy', 'idnsSubstitutionVariable', }, 'ipapermlocation': api.env.basedn, 'default_privileges': {'DNS Servers', 'DNS Administrators'}, }, 'System: Modify DNS Servers Configuration': { 'ipapermright': {'write'}, 'ipapermdefaultattr': { 'idnsSOAmName', 'idnsForwarders', 'idnsForwardPolicy', 'idnsSubstitutionVariable', }, 'ipapermlocation': api.env.basedn, 'default_privileges': {'DNS Administrators'}, }, } takes_params = ( Str( 'idnsserverid', hostname_validator, cli_name='hostname', primary_key=True, label=_('Server name'), doc=_('DNS Server name'), normalizer=normalize_hostname, ), DNSNameParam( 'idnssoamname?', cli_name='soa_mname_override', label=_('SOA mname override'), doc=_('SOA mname (authoritative server) override'), ), Str( 'idnsforwarders*', validate_bind_forwarder, cli_name='forwarder', label=_('Forwarders'), doc=_('Per-server forwarders. A custom port can be specified ' 'for each forwarder using a standard format ' '"IP_ADDRESS port PORT"'), ), StrEnum( 'idnsforwardpolicy?', cli_name='forward_policy', label=_('Forward policy'), doc=_('Per-server conditional forwarding policy. Set to "none" to ' 'disable forwarding to global forwarder for this zone. In ' 'that case, conditional zone forwarders are disregarded.'), values=(u'only', u'first', u'none'), ), ) def get_dn(self, *keys, **options): if not dns_container_exists(self.api.Backend.ldap2): raise errors.NotFound(reason=_('DNS is not configured')) return super(dnsserver, self).get_dn(*keys, **options)
class server(LDAPObject): """ IPA server """ container_dn = api.env.container_masters object_name = _('server') object_name_plural = _('servers') object_class = ['top'] possible_objectclasses = ['ipaLocationMember'] search_attributes = ['cn'] default_attributes = [ 'cn', 'iparepltopomanagedsuffix', 'ipamindomainlevel', 'ipamaxdomainlevel', 'ipalocation', 'ipaserviceweight' ] label = _('IPA Servers') label_singular = _('IPA Server') attribute_members = { 'iparepltopomanagedsuffix': ['topologysuffix'], 'ipalocation': ['location'], 'role': ['servrole'], } relationships = { 'iparepltopomanagedsuffix': ('Managed', '', 'no_'), 'ipalocation': ('IPA', 'in_', 'not_in_'), 'role': ('Enabled', '', 'no_'), } permission_filter_objectclasses = ['ipaConfigObject'] managed_permissions = { 'System: Read Locations of IPA Servers': { 'ipapermright': {'read', 'search', 'compare'}, 'ipapermdefaultattr': { 'objectclass', 'cn', 'ipalocation', 'ipaserviceweight', }, 'default_privileges': {'DNS Administrators'}, }, 'System: Read Status of Services on IPA Servers': { 'ipapermright': {'read', 'search', 'compare'}, 'ipapermdefaultattr': {'objectclass', 'cn', 'ipaconfigstring'}, 'default_privileges': {'DNS Administrators'}, } } takes_params = ( Str( 'cn', cli_name='name', primary_key=True, label=_('Server name'), doc=_('IPA server hostname'), ), Str( 'iparepltopomanagedsuffix*', flags={'no_create', 'no_update', 'no_search'}, ), Str( 'iparepltopomanagedsuffix_topologysuffix*', label=_('Managed suffixes'), flags={'virtual_attribute', 'no_create', 'no_update', 'no_search'}, ), Int( 'ipamindomainlevel', cli_name='minlevel', label=_('Min domain level'), doc=_('Minimum domain level'), flags={'no_create', 'no_update'}, ), Int( 'ipamaxdomainlevel', cli_name='maxlevel', label=_('Max domain level'), doc=_('Maximum domain level'), flags={'no_create', 'no_update'}, ), DNSNameParam( 'ipalocation_location?', cli_name='location', label=_('Location'), doc=_('Server location'), only_relative=True, flags={'no_search'}, ), Int( 'ipaserviceweight?', cli_name='service_weight', label=_('Service weight'), doc=_('Weight for server services'), minvalue=0, maxvalue=65535, flags={'no_search'}, ), Str( 'service_relative_weight', label=_('Service relative weight'), doc=_('Relative weight for server services (counts per location)'), flags={'virtual_attribute', 'no_create', 'no_update', 'no_search'}, ), Str('enabled_role_servrole*', label=_('Enabled server roles'), doc=_('List of enabled roles'), flags={'virtual_attribute', 'no_create', 'no_update', 'no_search'}), ) def _get_suffixes(self): suffixes = self.api.Command.topologysuffix_find( all=True, raw=True, )['result'] suffixes = [(s['iparepltopoconfroot'][0], s['dn']) for s in suffixes] return suffixes def _apply_suffixes(self, entry, suffixes): # change suffix DNs to topologysuffix entry DNs # this fixes LDAPObject.convert_attribute_members() for suffixes suffixes = dict(suffixes) if 'iparepltopomanagedsuffix' in entry: entry['iparepltopomanagedsuffix'] = [ suffixes.get(m, m) for m in entry['iparepltopomanagedsuffix'] ] def normalize_location(self, kw, **options): """ Return the DN of location """ if 'ipalocation_location' in kw: location = kw.pop('ipalocation_location') kw['ipalocation'] = ([self.api.Object.location.get_dn(location)] if location is not None else location) def convert_location(self, entry_attrs, **options): """ Return a location name from DN """ if options.get('raw'): return converted_locations = [ DNSName(location_dn['idnsname']) for location_dn in entry_attrs.pop('ipalocation', []) ] if converted_locations: entry_attrs['ipalocation_location'] = converted_locations def get_enabled_roles(self, entry_attrs, **options): if not options.get('all', False) and options.get('no_members', False): return if options.get('raw', False): return enabled_roles = self.api.Command.server_role_find( server_server=entry_attrs['cn'][0], status=ENABLED, include_master=True, )['result'] enabled_role_names = [r[u'role_servrole'] for r in enabled_roles] entry_attrs['enabled_role_servrole'] = enabled_role_names
class location(LDAPObject): """ IPA locations """ container_dn = api.env.container_locations object_name = _('location') object_name_plural = _('locations') object_class = ['top', 'ipaLocationObject'] search_attributes = ['idnsName'] default_attributes = ['idnsname', 'description'] label = _('IPA Locations') label_singular = _('IPA Location') permission_filter_objectclasses = ['ipaLocationObject'] managed_permissions = { 'System: Read IPA Locations': { 'ipapermright': {'read', 'search', 'compare'}, 'ipapermdefaultattr': { 'objectclass', 'idnsname', 'description', }, 'default_privileges': {'DNS Administrators'}, }, 'System: Add IPA Locations': { 'ipapermright': {'add'}, 'default_privileges': {'DNS Administrators'}, }, 'System: Remove IPA Locations': { 'ipapermright': {'delete'}, 'default_privileges': {'DNS Administrators'}, }, 'System: Modify IPA Locations': { 'ipapermright': {'write'}, 'ipapermdefaultattr': { 'description', }, 'default_privileges': {'DNS Administrators'}, }, } takes_params = ( DNSNameParam( 'idnsname', cli_name='name', primary_key=True, label=_('Location name'), doc=_('IPA location name'), # dns name must be relative, we will put it into middle of # location domain name for location records only_relative=True, ), Str( 'description?', label=_('Description'), doc=_('IPA Location description'), ), Str( 'servers_server*', label=_('Servers'), doc=_('Servers that belongs to the IPA location'), flags={'virtual_attribute', 'no_create', 'no_update', 'no_search'}, ), Str( 'dns_server*', label=_('Advertised by servers'), doc=_('List of servers which advertise the given location'), flags={'virtual_attribute', 'no_create', 'no_update', 'no_search'}, ), ) def get_dn(self, *keys, **options): loc = keys[0] assert isinstance(loc, DNSName) loc_a = loc.ToASCII() return super(location, self).get_dn(loc_a, **options)