mirror of https://github.com/Ruslan-Isaev/modules
Create DNSResolver.py
parent
c779f9f7a3
commit
e416fefc98
|
@ -0,0 +1,96 @@
|
||||||
|
__version__ = (1, 0, 0)
|
||||||
|
|
||||||
|
# meta developer: @RUIS_VlP
|
||||||
|
# requires: dnspython
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
import dns.asyncresolver
|
||||||
|
import dns.exception
|
||||||
|
from .. import loader, utils
|
||||||
|
|
||||||
|
RECORD_TYPES = ["A", "AAAA", "CNAME", "MX", "NS", "TXT"]
|
||||||
|
|
||||||
|
async def resolve_record(domain: str, dns_servers: list, record_type: str):
|
||||||
|
resolver = dns.asyncresolver.Resolver()
|
||||||
|
resolver.nameservers = dns_servers
|
||||||
|
try:
|
||||||
|
response = await resolver.resolve(domain, record_type)
|
||||||
|
results = []
|
||||||
|
for rdata in response:
|
||||||
|
if record_type == "MX":
|
||||||
|
results.append(str(rdata.exchange).rstrip('.'))
|
||||||
|
elif record_type == "TXT":
|
||||||
|
results.append(''.join(part.decode() for part in rdata.strings))
|
||||||
|
else:
|
||||||
|
results.append(str(rdata).rstrip('.'))
|
||||||
|
return results
|
||||||
|
except (dns.resolver.NoAnswer, dns.resolver.NXDOMAIN, dns.resolver.NoNameservers, dns.exception.Timeout):
|
||||||
|
return []
|
||||||
|
|
||||||
|
async def resolve_all(domain: str, dns_servers: list):
|
||||||
|
results = {}
|
||||||
|
for record_type in RECORD_TYPES:
|
||||||
|
records = await resolve_record(domain, dns_servers, record_type)
|
||||||
|
if records:
|
||||||
|
results[record_type] = records
|
||||||
|
return results
|
||||||
|
|
||||||
|
def json2html(dns_data: dict) -> str:
|
||||||
|
icons = {
|
||||||
|
"A": "<emoji document_id=4967646650152519154>🌐</emoji>",
|
||||||
|
"AAAA": "<emoji document_id=4967646650152519154>🌐</emoji>",
|
||||||
|
"MX": "<emoji document_id=4967594608033792786>✉️</emoji>",
|
||||||
|
"NS": "<emoji document_id=4967677110060581624>🗄</emoji>",
|
||||||
|
"TXT": "<emoji document_id=4969849354195043059>📝</emoji>"
|
||||||
|
}
|
||||||
|
|
||||||
|
def section(title: str, items: list) -> str:
|
||||||
|
icon = icons.get(title, "")
|
||||||
|
if not items or items == ['']:
|
||||||
|
return f"<b>{icon} {title}:</b> Нет записей\n"
|
||||||
|
lines = '\n'.join(f"• <code>{item}</code>" for item in items)
|
||||||
|
return f"<b>{icon} {title}:</b>\n{lines}\n"
|
||||||
|
|
||||||
|
html_parts = [
|
||||||
|
section("A", dns_data.get("A", [])),
|
||||||
|
section("AAAA", dns_data.get("AAAA", [])),
|
||||||
|
section("MX", dns_data.get("MX", [])),
|
||||||
|
section("NS", dns_data.get("NS", [])),
|
||||||
|
section("TXT", dns_data.get("TXT", [])),
|
||||||
|
]
|
||||||
|
|
||||||
|
return '\n'.join(html_parts)
|
||||||
|
|
||||||
|
@loader.tds
|
||||||
|
class DNSResolverMod(loader.Module):
|
||||||
|
"""Модуль для отправки DNS запросов """
|
||||||
|
|
||||||
|
strings = {
|
||||||
|
"name": "DNSResolver",
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.config = loader.ModuleConfig(
|
||||||
|
loader.ConfigValue(
|
||||||
|
"DNS",
|
||||||
|
["8.8.8.8"],
|
||||||
|
lambda: "DNS сервера",
|
||||||
|
validator=loader.validators.Series(loader.validators.String()),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
@loader.command()
|
||||||
|
async def resolvecmd(self, message):
|
||||||
|
"""<домен> - получает DNS записи указанного домена"""
|
||||||
|
dns_servers = self.config["DNS"]
|
||||||
|
if not dns_servers:
|
||||||
|
dns_servers = ["8.8.8.8"]
|
||||||
|
dns_str = ', '.join(f"<code>{item}</code>" for item in dns_servers)
|
||||||
|
args = utils.get_args_raw(message)
|
||||||
|
if not args:
|
||||||
|
await utils.answer(message, "<b>Укажите домен, например:</b> <code>.resolve example.com</code>")
|
||||||
|
return
|
||||||
|
records = await resolve_all(args, dns_servers)
|
||||||
|
records = json2html(records)
|
||||||
|
answer = f"<b>DNS сервер:</b> {dns_str}\n<b>DNS записи</b> <code>{args}</code>:\n\n{records}"
|
||||||
|
await utils.answer(message, answer)
|
Loading…
Reference in New Issue