Skip to content

Instantly share code, notes, and snippets.

@MineRobber9000
Created June 7, 2021 08:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MineRobber9000/7f8222ccc8033e82801b9ad1ddd1f202 to your computer and use it in GitHub Desktop.
Save MineRobber9000/7f8222ccc8033e82801b9ad1ddd1f202 to your computer and use it in GitHub Desktop.
proof of concept SRV resolver in ~35 LoC
from dns.resolver import Resolver
from itertools import groupby
from random import choices
choice = lambda *args,**kwargs: choices(*args,**kwargs)[0]
from operator import attrgetter
priority_sort = attrgetter("priority")
class SRVResolver:
class Iterator:
def __init__(self,grouped_records):
self.records = grouped_records
def __next__(self):
if len(self.records)==0: raise StopIteration
group = self.records[0]
while len(group[1])==0:
self.records.pop(0)
if len(self.records)==0: raise StopIteration
group = self.records[0]
_, records = group # ditch priority value
weights = [x.weight+1 for x in records]
record = choice(records,weights)
records.remove(record)
return (record.target.to_text().rstrip("."),record.port)
def __init__(self,service,domain,transport="tcp",resolver=None):
if resolver is None: resolver=Resolver()
self.qname = f"_{service}._{transport}.{domain}"
self.resolver = resolver
def __iter__(self):
result = self.resolver.query(self.qname,"SRV")
grouped_records = []
for priority, records in groupby(sorted(result,key=priority_sort),priority_sort):
grouped_records.append((priority,list(records)))
return SRVResolver.Iterator(grouped_records)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment