From cff2c73b6a3d827bfeaf2cc7913958a0d5b04de5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D1=88=D0=BA=D0=B8=D0=BD=20=D0=A1=D0=B5=D1=80?= =?UTF-8?q?=D0=B3=D0=B5=D0=B9?= Date: Fri, 5 Dec 2025 12:00:11 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=B2=D1=82=D0=BE=D1=80=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D1=84=D0=B8=D0=BA=D1=81=20url?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbapp/lyngsatapp/async_utils.py | 3 +- dbapp/test_lyngsat_connection.py | 243 +++++++++++++++++++++++++++++++ 2 files changed, 245 insertions(+), 1 deletion(-) create mode 100644 dbapp/test_lyngsat_connection.py diff --git a/dbapp/lyngsatapp/async_utils.py b/dbapp/lyngsatapp/async_utils.py index e5c3c45..2be1551 100644 --- a/dbapp/lyngsatapp/async_utils.py +++ b/dbapp/lyngsatapp/async_utils.py @@ -6,6 +6,7 @@ from typing import Callable, Optional from .async_parser import AsyncLyngSatParser from .models import LyngSat from mainapp.models import Polarization, Standard, Modulation, Satellite +from dbapp.settings.base import FLARESOLVERR_URL logger = logging.getLogger(__name__) @@ -189,7 +190,7 @@ def fill_lyngsat_data_async( try: # Создаем парсер parser = AsyncLyngSatParser( - flaresolver_url="http://localhost:8191/v1", + flaresolver_url=FLARESOLVERR_URL, target_sats=target_sats, regions=regions, use_cache=use_cache diff --git a/dbapp/test_lyngsat_connection.py b/dbapp/test_lyngsat_connection.py new file mode 100644 index 0000000..ce6075f --- /dev/null +++ b/dbapp/test_lyngsat_connection.py @@ -0,0 +1,243 @@ +#!/usr/bin/env python3 +""" +Diagnostic script to test LyngSat parser connectivity in Docker environment. +Run this inside the container to verify FlareSolver connection. + +Usage: + # Inside Docker container: + python test_lyngsat_connection.py + + # Or with Django environment: + python manage.py shell < test_lyngsat_connection.py +""" + +import os +import sys +import requests +from datetime import datetime + +# Add Django project to path +sys.path.insert(0, '/app') +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dbapp.settings.production') + + +def test_connection(url: str, timeout: int = 10) -> dict: + """Test connection to a given URL""" + result = { + "url": url, + "success": False, + "status_code": None, + "error": None, + "response_time": None + } + + try: + start_time = datetime.now() + response = requests.get(url, timeout=timeout) + end_time = datetime.now() + + result["success"] = True + result["status_code"] = response.status_code + result["response_time"] = (end_time - start_time).total_seconds() + + except requests.exceptions.ConnectionError as e: + result["error"] = f"Connection Error: {str(e)}" + except requests.exceptions.Timeout as e: + result["error"] = f"Timeout Error: {str(e)}" + except Exception as e: + result["error"] = f"Unexpected Error: {str(e)}" + + return result + + +def test_flaresolverr(base_url: str) -> dict: + """Test FlareSolver API endpoint""" + result = { + "base_url": base_url, + "success": False, + "error": None, + "response_time": None + } + + try: + start_time = datetime.now() + payload = { + "cmd": "request.get", + "url": "https://www.lyngsat.com/europe.html", + "maxTimeout": 60000 + } + + response = requests.post(f"{base_url}/v1", json=payload, timeout=30) + end_time = datetime.now() + + result["success"] = response.status_code == 200 + result["status_code"] = response.status_code + result["response_time"] = (end_time - start_time).total_seconds() + + if response.status_code == 200: + json_response = response.json() + result["solution_status"] = json_response.get("status") + result["has_solution"] = "solution" in json_response + + except requests.exceptions.ConnectionError as e: + result["error"] = f"Connection Error: {str(e)}" + except requests.exceptions.Timeout as e: + result["error"] = f"Timeout Error: {str(e)}" + except Exception as e: + result["error"] = f"Unexpected Error: {str(e)}" + + return result + + +def print_result(title: str, result: dict): + """Pretty print test result""" + print(f"\n{'='*60}") + print(f" {title}") + print(f"{'='*60}") + + for key, value in result.items(): + if value is not None: + status_icon = "✓" if (key == "success" and value) else ("✗" if key == "success" else "→") + print(f"{status_icon} {key}: {value}") + + +def main(): + print("\n" + "="*60) + print(" LyngSat Parser Connection Diagnostic") + print("="*60) + print(f"Timestamp: {datetime.now().isoformat()}") + print(f"Python: {sys.version}") + + # Environment info + print("\n" + "-"*60) + print("Environment Variables:") + print("-"*60) + env_vars = [ + "DJANGO_SETTINGS_MODULE", + "CELERY_BROKER_URL", + "REDIS_URL", + "FLARESOLVERR_URL", + "DB_HOST", + "DB_NAME" + ] + for key in env_vars: + value = os.environ.get(key, "NOT SET") + print(f" {key}: {value}") + + # Try to load Django settings + print("\n" + "-"*60) + print("Django Settings:") + print("-"*60) + try: + import django + django.setup() + from django.conf import settings + print(f" FLARESOLVERR_URL from settings: {getattr(settings, 'FLARESOLVERR_URL', 'NOT SET')}") + print(f" CELERY_BROKER_URL from settings: {getattr(settings, 'CELERY_BROKER_URL', 'NOT SET')}") + print(f" DEBUG: {settings.DEBUG}") + except Exception as e: + print(f" ✗ Cannot load Django settings: {str(e)}") + + # Test different FlareSolver URLs + test_urls = [ + ("localhost:8191", "http://localhost:8191"), + ("flaresolverr:8191 (Docker service)", "http://flaresolverr:8191"), + ("127.0.0.1:8191", "http://127.0.0.1:8191"), + ] + + print("\n" + "-"*60) + print("Testing Basic Connectivity:") + print("-"*60) + + for name, url in test_urls: + result = test_connection(url) + print_result(f"Connection Test: {name}", result) + + # Test FlareSolver API + print("\n" + "-"*60) + print("Testing FlareSolver API:") + print("-"*60) + + api_urls = [ + ("localhost", "http://localhost:8191"), + ("flaresolverr (Docker)", "http://flaresolverr:8191"), + ] + + for name, url in api_urls: + result = test_flaresolverr(url) + print_result(f"FlareSolver API Test: {name}", result) + + # Test with actual parser + print("\n" + "-"*60) + print("Testing LyngSat Parser:") + print("-"*60) + + try: + from lyngsatapp.parser import LyngSatParser + from django.conf import settings + + # Get URL from settings + settings_url = getattr(settings, 'FLARESOLVERR_URL', 'http://flaresolverr:8191/v1') + print(f"\nUsing FLARESOLVERR_URL from settings: {settings_url}") + + # Test with different URLs + test_parser_urls = [ + ("Settings URL", settings_url), + ("localhost", "http://localhost:8191/v1"), + ("flaresolverr", "http://flaresolverr:8191/v1"), + ] + + for name, url in test_parser_urls: + print(f"\nTesting parser with {name} ({url})...") + try: + parser = LyngSatParser(flaresolver_url=url, regions=["europe"], target_sats=["express-am6"]) + print(f" ✓ Parser initialized") + + # Try to get one region page (with timeout) + print(f" → Fetching region page (this may take 10-30 seconds)...") + html_pages = parser.get_region_pages(["europe"]) + if html_pages and html_pages[0]: + print(f" ✓ Successfully fetched page (length: {len(html_pages[0])} chars)") + # Check if it contains expected content + if "lyngsat" in html_pages[0].lower(): + print(f" ✓ Page contains expected LyngSat content") + break # Success, no need to test other URLs + else: + print(f" ✗ Failed to fetch page (empty response)") + + except Exception as e: + print(f" ✗ Parser error: {str(e)}") + import traceback + print(f" Traceback: {traceback.format_exc()}") + + except ImportError as e: + print(f" ✗ Cannot import parser: {str(e)}") + except Exception as e: + print(f" ✗ Unexpected error: {str(e)}") + + # Recommendations + print("\n" + "="*60) + print(" Recommendations:") + print("="*60) + print(""" +1. If 'flaresolverr:8191' works but 'localhost:8191' doesn't: + → Update parser to use 'flaresolverr:8191' in Docker environment + +2. If none work: + → Check if FlareSolver container is running: docker ps | grep flaresolverr + → Check Docker network: docker network inspect + → Check FlareSolver logs: docker logs flaresolverr + +3. To fix in code: + → Use environment variable for FlareSolver URL + → Default to 'flaresolverr:8191' in production + → Use 'localhost:8191' only in local development + """) + + print("\n" + "="*60) + print(" Diagnostic Complete") + print("="*60 + "\n") + + +if __name__ == "__main__": + main()