174 lines
5.3 KiB
Python
174 lines
5.3 KiB
Python
"""
|
||
Nameserver kontrolü ve doğrulama servisi
|
||
"""
|
||
import dns.resolver
|
||
from typing import Dict, List, Optional
|
||
import CloudFlare
|
||
|
||
|
||
class NameserverService:
|
||
"""NS kayıtlarını kontrol eden servis"""
|
||
|
||
CLOUDFLARE_NAMESERVERS = [
|
||
"ns1.cloudflare.com",
|
||
"ns2.cloudflare.com",
|
||
"ns3.cloudflare.com",
|
||
"ns4.cloudflare.com",
|
||
"ns5.cloudflare.com",
|
||
"ns6.cloudflare.com",
|
||
"ns7.cloudflare.com",
|
||
]
|
||
|
||
@staticmethod
|
||
def get_current_nameservers(domain: str) -> Dict:
|
||
"""
|
||
Domain'in mevcut nameserver'larını al
|
||
|
||
Args:
|
||
domain: Kontrol edilecek domain
|
||
|
||
Returns:
|
||
{
|
||
"status": "success" | "error",
|
||
"nameservers": ["ns1.example.com", ...],
|
||
"message": "..."
|
||
}
|
||
"""
|
||
try:
|
||
# NS kayıtlarını sorgula
|
||
resolver = dns.resolver.Resolver()
|
||
resolver.timeout = 5
|
||
resolver.lifetime = 5
|
||
|
||
answers = resolver.resolve(domain, 'NS')
|
||
nameservers = [str(rdata.target).rstrip('.') for rdata in answers]
|
||
|
||
return {
|
||
"status": "success",
|
||
"nameservers": nameservers,
|
||
"count": len(nameservers)
|
||
}
|
||
|
||
except dns.resolver.NXDOMAIN:
|
||
return {
|
||
"status": "error",
|
||
"message": f"Domain '{domain}' bulunamadı (NXDOMAIN)",
|
||
"nameservers": []
|
||
}
|
||
|
||
except dns.resolver.NoAnswer:
|
||
return {
|
||
"status": "error",
|
||
"message": f"Domain '{domain}' için NS kaydı bulunamadı",
|
||
"nameservers": []
|
||
}
|
||
|
||
except dns.resolver.Timeout:
|
||
return {
|
||
"status": "error",
|
||
"message": "DNS sorgusu zaman aşımına uğradı",
|
||
"nameservers": []
|
||
}
|
||
|
||
except Exception as e:
|
||
return {
|
||
"status": "error",
|
||
"message": f"NS sorgu hatası: {str(e)}",
|
||
"nameservers": []
|
||
}
|
||
|
||
@staticmethod
|
||
def check_cloudflare_nameservers(domain: str) -> Dict:
|
||
"""
|
||
Domain'in NS'lerinin Cloudflare'e yönlendirilip yönlendirilmediğini kontrol et
|
||
|
||
Returns:
|
||
{
|
||
"status": "success" | "partial" | "error",
|
||
"is_cloudflare": bool,
|
||
"current_nameservers": [...],
|
||
"cloudflare_nameservers": [...],
|
||
"message": "..."
|
||
}
|
||
"""
|
||
result = NameserverService.get_current_nameservers(domain)
|
||
|
||
if result["status"] == "error":
|
||
return {
|
||
"status": "error",
|
||
"is_cloudflare": False,
|
||
"current_nameservers": [],
|
||
"cloudflare_nameservers": [],
|
||
"message": result["message"]
|
||
}
|
||
|
||
current_ns = result["nameservers"]
|
||
|
||
# Cloudflare NS'leri ile karşılaştır
|
||
cf_ns_found = []
|
||
other_ns_found = []
|
||
|
||
for ns in current_ns:
|
||
ns_lower = ns.lower()
|
||
if any(cf_ns in ns_lower for cf_ns in NameserverService.CLOUDFLARE_NAMESERVERS):
|
||
cf_ns_found.append(ns)
|
||
else:
|
||
other_ns_found.append(ns)
|
||
|
||
# Tüm NS'ler Cloudflare mı?
|
||
all_cloudflare = len(cf_ns_found) > 0 and len(other_ns_found) == 0
|
||
|
||
# Kısmi Cloudflare mı?
|
||
partial_cloudflare = len(cf_ns_found) > 0 and len(other_ns_found) > 0
|
||
|
||
if all_cloudflare:
|
||
status = "success"
|
||
message = f"✅ Tüm nameserver'lar Cloudflare'e yönlendirilmiş ({len(cf_ns_found)} NS)"
|
||
elif partial_cloudflare:
|
||
status = "partial"
|
||
message = f"⚠️ Bazı nameserver'lar Cloudflare'e yönlendirilmiş ({len(cf_ns_found)}/{len(current_ns)})"
|
||
else:
|
||
status = "error"
|
||
message = f"❌ Nameserver'lar henüz Cloudflare'e yönlendirilmemiş"
|
||
|
||
return {
|
||
"status": status,
|
||
"is_cloudflare": all_cloudflare,
|
||
"current_nameservers": current_ns,
|
||
"cloudflare_nameservers": cf_ns_found,
|
||
"other_nameservers": other_ns_found,
|
||
"message": message
|
||
}
|
||
|
||
@staticmethod
|
||
def get_cloudflare_zone_nameservers(zone_id: str, api_token: str) -> Dict:
|
||
"""
|
||
Cloudflare zone'un nameserver'larını al
|
||
|
||
Returns:
|
||
{
|
||
"status": "success" | "error",
|
||
"nameservers": ["ns1.cloudflare.com", ...],
|
||
"message": "..."
|
||
}
|
||
"""
|
||
try:
|
||
cf = CloudFlare.CloudFlare(token=api_token)
|
||
zone = cf.zones.get(zone_id)
|
||
|
||
nameservers = zone.get("name_servers", [])
|
||
|
||
return {
|
||
"status": "success",
|
||
"nameservers": nameservers,
|
||
"count": len(nameservers)
|
||
}
|
||
|
||
except Exception as e:
|
||
return {
|
||
"status": "error",
|
||
"message": f"Cloudflare zone NS sorgu hatası: {str(e)}",
|
||
"nameservers": []
|
||
}
|
||
|