Ejemplo n.º 1
0
    def post_callback(self, ldap, dn, entry_attrs, *keys, **options):
        assert isinstance(dn, DN)
        self.obj.get_enabled_roles(entry_attrs)

        if 'ipalocation_location' in options:
            ipalocation = entry_attrs.get('ipalocation')
            if ipalocation:
                ipalocation = ipalocation[0]['idnsname']
            else:
                ipalocation = u''
            try:
                self.api.Command.dnsserver_mod(
                    keys[0],
                    setattr=[
                        u'idnsSubstitutionVariable;ipalocation={loc}'.format(
                            loc=ipalocation)
                    ])
            except errors.EmptyModlist:
                pass
            except errors.NotFound:
                # server is not DNS server
                pass

        if 'ipalocation_location' or 'ipaserviceweight' in options:
            self.add_message(
                messages.ServiceRestartRequired(
                    service=services.service('named', api).systemd_name,
                    server=keys[0],
                ))

            result = self.api.Command.dns_update_system_records()
            if not result.get('value'):
                self.add_message(messages.AutomaticDNSRecordsUpdateFailed())
        self.obj.convert_location(entry_attrs, **options)

        ipalocation = entry_attrs.get('ipalocation_location', [None])[0]
        if ipalocation:
            servers_in_loc = self.api.Command.server_find(
                in_location=ipalocation, no_members=False)['result']
            dns_server_in_loc = False
            for server in servers_in_loc:
                if 'DNS server' in server.get('enabled_role_servrole', ()):
                    dns_server_in_loc = True
                    break
            if not dns_server_in_loc:
                self.add_message(
                    messages.LocationWithoutDNSServer(location=ipalocation))

        return dn
Ejemplo n.º 2
0
    def execute(self, *keys, **options):
        result = super(location_show, self).execute(*keys, **options)

        servers_additional_info = {}
        if not options.get('raw'):
            servers_name = []
            dns_servers = []
            weight_sum = 0

            servers = self.api.Command.server_find(in_location=keys[0],
                                                   no_members=False)['result']
            for server in servers:
                s_name = server['cn'][0]
                servers_name.append(s_name)
                weight = int(server.get('ipaserviceweight', [100])[0])
                weight_sum += weight
                servers_additional_info[s_name] = {
                    'cn': server['cn'],
                    'ipaserviceweight': server.get('ipaserviceweight',
                                                   [u'100']),
                }

                s_roles = server.get('enabled_role_servrole', ())
                if s_roles:
                    servers_additional_info[s_name][
                        'enabled_role_servrole'] = s_roles
                if 'DNS server' in s_roles:
                    dns_servers.append(s_name)

            for server in servers_additional_info.values():
                server['service_relative_weight'] = [
                    u'{:.1f}%'.format(
                        int(server['ipaserviceweight'][0]) * 100.0 /
                        weight_sum)
                ]
            if servers_name:
                result['result']['servers_server'] = servers_name

            if dns_servers:
                result['result']['dns_server'] = dns_servers

            if not dns_servers and servers_additional_info:
                self.add_message(
                    messages.LocationWithoutDNSServer(location=keys[0]))

        result['servers'] = servers_additional_info

        return result
Ejemplo n.º 3
0
    def execute(self, *keys, **options):
        result = super(location_show, self).execute(*keys, **options)

        servers_additional_info = {}
        if not options.get('raw'):
            servers_name = []
            dns_servers = []
            weight_sum = 0

            servers = self.api.Command.server_find(in_location=keys[0],
                                                   no_members=False)['result']
            for server in servers:
                s_name = server['cn'][0]
                servers_name.append(s_name)
                weight = int(server.get('ipaserviceweight', [100])[0])
                weight_sum += weight
                servers_additional_info[s_name] = {
                    'cn': server['cn'],
                    'ipaserviceweight': server.get('ipaserviceweight',
                                                   [u'100']),
                }

                s_roles = server.get('enabled_role_servrole', ())
                if s_roles:
                    servers_additional_info[s_name][
                        'enabled_role_servrole'] = s_roles
                if 'DNS server' in s_roles:
                    dns_servers.append(s_name)

            # 1. If all masters have weight == 0 then all are equally
            #    weighted.
            # 2. If any masters have weight == 0 then they have an
            #    extremely small chance of being chosen, percentage is
            #    0.1.
            # 3. Otherwise it's percentage change is based on the sum of
            #    the weights of non-zero masters.
            dividend = 100.0
            if weight_sum != 0:
                for server in servers_additional_info.values():
                    if int(server['ipaserviceweight'][0]) == 0:
                        dividend = dividend - 0.1
            for server in servers_additional_info.values():
                if weight_sum == 0:
                    val = 100 / len(servers)
                elif int(server['ipaserviceweight'][0]) == 0:
                    val = 0.1
                else:
                    val = (int(server['ipaserviceweight'][0]) * dividend /
                           weight_sum)
                server['service_relative_weight'] = [u'{:.1f}%'.format(val)]
            if servers_name:
                result['result']['servers_server'] = servers_name

            if dns_servers:
                result['result']['dns_server'] = dns_servers

            if not dns_servers and servers_additional_info:
                self.add_message(
                    messages.LocationWithoutDNSServer(location=keys[0]))

        result['servers'] = servers_additional_info

        return result