コード例 #1
0
ファイル: context.py プロジェクト: gaocegege/treadmill
    def resolve(self, cellname=None):
        """Resolve Zookeeper connection string by cell name."""
        # TODO: LDAPs should be a list, and admin object shuld accept
        #                list of host:port as connection arguments rather than
        #                single host:port.
        if not cellname:
            cellname = self.cell

        if not cellname:
            raise ContextError('Cell is not specified.')

        if not self.ldap.url:
            ldap_srv_rec = dnsutils.srv('_ldap._tcp.%s.%s' %
                                        (cellname, self.dns_domain))
            self.ldap.url = ','.join(
                ['ldap://%s:%s' % (rec[0], rec[1]) for rec in ldap_srv_rec])

        cell_resolved = False
        while self.resolvers and not cell_resolved:
            resolver = self.resolvers.pop(0)
            cell_resolved = resolver(cellname)

        if not cell_resolved:
            raise ContextError('Unable to resolve cell: %s' % cellname)

        self.cell = cellname
コード例 #2
0
    def resolve(self, cellname=None):
        """Resolve Zookeeper connection string by cell name."""
        # TODO: LDAPs should be a list, and admin object shuld accept
        #                list of host:port as connection arguments rather than
        #                single host:port.
        if not cellname:
            cellname = self.cell

        if not cellname:
            raise ContextError('Cell is not specified.')

        if not self.ldap.url:
            ldap_srv_rec = dnsutils.srv('_ldap._tcp.%s.%s' %
                                        (cellname, self.dns_domain))
            if ldap_srv_rec:
                ldap_host, ldap_port, _prio, _weight = ldap_srv_rec[0]
                self.ldap.url = 'ldap://%s:%s' % (ldap_host, ldap_port)

        while self.resolvers:
            resolver = self.resolvers.pop(0)
            resolver(cellname)
            if self.zk.url:
                break

        if not self.zk.url:
            raise ContextError('Unable to resolve cell: %s' % cellname)

        self.cell = cellname
コード例 #3
0
ファイル: dnsctx.py プロジェクト: eugene-xie/treadmill
def _ldap_url(ctx):
    """Resolve LDAP for given cell."""

    if not ctx.cell:
        raise context.ContextError('Cell not specified.')

    ldap_srv_rec = dnsutils.srv(
        '_ldap._tcp.%s.%s' % (ctx.cell, ctx.dns_domain), ctx.dns_server)
    return _srv_to_urls(ldap_srv_rec, 'ldap')
コード例 #4
0
ファイル: context.py プロジェクト: gaocegege/treadmill
    def _resolve_srv(self, srv_rec):
        """Returns list of host, port tuples for given srv record."""
        _LOGGER.debug('Query DNS -t SRV %s.%s', srv_rec, self.dns_domain)
        if not self.dns_domain:
            raise ContextError('Treadmill DNS domain not specified.')

        result = dnsutils.srv(srv_rec + '.' + self.dns_domain)
        random.shuffle(result)
        return result
コード例 #5
0
    def image_group(api, srvrec):
        """Manage Treadmill app monitor configuration"""
        ctx['api'] = api
        if not ctx['api']:
            ctx['api'] = []

        if srvrec:
            result = dnsutils.srv(srvrec, None)
            for host, port, _p, _w in result:
                ctx['api'].append('http://{}:{}'.format(host, port))
コード例 #6
0
def _from_srvrec(ctx, srv_name):
    dns_server = list(ctx.obj['dns_server'])
    dns_port = ctx.obj['dns_port']

    srv_records = dnsutils.srv(srv_name, [dns_server, dns_port])
    if not srv_records:
        sys.exit('No srv records for %s' % srv_name)

    random.shuffle(srv_records)
    return [tuple(server_port[:2]) for server_port in srv_records]
コード例 #7
0
def get_ipa_urls_from_dns(domain):
    """Looks up IPA servers from DNS SRV records."""
    ipa_srv_rec = dnsutils.srv('_kerberos._tcp.{}'.format(domain))
    if not ipa_srv_rec:
        raise Exception('No IPA servers found')

    # Sort by (priority, -weight).
    ipa_srv_rec.sort(key=lambda srv_rec: (srv_rec[2], -srv_rec[3]))

    _LOGGER.debug('IPA SRV records: %r', ipa_srv_rec)

    return ['https://{}/ipa'.format(srv_rec[0]) for srv_rec in ipa_srv_rec]
コード例 #8
0
    def _resolve_srv(self, srv_rec):
        """Returns list of host, port tuples for given srv record."""
        if not self.dns_domain:
            raise ContextError('Treadmill DNS domain not specified.')

        result = dnsutils.srv(srv_rec + '.' + self.dns_domain)
        if result:
            return [
                'http://%s:%s' % (host, port)
                for host, port, _prio, _weight in result
            ]
        else:
            raise ContextError('No srv records found: %s', srv_rec)
コード例 #9
0
    def _resolve_srv(self, srv_rec):
        """Returns list of host, port tuples for given srv record."""
        _LOGGER.debug('Query DNS -t SRV %s.%s', srv_rec, self.dns_domain)
        if not self.dns_domain:
            raise ContextError('Treadmill DNS domain not specified.')

        result = dnsutils.srv(srv_rec + '.' + self.dns_domain)
        _LOGGER.debug('Result: %r', result)

        if result:
            return [
                dnsutils.srv_target_to_url(srv_rec, target)
                for target in result
            ]
        else:
            raise ContextError('No srv records found: %s' % srv_rec)
コード例 #10
0
ファイル: client.py プロジェクト: ceache/treadmill
def _check_cell(cellname, srvrec):
    """Check that locker service is defined and up for given cell."""
    result = dnsutils.srv(srvrec, context.GLOBAL.dns_server)
    active = []
    for host, port, _, _ in result:
        sock = None
        try:
            sock = socket.create_connection((host, port), 1)
            active.append((host, port))
        except socket.error:
            _LOGGER.warning('Keytab endpoint [%s] is down: %s:%s', cellname,
                            host, port)
        finally:
            if sock:
                sock.close()

    return active
コード例 #11
0
ファイル: forward.py プロジェクト: ceache/treadmill
def _check_cell(cellname, appname, dns_domain):
    """Return active endpoint for the locker given cell name."""
    srvrec = '_tickets._tcp.{}.{}.cell.{}'.format(appname, cellname,
                                                  dns_domain)
    result = dnsutils.srv(srvrec, context.GLOBAL.dns_server)

    active = []
    for host, port, _, _ in result:
        sock = None
        try:
            sock = socket.create_connection((host, port), 1)
            active.append((host, port))
        except socket.error:
            _LOGGER.warning('Ticket endpoint [%s] is down: %s:%s', cellname,
                            host, port)
        finally:
            if sock:
                sock.close()

    active.sort()
    return active