Добавлено тестирование создания и удаления DNS записи через аргумент командной строки --test-dns. Улучшено логирование процесса тестирования, включая шаги проверки API, создания и удаления TXT записи, а также ожидания распространения DNS.

This commit is contained in:
Dmitriy Fofanov
2025-10-30 08:58:57 +03:00
parent bcd87a2339
commit 9965f9903c
2 changed files with 149 additions and 3 deletions

View File

@@ -1398,6 +1398,11 @@ def main():
help="Протестировать подключение к API reg.ru",
action="store_true"
)
parser.add_argument(
"--test-dns",
help="Протестировать создание и удаление DNS записи (полный цикл как при SSL)",
action="store_true"
)
args = parser.parse_args()
@@ -1412,6 +1417,115 @@ def main():
# Настройка логирования
logger = setup_logging(config["log_file"], args.verbose)
# Тестирование DNS записей (полный цикл как при создании SSL)
if args.test_dns:
logger.info("=" * 80)
logger.info("ТЕСТИРОВАНИЕ СОЗДАНИЯ DNS ЗАПИСИ ДЛЯ SSL")
logger.info("=" * 80)
logger.info("Этот тест симулирует процесс создания SSL сертификата:")
logger.info("1. Проверка подключения к API")
logger.info("2. Создание TXT записи _acme-challenge")
logger.info("3. Проверка распространения DNS")
logger.info("4. Удаление тестовой записи")
logger.info("=" * 80)
logger.info("")
api = RegRuAPI(config["regru_username"], config["regru_password"], logger)
domain = config["domain"]
test_subdomain = "_acme-challenge"
test_value = f"test-value-{int(time.time())}"
all_passed = True
# Шаг 1: Проверка API
logger.info("📋 ШАГ 1/4: Проверка подключения к API reg.ru")
if not api.test_api_access():
logger.error("❌ API недоступен. Тест прерван.")
return 1
logger.info("✅ API доступен")
logger.info("")
# Шаг 2: Создание TXT записи
logger.info("📋 ШАГ 2/4: Создание тестовой TXT записи")
logger.info(f" Домен: {domain}")
logger.info(f" Поддомен: {test_subdomain}")
logger.info(f" Значение: {test_value}")
if api.add_txt_record(domain, test_subdomain, test_value):
logger.info("✅ TXT запись создана успешно")
else:
logger.error("Не удалось создать TXT запись")
all_passed = False
logger.info("")
if all_passed:
# Шаг 3: Ожидание распространения DNS
logger.info("📋 ШАГ 3/4: Ожидание распространения DNS")
wait_time = config.get("dns_propagation_wait", 60)
logger.info(f" Ожидаем {wait_time} секунд...")
for i in range(wait_time):
if i % 10 == 0:
logger.info(f" ⏳ Прошло {i}/{wait_time} секунд")
time.sleep(1)
logger.info("✅ Ожидание завершено")
logger.info("")
# Проверка DNS через nslookup
logger.info("📋 ШАГ 3.5/4: Проверка DNS записи через nslookup")
full_domain = f"{test_subdomain}.{domain}"
try:
result = subprocess.run(
["nslookup", "-type=TXT", full_domain],
capture_output=True,
text=True,
timeout=10
)
if test_value in result.stdout:
logger.info(f"✅ DNS запись найдена для {full_domain}")
logger.info(" Вывод nslookup:")
for line in result.stdout.split("\n"):
if test_value in line or "text =" in line.lower():
logger.info(f" {line.strip()}")
else:
logger.warning(f"⚠️ DNS запись НЕ найдена для {full_domain}")
logger.warning(" Это может быть нормально, если DNS ещё не распространился")
logger.warning(" Certbot будет ждать дольше при реальном создании сертификата")
except Exception as e:
logger.warning(f"⚠️ Не удалось проверить DNS: {e}")
logger.info("")
# Шаг 4: Удаление тестовой записи
logger.info("📋 ШАГ 4/4: Удаление тестовой записи")
if api.remove_txt_record(domain, test_subdomain, test_value):
logger.info("✅ TXT запись удалена успешно")
else:
logger.warning("⚠️ Не удалось удалить TXT запись (возможно уже удалена)")
logger.info("")
logger.info("=" * 80)
if all_passed:
logger.info("ВСЕ ТЕСТЫ ПРОЙДЕНЫ УСПЕШНО")
logger.info("=" * 80)
logger.info("")
logger.info("🎉 Система готова для создания SSL сертификата!")
logger.info("")
logger.info("Следующие шаги:")
logger.info("1. Убедитесь что ваш IP добавлен в белый список API reg.ru")
logger.info("2. Запустите: sudo letsencrypt-regru --obtain")
logger.info("3. Или настройте автоматическое обновление:")
logger.info(" sudo systemctl enable letsencrypt-regru.timer")
logger.info(" sudo systemctl start letsencrypt-regru.timer")
return 0
else:
logger.error("❌ НЕКОТОРЫЕ ТЕСТЫ НЕ ПРОЙДЕНЫ")
logger.error("=" * 80)
logger.error("Исправьте проблемы перед созданием SSL сертификата")
return 1
# Тестирование API
if args.test_api:
logger.info("=" * 80)