From 3ed64fbe08deaba6aaa1fed918de8895361425b5 Mon Sep 17 00:00:00 2001 From: Galaxy Date: Sat, 26 Jul 2025 12:59:57 +0800 Subject: [PATCH] new files --- .vscode/settings.json | 66 ++ README.md | 350 +++++++++- __pycache__/config.cpython-313.pyc | Bin 0 -> 5074 bytes build_cpp.sh | 89 +++ config.json | 43 ++ config.py | 95 +++ example_usage.py | 67 ++ install.bat | 86 +++ install.sh | 83 +++ ip_lists/cloudflare.txt | 6 + ip_lists/edgeone.txt | 597 ++++++++++++++++++ ip_lists/esa.txt | 5 + ip_lists/fastly.txt | 5 + logs/bestcdn_20250725_171449.log | 353 +++++++++++ logs/bestcdn_20250725_171626.log | 361 +++++++++++ logs/bestcdn_20250726_124107.log | 365 +++++++++++ logs/bestcdn_20250726_124132.log | 379 +++++++++++ logs/bestcdn_20250726_124331.log | 377 +++++++++++ requirements.txt | 7 + results/cpp_accessible_20250726_125038.txt | 7 + results/cpp_results_20250726_125038.json | 88 +++ run.bat | 34 + run.sh | 32 + run_cpp.sh | 56 ++ src/__init__.py | 7 + src/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 362 bytes src/__pycache__/main.cpython-313.pyc | Bin 0 -> 14043 bytes src/cpp/Makefile | 42 ++ src/cpp/bestcdn_tester | Bin 0 -> 137816 bytes src/cpp/bestcdn_tester.cpp | 509 +++++++++++++++ src/main.py | 248 ++++++++ src/testers/__init__.py | 7 + .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 323 bytes .../accessibility_tester.cpython-313.pyc | Bin 0 -> 13440 bytes src/testers/accessibility_tester.py | 292 +++++++++ src/utils/__init__.py | 8 + .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 339 bytes .../__pycache__/ip_reader.cpython-313.pyc | Bin 0 -> 7434 bytes .../results_manager.cpython-313.pyc | Bin 0 -> 17417 bytes src/utils/ip_reader.py | 139 ++++ src/utils/results_manager.py | 297 +++++++++ 41 files changed, 5099 insertions(+), 1 deletion(-) create mode 100644 .vscode/settings.json create mode 100644 __pycache__/config.cpython-313.pyc create mode 100755 build_cpp.sh create mode 100644 config.json create mode 100644 config.py create mode 100644 example_usage.py create mode 100644 install.bat create mode 100644 install.sh create mode 100644 ip_lists/cloudflare.txt create mode 100644 ip_lists/edgeone.txt create mode 100644 ip_lists/esa.txt create mode 100644 ip_lists/fastly.txt create mode 100644 logs/bestcdn_20250725_171449.log create mode 100644 logs/bestcdn_20250725_171626.log create mode 100644 logs/bestcdn_20250726_124107.log create mode 100644 logs/bestcdn_20250726_124132.log create mode 100644 logs/bestcdn_20250726_124331.log create mode 100644 requirements.txt create mode 100644 results/cpp_accessible_20250726_125038.txt create mode 100644 results/cpp_results_20250726_125038.json create mode 100644 run.bat create mode 100755 run.sh create mode 100755 run_cpp.sh create mode 100644 src/__init__.py create mode 100644 src/__pycache__/__init__.cpython-313.pyc create mode 100644 src/__pycache__/main.cpython-313.pyc create mode 100644 src/cpp/Makefile create mode 100755 src/cpp/bestcdn_tester create mode 100644 src/cpp/bestcdn_tester.cpp create mode 100644 src/main.py create mode 100644 src/testers/__init__.py create mode 100644 src/testers/__pycache__/__init__.cpython-313.pyc create mode 100644 src/testers/__pycache__/accessibility_tester.cpython-313.pyc create mode 100644 src/testers/accessibility_tester.py create mode 100644 src/utils/__init__.py create mode 100644 src/utils/__pycache__/__init__.cpython-313.pyc create mode 100644 src/utils/__pycache__/ip_reader.cpython-313.pyc create mode 100644 src/utils/__pycache__/results_manager.cpython-313.pyc create mode 100644 src/utils/ip_reader.py create mode 100644 src/utils/results_manager.py diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..cd3d68e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,66 @@ +{ + "files.associations": { + "array": "cpp", + "atomic": "cpp", + "bit": "cpp", + "cctype": "cpp", + "charconv": "cpp", + "chrono": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "compare": "cpp", + "concepts": "cpp", + "condition_variable": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "map": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "optional": "cpp", + "random": "cpp", + "ratio": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "format": "cpp", + "fstream": "cpp", + "future": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "mutex": "cpp", + "new": "cpp", + "numbers": "cpp", + "ostream": "cpp", + "semaphore": "cpp", + "span": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "stop_token": "cpp", + "streambuf": "cpp", + "text_encoding": "cpp", + "thread": "cpp", + "typeinfo": "cpp", + "variant": "cpp" + } +} \ No newline at end of file diff --git a/README.md b/README.md index a9ece2d..1161638 100644 --- a/README.md +++ b/README.md @@ -1 +1,349 @@ -HELLO AND THIS IS A PUSH TEST. \ No newline at end of file +# BestCDN - High-Performance CDN IP Accessibility Tester + +A high-performance tool to find accessible CDN IP addresses, specifically optimized for customers in China. This tool tests large quantities of IP addresses concurrently to identify which ones are accessible through your provided test domains. + +**Available in two versions:** +- **C++ Version** (Recommended): Maximum performance for testing thousands of IPs +- **Python Version**: Easier to modify and extend + +## Features + +- **High-Performance**: Concurrent testing of thousands of IPs with configurable batch sizes +- **Multi-Provider Support**: EdgeOne (Tencent Cloud), ESA (Alibaba Cloud), Fastly, Cloudflare +- **JSON Response Verification**: Tests actual CDN functionality by verifying JSON response content +- **User-Provided IP Lists**: You provide the IP lists, the tool tests accessibility +- **Comprehensive Results**: Multiple output formats and detailed statistics +- **China-Optimized**: Designed for testing from China with appropriate timeouts and configurations + +## Quick Start + +### 1. Installation + +```bash +# Clone or download the project +cd BestCDN + +# Create and activate virtual environment +python3 -m venv venv + +# Activate virtual environment +# On Linux/Mac: +source venv/bin/activate +# On Windows: +# venv\Scripts\activate + +# Install Python dependencies +pip install -r requirements.txt + +# Create necessary directories +mkdir -p ip_lists results logs +``` + +**Note:** Always activate the virtual environment before running the project: +```bash +# Linux/Mac +source venv/bin/activate + +# Windows +venv\Scripts\activate +``` + +### 2. Prepare IP Lists + +Create IP list files in the `ip_lists/` directory for each CDN provider you want to test: + +- `ip_lists/cloudflare.txt` - Cloudflare IP addresses +- `ip_lists/fastly.txt` - Fastly IP addresses +- `ip_lists/edgeone.txt` - EdgeOne (Tencent Cloud) IP addresses +- `ip_lists/esa.txt` - ESA (Alibaba Cloud) IP addresses + +**IP List Format:** +``` +# Comments start with # +192.168.1.1 +10.0.0.0/24 +203.0.113.0/24 +1.1.1.0/24 +# Single IPs and CIDR ranges are both supported +# CIDR ranges are automatically expanded to individual IPs +``` + +**CIDR Handling:** +- **Small networks (/24 and smaller)**: All IPs are tested +- **Large networks (/23 and larger)**: Sampled to 1000 IPs for performance +- **IPv4 only**: Currently supports IPv4 CIDR notation + +### 3. Basic Usage + +## C++ Version (Recommended for Performance) + +**Quick Start:** +```bash +# Build and run C++ version +chmod +x build_cpp.sh run_cpp.sh +./run_cpp.sh +``` + +**Manual Build:** +```bash +# Install dependencies and build +./build_cpp.sh + +# Run the tester +cd src/cpp +./bestcdn_tester +``` + +## Python Version + +**Easy Method:** +```bash +# Make sure virtual environment is activated first +source venv/bin/activate # Linux/Mac +# or +venv\Scripts\activate # Windows + +# Then run the example +python3 example_usage.py # Linux/Mac +python example_usage.py # Windows +``` + +**Or use the automated run scripts:** +```bash +# Linux/Mac +chmod +x run.sh +./run.sh + +# Windows +run.bat +``` + +**Programmatic Usage:** +```python +from src.main import BestCDN +import asyncio + +# Create BestCDN instance +app = BestCDN() + +# Set test domains for each provider +app.set_test_domains({ + 'cloudflare': 'your-cf-test-domain.com', + 'fastly': 'your-fastly-test-domain.com', + 'edgeone': 'your-edgeone-test-domain.com', + 'esa': 'your-esa-test-domain.com' +}) + +# Run the accessibility test +success = asyncio.run(app.run_accessibility_test()) +``` + +## How Verification Works + +The system uses **JSON response verification** to ensure IPs are actually working CDN endpoints: + +### Test Domains: +- **EdgeOne, ESA, Fastly**: `test10000.ix.je` +- **Cloudflare**: `test10000.fstring.me` + +### Verification Process: +1. **HTTP/HTTPS Request**: Tests both protocols (HTTPS first, then HTTP) to `/testpage.php` +2. **JSON Response Check**: Server must return valid JSON +3. **Content Verification**: JSON must contain `{"test_message": "testpagegalaxy123"}` + +### Success Criteria: +✅ **ACCESSIBLE** - All conditions met: +- HTTP 200 status code +- Valid JSON response +- Correct `test_message` value + +❌ **FAILED** - Any condition fails: +- Non-200 status code +- Invalid/missing JSON +- Wrong `test_message` value +- Connection timeout/error + +## Configuration + +### Performance Settings + +Edit `config.py` or `config.json` to adjust performance parameters: + +```python +performance = { + "concurrent_requests": 100, # Number of concurrent requests + "request_timeout": 3.0, # Timeout per request (seconds) + "max_retries": 2, # Max retries per IP + "batch_size": 1000, # IPs processed per batch + "worker_threads": 4 # DNS resolution threads +} +``` + +### Provider Configuration + +```python +# Enable/disable providers +cdn_providers = { + "cloudflare": { + "enabled": True, + "test_domain": "your-domain.com" + }, + "fastly": { + "enabled": True, + "test_domain": "your-domain.com" + } + # ... etc +} +``` + +## Output Files + +The tool generates several output files in the `results/` directory: + +- `accessibility_results_TIMESTAMP.json` - Complete test results +- `accessible_ips_TIMESTAMP.txt` - Only accessible IPs (simple format) +- `summary_report_TIMESTAMP.txt` - Human-readable summary +- `{provider}_results_TIMESTAMP.json` - Provider-specific results + +## Example Output + +``` +============================================================= +CDN IP ACCESSIBILITY TEST SUMMARY REPORT +============================================================= + +OVERALL STATISTICS: +Total IPs Tested: 10000 +Total Accessible: 3247 +Overall Success Rate: 32.47% +Average Response Time: 1.234s + +PROVIDER BREAKDOWN: +CLOUDFLARE: + Tested: 2500 + Accessible: 892 + Success Rate: 35.68% + +EDGEONE: + Tested: 3000 + Accessible: 1205 + Success Rate: 40.17% +``` + +## Advanced Usage + +### Custom Configuration + +```python +from config import Config + +# Load custom config +config = Config("my_config.json") +app = BestCDN("my_config.json") +``` + +### Programmatic Access to Results + +```python +# After running test +async with AccessibilityTester(config) as tester: + results = await tester.test_all_ips(provider_ips, test_domains) + + # Get accessible IPs by provider + accessible = tester.get_accessible_ips() + + # Get detailed statistics + stats = tester.get_statistics() +``` + +### Batch Processing + +For very large IP lists, the tool automatically processes IPs in batches to manage memory usage efficiently. + +## Performance Optimization + +### For Maximum Speed + +```python +performance = { + "concurrent_requests": 200, # Increase concurrent requests + "request_timeout": 2.0, # Reduce timeout + "batch_size": 2000, # Larger batches + "worker_threads": 8 # More DNS threads +} +``` + +### For Stability + +```python +performance = { + "concurrent_requests": 50, # Fewer concurrent requests + "request_timeout": 5.0, # Longer timeout + "batch_size": 500, # Smaller batches + "worker_threads": 2 # Fewer DNS threads +} +``` + +## Troubleshooting + +### Common Issues + +1. **"Missing IP list files"** + - Ensure IP list files exist in `ip_lists/` directory + - Check file names match provider names exactly + +2. **"No test domain configured"** + - Set test domains using `app.set_test_domains()` + - Or configure in `config.json` + +3. **High memory usage** + - Reduce `batch_size` in configuration + - Limit IP ranges in your IP list files + +4. **Slow performance** + - Increase `concurrent_requests` + - Reduce `request_timeout` + - Check network connectivity + +### Logging + +Logs are saved to `logs/bestcdn_TIMESTAMP.log` with detailed information about: +- IP loading progress +- Test execution status +- Error details +- Performance statistics + +## File Structure + +``` +BestCDN/ +├── src/ +│ ├── main.py # Main application +│ ├── testers/ +│ │ └── accessibility_tester.py +│ └── utils/ +│ ├── ip_reader.py +│ └── results_manager.py +├── ip_lists/ # Your IP list files go here +│ ├── cloudflare.txt +│ ├── fastly.txt +│ ├── edgeone.txt +│ └── esa.txt +├── results/ # Output files +├── logs/ # Log files +├── config.py # Configuration +├── requirements.txt # Python dependencies +└── README.md # This file +``` + +## Requirements + +- Python 3.7+ +- aiohttp +- asyncio +- dnspython +- Other dependencies in `requirements.txt` + +## License + +MIT License - See LICENSE file for details. \ No newline at end of file diff --git a/__pycache__/config.cpython-313.pyc b/__pycache__/config.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1973507f77ec4d8a36aa032cf1ee4b329a91bce4 GIT binary patch literal 5074 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 fT6PHt*MMr+H9%KlsVm664F7-| /dev/null; then + sudo apt-get update + sudo apt-get install -y libcurl4-openssl-dev libjsoncpp-dev build-essential pkg-config + elif command -v yum &> /dev/null; then + sudo yum install -y libcurl-devel jsoncpp-devel gcc-c++ make pkgconfig + elif command -v dnf &> /dev/null; then + sudo dnf install -y libcurl-devel jsoncpp-devel gcc-c++ make pkgconfig + else + echo "Error: Package manager not found. Please install libcurl-dev and libjsoncpp-dev manually." + exit 1 + fi + fi + +elif [[ "$OSTYPE" == "darwin"* ]]; then + echo "Detected macOS system" + + # Check if Homebrew is installed + if ! command -v brew &> /dev/null; then + echo "Error: Homebrew not found. Please install Homebrew first." + exit 1 + fi + + # Install dependencies + echo "Installing dependencies..." + brew install curl jsoncpp pkg-config + +else + echo "Unsupported operating system: $OSTYPE" + exit 1 +fi + +# Create results directory +echo "Creating results directory..." +mkdir -p results + +# Build the C++ tester +echo "Building C++ tester..." +cd src/cpp + +# Use pkg-config to get proper flags +if pkg-config --exists libcurl; then + CURL_FLAGS=$(pkg-config --cflags --libs libcurl) +else + CURL_FLAGS="-lcurl" +fi + +if pkg-config --exists jsoncpp; then + JSONCPP_FLAGS=$(pkg-config --cflags --libs jsoncpp) +else + JSONCPP_FLAGS="-ljsoncpp" +fi + +echo "Building with flags: $CURL_FLAGS $JSONCPP_FLAGS" + +g++ -std=c++17 -O3 -Wall -Wextra -pthread \ + bestcdn_tester.cpp \ + $CURL_FLAGS $JSONCPP_FLAGS \ + -o bestcdn_tester + +if [ $? -eq 0 ]; then + echo "✓ Build successful!" + echo "" + echo "To run the C++ tester:" + echo " cd src/cpp" + echo " ./bestcdn_tester" + echo "" + echo "Make sure your IP lists are in the ip_lists/ directory:" + echo " - ip_lists/cloudflare.txt" + echo " - ip_lists/fastly.txt" + echo " - ip_lists/edgeone.txt" + echo " - ip_lists/esa.txt" +else + echo "✗ Build failed!" + exit 1 +fi \ No newline at end of file diff --git a/config.json b/config.json new file mode 100644 index 0000000..a6cb2ed --- /dev/null +++ b/config.json @@ -0,0 +1,43 @@ +{ + "performance": { + "concurrent_requests": 100, + "request_timeout": 3.0, + "max_retries": 2, + "batch_size": 1000, + "worker_threads": 4 + }, + "cdnProviders": { + "edgeone": { + "name": "EdgeOne (Tencent Cloud)", + "enabled": true, + "test_domain": "test10000.ix.je" + }, + "esa": { + "name": "ESA (Alibaba Cloud)", + "enabled": true, + "test_domain": "test10000.ix.je" + }, + "fastly": { + "name": "Fastly", + "enabled": true, + "test_domain": "test10000.ix.je" + }, + "cloudflare": { + "name": "Cloudflare", + "enabled": true, + "test_domain": "test10000.fstring.me" + } + }, + "testing": { + "protocols": ["https", "http"], + "user_agent": "BestCDN-Tester/1.0", + "follow_redirects": false, + "validate_ssl": false + }, + "output": { + "format": "json", + "save_results": true, + "output_file": "results/accessible_ips.json", + "log_level": "info" + } +} \ No newline at end of file diff --git a/config.py b/config.py new file mode 100644 index 0000000..561478d --- /dev/null +++ b/config.py @@ -0,0 +1,95 @@ +""" +Configuration settings for BestCDN IP accessibility tester +""" + +import json +from typing import Dict, List, Optional +from dataclasses import dataclass + +@dataclass +class PerformanceConfig: + concurrent_requests: int = 100 + request_timeout: float = 3.0 + max_retries: int = 2 + batch_size: int = 1000 + worker_threads: int = 4 + +@dataclass +class CDNProviderConfig: + name: str + enabled: bool = True + test_domain: str = "" + +@dataclass +class TestingConfig: + protocols: List[str] = None + user_agent: str = "BestCDN-Tester/1.0" + follow_redirects: bool = False + validate_ssl: bool = False + +@dataclass +class OutputConfig: + format: str = "json" + save_results: bool = True + output_file: str = "results/accessible_ips.json" + log_level: str = "info" + +class Config: + def __init__(self, config_file: str = "config.json"): + self.performance = PerformanceConfig() + self.testing = TestingConfig(protocols=["http", "https"]) + self.output = OutputConfig() + + # CDN Providers configuration + self.cdn_providers = { + "edgeone": CDNProviderConfig( + name="EdgeOne (Tencent Cloud)" + ), + "esa": CDNProviderConfig( + name="ESA (Alibaba Cloud)" + ), + "fastly": CDNProviderConfig( + name="Fastly" + ), + "cloudflare": CDNProviderConfig( + name="Cloudflare" + ) + } + + # Load from file if exists + try: + with open(config_file, 'r') as f: + self._load_from_dict(json.load(f)) + except FileNotFoundError: + pass + + def _load_from_dict(self, config_dict: Dict): + """Load configuration from dictionary""" + if "performance" in config_dict: + perf = config_dict["performance"] + self.performance = PerformanceConfig(**perf) + + if "testing" in config_dict: + test = config_dict["testing"] + self.testing = TestingConfig(**test) + + if "output" in config_dict: + output = config_dict["output"] + self.output = OutputConfig(**output) + + if "cdnProviders" in config_dict: + for provider_key, provider_config in config_dict["cdnProviders"].items(): + if provider_key in self.cdn_providers: + # Update existing provider config + for key, value in provider_config.items(): + if hasattr(self.cdn_providers[provider_key], key): + setattr(self.cdn_providers[provider_key], key, value) + + def set_test_domain(self, provider: str, domain: str): + """Set test domain for a specific CDN provider""" + if provider in self.cdn_providers: + self.cdn_providers[provider].test_domain = domain + + def get_enabled_providers(self) -> Dict[str, CDNProviderConfig]: + """Get all enabled CDN providers""" + return {k: v for k, v in self.cdn_providers.items() if v.enabled} \ No newline at end of file diff --git a/example_usage.py b/example_usage.py new file mode 100644 index 0000000..3959c9e --- /dev/null +++ b/example_usage.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +""" +Example usage of BestCDN IP accessibility tester +""" + +import asyncio +import sys +import os + +# Add src to path +sys.path.insert(0, os.path.dirname(__file__)) + +from src.main import BestCDN + +async def main(): + """Example usage of BestCDN""" + + print("BestCDN Example Usage") + print("=" * 50) + + # Create BestCDN instance + app = BestCDN() + + # Set test domains for each provider + test_domains = { + 'cloudflare': 'test10000.fstring.me', # Cloudflare test domain + 'fastly': 'test10000.ix.je', # Fastly test domain + 'edgeone': 'test10000.ix.je', # EdgeOne test domain + 'esa': 'test10000.ix.je' # ESA test domain + } + + print("Setting test domains...") + app.set_test_domains(test_domains) + + # Validate setup + print("Validating setup...") + if not app.validate_setup(): + print("\nSetup validation failed!") + print("Please ensure:") + print("1. IP list files exist in ip_lists/ directory") + print("2. Test domains are configured") + return False + + print("Setup validation passed!") + + # Run the accessibility test + print("\nStarting accessibility test...") + success = await app.run_accessibility_test() + + if success: + print("\nTest completed successfully!") + print("Check the 'results/' directory for output files.") + else: + print("\nTest failed. Check logs for details.") + + return success + +if __name__ == "__main__": + try: + success = asyncio.run(main()) + sys.exit(0 if success else 1) + except KeyboardInterrupt: + print("\nTest interrupted by user") + sys.exit(1) + except Exception as e: + print(f"Error: {e}") + sys.exit(1) \ No newline at end of file diff --git a/install.bat b/install.bat new file mode 100644 index 0000000..20e1974 --- /dev/null +++ b/install.bat @@ -0,0 +1,86 @@ +@echo off +REM BestCDN Installation Script for Windows + +echo BestCDN Installation Script +echo ========================== + +REM Check if Python is installed +python --version >nul 2>&1 +if errorlevel 1 ( + echo Error: Python is not installed or not in PATH. Please install Python 3.7+ first. + pause + exit /b 1 +) + +echo ✓ Python found + +REM Create virtual environment +echo Creating virtual environment... +python -m venv venv + +if errorlevel 1 ( + echo Error: Failed to create virtual environment + pause + exit /b 1 +) + +echo ✓ Virtual environment created + +REM Activate virtual environment +echo Activating virtual environment... +call venv\Scripts\activate.bat + +REM Upgrade pip +echo Upgrading pip... +python -m pip install --upgrade pip + +REM Install dependencies +echo Installing dependencies... +pip install -r requirements.txt + +if errorlevel 1 ( + echo Error: Failed to install dependencies + pause + exit /b 1 +) + +echo ✓ Dependencies installed + +REM Create necessary directories +echo Creating directories... +if not exist "ip_lists" mkdir ip_lists +if not exist "results" mkdir results +if not exist "logs" mkdir logs + +echo ✓ Directories created + +REM Create example IP list files +echo Creating example IP list files... +if not exist "ip_lists" mkdir ip_lists + +REM Create example files if they don't exist +for %%p in (cloudflare fastly edgeone esa) do ( + if not exist "ip_lists\%%p.txt" ( + echo # %%p IP list - Replace with your actual IPs > "ip_lists\%%p.txt" + echo # Example: 192.168.1.1 >> "ip_lists\%%p.txt" + echo # Example: 10.0.0.0/24 >> "ip_lists\%%p.txt" + echo Created example file: ip_lists\%%p.txt + ) else ( + echo File already exists: ip_lists\%%p.txt + ) +) + +echo. +echo Installation completed successfully! +echo. +echo To use BestCDN: +echo 1. Activate the virtual environment: +echo venv\Scripts\activate +echo. +echo 2. Edit IP list files in ip_lists\ directory +echo. +echo 3. Run the example: +echo python example_usage.py +echo. +echo For more information, see README.md +pause \ No newline at end of file diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..d53d7cc --- /dev/null +++ b/install.sh @@ -0,0 +1,83 @@ +#!/bin/bash + +# BestCDN Installation Script + +echo "BestCDN Installation Script" +echo "==========================" + +# Check if Python 3 is installed +if ! command -v python3 &> /dev/null; then + echo "Error: Python 3 is not installed. Please install Python 3.7+ first." + exit 1 +fi + +echo "✓ Python 3 found" + +# Create virtual environment +echo "Creating virtual environment..." +python3 -m venv venv + +if [ $? -ne 0 ]; then + echo "Error: Failed to create virtual environment" + exit 1 +fi + +echo "✓ Virtual environment created" + +# Activate virtual environment +echo "Activating virtual environment..." +source venv/bin/activate + +# Upgrade pip +echo "Upgrading pip..." +pip install --upgrade pip + +# Install dependencies +echo "Installing dependencies..." +pip install -r requirements.txt + +if [ $? -ne 0 ]; then + echo "Error: Failed to install dependencies" + exit 1 +fi + +echo "✓ Dependencies installed" + +# Create necessary directories +echo "Creating directories..." +mkdir -p ip_lists results logs + +echo "✓ Directories created" + +# Create example IP list files +echo "Creating example IP list files..." +mkdir -p ip_lists + +# Create example files if they don't exist +for provider in cloudflare fastly edgeone esa; do + if [ ! -f "ip_lists/${provider}.txt" ]; then + echo "# ${provider} IP list - Replace with your actual IPs" > "ip_lists/${provider}.txt" + echo "# Example: 192.168.1.1" >> "ip_lists/${provider}.txt" + echo "# Example: 10.0.0.0/24" >> "ip_lists/${provider}.txt" + echo "Created example file: ip_lists/${provider}.txt" + else + echo "File already exists: ip_lists/${provider}.txt" + fi +done + +echo "" +echo "Installation completed successfully!" +echo "" +echo "To use BestCDN:" +echo "1. Activate the virtual environment:" +echo " source venv/bin/activate" +echo "" +echo "2. Edit IP list files in ip_lists/ directory" +echo "" +echo "3. Run the example:" +echo " python3 example_usage.py" +echo "" +echo "For more information, see README.md" +echo "" +echo "IMPORTANT: Always activate the virtual environment before running:" +echo " source venv/bin/activate" \ No newline at end of file diff --git a/ip_lists/cloudflare.txt b/ip_lists/cloudflare.txt new file mode 100644 index 0000000..d21509b --- /dev/null +++ b/ip_lists/cloudflare.txt @@ -0,0 +1,6 @@ +# Cloudflare IP examples - Replace with your actual IPs +104.16.0.1 +104.17.0.1 +172.64.0.1 +# You can also use CIDR notation: +# 104.16.0.0/24 diff --git a/ip_lists/edgeone.txt b/ip_lists/edgeone.txt new file mode 100644 index 0000000..025d66f --- /dev/null +++ b/ip_lists/edgeone.txt @@ -0,0 +1,597 @@ +1.14.231.0/24 +1.194.174.0/24 +1.56.100.0/24 +1.71.146.0/23 +1.71.88.0/24 +101.226.85.128/25 +101.33.195.0/24 +101.33.222.0/24 +101.42.63.0/24 +101.71.100.0/23 +101.71.105.0/24 +101.72.227.0/24 +111.12.215.0/24 +111.20.28.0/23 +111.20.30.0/24 +111.22.252.0/24 +111.29.14.0/24 +111.31.238.0/24 +111.4.224.0/23 +111.42.114.0/24 +111.51.158.0/24 +111.6.217.0/24 +111.6.218.0/24 +111.62.160.0/24 +112.13.210.0/24 +112.29.209.0/24 +112.46.51.0/24 +112.49.30.0/23 +112.49.69.0/24 +112.64.213.0/24 +112.84.131.0/24 +112.90.154.0/24 +113.125.206.0/24 +113.142.27.0/24 +113.194.51.0/24 +113.200.123.0/24 +113.201.154.0/24 +113.201.158.0/24 +113.219.202.0/23 +113.240.66.0/24 +113.240.91.0/24 +113.59.44.0/24 +114.230.198.0/24 +114.237.67.0/24 +114.66.246.0/23 +114.66.250.0/24 +115.150.39.0/24 +116.136.15.0/24 +116.153.83.0/24 +116.153.84.0/23 +116.162.152.0/23 +116.169.184.0/24 +116.172.74.0/24 +116.177.240.0/24 +116.178.78.0/24 +116.196.152.0/23 +116.207.184.0/24 +116.253.60.0/24 +117.139.140.0/24 +117.147.229.0/24 +117.147.230.0/23 +117.161.38.0/24 +117.161.86.0/24 +117.162.50.0/23 +117.162.61.0/24 +117.163.59.0/24 +117.187.145.0/24 +117.40.82.0/24 +117.44.77.0/24 +117.69.71.0/24 +117.85.64.0/23 +117.85.66.0/24 +119.188.140.0/24 +119.188.209.0/24 +119.36.225.0/24 +119.84.242.0/24 +119.91.175.0/24 +120.221.164.0/24 +120.221.181.0/24 +120.221.238.0/24 +120.226.27.0/24 +120.232.126.0/24 +120.232.97.0/24 +120.233.185.0/24 +120.233.186.0/23 +120.233.43.0/24 +120.240.100.0/24 +120.240.94.0/24 +122.192.132.0/24 +122.246.0.0/24 +122.246.30.0/23 +123.125.3.0/24 +123.138.25.0/24 +123.172.121.0/24 +123.182.162.0/24 +123.6.40.0/24 +124.225.117.0/24 +124.225.161.0/24 +124.225.72.0/24 +124.238.112.0/24 +124.72.128.0/24 +125.76.83.0/24 +125.94.247.0/24 +125.94.248.0/23 +14.116.174.0/24 +14.205.93.0/24 +150.139.230.0/24 +175.43.193.0/24 +175.6.193.0/24 +182.140.210.0/24 +182.247.248.0/24 +183.131.59.0/24 +183.136.219.0/24 +183.192.184.0/24 +183.201.109.0/24 +183.201.110.0/24 +183.230.68.0/24 +183.253.58.0/24 +183.255.104.0/24 +183.47.119.128/25 +183.61.174.0/24 +211.136.106.0/24 +211.97.84.0/24 +219.144.88.0/23 +219.144.90.0/24 +220.197.201.0/24 +221.204.26.0/23 +221.5.96.0/23 +222.189.172.0/24 +222.79.116.0/23 +222.79.126.0/24 +222.94.224.0/23 +223.109.0.0/23 +223.109.2.0/24 +223.109.210.0/24 +223.113.137.0/24 +223.221.177.0/24 +223.247.117.0/24 +27.44.206.0/24 +36.131.221.0/24 +36.142.6.0/24 +36.147.58.0/23 +36.150.103.0/24 +36.150.72.0/24 +36.158.202.0/24 +36.158.253.0/24 +36.159.70.0/24 +36.189.11.0/24 +36.248.57.0/24 +36.249.64.0/24 +36.250.235.0/24 +36.250.238.0/24 +36.250.5.0/24 +36.250.8.0/24 +39.173.183.0/24 +42.177.83.0/24 +42.202.164.0/24 +42.202.170.0/24 +43.136.126.0/24 +43.137.230.0/23 +43.137.87.0/24 +43.137.88.0/22 +43.138.125.0/24 +43.141.10.0/23 +43.141.109.0/24 +43.141.110.0/24 +43.141.131.0/24 +43.141.132.0/24 +43.141.49.0/24 +43.141.50.0/24 +43.141.52.0/24 +43.141.68.0/23 +43.141.70.0/24 +43.141.9.0/24 +43.141.99.0/24 +43.142.196.0/24 +43.142.205.0/24 +43.145.16.0/22 +43.145.44.0/23 +49.119.123.0/24 +49.7.250.128/25 +58.144.195.0/24 +58.212.47.0/24 +58.217.176.0/22 +58.222.36.0/24 +58.250.127.0/24 +58.251.127.0/24 +58.251.87.0/24 +59.55.137.0/24 +59.83.206.0/24 +60.28.220.0/24 +61.161.0.0/24 +61.170.82.0/24 +61.240.216.0/24 +61.240.220.0/24 +61.241.148.0/24 +61.49.23.0/24 +81.71.192.0/23 +101.33.0.0/19 +162.14.40.0/21 +43.132.64.0/19 +43.152.0.0/18 +43.152.128.0/18 +43.159.64.0/18 +107.155.58.0/24 +110.238.81.0/24 +110.238.84.0/24 +116.103.105.0/24 +116.103.106.0/24 +116.206.195.0/24 +119.160.60.0/24 +128.1.102.0/24 +128.1.106.0/24 +128.14.246.0/24 +129.227.189.0/24 +129.227.213.0/24 +129.227.246.0/24 +13.244.60.0/24 +13.246.171.0/24 +13.246.201.0/24 +15.220.184.0/24 +15.220.187.0/24 +150.109.190.0/23 +150.109.192.0/24 +150.109.222.0/23 +154.223.40.0/24 +156.227.203.0/24 +156.229.29.0/24 +156.240.62.0/24 +156.251.71.0/24 +158.79.1.0/24 +161.49.44.0/24 +171.244.192.0/23 +175.97.130.0/23 +175.97.175.0/24 +181.78.96.0/24 +203.205.136.0/23 +203.205.191.0/24 +203.205.193.0/24 +203.205.220.0/23 +203.96.243.0/24 +211.152.128.0/23 +211.152.132.0/23 +211.152.148.0/23 +211.152.154.0/23 +23.236.104.0/24 +23.236.99.0/24 +3.105.21.0/24 +3.24.201.0/24 +31.171.99.0/24 +38.52.124.0/24 +38.60.181.0/24 +42.115.108.0/24 +43.155.126.0/24 +43.155.149.0/24 +43.174.0.0/15 +49.51.64.0/24 +54.94.99.0/24 +62.201.197.0/24 +63.32.163.0/24 +72.255.2.0/24 +81.21.9.0/24 +84.54.102.0/24 +86.51.92.0/24 +240d:c010::/28 +2402:4e00:24:10de::/64 +2402:4e00:24:10f0::/64 +2402:4e00:37:10dd::/64 +2402:4e00:37:10de::/63 +2402:4e00:37:10e0::/63 +2402:4e00:37:10e2::/64 +2402:4e00:37:10e4::/62 +2402:4e00:37:10e8::/62 +2402:4e00:37:10ec::/63 +2402:4e00:37:10ef::/64 +2402:4e00:37:10f1::/64 +2402:4e00:37:10f2::/64 +2402:4e00:37:10f4::/62 +2402:4e00:37:10fc::/64 +2402:4e00:37:10fe::/64 +2402:4e00:43:ef::/64 +2402:4e00:43:f0::/64 +2402:4e00:43:fd::/64 +2402:4e00:a2:df::/64 +2402:4e00:a2:e4::/63 +2402:4e00:a2:e6::/64 +2402:4e00:a2:eb::/64 +2402:4e00:a2:ec::/64 +2402:4e00:a2:ef::/64 +2402:4e00:a2:f1::/64 +2402:4e00:a2:f5::/64 +2402:4e00:a2:f8::/63 +2402:4e00:a2:ff::/64 +2402:4e00:c010:4::/64 +2402:4e00:c031:7fc::/63 +2402:4e00:c031:7fe::/64 +2402:4e00:c042:300::/63 +2402:4e00:c042:309::/64 +2402:4e00:c042:310::/64 +2402:4e00:c050:13::/64 +2402:4e00:c050:1a::/63 +2402:4e00:c050:1c::/63 +2402:4e00:c050:2c::/63 +2402:4e00:c050:4c::/64 +2402:4e00:c050:8::/64 +2402:4e00:c050::/64 +2402:4e00:c050:b::/64 +2402:4e00:c050:c::/63 +2402:4e00:c050:e::/64 +2402:4e00:c2:10d1::/64 +2402:4e00:c2:10d6::/64 +2402:4e00:c2:10ef::/64 +2402:4e00:c2:10f1::/64 +2402:4e00:c2:10f2::/63 +2402:4e00:c2:10f6::/63 +2402:4e00:c2:10fa::/64 +2402:4e00:c2:10fd::/64 +2402:4e00:c2:10ff::/64 +2408:862a:240:2::/64 +2408:8670:3af0:32::/64 +2408:8706:0:400::/64 +2408:8706:2:300d::/64 +2408:8706:2:300e::/64 +2408:870c:1020:11::/64 +2408:8710:20:11a0::/63 +2408:8719:1100:91::/64 +2408:8719:1100:92::/63 +2408:8719:1100:94::/63 +2408:8719:1100:96::/64 +2408:8719:40e:39::/64 +2408:8719:40e:3a::/63 +2408:8719:40e:3c::/64 +2408:8719:40f:18::/64 +2408:871a:5100:140::/64 +2408:8720:806:300::/64 +2408:8726:1001:111::/64 +2408:8726:1001:112::/63 +2408:8726:1001:114::/64 +2408:8726:1001:116::/63 +2408:872f:20:210::/63 +2408:8734:4012:1::/64 +2408:8734:4012:2::/64 +2408:8734:4012:4::/64 +2408:8738:b000:1c::/64 +2408:873c:5011::/64 +2408:873c:5811:78::/64 +2408:873c:5811:a3::/64 +2408:873c:5811:ae::/64 +2408:873d:2011:41::/64 +2408:873d:2011:43::/64 +2408:873d:2011:44::/63 +2408:873d:2011:47::/64 +2408:873d:2011:49::/64 +2408:8740:d1fe:52::/63 +2408:8740:d1fe:54::/62 +2408:8740:d1fe:58::/63 +2408:8744:d05:11::/64 +2408:8744:d05:12::/64 +2408:8748:a100:33::/64 +2408:8748:a100:34::/63 +2408:8748:a100:36::/64 +2408:8748:a102:3041::/64 +2408:8748:a102:3042::/63 +2408:8748:a102:3044::/62 +2408:8748:a102:3048::/63 +2408:8749:c110:800::/64 +2408:874c:1ff:80::/64 +2408:874c:1ff:82::/63 +2408:874c:1ff:84::/62 +2408:874c:1ff:88::/64 +2408:874d:a00:b::/64 +2408:874d:a00:c::/64 +2408:874f:3001:310::/64 +2408:8752:e00:80::/63 +2408:8752:e00:b0::/61 +2408:8752:e00:b8::/64 +2408:8756:2cff:e401::/64 +2408:8756:2cff:e402::/63 +2408:8756:2cff:e404::/64 +2408:8756:4cff:d602::/63 +2408:8756:4cff:d604::/64 +2408:8756:4cff:d606::/63 +2408:8756:4cff:d608::/63 +2408:8756:d0fb:16c::/64 +2408:8756:d0fb:170::/64 +2408:875c:0:80::/63 +2408:8760:119:4::/63 +2408:8764:22:1f::/64 +2408:8766:0:101c::/64 +2408:876a:1000:22::/64 +2408:876a:1000:24::/64 +2408:876c:1780:122::/64 +2408:8770:0:d1::/64 +2408:8770:0:d2::/64 +2408:8770:0:d6::/63 +2408:8770:0:d8::/64 +2408:8776:1:c::/64 +2408:8779:c001:3::/64 +2408:877a:2000:f::/64 +2409:8702:489c::/64 +2409:875e:5088:c1::/64 +2409:8c04:110e:4001::/64 +2409:8c0c:310:21d::/64 +2409:8c0c:310:21e::/63 +2409:8c0c:310:220::/64 +2409:8c0c:310:222::/63 +2409:8c10:c00:1404::/64 +2409:8c10:c00:68::/64 +2409:8c14:f2c:1001::/64 +2409:8c1c:300:17::/64 +2409:8c1e:68e0:a08::/64 +2409:8c1e:8f80:2::/64 +2409:8c20:1834:461::/64 +2409:8c20:1834:463::/64 +2409:8c20:1834:464::/63 +2409:8c20:1834:467::/64 +2409:8c20:1834:469::/64 +2409:8c20:5021:160::/64 +2409:8c20:9c71:1dd::/64 +2409:8c20:9c71:1de::/63 +2409:8c20:9c71:1e1::/64 +2409:8c20:9c71:1e2::/63 +2409:8c20:9c71:1e4::/64 +2409:8c20:9c71:1e6::/64 +2409:8c20:9c71:1e8::/64 +2409:8c20:b281:19::/64 +2409:8c28:203:308::/64 +2409:8c28:203:34::/64 +2409:8c28:2808:11::/64 +2409:8c28:2808:12::/63 +2409:8c28:2808:14::/63 +2409:8c28:2808:d::/64 +2409:8c28:2808:e::/63 +2409:8c30:1000:20::/64 +2409:8c34:2220:30a::/64 +2409:8c34:e00:41::/64 +2409:8c34:e00:42::/63 +2409:8c34:e00:44::/62 +2409:8c34:e00:48::/63 +2409:8c38:80:1c0::/64 +2409:8c38:80:1c2::/63 +2409:8c38:80:1c4::/62 +2409:8c38:80:1c8::/64 +2409:8c38:80:1f1::/64 +2409:8c38:80:1f2::/63 +2409:8c38:80:1f4::/64 +2409:8c3c:1300:306::/64 +2409:8c3c:900:1a1::/64 +2409:8c3c:900:1a2::/63 +2409:8c3c:900:1a4::/64 +2409:8c44:b00:4ec::/64 +2409:8c4c:e00:2011::/64 +2409:8c4c:e00:2012::/63 +2409:8c4c:e00:2014::/64 +2409:8c50:a00:2061::/64 +2409:8c50:a00:2170::/61 +2409:8c50:a00:2178::/64 +2409:8c50:a00:2252::/63 +2409:8c50:a00:2254::/64 +2409:8c54:1801:21::/64 +2409:8c54:1801:22::/63 +2409:8c54:1801:24::/64 +2409:8c54:1821:578::/64 +2409:8c54:2030:222::/63 +2409:8c54:2030:224::/64 +2409:8c54:2030:226::/63 +2409:8c54:2030:228::/63 +2409:8c5c:110:50::/64 +2409:8c5e:5000:c2::/64 +2409:8c60:2500:5d::/64 +2409:8c62:e10:218::/64 +2409:8c6a:b021:74::/64 +2409:8c6c:561:8110::/62 +2409:8c70:3a10:16::/64 +2409:8c70:3a91:51::/64 +2409:8c70:3a91:52::/64 +2409:8c70:3a91:56::/63 +2409:8c70:3a91:58::/64 +2409:8c74:f100:864::/64 +2409:8c78:100:24::/64 +2409:8c7a:2604::/64 +240e:90d:1101:4508::/64 +240e:90d:1101:4510::/64 +240e:910:e000:2504::/64 +240e:914:5009:1002::/63 +240e:914:5009:a::/63 +240e:925:2:701::/64 +240e:925:2:702::/63 +240e:925:2:704::/64 +240e:925:2:706::/63 +240e:926:3004:21::/64 +240e:930:c200:70::/63 +240e:935:a04:2708::/64 +240e:93c:1201:2::/63 +240e:93c:1201:4::/64 +240e:93c:1201:d::/64 +240e:940:20c:308::/64 +240e:946:3000:8008::/63 +240e:94a:b01:214::/63 +240e:94c:0:2701::/64 +240e:94c:0:2702::/63 +240e:94c:0:2704::/64 +240e:950:1:2002::/64 +240e:958:2300:220::/64 +240e:958:6003:108::/64 +240e:95e:4001:1::/64 +240e:95e:4001:2::/63 +240e:95e:4001:4::/64 +240e:960:200:90::/64 +240e:960:200:92::/63 +240e:960:200:94::/62 +240e:960:200:98::/64 +240e:964:5002:109::/64 +240e:964:5002:10a::/63 +240e:964:5002:10c::/64 +240e:965:802:b01::/64 +240e:965:802:b02::/63 +240e:965:802:b04::/62 +240e:965:802:b08::/63 +240e:96c:6400:a00::/64 +240e:974:e200:4209::/64 +240e:974:e200:420a::/63 +240e:974:e200:420c::/63 +240e:978:2608:800::/64 +240e:978:2903:50a7::/64 +240e:978:2903:50a9::/64 +240e:978:b34:1::/64 +240e:978:d04:2082::/63 +240e:978:d04:2085::/64 +240e:978:d04:2086::/63 +240e:978:d04:2088::/64 +240e:978:d04:208b::/64 +240e:978:d04:208c::/62 +240e:978:d04:2090::/63 +240e:979:f07:1::/64 +240e:979:f07:3::/64 +240e:979:f07:4::/63 +240e:979:f07:7::/64 +240e:979:f07:9::/64 +240e:97c:4040:200::/63 +240e:97d:10:25de::/64 +240e:97d:10:25e7::/64 +240e:97d:2000:b02::/63 +240e:97d:2000:b04::/64 +240e:97d:2000:b06::/63 +240e:97d:2000:b08::/63 +240e:980:1200:b14::/63 +240e:983:705:2::/64 +240e:b1:c808:9::/64 +240e:b1:c808:a::/64 +240e:b1:c808:c::/63 +240e:bf:b800:4131::/64 +240e:bf:b800:4132::/64 +240e:bf:b800:4136::/63 +240e:bf:b800:4138::/64 +240e:bf:c800:2915::/64 +240e:bf:c800:2916::/64 +240e:c2:1800:110::/61 +240e:c2:1800:118::/64 +240e:c2:1800:ab::/64 +240e:c2:1800:ac::/64 +240e:c3:2800:205::/64 +240e:cd:ff00:118::/64 +240e:e9:b00c:33::/64 +240e:e9:b00c:34::/63 +240e:e9:b00c:36::/64 +240e:f7:a070:342::/63 +240e:f7:a070:344::/62 +240e:f7:a070:348::/63 +240e:f7:a070:3c0::/64 +240e:f7:ef00:10::/64 +2001:df1:7e00:4::/64 +2400:adc0:4041::/64 +2400:de40::/64 +2403:c280:5:1::/64 +2404:3100:d:5::/64 +2404:a140:3a:1::/64 +2404:a140:3e:6::/64 +2405:3200:101:63::/64 +2405:4800:a601::/64 +2407:2440:10:255::/64 +240d:c040:1::/64 +2602:fa80:10:2::/63 +2602:ffe4:c02:1001::/64 +2602:ffe4:c02:100c::/63 +2602:ffe4:c12:105::/64 +2602:ffe4:c15:124::/64 +2602:ffe4:c18:c201::/64 +2602:ffe4:c18:c202::/63 +2602:ffe4:c27:1000::/64 +2604:980:4002:2::/64 +2604:980:7002:6::/64 +2803:2540:f:14::/64 +2a00:12f8:3900:13::/64 +2a02:b60:2001::/64 +2a02:ce0:1:70::/64 +2a05:45c7:1:1018::/64 diff --git a/ip_lists/esa.txt b/ip_lists/esa.txt new file mode 100644 index 0000000..3400532 --- /dev/null +++ b/ip_lists/esa.txt @@ -0,0 +1,5 @@ +# ESA (Alibaba Cloud) IP examples - Replace with your actual IPs +47.88.1.1 +47.89.1.1 +39.96.1.1 +# Add your ESA IPs here diff --git a/ip_lists/fastly.txt b/ip_lists/fastly.txt new file mode 100644 index 0000000..923ca46 --- /dev/null +++ b/ip_lists/fastly.txt @@ -0,0 +1,5 @@ +# Fastly IP examples - Replace with your actual IPs +151.101.1.1 +151.101.2.1 +199.232.1.1 +# Add your Fastly IPs here diff --git a/logs/bestcdn_20250725_171449.log b/logs/bestcdn_20250725_171449.log new file mode 100644 index 0000000..2adbb7a --- /dev/null +++ b/logs/bestcdn_20250725_171449.log @@ -0,0 +1,353 @@ +2025-07-25 17:14:49,616 - bestcdn - INFO - Logging initialized - Log file: logs/bestcdn_20250725_171449.log +2025-07-25 17:14:49,616 - bestcdn - INFO - Set test domain for cloudflare: example.com +2025-07-25 17:14:49,616 - bestcdn - INFO - Set test domain for fastly: example.com +2025-07-25 17:14:49,616 - bestcdn - INFO - Set test domain for edgeone: example.com +2025-07-25 17:14:49,616 - bestcdn - INFO - Set test domain for esa: example.com +2025-07-25 17:14:49,616 - bestcdn - INFO - Validating setup... +2025-07-25 17:14:49,616 - bestcdn - INFO - Enabled providers: edgeone, esa, fastly, cloudflare +2025-07-25 17:14:49,619 - bestcdn - INFO - edgeone: 1774488 IPs available +2025-07-25 17:14:49,619 - bestcdn - INFO - esa: 3 IPs available +2025-07-25 17:14:49,619 - bestcdn - INFO - fastly: 3 IPs available +2025-07-25 17:14:49,619 - bestcdn - INFO - cloudflare: 3 IPs available +2025-07-25 17:14:49,619 - bestcdn - INFO - Setup validation completed successfully +2025-07-25 17:14:49,619 - bestcdn - INFO - ============================================================ +2025-07-25 17:14:49,619 - bestcdn - INFO - STARTING BESTCDN IP ACCESSIBILITY TEST +2025-07-25 17:14:49,619 - bestcdn - INFO - ============================================================ +2025-07-25 17:14:49,619 - bestcdn - INFO - Loading IP lists... +2025-07-25 17:14:49,679 - ip_reader - WARNING - Large network 43.152.0.0/18 with 16384 IPs - sampling first 5000 +2025-07-25 17:14:49,685 - ip_reader - WARNING - Large network 43.152.128.0/18 with 16384 IPs - sampling first 5000 +2025-07-25 17:14:49,689 - ip_reader - WARNING - Large network 43.159.64.0/18 with 16384 IPs - sampling first 5000 +2025-07-25 17:14:49,705 - ip_reader - WARNING - Large network 43.174.0.0/15 with 131072 IPs - sampling first 5000 +2025-07-25 17:14:49,711 - ip_reader - WARNING - Large network 240d:c010::/28 with 1267650600228229401496703205376 IPs - sampling first 5000 +2025-07-25 17:14:49,725 - ip_reader - WARNING - Large network 2402:4e00:24:10de::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:49,739 - ip_reader - WARNING - Large network 2402:4e00:24:10f0::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:49,753 - ip_reader - WARNING - Large network 2402:4e00:37:10dd::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:49,767 - ip_reader - WARNING - Large network 2402:4e00:37:10de::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:49,781 - ip_reader - WARNING - Large network 2402:4e00:37:10e0::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:49,795 - ip_reader - WARNING - Large network 2402:4e00:37:10e2::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:49,810 - ip_reader - WARNING - Large network 2402:4e00:37:10e4::/62 with 73786976294838206464 IPs - sampling first 5000 +2025-07-25 17:14:49,824 - ip_reader - WARNING - Large network 2402:4e00:37:10e8::/62 with 73786976294838206464 IPs - sampling first 5000 +2025-07-25 17:14:49,843 - ip_reader - WARNING - Large network 2402:4e00:37:10ec::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:49,857 - ip_reader - WARNING - Large network 2402:4e00:37:10ef::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:49,871 - ip_reader - WARNING - Large network 2402:4e00:37:10f1::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:49,885 - ip_reader - WARNING - Large network 2402:4e00:37:10f2::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:49,899 - ip_reader - WARNING - Large network 2402:4e00:37:10f4::/62 with 73786976294838206464 IPs - sampling first 5000 +2025-07-25 17:14:49,913 - ip_reader - WARNING - Large network 2402:4e00:37:10fc::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:49,927 - ip_reader - WARNING - Large network 2402:4e00:37:10fe::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:49,941 - ip_reader - WARNING - Large network 2402:4e00:43:ef::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:49,955 - ip_reader - WARNING - Large network 2402:4e00:43:f0::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:49,970 - ip_reader - WARNING - Large network 2402:4e00:43:fd::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:49,984 - ip_reader - WARNING - Large network 2402:4e00:a2:df::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:49,998 - ip_reader - WARNING - Large network 2402:4e00:a2:e4::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,012 - ip_reader - WARNING - Large network 2402:4e00:a2:e6::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,026 - ip_reader - WARNING - Large network 2402:4e00:a2:eb::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,040 - ip_reader - WARNING - Large network 2402:4e00:a2:ec::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,055 - ip_reader - WARNING - Large network 2402:4e00:a2:ef::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,069 - ip_reader - WARNING - Large network 2402:4e00:a2:f1::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,082 - ip_reader - WARNING - Large network 2402:4e00:a2:f5::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,095 - ip_reader - WARNING - Large network 2402:4e00:a2:f8::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,106 - ip_reader - WARNING - Large network 2402:4e00:a2:ff::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,117 - ip_reader - WARNING - Large network 2402:4e00:c010:4::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,128 - ip_reader - WARNING - Large network 2402:4e00:c031:7fc::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,139 - ip_reader - WARNING - Large network 2402:4e00:c031:7fe::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,150 - ip_reader - WARNING - Large network 2402:4e00:c042:300::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,161 - ip_reader - WARNING - Large network 2402:4e00:c042:309::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,172 - ip_reader - WARNING - Large network 2402:4e00:c042:310::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,184 - ip_reader - WARNING - Large network 2402:4e00:c050:13::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,195 - ip_reader - WARNING - Large network 2402:4e00:c050:1a::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,206 - ip_reader - WARNING - Large network 2402:4e00:c050:1c::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,217 - ip_reader - WARNING - Large network 2402:4e00:c050:2c::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,229 - ip_reader - WARNING - Large network 2402:4e00:c050:4c::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,247 - ip_reader - WARNING - Large network 2402:4e00:c050:8::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,258 - ip_reader - WARNING - Large network 2402:4e00:c050::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,270 - ip_reader - WARNING - Large network 2402:4e00:c050:b::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,281 - ip_reader - WARNING - Large network 2402:4e00:c050:c::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,292 - ip_reader - WARNING - Large network 2402:4e00:c050:e::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,303 - ip_reader - WARNING - Large network 2402:4e00:c2:10d1::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,317 - ip_reader - WARNING - Large network 2402:4e00:c2:10d6::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,329 - ip_reader - WARNING - Large network 2402:4e00:c2:10ef::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,342 - ip_reader - WARNING - Large network 2402:4e00:c2:10f1::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,354 - ip_reader - WARNING - Large network 2402:4e00:c2:10f2::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,365 - ip_reader - WARNING - Large network 2402:4e00:c2:10f6::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,377 - ip_reader - WARNING - Large network 2402:4e00:c2:10fa::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,388 - ip_reader - WARNING - Large network 2402:4e00:c2:10fd::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,400 - ip_reader - WARNING - Large network 2402:4e00:c2:10ff::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,411 - ip_reader - WARNING - Large network 2408:862a:240:2::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,422 - ip_reader - WARNING - Large network 2408:8670:3af0:32::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,434 - ip_reader - WARNING - Large network 2408:8706:0:400::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,445 - ip_reader - WARNING - Large network 2408:8706:2:300d::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,457 - ip_reader - WARNING - Large network 2408:8706:2:300e::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,468 - ip_reader - WARNING - Large network 2408:870c:1020:11::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,479 - ip_reader - WARNING - Large network 2408:8710:20:11a0::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,491 - ip_reader - WARNING - Large network 2408:8719:1100:91::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,502 - ip_reader - WARNING - Large network 2408:8719:1100:92::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,513 - ip_reader - WARNING - Large network 2408:8719:1100:94::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,525 - ip_reader - WARNING - Large network 2408:8719:1100:96::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,536 - ip_reader - WARNING - Large network 2408:8719:40e:39::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,548 - ip_reader - WARNING - Large network 2408:8719:40e:3a::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,559 - ip_reader - WARNING - Large network 2408:8719:40e:3c::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,570 - ip_reader - WARNING - Large network 2408:8719:40f:18::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,582 - ip_reader - WARNING - Large network 2408:871a:5100:140::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,593 - ip_reader - WARNING - Large network 2408:8720:806:300::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,605 - ip_reader - WARNING - Large network 2408:8726:1001:111::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,616 - ip_reader - WARNING - Large network 2408:8726:1001:112::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,627 - ip_reader - WARNING - Large network 2408:8726:1001:114::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,639 - ip_reader - WARNING - Large network 2408:8726:1001:116::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,650 - ip_reader - WARNING - Large network 2408:872f:20:210::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,661 - ip_reader - WARNING - Large network 2408:8734:4012:1::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,673 - ip_reader - WARNING - Large network 2408:8734:4012:2::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,684 - ip_reader - WARNING - Large network 2408:8734:4012:4::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,696 - ip_reader - WARNING - Large network 2408:8738:b000:1c::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,707 - ip_reader - WARNING - Large network 2408:873c:5011::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,719 - ip_reader - WARNING - Large network 2408:873c:5811:78::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,731 - ip_reader - WARNING - Large network 2408:873c:5811:a3::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,742 - ip_reader - WARNING - Large network 2408:873c:5811:ae::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,754 - ip_reader - WARNING - Large network 2408:873d:2011:41::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,765 - ip_reader - WARNING - Large network 2408:873d:2011:43::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,777 - ip_reader - WARNING - Large network 2408:873d:2011:44::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,789 - ip_reader - WARNING - Large network 2408:873d:2011:47::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,800 - ip_reader - WARNING - Large network 2408:873d:2011:49::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,812 - ip_reader - WARNING - Large network 2408:8740:d1fe:52::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,823 - ip_reader - WARNING - Large network 2408:8740:d1fe:54::/62 with 73786976294838206464 IPs - sampling first 5000 +2025-07-25 17:14:50,835 - ip_reader - WARNING - Large network 2408:8740:d1fe:58::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,846 - ip_reader - WARNING - Large network 2408:8744:d05:11::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,858 - ip_reader - WARNING - Large network 2408:8744:d05:12::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,869 - ip_reader - WARNING - Large network 2408:8748:a100:33::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,881 - ip_reader - WARNING - Large network 2408:8748:a100:34::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,892 - ip_reader - WARNING - Large network 2408:8748:a100:36::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,903 - ip_reader - WARNING - Large network 2408:8748:a102:3041::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,915 - ip_reader - WARNING - Large network 2408:8748:a102:3042::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,926 - ip_reader - WARNING - Large network 2408:8748:a102:3044::/62 with 73786976294838206464 IPs - sampling first 5000 +2025-07-25 17:14:50,938 - ip_reader - WARNING - Large network 2408:8748:a102:3048::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,949 - ip_reader - WARNING - Large network 2408:8749:c110:800::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,960 - ip_reader - WARNING - Large network 2408:874c:1ff:80::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:50,987 - ip_reader - WARNING - Large network 2408:874c:1ff:82::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:50,998 - ip_reader - WARNING - Large network 2408:874c:1ff:84::/62 with 73786976294838206464 IPs - sampling first 5000 +2025-07-25 17:14:51,009 - ip_reader - WARNING - Large network 2408:874c:1ff:88::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,020 - ip_reader - WARNING - Large network 2408:874d:a00:b::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,032 - ip_reader - WARNING - Large network 2408:874d:a00:c::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,043 - ip_reader - WARNING - Large network 2408:874f:3001:310::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,055 - ip_reader - WARNING - Large network 2408:8752:e00:80::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:51,066 - ip_reader - WARNING - Large network 2408:8752:e00:b0::/61 with 147573952589676412928 IPs - sampling first 5000 +2025-07-25 17:14:51,077 - ip_reader - WARNING - Large network 2408:8752:e00:b8::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,089 - ip_reader - WARNING - Large network 2408:8756:2cff:e401::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,100 - ip_reader - WARNING - Large network 2408:8756:2cff:e402::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:51,112 - ip_reader - WARNING - Large network 2408:8756:2cff:e404::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,123 - ip_reader - WARNING - Large network 2408:8756:4cff:d602::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:51,135 - ip_reader - WARNING - Large network 2408:8756:4cff:d604::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,146 - ip_reader - WARNING - Large network 2408:8756:4cff:d606::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:51,158 - ip_reader - WARNING - Large network 2408:8756:4cff:d608::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:51,169 - ip_reader - WARNING - Large network 2408:8756:d0fb:16c::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,181 - ip_reader - WARNING - Large network 2408:8756:d0fb:170::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,192 - ip_reader - WARNING - Large network 2408:875c:0:80::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:51,203 - ip_reader - WARNING - Large network 2408:8760:119:4::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:51,215 - ip_reader - WARNING - Large network 2408:8764:22:1f::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,226 - ip_reader - WARNING - Large network 2408:8766:0:101c::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,238 - ip_reader - WARNING - Large network 2408:876a:1000:22::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,249 - ip_reader - WARNING - Large network 2408:876a:1000:24::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,261 - ip_reader - WARNING - Large network 2408:876c:1780:122::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,272 - ip_reader - WARNING - Large network 2408:8770:0:d1::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,284 - ip_reader - WARNING - Large network 2408:8770:0:d2::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,296 - ip_reader - WARNING - Large network 2408:8770:0:d6::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:51,307 - ip_reader - WARNING - Large network 2408:8770:0:d8::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,319 - ip_reader - WARNING - Large network 2408:8776:1:c::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,330 - ip_reader - WARNING - Large network 2408:8779:c001:3::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,342 - ip_reader - WARNING - Large network 2408:877a:2000:f::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,354 - ip_reader - WARNING - Large network 2409:8702:489c::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,365 - ip_reader - WARNING - Large network 2409:875e:5088:c1::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,377 - ip_reader - WARNING - Large network 2409:8c04:110e:4001::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,388 - ip_reader - WARNING - Large network 2409:8c0c:310:21d::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,400 - ip_reader - WARNING - Large network 2409:8c0c:310:21e::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:51,411 - ip_reader - WARNING - Large network 2409:8c0c:310:220::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,423 - ip_reader - WARNING - Large network 2409:8c0c:310:222::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:51,434 - ip_reader - WARNING - Large network 2409:8c10:c00:1404::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,446 - ip_reader - WARNING - Large network 2409:8c10:c00:68::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,457 - ip_reader - WARNING - Large network 2409:8c14:f2c:1001::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,469 - ip_reader - WARNING - Large network 2409:8c1c:300:17::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,480 - ip_reader - WARNING - Large network 2409:8c1e:68e0:a08::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,492 - ip_reader - WARNING - Large network 2409:8c1e:8f80:2::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,503 - ip_reader - WARNING - Large network 2409:8c20:1834:461::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,515 - ip_reader - WARNING - Large network 2409:8c20:1834:463::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,526 - ip_reader - WARNING - Large network 2409:8c20:1834:464::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:51,537 - ip_reader - WARNING - Large network 2409:8c20:1834:467::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,549 - ip_reader - WARNING - Large network 2409:8c20:1834:469::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,560 - ip_reader - WARNING - Large network 2409:8c20:5021:160::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,572 - ip_reader - WARNING - Large network 2409:8c20:9c71:1dd::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,583 - ip_reader - WARNING - Large network 2409:8c20:9c71:1de::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:51,595 - ip_reader - WARNING - Large network 2409:8c20:9c71:1e1::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,606 - ip_reader - WARNING - Large network 2409:8c20:9c71:1e2::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:51,618 - ip_reader - WARNING - Large network 2409:8c20:9c71:1e4::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,629 - ip_reader - WARNING - Large network 2409:8c20:9c71:1e6::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,640 - ip_reader - WARNING - Large network 2409:8c20:9c71:1e8::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,652 - ip_reader - WARNING - Large network 2409:8c20:b281:19::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,663 - ip_reader - WARNING - Large network 2409:8c28:203:308::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,675 - ip_reader - WARNING - Large network 2409:8c28:203:34::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,686 - ip_reader - WARNING - Large network 2409:8c28:2808:11::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,698 - ip_reader - WARNING - Large network 2409:8c28:2808:12::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:51,710 - ip_reader - WARNING - Large network 2409:8c28:2808:14::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:51,721 - ip_reader - WARNING - Large network 2409:8c28:2808:d::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,733 - ip_reader - WARNING - Large network 2409:8c28:2808:e::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:51,744 - ip_reader - WARNING - Large network 2409:8c30:1000:20::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,756 - ip_reader - WARNING - Large network 2409:8c34:2220:30a::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,767 - ip_reader - WARNING - Large network 2409:8c34:e00:41::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,778 - ip_reader - WARNING - Large network 2409:8c34:e00:42::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:51,790 - ip_reader - WARNING - Large network 2409:8c34:e00:44::/62 with 73786976294838206464 IPs - sampling first 5000 +2025-07-25 17:14:51,801 - ip_reader - WARNING - Large network 2409:8c34:e00:48::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:51,813 - ip_reader - WARNING - Large network 2409:8c38:80:1c0::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,824 - ip_reader - WARNING - Large network 2409:8c38:80:1c2::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:51,836 - ip_reader - WARNING - Large network 2409:8c38:80:1c4::/62 with 73786976294838206464 IPs - sampling first 5000 +2025-07-25 17:14:51,847 - ip_reader - WARNING - Large network 2409:8c38:80:1c8::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,859 - ip_reader - WARNING - Large network 2409:8c38:80:1f1::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,871 - ip_reader - WARNING - Large network 2409:8c38:80:1f2::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:51,882 - ip_reader - WARNING - Large network 2409:8c38:80:1f4::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,894 - ip_reader - WARNING - Large network 2409:8c3c:1300:306::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,905 - ip_reader - WARNING - Large network 2409:8c3c:900:1a1::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,916 - ip_reader - WARNING - Large network 2409:8c3c:900:1a2::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:51,928 - ip_reader - WARNING - Large network 2409:8c3c:900:1a4::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,939 - ip_reader - WARNING - Large network 2409:8c44:b00:4ec::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,951 - ip_reader - WARNING - Large network 2409:8c4c:e00:2011::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,962 - ip_reader - WARNING - Large network 2409:8c4c:e00:2012::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:51,974 - ip_reader - WARNING - Large network 2409:8c4c:e00:2014::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,985 - ip_reader - WARNING - Large network 2409:8c50:a00:2061::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:51,997 - ip_reader - WARNING - Large network 2409:8c50:a00:2170::/61 with 147573952589676412928 IPs - sampling first 5000 +2025-07-25 17:14:52,008 - ip_reader - WARNING - Large network 2409:8c50:a00:2178::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,020 - ip_reader - WARNING - Large network 2409:8c50:a00:2252::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,032 - ip_reader - WARNING - Large network 2409:8c50:a00:2254::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,043 - ip_reader - WARNING - Large network 2409:8c54:1801:21::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,055 - ip_reader - WARNING - Large network 2409:8c54:1801:22::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,066 - ip_reader - WARNING - Large network 2409:8c54:1801:24::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,077 - ip_reader - WARNING - Large network 2409:8c54:1821:578::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,089 - ip_reader - WARNING - Large network 2409:8c54:2030:222::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,100 - ip_reader - WARNING - Large network 2409:8c54:2030:224::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,111 - ip_reader - WARNING - Large network 2409:8c54:2030:226::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,123 - ip_reader - WARNING - Large network 2409:8c54:2030:228::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,134 - ip_reader - WARNING - Large network 2409:8c5c:110:50::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,145 - ip_reader - WARNING - Large network 2409:8c5e:5000:c2::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,157 - ip_reader - WARNING - Large network 2409:8c60:2500:5d::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,168 - ip_reader - WARNING - Large network 2409:8c62:e10:218::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,180 - ip_reader - WARNING - Large network 2409:8c6a:b021:74::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,191 - ip_reader - WARNING - Large network 2409:8c6c:561:8110::/62 with 73786976294838206464 IPs - sampling first 5000 +2025-07-25 17:14:52,202 - ip_reader - WARNING - Large network 2409:8c70:3a10:16::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,214 - ip_reader - WARNING - Large network 2409:8c70:3a91:51::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,225 - ip_reader - WARNING - Large network 2409:8c70:3a91:52::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,236 - ip_reader - WARNING - Large network 2409:8c70:3a91:56::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,248 - ip_reader - WARNING - Large network 2409:8c70:3a91:58::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,259 - ip_reader - WARNING - Large network 2409:8c74:f100:864::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,270 - ip_reader - WARNING - Large network 2409:8c78:100:24::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,282 - ip_reader - WARNING - Large network 2409:8c7a:2604::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,293 - ip_reader - WARNING - Large network 240e:90d:1101:4508::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,304 - ip_reader - WARNING - Large network 240e:90d:1101:4510::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,316 - ip_reader - WARNING - Large network 240e:910:e000:2504::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,327 - ip_reader - WARNING - Large network 240e:914:5009:1002::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,338 - ip_reader - WARNING - Large network 240e:914:5009:a::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,350 - ip_reader - WARNING - Large network 240e:925:2:701::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,361 - ip_reader - WARNING - Large network 240e:925:2:702::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,373 - ip_reader - WARNING - Large network 240e:925:2:704::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,384 - ip_reader - WARNING - Large network 240e:925:2:706::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,395 - ip_reader - WARNING - Large network 240e:926:3004:21::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,407 - ip_reader - WARNING - Large network 240e:930:c200:70::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,418 - ip_reader - WARNING - Large network 240e:935:a04:2708::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,458 - ip_reader - WARNING - Large network 240e:93c:1201:2::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,470 - ip_reader - WARNING - Large network 240e:93c:1201:4::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,481 - ip_reader - WARNING - Large network 240e:93c:1201:d::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,493 - ip_reader - WARNING - Large network 240e:940:20c:308::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,504 - ip_reader - WARNING - Large network 240e:946:3000:8008::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,515 - ip_reader - WARNING - Large network 240e:94a:b01:214::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,527 - ip_reader - WARNING - Large network 240e:94c:0:2701::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,538 - ip_reader - WARNING - Large network 240e:94c:0:2702::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,550 - ip_reader - WARNING - Large network 240e:94c:0:2704::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,561 - ip_reader - WARNING - Large network 240e:950:1:2002::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,573 - ip_reader - WARNING - Large network 240e:958:2300:220::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,584 - ip_reader - WARNING - Large network 240e:958:6003:108::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,595 - ip_reader - WARNING - Large network 240e:95e:4001:1::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,607 - ip_reader - WARNING - Large network 240e:95e:4001:2::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,619 - ip_reader - WARNING - Large network 240e:95e:4001:4::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,631 - ip_reader - WARNING - Large network 240e:960:200:90::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,644 - ip_reader - WARNING - Large network 240e:960:200:92::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,656 - ip_reader - WARNING - Large network 240e:960:200:94::/62 with 73786976294838206464 IPs - sampling first 5000 +2025-07-25 17:14:52,667 - ip_reader - WARNING - Large network 240e:960:200:98::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,679 - ip_reader - WARNING - Large network 240e:964:5002:109::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,690 - ip_reader - WARNING - Large network 240e:964:5002:10a::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,701 - ip_reader - WARNING - Large network 240e:964:5002:10c::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,713 - ip_reader - WARNING - Large network 240e:965:802:b01::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,724 - ip_reader - WARNING - Large network 240e:965:802:b02::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,736 - ip_reader - WARNING - Large network 240e:965:802:b04::/62 with 73786976294838206464 IPs - sampling first 5000 +2025-07-25 17:14:52,747 - ip_reader - WARNING - Large network 240e:965:802:b08::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,758 - ip_reader - WARNING - Large network 240e:96c:6400:a00::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,770 - ip_reader - WARNING - Large network 240e:974:e200:4209::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,781 - ip_reader - WARNING - Large network 240e:974:e200:420a::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,792 - ip_reader - WARNING - Large network 240e:974:e200:420c::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,804 - ip_reader - WARNING - Large network 240e:978:2608:800::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,815 - ip_reader - WARNING - Large network 240e:978:2903:50a7::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,826 - ip_reader - WARNING - Large network 240e:978:2903:50a9::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,838 - ip_reader - WARNING - Large network 240e:978:b34:1::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,849 - ip_reader - WARNING - Large network 240e:978:d04:2082::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,860 - ip_reader - WARNING - Large network 240e:978:d04:2085::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,872 - ip_reader - WARNING - Large network 240e:978:d04:2086::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,883 - ip_reader - WARNING - Large network 240e:978:d04:2088::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,894 - ip_reader - WARNING - Large network 240e:978:d04:208b::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,906 - ip_reader - WARNING - Large network 240e:978:d04:208c::/62 with 73786976294838206464 IPs - sampling first 5000 +2025-07-25 17:14:52,917 - ip_reader - WARNING - Large network 240e:978:d04:2090::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,929 - ip_reader - WARNING - Large network 240e:979:f07:1::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,940 - ip_reader - WARNING - Large network 240e:979:f07:3::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,951 - ip_reader - WARNING - Large network 240e:979:f07:4::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,963 - ip_reader - WARNING - Large network 240e:979:f07:7::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,974 - ip_reader - WARNING - Large network 240e:979:f07:9::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:52,986 - ip_reader - WARNING - Large network 240e:97c:4040:200::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:52,997 - ip_reader - WARNING - Large network 240e:97d:10:25de::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,008 - ip_reader - WARNING - Large network 240e:97d:10:25e7::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,020 - ip_reader - WARNING - Large network 240e:97d:2000:b02::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:53,031 - ip_reader - WARNING - Large network 240e:97d:2000:b04::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,042 - ip_reader - WARNING - Large network 240e:97d:2000:b06::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:53,053 - ip_reader - WARNING - Large network 240e:97d:2000:b08::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:53,065 - ip_reader - WARNING - Large network 240e:980:1200:b14::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:53,076 - ip_reader - WARNING - Large network 240e:983:705:2::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,087 - ip_reader - WARNING - Large network 240e:b1:c808:9::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,099 - ip_reader - WARNING - Large network 240e:b1:c808:a::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,110 - ip_reader - WARNING - Large network 240e:b1:c808:c::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:53,121 - ip_reader - WARNING - Large network 240e:bf:b800:4131::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,133 - ip_reader - WARNING - Large network 240e:bf:b800:4132::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,144 - ip_reader - WARNING - Large network 240e:bf:b800:4136::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:53,155 - ip_reader - WARNING - Large network 240e:bf:b800:4138::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,167 - ip_reader - WARNING - Large network 240e:bf:c800:2915::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,178 - ip_reader - WARNING - Large network 240e:bf:c800:2916::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,189 - ip_reader - WARNING - Large network 240e:c2:1800:110::/61 with 147573952589676412928 IPs - sampling first 5000 +2025-07-25 17:14:53,200 - ip_reader - WARNING - Large network 240e:c2:1800:118::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,212 - ip_reader - WARNING - Large network 240e:c2:1800:ab::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,223 - ip_reader - WARNING - Large network 240e:c2:1800:ac::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,235 - ip_reader - WARNING - Large network 240e:c3:2800:205::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,246 - ip_reader - WARNING - Large network 240e:cd:ff00:118::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,257 - ip_reader - WARNING - Large network 240e:e9:b00c:33::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,269 - ip_reader - WARNING - Large network 240e:e9:b00c:34::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:53,280 - ip_reader - WARNING - Large network 240e:e9:b00c:36::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,291 - ip_reader - WARNING - Large network 240e:f7:a070:342::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:53,303 - ip_reader - WARNING - Large network 240e:f7:a070:344::/62 with 73786976294838206464 IPs - sampling first 5000 +2025-07-25 17:14:53,314 - ip_reader - WARNING - Large network 240e:f7:a070:348::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:53,325 - ip_reader - WARNING - Large network 240e:f7:a070:3c0::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,337 - ip_reader - WARNING - Large network 240e:f7:ef00:10::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,348 - ip_reader - WARNING - Large network 2001:df1:7e00:4::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,359 - ip_reader - WARNING - Large network 2400:adc0:4041::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,371 - ip_reader - WARNING - Large network 2400:de40::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,382 - ip_reader - WARNING - Large network 2403:c280:5:1::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,393 - ip_reader - WARNING - Large network 2404:3100:d:5::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,404 - ip_reader - WARNING - Large network 2404:a140:3a:1::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,416 - ip_reader - WARNING - Large network 2404:a140:3e:6::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,427 - ip_reader - WARNING - Large network 2405:3200:101:63::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,438 - ip_reader - WARNING - Large network 2405:4800:a601::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,450 - ip_reader - WARNING - Large network 2407:2440:10:255::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,461 - ip_reader - WARNING - Large network 240d:c040:1::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,473 - ip_reader - WARNING - Large network 2602:fa80:10:2::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:53,484 - ip_reader - WARNING - Large network 2602:ffe4:c02:1001::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,496 - ip_reader - WARNING - Large network 2602:ffe4:c02:100c::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:53,507 - ip_reader - WARNING - Large network 2602:ffe4:c12:105::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,518 - ip_reader - WARNING - Large network 2602:ffe4:c15:124::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,530 - ip_reader - WARNING - Large network 2602:ffe4:c18:c201::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,541 - ip_reader - WARNING - Large network 2602:ffe4:c18:c202::/63 with 36893488147419103232 IPs - sampling first 5000 +2025-07-25 17:14:53,552 - ip_reader - WARNING - Large network 2602:ffe4:c27:1000::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,563 - ip_reader - WARNING - Large network 2604:980:4002:2::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,575 - ip_reader - WARNING - Large network 2604:980:7002:6::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,586 - ip_reader - WARNING - Large network 2803:2540:f:14::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,597 - ip_reader - WARNING - Large network 2a00:12f8:3900:13::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,609 - ip_reader - WARNING - Large network 2a02:b60:2001::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,620 - ip_reader - WARNING - Large network 2a02:ce0:1:70::/64 with 18446744073709551616 IPs - sampling first 5000 +2025-07-25 17:14:53,631 - ip_reader - WARNING - Large network 2a05:45c7:1:1018::/64 with 18446744073709551616 IPs - sampling first 5000 diff --git a/logs/bestcdn_20250725_171626.log b/logs/bestcdn_20250725_171626.log new file mode 100644 index 0000000..516e1c4 --- /dev/null +++ b/logs/bestcdn_20250725_171626.log @@ -0,0 +1,361 @@ +2025-07-25 17:16:26,802 - bestcdn - INFO - Logging initialized - Log file: logs/bestcdn_20250725_171626.log +2025-07-25 17:16:26,802 - bestcdn - INFO - Set test domain for cloudflare: example.com +2025-07-25 17:16:26,802 - bestcdn - INFO - Set test domain for fastly: example.com +2025-07-25 17:16:26,802 - bestcdn - INFO - Set test domain for edgeone: example.com +2025-07-25 17:16:26,802 - bestcdn - INFO - Set test domain for esa: example.com +2025-07-25 17:16:26,802 - bestcdn - INFO - Validating setup... +2025-07-25 17:16:26,802 - bestcdn - INFO - Enabled providers: edgeone, esa, fastly, cloudflare +2025-07-25 17:16:26,805 - bestcdn - INFO - edgeone: 1774488 IPs available +2025-07-25 17:16:26,805 - bestcdn - INFO - esa: 3 IPs available +2025-07-25 17:16:26,805 - bestcdn - INFO - fastly: 3 IPs available +2025-07-25 17:16:26,805 - bestcdn - INFO - cloudflare: 3 IPs available +2025-07-25 17:16:26,805 - bestcdn - INFO - Setup validation completed successfully +2025-07-25 17:16:26,805 - bestcdn - INFO - ============================================================ +2025-07-25 17:16:26,805 - bestcdn - INFO - STARTING BESTCDN IP ACCESSIBILITY TEST +2025-07-25 17:16:26,805 - bestcdn - INFO - ============================================================ +2025-07-25 17:16:26,805 - bestcdn - INFO - Loading IP lists... +2025-07-25 17:16:26,916 - ip_reader - WARNING - Very large IPv4 network 43.174.0.0/15 with 131072 IPs - this may take time +2025-07-25 17:16:27,018 - ip_reader - INFO - IPv6 network 240d:c010::/28 - sampling first 32 IPs +2025-07-25 17:16:27,018 - ip_reader - INFO - IPv6 network 2402:4e00:24:10de::/64 - sampling first 32 IPs +2025-07-25 17:16:27,019 - ip_reader - INFO - IPv6 network 2402:4e00:24:10f0::/64 - sampling first 32 IPs +2025-07-25 17:16:27,019 - ip_reader - INFO - IPv6 network 2402:4e00:37:10dd::/64 - sampling first 32 IPs +2025-07-25 17:16:27,019 - ip_reader - INFO - IPv6 network 2402:4e00:37:10de::/63 - sampling first 32 IPs +2025-07-25 17:16:27,019 - ip_reader - INFO - IPv6 network 2402:4e00:37:10e0::/63 - sampling first 32 IPs +2025-07-25 17:16:27,019 - ip_reader - INFO - IPv6 network 2402:4e00:37:10e2::/64 - sampling first 32 IPs +2025-07-25 17:16:27,019 - ip_reader - INFO - IPv6 network 2402:4e00:37:10e4::/62 - sampling first 32 IPs +2025-07-25 17:16:27,019 - ip_reader - INFO - IPv6 network 2402:4e00:37:10e8::/62 - sampling first 32 IPs +2025-07-25 17:16:27,019 - ip_reader - INFO - IPv6 network 2402:4e00:37:10ec::/63 - sampling first 32 IPs +2025-07-25 17:16:27,019 - ip_reader - INFO - IPv6 network 2402:4e00:37:10ef::/64 - sampling first 32 IPs +2025-07-25 17:16:27,020 - ip_reader - INFO - IPv6 network 2402:4e00:37:10f1::/64 - sampling first 32 IPs +2025-07-25 17:16:27,020 - ip_reader - INFO - IPv6 network 2402:4e00:37:10f2::/64 - sampling first 32 IPs +2025-07-25 17:16:27,020 - ip_reader - INFO - IPv6 network 2402:4e00:37:10f4::/62 - sampling first 32 IPs +2025-07-25 17:16:27,020 - ip_reader - INFO - IPv6 network 2402:4e00:37:10fc::/64 - sampling first 32 IPs +2025-07-25 17:16:27,020 - ip_reader - INFO - IPv6 network 2402:4e00:37:10fe::/64 - sampling first 32 IPs +2025-07-25 17:16:27,020 - ip_reader - INFO - IPv6 network 2402:4e00:43:ef::/64 - sampling first 32 IPs +2025-07-25 17:16:27,020 - ip_reader - INFO - IPv6 network 2402:4e00:43:f0::/64 - sampling first 32 IPs +2025-07-25 17:16:27,020 - ip_reader - INFO - IPv6 network 2402:4e00:43:fd::/64 - sampling first 32 IPs +2025-07-25 17:16:27,020 - ip_reader - INFO - IPv6 network 2402:4e00:a2:df::/64 - sampling first 32 IPs +2025-07-25 17:16:27,020 - ip_reader - INFO - IPv6 network 2402:4e00:a2:e4::/63 - sampling first 32 IPs +2025-07-25 17:16:27,021 - ip_reader - INFO - IPv6 network 2402:4e00:a2:e6::/64 - sampling first 32 IPs +2025-07-25 17:16:27,021 - ip_reader - INFO - IPv6 network 2402:4e00:a2:eb::/64 - sampling first 32 IPs +2025-07-25 17:16:27,021 - ip_reader - INFO - IPv6 network 2402:4e00:a2:ec::/64 - sampling first 32 IPs +2025-07-25 17:16:27,021 - ip_reader - INFO - IPv6 network 2402:4e00:a2:ef::/64 - sampling first 32 IPs +2025-07-25 17:16:27,021 - ip_reader - INFO - IPv6 network 2402:4e00:a2:f1::/64 - sampling first 32 IPs +2025-07-25 17:16:27,021 - ip_reader - INFO - IPv6 network 2402:4e00:a2:f5::/64 - sampling first 32 IPs +2025-07-25 17:16:27,021 - ip_reader - INFO - IPv6 network 2402:4e00:a2:f8::/63 - sampling first 32 IPs +2025-07-25 17:16:27,021 - ip_reader - INFO - IPv6 network 2402:4e00:a2:ff::/64 - sampling first 32 IPs +2025-07-25 17:16:27,021 - ip_reader - INFO - IPv6 network 2402:4e00:c010:4::/64 - sampling first 32 IPs +2025-07-25 17:16:27,021 - ip_reader - INFO - IPv6 network 2402:4e00:c031:7fc::/63 - sampling first 32 IPs +2025-07-25 17:16:27,022 - ip_reader - INFO - IPv6 network 2402:4e00:c031:7fe::/64 - sampling first 32 IPs +2025-07-25 17:16:27,022 - ip_reader - INFO - IPv6 network 2402:4e00:c042:300::/63 - sampling first 32 IPs +2025-07-25 17:16:27,022 - ip_reader - INFO - IPv6 network 2402:4e00:c042:309::/64 - sampling first 32 IPs +2025-07-25 17:16:27,022 - ip_reader - INFO - IPv6 network 2402:4e00:c042:310::/64 - sampling first 32 IPs +2025-07-25 17:16:27,022 - ip_reader - INFO - IPv6 network 2402:4e00:c050:13::/64 - sampling first 32 IPs +2025-07-25 17:16:27,022 - ip_reader - INFO - IPv6 network 2402:4e00:c050:1a::/63 - sampling first 32 IPs +2025-07-25 17:16:27,022 - ip_reader - INFO - IPv6 network 2402:4e00:c050:1c::/63 - sampling first 32 IPs +2025-07-25 17:16:27,022 - ip_reader - INFO - IPv6 network 2402:4e00:c050:2c::/63 - sampling first 32 IPs +2025-07-25 17:16:27,022 - ip_reader - INFO - IPv6 network 2402:4e00:c050:4c::/64 - sampling first 32 IPs +2025-07-25 17:16:27,022 - ip_reader - INFO - IPv6 network 2402:4e00:c050:8::/64 - sampling first 32 IPs +2025-07-25 17:16:27,023 - ip_reader - INFO - IPv6 network 2402:4e00:c050::/64 - sampling first 32 IPs +2025-07-25 17:16:27,023 - ip_reader - INFO - IPv6 network 2402:4e00:c050:b::/64 - sampling first 32 IPs +2025-07-25 17:16:27,023 - ip_reader - INFO - IPv6 network 2402:4e00:c050:c::/63 - sampling first 32 IPs +2025-07-25 17:16:27,023 - ip_reader - INFO - IPv6 network 2402:4e00:c050:e::/64 - sampling first 32 IPs +2025-07-25 17:16:27,023 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10d1::/64 - sampling first 32 IPs +2025-07-25 17:16:27,023 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10d6::/64 - sampling first 32 IPs +2025-07-25 17:16:27,023 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10ef::/64 - sampling first 32 IPs +2025-07-25 17:16:27,023 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10f1::/64 - sampling first 32 IPs +2025-07-25 17:16:27,023 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10f2::/63 - sampling first 32 IPs +2025-07-25 17:16:27,023 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10f6::/63 - sampling first 32 IPs +2025-07-25 17:16:27,024 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10fa::/64 - sampling first 32 IPs +2025-07-25 17:16:27,024 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10fd::/64 - sampling first 32 IPs +2025-07-25 17:16:27,024 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10ff::/64 - sampling first 32 IPs +2025-07-25 17:16:27,024 - ip_reader - INFO - IPv6 network 2408:862a:240:2::/64 - sampling first 32 IPs +2025-07-25 17:16:27,024 - ip_reader - INFO - IPv6 network 2408:8670:3af0:32::/64 - sampling first 32 IPs +2025-07-25 17:16:27,024 - ip_reader - INFO - IPv6 network 2408:8706:0:400::/64 - sampling first 32 IPs +2025-07-25 17:16:27,024 - ip_reader - INFO - IPv6 network 2408:8706:2:300d::/64 - sampling first 32 IPs +2025-07-25 17:16:27,024 - ip_reader - INFO - IPv6 network 2408:8706:2:300e::/64 - sampling first 32 IPs +2025-07-25 17:16:27,024 - ip_reader - INFO - IPv6 network 2408:870c:1020:11::/64 - sampling first 32 IPs +2025-07-25 17:16:27,024 - ip_reader - INFO - IPv6 network 2408:8710:20:11a0::/63 - sampling first 32 IPs +2025-07-25 17:16:27,025 - ip_reader - INFO - IPv6 network 2408:8719:1100:91::/64 - sampling first 32 IPs +2025-07-25 17:16:27,025 - ip_reader - INFO - IPv6 network 2408:8719:1100:92::/63 - sampling first 32 IPs +2025-07-25 17:16:27,025 - ip_reader - INFO - IPv6 network 2408:8719:1100:94::/63 - sampling first 32 IPs +2025-07-25 17:16:27,025 - ip_reader - INFO - IPv6 network 2408:8719:1100:96::/64 - sampling first 32 IPs +2025-07-25 17:16:27,025 - ip_reader - INFO - IPv6 network 2408:8719:40e:39::/64 - sampling first 32 IPs +2025-07-25 17:16:27,025 - ip_reader - INFO - IPv6 network 2408:8719:40e:3a::/63 - sampling first 32 IPs +2025-07-25 17:16:27,025 - ip_reader - INFO - IPv6 network 2408:8719:40e:3c::/64 - sampling first 32 IPs +2025-07-25 17:16:27,025 - ip_reader - INFO - IPv6 network 2408:8719:40f:18::/64 - sampling first 32 IPs +2025-07-25 17:16:27,025 - ip_reader - INFO - IPv6 network 2408:871a:5100:140::/64 - sampling first 32 IPs +2025-07-25 17:16:27,025 - ip_reader - INFO - IPv6 network 2408:8720:806:300::/64 - sampling first 32 IPs +2025-07-25 17:16:27,025 - ip_reader - INFO - IPv6 network 2408:8726:1001:111::/64 - sampling first 32 IPs +2025-07-25 17:16:27,026 - ip_reader - INFO - IPv6 network 2408:8726:1001:112::/63 - sampling first 32 IPs +2025-07-25 17:16:27,026 - ip_reader - INFO - IPv6 network 2408:8726:1001:114::/64 - sampling first 32 IPs +2025-07-25 17:16:27,026 - ip_reader - INFO - IPv6 network 2408:8726:1001:116::/63 - sampling first 32 IPs +2025-07-25 17:16:27,026 - ip_reader - INFO - IPv6 network 2408:872f:20:210::/63 - sampling first 32 IPs +2025-07-25 17:16:27,026 - ip_reader - INFO - IPv6 network 2408:8734:4012:1::/64 - sampling first 32 IPs +2025-07-25 17:16:27,026 - ip_reader - INFO - IPv6 network 2408:8734:4012:2::/64 - sampling first 32 IPs +2025-07-25 17:16:27,026 - ip_reader - INFO - IPv6 network 2408:8734:4012:4::/64 - sampling first 32 IPs +2025-07-25 17:16:27,026 - ip_reader - INFO - IPv6 network 2408:8738:b000:1c::/64 - sampling first 32 IPs +2025-07-25 17:16:27,026 - ip_reader - INFO - IPv6 network 2408:873c:5011::/64 - sampling first 32 IPs +2025-07-25 17:16:27,026 - ip_reader - INFO - IPv6 network 2408:873c:5811:78::/64 - sampling first 32 IPs +2025-07-25 17:16:27,027 - ip_reader - INFO - IPv6 network 2408:873c:5811:a3::/64 - sampling first 32 IPs +2025-07-25 17:16:27,027 - ip_reader - INFO - IPv6 network 2408:873c:5811:ae::/64 - sampling first 32 IPs +2025-07-25 17:16:27,027 - ip_reader - INFO - IPv6 network 2408:873d:2011:41::/64 - sampling first 32 IPs +2025-07-25 17:16:27,027 - ip_reader - INFO - IPv6 network 2408:873d:2011:43::/64 - sampling first 32 IPs +2025-07-25 17:16:27,027 - ip_reader - INFO - IPv6 network 2408:873d:2011:44::/63 - sampling first 32 IPs +2025-07-25 17:16:27,027 - ip_reader - INFO - IPv6 network 2408:873d:2011:47::/64 - sampling first 32 IPs +2025-07-25 17:16:27,027 - ip_reader - INFO - IPv6 network 2408:873d:2011:49::/64 - sampling first 32 IPs +2025-07-25 17:16:27,027 - ip_reader - INFO - IPv6 network 2408:8740:d1fe:52::/63 - sampling first 32 IPs +2025-07-25 17:16:27,027 - ip_reader - INFO - IPv6 network 2408:8740:d1fe:54::/62 - sampling first 32 IPs +2025-07-25 17:16:27,027 - ip_reader - INFO - IPv6 network 2408:8740:d1fe:58::/63 - sampling first 32 IPs +2025-07-25 17:16:27,027 - ip_reader - INFO - IPv6 network 2408:8744:d05:11::/64 - sampling first 32 IPs +2025-07-25 17:16:27,028 - ip_reader - INFO - IPv6 network 2408:8744:d05:12::/64 - sampling first 32 IPs +2025-07-25 17:16:27,028 - ip_reader - INFO - IPv6 network 2408:8748:a100:33::/64 - sampling first 32 IPs +2025-07-25 17:16:27,028 - ip_reader - INFO - IPv6 network 2408:8748:a100:34::/63 - sampling first 32 IPs +2025-07-25 17:16:27,028 - ip_reader - INFO - IPv6 network 2408:8748:a100:36::/64 - sampling first 32 IPs +2025-07-25 17:16:27,028 - ip_reader - INFO - IPv6 network 2408:8748:a102:3041::/64 - sampling first 32 IPs +2025-07-25 17:16:27,028 - ip_reader - INFO - IPv6 network 2408:8748:a102:3042::/63 - sampling first 32 IPs +2025-07-25 17:16:27,028 - ip_reader - INFO - IPv6 network 2408:8748:a102:3044::/62 - sampling first 32 IPs +2025-07-25 17:16:27,028 - ip_reader - INFO - IPv6 network 2408:8748:a102:3048::/63 - sampling first 32 IPs +2025-07-25 17:16:27,028 - ip_reader - INFO - IPv6 network 2408:8749:c110:800::/64 - sampling first 32 IPs +2025-07-25 17:16:27,028 - ip_reader - INFO - IPv6 network 2408:874c:1ff:80::/64 - sampling first 32 IPs +2025-07-25 17:16:27,028 - ip_reader - INFO - IPv6 network 2408:874c:1ff:82::/63 - sampling first 32 IPs +2025-07-25 17:16:27,029 - ip_reader - INFO - IPv6 network 2408:874c:1ff:84::/62 - sampling first 32 IPs +2025-07-25 17:16:27,029 - ip_reader - INFO - IPv6 network 2408:874c:1ff:88::/64 - sampling first 32 IPs +2025-07-25 17:16:27,029 - ip_reader - INFO - IPv6 network 2408:874d:a00:b::/64 - sampling first 32 IPs +2025-07-25 17:16:27,029 - ip_reader - INFO - IPv6 network 2408:874d:a00:c::/64 - sampling first 32 IPs +2025-07-25 17:16:27,029 - ip_reader - INFO - IPv6 network 2408:874f:3001:310::/64 - sampling first 32 IPs +2025-07-25 17:16:27,029 - ip_reader - INFO - IPv6 network 2408:8752:e00:80::/63 - sampling first 32 IPs +2025-07-25 17:16:27,029 - ip_reader - INFO - IPv6 network 2408:8752:e00:b0::/61 - sampling first 32 IPs +2025-07-25 17:16:27,029 - ip_reader - INFO - IPv6 network 2408:8752:e00:b8::/64 - sampling first 32 IPs +2025-07-25 17:16:27,029 - ip_reader - INFO - IPv6 network 2408:8756:2cff:e401::/64 - sampling first 32 IPs +2025-07-25 17:16:27,029 - ip_reader - INFO - IPv6 network 2408:8756:2cff:e402::/63 - sampling first 32 IPs +2025-07-25 17:16:27,030 - ip_reader - INFO - IPv6 network 2408:8756:2cff:e404::/64 - sampling first 32 IPs +2025-07-25 17:16:27,030 - ip_reader - INFO - IPv6 network 2408:8756:4cff:d602::/63 - sampling first 32 IPs +2025-07-25 17:16:27,030 - ip_reader - INFO - IPv6 network 2408:8756:4cff:d604::/64 - sampling first 32 IPs +2025-07-25 17:16:27,030 - ip_reader - INFO - IPv6 network 2408:8756:4cff:d606::/63 - sampling first 32 IPs +2025-07-25 17:16:27,030 - ip_reader - INFO - IPv6 network 2408:8756:4cff:d608::/63 - sampling first 32 IPs +2025-07-25 17:16:27,030 - ip_reader - INFO - IPv6 network 2408:8756:d0fb:16c::/64 - sampling first 32 IPs +2025-07-25 17:16:27,030 - ip_reader - INFO - IPv6 network 2408:8756:d0fb:170::/64 - sampling first 32 IPs +2025-07-25 17:16:27,030 - ip_reader - INFO - IPv6 network 2408:875c:0:80::/63 - sampling first 32 IPs +2025-07-25 17:16:27,030 - ip_reader - INFO - IPv6 network 2408:8760:119:4::/63 - sampling first 32 IPs +2025-07-25 17:16:27,030 - ip_reader - INFO - IPv6 network 2408:8764:22:1f::/64 - sampling first 32 IPs +2025-07-25 17:16:27,030 - ip_reader - INFO - IPv6 network 2408:8766:0:101c::/64 - sampling first 32 IPs +2025-07-25 17:16:27,031 - ip_reader - INFO - IPv6 network 2408:876a:1000:22::/64 - sampling first 32 IPs +2025-07-25 17:16:27,031 - ip_reader - INFO - IPv6 network 2408:876a:1000:24::/64 - sampling first 32 IPs +2025-07-25 17:16:27,031 - ip_reader - INFO - IPv6 network 2408:876c:1780:122::/64 - sampling first 32 IPs +2025-07-25 17:16:27,031 - ip_reader - INFO - IPv6 network 2408:8770:0:d1::/64 - sampling first 32 IPs +2025-07-25 17:16:27,031 - ip_reader - INFO - IPv6 network 2408:8770:0:d2::/64 - sampling first 32 IPs +2025-07-25 17:16:27,031 - ip_reader - INFO - IPv6 network 2408:8770:0:d6::/63 - sampling first 32 IPs +2025-07-25 17:16:27,031 - ip_reader - INFO - IPv6 network 2408:8770:0:d8::/64 - sampling first 32 IPs +2025-07-25 17:16:27,031 - ip_reader - INFO - IPv6 network 2408:8776:1:c::/64 - sampling first 32 IPs +2025-07-25 17:16:27,031 - ip_reader - INFO - IPv6 network 2408:8779:c001:3::/64 - sampling first 32 IPs +2025-07-25 17:16:27,031 - ip_reader - INFO - IPv6 network 2408:877a:2000:f::/64 - sampling first 32 IPs +2025-07-25 17:16:27,032 - ip_reader - INFO - IPv6 network 2409:8702:489c::/64 - sampling first 32 IPs +2025-07-25 17:16:27,032 - ip_reader - INFO - IPv6 network 2409:875e:5088:c1::/64 - sampling first 32 IPs +2025-07-25 17:16:27,032 - ip_reader - INFO - IPv6 network 2409:8c04:110e:4001::/64 - sampling first 32 IPs +2025-07-25 17:16:27,032 - ip_reader - INFO - IPv6 network 2409:8c0c:310:21d::/64 - sampling first 32 IPs +2025-07-25 17:16:27,032 - ip_reader - INFO - IPv6 network 2409:8c0c:310:21e::/63 - sampling first 32 IPs +2025-07-25 17:16:27,032 - ip_reader - INFO - IPv6 network 2409:8c0c:310:220::/64 - sampling first 32 IPs +2025-07-25 17:16:27,032 - ip_reader - INFO - IPv6 network 2409:8c0c:310:222::/63 - sampling first 32 IPs +2025-07-25 17:16:27,032 - ip_reader - INFO - IPv6 network 2409:8c10:c00:1404::/64 - sampling first 32 IPs +2025-07-25 17:16:27,032 - ip_reader - INFO - IPv6 network 2409:8c10:c00:68::/64 - sampling first 32 IPs +2025-07-25 17:16:27,032 - ip_reader - INFO - IPv6 network 2409:8c14:f2c:1001::/64 - sampling first 32 IPs +2025-07-25 17:16:27,032 - ip_reader - INFO - IPv6 network 2409:8c1c:300:17::/64 - sampling first 32 IPs +2025-07-25 17:16:27,033 - ip_reader - INFO - IPv6 network 2409:8c1e:68e0:a08::/64 - sampling first 32 IPs +2025-07-25 17:16:27,033 - ip_reader - INFO - IPv6 network 2409:8c1e:8f80:2::/64 - sampling first 32 IPs +2025-07-25 17:16:27,033 - ip_reader - INFO - IPv6 network 2409:8c20:1834:461::/64 - sampling first 32 IPs +2025-07-25 17:16:27,033 - ip_reader - INFO - IPv6 network 2409:8c20:1834:463::/64 - sampling first 32 IPs +2025-07-25 17:16:27,033 - ip_reader - INFO - IPv6 network 2409:8c20:1834:464::/63 - sampling first 32 IPs +2025-07-25 17:16:27,033 - ip_reader - INFO - IPv6 network 2409:8c20:1834:467::/64 - sampling first 32 IPs +2025-07-25 17:16:27,033 - ip_reader - INFO - IPv6 network 2409:8c20:1834:469::/64 - sampling first 32 IPs +2025-07-25 17:16:27,033 - ip_reader - INFO - IPv6 network 2409:8c20:5021:160::/64 - sampling first 32 IPs +2025-07-25 17:16:27,033 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1dd::/64 - sampling first 32 IPs +2025-07-25 17:16:27,033 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1de::/63 - sampling first 32 IPs +2025-07-25 17:16:27,033 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1e1::/64 - sampling first 32 IPs +2025-07-25 17:16:27,034 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1e2::/63 - sampling first 32 IPs +2025-07-25 17:16:27,034 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1e4::/64 - sampling first 32 IPs +2025-07-25 17:16:27,034 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1e6::/64 - sampling first 32 IPs +2025-07-25 17:16:27,034 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1e8::/64 - sampling first 32 IPs +2025-07-25 17:16:27,034 - ip_reader - INFO - IPv6 network 2409:8c20:b281:19::/64 - sampling first 32 IPs +2025-07-25 17:16:27,034 - ip_reader - INFO - IPv6 network 2409:8c28:203:308::/64 - sampling first 32 IPs +2025-07-25 17:16:27,034 - ip_reader - INFO - IPv6 network 2409:8c28:203:34::/64 - sampling first 32 IPs +2025-07-25 17:16:27,034 - ip_reader - INFO - IPv6 network 2409:8c28:2808:11::/64 - sampling first 32 IPs +2025-07-25 17:16:27,034 - ip_reader - INFO - IPv6 network 2409:8c28:2808:12::/63 - sampling first 32 IPs +2025-07-25 17:16:27,034 - ip_reader - INFO - IPv6 network 2409:8c28:2808:14::/63 - sampling first 32 IPs +2025-07-25 17:16:27,034 - ip_reader - INFO - IPv6 network 2409:8c28:2808:d::/64 - sampling first 32 IPs +2025-07-25 17:16:27,035 - ip_reader - INFO - IPv6 network 2409:8c28:2808:e::/63 - sampling first 32 IPs +2025-07-25 17:16:27,035 - ip_reader - INFO - IPv6 network 2409:8c30:1000:20::/64 - sampling first 32 IPs +2025-07-25 17:16:27,035 - ip_reader - INFO - IPv6 network 2409:8c34:2220:30a::/64 - sampling first 32 IPs +2025-07-25 17:16:27,035 - ip_reader - INFO - IPv6 network 2409:8c34:e00:41::/64 - sampling first 32 IPs +2025-07-25 17:16:27,035 - ip_reader - INFO - IPv6 network 2409:8c34:e00:42::/63 - sampling first 32 IPs +2025-07-25 17:16:27,035 - ip_reader - INFO - IPv6 network 2409:8c34:e00:44::/62 - sampling first 32 IPs +2025-07-25 17:16:27,035 - ip_reader - INFO - IPv6 network 2409:8c34:e00:48::/63 - sampling first 32 IPs +2025-07-25 17:16:27,035 - ip_reader - INFO - IPv6 network 2409:8c38:80:1c0::/64 - sampling first 32 IPs +2025-07-25 17:16:27,035 - ip_reader - INFO - IPv6 network 2409:8c38:80:1c2::/63 - sampling first 32 IPs +2025-07-25 17:16:27,035 - ip_reader - INFO - IPv6 network 2409:8c38:80:1c4::/62 - sampling first 32 IPs +2025-07-25 17:16:27,035 - ip_reader - INFO - IPv6 network 2409:8c38:80:1c8::/64 - sampling first 32 IPs +2025-07-25 17:16:27,036 - ip_reader - INFO - IPv6 network 2409:8c38:80:1f1::/64 - sampling first 32 IPs +2025-07-25 17:16:27,036 - ip_reader - INFO - IPv6 network 2409:8c38:80:1f2::/63 - sampling first 32 IPs +2025-07-25 17:16:27,036 - ip_reader - INFO - IPv6 network 2409:8c38:80:1f4::/64 - sampling first 32 IPs +2025-07-25 17:16:27,036 - ip_reader - INFO - IPv6 network 2409:8c3c:1300:306::/64 - sampling first 32 IPs +2025-07-25 17:16:27,036 - ip_reader - INFO - IPv6 network 2409:8c3c:900:1a1::/64 - sampling first 32 IPs +2025-07-25 17:16:27,036 - ip_reader - INFO - IPv6 network 2409:8c3c:900:1a2::/63 - sampling first 32 IPs +2025-07-25 17:16:27,036 - ip_reader - INFO - IPv6 network 2409:8c3c:900:1a4::/64 - sampling first 32 IPs +2025-07-25 17:16:27,036 - ip_reader - INFO - IPv6 network 2409:8c44:b00:4ec::/64 - sampling first 32 IPs +2025-07-25 17:16:27,036 - ip_reader - INFO - IPv6 network 2409:8c4c:e00:2011::/64 - sampling first 32 IPs +2025-07-25 17:16:27,036 - ip_reader - INFO - IPv6 network 2409:8c4c:e00:2012::/63 - sampling first 32 IPs +2025-07-25 17:16:27,036 - ip_reader - INFO - IPv6 network 2409:8c4c:e00:2014::/64 - sampling first 32 IPs +2025-07-25 17:16:27,037 - ip_reader - INFO - IPv6 network 2409:8c50:a00:2061::/64 - sampling first 32 IPs +2025-07-25 17:16:27,037 - ip_reader - INFO - IPv6 network 2409:8c50:a00:2170::/61 - sampling first 32 IPs +2025-07-25 17:16:27,037 - ip_reader - INFO - IPv6 network 2409:8c50:a00:2178::/64 - sampling first 32 IPs +2025-07-25 17:16:27,037 - ip_reader - INFO - IPv6 network 2409:8c50:a00:2252::/63 - sampling first 32 IPs +2025-07-25 17:16:27,037 - ip_reader - INFO - IPv6 network 2409:8c50:a00:2254::/64 - sampling first 32 IPs +2025-07-25 17:16:27,037 - ip_reader - INFO - IPv6 network 2409:8c54:1801:21::/64 - sampling first 32 IPs +2025-07-25 17:16:27,037 - ip_reader - INFO - IPv6 network 2409:8c54:1801:22::/63 - sampling first 32 IPs +2025-07-25 17:16:27,037 - ip_reader - INFO - IPv6 network 2409:8c54:1801:24::/64 - sampling first 32 IPs +2025-07-25 17:16:27,037 - ip_reader - INFO - IPv6 network 2409:8c54:1821:578::/64 - sampling first 32 IPs +2025-07-25 17:16:27,037 - ip_reader - INFO - IPv6 network 2409:8c54:2030:222::/63 - sampling first 32 IPs +2025-07-25 17:16:27,037 - ip_reader - INFO - IPv6 network 2409:8c54:2030:224::/64 - sampling first 32 IPs +2025-07-25 17:16:27,038 - ip_reader - INFO - IPv6 network 2409:8c54:2030:226::/63 - sampling first 32 IPs +2025-07-25 17:16:27,038 - ip_reader - INFO - IPv6 network 2409:8c54:2030:228::/63 - sampling first 32 IPs +2025-07-25 17:16:27,038 - ip_reader - INFO - IPv6 network 2409:8c5c:110:50::/64 - sampling first 32 IPs +2025-07-25 17:16:27,038 - ip_reader - INFO - IPv6 network 2409:8c5e:5000:c2::/64 - sampling first 32 IPs +2025-07-25 17:16:27,038 - ip_reader - INFO - IPv6 network 2409:8c60:2500:5d::/64 - sampling first 32 IPs +2025-07-25 17:16:27,038 - ip_reader - INFO - IPv6 network 2409:8c62:e10:218::/64 - sampling first 32 IPs +2025-07-25 17:16:27,038 - ip_reader - INFO - IPv6 network 2409:8c6a:b021:74::/64 - sampling first 32 IPs +2025-07-25 17:16:27,038 - ip_reader - INFO - IPv6 network 2409:8c6c:561:8110::/62 - sampling first 32 IPs +2025-07-25 17:16:27,038 - ip_reader - INFO - IPv6 network 2409:8c70:3a10:16::/64 - sampling first 32 IPs +2025-07-25 17:16:27,038 - ip_reader - INFO - IPv6 network 2409:8c70:3a91:51::/64 - sampling first 32 IPs +2025-07-25 17:16:27,039 - ip_reader - INFO - IPv6 network 2409:8c70:3a91:52::/64 - sampling first 32 IPs +2025-07-25 17:16:27,039 - ip_reader - INFO - IPv6 network 2409:8c70:3a91:56::/63 - sampling first 32 IPs +2025-07-25 17:16:27,039 - ip_reader - INFO - IPv6 network 2409:8c70:3a91:58::/64 - sampling first 32 IPs +2025-07-25 17:16:27,039 - ip_reader - INFO - IPv6 network 2409:8c74:f100:864::/64 - sampling first 32 IPs +2025-07-25 17:16:27,039 - ip_reader - INFO - IPv6 network 2409:8c78:100:24::/64 - sampling first 32 IPs +2025-07-25 17:16:27,039 - ip_reader - INFO - IPv6 network 2409:8c7a:2604::/64 - sampling first 32 IPs +2025-07-25 17:16:27,039 - ip_reader - INFO - IPv6 network 240e:90d:1101:4508::/64 - sampling first 32 IPs +2025-07-25 17:16:27,039 - ip_reader - INFO - IPv6 network 240e:90d:1101:4510::/64 - sampling first 32 IPs +2025-07-25 17:16:27,039 - ip_reader - INFO - IPv6 network 240e:910:e000:2504::/64 - sampling first 32 IPs +2025-07-25 17:16:27,039 - ip_reader - INFO - IPv6 network 240e:914:5009:1002::/63 - sampling first 32 IPs +2025-07-25 17:16:27,039 - ip_reader - INFO - IPv6 network 240e:914:5009:a::/63 - sampling first 32 IPs +2025-07-25 17:16:27,040 - ip_reader - INFO - IPv6 network 240e:925:2:701::/64 - sampling first 32 IPs +2025-07-25 17:16:27,040 - ip_reader - INFO - IPv6 network 240e:925:2:702::/63 - sampling first 32 IPs +2025-07-25 17:16:27,040 - ip_reader - INFO - IPv6 network 240e:925:2:704::/64 - sampling first 32 IPs +2025-07-25 17:16:27,040 - ip_reader - INFO - IPv6 network 240e:925:2:706::/63 - sampling first 32 IPs +2025-07-25 17:16:27,040 - ip_reader - INFO - IPv6 network 240e:926:3004:21::/64 - sampling first 32 IPs +2025-07-25 17:16:27,040 - ip_reader - INFO - IPv6 network 240e:930:c200:70::/63 - sampling first 32 IPs +2025-07-25 17:16:27,040 - ip_reader - INFO - IPv6 network 240e:935:a04:2708::/64 - sampling first 32 IPs +2025-07-25 17:16:27,040 - ip_reader - INFO - IPv6 network 240e:93c:1201:2::/63 - sampling first 32 IPs +2025-07-25 17:16:27,040 - ip_reader - INFO - IPv6 network 240e:93c:1201:4::/64 - sampling first 32 IPs +2025-07-25 17:16:27,040 - ip_reader - INFO - IPv6 network 240e:93c:1201:d::/64 - sampling first 32 IPs +2025-07-25 17:16:27,040 - ip_reader - INFO - IPv6 network 240e:940:20c:308::/64 - sampling first 32 IPs +2025-07-25 17:16:27,041 - ip_reader - INFO - IPv6 network 240e:946:3000:8008::/63 - sampling first 32 IPs +2025-07-25 17:16:27,041 - ip_reader - INFO - IPv6 network 240e:94a:b01:214::/63 - sampling first 32 IPs +2025-07-25 17:16:27,041 - ip_reader - INFO - IPv6 network 240e:94c:0:2701::/64 - sampling first 32 IPs +2025-07-25 17:16:27,041 - ip_reader - INFO - IPv6 network 240e:94c:0:2702::/63 - sampling first 32 IPs +2025-07-25 17:16:27,041 - ip_reader - INFO - IPv6 network 240e:94c:0:2704::/64 - sampling first 32 IPs +2025-07-25 17:16:27,041 - ip_reader - INFO - IPv6 network 240e:950:1:2002::/64 - sampling first 32 IPs +2025-07-25 17:16:27,041 - ip_reader - INFO - IPv6 network 240e:958:2300:220::/64 - sampling first 32 IPs +2025-07-25 17:16:27,041 - ip_reader - INFO - IPv6 network 240e:958:6003:108::/64 - sampling first 32 IPs +2025-07-25 17:16:27,041 - ip_reader - INFO - IPv6 network 240e:95e:4001:1::/64 - sampling first 32 IPs +2025-07-25 17:16:27,041 - ip_reader - INFO - IPv6 network 240e:95e:4001:2::/63 - sampling first 32 IPs +2025-07-25 17:16:27,041 - ip_reader - INFO - IPv6 network 240e:95e:4001:4::/64 - sampling first 32 IPs +2025-07-25 17:16:27,042 - ip_reader - INFO - IPv6 network 240e:960:200:90::/64 - sampling first 32 IPs +2025-07-25 17:16:27,042 - ip_reader - INFO - IPv6 network 240e:960:200:92::/63 - sampling first 32 IPs +2025-07-25 17:16:27,042 - ip_reader - INFO - IPv6 network 240e:960:200:94::/62 - sampling first 32 IPs +2025-07-25 17:16:27,042 - ip_reader - INFO - IPv6 network 240e:960:200:98::/64 - sampling first 32 IPs +2025-07-25 17:16:27,042 - ip_reader - INFO - IPv6 network 240e:964:5002:109::/64 - sampling first 32 IPs +2025-07-25 17:16:27,042 - ip_reader - INFO - IPv6 network 240e:964:5002:10a::/63 - sampling first 32 IPs +2025-07-25 17:16:27,042 - ip_reader - INFO - IPv6 network 240e:964:5002:10c::/64 - sampling first 32 IPs +2025-07-25 17:16:27,042 - ip_reader - INFO - IPv6 network 240e:965:802:b01::/64 - sampling first 32 IPs +2025-07-25 17:16:27,042 - ip_reader - INFO - IPv6 network 240e:965:802:b02::/63 - sampling first 32 IPs +2025-07-25 17:16:27,042 - ip_reader - INFO - IPv6 network 240e:965:802:b04::/62 - sampling first 32 IPs +2025-07-25 17:16:27,043 - ip_reader - INFO - IPv6 network 240e:965:802:b08::/63 - sampling first 32 IPs +2025-07-25 17:16:27,043 - ip_reader - INFO - IPv6 network 240e:96c:6400:a00::/64 - sampling first 32 IPs +2025-07-25 17:16:27,043 - ip_reader - INFO - IPv6 network 240e:974:e200:4209::/64 - sampling first 32 IPs +2025-07-25 17:16:27,043 - ip_reader - INFO - IPv6 network 240e:974:e200:420a::/63 - sampling first 32 IPs +2025-07-25 17:16:27,043 - ip_reader - INFO - IPv6 network 240e:974:e200:420c::/63 - sampling first 32 IPs +2025-07-25 17:16:27,043 - ip_reader - INFO - IPv6 network 240e:978:2608:800::/64 - sampling first 32 IPs +2025-07-25 17:16:27,043 - ip_reader - INFO - IPv6 network 240e:978:2903:50a7::/64 - sampling first 32 IPs +2025-07-25 17:16:27,043 - ip_reader - INFO - IPv6 network 240e:978:2903:50a9::/64 - sampling first 32 IPs +2025-07-25 17:16:27,043 - ip_reader - INFO - IPv6 network 240e:978:b34:1::/64 - sampling first 32 IPs +2025-07-25 17:16:27,043 - ip_reader - INFO - IPv6 network 240e:978:d04:2082::/63 - sampling first 32 IPs +2025-07-25 17:16:27,043 - ip_reader - INFO - IPv6 network 240e:978:d04:2085::/64 - sampling first 32 IPs +2025-07-25 17:16:27,044 - ip_reader - INFO - IPv6 network 240e:978:d04:2086::/63 - sampling first 32 IPs +2025-07-25 17:16:27,044 - ip_reader - INFO - IPv6 network 240e:978:d04:2088::/64 - sampling first 32 IPs +2025-07-25 17:16:27,044 - ip_reader - INFO - IPv6 network 240e:978:d04:208b::/64 - sampling first 32 IPs +2025-07-25 17:16:27,044 - ip_reader - INFO - IPv6 network 240e:978:d04:208c::/62 - sampling first 32 IPs +2025-07-25 17:16:27,044 - ip_reader - INFO - IPv6 network 240e:978:d04:2090::/63 - sampling first 32 IPs +2025-07-25 17:16:27,044 - ip_reader - INFO - IPv6 network 240e:979:f07:1::/64 - sampling first 32 IPs +2025-07-25 17:16:27,044 - ip_reader - INFO - IPv6 network 240e:979:f07:3::/64 - sampling first 32 IPs +2025-07-25 17:16:27,044 - ip_reader - INFO - IPv6 network 240e:979:f07:4::/63 - sampling first 32 IPs +2025-07-25 17:16:27,044 - ip_reader - INFO - IPv6 network 240e:979:f07:7::/64 - sampling first 32 IPs +2025-07-25 17:16:27,044 - ip_reader - INFO - IPv6 network 240e:979:f07:9::/64 - sampling first 32 IPs +2025-07-25 17:16:27,044 - ip_reader - INFO - IPv6 network 240e:97c:4040:200::/63 - sampling first 32 IPs +2025-07-25 17:16:27,045 - ip_reader - INFO - IPv6 network 240e:97d:10:25de::/64 - sampling first 32 IPs +2025-07-25 17:16:27,045 - ip_reader - INFO - IPv6 network 240e:97d:10:25e7::/64 - sampling first 32 IPs +2025-07-25 17:16:27,045 - ip_reader - INFO - IPv6 network 240e:97d:2000:b02::/63 - sampling first 32 IPs +2025-07-25 17:16:27,045 - ip_reader - INFO - IPv6 network 240e:97d:2000:b04::/64 - sampling first 32 IPs +2025-07-25 17:16:27,045 - ip_reader - INFO - IPv6 network 240e:97d:2000:b06::/63 - sampling first 32 IPs +2025-07-25 17:16:27,045 - ip_reader - INFO - IPv6 network 240e:97d:2000:b08::/63 - sampling first 32 IPs +2025-07-25 17:16:27,045 - ip_reader - INFO - IPv6 network 240e:980:1200:b14::/63 - sampling first 32 IPs +2025-07-25 17:16:27,045 - ip_reader - INFO - IPv6 network 240e:983:705:2::/64 - sampling first 32 IPs +2025-07-25 17:16:27,045 - ip_reader - INFO - IPv6 network 240e:b1:c808:9::/64 - sampling first 32 IPs +2025-07-25 17:16:27,045 - ip_reader - INFO - IPv6 network 240e:b1:c808:a::/64 - sampling first 32 IPs +2025-07-25 17:16:27,046 - ip_reader - INFO - IPv6 network 240e:b1:c808:c::/63 - sampling first 32 IPs +2025-07-25 17:16:27,046 - ip_reader - INFO - IPv6 network 240e:bf:b800:4131::/64 - sampling first 32 IPs +2025-07-25 17:16:27,046 - ip_reader - INFO - IPv6 network 240e:bf:b800:4132::/64 - sampling first 32 IPs +2025-07-25 17:16:27,046 - ip_reader - INFO - IPv6 network 240e:bf:b800:4136::/63 - sampling first 32 IPs +2025-07-25 17:16:27,046 - ip_reader - INFO - IPv6 network 240e:bf:b800:4138::/64 - sampling first 32 IPs +2025-07-25 17:16:27,046 - ip_reader - INFO - IPv6 network 240e:bf:c800:2915::/64 - sampling first 32 IPs +2025-07-25 17:16:27,046 - ip_reader - INFO - IPv6 network 240e:bf:c800:2916::/64 - sampling first 32 IPs +2025-07-25 17:16:27,046 - ip_reader - INFO - IPv6 network 240e:c2:1800:110::/61 - sampling first 32 IPs +2025-07-25 17:16:27,046 - ip_reader - INFO - IPv6 network 240e:c2:1800:118::/64 - sampling first 32 IPs +2025-07-25 17:16:27,046 - ip_reader - INFO - IPv6 network 240e:c2:1800:ab::/64 - sampling first 32 IPs +2025-07-25 17:16:27,046 - ip_reader - INFO - IPv6 network 240e:c2:1800:ac::/64 - sampling first 32 IPs +2025-07-25 17:16:27,047 - ip_reader - INFO - IPv6 network 240e:c3:2800:205::/64 - sampling first 32 IPs +2025-07-25 17:16:27,047 - ip_reader - INFO - IPv6 network 240e:cd:ff00:118::/64 - sampling first 32 IPs +2025-07-25 17:16:27,047 - ip_reader - INFO - IPv6 network 240e:e9:b00c:33::/64 - sampling first 32 IPs +2025-07-25 17:16:27,047 - ip_reader - INFO - IPv6 network 240e:e9:b00c:34::/63 - sampling first 32 IPs +2025-07-25 17:16:27,047 - ip_reader - INFO - IPv6 network 240e:e9:b00c:36::/64 - sampling first 32 IPs +2025-07-25 17:16:27,047 - ip_reader - INFO - IPv6 network 240e:f7:a070:342::/63 - sampling first 32 IPs +2025-07-25 17:16:27,047 - ip_reader - INFO - IPv6 network 240e:f7:a070:344::/62 - sampling first 32 IPs +2025-07-25 17:16:27,047 - ip_reader - INFO - IPv6 network 240e:f7:a070:348::/63 - sampling first 32 IPs +2025-07-25 17:16:27,047 - ip_reader - INFO - IPv6 network 240e:f7:a070:3c0::/64 - sampling first 32 IPs +2025-07-25 17:16:27,047 - ip_reader - INFO - IPv6 network 240e:f7:ef00:10::/64 - sampling first 32 IPs +2025-07-25 17:16:27,047 - ip_reader - INFO - IPv6 network 2001:df1:7e00:4::/64 - sampling first 32 IPs +2025-07-25 17:16:27,048 - ip_reader - INFO - IPv6 network 2400:adc0:4041::/64 - sampling first 32 IPs +2025-07-25 17:16:27,048 - ip_reader - INFO - IPv6 network 2400:de40::/64 - sampling first 32 IPs +2025-07-25 17:16:27,048 - ip_reader - INFO - IPv6 network 2403:c280:5:1::/64 - sampling first 32 IPs +2025-07-25 17:16:27,048 - ip_reader - INFO - IPv6 network 2404:3100:d:5::/64 - sampling first 32 IPs +2025-07-25 17:16:27,048 - ip_reader - INFO - IPv6 network 2404:a140:3a:1::/64 - sampling first 32 IPs +2025-07-25 17:16:27,048 - ip_reader - INFO - IPv6 network 2404:a140:3e:6::/64 - sampling first 32 IPs +2025-07-25 17:16:27,048 - ip_reader - INFO - IPv6 network 2405:3200:101:63::/64 - sampling first 32 IPs +2025-07-25 17:16:27,048 - ip_reader - INFO - IPv6 network 2405:4800:a601::/64 - sampling first 32 IPs +2025-07-25 17:16:27,048 - ip_reader - INFO - IPv6 network 2407:2440:10:255::/64 - sampling first 32 IPs +2025-07-25 17:16:27,048 - ip_reader - INFO - IPv6 network 240d:c040:1::/64 - sampling first 32 IPs +2025-07-25 17:16:27,049 - ip_reader - INFO - IPv6 network 2602:fa80:10:2::/63 - sampling first 32 IPs +2025-07-25 17:16:27,049 - ip_reader - INFO - IPv6 network 2602:ffe4:c02:1001::/64 - sampling first 32 IPs +2025-07-25 17:16:27,049 - ip_reader - INFO - IPv6 network 2602:ffe4:c02:100c::/63 - sampling first 32 IPs +2025-07-25 17:16:27,049 - ip_reader - INFO - IPv6 network 2602:ffe4:c12:105::/64 - sampling first 32 IPs +2025-07-25 17:16:27,049 - ip_reader - INFO - IPv6 network 2602:ffe4:c15:124::/64 - sampling first 32 IPs +2025-07-25 17:16:27,049 - ip_reader - INFO - IPv6 network 2602:ffe4:c18:c201::/64 - sampling first 32 IPs +2025-07-25 17:16:27,049 - ip_reader - INFO - IPv6 network 2602:ffe4:c18:c202::/63 - sampling first 32 IPs +2025-07-25 17:16:27,049 - ip_reader - INFO - IPv6 network 2602:ffe4:c27:1000::/64 - sampling first 32 IPs +2025-07-25 17:16:27,049 - ip_reader - INFO - IPv6 network 2604:980:4002:2::/64 - sampling first 32 IPs +2025-07-25 17:16:27,049 - ip_reader - INFO - IPv6 network 2604:980:7002:6::/64 - sampling first 32 IPs +2025-07-25 17:16:27,049 - ip_reader - INFO - IPv6 network 2803:2540:f:14::/64 - sampling first 32 IPs +2025-07-25 17:16:27,050 - ip_reader - INFO - IPv6 network 2a00:12f8:3900:13::/64 - sampling first 32 IPs +2025-07-25 17:16:27,050 - ip_reader - INFO - IPv6 network 2a02:b60:2001::/64 - sampling first 32 IPs +2025-07-25 17:16:27,050 - ip_reader - INFO - IPv6 network 2a02:ce0:1:70::/64 - sampling first 32 IPs +2025-07-25 17:16:27,050 - ip_reader - INFO - IPv6 network 2a05:45c7:1:1018::/64 - sampling first 32 IPs +2025-07-25 17:16:27,050 - ip_reader - INFO - Loaded 286224 IPs for edgeone from ip_lists/edgeone.txt +2025-07-25 17:16:27,050 - ip_reader - INFO - Loaded 3 IPs for esa from ip_lists/esa.txt +2025-07-25 17:16:27,050 - ip_reader - INFO - Loaded 3 IPs for fastly from ip_lists/fastly.txt +2025-07-25 17:16:27,050 - ip_reader - INFO - Loaded 3 IPs for cloudflare from ip_lists/cloudflare.txt +2025-07-25 17:16:27,050 - ip_reader - INFO - Loaded total of 286233 IPs across 4 providers +2025-07-25 17:16:27,050 - bestcdn - INFO - Starting accessibility tests... +2025-07-25 17:16:27,054 - accessibility_tester - INFO - Starting high-performance IP accessibility testing +2025-07-25 17:16:27,113 - accessibility_tester - INFO - Testing 286233 IPs across 4 providers +2025-07-25 17:16:27,113 - accessibility_tester - INFO - Processing batch 1/287 (1000 IPs) +2025-07-25 17:16:32,120 - accessibility_tester - INFO - Batch 1 completed: 8/1000 accessible +2025-07-25 17:16:32,120 - accessibility_tester - INFO - Processing batch 2/287 (1000 IPs) diff --git a/logs/bestcdn_20250726_124107.log b/logs/bestcdn_20250726_124107.log new file mode 100644 index 0000000..acfa72c --- /dev/null +++ b/logs/bestcdn_20250726_124107.log @@ -0,0 +1,365 @@ +2025-07-26 12:41:07,439 - bestcdn - INFO - Logging initialized - Log file: logs/bestcdn_20250726_124107.log +2025-07-26 12:41:07,439 - bestcdn - INFO - Set test domain for cloudflare: test10000.fstring.me +2025-07-26 12:41:07,439 - bestcdn - INFO - Set test domain for fastly: test10000.ix.je +2025-07-26 12:41:07,440 - bestcdn - INFO - Set test domain for edgeone: test10000.ix.je +2025-07-26 12:41:07,440 - bestcdn - INFO - Set test domain for esa: test10000.ix.je +2025-07-26 12:41:07,440 - bestcdn - INFO - Validating setup... +2025-07-26 12:41:07,440 - bestcdn - INFO - Enabled providers: edgeone, esa, fastly, cloudflare +2025-07-26 12:41:07,442 - bestcdn - INFO - edgeone: 1774488 IPs available +2025-07-26 12:41:07,442 - bestcdn - INFO - esa: 3 IPs available +2025-07-26 12:41:07,442 - bestcdn - INFO - fastly: 3 IPs available +2025-07-26 12:41:07,442 - bestcdn - INFO - cloudflare: 3 IPs available +2025-07-26 12:41:07,442 - bestcdn - INFO - Setup validation completed successfully +2025-07-26 12:41:07,442 - bestcdn - INFO - ============================================================ +2025-07-26 12:41:07,442 - bestcdn - INFO - STARTING BESTCDN IP ACCESSIBILITY TEST +2025-07-26 12:41:07,442 - bestcdn - INFO - ============================================================ +2025-07-26 12:41:07,442 - bestcdn - INFO - Loading IP lists... +2025-07-26 12:41:07,535 - ip_reader - WARNING - Very large IPv4 network 43.174.0.0/15 with 131072 IPs - this may take time +2025-07-26 12:41:07,621 - ip_reader - INFO - IPv6 network 240d:c010::/28 - sampling first 32 IPs +2025-07-26 12:41:07,621 - ip_reader - INFO - IPv6 network 2402:4e00:24:10de::/64 - sampling first 32 IPs +2025-07-26 12:41:07,621 - ip_reader - INFO - IPv6 network 2402:4e00:24:10f0::/64 - sampling first 32 IPs +2025-07-26 12:41:07,621 - ip_reader - INFO - IPv6 network 2402:4e00:37:10dd::/64 - sampling first 32 IPs +2025-07-26 12:41:07,621 - ip_reader - INFO - IPv6 network 2402:4e00:37:10de::/63 - sampling first 32 IPs +2025-07-26 12:41:07,621 - ip_reader - INFO - IPv6 network 2402:4e00:37:10e0::/63 - sampling first 32 IPs +2025-07-26 12:41:07,622 - ip_reader - INFO - IPv6 network 2402:4e00:37:10e2::/64 - sampling first 32 IPs +2025-07-26 12:41:07,622 - ip_reader - INFO - IPv6 network 2402:4e00:37:10e4::/62 - sampling first 32 IPs +2025-07-26 12:41:07,622 - ip_reader - INFO - IPv6 network 2402:4e00:37:10e8::/62 - sampling first 32 IPs +2025-07-26 12:41:07,622 - ip_reader - INFO - IPv6 network 2402:4e00:37:10ec::/63 - sampling first 32 IPs +2025-07-26 12:41:07,622 - ip_reader - INFO - IPv6 network 2402:4e00:37:10ef::/64 - sampling first 32 IPs +2025-07-26 12:41:07,622 - ip_reader - INFO - IPv6 network 2402:4e00:37:10f1::/64 - sampling first 32 IPs +2025-07-26 12:41:07,622 - ip_reader - INFO - IPv6 network 2402:4e00:37:10f2::/64 - sampling first 32 IPs +2025-07-26 12:41:07,622 - ip_reader - INFO - IPv6 network 2402:4e00:37:10f4::/62 - sampling first 32 IPs +2025-07-26 12:41:07,622 - ip_reader - INFO - IPv6 network 2402:4e00:37:10fc::/64 - sampling first 32 IPs +2025-07-26 12:41:07,622 - ip_reader - INFO - IPv6 network 2402:4e00:37:10fe::/64 - sampling first 32 IPs +2025-07-26 12:41:07,622 - ip_reader - INFO - IPv6 network 2402:4e00:43:ef::/64 - sampling first 32 IPs +2025-07-26 12:41:07,623 - ip_reader - INFO - IPv6 network 2402:4e00:43:f0::/64 - sampling first 32 IPs +2025-07-26 12:41:07,623 - ip_reader - INFO - IPv6 network 2402:4e00:43:fd::/64 - sampling first 32 IPs +2025-07-26 12:41:07,623 - ip_reader - INFO - IPv6 network 2402:4e00:a2:df::/64 - sampling first 32 IPs +2025-07-26 12:41:07,623 - ip_reader - INFO - IPv6 network 2402:4e00:a2:e4::/63 - sampling first 32 IPs +2025-07-26 12:41:07,623 - ip_reader - INFO - IPv6 network 2402:4e00:a2:e6::/64 - sampling first 32 IPs +2025-07-26 12:41:07,623 - ip_reader - INFO - IPv6 network 2402:4e00:a2:eb::/64 - sampling first 32 IPs +2025-07-26 12:41:07,623 - ip_reader - INFO - IPv6 network 2402:4e00:a2:ec::/64 - sampling first 32 IPs +2025-07-26 12:41:07,623 - ip_reader - INFO - IPv6 network 2402:4e00:a2:ef::/64 - sampling first 32 IPs +2025-07-26 12:41:07,623 - ip_reader - INFO - IPv6 network 2402:4e00:a2:f1::/64 - sampling first 32 IPs +2025-07-26 12:41:07,623 - ip_reader - INFO - IPv6 network 2402:4e00:a2:f5::/64 - sampling first 32 IPs +2025-07-26 12:41:07,624 - ip_reader - INFO - IPv6 network 2402:4e00:a2:f8::/63 - sampling first 32 IPs +2025-07-26 12:41:07,624 - ip_reader - INFO - IPv6 network 2402:4e00:a2:ff::/64 - sampling first 32 IPs +2025-07-26 12:41:07,624 - ip_reader - INFO - IPv6 network 2402:4e00:c010:4::/64 - sampling first 32 IPs +2025-07-26 12:41:07,624 - ip_reader - INFO - IPv6 network 2402:4e00:c031:7fc::/63 - sampling first 32 IPs +2025-07-26 12:41:07,624 - ip_reader - INFO - IPv6 network 2402:4e00:c031:7fe::/64 - sampling first 32 IPs +2025-07-26 12:41:07,624 - ip_reader - INFO - IPv6 network 2402:4e00:c042:300::/63 - sampling first 32 IPs +2025-07-26 12:41:07,624 - ip_reader - INFO - IPv6 network 2402:4e00:c042:309::/64 - sampling first 32 IPs +2025-07-26 12:41:07,624 - ip_reader - INFO - IPv6 network 2402:4e00:c042:310::/64 - sampling first 32 IPs +2025-07-26 12:41:07,624 - ip_reader - INFO - IPv6 network 2402:4e00:c050:13::/64 - sampling first 32 IPs +2025-07-26 12:41:07,624 - ip_reader - INFO - IPv6 network 2402:4e00:c050:1a::/63 - sampling first 32 IPs +2025-07-26 12:41:07,624 - ip_reader - INFO - IPv6 network 2402:4e00:c050:1c::/63 - sampling first 32 IPs +2025-07-26 12:41:07,625 - ip_reader - INFO - IPv6 network 2402:4e00:c050:2c::/63 - sampling first 32 IPs +2025-07-26 12:41:07,625 - ip_reader - INFO - IPv6 network 2402:4e00:c050:4c::/64 - sampling first 32 IPs +2025-07-26 12:41:07,625 - ip_reader - INFO - IPv6 network 2402:4e00:c050:8::/64 - sampling first 32 IPs +2025-07-26 12:41:07,625 - ip_reader - INFO - IPv6 network 2402:4e00:c050::/64 - sampling first 32 IPs +2025-07-26 12:41:07,625 - ip_reader - INFO - IPv6 network 2402:4e00:c050:b::/64 - sampling first 32 IPs +2025-07-26 12:41:07,625 - ip_reader - INFO - IPv6 network 2402:4e00:c050:c::/63 - sampling first 32 IPs +2025-07-26 12:41:07,625 - ip_reader - INFO - IPv6 network 2402:4e00:c050:e::/64 - sampling first 32 IPs +2025-07-26 12:41:07,625 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10d1::/64 - sampling first 32 IPs +2025-07-26 12:41:07,625 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10d6::/64 - sampling first 32 IPs +2025-07-26 12:41:07,625 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10ef::/64 - sampling first 32 IPs +2025-07-26 12:41:07,626 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10f1::/64 - sampling first 32 IPs +2025-07-26 12:41:07,626 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10f2::/63 - sampling first 32 IPs +2025-07-26 12:41:07,626 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10f6::/63 - sampling first 32 IPs +2025-07-26 12:41:07,626 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10fa::/64 - sampling first 32 IPs +2025-07-26 12:41:07,626 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10fd::/64 - sampling first 32 IPs +2025-07-26 12:41:07,626 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10ff::/64 - sampling first 32 IPs +2025-07-26 12:41:07,626 - ip_reader - INFO - IPv6 network 2408:862a:240:2::/64 - sampling first 32 IPs +2025-07-26 12:41:07,626 - ip_reader - INFO - IPv6 network 2408:8670:3af0:32::/64 - sampling first 32 IPs +2025-07-26 12:41:07,627 - ip_reader - INFO - IPv6 network 2408:8706:0:400::/64 - sampling first 32 IPs +2025-07-26 12:41:07,627 - ip_reader - INFO - IPv6 network 2408:8706:2:300d::/64 - sampling first 32 IPs +2025-07-26 12:41:07,627 - ip_reader - INFO - IPv6 network 2408:8706:2:300e::/64 - sampling first 32 IPs +2025-07-26 12:41:07,627 - ip_reader - INFO - IPv6 network 2408:870c:1020:11::/64 - sampling first 32 IPs +2025-07-26 12:41:07,627 - ip_reader - INFO - IPv6 network 2408:8710:20:11a0::/63 - sampling first 32 IPs +2025-07-26 12:41:07,627 - ip_reader - INFO - IPv6 network 2408:8719:1100:91::/64 - sampling first 32 IPs +2025-07-26 12:41:07,627 - ip_reader - INFO - IPv6 network 2408:8719:1100:92::/63 - sampling first 32 IPs +2025-07-26 12:41:07,627 - ip_reader - INFO - IPv6 network 2408:8719:1100:94::/63 - sampling first 32 IPs +2025-07-26 12:41:07,628 - ip_reader - INFO - IPv6 network 2408:8719:1100:96::/64 - sampling first 32 IPs +2025-07-26 12:41:07,628 - ip_reader - INFO - IPv6 network 2408:8719:40e:39::/64 - sampling first 32 IPs +2025-07-26 12:41:07,628 - ip_reader - INFO - IPv6 network 2408:8719:40e:3a::/63 - sampling first 32 IPs +2025-07-26 12:41:07,628 - ip_reader - INFO - IPv6 network 2408:8719:40e:3c::/64 - sampling first 32 IPs +2025-07-26 12:41:07,628 - ip_reader - INFO - IPv6 network 2408:8719:40f:18::/64 - sampling first 32 IPs +2025-07-26 12:41:07,628 - ip_reader - INFO - IPv6 network 2408:871a:5100:140::/64 - sampling first 32 IPs +2025-07-26 12:41:07,628 - ip_reader - INFO - IPv6 network 2408:8720:806:300::/64 - sampling first 32 IPs +2025-07-26 12:41:07,628 - ip_reader - INFO - IPv6 network 2408:8726:1001:111::/64 - sampling first 32 IPs +2025-07-26 12:41:07,628 - ip_reader - INFO - IPv6 network 2408:8726:1001:112::/63 - sampling first 32 IPs +2025-07-26 12:41:07,628 - ip_reader - INFO - IPv6 network 2408:8726:1001:114::/64 - sampling first 32 IPs +2025-07-26 12:41:07,629 - ip_reader - INFO - IPv6 network 2408:8726:1001:116::/63 - sampling first 32 IPs +2025-07-26 12:41:07,629 - ip_reader - INFO - IPv6 network 2408:872f:20:210::/63 - sampling first 32 IPs +2025-07-26 12:41:07,629 - ip_reader - INFO - IPv6 network 2408:8734:4012:1::/64 - sampling first 32 IPs +2025-07-26 12:41:07,629 - ip_reader - INFO - IPv6 network 2408:8734:4012:2::/64 - sampling first 32 IPs +2025-07-26 12:41:07,629 - ip_reader - INFO - IPv6 network 2408:8734:4012:4::/64 - sampling first 32 IPs +2025-07-26 12:41:07,629 - ip_reader - INFO - IPv6 network 2408:8738:b000:1c::/64 - sampling first 32 IPs +2025-07-26 12:41:07,629 - ip_reader - INFO - IPv6 network 2408:873c:5011::/64 - sampling first 32 IPs +2025-07-26 12:41:07,629 - ip_reader - INFO - IPv6 network 2408:873c:5811:78::/64 - sampling first 32 IPs +2025-07-26 12:41:07,629 - ip_reader - INFO - IPv6 network 2408:873c:5811:a3::/64 - sampling first 32 IPs +2025-07-26 12:41:07,629 - ip_reader - INFO - IPv6 network 2408:873c:5811:ae::/64 - sampling first 32 IPs +2025-07-26 12:41:07,629 - ip_reader - INFO - IPv6 network 2408:873d:2011:41::/64 - sampling first 32 IPs +2025-07-26 12:41:07,630 - ip_reader - INFO - IPv6 network 2408:873d:2011:43::/64 - sampling first 32 IPs +2025-07-26 12:41:07,630 - ip_reader - INFO - IPv6 network 2408:873d:2011:44::/63 - sampling first 32 IPs +2025-07-26 12:41:07,630 - ip_reader - INFO - IPv6 network 2408:873d:2011:47::/64 - sampling first 32 IPs +2025-07-26 12:41:07,630 - ip_reader - INFO - IPv6 network 2408:873d:2011:49::/64 - sampling first 32 IPs +2025-07-26 12:41:07,630 - ip_reader - INFO - IPv6 network 2408:8740:d1fe:52::/63 - sampling first 32 IPs +2025-07-26 12:41:07,630 - ip_reader - INFO - IPv6 network 2408:8740:d1fe:54::/62 - sampling first 32 IPs +2025-07-26 12:41:07,630 - ip_reader - INFO - IPv6 network 2408:8740:d1fe:58::/63 - sampling first 32 IPs +2025-07-26 12:41:07,630 - ip_reader - INFO - IPv6 network 2408:8744:d05:11::/64 - sampling first 32 IPs +2025-07-26 12:41:07,630 - ip_reader - INFO - IPv6 network 2408:8744:d05:12::/64 - sampling first 32 IPs +2025-07-26 12:41:07,630 - ip_reader - INFO - IPv6 network 2408:8748:a100:33::/64 - sampling first 32 IPs +2025-07-26 12:41:07,631 - ip_reader - INFO - IPv6 network 2408:8748:a100:34::/63 - sampling first 32 IPs +2025-07-26 12:41:07,631 - ip_reader - INFO - IPv6 network 2408:8748:a100:36::/64 - sampling first 32 IPs +2025-07-26 12:41:07,631 - ip_reader - INFO - IPv6 network 2408:8748:a102:3041::/64 - sampling first 32 IPs +2025-07-26 12:41:07,631 - ip_reader - INFO - IPv6 network 2408:8748:a102:3042::/63 - sampling first 32 IPs +2025-07-26 12:41:07,631 - ip_reader - INFO - IPv6 network 2408:8748:a102:3044::/62 - sampling first 32 IPs +2025-07-26 12:41:07,631 - ip_reader - INFO - IPv6 network 2408:8748:a102:3048::/63 - sampling first 32 IPs +2025-07-26 12:41:07,631 - ip_reader - INFO - IPv6 network 2408:8749:c110:800::/64 - sampling first 32 IPs +2025-07-26 12:41:07,631 - ip_reader - INFO - IPv6 network 2408:874c:1ff:80::/64 - sampling first 32 IPs +2025-07-26 12:41:07,631 - ip_reader - INFO - IPv6 network 2408:874c:1ff:82::/63 - sampling first 32 IPs +2025-07-26 12:41:07,631 - ip_reader - INFO - IPv6 network 2408:874c:1ff:84::/62 - sampling first 32 IPs +2025-07-26 12:41:07,632 - ip_reader - INFO - IPv6 network 2408:874c:1ff:88::/64 - sampling first 32 IPs +2025-07-26 12:41:07,632 - ip_reader - INFO - IPv6 network 2408:874d:a00:b::/64 - sampling first 32 IPs +2025-07-26 12:41:07,632 - ip_reader - INFO - IPv6 network 2408:874d:a00:c::/64 - sampling first 32 IPs +2025-07-26 12:41:07,632 - ip_reader - INFO - IPv6 network 2408:874f:3001:310::/64 - sampling first 32 IPs +2025-07-26 12:41:07,632 - ip_reader - INFO - IPv6 network 2408:8752:e00:80::/63 - sampling first 32 IPs +2025-07-26 12:41:07,632 - ip_reader - INFO - IPv6 network 2408:8752:e00:b0::/61 - sampling first 32 IPs +2025-07-26 12:41:07,632 - ip_reader - INFO - IPv6 network 2408:8752:e00:b8::/64 - sampling first 32 IPs +2025-07-26 12:41:07,632 - ip_reader - INFO - IPv6 network 2408:8756:2cff:e401::/64 - sampling first 32 IPs +2025-07-26 12:41:07,632 - ip_reader - INFO - IPv6 network 2408:8756:2cff:e402::/63 - sampling first 32 IPs +2025-07-26 12:41:07,632 - ip_reader - INFO - IPv6 network 2408:8756:2cff:e404::/64 - sampling first 32 IPs +2025-07-26 12:41:07,632 - ip_reader - INFO - IPv6 network 2408:8756:4cff:d602::/63 - sampling first 32 IPs +2025-07-26 12:41:07,633 - ip_reader - INFO - IPv6 network 2408:8756:4cff:d604::/64 - sampling first 32 IPs +2025-07-26 12:41:07,633 - ip_reader - INFO - IPv6 network 2408:8756:4cff:d606::/63 - sampling first 32 IPs +2025-07-26 12:41:07,633 - ip_reader - INFO - IPv6 network 2408:8756:4cff:d608::/63 - sampling first 32 IPs +2025-07-26 12:41:07,633 - ip_reader - INFO - IPv6 network 2408:8756:d0fb:16c::/64 - sampling first 32 IPs +2025-07-26 12:41:07,633 - ip_reader - INFO - IPv6 network 2408:8756:d0fb:170::/64 - sampling first 32 IPs +2025-07-26 12:41:07,633 - ip_reader - INFO - IPv6 network 2408:875c:0:80::/63 - sampling first 32 IPs +2025-07-26 12:41:07,633 - ip_reader - INFO - IPv6 network 2408:8760:119:4::/63 - sampling first 32 IPs +2025-07-26 12:41:07,633 - ip_reader - INFO - IPv6 network 2408:8764:22:1f::/64 - sampling first 32 IPs +2025-07-26 12:41:07,633 - ip_reader - INFO - IPv6 network 2408:8766:0:101c::/64 - sampling first 32 IPs +2025-07-26 12:41:07,633 - ip_reader - INFO - IPv6 network 2408:876a:1000:22::/64 - sampling first 32 IPs +2025-07-26 12:41:07,634 - ip_reader - INFO - IPv6 network 2408:876a:1000:24::/64 - sampling first 32 IPs +2025-07-26 12:41:07,634 - ip_reader - INFO - IPv6 network 2408:876c:1780:122::/64 - sampling first 32 IPs +2025-07-26 12:41:07,634 - ip_reader - INFO - IPv6 network 2408:8770:0:d1::/64 - sampling first 32 IPs +2025-07-26 12:41:07,634 - ip_reader - INFO - IPv6 network 2408:8770:0:d2::/64 - sampling first 32 IPs +2025-07-26 12:41:07,634 - ip_reader - INFO - IPv6 network 2408:8770:0:d6::/63 - sampling first 32 IPs +2025-07-26 12:41:07,634 - ip_reader - INFO - IPv6 network 2408:8770:0:d8::/64 - sampling first 32 IPs +2025-07-26 12:41:07,634 - ip_reader - INFO - IPv6 network 2408:8776:1:c::/64 - sampling first 32 IPs +2025-07-26 12:41:07,634 - ip_reader - INFO - IPv6 network 2408:8779:c001:3::/64 - sampling first 32 IPs +2025-07-26 12:41:07,634 - ip_reader - INFO - IPv6 network 2408:877a:2000:f::/64 - sampling first 32 IPs +2025-07-26 12:41:07,634 - ip_reader - INFO - IPv6 network 2409:8702:489c::/64 - sampling first 32 IPs +2025-07-26 12:41:07,635 - ip_reader - INFO - IPv6 network 2409:875e:5088:c1::/64 - sampling first 32 IPs +2025-07-26 12:41:07,635 - ip_reader - INFO - IPv6 network 2409:8c04:110e:4001::/64 - sampling first 32 IPs +2025-07-26 12:41:07,635 - ip_reader - INFO - IPv6 network 2409:8c0c:310:21d::/64 - sampling first 32 IPs +2025-07-26 12:41:07,635 - ip_reader - INFO - IPv6 network 2409:8c0c:310:21e::/63 - sampling first 32 IPs +2025-07-26 12:41:07,635 - ip_reader - INFO - IPv6 network 2409:8c0c:310:220::/64 - sampling first 32 IPs +2025-07-26 12:41:07,635 - ip_reader - INFO - IPv6 network 2409:8c0c:310:222::/63 - sampling first 32 IPs +2025-07-26 12:41:07,635 - ip_reader - INFO - IPv6 network 2409:8c10:c00:1404::/64 - sampling first 32 IPs +2025-07-26 12:41:07,635 - ip_reader - INFO - IPv6 network 2409:8c10:c00:68::/64 - sampling first 32 IPs +2025-07-26 12:41:07,635 - ip_reader - INFO - IPv6 network 2409:8c14:f2c:1001::/64 - sampling first 32 IPs +2025-07-26 12:41:07,635 - ip_reader - INFO - IPv6 network 2409:8c1c:300:17::/64 - sampling first 32 IPs +2025-07-26 12:41:07,636 - ip_reader - INFO - IPv6 network 2409:8c1e:68e0:a08::/64 - sampling first 32 IPs +2025-07-26 12:41:07,636 - ip_reader - INFO - IPv6 network 2409:8c1e:8f80:2::/64 - sampling first 32 IPs +2025-07-26 12:41:07,636 - ip_reader - INFO - IPv6 network 2409:8c20:1834:461::/64 - sampling first 32 IPs +2025-07-26 12:41:07,636 - ip_reader - INFO - IPv6 network 2409:8c20:1834:463::/64 - sampling first 32 IPs +2025-07-26 12:41:07,636 - ip_reader - INFO - IPv6 network 2409:8c20:1834:464::/63 - sampling first 32 IPs +2025-07-26 12:41:07,636 - ip_reader - INFO - IPv6 network 2409:8c20:1834:467::/64 - sampling first 32 IPs +2025-07-26 12:41:07,636 - ip_reader - INFO - IPv6 network 2409:8c20:1834:469::/64 - sampling first 32 IPs +2025-07-26 12:41:07,636 - ip_reader - INFO - IPv6 network 2409:8c20:5021:160::/64 - sampling first 32 IPs +2025-07-26 12:41:07,636 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1dd::/64 - sampling first 32 IPs +2025-07-26 12:41:07,636 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1de::/63 - sampling first 32 IPs +2025-07-26 12:41:07,636 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1e1::/64 - sampling first 32 IPs +2025-07-26 12:41:07,637 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1e2::/63 - sampling first 32 IPs +2025-07-26 12:41:07,637 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1e4::/64 - sampling first 32 IPs +2025-07-26 12:41:07,637 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1e6::/64 - sampling first 32 IPs +2025-07-26 12:41:07,637 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1e8::/64 - sampling first 32 IPs +2025-07-26 12:41:07,637 - ip_reader - INFO - IPv6 network 2409:8c20:b281:19::/64 - sampling first 32 IPs +2025-07-26 12:41:07,637 - ip_reader - INFO - IPv6 network 2409:8c28:203:308::/64 - sampling first 32 IPs +2025-07-26 12:41:07,637 - ip_reader - INFO - IPv6 network 2409:8c28:203:34::/64 - sampling first 32 IPs +2025-07-26 12:41:07,637 - ip_reader - INFO - IPv6 network 2409:8c28:2808:11::/64 - sampling first 32 IPs +2025-07-26 12:41:07,637 - ip_reader - INFO - IPv6 network 2409:8c28:2808:12::/63 - sampling first 32 IPs +2025-07-26 12:41:07,637 - ip_reader - INFO - IPv6 network 2409:8c28:2808:14::/63 - sampling first 32 IPs +2025-07-26 12:41:07,638 - ip_reader - INFO - IPv6 network 2409:8c28:2808:d::/64 - sampling first 32 IPs +2025-07-26 12:41:07,638 - ip_reader - INFO - IPv6 network 2409:8c28:2808:e::/63 - sampling first 32 IPs +2025-07-26 12:41:07,638 - ip_reader - INFO - IPv6 network 2409:8c30:1000:20::/64 - sampling first 32 IPs +2025-07-26 12:41:07,638 - ip_reader - INFO - IPv6 network 2409:8c34:2220:30a::/64 - sampling first 32 IPs +2025-07-26 12:41:07,638 - ip_reader - INFO - IPv6 network 2409:8c34:e00:41::/64 - sampling first 32 IPs +2025-07-26 12:41:07,638 - ip_reader - INFO - IPv6 network 2409:8c34:e00:42::/63 - sampling first 32 IPs +2025-07-26 12:41:07,638 - ip_reader - INFO - IPv6 network 2409:8c34:e00:44::/62 - sampling first 32 IPs +2025-07-26 12:41:07,638 - ip_reader - INFO - IPv6 network 2409:8c34:e00:48::/63 - sampling first 32 IPs +2025-07-26 12:41:07,638 - ip_reader - INFO - IPv6 network 2409:8c38:80:1c0::/64 - sampling first 32 IPs +2025-07-26 12:41:07,638 - ip_reader - INFO - IPv6 network 2409:8c38:80:1c2::/63 - sampling first 32 IPs +2025-07-26 12:41:07,639 - ip_reader - INFO - IPv6 network 2409:8c38:80:1c4::/62 - sampling first 32 IPs +2025-07-26 12:41:07,639 - ip_reader - INFO - IPv6 network 2409:8c38:80:1c8::/64 - sampling first 32 IPs +2025-07-26 12:41:07,639 - ip_reader - INFO - IPv6 network 2409:8c38:80:1f1::/64 - sampling first 32 IPs +2025-07-26 12:41:07,639 - ip_reader - INFO - IPv6 network 2409:8c38:80:1f2::/63 - sampling first 32 IPs +2025-07-26 12:41:07,639 - ip_reader - INFO - IPv6 network 2409:8c38:80:1f4::/64 - sampling first 32 IPs +2025-07-26 12:41:07,639 - ip_reader - INFO - IPv6 network 2409:8c3c:1300:306::/64 - sampling first 32 IPs +2025-07-26 12:41:07,639 - ip_reader - INFO - IPv6 network 2409:8c3c:900:1a1::/64 - sampling first 32 IPs +2025-07-26 12:41:07,639 - ip_reader - INFO - IPv6 network 2409:8c3c:900:1a2::/63 - sampling first 32 IPs +2025-07-26 12:41:07,639 - ip_reader - INFO - IPv6 network 2409:8c3c:900:1a4::/64 - sampling first 32 IPs +2025-07-26 12:41:07,639 - ip_reader - INFO - IPv6 network 2409:8c44:b00:4ec::/64 - sampling first 32 IPs +2025-07-26 12:41:07,640 - ip_reader - INFO - IPv6 network 2409:8c4c:e00:2011::/64 - sampling first 32 IPs +2025-07-26 12:41:07,640 - ip_reader - INFO - IPv6 network 2409:8c4c:e00:2012::/63 - sampling first 32 IPs +2025-07-26 12:41:07,640 - ip_reader - INFO - IPv6 network 2409:8c4c:e00:2014::/64 - sampling first 32 IPs +2025-07-26 12:41:07,640 - ip_reader - INFO - IPv6 network 2409:8c50:a00:2061::/64 - sampling first 32 IPs +2025-07-26 12:41:07,640 - ip_reader - INFO - IPv6 network 2409:8c50:a00:2170::/61 - sampling first 32 IPs +2025-07-26 12:41:07,640 - ip_reader - INFO - IPv6 network 2409:8c50:a00:2178::/64 - sampling first 32 IPs +2025-07-26 12:41:07,640 - ip_reader - INFO - IPv6 network 2409:8c50:a00:2252::/63 - sampling first 32 IPs +2025-07-26 12:41:07,640 - ip_reader - INFO - IPv6 network 2409:8c50:a00:2254::/64 - sampling first 32 IPs +2025-07-26 12:41:07,640 - ip_reader - INFO - IPv6 network 2409:8c54:1801:21::/64 - sampling first 32 IPs +2025-07-26 12:41:07,640 - ip_reader - INFO - IPv6 network 2409:8c54:1801:22::/63 - sampling first 32 IPs +2025-07-26 12:41:07,640 - ip_reader - INFO - IPv6 network 2409:8c54:1801:24::/64 - sampling first 32 IPs +2025-07-26 12:41:07,641 - ip_reader - INFO - IPv6 network 2409:8c54:1821:578::/64 - sampling first 32 IPs +2025-07-26 12:41:07,641 - ip_reader - INFO - IPv6 network 2409:8c54:2030:222::/63 - sampling first 32 IPs +2025-07-26 12:41:07,641 - ip_reader - INFO - IPv6 network 2409:8c54:2030:224::/64 - sampling first 32 IPs +2025-07-26 12:41:07,641 - ip_reader - INFO - IPv6 network 2409:8c54:2030:226::/63 - sampling first 32 IPs +2025-07-26 12:41:07,641 - ip_reader - INFO - IPv6 network 2409:8c54:2030:228::/63 - sampling first 32 IPs +2025-07-26 12:41:07,641 - ip_reader - INFO - IPv6 network 2409:8c5c:110:50::/64 - sampling first 32 IPs +2025-07-26 12:41:07,641 - ip_reader - INFO - IPv6 network 2409:8c5e:5000:c2::/64 - sampling first 32 IPs +2025-07-26 12:41:07,641 - ip_reader - INFO - IPv6 network 2409:8c60:2500:5d::/64 - sampling first 32 IPs +2025-07-26 12:41:07,641 - ip_reader - INFO - IPv6 network 2409:8c62:e10:218::/64 - sampling first 32 IPs +2025-07-26 12:41:07,641 - ip_reader - INFO - IPv6 network 2409:8c6a:b021:74::/64 - sampling first 32 IPs +2025-07-26 12:41:07,642 - ip_reader - INFO - IPv6 network 2409:8c6c:561:8110::/62 - sampling first 32 IPs +2025-07-26 12:41:07,642 - ip_reader - INFO - IPv6 network 2409:8c70:3a10:16::/64 - sampling first 32 IPs +2025-07-26 12:41:07,642 - ip_reader - INFO - IPv6 network 2409:8c70:3a91:51::/64 - sampling first 32 IPs +2025-07-26 12:41:07,642 - ip_reader - INFO - IPv6 network 2409:8c70:3a91:52::/64 - sampling first 32 IPs +2025-07-26 12:41:07,642 - ip_reader - INFO - IPv6 network 2409:8c70:3a91:56::/63 - sampling first 32 IPs +2025-07-26 12:41:07,642 - ip_reader - INFO - IPv6 network 2409:8c70:3a91:58::/64 - sampling first 32 IPs +2025-07-26 12:41:07,642 - ip_reader - INFO - IPv6 network 2409:8c74:f100:864::/64 - sampling first 32 IPs +2025-07-26 12:41:07,642 - ip_reader - INFO - IPv6 network 2409:8c78:100:24::/64 - sampling first 32 IPs +2025-07-26 12:41:07,642 - ip_reader - INFO - IPv6 network 2409:8c7a:2604::/64 - sampling first 32 IPs +2025-07-26 12:41:07,643 - ip_reader - INFO - IPv6 network 240e:90d:1101:4508::/64 - sampling first 32 IPs +2025-07-26 12:41:07,643 - ip_reader - INFO - IPv6 network 240e:90d:1101:4510::/64 - sampling first 32 IPs +2025-07-26 12:41:07,643 - ip_reader - INFO - IPv6 network 240e:910:e000:2504::/64 - sampling first 32 IPs +2025-07-26 12:41:07,643 - ip_reader - INFO - IPv6 network 240e:914:5009:1002::/63 - sampling first 32 IPs +2025-07-26 12:41:07,643 - ip_reader - INFO - IPv6 network 240e:914:5009:a::/63 - sampling first 32 IPs +2025-07-26 12:41:07,643 - ip_reader - INFO - IPv6 network 240e:925:2:701::/64 - sampling first 32 IPs +2025-07-26 12:41:07,643 - ip_reader - INFO - IPv6 network 240e:925:2:702::/63 - sampling first 32 IPs +2025-07-26 12:41:07,643 - ip_reader - INFO - IPv6 network 240e:925:2:704::/64 - sampling first 32 IPs +2025-07-26 12:41:07,643 - ip_reader - INFO - IPv6 network 240e:925:2:706::/63 - sampling first 32 IPs +2025-07-26 12:41:07,643 - ip_reader - INFO - IPv6 network 240e:926:3004:21::/64 - sampling first 32 IPs +2025-07-26 12:41:07,644 - ip_reader - INFO - IPv6 network 240e:930:c200:70::/63 - sampling first 32 IPs +2025-07-26 12:41:07,644 - ip_reader - INFO - IPv6 network 240e:935:a04:2708::/64 - sampling first 32 IPs +2025-07-26 12:41:07,644 - ip_reader - INFO - IPv6 network 240e:93c:1201:2::/63 - sampling first 32 IPs +2025-07-26 12:41:07,644 - ip_reader - INFO - IPv6 network 240e:93c:1201:4::/64 - sampling first 32 IPs +2025-07-26 12:41:07,644 - ip_reader - INFO - IPv6 network 240e:93c:1201:d::/64 - sampling first 32 IPs +2025-07-26 12:41:07,644 - ip_reader - INFO - IPv6 network 240e:940:20c:308::/64 - sampling first 32 IPs +2025-07-26 12:41:07,644 - ip_reader - INFO - IPv6 network 240e:946:3000:8008::/63 - sampling first 32 IPs +2025-07-26 12:41:07,644 - ip_reader - INFO - IPv6 network 240e:94a:b01:214::/63 - sampling first 32 IPs +2025-07-26 12:41:07,644 - ip_reader - INFO - IPv6 network 240e:94c:0:2701::/64 - sampling first 32 IPs +2025-07-26 12:41:07,644 - ip_reader - INFO - IPv6 network 240e:94c:0:2702::/63 - sampling first 32 IPs +2025-07-26 12:41:07,645 - ip_reader - INFO - IPv6 network 240e:94c:0:2704::/64 - sampling first 32 IPs +2025-07-26 12:41:07,645 - ip_reader - INFO - IPv6 network 240e:950:1:2002::/64 - sampling first 32 IPs +2025-07-26 12:41:07,645 - ip_reader - INFO - IPv6 network 240e:958:2300:220::/64 - sampling first 32 IPs +2025-07-26 12:41:07,645 - ip_reader - INFO - IPv6 network 240e:958:6003:108::/64 - sampling first 32 IPs +2025-07-26 12:41:07,645 - ip_reader - INFO - IPv6 network 240e:95e:4001:1::/64 - sampling first 32 IPs +2025-07-26 12:41:07,645 - ip_reader - INFO - IPv6 network 240e:95e:4001:2::/63 - sampling first 32 IPs +2025-07-26 12:41:07,645 - ip_reader - INFO - IPv6 network 240e:95e:4001:4::/64 - sampling first 32 IPs +2025-07-26 12:41:07,645 - ip_reader - INFO - IPv6 network 240e:960:200:90::/64 - sampling first 32 IPs +2025-07-26 12:41:07,645 - ip_reader - INFO - IPv6 network 240e:960:200:92::/63 - sampling first 32 IPs +2025-07-26 12:41:07,645 - ip_reader - INFO - IPv6 network 240e:960:200:94::/62 - sampling first 32 IPs +2025-07-26 12:41:07,646 - ip_reader - INFO - IPv6 network 240e:960:200:98::/64 - sampling first 32 IPs +2025-07-26 12:41:07,646 - ip_reader - INFO - IPv6 network 240e:964:5002:109::/64 - sampling first 32 IPs +2025-07-26 12:41:07,646 - ip_reader - INFO - IPv6 network 240e:964:5002:10a::/63 - sampling first 32 IPs +2025-07-26 12:41:07,646 - ip_reader - INFO - IPv6 network 240e:964:5002:10c::/64 - sampling first 32 IPs +2025-07-26 12:41:07,646 - ip_reader - INFO - IPv6 network 240e:965:802:b01::/64 - sampling first 32 IPs +2025-07-26 12:41:07,646 - ip_reader - INFO - IPv6 network 240e:965:802:b02::/63 - sampling first 32 IPs +2025-07-26 12:41:07,646 - ip_reader - INFO - IPv6 network 240e:965:802:b04::/62 - sampling first 32 IPs +2025-07-26 12:41:07,646 - ip_reader - INFO - IPv6 network 240e:965:802:b08::/63 - sampling first 32 IPs +2025-07-26 12:41:07,646 - ip_reader - INFO - IPv6 network 240e:96c:6400:a00::/64 - sampling first 32 IPs +2025-07-26 12:41:07,646 - ip_reader - INFO - IPv6 network 240e:974:e200:4209::/64 - sampling first 32 IPs +2025-07-26 12:41:07,646 - ip_reader - INFO - IPv6 network 240e:974:e200:420a::/63 - sampling first 32 IPs +2025-07-26 12:41:07,647 - ip_reader - INFO - IPv6 network 240e:974:e200:420c::/63 - sampling first 32 IPs +2025-07-26 12:41:07,647 - ip_reader - INFO - IPv6 network 240e:978:2608:800::/64 - sampling first 32 IPs +2025-07-26 12:41:07,647 - ip_reader - INFO - IPv6 network 240e:978:2903:50a7::/64 - sampling first 32 IPs +2025-07-26 12:41:07,647 - ip_reader - INFO - IPv6 network 240e:978:2903:50a9::/64 - sampling first 32 IPs +2025-07-26 12:41:07,647 - ip_reader - INFO - IPv6 network 240e:978:b34:1::/64 - sampling first 32 IPs +2025-07-26 12:41:07,647 - ip_reader - INFO - IPv6 network 240e:978:d04:2082::/63 - sampling first 32 IPs +2025-07-26 12:41:07,647 - ip_reader - INFO - IPv6 network 240e:978:d04:2085::/64 - sampling first 32 IPs +2025-07-26 12:41:07,647 - ip_reader - INFO - IPv6 network 240e:978:d04:2086::/63 - sampling first 32 IPs +2025-07-26 12:41:07,647 - ip_reader - INFO - IPv6 network 240e:978:d04:2088::/64 - sampling first 32 IPs +2025-07-26 12:41:07,647 - ip_reader - INFO - IPv6 network 240e:978:d04:208b::/64 - sampling first 32 IPs +2025-07-26 12:41:07,648 - ip_reader - INFO - IPv6 network 240e:978:d04:208c::/62 - sampling first 32 IPs +2025-07-26 12:41:07,648 - ip_reader - INFO - IPv6 network 240e:978:d04:2090::/63 - sampling first 32 IPs +2025-07-26 12:41:07,648 - ip_reader - INFO - IPv6 network 240e:979:f07:1::/64 - sampling first 32 IPs +2025-07-26 12:41:07,648 - ip_reader - INFO - IPv6 network 240e:979:f07:3::/64 - sampling first 32 IPs +2025-07-26 12:41:07,648 - ip_reader - INFO - IPv6 network 240e:979:f07:4::/63 - sampling first 32 IPs +2025-07-26 12:41:07,648 - ip_reader - INFO - IPv6 network 240e:979:f07:7::/64 - sampling first 32 IPs +2025-07-26 12:41:07,648 - ip_reader - INFO - IPv6 network 240e:979:f07:9::/64 - sampling first 32 IPs +2025-07-26 12:41:07,648 - ip_reader - INFO - IPv6 network 240e:97c:4040:200::/63 - sampling first 32 IPs +2025-07-26 12:41:07,648 - ip_reader - INFO - IPv6 network 240e:97d:10:25de::/64 - sampling first 32 IPs +2025-07-26 12:41:07,648 - ip_reader - INFO - IPv6 network 240e:97d:10:25e7::/64 - sampling first 32 IPs +2025-07-26 12:41:07,649 - ip_reader - INFO - IPv6 network 240e:97d:2000:b02::/63 - sampling first 32 IPs +2025-07-26 12:41:07,649 - ip_reader - INFO - IPv6 network 240e:97d:2000:b04::/64 - sampling first 32 IPs +2025-07-26 12:41:07,649 - ip_reader - INFO - IPv6 network 240e:97d:2000:b06::/63 - sampling first 32 IPs +2025-07-26 12:41:07,649 - ip_reader - INFO - IPv6 network 240e:97d:2000:b08::/63 - sampling first 32 IPs +2025-07-26 12:41:07,649 - ip_reader - INFO - IPv6 network 240e:980:1200:b14::/63 - sampling first 32 IPs +2025-07-26 12:41:07,649 - ip_reader - INFO - IPv6 network 240e:983:705:2::/64 - sampling first 32 IPs +2025-07-26 12:41:07,649 - ip_reader - INFO - IPv6 network 240e:b1:c808:9::/64 - sampling first 32 IPs +2025-07-26 12:41:07,649 - ip_reader - INFO - IPv6 network 240e:b1:c808:a::/64 - sampling first 32 IPs +2025-07-26 12:41:07,649 - ip_reader - INFO - IPv6 network 240e:b1:c808:c::/63 - sampling first 32 IPs +2025-07-26 12:41:07,649 - ip_reader - INFO - IPv6 network 240e:bf:b800:4131::/64 - sampling first 32 IPs +2025-07-26 12:41:07,650 - ip_reader - INFO - IPv6 network 240e:bf:b800:4132::/64 - sampling first 32 IPs +2025-07-26 12:41:07,650 - ip_reader - INFO - IPv6 network 240e:bf:b800:4136::/63 - sampling first 32 IPs +2025-07-26 12:41:07,650 - ip_reader - INFO - IPv6 network 240e:bf:b800:4138::/64 - sampling first 32 IPs +2025-07-26 12:41:07,650 - ip_reader - INFO - IPv6 network 240e:bf:c800:2915::/64 - sampling first 32 IPs +2025-07-26 12:41:07,650 - ip_reader - INFO - IPv6 network 240e:bf:c800:2916::/64 - sampling first 32 IPs +2025-07-26 12:41:07,650 - ip_reader - INFO - IPv6 network 240e:c2:1800:110::/61 - sampling first 32 IPs +2025-07-26 12:41:07,650 - ip_reader - INFO - IPv6 network 240e:c2:1800:118::/64 - sampling first 32 IPs +2025-07-26 12:41:07,650 - ip_reader - INFO - IPv6 network 240e:c2:1800:ab::/64 - sampling first 32 IPs +2025-07-26 12:41:07,650 - ip_reader - INFO - IPv6 network 240e:c2:1800:ac::/64 - sampling first 32 IPs +2025-07-26 12:41:07,650 - ip_reader - INFO - IPv6 network 240e:c3:2800:205::/64 - sampling first 32 IPs +2025-07-26 12:41:07,651 - ip_reader - INFO - IPv6 network 240e:cd:ff00:118::/64 - sampling first 32 IPs +2025-07-26 12:41:07,651 - ip_reader - INFO - IPv6 network 240e:e9:b00c:33::/64 - sampling first 32 IPs +2025-07-26 12:41:07,651 - ip_reader - INFO - IPv6 network 240e:e9:b00c:34::/63 - sampling first 32 IPs +2025-07-26 12:41:07,651 - ip_reader - INFO - IPv6 network 240e:e9:b00c:36::/64 - sampling first 32 IPs +2025-07-26 12:41:07,651 - ip_reader - INFO - IPv6 network 240e:f7:a070:342::/63 - sampling first 32 IPs +2025-07-26 12:41:07,651 - ip_reader - INFO - IPv6 network 240e:f7:a070:344::/62 - sampling first 32 IPs +2025-07-26 12:41:07,651 - ip_reader - INFO - IPv6 network 240e:f7:a070:348::/63 - sampling first 32 IPs +2025-07-26 12:41:07,651 - ip_reader - INFO - IPv6 network 240e:f7:a070:3c0::/64 - sampling first 32 IPs +2025-07-26 12:41:07,651 - ip_reader - INFO - IPv6 network 240e:f7:ef00:10::/64 - sampling first 32 IPs +2025-07-26 12:41:07,651 - ip_reader - INFO - IPv6 network 2001:df1:7e00:4::/64 - sampling first 32 IPs +2025-07-26 12:41:07,652 - ip_reader - INFO - IPv6 network 2400:adc0:4041::/64 - sampling first 32 IPs +2025-07-26 12:41:07,652 - ip_reader - INFO - IPv6 network 2400:de40::/64 - sampling first 32 IPs +2025-07-26 12:41:07,652 - ip_reader - INFO - IPv6 network 2403:c280:5:1::/64 - sampling first 32 IPs +2025-07-26 12:41:07,652 - ip_reader - INFO - IPv6 network 2404:3100:d:5::/64 - sampling first 32 IPs +2025-07-26 12:41:07,652 - ip_reader - INFO - IPv6 network 2404:a140:3a:1::/64 - sampling first 32 IPs +2025-07-26 12:41:07,652 - ip_reader - INFO - IPv6 network 2404:a140:3e:6::/64 - sampling first 32 IPs +2025-07-26 12:41:07,652 - ip_reader - INFO - IPv6 network 2405:3200:101:63::/64 - sampling first 32 IPs +2025-07-26 12:41:07,652 - ip_reader - INFO - IPv6 network 2405:4800:a601::/64 - sampling first 32 IPs +2025-07-26 12:41:07,652 - ip_reader - INFO - IPv6 network 2407:2440:10:255::/64 - sampling first 32 IPs +2025-07-26 12:41:07,652 - ip_reader - INFO - IPv6 network 240d:c040:1::/64 - sampling first 32 IPs +2025-07-26 12:41:07,653 - ip_reader - INFO - IPv6 network 2602:fa80:10:2::/63 - sampling first 32 IPs +2025-07-26 12:41:07,653 - ip_reader - INFO - IPv6 network 2602:ffe4:c02:1001::/64 - sampling first 32 IPs +2025-07-26 12:41:07,653 - ip_reader - INFO - IPv6 network 2602:ffe4:c02:100c::/63 - sampling first 32 IPs +2025-07-26 12:41:07,653 - ip_reader - INFO - IPv6 network 2602:ffe4:c12:105::/64 - sampling first 32 IPs +2025-07-26 12:41:07,653 - ip_reader - INFO - IPv6 network 2602:ffe4:c15:124::/64 - sampling first 32 IPs +2025-07-26 12:41:07,653 - ip_reader - INFO - IPv6 network 2602:ffe4:c18:c201::/64 - sampling first 32 IPs +2025-07-26 12:41:07,653 - ip_reader - INFO - IPv6 network 2602:ffe4:c18:c202::/63 - sampling first 32 IPs +2025-07-26 12:41:07,653 - ip_reader - INFO - IPv6 network 2602:ffe4:c27:1000::/64 - sampling first 32 IPs +2025-07-26 12:41:07,653 - ip_reader - INFO - IPv6 network 2604:980:4002:2::/64 - sampling first 32 IPs +2025-07-26 12:41:07,653 - ip_reader - INFO - IPv6 network 2604:980:7002:6::/64 - sampling first 32 IPs +2025-07-26 12:41:07,653 - ip_reader - INFO - IPv6 network 2803:2540:f:14::/64 - sampling first 32 IPs +2025-07-26 12:41:07,654 - ip_reader - INFO - IPv6 network 2a00:12f8:3900:13::/64 - sampling first 32 IPs +2025-07-26 12:41:07,654 - ip_reader - INFO - IPv6 network 2a02:b60:2001::/64 - sampling first 32 IPs +2025-07-26 12:41:07,654 - ip_reader - INFO - IPv6 network 2a02:ce0:1:70::/64 - sampling first 32 IPs +2025-07-26 12:41:07,654 - ip_reader - INFO - IPv6 network 2a05:45c7:1:1018::/64 - sampling first 32 IPs +2025-07-26 12:41:07,654 - ip_reader - INFO - Loaded 286224 IPs for edgeone from ip_lists/edgeone.txt +2025-07-26 12:41:07,654 - ip_reader - INFO - Loaded 3 IPs for esa from ip_lists/esa.txt +2025-07-26 12:41:07,654 - ip_reader - INFO - Loaded 3 IPs for fastly from ip_lists/fastly.txt +2025-07-26 12:41:07,654 - ip_reader - INFO - Loaded 3 IPs for cloudflare from ip_lists/cloudflare.txt +2025-07-26 12:41:07,654 - ip_reader - INFO - Loaded total of 286233 IPs across 4 providers +2025-07-26 12:41:07,654 - bestcdn - INFO - Starting accessibility tests... +2025-07-26 12:41:07,658 - accessibility_tester - INFO - Starting high-performance IP accessibility testing +2025-07-26 12:41:07,724 - accessibility_tester - INFO - Testing 286233 IPs across 4 providers +2025-07-26 12:41:07,724 - accessibility_tester - INFO - Processing batch 1/287 (1000 IPs) +2025-07-26 12:41:12,739 - accessibility_tester - INFO - Batch 1 completed: 0/1000 accessible +2025-07-26 12:41:12,739 - accessibility_tester - INFO - Processing batch 2/287 (1000 IPs) +2025-07-26 12:41:17,792 - accessibility_tester - INFO - Batch 2 completed: 0/1000 accessible +2025-07-26 12:41:17,792 - accessibility_tester - INFO - Processing batch 3/287 (1000 IPs) +2025-07-26 12:41:22,843 - accessibility_tester - INFO - Batch 3 completed: 0/1000 accessible +2025-07-26 12:41:22,843 - accessibility_tester - INFO - Processing batch 4/287 (1000 IPs) diff --git a/logs/bestcdn_20250726_124132.log b/logs/bestcdn_20250726_124132.log new file mode 100644 index 0000000..308438d --- /dev/null +++ b/logs/bestcdn_20250726_124132.log @@ -0,0 +1,379 @@ +2025-07-26 12:41:32,469 - bestcdn - INFO - Logging initialized - Log file: logs/bestcdn_20250726_124132.log +2025-07-26 12:41:32,469 - bestcdn - INFO - Set test domain for cloudflare: test10000.fstring.me +2025-07-26 12:41:32,469 - bestcdn - INFO - Set test domain for fastly: test10000.ix.je +2025-07-26 12:41:32,469 - bestcdn - INFO - Set test domain for edgeone: test10000.ix.je +2025-07-26 12:41:32,469 - bestcdn - INFO - Set test domain for esa: test10000.ix.je +2025-07-26 12:41:32,469 - bestcdn - INFO - Validating setup... +2025-07-26 12:41:32,470 - bestcdn - INFO - Enabled providers: edgeone, esa, fastly, cloudflare +2025-07-26 12:41:32,472 - bestcdn - INFO - edgeone: 1774488 IPs available +2025-07-26 12:41:32,472 - bestcdn - INFO - esa: 3 IPs available +2025-07-26 12:41:32,472 - bestcdn - INFO - fastly: 3 IPs available +2025-07-26 12:41:32,472 - bestcdn - INFO - cloudflare: 3 IPs available +2025-07-26 12:41:32,472 - bestcdn - INFO - Setup validation completed successfully +2025-07-26 12:41:32,472 - bestcdn - INFO - ============================================================ +2025-07-26 12:41:32,472 - bestcdn - INFO - STARTING BESTCDN IP ACCESSIBILITY TEST +2025-07-26 12:41:32,472 - bestcdn - INFO - ============================================================ +2025-07-26 12:41:32,472 - bestcdn - INFO - Loading IP lists... +2025-07-26 12:41:32,568 - ip_reader - WARNING - Very large IPv4 network 43.174.0.0/15 with 131072 IPs - this may take time +2025-07-26 12:41:32,660 - ip_reader - INFO - IPv6 network 240d:c010::/28 - sampling first 32 IPs +2025-07-26 12:41:32,660 - ip_reader - INFO - IPv6 network 2402:4e00:24:10de::/64 - sampling first 32 IPs +2025-07-26 12:41:32,660 - ip_reader - INFO - IPv6 network 2402:4e00:24:10f0::/64 - sampling first 32 IPs +2025-07-26 12:41:32,660 - ip_reader - INFO - IPv6 network 2402:4e00:37:10dd::/64 - sampling first 32 IPs +2025-07-26 12:41:32,660 - ip_reader - INFO - IPv6 network 2402:4e00:37:10de::/63 - sampling first 32 IPs +2025-07-26 12:41:32,660 - ip_reader - INFO - IPv6 network 2402:4e00:37:10e0::/63 - sampling first 32 IPs +2025-07-26 12:41:32,660 - ip_reader - INFO - IPv6 network 2402:4e00:37:10e2::/64 - sampling first 32 IPs +2025-07-26 12:41:32,661 - ip_reader - INFO - IPv6 network 2402:4e00:37:10e4::/62 - sampling first 32 IPs +2025-07-26 12:41:32,661 - ip_reader - INFO - IPv6 network 2402:4e00:37:10e8::/62 - sampling first 32 IPs +2025-07-26 12:41:32,661 - ip_reader - INFO - IPv6 network 2402:4e00:37:10ec::/63 - sampling first 32 IPs +2025-07-26 12:41:32,661 - ip_reader - INFO - IPv6 network 2402:4e00:37:10ef::/64 - sampling first 32 IPs +2025-07-26 12:41:32,661 - ip_reader - INFO - IPv6 network 2402:4e00:37:10f1::/64 - sampling first 32 IPs +2025-07-26 12:41:32,661 - ip_reader - INFO - IPv6 network 2402:4e00:37:10f2::/64 - sampling first 32 IPs +2025-07-26 12:41:32,661 - ip_reader - INFO - IPv6 network 2402:4e00:37:10f4::/62 - sampling first 32 IPs +2025-07-26 12:41:32,661 - ip_reader - INFO - IPv6 network 2402:4e00:37:10fc::/64 - sampling first 32 IPs +2025-07-26 12:41:32,661 - ip_reader - INFO - IPv6 network 2402:4e00:37:10fe::/64 - sampling first 32 IPs +2025-07-26 12:41:32,661 - ip_reader - INFO - IPv6 network 2402:4e00:43:ef::/64 - sampling first 32 IPs +2025-07-26 12:41:32,662 - ip_reader - INFO - IPv6 network 2402:4e00:43:f0::/64 - sampling first 32 IPs +2025-07-26 12:41:32,662 - ip_reader - INFO - IPv6 network 2402:4e00:43:fd::/64 - sampling first 32 IPs +2025-07-26 12:41:32,662 - ip_reader - INFO - IPv6 network 2402:4e00:a2:df::/64 - sampling first 32 IPs +2025-07-26 12:41:32,662 - ip_reader - INFO - IPv6 network 2402:4e00:a2:e4::/63 - sampling first 32 IPs +2025-07-26 12:41:32,662 - ip_reader - INFO - IPv6 network 2402:4e00:a2:e6::/64 - sampling first 32 IPs +2025-07-26 12:41:32,662 - ip_reader - INFO - IPv6 network 2402:4e00:a2:eb::/64 - sampling first 32 IPs +2025-07-26 12:41:32,662 - ip_reader - INFO - IPv6 network 2402:4e00:a2:ec::/64 - sampling first 32 IPs +2025-07-26 12:41:32,662 - ip_reader - INFO - IPv6 network 2402:4e00:a2:ef::/64 - sampling first 32 IPs +2025-07-26 12:41:32,662 - ip_reader - INFO - IPv6 network 2402:4e00:a2:f1::/64 - sampling first 32 IPs +2025-07-26 12:41:32,662 - ip_reader - INFO - IPv6 network 2402:4e00:a2:f5::/64 - sampling first 32 IPs +2025-07-26 12:41:32,663 - ip_reader - INFO - IPv6 network 2402:4e00:a2:f8::/63 - sampling first 32 IPs +2025-07-26 12:41:32,663 - ip_reader - INFO - IPv6 network 2402:4e00:a2:ff::/64 - sampling first 32 IPs +2025-07-26 12:41:32,663 - ip_reader - INFO - IPv6 network 2402:4e00:c010:4::/64 - sampling first 32 IPs +2025-07-26 12:41:32,663 - ip_reader - INFO - IPv6 network 2402:4e00:c031:7fc::/63 - sampling first 32 IPs +2025-07-26 12:41:32,663 - ip_reader - INFO - IPv6 network 2402:4e00:c031:7fe::/64 - sampling first 32 IPs +2025-07-26 12:41:32,663 - ip_reader - INFO - IPv6 network 2402:4e00:c042:300::/63 - sampling first 32 IPs +2025-07-26 12:41:32,663 - ip_reader - INFO - IPv6 network 2402:4e00:c042:309::/64 - sampling first 32 IPs +2025-07-26 12:41:32,663 - ip_reader - INFO - IPv6 network 2402:4e00:c042:310::/64 - sampling first 32 IPs +2025-07-26 12:41:32,663 - ip_reader - INFO - IPv6 network 2402:4e00:c050:13::/64 - sampling first 32 IPs +2025-07-26 12:41:32,663 - ip_reader - INFO - IPv6 network 2402:4e00:c050:1a::/63 - sampling first 32 IPs +2025-07-26 12:41:32,664 - ip_reader - INFO - IPv6 network 2402:4e00:c050:1c::/63 - sampling first 32 IPs +2025-07-26 12:41:32,664 - ip_reader - INFO - IPv6 network 2402:4e00:c050:2c::/63 - sampling first 32 IPs +2025-07-26 12:41:32,664 - ip_reader - INFO - IPv6 network 2402:4e00:c050:4c::/64 - sampling first 32 IPs +2025-07-26 12:41:32,664 - ip_reader - INFO - IPv6 network 2402:4e00:c050:8::/64 - sampling first 32 IPs +2025-07-26 12:41:32,664 - ip_reader - INFO - IPv6 network 2402:4e00:c050::/64 - sampling first 32 IPs +2025-07-26 12:41:32,664 - ip_reader - INFO - IPv6 network 2402:4e00:c050:b::/64 - sampling first 32 IPs +2025-07-26 12:41:32,664 - ip_reader - INFO - IPv6 network 2402:4e00:c050:c::/63 - sampling first 32 IPs +2025-07-26 12:41:32,664 - ip_reader - INFO - IPv6 network 2402:4e00:c050:e::/64 - sampling first 32 IPs +2025-07-26 12:41:32,664 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10d1::/64 - sampling first 32 IPs +2025-07-26 12:41:32,664 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10d6::/64 - sampling first 32 IPs +2025-07-26 12:41:32,664 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10ef::/64 - sampling first 32 IPs +2025-07-26 12:41:32,665 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10f1::/64 - sampling first 32 IPs +2025-07-26 12:41:32,665 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10f2::/63 - sampling first 32 IPs +2025-07-26 12:41:32,665 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10f6::/63 - sampling first 32 IPs +2025-07-26 12:41:32,665 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10fa::/64 - sampling first 32 IPs +2025-07-26 12:41:32,665 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10fd::/64 - sampling first 32 IPs +2025-07-26 12:41:32,665 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10ff::/64 - sampling first 32 IPs +2025-07-26 12:41:32,665 - ip_reader - INFO - IPv6 network 2408:862a:240:2::/64 - sampling first 32 IPs +2025-07-26 12:41:32,666 - ip_reader - INFO - IPv6 network 2408:8670:3af0:32::/64 - sampling first 32 IPs +2025-07-26 12:41:32,666 - ip_reader - INFO - IPv6 network 2408:8706:0:400::/64 - sampling first 32 IPs +2025-07-26 12:41:32,666 - ip_reader - INFO - IPv6 network 2408:8706:2:300d::/64 - sampling first 32 IPs +2025-07-26 12:41:32,666 - ip_reader - INFO - IPv6 network 2408:8706:2:300e::/64 - sampling first 32 IPs +2025-07-26 12:41:32,666 - ip_reader - INFO - IPv6 network 2408:870c:1020:11::/64 - sampling first 32 IPs +2025-07-26 12:41:32,666 - ip_reader - INFO - IPv6 network 2408:8710:20:11a0::/63 - sampling first 32 IPs +2025-07-26 12:41:32,666 - ip_reader - INFO - IPv6 network 2408:8719:1100:91::/64 - sampling first 32 IPs +2025-07-26 12:41:32,667 - ip_reader - INFO - IPv6 network 2408:8719:1100:92::/63 - sampling first 32 IPs +2025-07-26 12:41:32,667 - ip_reader - INFO - IPv6 network 2408:8719:1100:94::/63 - sampling first 32 IPs +2025-07-26 12:41:32,667 - ip_reader - INFO - IPv6 network 2408:8719:1100:96::/64 - sampling first 32 IPs +2025-07-26 12:41:32,667 - ip_reader - INFO - IPv6 network 2408:8719:40e:39::/64 - sampling first 32 IPs +2025-07-26 12:41:32,667 - ip_reader - INFO - IPv6 network 2408:8719:40e:3a::/63 - sampling first 32 IPs +2025-07-26 12:41:32,667 - ip_reader - INFO - IPv6 network 2408:8719:40e:3c::/64 - sampling first 32 IPs +2025-07-26 12:41:32,667 - ip_reader - INFO - IPv6 network 2408:8719:40f:18::/64 - sampling first 32 IPs +2025-07-26 12:41:32,667 - ip_reader - INFO - IPv6 network 2408:871a:5100:140::/64 - sampling first 32 IPs +2025-07-26 12:41:32,667 - ip_reader - INFO - IPv6 network 2408:8720:806:300::/64 - sampling first 32 IPs +2025-07-26 12:41:32,667 - ip_reader - INFO - IPv6 network 2408:8726:1001:111::/64 - sampling first 32 IPs +2025-07-26 12:41:32,668 - ip_reader - INFO - IPv6 network 2408:8726:1001:112::/63 - sampling first 32 IPs +2025-07-26 12:41:32,668 - ip_reader - INFO - IPv6 network 2408:8726:1001:114::/64 - sampling first 32 IPs +2025-07-26 12:41:32,668 - ip_reader - INFO - IPv6 network 2408:8726:1001:116::/63 - sampling first 32 IPs +2025-07-26 12:41:32,668 - ip_reader - INFO - IPv6 network 2408:872f:20:210::/63 - sampling first 32 IPs +2025-07-26 12:41:32,668 - ip_reader - INFO - IPv6 network 2408:8734:4012:1::/64 - sampling first 32 IPs +2025-07-26 12:41:32,668 - ip_reader - INFO - IPv6 network 2408:8734:4012:2::/64 - sampling first 32 IPs +2025-07-26 12:41:32,668 - ip_reader - INFO - IPv6 network 2408:8734:4012:4::/64 - sampling first 32 IPs +2025-07-26 12:41:32,668 - ip_reader - INFO - IPv6 network 2408:8738:b000:1c::/64 - sampling first 32 IPs +2025-07-26 12:41:32,669 - ip_reader - INFO - IPv6 network 2408:873c:5011::/64 - sampling first 32 IPs +2025-07-26 12:41:32,669 - ip_reader - INFO - IPv6 network 2408:873c:5811:78::/64 - sampling first 32 IPs +2025-07-26 12:41:32,669 - ip_reader - INFO - IPv6 network 2408:873c:5811:a3::/64 - sampling first 32 IPs +2025-07-26 12:41:32,669 - ip_reader - INFO - IPv6 network 2408:873c:5811:ae::/64 - sampling first 32 IPs +2025-07-26 12:41:32,669 - ip_reader - INFO - IPv6 network 2408:873d:2011:41::/64 - sampling first 32 IPs +2025-07-26 12:41:32,669 - ip_reader - INFO - IPv6 network 2408:873d:2011:43::/64 - sampling first 32 IPs +2025-07-26 12:41:32,670 - ip_reader - INFO - IPv6 network 2408:873d:2011:44::/63 - sampling first 32 IPs +2025-07-26 12:41:32,670 - ip_reader - INFO - IPv6 network 2408:873d:2011:47::/64 - sampling first 32 IPs +2025-07-26 12:41:32,670 - ip_reader - INFO - IPv6 network 2408:873d:2011:49::/64 - sampling first 32 IPs +2025-07-26 12:41:32,670 - ip_reader - INFO - IPv6 network 2408:8740:d1fe:52::/63 - sampling first 32 IPs +2025-07-26 12:41:32,670 - ip_reader - INFO - IPv6 network 2408:8740:d1fe:54::/62 - sampling first 32 IPs +2025-07-26 12:41:32,670 - ip_reader - INFO - IPv6 network 2408:8740:d1fe:58::/63 - sampling first 32 IPs +2025-07-26 12:41:32,670 - ip_reader - INFO - IPv6 network 2408:8744:d05:11::/64 - sampling first 32 IPs +2025-07-26 12:41:32,670 - ip_reader - INFO - IPv6 network 2408:8744:d05:12::/64 - sampling first 32 IPs +2025-07-26 12:41:32,671 - ip_reader - INFO - IPv6 network 2408:8748:a100:33::/64 - sampling first 32 IPs +2025-07-26 12:41:32,671 - ip_reader - INFO - IPv6 network 2408:8748:a100:34::/63 - sampling first 32 IPs +2025-07-26 12:41:32,671 - ip_reader - INFO - IPv6 network 2408:8748:a100:36::/64 - sampling first 32 IPs +2025-07-26 12:41:32,671 - ip_reader - INFO - IPv6 network 2408:8748:a102:3041::/64 - sampling first 32 IPs +2025-07-26 12:41:32,671 - ip_reader - INFO - IPv6 network 2408:8748:a102:3042::/63 - sampling first 32 IPs +2025-07-26 12:41:32,671 - ip_reader - INFO - IPv6 network 2408:8748:a102:3044::/62 - sampling first 32 IPs +2025-07-26 12:41:32,671 - ip_reader - INFO - IPv6 network 2408:8748:a102:3048::/63 - sampling first 32 IPs +2025-07-26 12:41:32,672 - ip_reader - INFO - IPv6 network 2408:8749:c110:800::/64 - sampling first 32 IPs +2025-07-26 12:41:32,672 - ip_reader - INFO - IPv6 network 2408:874c:1ff:80::/64 - sampling first 32 IPs +2025-07-26 12:41:32,672 - ip_reader - INFO - IPv6 network 2408:874c:1ff:82::/63 - sampling first 32 IPs +2025-07-26 12:41:32,672 - ip_reader - INFO - IPv6 network 2408:874c:1ff:84::/62 - sampling first 32 IPs +2025-07-26 12:41:32,672 - ip_reader - INFO - IPv6 network 2408:874c:1ff:88::/64 - sampling first 32 IPs +2025-07-26 12:41:32,672 - ip_reader - INFO - IPv6 network 2408:874d:a00:b::/64 - sampling first 32 IPs +2025-07-26 12:41:32,672 - ip_reader - INFO - IPv6 network 2408:874d:a00:c::/64 - sampling first 32 IPs +2025-07-26 12:41:32,672 - ip_reader - INFO - IPv6 network 2408:874f:3001:310::/64 - sampling first 32 IPs +2025-07-26 12:41:32,673 - ip_reader - INFO - IPv6 network 2408:8752:e00:80::/63 - sampling first 32 IPs +2025-07-26 12:41:32,673 - ip_reader - INFO - IPv6 network 2408:8752:e00:b0::/61 - sampling first 32 IPs +2025-07-26 12:41:32,673 - ip_reader - INFO - IPv6 network 2408:8752:e00:b8::/64 - sampling first 32 IPs +2025-07-26 12:41:32,673 - ip_reader - INFO - IPv6 network 2408:8756:2cff:e401::/64 - sampling first 32 IPs +2025-07-26 12:41:32,673 - ip_reader - INFO - IPv6 network 2408:8756:2cff:e402::/63 - sampling first 32 IPs +2025-07-26 12:41:32,673 - ip_reader - INFO - IPv6 network 2408:8756:2cff:e404::/64 - sampling first 32 IPs +2025-07-26 12:41:32,673 - ip_reader - INFO - IPv6 network 2408:8756:4cff:d602::/63 - sampling first 32 IPs +2025-07-26 12:41:32,674 - ip_reader - INFO - IPv6 network 2408:8756:4cff:d604::/64 - sampling first 32 IPs +2025-07-26 12:41:32,674 - ip_reader - INFO - IPv6 network 2408:8756:4cff:d606::/63 - sampling first 32 IPs +2025-07-26 12:41:32,674 - ip_reader - INFO - IPv6 network 2408:8756:4cff:d608::/63 - sampling first 32 IPs +2025-07-26 12:41:32,674 - ip_reader - INFO - IPv6 network 2408:8756:d0fb:16c::/64 - sampling first 32 IPs +2025-07-26 12:41:32,674 - ip_reader - INFO - IPv6 network 2408:8756:d0fb:170::/64 - sampling first 32 IPs +2025-07-26 12:41:32,674 - ip_reader - INFO - IPv6 network 2408:875c:0:80::/63 - sampling first 32 IPs +2025-07-26 12:41:32,674 - ip_reader - INFO - IPv6 network 2408:8760:119:4::/63 - sampling first 32 IPs +2025-07-26 12:41:32,674 - ip_reader - INFO - IPv6 network 2408:8764:22:1f::/64 - sampling first 32 IPs +2025-07-26 12:41:32,674 - ip_reader - INFO - IPv6 network 2408:8766:0:101c::/64 - sampling first 32 IPs +2025-07-26 12:41:32,675 - ip_reader - INFO - IPv6 network 2408:876a:1000:22::/64 - sampling first 32 IPs +2025-07-26 12:41:32,675 - ip_reader - INFO - IPv6 network 2408:876a:1000:24::/64 - sampling first 32 IPs +2025-07-26 12:41:32,675 - ip_reader - INFO - IPv6 network 2408:876c:1780:122::/64 - sampling first 32 IPs +2025-07-26 12:41:32,675 - ip_reader - INFO - IPv6 network 2408:8770:0:d1::/64 - sampling first 32 IPs +2025-07-26 12:41:32,675 - ip_reader - INFO - IPv6 network 2408:8770:0:d2::/64 - sampling first 32 IPs +2025-07-26 12:41:32,675 - ip_reader - INFO - IPv6 network 2408:8770:0:d6::/63 - sampling first 32 IPs +2025-07-26 12:41:32,675 - ip_reader - INFO - IPv6 network 2408:8770:0:d8::/64 - sampling first 32 IPs +2025-07-26 12:41:32,675 - ip_reader - INFO - IPv6 network 2408:8776:1:c::/64 - sampling first 32 IPs +2025-07-26 12:41:32,676 - ip_reader - INFO - IPv6 network 2408:8779:c001:3::/64 - sampling first 32 IPs +2025-07-26 12:41:32,676 - ip_reader - INFO - IPv6 network 2408:877a:2000:f::/64 - sampling first 32 IPs +2025-07-26 12:41:32,676 - ip_reader - INFO - IPv6 network 2409:8702:489c::/64 - sampling first 32 IPs +2025-07-26 12:41:32,676 - ip_reader - INFO - IPv6 network 2409:875e:5088:c1::/64 - sampling first 32 IPs +2025-07-26 12:41:32,676 - ip_reader - INFO - IPv6 network 2409:8c04:110e:4001::/64 - sampling first 32 IPs +2025-07-26 12:41:32,676 - ip_reader - INFO - IPv6 network 2409:8c0c:310:21d::/64 - sampling first 32 IPs +2025-07-26 12:41:32,676 - ip_reader - INFO - IPv6 network 2409:8c0c:310:21e::/63 - sampling first 32 IPs +2025-07-26 12:41:32,676 - ip_reader - INFO - IPv6 network 2409:8c0c:310:220::/64 - sampling first 32 IPs +2025-07-26 12:41:32,677 - ip_reader - INFO - IPv6 network 2409:8c0c:310:222::/63 - sampling first 32 IPs +2025-07-26 12:41:32,677 - ip_reader - INFO - IPv6 network 2409:8c10:c00:1404::/64 - sampling first 32 IPs +2025-07-26 12:41:32,677 - ip_reader - INFO - IPv6 network 2409:8c10:c00:68::/64 - sampling first 32 IPs +2025-07-26 12:41:32,678 - ip_reader - INFO - IPv6 network 2409:8c14:f2c:1001::/64 - sampling first 32 IPs +2025-07-26 12:41:32,678 - ip_reader - INFO - IPv6 network 2409:8c1c:300:17::/64 - sampling first 32 IPs +2025-07-26 12:41:32,678 - ip_reader - INFO - IPv6 network 2409:8c1e:68e0:a08::/64 - sampling first 32 IPs +2025-07-26 12:41:32,678 - ip_reader - INFO - IPv6 network 2409:8c1e:8f80:2::/64 - sampling first 32 IPs +2025-07-26 12:41:32,678 - ip_reader - INFO - IPv6 network 2409:8c20:1834:461::/64 - sampling first 32 IPs +2025-07-26 12:41:32,678 - ip_reader - INFO - IPv6 network 2409:8c20:1834:463::/64 - sampling first 32 IPs +2025-07-26 12:41:32,678 - ip_reader - INFO - IPv6 network 2409:8c20:1834:464::/63 - sampling first 32 IPs +2025-07-26 12:41:32,679 - ip_reader - INFO - IPv6 network 2409:8c20:1834:467::/64 - sampling first 32 IPs +2025-07-26 12:41:32,679 - ip_reader - INFO - IPv6 network 2409:8c20:1834:469::/64 - sampling first 32 IPs +2025-07-26 12:41:32,679 - ip_reader - INFO - IPv6 network 2409:8c20:5021:160::/64 - sampling first 32 IPs +2025-07-26 12:41:32,679 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1dd::/64 - sampling first 32 IPs +2025-07-26 12:41:32,679 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1de::/63 - sampling first 32 IPs +2025-07-26 12:41:32,679 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1e1::/64 - sampling first 32 IPs +2025-07-26 12:41:32,679 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1e2::/63 - sampling first 32 IPs +2025-07-26 12:41:32,679 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1e4::/64 - sampling first 32 IPs +2025-07-26 12:41:32,679 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1e6::/64 - sampling first 32 IPs +2025-07-26 12:41:32,680 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1e8::/64 - sampling first 32 IPs +2025-07-26 12:41:32,680 - ip_reader - INFO - IPv6 network 2409:8c20:b281:19::/64 - sampling first 32 IPs +2025-07-26 12:41:32,680 - ip_reader - INFO - IPv6 network 2409:8c28:203:308::/64 - sampling first 32 IPs +2025-07-26 12:41:32,680 - ip_reader - INFO - IPv6 network 2409:8c28:203:34::/64 - sampling first 32 IPs +2025-07-26 12:41:32,680 - ip_reader - INFO - IPv6 network 2409:8c28:2808:11::/64 - sampling first 32 IPs +2025-07-26 12:41:32,680 - ip_reader - INFO - IPv6 network 2409:8c28:2808:12::/63 - sampling first 32 IPs +2025-07-26 12:41:32,680 - ip_reader - INFO - IPv6 network 2409:8c28:2808:14::/63 - sampling first 32 IPs +2025-07-26 12:41:32,680 - ip_reader - INFO - IPv6 network 2409:8c28:2808:d::/64 - sampling first 32 IPs +2025-07-26 12:41:32,680 - ip_reader - INFO - IPv6 network 2409:8c28:2808:e::/63 - sampling first 32 IPs +2025-07-26 12:41:32,680 - ip_reader - INFO - IPv6 network 2409:8c30:1000:20::/64 - sampling first 32 IPs +2025-07-26 12:41:32,681 - ip_reader - INFO - IPv6 network 2409:8c34:2220:30a::/64 - sampling first 32 IPs +2025-07-26 12:41:32,681 - ip_reader - INFO - IPv6 network 2409:8c34:e00:41::/64 - sampling first 32 IPs +2025-07-26 12:41:32,681 - ip_reader - INFO - IPv6 network 2409:8c34:e00:42::/63 - sampling first 32 IPs +2025-07-26 12:41:32,681 - ip_reader - INFO - IPv6 network 2409:8c34:e00:44::/62 - sampling first 32 IPs +2025-07-26 12:41:32,681 - ip_reader - INFO - IPv6 network 2409:8c34:e00:48::/63 - sampling first 32 IPs +2025-07-26 12:41:32,681 - ip_reader - INFO - IPv6 network 2409:8c38:80:1c0::/64 - sampling first 32 IPs +2025-07-26 12:41:32,681 - ip_reader - INFO - IPv6 network 2409:8c38:80:1c2::/63 - sampling first 32 IPs +2025-07-26 12:41:32,681 - ip_reader - INFO - IPv6 network 2409:8c38:80:1c4::/62 - sampling first 32 IPs +2025-07-26 12:41:32,681 - ip_reader - INFO - IPv6 network 2409:8c38:80:1c8::/64 - sampling first 32 IPs +2025-07-26 12:41:32,681 - ip_reader - INFO - IPv6 network 2409:8c38:80:1f1::/64 - sampling first 32 IPs +2025-07-26 12:41:32,682 - ip_reader - INFO - IPv6 network 2409:8c38:80:1f2::/63 - sampling first 32 IPs +2025-07-26 12:41:32,682 - ip_reader - INFO - IPv6 network 2409:8c38:80:1f4::/64 - sampling first 32 IPs +2025-07-26 12:41:32,682 - ip_reader - INFO - IPv6 network 2409:8c3c:1300:306::/64 - sampling first 32 IPs +2025-07-26 12:41:32,682 - ip_reader - INFO - IPv6 network 2409:8c3c:900:1a1::/64 - sampling first 32 IPs +2025-07-26 12:41:32,682 - ip_reader - INFO - IPv6 network 2409:8c3c:900:1a2::/63 - sampling first 32 IPs +2025-07-26 12:41:32,682 - ip_reader - INFO - IPv6 network 2409:8c3c:900:1a4::/64 - sampling first 32 IPs +2025-07-26 12:41:32,682 - ip_reader - INFO - IPv6 network 2409:8c44:b00:4ec::/64 - sampling first 32 IPs +2025-07-26 12:41:32,682 - ip_reader - INFO - IPv6 network 2409:8c4c:e00:2011::/64 - sampling first 32 IPs +2025-07-26 12:41:32,682 - ip_reader - INFO - IPv6 network 2409:8c4c:e00:2012::/63 - sampling first 32 IPs +2025-07-26 12:41:32,682 - ip_reader - INFO - IPv6 network 2409:8c4c:e00:2014::/64 - sampling first 32 IPs +2025-07-26 12:41:32,683 - ip_reader - INFO - IPv6 network 2409:8c50:a00:2061::/64 - sampling first 32 IPs +2025-07-26 12:41:32,683 - ip_reader - INFO - IPv6 network 2409:8c50:a00:2170::/61 - sampling first 32 IPs +2025-07-26 12:41:32,683 - ip_reader - INFO - IPv6 network 2409:8c50:a00:2178::/64 - sampling first 32 IPs +2025-07-26 12:41:32,683 - ip_reader - INFO - IPv6 network 2409:8c50:a00:2252::/63 - sampling first 32 IPs +2025-07-26 12:41:32,683 - ip_reader - INFO - IPv6 network 2409:8c50:a00:2254::/64 - sampling first 32 IPs +2025-07-26 12:41:32,683 - ip_reader - INFO - IPv6 network 2409:8c54:1801:21::/64 - sampling first 32 IPs +2025-07-26 12:41:32,683 - ip_reader - INFO - IPv6 network 2409:8c54:1801:22::/63 - sampling first 32 IPs +2025-07-26 12:41:32,683 - ip_reader - INFO - IPv6 network 2409:8c54:1801:24::/64 - sampling first 32 IPs +2025-07-26 12:41:32,683 - ip_reader - INFO - IPv6 network 2409:8c54:1821:578::/64 - sampling first 32 IPs +2025-07-26 12:41:32,683 - ip_reader - INFO - IPv6 network 2409:8c54:2030:222::/63 - sampling first 32 IPs +2025-07-26 12:41:32,683 - ip_reader - INFO - IPv6 network 2409:8c54:2030:224::/64 - sampling first 32 IPs +2025-07-26 12:41:32,684 - ip_reader - INFO - IPv6 network 2409:8c54:2030:226::/63 - sampling first 32 IPs +2025-07-26 12:41:32,684 - ip_reader - INFO - IPv6 network 2409:8c54:2030:228::/63 - sampling first 32 IPs +2025-07-26 12:41:32,684 - ip_reader - INFO - IPv6 network 2409:8c5c:110:50::/64 - sampling first 32 IPs +2025-07-26 12:41:32,684 - ip_reader - INFO - IPv6 network 2409:8c5e:5000:c2::/64 - sampling first 32 IPs +2025-07-26 12:41:32,684 - ip_reader - INFO - IPv6 network 2409:8c60:2500:5d::/64 - sampling first 32 IPs +2025-07-26 12:41:32,684 - ip_reader - INFO - IPv6 network 2409:8c62:e10:218::/64 - sampling first 32 IPs +2025-07-26 12:41:32,684 - ip_reader - INFO - IPv6 network 2409:8c6a:b021:74::/64 - sampling first 32 IPs +2025-07-26 12:41:32,684 - ip_reader - INFO - IPv6 network 2409:8c6c:561:8110::/62 - sampling first 32 IPs +2025-07-26 12:41:32,684 - ip_reader - INFO - IPv6 network 2409:8c70:3a10:16::/64 - sampling first 32 IPs +2025-07-26 12:41:32,684 - ip_reader - INFO - IPv6 network 2409:8c70:3a91:51::/64 - sampling first 32 IPs +2025-07-26 12:41:32,685 - ip_reader - INFO - IPv6 network 2409:8c70:3a91:52::/64 - sampling first 32 IPs +2025-07-26 12:41:32,685 - ip_reader - INFO - IPv6 network 2409:8c70:3a91:56::/63 - sampling first 32 IPs +2025-07-26 12:41:32,685 - ip_reader - INFO - IPv6 network 2409:8c70:3a91:58::/64 - sampling first 32 IPs +2025-07-26 12:41:32,685 - ip_reader - INFO - IPv6 network 2409:8c74:f100:864::/64 - sampling first 32 IPs +2025-07-26 12:41:32,685 - ip_reader - INFO - IPv6 network 2409:8c78:100:24::/64 - sampling first 32 IPs +2025-07-26 12:41:32,685 - ip_reader - INFO - IPv6 network 2409:8c7a:2604::/64 - sampling first 32 IPs +2025-07-26 12:41:32,685 - ip_reader - INFO - IPv6 network 240e:90d:1101:4508::/64 - sampling first 32 IPs +2025-07-26 12:41:32,685 - ip_reader - INFO - IPv6 network 240e:90d:1101:4510::/64 - sampling first 32 IPs +2025-07-26 12:41:32,685 - ip_reader - INFO - IPv6 network 240e:910:e000:2504::/64 - sampling first 32 IPs +2025-07-26 12:41:32,685 - ip_reader - INFO - IPv6 network 240e:914:5009:1002::/63 - sampling first 32 IPs +2025-07-26 12:41:32,686 - ip_reader - INFO - IPv6 network 240e:914:5009:a::/63 - sampling first 32 IPs +2025-07-26 12:41:32,686 - ip_reader - INFO - IPv6 network 240e:925:2:701::/64 - sampling first 32 IPs +2025-07-26 12:41:32,686 - ip_reader - INFO - IPv6 network 240e:925:2:702::/63 - sampling first 32 IPs +2025-07-26 12:41:32,686 - ip_reader - INFO - IPv6 network 240e:925:2:704::/64 - sampling first 32 IPs +2025-07-26 12:41:32,686 - ip_reader - INFO - IPv6 network 240e:925:2:706::/63 - sampling first 32 IPs +2025-07-26 12:41:32,686 - ip_reader - INFO - IPv6 network 240e:926:3004:21::/64 - sampling first 32 IPs +2025-07-26 12:41:32,686 - ip_reader - INFO - IPv6 network 240e:930:c200:70::/63 - sampling first 32 IPs +2025-07-26 12:41:32,686 - ip_reader - INFO - IPv6 network 240e:935:a04:2708::/64 - sampling first 32 IPs +2025-07-26 12:41:32,686 - ip_reader - INFO - IPv6 network 240e:93c:1201:2::/63 - sampling first 32 IPs +2025-07-26 12:41:32,686 - ip_reader - INFO - IPv6 network 240e:93c:1201:4::/64 - sampling first 32 IPs +2025-07-26 12:41:32,687 - ip_reader - INFO - IPv6 network 240e:93c:1201:d::/64 - sampling first 32 IPs +2025-07-26 12:41:32,687 - ip_reader - INFO - IPv6 network 240e:940:20c:308::/64 - sampling first 32 IPs +2025-07-26 12:41:32,687 - ip_reader - INFO - IPv6 network 240e:946:3000:8008::/63 - sampling first 32 IPs +2025-07-26 12:41:32,687 - ip_reader - INFO - IPv6 network 240e:94a:b01:214::/63 - sampling first 32 IPs +2025-07-26 12:41:32,687 - ip_reader - INFO - IPv6 network 240e:94c:0:2701::/64 - sampling first 32 IPs +2025-07-26 12:41:32,687 - ip_reader - INFO - IPv6 network 240e:94c:0:2702::/63 - sampling first 32 IPs +2025-07-26 12:41:32,687 - ip_reader - INFO - IPv6 network 240e:94c:0:2704::/64 - sampling first 32 IPs +2025-07-26 12:41:32,687 - ip_reader - INFO - IPv6 network 240e:950:1:2002::/64 - sampling first 32 IPs +2025-07-26 12:41:32,687 - ip_reader - INFO - IPv6 network 240e:958:2300:220::/64 - sampling first 32 IPs +2025-07-26 12:41:32,687 - ip_reader - INFO - IPv6 network 240e:958:6003:108::/64 - sampling first 32 IPs +2025-07-26 12:41:32,688 - ip_reader - INFO - IPv6 network 240e:95e:4001:1::/64 - sampling first 32 IPs +2025-07-26 12:41:32,688 - ip_reader - INFO - IPv6 network 240e:95e:4001:2::/63 - sampling first 32 IPs +2025-07-26 12:41:32,688 - ip_reader - INFO - IPv6 network 240e:95e:4001:4::/64 - sampling first 32 IPs +2025-07-26 12:41:32,688 - ip_reader - INFO - IPv6 network 240e:960:200:90::/64 - sampling first 32 IPs +2025-07-26 12:41:32,688 - ip_reader - INFO - IPv6 network 240e:960:200:92::/63 - sampling first 32 IPs +2025-07-26 12:41:32,688 - ip_reader - INFO - IPv6 network 240e:960:200:94::/62 - sampling first 32 IPs +2025-07-26 12:41:32,688 - ip_reader - INFO - IPv6 network 240e:960:200:98::/64 - sampling first 32 IPs +2025-07-26 12:41:32,688 - ip_reader - INFO - IPv6 network 240e:964:5002:109::/64 - sampling first 32 IPs +2025-07-26 12:41:32,688 - ip_reader - INFO - IPv6 network 240e:964:5002:10a::/63 - sampling first 32 IPs +2025-07-26 12:41:32,688 - ip_reader - INFO - IPv6 network 240e:964:5002:10c::/64 - sampling first 32 IPs +2025-07-26 12:41:32,689 - ip_reader - INFO - IPv6 network 240e:965:802:b01::/64 - sampling first 32 IPs +2025-07-26 12:41:32,689 - ip_reader - INFO - IPv6 network 240e:965:802:b02::/63 - sampling first 32 IPs +2025-07-26 12:41:32,689 - ip_reader - INFO - IPv6 network 240e:965:802:b04::/62 - sampling first 32 IPs +2025-07-26 12:41:32,689 - ip_reader - INFO - IPv6 network 240e:965:802:b08::/63 - sampling first 32 IPs +2025-07-26 12:41:32,689 - ip_reader - INFO - IPv6 network 240e:96c:6400:a00::/64 - sampling first 32 IPs +2025-07-26 12:41:32,689 - ip_reader - INFO - IPv6 network 240e:974:e200:4209::/64 - sampling first 32 IPs +2025-07-26 12:41:32,689 - ip_reader - INFO - IPv6 network 240e:974:e200:420a::/63 - sampling first 32 IPs +2025-07-26 12:41:32,689 - ip_reader - INFO - IPv6 network 240e:974:e200:420c::/63 - sampling first 32 IPs +2025-07-26 12:41:32,689 - ip_reader - INFO - IPv6 network 240e:978:2608:800::/64 - sampling first 32 IPs +2025-07-26 12:41:32,689 - ip_reader - INFO - IPv6 network 240e:978:2903:50a7::/64 - sampling first 32 IPs +2025-07-26 12:41:32,690 - ip_reader - INFO - IPv6 network 240e:978:2903:50a9::/64 - sampling first 32 IPs +2025-07-26 12:41:32,690 - ip_reader - INFO - IPv6 network 240e:978:b34:1::/64 - sampling first 32 IPs +2025-07-26 12:41:32,690 - ip_reader - INFO - IPv6 network 240e:978:d04:2082::/63 - sampling first 32 IPs +2025-07-26 12:41:32,690 - ip_reader - INFO - IPv6 network 240e:978:d04:2085::/64 - sampling first 32 IPs +2025-07-26 12:41:32,690 - ip_reader - INFO - IPv6 network 240e:978:d04:2086::/63 - sampling first 32 IPs +2025-07-26 12:41:32,690 - ip_reader - INFO - IPv6 network 240e:978:d04:2088::/64 - sampling first 32 IPs +2025-07-26 12:41:32,690 - ip_reader - INFO - IPv6 network 240e:978:d04:208b::/64 - sampling first 32 IPs +2025-07-26 12:41:32,690 - ip_reader - INFO - IPv6 network 240e:978:d04:208c::/62 - sampling first 32 IPs +2025-07-26 12:41:32,690 - ip_reader - INFO - IPv6 network 240e:978:d04:2090::/63 - sampling first 32 IPs +2025-07-26 12:41:32,690 - ip_reader - INFO - IPv6 network 240e:979:f07:1::/64 - sampling first 32 IPs +2025-07-26 12:41:32,691 - ip_reader - INFO - IPv6 network 240e:979:f07:3::/64 - sampling first 32 IPs +2025-07-26 12:41:32,691 - ip_reader - INFO - IPv6 network 240e:979:f07:4::/63 - sampling first 32 IPs +2025-07-26 12:41:32,691 - ip_reader - INFO - IPv6 network 240e:979:f07:7::/64 - sampling first 32 IPs +2025-07-26 12:41:32,691 - ip_reader - INFO - IPv6 network 240e:979:f07:9::/64 - sampling first 32 IPs +2025-07-26 12:41:32,691 - ip_reader - INFO - IPv6 network 240e:97c:4040:200::/63 - sampling first 32 IPs +2025-07-26 12:41:32,691 - ip_reader - INFO - IPv6 network 240e:97d:10:25de::/64 - sampling first 32 IPs +2025-07-26 12:41:32,691 - ip_reader - INFO - IPv6 network 240e:97d:10:25e7::/64 - sampling first 32 IPs +2025-07-26 12:41:32,691 - ip_reader - INFO - IPv6 network 240e:97d:2000:b02::/63 - sampling first 32 IPs +2025-07-26 12:41:32,692 - ip_reader - INFO - IPv6 network 240e:97d:2000:b04::/64 - sampling first 32 IPs +2025-07-26 12:41:32,692 - ip_reader - INFO - IPv6 network 240e:97d:2000:b06::/63 - sampling first 32 IPs +2025-07-26 12:41:32,692 - ip_reader - INFO - IPv6 network 240e:97d:2000:b08::/63 - sampling first 32 IPs +2025-07-26 12:41:32,692 - ip_reader - INFO - IPv6 network 240e:980:1200:b14::/63 - sampling first 32 IPs +2025-07-26 12:41:32,692 - ip_reader - INFO - IPv6 network 240e:983:705:2::/64 - sampling first 32 IPs +2025-07-26 12:41:32,692 - ip_reader - INFO - IPv6 network 240e:b1:c808:9::/64 - sampling first 32 IPs +2025-07-26 12:41:32,692 - ip_reader - INFO - IPv6 network 240e:b1:c808:a::/64 - sampling first 32 IPs +2025-07-26 12:41:32,693 - ip_reader - INFO - IPv6 network 240e:b1:c808:c::/63 - sampling first 32 IPs +2025-07-26 12:41:32,693 - ip_reader - INFO - IPv6 network 240e:bf:b800:4131::/64 - sampling first 32 IPs +2025-07-26 12:41:32,693 - ip_reader - INFO - IPv6 network 240e:bf:b800:4132::/64 - sampling first 32 IPs +2025-07-26 12:41:32,693 - ip_reader - INFO - IPv6 network 240e:bf:b800:4136::/63 - sampling first 32 IPs +2025-07-26 12:41:32,693 - ip_reader - INFO - IPv6 network 240e:bf:b800:4138::/64 - sampling first 32 IPs +2025-07-26 12:41:32,693 - ip_reader - INFO - IPv6 network 240e:bf:c800:2915::/64 - sampling first 32 IPs +2025-07-26 12:41:32,694 - ip_reader - INFO - IPv6 network 240e:bf:c800:2916::/64 - sampling first 32 IPs +2025-07-26 12:41:32,694 - ip_reader - INFO - IPv6 network 240e:c2:1800:110::/61 - sampling first 32 IPs +2025-07-26 12:41:32,694 - ip_reader - INFO - IPv6 network 240e:c2:1800:118::/64 - sampling first 32 IPs +2025-07-26 12:41:32,694 - ip_reader - INFO - IPv6 network 240e:c2:1800:ab::/64 - sampling first 32 IPs +2025-07-26 12:41:32,694 - ip_reader - INFO - IPv6 network 240e:c2:1800:ac::/64 - sampling first 32 IPs +2025-07-26 12:41:32,694 - ip_reader - INFO - IPv6 network 240e:c3:2800:205::/64 - sampling first 32 IPs +2025-07-26 12:41:32,694 - ip_reader - INFO - IPv6 network 240e:cd:ff00:118::/64 - sampling first 32 IPs +2025-07-26 12:41:32,695 - ip_reader - INFO - IPv6 network 240e:e9:b00c:33::/64 - sampling first 32 IPs +2025-07-26 12:41:32,695 - ip_reader - INFO - IPv6 network 240e:e9:b00c:34::/63 - sampling first 32 IPs +2025-07-26 12:41:32,695 - ip_reader - INFO - IPv6 network 240e:e9:b00c:36::/64 - sampling first 32 IPs +2025-07-26 12:41:32,695 - ip_reader - INFO - IPv6 network 240e:f7:a070:342::/63 - sampling first 32 IPs +2025-07-26 12:41:32,695 - ip_reader - INFO - IPv6 network 240e:f7:a070:344::/62 - sampling first 32 IPs +2025-07-26 12:41:32,695 - ip_reader - INFO - IPv6 network 240e:f7:a070:348::/63 - sampling first 32 IPs +2025-07-26 12:41:32,695 - ip_reader - INFO - IPv6 network 240e:f7:a070:3c0::/64 - sampling first 32 IPs +2025-07-26 12:41:32,696 - ip_reader - INFO - IPv6 network 240e:f7:ef00:10::/64 - sampling first 32 IPs +2025-07-26 12:41:32,696 - ip_reader - INFO - IPv6 network 2001:df1:7e00:4::/64 - sampling first 32 IPs +2025-07-26 12:41:32,696 - ip_reader - INFO - IPv6 network 2400:adc0:4041::/64 - sampling first 32 IPs +2025-07-26 12:41:32,696 - ip_reader - INFO - IPv6 network 2400:de40::/64 - sampling first 32 IPs +2025-07-26 12:41:32,696 - ip_reader - INFO - IPv6 network 2403:c280:5:1::/64 - sampling first 32 IPs +2025-07-26 12:41:32,696 - ip_reader - INFO - IPv6 network 2404:3100:d:5::/64 - sampling first 32 IPs +2025-07-26 12:41:32,696 - ip_reader - INFO - IPv6 network 2404:a140:3a:1::/64 - sampling first 32 IPs +2025-07-26 12:41:32,697 - ip_reader - INFO - IPv6 network 2404:a140:3e:6::/64 - sampling first 32 IPs +2025-07-26 12:41:32,697 - ip_reader - INFO - IPv6 network 2405:3200:101:63::/64 - sampling first 32 IPs +2025-07-26 12:41:32,697 - ip_reader - INFO - IPv6 network 2405:4800:a601::/64 - sampling first 32 IPs +2025-07-26 12:41:32,697 - ip_reader - INFO - IPv6 network 2407:2440:10:255::/64 - sampling first 32 IPs +2025-07-26 12:41:32,697 - ip_reader - INFO - IPv6 network 240d:c040:1::/64 - sampling first 32 IPs +2025-07-26 12:41:32,697 - ip_reader - INFO - IPv6 network 2602:fa80:10:2::/63 - sampling first 32 IPs +2025-07-26 12:41:32,698 - ip_reader - INFO - IPv6 network 2602:ffe4:c02:1001::/64 - sampling first 32 IPs +2025-07-26 12:41:32,698 - ip_reader - INFO - IPv6 network 2602:ffe4:c02:100c::/63 - sampling first 32 IPs +2025-07-26 12:41:32,698 - ip_reader - INFO - IPv6 network 2602:ffe4:c12:105::/64 - sampling first 32 IPs +2025-07-26 12:41:32,698 - ip_reader - INFO - IPv6 network 2602:ffe4:c15:124::/64 - sampling first 32 IPs +2025-07-26 12:41:32,698 - ip_reader - INFO - IPv6 network 2602:ffe4:c18:c201::/64 - sampling first 32 IPs +2025-07-26 12:41:32,698 - ip_reader - INFO - IPv6 network 2602:ffe4:c18:c202::/63 - sampling first 32 IPs +2025-07-26 12:41:32,698 - ip_reader - INFO - IPv6 network 2602:ffe4:c27:1000::/64 - sampling first 32 IPs +2025-07-26 12:41:32,699 - ip_reader - INFO - IPv6 network 2604:980:4002:2::/64 - sampling first 32 IPs +2025-07-26 12:41:32,699 - ip_reader - INFO - IPv6 network 2604:980:7002:6::/64 - sampling first 32 IPs +2025-07-26 12:41:32,699 - ip_reader - INFO - IPv6 network 2803:2540:f:14::/64 - sampling first 32 IPs +2025-07-26 12:41:32,699 - ip_reader - INFO - IPv6 network 2a00:12f8:3900:13::/64 - sampling first 32 IPs +2025-07-26 12:41:32,699 - ip_reader - INFO - IPv6 network 2a02:b60:2001::/64 - sampling first 32 IPs +2025-07-26 12:41:32,699 - ip_reader - INFO - IPv6 network 2a02:ce0:1:70::/64 - sampling first 32 IPs +2025-07-26 12:41:32,700 - ip_reader - INFO - IPv6 network 2a05:45c7:1:1018::/64 - sampling first 32 IPs +2025-07-26 12:41:32,700 - ip_reader - INFO - Loaded 286224 IPs for edgeone from ip_lists/edgeone.txt +2025-07-26 12:41:32,700 - ip_reader - INFO - Loaded 3 IPs for esa from ip_lists/esa.txt +2025-07-26 12:41:32,700 - ip_reader - INFO - Loaded 3 IPs for fastly from ip_lists/fastly.txt +2025-07-26 12:41:32,700 - ip_reader - INFO - Loaded 3 IPs for cloudflare from ip_lists/cloudflare.txt +2025-07-26 12:41:32,700 - ip_reader - INFO - Loaded total of 286233 IPs across 4 providers +2025-07-26 12:41:32,700 - bestcdn - INFO - Starting accessibility tests... +2025-07-26 12:41:32,705 - accessibility_tester - INFO - Starting high-performance IP accessibility testing +2025-07-26 12:41:32,771 - accessibility_tester - INFO - Testing 286233 IPs across 4 providers +2025-07-26 12:41:32,771 - accessibility_tester - INFO - Processing batch 1/287 (1000 IPs) +2025-07-26 12:41:37,831 - accessibility_tester - INFO - Batch 1 completed: 0/1000 accessible +2025-07-26 12:41:37,831 - accessibility_tester - INFO - Processing batch 2/287 (1000 IPs) +2025-07-26 12:41:42,877 - accessibility_tester - INFO - Batch 2 completed: 0/1000 accessible +2025-07-26 12:41:42,877 - accessibility_tester - INFO - Processing batch 3/287 (1000 IPs) +2025-07-26 12:41:47,938 - accessibility_tester - INFO - Batch 3 completed: 0/1000 accessible +2025-07-26 12:41:47,938 - accessibility_tester - INFO - Processing batch 4/287 (1000 IPs) +2025-07-26 12:41:52,990 - accessibility_tester - INFO - Batch 4 completed: 0/1000 accessible +2025-07-26 12:41:52,990 - accessibility_tester - INFO - Processing batch 5/287 (1000 IPs) +2025-07-26 12:41:58,048 - accessibility_tester - INFO - Batch 5 completed: 0/1000 accessible +2025-07-26 12:41:58,048 - accessibility_tester - INFO - Processing batch 6/287 (1000 IPs) +2025-07-26 12:42:03,096 - accessibility_tester - INFO - Batch 6 completed: 0/1000 accessible +2025-07-26 12:42:03,096 - accessibility_tester - INFO - Processing batch 7/287 (1000 IPs) +2025-07-26 12:42:08,155 - accessibility_tester - INFO - Batch 7 completed: 0/1000 accessible +2025-07-26 12:42:08,155 - accessibility_tester - INFO - Processing batch 8/287 (1000 IPs) +2025-07-26 12:42:13,180 - accessibility_tester - INFO - Batch 8 completed: 0/1000 accessible +2025-07-26 12:42:13,180 - accessibility_tester - INFO - Processing batch 9/287 (1000 IPs) +2025-07-26 12:42:18,237 - accessibility_tester - INFO - Batch 9 completed: 0/1000 accessible +2025-07-26 12:42:18,237 - accessibility_tester - INFO - Processing batch 10/287 (1000 IPs) +2025-07-26 12:42:23,289 - accessibility_tester - INFO - Batch 10 completed: 0/1000 accessible +2025-07-26 12:42:23,289 - accessibility_tester - INFO - Processing batch 11/287 (1000 IPs) diff --git a/logs/bestcdn_20250726_124331.log b/logs/bestcdn_20250726_124331.log new file mode 100644 index 0000000..a825e77 --- /dev/null +++ b/logs/bestcdn_20250726_124331.log @@ -0,0 +1,377 @@ +2025-07-26 12:43:31,150 - bestcdn - INFO - Logging initialized - Log file: logs/bestcdn_20250726_124331.log +2025-07-26 12:43:31,150 - bestcdn - INFO - Set test domain for cloudflare: test10000.fstring.me +2025-07-26 12:43:31,150 - bestcdn - INFO - Set test domain for fastly: test10000.ix.je +2025-07-26 12:43:31,150 - bestcdn - INFO - Set test domain for edgeone: test10000.ix.je +2025-07-26 12:43:31,150 - bestcdn - INFO - Set test domain for esa: test10000.ix.je +2025-07-26 12:43:31,150 - bestcdn - INFO - Validating setup... +2025-07-26 12:43:31,150 - bestcdn - INFO - Enabled providers: edgeone, esa, fastly, cloudflare +2025-07-26 12:43:31,153 - bestcdn - INFO - edgeone: 1774488 IPs available +2025-07-26 12:43:31,153 - bestcdn - INFO - esa: 3 IPs available +2025-07-26 12:43:31,153 - bestcdn - INFO - fastly: 3 IPs available +2025-07-26 12:43:31,153 - bestcdn - INFO - cloudflare: 3 IPs available +2025-07-26 12:43:31,153 - bestcdn - INFO - Setup validation completed successfully +2025-07-26 12:43:31,153 - bestcdn - INFO - ============================================================ +2025-07-26 12:43:31,153 - bestcdn - INFO - STARTING BESTCDN IP ACCESSIBILITY TEST +2025-07-26 12:43:31,153 - bestcdn - INFO - ============================================================ +2025-07-26 12:43:31,153 - bestcdn - INFO - Loading IP lists... +2025-07-26 12:43:31,243 - ip_reader - WARNING - Very large IPv4 network 43.174.0.0/15 with 131072 IPs - this may take time +2025-07-26 12:43:31,328 - ip_reader - INFO - IPv6 network 240d:c010::/28 - sampling first 32 IPs +2025-07-26 12:43:31,328 - ip_reader - INFO - IPv6 network 2402:4e00:24:10de::/64 - sampling first 32 IPs +2025-07-26 12:43:31,329 - ip_reader - INFO - IPv6 network 2402:4e00:24:10f0::/64 - sampling first 32 IPs +2025-07-26 12:43:31,329 - ip_reader - INFO - IPv6 network 2402:4e00:37:10dd::/64 - sampling first 32 IPs +2025-07-26 12:43:31,329 - ip_reader - INFO - IPv6 network 2402:4e00:37:10de::/63 - sampling first 32 IPs +2025-07-26 12:43:31,329 - ip_reader - INFO - IPv6 network 2402:4e00:37:10e0::/63 - sampling first 32 IPs +2025-07-26 12:43:31,329 - ip_reader - INFO - IPv6 network 2402:4e00:37:10e2::/64 - sampling first 32 IPs +2025-07-26 12:43:31,329 - ip_reader - INFO - IPv6 network 2402:4e00:37:10e4::/62 - sampling first 32 IPs +2025-07-26 12:43:31,329 - ip_reader - INFO - IPv6 network 2402:4e00:37:10e8::/62 - sampling first 32 IPs +2025-07-26 12:43:31,329 - ip_reader - INFO - IPv6 network 2402:4e00:37:10ec::/63 - sampling first 32 IPs +2025-07-26 12:43:31,329 - ip_reader - INFO - IPv6 network 2402:4e00:37:10ef::/64 - sampling first 32 IPs +2025-07-26 12:43:31,329 - ip_reader - INFO - IPv6 network 2402:4e00:37:10f1::/64 - sampling first 32 IPs +2025-07-26 12:43:31,330 - ip_reader - INFO - IPv6 network 2402:4e00:37:10f2::/64 - sampling first 32 IPs +2025-07-26 12:43:31,330 - ip_reader - INFO - IPv6 network 2402:4e00:37:10f4::/62 - sampling first 32 IPs +2025-07-26 12:43:31,330 - ip_reader - INFO - IPv6 network 2402:4e00:37:10fc::/64 - sampling first 32 IPs +2025-07-26 12:43:31,330 - ip_reader - INFO - IPv6 network 2402:4e00:37:10fe::/64 - sampling first 32 IPs +2025-07-26 12:43:31,330 - ip_reader - INFO - IPv6 network 2402:4e00:43:ef::/64 - sampling first 32 IPs +2025-07-26 12:43:31,330 - ip_reader - INFO - IPv6 network 2402:4e00:43:f0::/64 - sampling first 32 IPs +2025-07-26 12:43:31,330 - ip_reader - INFO - IPv6 network 2402:4e00:43:fd::/64 - sampling first 32 IPs +2025-07-26 12:43:31,330 - ip_reader - INFO - IPv6 network 2402:4e00:a2:df::/64 - sampling first 32 IPs +2025-07-26 12:43:31,330 - ip_reader - INFO - IPv6 network 2402:4e00:a2:e4::/63 - sampling first 32 IPs +2025-07-26 12:43:31,330 - ip_reader - INFO - IPv6 network 2402:4e00:a2:e6::/64 - sampling first 32 IPs +2025-07-26 12:43:31,331 - ip_reader - INFO - IPv6 network 2402:4e00:a2:eb::/64 - sampling first 32 IPs +2025-07-26 12:43:31,331 - ip_reader - INFO - IPv6 network 2402:4e00:a2:ec::/64 - sampling first 32 IPs +2025-07-26 12:43:31,331 - ip_reader - INFO - IPv6 network 2402:4e00:a2:ef::/64 - sampling first 32 IPs +2025-07-26 12:43:31,331 - ip_reader - INFO - IPv6 network 2402:4e00:a2:f1::/64 - sampling first 32 IPs +2025-07-26 12:43:31,331 - ip_reader - INFO - IPv6 network 2402:4e00:a2:f5::/64 - sampling first 32 IPs +2025-07-26 12:43:31,331 - ip_reader - INFO - IPv6 network 2402:4e00:a2:f8::/63 - sampling first 32 IPs +2025-07-26 12:43:31,331 - ip_reader - INFO - IPv6 network 2402:4e00:a2:ff::/64 - sampling first 32 IPs +2025-07-26 12:43:31,331 - ip_reader - INFO - IPv6 network 2402:4e00:c010:4::/64 - sampling first 32 IPs +2025-07-26 12:43:31,331 - ip_reader - INFO - IPv6 network 2402:4e00:c031:7fc::/63 - sampling first 32 IPs +2025-07-26 12:43:31,331 - ip_reader - INFO - IPv6 network 2402:4e00:c031:7fe::/64 - sampling first 32 IPs +2025-07-26 12:43:31,332 - ip_reader - INFO - IPv6 network 2402:4e00:c042:300::/63 - sampling first 32 IPs +2025-07-26 12:43:31,332 - ip_reader - INFO - IPv6 network 2402:4e00:c042:309::/64 - sampling first 32 IPs +2025-07-26 12:43:31,332 - ip_reader - INFO - IPv6 network 2402:4e00:c042:310::/64 - sampling first 32 IPs +2025-07-26 12:43:31,332 - ip_reader - INFO - IPv6 network 2402:4e00:c050:13::/64 - sampling first 32 IPs +2025-07-26 12:43:31,332 - ip_reader - INFO - IPv6 network 2402:4e00:c050:1a::/63 - sampling first 32 IPs +2025-07-26 12:43:31,332 - ip_reader - INFO - IPv6 network 2402:4e00:c050:1c::/63 - sampling first 32 IPs +2025-07-26 12:43:31,332 - ip_reader - INFO - IPv6 network 2402:4e00:c050:2c::/63 - sampling first 32 IPs +2025-07-26 12:43:31,332 - ip_reader - INFO - IPv6 network 2402:4e00:c050:4c::/64 - sampling first 32 IPs +2025-07-26 12:43:31,332 - ip_reader - INFO - IPv6 network 2402:4e00:c050:8::/64 - sampling first 32 IPs +2025-07-26 12:43:31,332 - ip_reader - INFO - IPv6 network 2402:4e00:c050::/64 - sampling first 32 IPs +2025-07-26 12:43:31,333 - ip_reader - INFO - IPv6 network 2402:4e00:c050:b::/64 - sampling first 32 IPs +2025-07-26 12:43:31,333 - ip_reader - INFO - IPv6 network 2402:4e00:c050:c::/63 - sampling first 32 IPs +2025-07-26 12:43:31,333 - ip_reader - INFO - IPv6 network 2402:4e00:c050:e::/64 - sampling first 32 IPs +2025-07-26 12:43:31,333 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10d1::/64 - sampling first 32 IPs +2025-07-26 12:43:31,333 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10d6::/64 - sampling first 32 IPs +2025-07-26 12:43:31,333 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10ef::/64 - sampling first 32 IPs +2025-07-26 12:43:31,333 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10f1::/64 - sampling first 32 IPs +2025-07-26 12:43:31,333 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10f2::/63 - sampling first 32 IPs +2025-07-26 12:43:31,333 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10f6::/63 - sampling first 32 IPs +2025-07-26 12:43:31,333 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10fa::/64 - sampling first 32 IPs +2025-07-26 12:43:31,334 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10fd::/64 - sampling first 32 IPs +2025-07-26 12:43:31,334 - ip_reader - INFO - IPv6 network 2402:4e00:c2:10ff::/64 - sampling first 32 IPs +2025-07-26 12:43:31,334 - ip_reader - INFO - IPv6 network 2408:862a:240:2::/64 - sampling first 32 IPs +2025-07-26 12:43:31,334 - ip_reader - INFO - IPv6 network 2408:8670:3af0:32::/64 - sampling first 32 IPs +2025-07-26 12:43:31,334 - ip_reader - INFO - IPv6 network 2408:8706:0:400::/64 - sampling first 32 IPs +2025-07-26 12:43:31,334 - ip_reader - INFO - IPv6 network 2408:8706:2:300d::/64 - sampling first 32 IPs +2025-07-26 12:43:31,334 - ip_reader - INFO - IPv6 network 2408:8706:2:300e::/64 - sampling first 32 IPs +2025-07-26 12:43:31,334 - ip_reader - INFO - IPv6 network 2408:870c:1020:11::/64 - sampling first 32 IPs +2025-07-26 12:43:31,334 - ip_reader - INFO - IPv6 network 2408:8710:20:11a0::/63 - sampling first 32 IPs +2025-07-26 12:43:31,334 - ip_reader - INFO - IPv6 network 2408:8719:1100:91::/64 - sampling first 32 IPs +2025-07-26 12:43:31,335 - ip_reader - INFO - IPv6 network 2408:8719:1100:92::/63 - sampling first 32 IPs +2025-07-26 12:43:31,335 - ip_reader - INFO - IPv6 network 2408:8719:1100:94::/63 - sampling first 32 IPs +2025-07-26 12:43:31,335 - ip_reader - INFO - IPv6 network 2408:8719:1100:96::/64 - sampling first 32 IPs +2025-07-26 12:43:31,335 - ip_reader - INFO - IPv6 network 2408:8719:40e:39::/64 - sampling first 32 IPs +2025-07-26 12:43:31,335 - ip_reader - INFO - IPv6 network 2408:8719:40e:3a::/63 - sampling first 32 IPs +2025-07-26 12:43:31,335 - ip_reader - INFO - IPv6 network 2408:8719:40e:3c::/64 - sampling first 32 IPs +2025-07-26 12:43:31,335 - ip_reader - INFO - IPv6 network 2408:8719:40f:18::/64 - sampling first 32 IPs +2025-07-26 12:43:31,335 - ip_reader - INFO - IPv6 network 2408:871a:5100:140::/64 - sampling first 32 IPs +2025-07-26 12:43:31,335 - ip_reader - INFO - IPv6 network 2408:8720:806:300::/64 - sampling first 32 IPs +2025-07-26 12:43:31,336 - ip_reader - INFO - IPv6 network 2408:8726:1001:111::/64 - sampling first 32 IPs +2025-07-26 12:43:31,336 - ip_reader - INFO - IPv6 network 2408:8726:1001:112::/63 - sampling first 32 IPs +2025-07-26 12:43:31,336 - ip_reader - INFO - IPv6 network 2408:8726:1001:114::/64 - sampling first 32 IPs +2025-07-26 12:43:31,336 - ip_reader - INFO - IPv6 network 2408:8726:1001:116::/63 - sampling first 32 IPs +2025-07-26 12:43:31,336 - ip_reader - INFO - IPv6 network 2408:872f:20:210::/63 - sampling first 32 IPs +2025-07-26 12:43:31,336 - ip_reader - INFO - IPv6 network 2408:8734:4012:1::/64 - sampling first 32 IPs +2025-07-26 12:43:31,336 - ip_reader - INFO - IPv6 network 2408:8734:4012:2::/64 - sampling first 32 IPs +2025-07-26 12:43:31,336 - ip_reader - INFO - IPv6 network 2408:8734:4012:4::/64 - sampling first 32 IPs +2025-07-26 12:43:31,336 - ip_reader - INFO - IPv6 network 2408:8738:b000:1c::/64 - sampling first 32 IPs +2025-07-26 12:43:31,336 - ip_reader - INFO - IPv6 network 2408:873c:5011::/64 - sampling first 32 IPs +2025-07-26 12:43:31,337 - ip_reader - INFO - IPv6 network 2408:873c:5811:78::/64 - sampling first 32 IPs +2025-07-26 12:43:31,337 - ip_reader - INFO - IPv6 network 2408:873c:5811:a3::/64 - sampling first 32 IPs +2025-07-26 12:43:31,337 - ip_reader - INFO - IPv6 network 2408:873c:5811:ae::/64 - sampling first 32 IPs +2025-07-26 12:43:31,337 - ip_reader - INFO - IPv6 network 2408:873d:2011:41::/64 - sampling first 32 IPs +2025-07-26 12:43:31,337 - ip_reader - INFO - IPv6 network 2408:873d:2011:43::/64 - sampling first 32 IPs +2025-07-26 12:43:31,337 - ip_reader - INFO - IPv6 network 2408:873d:2011:44::/63 - sampling first 32 IPs +2025-07-26 12:43:31,337 - ip_reader - INFO - IPv6 network 2408:873d:2011:47::/64 - sampling first 32 IPs +2025-07-26 12:43:31,337 - ip_reader - INFO - IPv6 network 2408:873d:2011:49::/64 - sampling first 32 IPs +2025-07-26 12:43:31,337 - ip_reader - INFO - IPv6 network 2408:8740:d1fe:52::/63 - sampling first 32 IPs +2025-07-26 12:43:31,337 - ip_reader - INFO - IPv6 network 2408:8740:d1fe:54::/62 - sampling first 32 IPs +2025-07-26 12:43:31,337 - ip_reader - INFO - IPv6 network 2408:8740:d1fe:58::/63 - sampling first 32 IPs +2025-07-26 12:43:31,338 - ip_reader - INFO - IPv6 network 2408:8744:d05:11::/64 - sampling first 32 IPs +2025-07-26 12:43:31,338 - ip_reader - INFO - IPv6 network 2408:8744:d05:12::/64 - sampling first 32 IPs +2025-07-26 12:43:31,338 - ip_reader - INFO - IPv6 network 2408:8748:a100:33::/64 - sampling first 32 IPs +2025-07-26 12:43:31,338 - ip_reader - INFO - IPv6 network 2408:8748:a100:34::/63 - sampling first 32 IPs +2025-07-26 12:43:31,338 - ip_reader - INFO - IPv6 network 2408:8748:a100:36::/64 - sampling first 32 IPs +2025-07-26 12:43:31,338 - ip_reader - INFO - IPv6 network 2408:8748:a102:3041::/64 - sampling first 32 IPs +2025-07-26 12:43:31,338 - ip_reader - INFO - IPv6 network 2408:8748:a102:3042::/63 - sampling first 32 IPs +2025-07-26 12:43:31,338 - ip_reader - INFO - IPv6 network 2408:8748:a102:3044::/62 - sampling first 32 IPs +2025-07-26 12:43:31,338 - ip_reader - INFO - IPv6 network 2408:8748:a102:3048::/63 - sampling first 32 IPs +2025-07-26 12:43:31,338 - ip_reader - INFO - IPv6 network 2408:8749:c110:800::/64 - sampling first 32 IPs +2025-07-26 12:43:31,339 - ip_reader - INFO - IPv6 network 2408:874c:1ff:80::/64 - sampling first 32 IPs +2025-07-26 12:43:31,339 - ip_reader - INFO - IPv6 network 2408:874c:1ff:82::/63 - sampling first 32 IPs +2025-07-26 12:43:31,339 - ip_reader - INFO - IPv6 network 2408:874c:1ff:84::/62 - sampling first 32 IPs +2025-07-26 12:43:31,339 - ip_reader - INFO - IPv6 network 2408:874c:1ff:88::/64 - sampling first 32 IPs +2025-07-26 12:43:31,339 - ip_reader - INFO - IPv6 network 2408:874d:a00:b::/64 - sampling first 32 IPs +2025-07-26 12:43:31,339 - ip_reader - INFO - IPv6 network 2408:874d:a00:c::/64 - sampling first 32 IPs +2025-07-26 12:43:31,339 - ip_reader - INFO - IPv6 network 2408:874f:3001:310::/64 - sampling first 32 IPs +2025-07-26 12:43:31,339 - ip_reader - INFO - IPv6 network 2408:8752:e00:80::/63 - sampling first 32 IPs +2025-07-26 12:43:31,339 - ip_reader - INFO - IPv6 network 2408:8752:e00:b0::/61 - sampling first 32 IPs +2025-07-26 12:43:31,339 - ip_reader - INFO - IPv6 network 2408:8752:e00:b8::/64 - sampling first 32 IPs +2025-07-26 12:43:31,340 - ip_reader - INFO - IPv6 network 2408:8756:2cff:e401::/64 - sampling first 32 IPs +2025-07-26 12:43:31,340 - ip_reader - INFO - IPv6 network 2408:8756:2cff:e402::/63 - sampling first 32 IPs +2025-07-26 12:43:31,340 - ip_reader - INFO - IPv6 network 2408:8756:2cff:e404::/64 - sampling first 32 IPs +2025-07-26 12:43:31,340 - ip_reader - INFO - IPv6 network 2408:8756:4cff:d602::/63 - sampling first 32 IPs +2025-07-26 12:43:31,340 - ip_reader - INFO - IPv6 network 2408:8756:4cff:d604::/64 - sampling first 32 IPs +2025-07-26 12:43:31,340 - ip_reader - INFO - IPv6 network 2408:8756:4cff:d606::/63 - sampling first 32 IPs +2025-07-26 12:43:31,340 - ip_reader - INFO - IPv6 network 2408:8756:4cff:d608::/63 - sampling first 32 IPs +2025-07-26 12:43:31,340 - ip_reader - INFO - IPv6 network 2408:8756:d0fb:16c::/64 - sampling first 32 IPs +2025-07-26 12:43:31,340 - ip_reader - INFO - IPv6 network 2408:8756:d0fb:170::/64 - sampling first 32 IPs +2025-07-26 12:43:31,340 - ip_reader - INFO - IPv6 network 2408:875c:0:80::/63 - sampling first 32 IPs +2025-07-26 12:43:31,341 - ip_reader - INFO - IPv6 network 2408:8760:119:4::/63 - sampling first 32 IPs +2025-07-26 12:43:31,341 - ip_reader - INFO - IPv6 network 2408:8764:22:1f::/64 - sampling first 32 IPs +2025-07-26 12:43:31,341 - ip_reader - INFO - IPv6 network 2408:8766:0:101c::/64 - sampling first 32 IPs +2025-07-26 12:43:31,341 - ip_reader - INFO - IPv6 network 2408:876a:1000:22::/64 - sampling first 32 IPs +2025-07-26 12:43:31,341 - ip_reader - INFO - IPv6 network 2408:876a:1000:24::/64 - sampling first 32 IPs +2025-07-26 12:43:31,341 - ip_reader - INFO - IPv6 network 2408:876c:1780:122::/64 - sampling first 32 IPs +2025-07-26 12:43:31,341 - ip_reader - INFO - IPv6 network 2408:8770:0:d1::/64 - sampling first 32 IPs +2025-07-26 12:43:31,341 - ip_reader - INFO - IPv6 network 2408:8770:0:d2::/64 - sampling first 32 IPs +2025-07-26 12:43:31,342 - ip_reader - INFO - IPv6 network 2408:8770:0:d6::/63 - sampling first 32 IPs +2025-07-26 12:43:31,342 - ip_reader - INFO - IPv6 network 2408:8770:0:d8::/64 - sampling first 32 IPs +2025-07-26 12:43:31,342 - ip_reader - INFO - IPv6 network 2408:8776:1:c::/64 - sampling first 32 IPs +2025-07-26 12:43:31,342 - ip_reader - INFO - IPv6 network 2408:8779:c001:3::/64 - sampling first 32 IPs +2025-07-26 12:43:31,342 - ip_reader - INFO - IPv6 network 2408:877a:2000:f::/64 - sampling first 32 IPs +2025-07-26 12:43:31,342 - ip_reader - INFO - IPv6 network 2409:8702:489c::/64 - sampling first 32 IPs +2025-07-26 12:43:31,342 - ip_reader - INFO - IPv6 network 2409:875e:5088:c1::/64 - sampling first 32 IPs +2025-07-26 12:43:31,342 - ip_reader - INFO - IPv6 network 2409:8c04:110e:4001::/64 - sampling first 32 IPs +2025-07-26 12:43:31,342 - ip_reader - INFO - IPv6 network 2409:8c0c:310:21d::/64 - sampling first 32 IPs +2025-07-26 12:43:31,343 - ip_reader - INFO - IPv6 network 2409:8c0c:310:21e::/63 - sampling first 32 IPs +2025-07-26 12:43:31,343 - ip_reader - INFO - IPv6 network 2409:8c0c:310:220::/64 - sampling first 32 IPs +2025-07-26 12:43:31,343 - ip_reader - INFO - IPv6 network 2409:8c0c:310:222::/63 - sampling first 32 IPs +2025-07-26 12:43:31,343 - ip_reader - INFO - IPv6 network 2409:8c10:c00:1404::/64 - sampling first 32 IPs +2025-07-26 12:43:31,343 - ip_reader - INFO - IPv6 network 2409:8c10:c00:68::/64 - sampling first 32 IPs +2025-07-26 12:43:31,343 - ip_reader - INFO - IPv6 network 2409:8c14:f2c:1001::/64 - sampling first 32 IPs +2025-07-26 12:43:31,343 - ip_reader - INFO - IPv6 network 2409:8c1c:300:17::/64 - sampling first 32 IPs +2025-07-26 12:43:31,343 - ip_reader - INFO - IPv6 network 2409:8c1e:68e0:a08::/64 - sampling first 32 IPs +2025-07-26 12:43:31,343 - ip_reader - INFO - IPv6 network 2409:8c1e:8f80:2::/64 - sampling first 32 IPs +2025-07-26 12:43:31,344 - ip_reader - INFO - IPv6 network 2409:8c20:1834:461::/64 - sampling first 32 IPs +2025-07-26 12:43:31,344 - ip_reader - INFO - IPv6 network 2409:8c20:1834:463::/64 - sampling first 32 IPs +2025-07-26 12:43:31,344 - ip_reader - INFO - IPv6 network 2409:8c20:1834:464::/63 - sampling first 32 IPs +2025-07-26 12:43:31,344 - ip_reader - INFO - IPv6 network 2409:8c20:1834:467::/64 - sampling first 32 IPs +2025-07-26 12:43:31,344 - ip_reader - INFO - IPv6 network 2409:8c20:1834:469::/64 - sampling first 32 IPs +2025-07-26 12:43:31,344 - ip_reader - INFO - IPv6 network 2409:8c20:5021:160::/64 - sampling first 32 IPs +2025-07-26 12:43:31,344 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1dd::/64 - sampling first 32 IPs +2025-07-26 12:43:31,344 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1de::/63 - sampling first 32 IPs +2025-07-26 12:43:31,344 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1e1::/64 - sampling first 32 IPs +2025-07-26 12:43:31,345 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1e2::/63 - sampling first 32 IPs +2025-07-26 12:43:31,345 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1e4::/64 - sampling first 32 IPs +2025-07-26 12:43:31,345 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1e6::/64 - sampling first 32 IPs +2025-07-26 12:43:31,345 - ip_reader - INFO - IPv6 network 2409:8c20:9c71:1e8::/64 - sampling first 32 IPs +2025-07-26 12:43:31,345 - ip_reader - INFO - IPv6 network 2409:8c20:b281:19::/64 - sampling first 32 IPs +2025-07-26 12:43:31,345 - ip_reader - INFO - IPv6 network 2409:8c28:203:308::/64 - sampling first 32 IPs +2025-07-26 12:43:31,345 - ip_reader - INFO - IPv6 network 2409:8c28:203:34::/64 - sampling first 32 IPs +2025-07-26 12:43:31,345 - ip_reader - INFO - IPv6 network 2409:8c28:2808:11::/64 - sampling first 32 IPs +2025-07-26 12:43:31,346 - ip_reader - INFO - IPv6 network 2409:8c28:2808:12::/63 - sampling first 32 IPs +2025-07-26 12:43:31,346 - ip_reader - INFO - IPv6 network 2409:8c28:2808:14::/63 - sampling first 32 IPs +2025-07-26 12:43:31,346 - ip_reader - INFO - IPv6 network 2409:8c28:2808:d::/64 - sampling first 32 IPs +2025-07-26 12:43:31,346 - ip_reader - INFO - IPv6 network 2409:8c28:2808:e::/63 - sampling first 32 IPs +2025-07-26 12:43:31,346 - ip_reader - INFO - IPv6 network 2409:8c30:1000:20::/64 - sampling first 32 IPs +2025-07-26 12:43:31,346 - ip_reader - INFO - IPv6 network 2409:8c34:2220:30a::/64 - sampling first 32 IPs +2025-07-26 12:43:31,346 - ip_reader - INFO - IPv6 network 2409:8c34:e00:41::/64 - sampling first 32 IPs +2025-07-26 12:43:31,346 - ip_reader - INFO - IPv6 network 2409:8c34:e00:42::/63 - sampling first 32 IPs +2025-07-26 12:43:31,346 - ip_reader - INFO - IPv6 network 2409:8c34:e00:44::/62 - sampling first 32 IPs +2025-07-26 12:43:31,347 - ip_reader - INFO - IPv6 network 2409:8c34:e00:48::/63 - sampling first 32 IPs +2025-07-26 12:43:31,347 - ip_reader - INFO - IPv6 network 2409:8c38:80:1c0::/64 - sampling first 32 IPs +2025-07-26 12:43:31,347 - ip_reader - INFO - IPv6 network 2409:8c38:80:1c2::/63 - sampling first 32 IPs +2025-07-26 12:43:31,347 - ip_reader - INFO - IPv6 network 2409:8c38:80:1c4::/62 - sampling first 32 IPs +2025-07-26 12:43:31,347 - ip_reader - INFO - IPv6 network 2409:8c38:80:1c8::/64 - sampling first 32 IPs +2025-07-26 12:43:31,347 - ip_reader - INFO - IPv6 network 2409:8c38:80:1f1::/64 - sampling first 32 IPs +2025-07-26 12:43:31,347 - ip_reader - INFO - IPv6 network 2409:8c38:80:1f2::/63 - sampling first 32 IPs +2025-07-26 12:43:31,347 - ip_reader - INFO - IPv6 network 2409:8c38:80:1f4::/64 - sampling first 32 IPs +2025-07-26 12:43:31,347 - ip_reader - INFO - IPv6 network 2409:8c3c:1300:306::/64 - sampling first 32 IPs +2025-07-26 12:43:31,348 - ip_reader - INFO - IPv6 network 2409:8c3c:900:1a1::/64 - sampling first 32 IPs +2025-07-26 12:43:31,348 - ip_reader - INFO - IPv6 network 2409:8c3c:900:1a2::/63 - sampling first 32 IPs +2025-07-26 12:43:31,348 - ip_reader - INFO - IPv6 network 2409:8c3c:900:1a4::/64 - sampling first 32 IPs +2025-07-26 12:43:31,348 - ip_reader - INFO - IPv6 network 2409:8c44:b00:4ec::/64 - sampling first 32 IPs +2025-07-26 12:43:31,348 - ip_reader - INFO - IPv6 network 2409:8c4c:e00:2011::/64 - sampling first 32 IPs +2025-07-26 12:43:31,348 - ip_reader - INFO - IPv6 network 2409:8c4c:e00:2012::/63 - sampling first 32 IPs +2025-07-26 12:43:31,348 - ip_reader - INFO - IPv6 network 2409:8c4c:e00:2014::/64 - sampling first 32 IPs +2025-07-26 12:43:31,348 - ip_reader - INFO - IPv6 network 2409:8c50:a00:2061::/64 - sampling first 32 IPs +2025-07-26 12:43:31,348 - ip_reader - INFO - IPv6 network 2409:8c50:a00:2170::/61 - sampling first 32 IPs +2025-07-26 12:43:31,349 - ip_reader - INFO - IPv6 network 2409:8c50:a00:2178::/64 - sampling first 32 IPs +2025-07-26 12:43:31,349 - ip_reader - INFO - IPv6 network 2409:8c50:a00:2252::/63 - sampling first 32 IPs +2025-07-26 12:43:31,349 - ip_reader - INFO - IPv6 network 2409:8c50:a00:2254::/64 - sampling first 32 IPs +2025-07-26 12:43:31,349 - ip_reader - INFO - IPv6 network 2409:8c54:1801:21::/64 - sampling first 32 IPs +2025-07-26 12:43:31,349 - ip_reader - INFO - IPv6 network 2409:8c54:1801:22::/63 - sampling first 32 IPs +2025-07-26 12:43:31,349 - ip_reader - INFO - IPv6 network 2409:8c54:1801:24::/64 - sampling first 32 IPs +2025-07-26 12:43:31,349 - ip_reader - INFO - IPv6 network 2409:8c54:1821:578::/64 - sampling first 32 IPs +2025-07-26 12:43:31,349 - ip_reader - INFO - IPv6 network 2409:8c54:2030:222::/63 - sampling first 32 IPs +2025-07-26 12:43:31,349 - ip_reader - INFO - IPv6 network 2409:8c54:2030:224::/64 - sampling first 32 IPs +2025-07-26 12:43:31,350 - ip_reader - INFO - IPv6 network 2409:8c54:2030:226::/63 - sampling first 32 IPs +2025-07-26 12:43:31,350 - ip_reader - INFO - IPv6 network 2409:8c54:2030:228::/63 - sampling first 32 IPs +2025-07-26 12:43:31,350 - ip_reader - INFO - IPv6 network 2409:8c5c:110:50::/64 - sampling first 32 IPs +2025-07-26 12:43:31,350 - ip_reader - INFO - IPv6 network 2409:8c5e:5000:c2::/64 - sampling first 32 IPs +2025-07-26 12:43:31,350 - ip_reader - INFO - IPv6 network 2409:8c60:2500:5d::/64 - sampling first 32 IPs +2025-07-26 12:43:31,350 - ip_reader - INFO - IPv6 network 2409:8c62:e10:218::/64 - sampling first 32 IPs +2025-07-26 12:43:31,350 - ip_reader - INFO - IPv6 network 2409:8c6a:b021:74::/64 - sampling first 32 IPs +2025-07-26 12:43:31,350 - ip_reader - INFO - IPv6 network 2409:8c6c:561:8110::/62 - sampling first 32 IPs +2025-07-26 12:43:31,351 - ip_reader - INFO - IPv6 network 2409:8c70:3a10:16::/64 - sampling first 32 IPs +2025-07-26 12:43:31,351 - ip_reader - INFO - IPv6 network 2409:8c70:3a91:51::/64 - sampling first 32 IPs +2025-07-26 12:43:31,351 - ip_reader - INFO - IPv6 network 2409:8c70:3a91:52::/64 - sampling first 32 IPs +2025-07-26 12:43:31,351 - ip_reader - INFO - IPv6 network 2409:8c70:3a91:56::/63 - sampling first 32 IPs +2025-07-26 12:43:31,351 - ip_reader - INFO - IPv6 network 2409:8c70:3a91:58::/64 - sampling first 32 IPs +2025-07-26 12:43:31,351 - ip_reader - INFO - IPv6 network 2409:8c74:f100:864::/64 - sampling first 32 IPs +2025-07-26 12:43:31,351 - ip_reader - INFO - IPv6 network 2409:8c78:100:24::/64 - sampling first 32 IPs +2025-07-26 12:43:31,351 - ip_reader - INFO - IPv6 network 2409:8c7a:2604::/64 - sampling first 32 IPs +2025-07-26 12:43:31,351 - ip_reader - INFO - IPv6 network 240e:90d:1101:4508::/64 - sampling first 32 IPs +2025-07-26 12:43:31,352 - ip_reader - INFO - IPv6 network 240e:90d:1101:4510::/64 - sampling first 32 IPs +2025-07-26 12:43:31,352 - ip_reader - INFO - IPv6 network 240e:910:e000:2504::/64 - sampling first 32 IPs +2025-07-26 12:43:31,352 - ip_reader - INFO - IPv6 network 240e:914:5009:1002::/63 - sampling first 32 IPs +2025-07-26 12:43:31,352 - ip_reader - INFO - IPv6 network 240e:914:5009:a::/63 - sampling first 32 IPs +2025-07-26 12:43:31,352 - ip_reader - INFO - IPv6 network 240e:925:2:701::/64 - sampling first 32 IPs +2025-07-26 12:43:31,352 - ip_reader - INFO - IPv6 network 240e:925:2:702::/63 - sampling first 32 IPs +2025-07-26 12:43:31,352 - ip_reader - INFO - IPv6 network 240e:925:2:704::/64 - sampling first 32 IPs +2025-07-26 12:43:31,352 - ip_reader - INFO - IPv6 network 240e:925:2:706::/63 - sampling first 32 IPs +2025-07-26 12:43:31,352 - ip_reader - INFO - IPv6 network 240e:926:3004:21::/64 - sampling first 32 IPs +2025-07-26 12:43:31,353 - ip_reader - INFO - IPv6 network 240e:930:c200:70::/63 - sampling first 32 IPs +2025-07-26 12:43:31,353 - ip_reader - INFO - IPv6 network 240e:935:a04:2708::/64 - sampling first 32 IPs +2025-07-26 12:43:31,353 - ip_reader - INFO - IPv6 network 240e:93c:1201:2::/63 - sampling first 32 IPs +2025-07-26 12:43:31,353 - ip_reader - INFO - IPv6 network 240e:93c:1201:4::/64 - sampling first 32 IPs +2025-07-26 12:43:31,353 - ip_reader - INFO - IPv6 network 240e:93c:1201:d::/64 - sampling first 32 IPs +2025-07-26 12:43:31,353 - ip_reader - INFO - IPv6 network 240e:940:20c:308::/64 - sampling first 32 IPs +2025-07-26 12:43:31,353 - ip_reader - INFO - IPv6 network 240e:946:3000:8008::/63 - sampling first 32 IPs +2025-07-26 12:43:31,353 - ip_reader - INFO - IPv6 network 240e:94a:b01:214::/63 - sampling first 32 IPs +2025-07-26 12:43:31,354 - ip_reader - INFO - IPv6 network 240e:94c:0:2701::/64 - sampling first 32 IPs +2025-07-26 12:43:31,354 - ip_reader - INFO - IPv6 network 240e:94c:0:2702::/63 - sampling first 32 IPs +2025-07-26 12:43:31,354 - ip_reader - INFO - IPv6 network 240e:94c:0:2704::/64 - sampling first 32 IPs +2025-07-26 12:43:31,354 - ip_reader - INFO - IPv6 network 240e:950:1:2002::/64 - sampling first 32 IPs +2025-07-26 12:43:31,354 - ip_reader - INFO - IPv6 network 240e:958:2300:220::/64 - sampling first 32 IPs +2025-07-26 12:43:31,354 - ip_reader - INFO - IPv6 network 240e:958:6003:108::/64 - sampling first 32 IPs +2025-07-26 12:43:31,354 - ip_reader - INFO - IPv6 network 240e:95e:4001:1::/64 - sampling first 32 IPs +2025-07-26 12:43:31,354 - ip_reader - INFO - IPv6 network 240e:95e:4001:2::/63 - sampling first 32 IPs +2025-07-26 12:43:31,354 - ip_reader - INFO - IPv6 network 240e:95e:4001:4::/64 - sampling first 32 IPs +2025-07-26 12:43:31,355 - ip_reader - INFO - IPv6 network 240e:960:200:90::/64 - sampling first 32 IPs +2025-07-26 12:43:31,355 - ip_reader - INFO - IPv6 network 240e:960:200:92::/63 - sampling first 32 IPs +2025-07-26 12:43:31,355 - ip_reader - INFO - IPv6 network 240e:960:200:94::/62 - sampling first 32 IPs +2025-07-26 12:43:31,355 - ip_reader - INFO - IPv6 network 240e:960:200:98::/64 - sampling first 32 IPs +2025-07-26 12:43:31,355 - ip_reader - INFO - IPv6 network 240e:964:5002:109::/64 - sampling first 32 IPs +2025-07-26 12:43:31,355 - ip_reader - INFO - IPv6 network 240e:964:5002:10a::/63 - sampling first 32 IPs +2025-07-26 12:43:31,355 - ip_reader - INFO - IPv6 network 240e:964:5002:10c::/64 - sampling first 32 IPs +2025-07-26 12:43:31,355 - ip_reader - INFO - IPv6 network 240e:965:802:b01::/64 - sampling first 32 IPs +2025-07-26 12:43:31,355 - ip_reader - INFO - IPv6 network 240e:965:802:b02::/63 - sampling first 32 IPs +2025-07-26 12:43:31,355 - ip_reader - INFO - IPv6 network 240e:965:802:b04::/62 - sampling first 32 IPs +2025-07-26 12:43:31,355 - ip_reader - INFO - IPv6 network 240e:965:802:b08::/63 - sampling first 32 IPs +2025-07-26 12:43:31,356 - ip_reader - INFO - IPv6 network 240e:96c:6400:a00::/64 - sampling first 32 IPs +2025-07-26 12:43:31,356 - ip_reader - INFO - IPv6 network 240e:974:e200:4209::/64 - sampling first 32 IPs +2025-07-26 12:43:31,356 - ip_reader - INFO - IPv6 network 240e:974:e200:420a::/63 - sampling first 32 IPs +2025-07-26 12:43:31,356 - ip_reader - INFO - IPv6 network 240e:974:e200:420c::/63 - sampling first 32 IPs +2025-07-26 12:43:31,356 - ip_reader - INFO - IPv6 network 240e:978:2608:800::/64 - sampling first 32 IPs +2025-07-26 12:43:31,356 - ip_reader - INFO - IPv6 network 240e:978:2903:50a7::/64 - sampling first 32 IPs +2025-07-26 12:43:31,356 - ip_reader - INFO - IPv6 network 240e:978:2903:50a9::/64 - sampling first 32 IPs +2025-07-26 12:43:31,356 - ip_reader - INFO - IPv6 network 240e:978:b34:1::/64 - sampling first 32 IPs +2025-07-26 12:43:31,356 - ip_reader - INFO - IPv6 network 240e:978:d04:2082::/63 - sampling first 32 IPs +2025-07-26 12:43:31,356 - ip_reader - INFO - IPv6 network 240e:978:d04:2085::/64 - sampling first 32 IPs +2025-07-26 12:43:31,357 - ip_reader - INFO - IPv6 network 240e:978:d04:2086::/63 - sampling first 32 IPs +2025-07-26 12:43:31,357 - ip_reader - INFO - IPv6 network 240e:978:d04:2088::/64 - sampling first 32 IPs +2025-07-26 12:43:31,357 - ip_reader - INFO - IPv6 network 240e:978:d04:208b::/64 - sampling first 32 IPs +2025-07-26 12:43:31,357 - ip_reader - INFO - IPv6 network 240e:978:d04:208c::/62 - sampling first 32 IPs +2025-07-26 12:43:31,357 - ip_reader - INFO - IPv6 network 240e:978:d04:2090::/63 - sampling first 32 IPs +2025-07-26 12:43:31,357 - ip_reader - INFO - IPv6 network 240e:979:f07:1::/64 - sampling first 32 IPs +2025-07-26 12:43:31,357 - ip_reader - INFO - IPv6 network 240e:979:f07:3::/64 - sampling first 32 IPs +2025-07-26 12:43:31,357 - ip_reader - INFO - IPv6 network 240e:979:f07:4::/63 - sampling first 32 IPs +2025-07-26 12:43:31,357 - ip_reader - INFO - IPv6 network 240e:979:f07:7::/64 - sampling first 32 IPs +2025-07-26 12:43:31,357 - ip_reader - INFO - IPv6 network 240e:979:f07:9::/64 - sampling first 32 IPs +2025-07-26 12:43:31,358 - ip_reader - INFO - IPv6 network 240e:97c:4040:200::/63 - sampling first 32 IPs +2025-07-26 12:43:31,358 - ip_reader - INFO - IPv6 network 240e:97d:10:25de::/64 - sampling first 32 IPs +2025-07-26 12:43:31,358 - ip_reader - INFO - IPv6 network 240e:97d:10:25e7::/64 - sampling first 32 IPs +2025-07-26 12:43:31,358 - ip_reader - INFO - IPv6 network 240e:97d:2000:b02::/63 - sampling first 32 IPs +2025-07-26 12:43:31,358 - ip_reader - INFO - IPv6 network 240e:97d:2000:b04::/64 - sampling first 32 IPs +2025-07-26 12:43:31,358 - ip_reader - INFO - IPv6 network 240e:97d:2000:b06::/63 - sampling first 32 IPs +2025-07-26 12:43:31,358 - ip_reader - INFO - IPv6 network 240e:97d:2000:b08::/63 - sampling first 32 IPs +2025-07-26 12:43:31,358 - ip_reader - INFO - IPv6 network 240e:980:1200:b14::/63 - sampling first 32 IPs +2025-07-26 12:43:31,358 - ip_reader - INFO - IPv6 network 240e:983:705:2::/64 - sampling first 32 IPs +2025-07-26 12:43:31,358 - ip_reader - INFO - IPv6 network 240e:b1:c808:9::/64 - sampling first 32 IPs +2025-07-26 12:43:31,359 - ip_reader - INFO - IPv6 network 240e:b1:c808:a::/64 - sampling first 32 IPs +2025-07-26 12:43:31,359 - ip_reader - INFO - IPv6 network 240e:b1:c808:c::/63 - sampling first 32 IPs +2025-07-26 12:43:31,359 - ip_reader - INFO - IPv6 network 240e:bf:b800:4131::/64 - sampling first 32 IPs +2025-07-26 12:43:31,359 - ip_reader - INFO - IPv6 network 240e:bf:b800:4132::/64 - sampling first 32 IPs +2025-07-26 12:43:31,359 - ip_reader - INFO - IPv6 network 240e:bf:b800:4136::/63 - sampling first 32 IPs +2025-07-26 12:43:31,359 - ip_reader - INFO - IPv6 network 240e:bf:b800:4138::/64 - sampling first 32 IPs +2025-07-26 12:43:31,359 - ip_reader - INFO - IPv6 network 240e:bf:c800:2915::/64 - sampling first 32 IPs +2025-07-26 12:43:31,359 - ip_reader - INFO - IPv6 network 240e:bf:c800:2916::/64 - sampling first 32 IPs +2025-07-26 12:43:31,359 - ip_reader - INFO - IPv6 network 240e:c2:1800:110::/61 - sampling first 32 IPs +2025-07-26 12:43:31,359 - ip_reader - INFO - IPv6 network 240e:c2:1800:118::/64 - sampling first 32 IPs +2025-07-26 12:43:31,359 - ip_reader - INFO - IPv6 network 240e:c2:1800:ab::/64 - sampling first 32 IPs +2025-07-26 12:43:31,360 - ip_reader - INFO - IPv6 network 240e:c2:1800:ac::/64 - sampling first 32 IPs +2025-07-26 12:43:31,360 - ip_reader - INFO - IPv6 network 240e:c3:2800:205::/64 - sampling first 32 IPs +2025-07-26 12:43:31,360 - ip_reader - INFO - IPv6 network 240e:cd:ff00:118::/64 - sampling first 32 IPs +2025-07-26 12:43:31,360 - ip_reader - INFO - IPv6 network 240e:e9:b00c:33::/64 - sampling first 32 IPs +2025-07-26 12:43:31,360 - ip_reader - INFO - IPv6 network 240e:e9:b00c:34::/63 - sampling first 32 IPs +2025-07-26 12:43:31,360 - ip_reader - INFO - IPv6 network 240e:e9:b00c:36::/64 - sampling first 32 IPs +2025-07-26 12:43:31,360 - ip_reader - INFO - IPv6 network 240e:f7:a070:342::/63 - sampling first 32 IPs +2025-07-26 12:43:31,360 - ip_reader - INFO - IPv6 network 240e:f7:a070:344::/62 - sampling first 32 IPs +2025-07-26 12:43:31,360 - ip_reader - INFO - IPv6 network 240e:f7:a070:348::/63 - sampling first 32 IPs +2025-07-26 12:43:31,360 - ip_reader - INFO - IPv6 network 240e:f7:a070:3c0::/64 - sampling first 32 IPs +2025-07-26 12:43:31,361 - ip_reader - INFO - IPv6 network 240e:f7:ef00:10::/64 - sampling first 32 IPs +2025-07-26 12:43:31,361 - ip_reader - INFO - IPv6 network 2001:df1:7e00:4::/64 - sampling first 32 IPs +2025-07-26 12:43:31,361 - ip_reader - INFO - IPv6 network 2400:adc0:4041::/64 - sampling first 32 IPs +2025-07-26 12:43:31,361 - ip_reader - INFO - IPv6 network 2400:de40::/64 - sampling first 32 IPs +2025-07-26 12:43:31,361 - ip_reader - INFO - IPv6 network 2403:c280:5:1::/64 - sampling first 32 IPs +2025-07-26 12:43:31,361 - ip_reader - INFO - IPv6 network 2404:3100:d:5::/64 - sampling first 32 IPs +2025-07-26 12:43:31,361 - ip_reader - INFO - IPv6 network 2404:a140:3a:1::/64 - sampling first 32 IPs +2025-07-26 12:43:31,361 - ip_reader - INFO - IPv6 network 2404:a140:3e:6::/64 - sampling first 32 IPs +2025-07-26 12:43:31,361 - ip_reader - INFO - IPv6 network 2405:3200:101:63::/64 - sampling first 32 IPs +2025-07-26 12:43:31,361 - ip_reader - INFO - IPv6 network 2405:4800:a601::/64 - sampling first 32 IPs +2025-07-26 12:43:31,362 - ip_reader - INFO - IPv6 network 2407:2440:10:255::/64 - sampling first 32 IPs +2025-07-26 12:43:31,362 - ip_reader - INFO - IPv6 network 240d:c040:1::/64 - sampling first 32 IPs +2025-07-26 12:43:31,362 - ip_reader - INFO - IPv6 network 2602:fa80:10:2::/63 - sampling first 32 IPs +2025-07-26 12:43:31,362 - ip_reader - INFO - IPv6 network 2602:ffe4:c02:1001::/64 - sampling first 32 IPs +2025-07-26 12:43:31,362 - ip_reader - INFO - IPv6 network 2602:ffe4:c02:100c::/63 - sampling first 32 IPs +2025-07-26 12:43:31,362 - ip_reader - INFO - IPv6 network 2602:ffe4:c12:105::/64 - sampling first 32 IPs +2025-07-26 12:43:31,362 - ip_reader - INFO - IPv6 network 2602:ffe4:c15:124::/64 - sampling first 32 IPs +2025-07-26 12:43:31,362 - ip_reader - INFO - IPv6 network 2602:ffe4:c18:c201::/64 - sampling first 32 IPs +2025-07-26 12:43:31,362 - ip_reader - INFO - IPv6 network 2602:ffe4:c18:c202::/63 - sampling first 32 IPs +2025-07-26 12:43:31,362 - ip_reader - INFO - IPv6 network 2602:ffe4:c27:1000::/64 - sampling first 32 IPs +2025-07-26 12:43:31,363 - ip_reader - INFO - IPv6 network 2604:980:4002:2::/64 - sampling first 32 IPs +2025-07-26 12:43:31,363 - ip_reader - INFO - IPv6 network 2604:980:7002:6::/64 - sampling first 32 IPs +2025-07-26 12:43:31,363 - ip_reader - INFO - IPv6 network 2803:2540:f:14::/64 - sampling first 32 IPs +2025-07-26 12:43:31,363 - ip_reader - INFO - IPv6 network 2a00:12f8:3900:13::/64 - sampling first 32 IPs +2025-07-26 12:43:31,363 - ip_reader - INFO - IPv6 network 2a02:b60:2001::/64 - sampling first 32 IPs +2025-07-26 12:43:31,363 - ip_reader - INFO - IPv6 network 2a02:ce0:1:70::/64 - sampling first 32 IPs +2025-07-26 12:43:31,363 - ip_reader - INFO - IPv6 network 2a05:45c7:1:1018::/64 - sampling first 32 IPs +2025-07-26 12:43:31,363 - ip_reader - INFO - Loaded 286224 IPs for edgeone from ip_lists/edgeone.txt +2025-07-26 12:43:31,363 - ip_reader - INFO - Loaded 3 IPs for esa from ip_lists/esa.txt +2025-07-26 12:43:31,363 - ip_reader - INFO - Loaded 3 IPs for fastly from ip_lists/fastly.txt +2025-07-26 12:43:31,363 - ip_reader - INFO - Loaded 3 IPs for cloudflare from ip_lists/cloudflare.txt +2025-07-26 12:43:31,363 - ip_reader - INFO - Loaded total of 286233 IPs across 4 providers +2025-07-26 12:43:31,363 - bestcdn - INFO - Starting accessibility tests... +2025-07-26 12:43:31,367 - accessibility_tester - INFO - Starting high-performance IP accessibility testing +2025-07-26 12:43:31,428 - accessibility_tester - INFO - Testing 286233 IPs across 4 providers +2025-07-26 12:43:31,428 - accessibility_tester - INFO - Processing batch 1/287 (1000 IPs) +2025-07-26 12:43:36,472 - accessibility_tester - INFO - Batch 1 completed: 4/1000 accessible +2025-07-26 12:43:36,472 - accessibility_tester - INFO - Processing batch 2/287 (1000 IPs) +2025-07-26 12:43:41,529 - accessibility_tester - INFO - Batch 2 completed: 1/1000 accessible +2025-07-26 12:43:41,529 - accessibility_tester - INFO - Processing batch 3/287 (1000 IPs) +2025-07-26 12:43:46,579 - accessibility_tester - INFO - Batch 3 completed: 2/1000 accessible +2025-07-26 12:43:46,579 - accessibility_tester - INFO - Processing batch 4/287 (1000 IPs) +2025-07-26 12:43:51,642 - accessibility_tester - INFO - Batch 4 completed: 1/1000 accessible +2025-07-26 12:43:51,642 - accessibility_tester - INFO - Processing batch 5/287 (1000 IPs) +2025-07-26 12:43:56,690 - accessibility_tester - INFO - Batch 5 completed: 3/1000 accessible +2025-07-26 12:43:56,690 - accessibility_tester - INFO - Processing batch 6/287 (1000 IPs) +2025-07-26 12:44:01,770 - accessibility_tester - INFO - Batch 6 completed: 0/1000 accessible +2025-07-26 12:44:01,771 - accessibility_tester - INFO - Processing batch 7/287 (1000 IPs) +2025-07-26 12:44:06,832 - accessibility_tester - INFO - Batch 7 completed: 2/1000 accessible +2025-07-26 12:44:06,832 - accessibility_tester - INFO - Processing batch 8/287 (1000 IPs) +2025-07-26 12:44:11,879 - accessibility_tester - INFO - Batch 8 completed: 5/1000 accessible +2025-07-26 12:44:11,880 - accessibility_tester - INFO - Processing batch 9/287 (1000 IPs) +2025-07-26 12:44:16,941 - accessibility_tester - INFO - Batch 9 completed: 4/1000 accessible +2025-07-26 12:44:16,941 - accessibility_tester - INFO - Processing batch 10/287 (1000 IPs) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..fd8fcd1 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +aiohttp>=3.9.0 +dnspython>=2.4.0 +click>=8.1.0 +colorama>=0.4.6 +tqdm>=4.66.0 +pydantic>=2.5.0 +ujson>=5.8.0 \ No newline at end of file diff --git a/results/cpp_accessible_20250726_125038.txt b/results/cpp_accessible_20250726_125038.txt new file mode 100644 index 0000000..dcf9483 --- /dev/null +++ b/results/cpp_accessible_20250726_125038.txt @@ -0,0 +1,7 @@ +# Accessible CDN IPs - Generated by BestCDN C++ Tester +# Total accessible IPs: 2 + +# cloudflare - 2 accessible IPs +104.16.0.1 +104.17.0.1 + diff --git a/results/cpp_results_20250726_125038.json b/results/cpp_results_20250726_125038.json new file mode 100644 index 0000000..a18a550 --- /dev/null +++ b/results/cpp_results_20250726_125038.json @@ -0,0 +1,88 @@ +{ + "results" : + [ + { + "accessible" : true, + "error" : "Connection failed", + "ip" : "104.16.0.1", + "protocol" : "http", + "provider" : "cloudflare", + "response_time" : 0.64228229800000003, + "status_code" : 200 + }, + { + "accessible" : true, + "error" : "HTTP 403", + "ip" : "104.17.0.1", + "protocol" : "http", + "provider" : "cloudflare", + "response_time" : 1.472197282, + "status_code" : 200 + }, + { + "accessible" : false, + "error" : "Connection failed", + "ip" : "172.64.0.1", + "protocol" : "http", + "provider" : "cloudflare", + "response_time" : 3.0019763589999999, + "status_code" : 0 + }, + { + "accessible" : false, + "error" : "Connection failed", + "ip" : "47.88.1.1", + "protocol" : "http", + "provider" : "esa", + "response_time" : 3.0020594599999999, + "status_code" : 0 + }, + { + "accessible" : false, + "error" : "Connection failed", + "ip" : "47.89.1.1", + "protocol" : "http", + "provider" : "esa", + "response_time" : 3.0025524180000001, + "status_code" : 0 + }, + { + "accessible" : false, + "error" : "Connection failed", + "ip" : "39.96.1.1", + "protocol" : "http", + "provider" : "esa", + "response_time" : 3.0020609550000001, + "status_code" : 0 + }, + { + "accessible" : false, + "error" : "Invalid JSON response or wrong test_message", + "ip" : "151.101.1.1", + "protocol" : "http", + "provider" : "fastly", + "response_time" : 0.085645867000000001, + "status_code" : 200 + }, + { + "accessible" : false, + "error" : "HTTP 404", + "ip" : "151.101.2.1", + "protocol" : "http", + "provider" : "fastly", + "response_time" : 0.086133904999999997, + "status_code" : 404 + }, + { + "accessible" : false, + "error" : "HTTP 500", + "ip" : "199.232.1.1", + "protocol" : "http", + "provider" : "fastly", + "response_time" : 0.35534177500000003, + "status_code" : 500 + } + ], + "total_accessible" : 2, + "total_tested" : 9 +} \ No newline at end of file diff --git a/run.bat b/run.bat new file mode 100644 index 0000000..911c0ff --- /dev/null +++ b/run.bat @@ -0,0 +1,34 @@ +@echo off +REM BestCDN Run Script - Automatically activates virtual environment + +echo BestCDN Runner +echo ============== + +REM Check if virtual environment exists +if not exist "venv" ( + echo Error: Virtual environment not found! + echo Please run install.bat first + pause + exit /b 1 +) + +REM Activate virtual environment +echo Activating virtual environment... +call venv\Scripts\activate.bat + +if errorlevel 1 ( + echo Error: Failed to activate virtual environment + pause + exit /b 1 +) + +echo ✓ Virtual environment activated + +REM Run the example +echo Running BestCDN example... +python example_usage.py + +REM Deactivate virtual environment +call venv\Scripts\deactivate.bat + +pause \ No newline at end of file diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..cf5dc3c --- /dev/null +++ b/run.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +# BestCDN Run Script - Automatically activates virtual environment + +echo "BestCDN Runner" +echo "==============" + +# Check if virtual environment exists +if [ ! -d "venv" ]; then + echo "Error: Virtual environment not found!" + echo "Please run ./install.sh first" + exit 1 +fi + +# Activate virtual environment +echo "Activating virtual environment..." +source venv/bin/activate + +# Check if activation was successful +if [ $? -ne 0 ]; then + echo "Error: Failed to activate virtual environment" + exit 1 +fi + +echo "✓ Virtual environment activated" + +# Run the example +echo "Running BestCDN example..." +python3 example_usage.py + +# Deactivate virtual environment +deactivate \ No newline at end of file diff --git a/run_cpp.sh b/run_cpp.sh new file mode 100755 index 0000000..5e18daa --- /dev/null +++ b/run_cpp.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +# BestCDN C++ Runner Script + +echo "BestCDN C++ High-Performance Tester" +echo "===================================" + +# Check if C++ tester is built +if [ ! -f "src/cpp/bestcdn_tester" ]; then + echo "C++ tester not found. Building..." + chmod +x build_cpp.sh + ./build_cpp.sh + + if [ $? -ne 0 ]; then + echo "Build failed. Exiting." + exit 1 + fi +fi + +# Check if IP lists exist +missing_files=() +for provider in cloudflare fastly edgeone esa; do + if [ ! -f "ip_lists/${provider}.txt" ]; then + missing_files+=("ip_lists/${provider}.txt") + fi +done + +if [ ${#missing_files[@]} -gt 0 ]; then + echo "Warning: Missing IP list files:" + for file in "${missing_files[@]}"; do + echo " - $file" + done + echo "" + echo "Please add your IP lists to the ip_lists/ directory before running." + echo "Each file should contain one IP per line." + echo "" + read -p "Continue anyway? (y/N): " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + exit 1 + fi +fi + +# Create results directory +mkdir -p results + +# Run the C++ tester +echo "Starting high-performance C++ tester..." +echo "" + +cd src/cpp +./bestcdn_tester + +echo "" +echo "C++ testing completed!" +echo "Check the results/ directory for output files." \ No newline at end of file diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..c3a5f73 --- /dev/null +++ b/src/__init__.py @@ -0,0 +1,7 @@ +""" +BestCDN - High-performance CDN IP accessibility tester +""" + +__version__ = "1.0.0" +__author__ = "BestCDN Team" +__description__ = "High-performance tool to find accessible CDN IP addresses" \ No newline at end of file diff --git a/src/__pycache__/__init__.cpython-313.pyc b/src/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c6bab25f7423382e3086f672d161c0915b69d21 GIT binary patch literal 362 zcmZWl!AiqG5X~kjt*Id(;-#0p=Fp_x6vTrT)PqHc_a$z&$wHD1vs*kz*zBoR`V3QvRo%B%sBaocVUsCnOP+kY-58GXu#*sS}5gc%d=@8he_- zBn4inpXR&Kc1JdTn2CagX`II|%aDqMg}c2%2{a^xms}ANRLf>?QHW%bvr9P8liiQx fNV~0t5c)DrWN!zCcd{C8+|kO}9Nn)y=}6$xsxw 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 KM*mMWxctABl2Fb7 literal 0 HcmV?d00001 diff --git a/src/cpp/Makefile b/src/cpp/Makefile new file mode 100644 index 0000000..77be4a1 --- /dev/null +++ b/src/cpp/Makefile @@ -0,0 +1,42 @@ +# BestCDN C++ High-Performance Tester Makefile + +CXX = g++ +CXXFLAGS = -std=c++17 -O3 -Wall -Wextra -pthread +LIBS = -lcurl -ljsoncpp + +# Target executable +TARGET = bestcdn_tester +SOURCE = bestcdn_tester.cpp + +# Default target +all: $(TARGET) + +$(TARGET): $(SOURCE) + $(CXX) $(CXXFLAGS) -o $(TARGET) $(SOURCE) $(LIBS) + +# Install dependencies (Ubuntu/Debian) +install-deps: + sudo apt-get update + sudo apt-get install -y libcurl4-openssl-dev libjsoncpp-dev build-essential + +# Install dependencies (CentOS/RHEL) +install-deps-centos: + sudo yum install -y libcurl-devel jsoncpp-devel gcc-c++ make + +# Install dependencies (macOS) +install-deps-macos: + brew install curl jsoncpp + +# Clean build files +clean: + rm -f $(TARGET) + +# Run the tester +run: $(TARGET) + ./$(TARGET) + +# Create results directory +setup: + mkdir -p ../../results + +.PHONY: all clean run install-deps install-deps-centos install-deps-macos setup \ No newline at end of file diff --git a/src/cpp/bestcdn_tester b/src/cpp/bestcdn_tester new file mode 100755 index 0000000000000000000000000000000000000000..947085dd3ae27e89b585e0b8073939de69fccb90 GIT binary patch literal 137816 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 VTXO{~G+vF9+X z8xx;1?Gw%qiaR;neZv^F4U!Jxphc-2Q6`z=H_@plK68NQKlXKUBh5KYn)o{+5e9Lw zOplCx5}=lj$P^&Iw-7C+2Rt=|NysuF_|c8fpi=CK-i!hm51n}fCc9=Z;gI>tdQ=Hy zv&b7w+==i((g}B_#j1}c{s7lKh{xbBCpb3KDXgo7h4JAtrvUu$nUMrPe11Saisz;F zv-#f}MT47ofhuwnrWe>hwCi91j$#ZZ_#qy>$Ue8-_IA^8+;nIg3;FBV;l#;^FK}S( zhww{y!tE4X0rhFi2e!*dp3w(NKb6`^Qqk*D>oYfJZtWVBhH9U;kAiQvYhzSqHm(C* z47vym-ZdX5z(ww06vHs$=6vjnfuFRM*qOzgH_vKq?^x&l;;D=^Csna8J=VQ zUiuU13;M38w4)~M@sF|h_;Fk-fa@RKQsA4dDYk`eo=G*k1Ny zt6vy$L1YxoH6zFsk6_OGlx#8<_{8D8G~JMBT3P=cw4KSf7tk^;H$PZH^NxY~;gV>1dNutk~w?ScC zIF1ZT)h~t3YOU>HC^Ew*ddgLJrixmE37z^{Gev8=44BDiw;x@_xo}5QEaX(|RMuP? zM9soXFM1ih4}=j6rD#h6kc=L^@Fxc`rR5utaK7k@7s$;%vkFWIF7bQ`&4Xtk(2QI& z7N}!gCk0pxm=LvK?iBl=&M4f;#^-kXwyrjv4RY11e}4=Kj@?{ zy(vj+%|dm;m|{mWvGtEq(roy19@1=1kC}};<|&SM>fuTL6zdYb&&l??d~R!7g}h&7EiFj$l?&#Rtp7Z(AKfr-39f3v8 zI(9*A%DRvtVNZ>;?rQ zTS*s&EEl?2Mlj2mROa{qigIoPo$2QI7(xw12D6U^BC7`PCkaNe8{jco7O{u@7f{;j zTPBgnCm_Q9wE*7~JZCcZLBbe4{K&>*DN=4o^k;5`Ko5;cjgCn(&$MEe^t+u@knJfH zOFHgF(4>>-N`U&360jGNhbjFF)@W29uIOzyN8q}rbtzzBKkwtgnhz;gb#QIhZ!Q0RPY&g3G)HZ63iUhDNe3HXgi=$?7hnhW?a7ra8X3)dFU)J+xQg(7 zqAYggPy-GRz+9fh;%??a^IFkR83AK)zXhehqj0Tu9P39d^s_+XZiF3Zn~#8OE65yS zDgpK{S!eoh_mw1!UXQD zFMf(#p}XVsd~s@h*W>{>h>1%`&FEu1Jj`LEz9sv6xZxonnlZS`Iz;ZS!wmq8Ero%c z{|?P4h%~`HATGNNR2DuWr)(m)vUJX(EoT~=aN4# zJ8pNJm;?=rph9-LOJY`Su7k_-0R+4&lZA?KF&mP<;%N$Cx0xcm0G1;oqX`Zp7`qpOKtkLL5f0>3 zXv7I5%Efpq1BvbOuJ;f&3BBSTp~~A)2~-3}Vz0%vh`J%iE1yTcXky1sDv{B+-DTAN z!g%{VT87-uGJnZ3$ed=Dk$N<7z(0`+udt0&om_2bG(!1jn1;+advxNHe0C}j(Y)QU zqlwQtNidBFPRI`7laIC}7~QO~NL?N!GO(#4vvKIhRrZ`5}O6 zgW~}sx7z$4%QrR9mH_2gm*GFT-kt3nO3CJG5D%r?n#{o7J(sfIK9@4mK9}-QSe#4Y zN|45LDOlk++|zE4a1VI~8!53WrJ0Yt7{Rh`MRTU@o_U?2W zLpvmWZ+pBj7vy|wBK$e?ujW{84S3d(*XkC+2cB_Y#zk0U#W@?C!H@Brh}ME%WBck9 zWWUy07t1f{J?FxL-or6i+&Mtcym0m|NFj1oA-*8oLH3d(ELx9FO~I1kNT!FoMHIpT zM>q#aIq_5`!1Un`@L!d#)pqj9&!V=du@ zxK^Dfl=N2}efVma>1~kKpwzB>ANKJWbWIZGW~&bERjx*iM0;^H0{1vobSTmM^l5b1 z;er8aUtsk@*aKL#=2EH3g?DN1(Zmy7docqPQp`+#`IK5h^gmogObdUO&~$=sT#UXa z+8O?AK-0$`YjuMWsP}x}R)M+`-W7F=oOb_8JPSiS1cKILy)S^T0kU7_JR$nZNHl6d zFYeaJSC@f5T-hknqa_$vxfQB##6m=hh>gV^1MgmxrLz8uZ)9*h`2-6q+Uk z9G#TH)6G!BZOQD}g?e<7Sml`sUaz?VQ!uA%W8OBId&7wzVR&LUC!8WWJv)49UvIEQ zdI+s%9TPKRiOGE0#>5QJSkJ`V3d99;6@HAjc*dH*UWkBE)Kc(R5peuPpnFg%nZ`=k z5Ff4-p~I9S*b1E}UlPSjueh&Dw7cBZG~Hh6lF=TFyp<$S-EB$2AKy6yhyR{8&xFzS zJPn^iUIY^kdA!f755>@Uvjpr(KeN7P8~qULv;ELc_@V7e`cr+F>-jx;q^b4ki=y9& zHHaMe%Dig=MsI8dSKMh@lw4pOHUExS0CyH}rKuJ-ns5Ur2P^Q;qbZ_%F!ERnn-#gf znNz0o`n})uizna_aFQ4~5WgWSPq*V_`U^BDFvbf`jm#5S0QKk35wj;;FqhlPM5tzKj@=f*}Ga=Q8DvjU4F6Z`%wsf(_tJ2b^V|SI8+(`d;&k z-w@BM7gHo{%-JOEe(#)+~h37|#SFzoC-#$V0Rxn&3EfLetT&Jq|%}#U6hp%+NN;2Si=MBzHU}OcGX@-|U!V zvoNnNnF346&vjCAMaok$1y+bV={Tg-8i3`&EMdJc%e#^4v|%TnZU4&lj^27~d(T00 z&6ReU)lYykHa@_Djz9Tk?FWUg(*8%|wqK_7*M6Dewm+v&`;lsWAD9^bbZ6A}h>y{; zguX>kos0gwMQg*#13Gu&$k*X~T{Ad?VtE9lD9V^vvVf@S_(t+L^vG9|#};ObEa=A` zmdliW8x=vWZ9#6m0~pBa$BKVO57=1a*ihBKZtFgK1YD#fr_ zZ(AT9Xk$MRHQKkrxC|A$5tf7$yaFSGD^Szrl<>sc>CkxE>=mso8^Zu*IpB4KxE!9d zrKvElMV=a_8aluNhsmbPF=aH*0W~3f0xvvFG8oFEiBG=D&We+SnCIAmXUt))??C3> zEj@pU>AxT%kNO7iEqm~XeR?qDjjFxweG01!Z^VG|VbeQKQTp~%0@y8=U0C?{vyhQj zz~=A@nCQgf_LuC%K07gkiJ~8i#9Sf9fBu&&nZ!idl?Ovne4|2&$gmC>ELyGfLul7l z>r;TP?wt8q9`*M8KrPSZ~f9ywph_P1J!X%t8k7BSnfnP2`Bv zAIo3qtIzPF4A}kDB(2SUS4h1c4YzRofe(eNmCtmrn|~!V+)v+q7AeqhuG&M-_|(<# zY`2FFIt(;4yhzpXMc_$jcs@0}7Sv)IE@q|C#08tdQ1~{oIti?%2!g`xj%G?cx9iG4 zk1onEZ+Q@+I;~fXm%<-E_CM^;%R%rf_2(!u#@D}{*uVbmL`DB^_0>NzSQ~&+^#2M# zvl?zb*1p(yTE5Av{}jk?h}H%jz>VGpZ|ogexBQZ->~CaUjuh|6dd?x{mLuy8uHyN= zWh#E2s`znWMkv0Xir)lkF~wiYN~4Lb-9qu?aiG?gEcMR*ekl{;`)lYs#k})BA(}Kr z-_OM4@y+^s7YKeOeg6s>p=>IQ$^^XkJ+P?bl7W)6SSN~#8Zl8B$aHuS$%HyD1O`U-4;Rh&V zE|Pu1W3Rd9Gq5pnmIE8@0b>I;1aL~Hw=gAd1>XHE4-Q06Jo~5I);nbWgGPb#ml!ze zaaKg!N`X1x8plI|Y%x}i#6=ElO7m2&Ze;Kf8aK%NpavTI#4Rtxo2BABPI2lSu66l^ zzvfm~X)wn=WyLzM{_zW%9Ix=9Od$s)ef5hB>vck^rPT38huiG`%ck$}s1G|ZbY@Dvz0+5&-~RlBORIuu8H^R!`Di#Okf z+r@ofbRlk7f^-rn1Dc5T@hTD5?yy#dH=1Kx)%@aqRcysxYqMAruG!#AS&$L_zn|PM^_ScFC2D3riRjqE$GbnVNqQCE zO4yi>^X|Bs&~za#Bs3+9D+p6yUK4Q#VaTNR;R#kYppGfpABGR9nraMB2!uNa^lY0P z8Io@#H`m6>mcemTNyk+{oqHJJ$8HTr1XT zsoM-J-2MSM<(h3|Yy{78=~h{@%{XSwHk%s8qFv%6WBXgP9S_s`AFtUa&VEl&u~%&i zj3&8KYF_qpxm-I0{VUFLZK$Bnifi-5&hqM)uil=IId+RIXh9b_m*==}A8b2C3P~4b zm=lgL8OJM?=~$md;ikprjp*lV29S?jcIQ5;!dhDiygoYgMw>1lWOyND`iF&b=HoRxd>wN-R^dh-W&te34~ZJ&Ls;y&&>}cR>KqV)iZRbc;|Fuz~PTC>hZ^$1y{NU*R0ETpD3{S9l@g|vw)>=p(hH(*U; zj$hB|X*^F^0Ok7UYBmnbeSTA8wK+WvAFw!9y3udP!0E$uKIx#yCy?YqBw(@s22?BQ zog0_l8kDl>O~9f$j!$ezyY_m0?XH2&8-1+@kwu=D=uZv{NkGWqg4Cw}w$7tj3K~xN z^}>GmDwr>df|1{}fLFW?Mr<{lZ_Brz_fLOckp1%ghJnn}?|y@Ik4Q;@+ACQ=>?mQ3K`{~ZmzX(89hAJCFnHd=wdDm2FX`6UD+m0ygN!=UJB?SLy(`Gsxxs5ktj?qs_{mtvSq$1xaxAhQc!g3tZ@ zM%rO~+eJ07AaKcez(o?~|AEAT|KUu8?lR1Fnm6KJoeuJZyNPbKfA~PYl%qR0Y4)hO zmD(`$6Sf?u<%JlKEgSUs-q=8N${bR|rTi(lsJ5g9)PXA{4gnnP22Ysn;P6eWcq>O< z_mnxv;}{o>F2erxO#l{v z`hr}%R62z>(R38T4K&_ul*Re7a8dkRSsX1uyouMGFcZ>?zeb^6z} z7pD%#`*BeJno|5{ez63i=BxK{%PN|i66CLcEWlia@v5;v;eN?L#&Ym*co_v(6y7sf zF!r8ySYJLC5%ALWqvnr5Gsu_bViZoX-o+#W{T>(Y@ZS9li&s7A_a$6t9kpSFv>{37 zq8h1Q1Fx-=q>r|_q;suxC|iJ*rv=3;+i|p2yc8cNiLofcRft{~5)N0K9Zdhie#Mn` z&mgu#zUE51YawJ{m}||m(cs~h1$y#gWw<97@mmU(jGc%P4-E8w1qS*Z5?Yy%)6=wJ z4f~FnNV#H2rQdRg)O-x7bZw4n#4lvPkznbe4mBf&uQ#855)aXZY35%(?T3KY`WcC* zfw=IaSUA}1JbcG_xJo{B_nc;9tS3>37LsNjZ3k7vmXEi_0?mEqW&p?X`XA;$klDN) z|B*A^zbORk<_X{szkrhqJ4rF05%l(%kMkQAnvIE4(?3>F1pMV0yf1sBM6Z2+u#R74 zu(N2b$<%^FWsXgy6yH5>>rweqA@eGtqrucdzVZvFzu1~GLQ8=d29o+Ftb5bp>;8+<*8{p|Bwk$e$f%n*Stco+;IC>tP z;m6ziLq#p)_pCzkrdON@WB^}X{R%@_6f}1ngsgBRYMm0G2O`(=YE9@ealAbi9EhN| zFifd22HWSn+ERor0@GWVY|Tac>~$c=WR$sx+g^J;R7Nr3Ju@+MUSJ=_Wj8ebiuWJl z;wy)cH7#g>IT$ssc>+)Lf04vLz|ra5lahhJ-1;U2F<7~aCT@9_8E`WtaU7qzC#5h0 zzSG1vHmA&&7o*9%YuIfLK)0<5XtiCz2wor=P0T_W?NqcSdRt+@z(u(Ne_q#;r7RkZ zHs~qY&w{uyu+Qez1Td-3}VINJ|68kRWU` zuj|gGEEb?bttxOGQ|5z&bG~qLQ&0 zJxm#qvxSnw0er4fVzFG99V^c;_lh22uS~&YhV)`to!g^Yo4mTmaR~~Afo3QQy_&Np zycz~xl=@r&Hhpz{|^;g9LuXZ#H%W&egQ{@BR@FLCK}0wz(bU% z-+T%k2HfY`gIk6e`GJ6;VChhDVc)O#fXcgW3G82CP7SLt6E$UUbGO* z15M`Yt#xP z^ZPn95*c#bEUBWredo?;JApkD#6lAp`DQ$piFeD{xG^ zo!@;m-TDzUX|4x*=26(A97QP*TtQ6kIhkU9?psV+b`9 znu^S~ZfE*>^C5OUoZ5;sCP_EW5jk2+u?#`TpK*dPk&M>PPNEWFe}&J&G|J;_d{k@5j%yT#(cAMUJNB-<-wZy!yQXVwn>26gv2 zJR!DHsqnXNVgy-$JWnv)&&ueDOc1kzcbYahD-maSS0Z-b+9!@s zVhDMkLO2)5bfEGkA*|;!cv{yD6ff5f@*ZQ*xyQIxxyNX~Ut3#z4fwF{G9C!?F5{WQrWt3BG=(+t?GoJ_DbQ=h^b}Ih!vKJ{GmCdmm{&DZy?oPzaCAA= z73eelTqq0!eaw}|S|Ih8c7Q>A7FnCoyKq5~o%D1;Rux3(2j&O}OZMCiJ#Y0DQ`1gd zui0A%m);3`Kwp#iDR!=hHBQk?`$U?A9Dene^mbN)y;SgL~odbpIF7d*#%GsqFc^~5f8h>1elJC=8eqe1Q3@~7 zzl@QE*AoiTcNOI9U9eg7=S9>B?j!R@Uh!V)`M(Dx{L)5m({eZm-nPev2UyWsi^&2O zL_9wp>-^GdsU)uaa2Mai&BYPCi8~o(?H_tQ5s#RVX3;cEJR!3CPtwAx4%%j)f(OjdWuXVfI@Ow7ln|@oSh#uu&-|Ew zYhp*-fVb7=ayZ6}0=KRWY(~PB0Q?$59>(IN zIiXN}9%ujmAA8>d7*%zxeJ05vkw7LW*oZtv4H{I!Ox^*p6G>nO5{xEjd`?0VNHiod znLvC8lOX93#a3IY*v7VAvGsu#6%}oG2>1qVmDXBNE1oebR7LSo=KsFE_nAy46JNLY z-roOul$EYH8Y1#UahydpJ~C?ip(yL}u_mtExzwHcm&K4~-%=1q`YB?`jL#k^A)LYd z7={ByLdIi^fYFC_;8UEo+;xwNtKR;244J;dganu)q~da^lR@I7C?s6tN^{ zK;{U=@f0Jh%YSktJ5rMTV<3z4GADy+jwPiFHdY45VeKM0*gSg4<{{9hkC42`k38g6 z4p_?NL2)8&99t$>#itz7P^*Q4hvCY6Vywy0Oi68&N+e1Q(}?1RXcn0mj!F?}QBpDn>-Tvf}Cvm{t7>`^Rf`>zh%Z9gOO)Q() zrNe}8DkW9uTQ92|Xj7JazytH48TTwf8j-}UTbEw|ahu2U?7UQp`8ia!!T92wjx$+0 zY+gQLdHkA)NSU&9V1KKqq-c0HKY0>Zhl>I3Jxtt`w|UrbP`UfYf9@q<1%r#o;f7t%es z_e1N&`lm}Y4U-nKh&x}x&1LtYshvN`}9YWh!;Tz3k8qq-X8;BMeXx6yXLR ze{^kgw;#e8@pBR=@@jzg%ts!h9m232i@IxpZSb?!zd=+N|z1Vn~rSt{f>~>==~^?#mv! z8t7oi5l5wIZfw%!dRxJ20gMbWy^^fZ~13NW7z;nPZ)dgDO!1#5o2q`YHBp zu~XXp7JlML6F(*3lXddV$?Nb=_+AAcCg5mE!rnDxo$<`?iDB=yuy=ddyEE*)IPASV z^d03`i+7Yn<&q_?C$}6-x$wr#2U9|PS@>r>xMtJ4QRo#x>st1? zm^=Pe9=1`s+YcXsJKQawV5M9~24i6YS^Q>9&LYeC6CS&iw}I^#Z%SZ^VG-@b8kYMW zxV|}>u?mXEBQaTJxw6)@n(;>v>FX^x3Kp$vh#5!9iKGRGGk1rz<3D0aSAOTc0V18Q zSH+b8N5!G!uw@v>rLUBcfM`Qx>(SCwvDze&7_H%Tqy+ORDL_B?A=JDvA!Wx0*_F#N zY-{Rd@O<@hQs4~21?p=f0gkX|Gx z&j*Z$RK)p!9SP7j9%9tF9Uxq!QrK0Qg24=^s0~@hKpd_J$Jl`r>%rlpa3k6FnJ&AVzKI<$Td-XU)oNfuMy2Dq@`Z{*8WXzxCunhR}(J$@x#hC`@qts~d(8F%d;k;_w;mD_fL#h|0!v$))7Rn;a)By=Y`{zsn`^ z#IRiWpmIpEd%PW~i-TeUMik=mK(Vp-tU&uk1>ffCmIm3d@*Nj6(-^>Ukx;D4X6*uB ztP^q~9omGWFC|21R3_4vOQNxa5fUdy;K@@2-bmi!n2LJSpPCnq&=OQSQO!Do!?_YqvhR4dP^9s}a{u zqCT8b*nKaNhZ6sl8k!HTfBYxcKca>*P4oq^w5LPKWQ~+nH-_-B2yv3?H=_RcuRpvIWW;*G zAPK}iL{jED#Kpt_{hm48Iz`#xES`un4}4 z$P5Hn?DDN`gA82L*RqOPJNz&syfzS~0#j7tdiT?C#-lu>Sx(Z|L7U|y{a^4)%nG$r z!ATAi{Ty(birzvS>DpjoalV}R_Mx?Gjqt47VQ?+moK6d@Dn9xXKc^;xK%{b;w}^Vd zNqv-?znNnmzB0_gV01&=B+$%z&8+QJP%lS-x0~T${b}Ys+`QCGo~%DDcvW}%KJ;;K z_y|cpJbD^#D9G_I;|tR-3*JwlsJ;#He+#Pjd>BIYmwb`)8#t*Dgr1DjY^W9Vx}SzI z@h_(}gFO=U+nqEr>zS%#ip+S2XP(XFxLJh zXz4&Hnv@<#8hKqW`hSnmv~GDDPGO06kNow5a635)8scAu_(2~5z5$j1c$Gm%8MQ z05RExT`>-v^S__9oB0Y&7xCdG(S*}AVq(;9|Ia>^Dj=?scmY#g+`3?G=Nh7Ke6hk) z5ODBfg$;PY4SMRXf>+zcT?H6iEu10mAPC+m@F5zI5JcLhq#!o0h~F%(h(C(=6*K}@ zXuTmz|w!icP@)*3v9z&M6c)`rfwx;)ynM{nAzTn>}YSKnAgvN7tRnuoA z_@M%`po}5>j1~N_%@5&aCb}OuocI%CWhEPU=}BN=zs>(Va)oUq*3MsmS@y9~krq5- zp)4zgVRMPKBOaixm#mNEkHH~s`A6g8f`JO){~Q7|+Y2?nwLi#Y*Fp*i6X&4}6(p)9 zFkdVnL(*h%nXA9z3!?8Ax5v734eo6v_uECo^FFXqE1xWf_|RM#ujAdn?mdW6tj9_8 zpMco-J#58HyMI4x<_50KYphsQ?MjbzJ+`Q#uA=pFN17`g3p0<{Y3=wK2yH;lHMp8L zV-cLc02Qh~`?U4KK%>a0^8TZ#DmZ3t5=4?GyddFX_yc0z?Gh|%eh))Q=D6dLSQ=~t z??wUYYS(r+QOCO{zvl?Jm!Zr8*II9U6fEKe>0^lSF1+M-y|ZcmME@Q5>F8~{HZk4W zc@a?k`~xGy8r*fXuT;m~3&U{tLRdL8fh_%>6FI>KzZJu`(%mvjDL4*v8P8PX7d#p} zNEuJ?h0_;(#)JF`OI^c{J>ZBMEJ6UGP0$Dcjobc2G+7IbYebx@l8cRxcM=@#^mg3B zC@!RJPAgrEdC`74IBhn+`{MfRqQx1pvo$`*6VY)ju{1z`?jRLZbiuLm=^AC=5+ zLkh%rQ`9&ywAYXEJTchJzZ>$KHx`>XKMDEW*#En4l!|EV0YmY>E%F%~;Wdao27ae8J*4 zJmATzSU9N%YvzMdg_wT{GcMqq87@a~p+sLHBQ4dk_BN z9KCjavW{veP%OW~P{elphU3>YI+=0T;&(_-^mw`h%eGRuYVk+N`gYuLC7NiiDH83% z8swGj!kG1eG zCLQrFlRo0Bh))kuPCxSg+fRZ7TIniUJKiP*+<%+T`)~8p4*R(QH|W=+yMd$FuC#T% z3jb4_ftm|f=gJg0arl|#8TaI;aWf8?y^c3><2SFv+0ibp!;zQs?!v_3>-dIQNJ-5Z zM$Hw88t3{j?k7EI=RiN)aq@URj9W0Nts5@TtR!Aeub2rG`h@a=Oe-U{y0>@I7V#l?{={s0#_BR!1>K{V0^?oe9uJxwa`^D zzkv8?VR&;(*X?b{0wX86y34SlsT^Zg&vT@=lgsY?7MSH#!cpcLxB~jUunY6;_>D?& z!2yihv1QPVFYm81U;k%)2@ zMV|YmILHePE(WJ&pGzTKdBBys$2-Esv)}Xry=RVW4-+v}PQQvvk2-c(s zf>^c{6C{Y6js_DvYiNR5f*_OtnHk>o5Av{s_1R!_kGDndE-~ zS@%T~?#qui!H4|U0z6QQTD-fMHQFmHISrS(N7w)+z>MsG|chrX*@-9CA8>g2;5 zgVl{}!QNHLE~5w-?1nmxnfOJiOcxL@RTz7Ij1dAgRC95%L@dOsoPfS(%^w?Rs9y&+ zCg4%|V|!mp7}I}17wL&P@Mv!A$M$2UC1BK_E#;1V9 z(}{C#UEOjM8t3SQ+A7VpArvZHCVl|B+&>Qqgs>rJTy_%=2B6&4wMOislY3&>wL!m< z%?Ljj0;?va&{qzvLf4z`qSb$bT#HtJI)Aa%uN7-Sb`$Ra@i0n2%Plsch)L0C{6QQ} zM#p$H`puwa?eJkuv7pFF-(Hf(z=xR(kjvs+z7)!?hu^RmYiTC_Vz`y7{{Kh`=4NIFtH6kAwD&@0x^<2O$=6hz(+LBV-+w{rL9ny0Eygni2=ne zXEGVZ2T(}FpMV6^I9v#QV<7#{sPrI4u&^cl^o4+>NvRa{l}>;@vHk3eDEeq{Y`iA1 zgKb(cH*lt54&XwDwr8l?IAaH*IV=`IvBAN@ejo0O#@?J|Z_UM8@$|B1_=XWwx{3|p90%~oD5qIkbe_`wJWLo0#f5gF5N;W-%eau~ber2pi*5XZ zLR%>d)W;j{cUe1f#iV!;2rL!D=Sp&QVX;$pG3H90N#uv$C}C2i_HT3A023{<+Pdm< zVQ2tUee4?mdoQtlTw*6<;CBu@FejRiVvH0N7lU*Ta0Id_3Xo2LT5{ld#m!>u*jHT6 zL~=-jL+hYXqvjOA9EKS%#~(*H6Mjti(?P^mMj|~#;-G<;l||ZUvR2B)eZEzznf!KV zBiY#I#Qj5{mxCyD>|NX2_?eG&l#Gm;g2KHy*(Io!#c{tXwt`I)1;AY_!3}AmVxI*` zw9WX@a#H9>#>>DxDTHu=`EYdWF!KIODEwvX-Uy9o~H^Q@{dQ<4wK$z(6!g1qj zlsKgJS+DOSB5PphCj8=rbKZ(sK))E>r&;j(IaMSr9mv4pzQ#s6dqI|Z+8A1ut=Ffr zn<9vH^b>HqA8Yvvn$oJ@gvY`VWN;RmV;D>!td`XU3uM z7YoMZycdNGKSHf+5jBsrrYn@a;Dacz5(F`v|{awVn67PQQZR2_!p*Ldx z8TIDWLOSK}q=M}vHpoLuMH~4`7v&>s8%_`M?}I~Yw!e}N;|cxyJCp`7k*`ofFqVSQ zIRgk?Q|7-A99hMDaTuL7l8$X49lN5FFp!STe}~{m$jj9j>_^UqC6N8dEG)%jKXN*| z1P{AfS4f*Kdy~flhy%IcYvkaz_%!rT3$xMLbv61&;EP$$Tv+}=wc~2VO|t*o1p1hM z-8ArC`%Q!IwSNPS%}lPod3XeFj31HX&k{>?VHd%n!{v~u5Zxb`@=`PDF{(Y$FVYv38a2Eg^1GB%*-*gFo^DHjy1EY3u)hzbU5P*}w}`I2-b9n=$q(ykphqAb*n( zx(Bz;l>X*EC`Z4)IU0KOjr`5&L=-Nf1;4(nzgaxc-@GPBjQjl+v463@Sw1kyEkS?t zto|hbbN*(j(1blkTOKQJelps9{P`~a=BfUVS$bdRZ(2K^2ijNqoQs6d`6zwPjsB|z z(Kh@=(ZOg#KfV;@Ek|NP21%Ql71PSnz6Vb@fdMxU{qrw!(zr@`X#brde(V}(*N}d! z74bs-*okOwhW2B30sEW!v1$GN?FjztBR@pC-^8E2fruDak##zvKYOV{*-K%foMDB+ z{aKen=~XBZ{Mku@qi}!rhj3ezKUAu2l}r<@09=I@8+(IAaNdGmrjsvb{c;WV zGmrWznFlynLpn`dTNH*nq%+1t$vLW62EIaU-%`8=&7EoM zaGcJN4&Z%Y@GCxhpkq+~%Q1yDD6M#;WoSa127TL)ier2{O-4RHLgW{Su;nx;D$Y5@ zMgU>bg->kl{0IDAKmYh#txBwF9L!gk_9Z$Gu-2D5I7*j12k7q8`=elULl2~@d2xyWd44~aX~9m5AwgfO9P{Ix&QbTu zFBsbbBFB>%k+`rOa>)@>Y$Fiw>kt}KABw=awUcM2vDze}NC$Cg?cBr9-7~(hgTnKW z6SL>X=(Ngb$lASBbwl%eSY42f-NiW7^U}+sGMIg9$~_G z;b5cjTk&ERFhu7c6HIGM-w1Q|M*}bzX9?o?KLDTVYu_~U$4SO;e8Y)jm=t?hjJcVU zV#f%8(THa`m;U!K1~*lC|@pf5Mh* zH(F6>GX3p+rHYY(%Fr4K>aXw5r~l>tqy|J4XLuP|+2ok3AaeUK%A`cxh{EZ6-#7+A zqzpSmButDLv#IUKaIrB1zx=}~%5a6oGMFzh;dUwz$gDq3G3UR%pR>NlB1BuqXa`j_ z@PCZA2$J#v3`xy{e3dBtC5o>9h!8PM#cx?l+QA6M*N7dQ-*dcQf-@C1Kx+zp3sDD< zH+IaN1LpeHiW-2`8yF|RPceO$D1Nl}#?fr#2tOs0-uOf~wQ!x?=;JztMG+mF7<_VL zU%)EFa{D|OzcY7xWYf1N7(EiK)yd`*fasfy$1kxAx*(A!;$lKy428SV*-t@q^dGOb z6~U{q4J07e50OB}bM%klyL6U_X@!eYc)vN^Ehh)U3v*HBtsQk3M&b$K*b|1;xDd1G zdUN^Lqj=?GaZTQW`)M)wGEC&ehyAyM24B{O4!&5#;0sn$ZQ6@LJz-3?8z*Igx@Aid z4$tMNj<|mTt9Pu0Ff2kS?T3(i2YTV|b{u!r`2+ky?s484R+)3WbEXaZTw>AP?5tF=2qAh)wf)!H3|NNg?^bX<7==k&vC{-S^N%*W{vK{w9X zYTtq#tWP;HG;Qs`iF6vq@R3*|s3QHD2Y7-_X9Gk}E`keP4nu>)f*EdX=0cYXfnj~v zTrh+2=fMkRU_`k7fee{zG8ci2bZO#A2QCdJSwSbbz6A|>`1+P4|EVNo`tPjvxH4t2 zlPd$Tp$to|(6cheFneq}cmW8G$=Plzw7{7}m65vEc{5BK?e-cN5guNF0q`7a=L@LD zkFi$aV1qTMGMMqjC9vTq3cD%J=Q03$2Qb&<9YPJ|EUU|SD+5uXd5n4qqp}U(V!S7e z6sLqS?ConzF&-x##teyfW@sPAwbShDwf_2G!&B4eeZh_$PXKWoso*(Un`0-qelZu9kTGgE~mgG?h#Ofi~tHSQ&G#(>& z-SsF|3WED?$3m{gy$&+XYRJOj*c(n;xX(F+; zjN8*fs+?GBS(n@>H>brSlGvQqc`s^_uvgsbfz^)fTdC>l2wF@r!P<-kvfAu+WujcV zH=Sdiiq@5&AUC>Qj@)viTgOuT@N@Yw>Zde@cE95bnsKMFZ5?lXjs|Or=(lm_0Zj?J z^82xU)_9p3*}rQ=7+F^CuD@^@V1XT9(K8cZ?ppaNNRe(Ro$aLKlXPqpE7~|k2f`P0 z{)q-AgpSRBlcFzA_s7*|g0u)0~cqTPS;YyqT1wq28JtnskXYNXY26xXmxDai! zDpDhfH4jyy3?KfA53UU_ep>R@owseZnJ74NAlmimn+RfXN|wdghT;_mUZB$7M2cP8 zVRVcaO)Dk#2fu@5c&<%{hZ(Dht*p?(e(XDd&E;^k5kFWXn!7WPCZ5dSeo7q$>7u3GjFNf`?KNrL*^l!q zaPS#q@{M1Hkh!TJWi3!5W<0>$%8cj3WSJQ^?qV%KhNp_!fD8)@zr~xsa21a@v|;iC zb_e53;=U2Pm^6J0&5GN1nmDxx&9V9>=Wn<38%#)H?prNSvU_OLco-pv%t_9;3*TMK zXnk@1Fzpz+3p`}wx?iC78J`I*3X^Nt=XngPvM7NCCo-6EdliDoJAx;a%uf?1l(6sj zAWS7z1>h&}T7YM0A$s9ueA&cw(Wat0hBqB<*m<+*m?6cZnvUxsXUfM)dE?X=GIXkB zXap0=CdKX<8h#5^5rq>qrN4~RCIwTE7Z!bwP=h^`1DXjRgb>z_^~Cfua}6vn%1SZw zIp~s^>li`-MMHyqdU?tYL^|&;>lETf7?~W;4>0tcY2V6{N<^jL^dxQNTI4ijeBwR< zro%uV0wWc4ym6gN$iVCiC!6zDJo}|154-664+E=zd{4mNIS9Mu9Ax+R6tY=FJ;Qd= z

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 WSC4W{wOIY1yl#8-eo!IUt^5yo;&?p( literal 0 HcmV?d00001 diff --git a/src/cpp/bestcdn_tester.cpp b/src/cpp/bestcdn_tester.cpp new file mode 100644 index 0000000..b896099 --- /dev/null +++ b/src/cpp/bestcdn_tester.cpp @@ -0,0 +1,509 @@ +/* + * BestCDN High-Performance IP Accessibility Tester + * C++ implementation for maximum performance + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct TestResult { + std::string ip; + std::string provider; + bool accessible; + double response_time; + int status_code; + std::string error; + std::vector successful_protocols; // Store all working protocols + + TestResult() : accessible(false), response_time(0.0), status_code(0) {} +}; + +struct HTTPResponse { + std::string data; + long status_code; + double response_time; + + HTTPResponse() : status_code(0), response_time(0.0) {} +}; + +class BestCDNTester { +private: + std::mutex results_mutex; + std::vector results; + std::atomic completed_tests{0}; + std::atomic successful_tests{0}; + + // Configuration + int concurrent_requests = 100; + double request_timeout = 3.0; + int max_retries = 2; + + // Test domains + std::map test_domains = { + {"edgeone", "test10000.ix.je"}, + {"esa", "test10000.ix.je"}, + {"fastly", "test10000.ix.je"}, + {"cloudflare", "test10000.fstring.me"} + }; + + static size_t WriteCallback(void* contents, size_t size, size_t nmemb, HTTPResponse* response) { + size_t total_size = size * nmemb; + response->data.append((char*)contents, total_size); + return total_size; + } + + HTTPResponse performHTTPRequest(const std::string& url, const std::string& host_header) { + HTTPResponse response; + CURL* curl = curl_easy_init(); + + if (!curl) { + return response; + } + + // Set URL + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + + // Set Host header + struct curl_slist* headers = nullptr; + if (!host_header.empty()) { + std::string host_line = "Host: " + host_header; + headers = curl_slist_append(headers, host_line.c_str()); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); + } + + // Set User-Agent + curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.3.1 Safari/605.1.15/1.0"); + + // Set callback for response data + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); + + // Set timeout + curl_easy_setopt(curl, CURLOPT_TIMEOUT, (long)request_timeout); + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 2L); + + // Disable SSL verification for speed + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); + + // Don't follow redirects + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 0L); + + // Perform request + auto start_time = std::chrono::high_resolution_clock::now(); + CURLcode res = curl_easy_perform(curl); + auto end_time = std::chrono::high_resolution_clock::now(); + + response.response_time = std::chrono::duration(end_time - start_time).count(); + + if (res == CURLE_OK) { + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response.status_code); + } + + // Cleanup + if (headers) { + curl_slist_free_all(headers); + } + curl_easy_cleanup(curl); + + return response; + } + + bool verifyJSONResponse(const std::string& json_data) { + Json::Value root; + Json::Reader reader; + + if (!reader.parse(json_data, root)) { + return false; + } + + if (!root.isMember("test_message")) { + return false; + } + + return root["test_message"].asString() == "testpagegalaxy123"; + } + + TestResult testSingleIP(const std::string& ip, const std::string& provider) { + TestResult result; + result.ip = ip; + result.provider = provider; + + std::string test_domain = test_domains[provider]; + std::vector protocols = {"https", "http"}; + + double total_response_time = 0.0; + int successful_tests = 0; + std::string last_error; + + // Test both protocols and record all successful ones + for (const auto& protocol : protocols) { + std::string url = protocol + "://" + ip + "/testpage.php"; + + HTTPResponse response = performHTTPRequest(url, test_domain); + + if (response.status_code == 200) { + if (verifyJSONResponse(response.data)) { + // This protocol works! + result.successful_protocols.push_back(protocol); + total_response_time += response.response_time; + successful_tests++; + result.accessible = true; + } else { + last_error = "Invalid JSON response or wrong test_message"; + } + } else if (response.status_code > 0) { + last_error = "HTTP " + std::to_string(response.status_code); + } else { + last_error = "Connection failed"; + } + } + + // Set final result properties + if (successful_tests > 0) { + result.response_time = total_response_time / successful_tests; // Average response time + result.status_code = 200; // At least one protocol succeeded + } else { + result.accessible = false; + result.error = last_error; + result.response_time = 0.0; + result.status_code = 0; + } + + return result; + } + +public: + BestCDNTester(int concurrent = 100, double timeout = 3.0) + : concurrent_requests(concurrent), request_timeout(timeout) { + curl_global_init(CURL_GLOBAL_DEFAULT); + } + + ~BestCDNTester() { + curl_global_cleanup(); + } + + void testIPBatch(const std::vector>& ip_provider_pairs) { + std::vector> futures; + + // Create thread pool + for (const auto& pair : ip_provider_pairs) { + futures.push_back(std::async(std::launch::async, [this, pair]() { + return testSingleIP(pair.first, pair.second); + })); + + // Limit concurrent requests + if (futures.size() >= concurrent_requests) { + // Wait for some to complete + for (auto& future : futures) { + TestResult result = future.get(); + + { + std::lock_guard lock(results_mutex); + results.push_back(result); + } + + completed_tests++; + if (result.accessible) { + successful_tests++; + } + } + futures.clear(); + } + } + + // Wait for remaining futures + for (auto& future : futures) { + TestResult result = future.get(); + + { + std::lock_guard lock(results_mutex); + results.push_back(result); + } + + completed_tests++; + if (result.accessible) { + successful_tests++; + } + } + } + + void testAllIPs(const std::map>& provider_ips) { + std::vector> all_pairs; + + // Flatten all IPs with their providers + for (const auto& provider_pair : provider_ips) { + const std::string& provider = provider_pair.first; + const std::vector& ips = provider_pair.second; + + for (const std::string& ip : ips) { + all_pairs.emplace_back(ip, provider); + } + } + + std::cout << "Testing " << all_pairs.size() << " IPs across " + << provider_ips.size() << " providers..." << std::endl; + + auto start_time = std::chrono::high_resolution_clock::now(); + + // Process in batches + const size_t batch_size = 1000; + for (size_t i = 0; i < all_pairs.size(); i += batch_size) { + size_t end = std::min(i + batch_size, all_pairs.size()); + std::vector> batch( + all_pairs.begin() + i, all_pairs.begin() + end); + + std::cout << "Processing batch " << (i / batch_size + 1) + << " (" << batch.size() << " IPs)..." << std::endl; + + testIPBatch(batch); + + std::cout << "Completed: " << completed_tests.load() + << "/" << all_pairs.size() + << " (Accessible: " << successful_tests.load() << ")" << std::endl; + } + + auto end_time = std::chrono::high_resolution_clock::now(); + double total_time = std::chrono::duration(end_time - start_time).count(); + + std::cout << "\nTesting completed in " << total_time << " seconds" << std::endl; + std::cout << "Total accessible: " << successful_tests.load() + << "/" << completed_tests.load() << std::endl; + } + + void saveResults(const std::string& filename) { + std::ofstream file(filename); + Json::Value root; + Json::Value results_array(Json::arrayValue); + + for (const auto& result : results) { + Json::Value result_obj; + result_obj["ip"] = result.ip; + result_obj["provider"] = result.provider; + result_obj["accessible"] = result.accessible; + result_obj["response_time"] = result.response_time; + result_obj["status_code"] = result.status_code; + result_obj["error"] = result.error; + + // Add successful protocols array + Json::Value protocols_array(Json::arrayValue); + for (const auto& protocol : result.successful_protocols) { + protocols_array.append(protocol); + } + result_obj["successful_protocols"] = protocols_array; + + results_array.append(result_obj); + } + + root["results"] = results_array; + root["total_tested"] = (int)results.size(); + root["total_accessible"] = successful_tests.load(); + + file << root; + file.close(); + + std::cout << "Results saved to " << filename << std::endl; + } + + void saveAccessibleIPs(const std::string& filename) { + std::ofstream file(filename); + std::map> accessible_by_provider; + + for (const auto& result : results) { + if (result.accessible) { + accessible_by_provider[result.provider].push_back(result); + } + } + + file << "# Accessible CDN IPs with Protocols - Generated by BestCDN C++ Tester\n"; + file << "# Format: IP protocol1 protocol2 ...\n"; + file << "# Total accessible IPs: " << successful_tests.load() << "\n\n"; + + for (const auto& provider_pair : accessible_by_provider) { + file << "# " << provider_pair.first << " - " + << provider_pair.second.size() << " accessible IPs\n"; + + for (const auto& result : provider_pair.second) { + file << result.ip; + for (const auto& protocol : result.successful_protocols) { + file << " " << protocol; + } + file << "\n"; + } + file << "\n"; + } + + file.close(); + std::cout << "Accessible IPs saved to " << filename << std::endl; + } +}; + +// Function to convert IP string to 32-bit integer +uint32_t ipToInt(const std::string& ip) { + uint32_t result = 0; + std::istringstream iss(ip); + std::string octet; + int shift = 24; + + while (std::getline(iss, octet, '.') && shift >= 0) { + result |= (std::stoi(octet) << shift); + shift -= 8; + } + + return result; +} + +// Function to convert 32-bit integer to IP string +std::string intToIp(uint32_t ip) { + return std::to_string((ip >> 24) & 0xFF) + "." + + std::to_string((ip >> 16) & 0xFF) + "." + + std::to_string((ip >> 8) & 0xFF) + "." + + std::to_string(ip & 0xFF); +} + +// Function to expand CIDR notation to individual IPs +std::vector expandCIDR(const std::string& cidr) { + std::vector ips; + + size_t slash_pos = cidr.find('/'); + if (slash_pos == std::string::npos) { + // Not CIDR, just return the single IP + ips.push_back(cidr); + return ips; + } + + std::string network_ip = cidr.substr(0, slash_pos); + int prefix_length = std::stoi(cidr.substr(slash_pos + 1)); + + // Validate prefix length + if (prefix_length < 0 || prefix_length > 32) { + std::cerr << "Invalid CIDR prefix length: " << prefix_length << std::endl; + return ips; + } + + uint32_t network = ipToInt(network_ip); + uint32_t mask = (0xFFFFFFFF << (32 - prefix_length)) & 0xFFFFFFFF; + uint32_t network_addr = network & mask; + uint32_t broadcast_addr = network_addr | (~mask & 0xFFFFFFFF); + + // Calculate number of host addresses + uint32_t num_hosts = broadcast_addr - network_addr + 1; + + // For IPv4, sample differently based on network size + if (prefix_length >= 24) { + // /24 or smaller - include all IPs (skip network and broadcast for /24 and larger) + uint32_t start = (prefix_length == 32) ? network_addr : network_addr + 1; + uint32_t end = (prefix_length == 32) ? network_addr : broadcast_addr - 1; + + for (uint32_t ip = start; ip <= end; ++ip) { + ips.push_back(intToIp(ip)); + } + } else { + // Larger networks - sample to avoid memory issues + uint32_t sample_size = std::min(num_hosts, (uint32_t)1000); + std::cout << "Large CIDR " << cidr << " with " << num_hosts + << " IPs - sampling " << sample_size << " IPs" << std::endl; + + for (uint32_t i = 0; i < sample_size; ++i) { + uint32_t ip = network_addr + (i * num_hosts / sample_size); + ips.push_back(intToIp(ip)); + } + } + + return ips; +} + +std::vector readIPList(const std::string& filename) { + std::vector ips; + std::ifstream file(filename); + std::string line; + + if (!file.is_open()) { + std::cerr << "Error: Cannot open file " << filename << std::endl; + return ips; + } + + while (std::getline(file, line)) { + // Remove whitespace + line.erase(0, line.find_first_not_of(" \t\r\n")); + line.erase(line.find_last_not_of(" \t\r\n") + 1); + + // Skip empty lines and comments + if (line.empty() || line[0] == '#') { + continue; + } + + // Handle both single IPs and CIDR notation + try { + std::vector expanded = expandCIDR(line); + ips.insert(ips.end(), expanded.begin(), expanded.end()); + } catch (const std::exception& e) { + std::cerr << "Error processing line '" << line << "': " << e.what() << std::endl; + } + } + + return ips; +} + +int main(int argc, char* argv[]) { + std::cout << "BestCDN High-Performance C++ Tester" << std::endl; + std::cout << "====================================" << std::endl; + + // Read IP lists + std::map> provider_ips; + std::vector providers = {"cloudflare", "fastly", "edgeone", "esa"}; + + for (const std::string& provider : providers) { + std::string filename = "ip_lists/" + provider + ".txt"; + std::vector ips = readIPList(filename); + + if (!ips.empty()) { + provider_ips[provider] = ips; + std::cout << "Loaded " << ips.size() << " IPs for " << provider << std::endl; + } else { + std::cout << "Warning: No IPs found for " << provider << std::endl; + } + } + + if (provider_ips.empty()) { + std::cerr << "Error: No IP lists found. Please add IP files to ip_lists/ directory." << std::endl; + return 1; + } + + // Create tester with high concurrency + BestCDNTester tester(200, 3.0); // 200 concurrent requests, 3s timeout + + // Run tests + tester.testAllIPs(provider_ips); + + // Save results + auto now = std::chrono::system_clock::now(); + auto time_t = std::chrono::system_clock::to_time_t(now); + auto tm = *std::localtime(&time_t); + + char timestamp[20]; + std::strftime(timestamp, sizeof(timestamp), "%Y%m%d_%H%M%S", &tm); + + std::string results_file = "results/cpp_results_" + std::string(timestamp) + ".json"; + std::string accessible_file = "results/cpp_accessible_" + std::string(timestamp) + ".txt"; + + tester.saveResults(results_file); + tester.saveAccessibleIPs(accessible_file); + + return 0; +} \ No newline at end of file diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..321b0e5 --- /dev/null +++ b/src/main.py @@ -0,0 +1,248 @@ +""" +BestCDN - High-performance CDN IP accessibility tester +Main orchestration script +""" + +import asyncio +import logging +import sys +import os +from datetime import datetime +from typing import Dict + +# Add src to path for imports +sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) + +from config import Config +from src.utils.ip_reader import IPListReader +from src.testers.accessibility_tester import AccessibilityTester +from src.utils.results_manager import ResultsManager + +class BestCDN: + """Main BestCDN application class""" + + def __init__(self, config_file: str = "config.json"): + self.config = Config(config_file) + self.logger = self._setup_logging() + self.ip_reader = IPListReader() + self.results_manager = ResultsManager(self.config) + + def _setup_logging(self) -> logging.Logger: + """Setup logging configuration""" + # Create logs directory if it doesn't exist + os.makedirs("logs", exist_ok=True) + + # Configure logging + log_level = getattr(logging, self.config.output.log_level.upper(), logging.INFO) + + # Create formatter + formatter = logging.Formatter( + '%(asctime)s - %(name)s - %(levelname)s - %(message)s' + ) + + # Setup file handler + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + log_file = os.path.join("logs", f"bestcdn_{timestamp}.log") + file_handler = logging.FileHandler(log_file, encoding='utf-8') + file_handler.setLevel(log_level) + file_handler.setFormatter(formatter) + + # Setup console handler + console_handler = logging.StreamHandler() + console_handler.setLevel(log_level) + console_handler.setFormatter(formatter) + + # Configure root logger + root_logger = logging.getLogger() + root_logger.setLevel(log_level) + root_logger.addHandler(file_handler) + root_logger.addHandler(console_handler) + + # Return main logger + logger = logging.getLogger("bestcdn") + logger.info(f"Logging initialized - Log file: {log_file}") + + return logger + + def validate_setup(self) -> bool: + """Validate that everything is set up correctly""" + self.logger.info("Validating setup...") + + # Check enabled providers + enabled_providers = list(self.config.get_enabled_providers().keys()) + if not enabled_providers: + self.logger.error("No CDN providers are enabled in configuration") + return False + + self.logger.info(f"Enabled providers: {', '.join(enabled_providers)}") + + # Validate IP list files + validation_results = self.ip_reader.validate_ip_lists(enabled_providers) + + missing_files = [] + for provider, result in validation_results.items(): + if not result['exists']: + missing_files.append(provider) + elif not result['readable']: + self.logger.error(f"IP list file for {provider} is not readable") + return False + elif result['ip_count'] == 0: + self.logger.warning(f"No valid IPs found in {provider} IP list") + else: + self.logger.info(f"{provider}: {result['ip_count']} IPs available") + + if missing_files: + self.logger.error(f"Missing IP list files for: {', '.join(missing_files)}") + self.logger.error("Please create the following files in the 'ip_lists' directory:") + for provider in missing_files: + self.logger.error(f" - ip_lists/{provider}.txt") + return False + + # Check test domains + missing_domains = [] + for provider in enabled_providers: + if not self.config.cdn_providers[provider].test_domain: + missing_domains.append(provider) + + if missing_domains: + self.logger.error(f"Missing test domains for: {', '.join(missing_domains)}") + self.logger.error("Please set test domains using set_test_domain() or configuration") + return False + + self.logger.info("Setup validation completed successfully") + return True + + def set_test_domains(self, domains: Dict[str, str]): + """Set test domains for providers""" + for provider, domain in domains.items(): + if provider in self.config.cdn_providers: + self.config.set_test_domain(provider, domain) + self.logger.info(f"Set test domain for {provider}: {domain}") + else: + self.logger.warning(f"Unknown provider: {provider}") + + async def run_accessibility_test(self) -> bool: + """Run the main accessibility test""" + try: + self.logger.info("=" * 60) + self.logger.info("STARTING BESTCDN IP ACCESSIBILITY TEST") + self.logger.info("=" * 60) + + # Load IP lists + self.logger.info("Loading IP lists...") + enabled_providers = list(self.config.get_enabled_providers().keys()) + provider_ips = self.ip_reader.read_all_ip_lists(enabled_providers) + + if not provider_ips: + self.logger.error("No IP lists loaded successfully") + return False + + # Prepare test domains + test_domains = {} + for provider in enabled_providers: + test_domains[provider] = self.config.cdn_providers[provider].test_domain + + # Run accessibility tests + self.logger.info("Starting accessibility tests...") + async with AccessibilityTester(self.config) as tester: + results = await tester.test_all_ips(provider_ips, test_domains) + stats = tester.get_statistics() + + # Save results + self.logger.info("Saving results...") + + # Save main results file + main_results_file = self.results_manager.save_results(results, stats) + if main_results_file: + self.logger.info(f"Main results saved to: {main_results_file}") + + # Save accessible IPs only + accessible_file = self.results_manager.save_accessible_ips_only(results) + if accessible_file: + self.logger.info(f"Accessible IPs saved to: {accessible_file}") + + # Save provider-specific results + provider_files = self.results_manager.save_provider_specific_results(results) + for provider, filepath in provider_files.items(): + self.logger.info(f"{provider} results saved to: {filepath}") + + # Generate summary report + summary_file = self.results_manager.generate_summary_report(results, stats) + if summary_file: + self.logger.info(f"Summary report saved to: {summary_file}") + + # Log final statistics + self.logger.info("=" * 60) + self.logger.info("TEST COMPLETED SUCCESSFULLY") + self.logger.info("=" * 60) + self.logger.info(f"Total IPs tested: {stats['total_tested']}") + self.logger.info(f"Total accessible: {stats['total_accessible']}") + self.logger.info(f"Overall success rate: {stats['total_accessible']/stats['total_tested']*100:.2f}%") + self.logger.info(f"Average response time: {stats['avg_response_time']:.3f}s") + + for provider, provider_stats in stats['by_provider'].items(): + self.logger.info(f"{provider}: {provider_stats['accessible']}/{provider_stats['tested']} " + f"({provider_stats['success_rate']*100:.2f}%)") + + return True + + except Exception as e: + self.logger.error(f"Error during accessibility test: {e}", exc_info=True) + return False + + def print_usage_info(self): + """Print usage information""" + print("\n" + "=" * 60) + print("BestCDN - High-Performance CDN IP Accessibility Tester") + print("=" * 60) + print("\nBefore running, please ensure:") + print("1. Create 'ip_lists' directory") + print("2. Add IP list files for each provider:") + + enabled_providers = list(self.config.get_enabled_providers().keys()) + for provider in enabled_providers: + print(f" - ip_lists/{provider}.txt") + + print("3. Set test domains for each provider") + print("\nExample usage:") + print("```python") + print("from src.main import BestCDN") + print("") + print("# Create BestCDN instance") + print("app = BestCDN()") + print("") + print("# Set test domains") + print("app.set_test_domains({") + for provider in enabled_providers: + print(f" '{provider}': 'your-test-domain.com',") + print("})") + print("") + print("# Run the test") + print("import asyncio") + print("asyncio.run(app.run_accessibility_test())") + print("```") + print("\n" + "=" * 60) + +async def main(): + """Main entry point""" + app = BestCDN() + + # Print usage info if setup is not valid + if not app.validate_setup(): + app.print_usage_info() + return False + + # Run the accessibility test + success = await app.run_accessibility_test() + return success + +if __name__ == "__main__": + try: + success = asyncio.run(main()) + sys.exit(0 if success else 1) + except KeyboardInterrupt: + print("\nTest interrupted by user") + sys.exit(1) + except Exception as e: + print(f"Unexpected error: {e}") + sys.exit(1) \ No newline at end of file diff --git a/src/testers/__init__.py b/src/testers/__init__.py new file mode 100644 index 0000000..bfc3441 --- /dev/null +++ b/src/testers/__init__.py @@ -0,0 +1,7 @@ +""" +Testers package for BestCDN +""" + +from .accessibility_tester import AccessibilityTester, TestResult + +__all__ = ['AccessibilityTester', 'TestResult'] \ No newline at end of file diff --git a/src/testers/__pycache__/__init__.cpython-313.pyc b/src/testers/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d7c8c0acf9a8260e89296c2cdec5b51da6510de2 GIT binary patch literal 323 zcmYk0Jxc>Y5Qg{TV&a8VS_#6o2jXHcf>98nr10#Qb#J{KZoDvi0nbkS4PtBSzp>s* zu(DIGuyrnp=oIt$J~Pt{1~EZ9J9(HqVSI0kUt_DJ5tuxZlmJO-%1-Hs0UL4Pf}}i+ zB!ejLBx`ru@rCu31utgWTCP_=Dn>goTYmW32bZW#NjdUJ_wJo?Ab6 z6>!u+gl?R4LRYD*G)jd{{U1}+;?keC6>8^{dLa#>B<#saIkhs^PT$tjl$n*QPoxJU zm%Nus6*ont)b6Yfz5QvK&7D1fK5l5=^;_sZIi>WAF&cgM2p!V5zIfhwjpcn8)^Yp; DqS;rp literal 0 HcmV?d00001 diff --git a/src/testers/__pycache__/accessibility_tester.cpython-313.pyc b/src/testers/__pycache__/accessibility_tester.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f50fe818f1165463fc13c1963ad19f66f7d09c83 GIT binary patch literal 13440 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 literal 0 HcmV?d00001 diff --git a/src/testers/accessibility_tester.py b/src/testers/accessibility_tester.py new file mode 100644 index 0000000..2645c4b --- /dev/null +++ b/src/testers/accessibility_tester.py @@ -0,0 +1,292 @@ +""" +High-performance IP accessibility tester +""" + +import asyncio +import aiohttp +import time +import logging +from typing import Set, Dict, List, Tuple, Optional +from dataclasses import dataclass +from concurrent.futures import ThreadPoolExecutor +import ssl + +@dataclass +class TestResult: + """Result of an IP accessibility test""" + ip: str + provider: str + accessible: bool + response_time: float + status_code: Optional[int] = None + error: Optional[str] = None + protocol: str = "http" + +class AccessibilityTester: + """High-performance IP accessibility tester""" + + def __init__(self, config): + self.config = config + self.logger = logging.getLogger("accessibility_tester") + self.session: Optional[aiohttp.ClientSession] = None + self.results: List[TestResult] = [] + + async def __aenter__(self): + """Async context manager entry""" + # Create SSL context that doesn't verify certificates for speed + ssl_context = ssl.create_default_context() + ssl_context.check_hostname = False + ssl_context.verify_mode = ssl.CERT_NONE + + # Configure connector for high performance + connector = aiohttp.TCPConnector( + limit=self.config.performance.concurrent_requests, + limit_per_host=50, + ttl_dns_cache=300, + use_dns_cache=True, + ssl=ssl_context if not self.config.testing.validate_ssl else None, + enable_cleanup_closed=True + ) + + # Configure timeout + timeout = aiohttp.ClientTimeout( + total=self.config.performance.request_timeout, + connect=2.0, + sock_read=1.0 + ) + + # Create session + self.session = aiohttp.ClientSession( + connector=connector, + timeout=timeout, + headers={'User-Agent': self.config.testing.user_agent}, + skip_auto_headers=['Accept-Encoding'] # Disable compression for speed + ) + + return self + + async def __aexit__(self, exc_type, exc_val, exc_tb): + """Async context manager exit""" + if self.session: + await self.session.close() + + async def test_ip_accessibility(self, ip: str, provider: str, test_domain: str) -> TestResult: + """Test accessibility of a single IP""" + protocols = self.config.testing.protocols + + # Try each protocol until one succeeds + for protocol in protocols: + result = await self._test_single_protocol(ip, provider, test_domain, protocol) + if result.accessible: + return result + + # If all protocols failed, return the last result + return result + + async def _test_single_protocol(self, ip: str, provider: str, test_domain: str, protocol: str) -> TestResult: + """Test a single IP with a specific protocol""" + start_time = time.time() + + try: + # Construct URL with IP but use Host header for the domain + url = f"{protocol}://{ip}/testpage.php" + headers = {'Host': test_domain} if test_domain else {} + + async with self.session.get( + url, + headers=headers, + allow_redirects=self.config.testing.follow_redirects + ) as response: + response_time = time.time() - start_time + + # Check if response status is OK + if response.status != 200: + return TestResult( + ip=ip, + provider=provider, + accessible=False, + response_time=response_time, + status_code=response.status, + error=f"HTTP {response.status}", + protocol=protocol + ) + + # Try to parse JSON response + try: + json_data = await response.json() + + # Check if the JSON contains the expected test message + if json_data.get("test_message") == "testpagegalaxy123": + return TestResult( + ip=ip, + provider=provider, + accessible=True, + response_time=response_time, + status_code=response.status, + protocol=protocol + ) + else: + return TestResult( + ip=ip, + provider=provider, + accessible=False, + response_time=response_time, + status_code=response.status, + error=f"Invalid test_message: {json_data.get('test_message', 'missing')}", + protocol=protocol + ) + + except Exception as json_error: + return TestResult( + ip=ip, + provider=provider, + accessible=False, + response_time=response_time, + status_code=response.status, + error=f"JSON parse error: {str(json_error)}", + protocol=protocol + ) + + except asyncio.TimeoutError: + response_time = time.time() - start_time + return TestResult( + ip=ip, + provider=provider, + accessible=False, + response_time=response_time, + error="Timeout", + protocol=protocol + ) + except Exception as e: + response_time = time.time() - start_time + return TestResult( + ip=ip, + provider=provider, + accessible=False, + response_time=response_time, + error=str(e), + protocol=protocol + ) + + async def test_ip_batch(self, ip_batch: List[Tuple[str, str]], test_domains: Dict[str, str]) -> List[TestResult]: + """Test a batch of IPs concurrently""" + tasks = [] + + for ip, provider in ip_batch: + test_domain = test_domains.get(provider, "") + if not test_domain: + self.logger.warning(f"No test domain configured for provider {provider}") + continue + + task = self.test_ip_accessibility(ip, provider, test_domain) + tasks.append(task) + + # Execute all tests concurrently + results = await asyncio.gather(*tasks, return_exceptions=True) + + # Filter out exceptions and return valid results + valid_results = [] + for result in results: + if isinstance(result, TestResult): + valid_results.append(result) + elif isinstance(result, Exception): + self.logger.error(f"Test error: {result}") + + return valid_results + + async def test_all_ips(self, provider_ips: Dict[str, Set[str]], test_domains: Dict[str, str]) -> List[TestResult]: + """Test accessibility of all IPs across all providers""" + self.logger.info("Starting high-performance IP accessibility testing") + + # Flatten all IPs with their providers + all_ip_provider_pairs = [] + for provider, ips in provider_ips.items(): + for ip in ips: + all_ip_provider_pairs.append((ip, provider)) + + total_ips = len(all_ip_provider_pairs) + self.logger.info(f"Testing {total_ips} IPs across {len(provider_ips)} providers") + + # Process IPs in batches for memory efficiency + batch_size = self.config.performance.batch_size + all_results = [] + + for i in range(0, total_ips, batch_size): + batch = all_ip_provider_pairs[i:i + batch_size] + batch_num = i // batch_size + 1 + total_batches = (total_ips + batch_size - 1) // batch_size + + self.logger.info(f"Processing batch {batch_num}/{total_batches} ({len(batch)} IPs)") + + try: + batch_results = await self.test_ip_batch(batch, test_domains) + all_results.extend(batch_results) + + # Log progress + accessible_count = sum(1 for r in batch_results if r.accessible) + self.logger.info(f"Batch {batch_num} completed: {accessible_count}/{len(batch_results)} accessible") + + except Exception as e: + self.logger.error(f"Error processing batch {batch_num}: {e}") + + self.results = all_results + + # Log final statistics + total_accessible = sum(1 for r in all_results if r.accessible) + self.logger.info(f"Testing completed: {total_accessible}/{len(all_results)} IPs accessible") + + return all_results + + def get_accessible_ips(self) -> Dict[str, List[str]]: + """Get accessible IPs grouped by provider""" + accessible_ips = {} + + for result in self.results: + if result.accessible: + if result.provider not in accessible_ips: + accessible_ips[result.provider] = [] + accessible_ips[result.provider].append(result.ip) + + return accessible_ips + + def get_statistics(self) -> Dict: + """Get testing statistics""" + if not self.results: + return {} + + stats = { + 'total_tested': len(self.results), + 'total_accessible': sum(1 for r in self.results if r.accessible), + 'by_provider': {}, + 'avg_response_time': sum(r.response_time for r in self.results) / len(self.results), + 'protocols_used': {} + } + + # Statistics by provider + for result in self.results: + provider = result.provider + if provider not in stats['by_provider']: + stats['by_provider'][provider] = { + 'tested': 0, + 'accessible': 0, + 'success_rate': 0.0 + } + + stats['by_provider'][provider]['tested'] += 1 + if result.accessible: + stats['by_provider'][provider]['accessible'] += 1 + + # Calculate success rates + for provider_stats in stats['by_provider'].values(): + if provider_stats['tested'] > 0: + provider_stats['success_rate'] = provider_stats['accessible'] / provider_stats['tested'] + + # Protocol statistics + for result in self.results: + if result.accessible: + protocol = result.protocol + if protocol not in stats['protocols_used']: + stats['protocols_used'][protocol] = 0 + stats['protocols_used'][protocol] += 1 + + return stats \ No newline at end of file diff --git a/src/utils/__init__.py b/src/utils/__init__.py new file mode 100644 index 0000000..a110c1e --- /dev/null +++ b/src/utils/__init__.py @@ -0,0 +1,8 @@ +""" +Utilities package for BestCDN +""" + +from .ip_reader import IPListReader +from .results_manager import ResultsManager + +__all__ = ['IPListReader', 'ResultsManager'] \ No newline at end of file diff --git a/src/utils/__pycache__/__init__.cpython-313.pyc b/src/utils/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..373a69fdd8a269b12d6bf7e3696b988b550e1fc1 GIT binary patch literal 339 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 uukZo%!3#s89V)m61o46-33`P=gylCV^S7w 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 Set[str]: + """Read IP list for a specific CDN provider""" + filename = f"{provider}.txt" + filepath = os.path.join(self.ip_lists_dir, filename) + + if not os.path.exists(filepath): + self.logger.warning(f"IP list file not found: {filepath}") + return set() + + ips = set() + + try: + with open(filepath, 'r', encoding='utf-8') as f: + for line_num, line in enumerate(f, 1): + line = line.strip() + + # Skip empty lines and comments + if not line or line.startswith('#'): + continue + + # Handle CIDR notation + if '/' in line: + try: + network = ipaddress.ip_network(line, strict=False) + + # Different sampling strategy for IPv4 vs IPv6 + if network.version == 6: # IPv6 + # For IPv6, sample only first 32 IPs + self.logger.info(f"IPv6 network {line} - sampling first 32 IPs") + count = 0 + for ip in network.hosts(): + if count >= 32: + break + ips.add(str(ip)) + count += 1 + else: # IPv4 + # For IPv4, include all IPs + if network.num_addresses > 65536: # /16 or larger + self.logger.warning(f"Very large IPv4 network {line} with {network.num_addresses} IPs - this may take time") + + for ip in network.hosts(): + ips.add(str(ip)) + + except ValueError as e: + self.logger.warning(f"Invalid CIDR at line {line_num}: {line} - {e}") + else: + # Single IP address + try: + ip = ipaddress.ip_address(line) + ips.add(str(ip)) + except ValueError as e: + self.logger.warning(f"Invalid IP at line {line_num}: {line} - {e}") + + except Exception as e: + self.logger.error(f"Error reading IP list file {filepath}: {e}") + return set() + + self.logger.info(f"Loaded {len(ips)} IPs for {provider} from {filepath}") + return ips + + def read_all_ip_lists(self, providers: List[str]) -> dict: + """Read IP lists for multiple providers""" + all_ips = {} + + for provider in providers: + ips = self.read_ip_list(provider) + if ips: + all_ips[provider] = ips + else: + self.logger.warning(f"No IPs loaded for provider: {provider}") + + total_ips = sum(len(ips) for ips in all_ips.values()) + self.logger.info(f"Loaded total of {total_ips} IPs across {len(all_ips)} providers") + + return all_ips + + def get_expected_files(self, providers: List[str]) -> List[str]: + """Get list of expected IP list files""" + return [os.path.join(self.ip_lists_dir, f"{provider}.txt") for provider in providers] + + def validate_ip_lists(self, providers: List[str]) -> dict: + """Validate that IP list files exist and are readable""" + validation_results = {} + + for provider in providers: + filename = f"{provider}.txt" + filepath = os.path.join(self.ip_lists_dir, filename) + + result = { + 'exists': os.path.exists(filepath), + 'readable': False, + 'ip_count': 0, + 'errors': [] + } + + if result['exists']: + try: + with open(filepath, 'r', encoding='utf-8') as f: + result['readable'] = True + + # Quick count of valid IPs + for line in f: + line = line.strip() + if line and not line.startswith('#'): + try: + if '/' in line: + network = ipaddress.ip_network(line, strict=False) + result['ip_count'] += min(network.num_addresses, 5000) + else: + ipaddress.ip_address(line) + result['ip_count'] += 1 + except ValueError: + pass # Skip invalid entries for quick validation + + except Exception as e: + result['errors'].append(str(e)) + + validation_results[provider] = result + + return validation_results \ No newline at end of file diff --git a/src/utils/results_manager.py b/src/utils/results_manager.py new file mode 100644 index 0000000..4ad66f8 --- /dev/null +++ b/src/utils/results_manager.py @@ -0,0 +1,297 @@ +""" +Results collection and management system +""" + +import json +import csv +import os +import logging +from datetime import datetime +from typing import List, Dict, Any +from src.testers.accessibility_tester import TestResult + +class ResultsManager: + """Manager for collecting and saving test results""" + + def __init__(self, config): + self.config = config + self.logger = logging.getLogger("results_manager") + + # Ensure results directory exists + os.makedirs("results", exist_ok=True) + os.makedirs("logs", exist_ok=True) + + def save_results(self, results: List[TestResult], stats: Dict[str, Any]) -> str: + """Save test results to file""" + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + + if self.config.output.format.lower() == "json": + return self._save_json_results(results, stats, timestamp) + elif self.config.output.format.lower() == "csv": + return self._save_csv_results(results, stats, timestamp) + else: + # Default to JSON + return self._save_json_results(results, stats, timestamp) + + def _save_json_results(self, results: List[TestResult], stats: Dict[str, Any], timestamp: str) -> str: + """Save results in JSON format""" + # Convert results to dictionaries + results_data = [] + for result in results: + results_data.append({ + 'ip': result.ip, + 'provider': result.provider, + 'accessible': result.accessible, + 'response_time': result.response_time, + 'status_code': result.status_code, + 'error': result.error, + 'protocol': result.protocol + }) + + # Prepare complete data structure + output_data = { + 'metadata': { + 'timestamp': timestamp, + 'total_tested': len(results), + 'total_accessible': sum(1 for r in results if r.accessible), + 'test_config': { + 'concurrent_requests': self.config.performance.concurrent_requests, + 'request_timeout': self.config.performance.request_timeout, + 'batch_size': self.config.performance.batch_size, + 'protocols': self.config.testing.protocols + } + }, + 'statistics': stats, + 'results': results_data + } + + # Save to file + filename = f"accessibility_results_{timestamp}.json" + filepath = os.path.join("results", filename) + + try: + with open(filepath, 'w', encoding='utf-8') as f: + json.dump(output_data, f, indent=2, ensure_ascii=False) + + self.logger.info(f"Results saved to {filepath}") + return filepath + + except Exception as e: + self.logger.error(f"Error saving JSON results: {e}") + return "" + + def _save_csv_results(self, results: List[TestResult], stats: Dict[str, Any], timestamp: str) -> str: + """Save results in CSV format""" + filename = f"accessibility_results_{timestamp}.csv" + filepath = os.path.join("results", filename) + + try: + with open(filepath, 'w', newline='', encoding='utf-8') as f: + writer = csv.writer(f) + + # Write header + writer.writerow([ + 'IP', 'Provider', 'Accessible', 'Response_Time', + 'Status_Code', 'Error', 'Protocol' + ]) + + # Write data + for result in results: + writer.writerow([ + result.ip, + result.provider, + result.accessible, + result.response_time, + result.status_code or '', + result.error or '', + result.protocol + ]) + + # Also save statistics as separate JSON file + stats_filename = f"statistics_{timestamp}.json" + stats_filepath = os.path.join("results", stats_filename) + + with open(stats_filepath, 'w', encoding='utf-8') as f: + json.dump(stats, f, indent=2, ensure_ascii=False) + + self.logger.info(f"Results saved to {filepath}") + self.logger.info(f"Statistics saved to {stats_filepath}") + return filepath + + except Exception as e: + self.logger.error(f"Error saving CSV results: {e}") + return "" + + def save_accessible_ips_only(self, results: List[TestResult]) -> str: + """Save only accessible IPs in a simple format""" + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + filename = f"accessible_ips_{timestamp}.txt" + filepath = os.path.join("results", filename) + + try: + # Group accessible IPs by provider + accessible_by_provider = {} + for result in results: + if result.accessible: + if result.provider not in accessible_by_provider: + accessible_by_provider[result.provider] = [] + accessible_by_provider[result.provider].append(result.ip) + + with open(filepath, 'w', encoding='utf-8') as f: + f.write(f"# Accessible CDN IPs - Generated on {datetime.now().isoformat()}\n") + f.write(f"# Total accessible IPs: {sum(len(ips) for ips in accessible_by_provider.values())}\n\n") + + for provider, ips in accessible_by_provider.items(): + f.write(f"# {provider.upper()} - {len(ips)} accessible IPs\n") + for ip in sorted(ips): + f.write(f"{ip}\n") + f.write("\n") + + self.logger.info(f"Accessible IPs saved to {filepath}") + return filepath + + except Exception as e: + self.logger.error(f"Error saving accessible IPs: {e}") + return "" + + def save_provider_specific_results(self, results: List[TestResult]) -> Dict[str, str]: + """Save results separated by provider""" + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + saved_files = {} + + # Group results by provider + results_by_provider = {} + for result in results: + if result.provider not in results_by_provider: + results_by_provider[result.provider] = [] + results_by_provider[result.provider].append(result) + + # Save each provider's results + for provider, provider_results in results_by_provider.items(): + filename = f"{provider}_results_{timestamp}.json" + filepath = os.path.join("results", filename) + + try: + # Calculate provider-specific stats + accessible_count = sum(1 for r in provider_results if r.accessible) + avg_response_time = sum(r.response_time for r in provider_results) / len(provider_results) + + provider_data = { + 'provider': provider, + 'timestamp': timestamp, + 'total_tested': len(provider_results), + 'total_accessible': accessible_count, + 'success_rate': accessible_count / len(provider_results), + 'avg_response_time': avg_response_time, + 'accessible_ips': [r.ip for r in provider_results if r.accessible], + 'detailed_results': [ + { + 'ip': r.ip, + 'accessible': r.accessible, + 'response_time': r.response_time, + 'status_code': r.status_code, + 'error': r.error, + 'protocol': r.protocol + } for r in provider_results + ] + } + + with open(filepath, 'w', encoding='utf-8') as f: + json.dump(provider_data, f, indent=2, ensure_ascii=False) + + saved_files[provider] = filepath + self.logger.info(f"{provider} results saved to {filepath}") + + except Exception as e: + self.logger.error(f"Error saving {provider} results: {e}") + + return saved_files + + def load_previous_results(self, filepath: str) -> List[TestResult]: + """Load previous test results from file""" + try: + with open(filepath, 'r', encoding='utf-8') as f: + data = json.load(f) + + results = [] + for result_data in data.get('results', []): + result = TestResult( + ip=result_data['ip'], + provider=result_data['provider'], + accessible=result_data['accessible'], + response_time=result_data['response_time'], + status_code=result_data.get('status_code'), + error=result_data.get('error'), + protocol=result_data.get('protocol', 'http') + ) + results.append(result) + + self.logger.info(f"Loaded {len(results)} previous results from {filepath}") + return results + + except Exception as e: + self.logger.error(f"Error loading previous results: {e}") + return [] + + def generate_summary_report(self, results: List[TestResult], stats: Dict[str, Any]) -> str: + """Generate a human-readable summary report""" + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + filename = f"summary_report_{timestamp}.txt" + filepath = os.path.join("results", filename) + + try: + with open(filepath, 'w', encoding='utf-8') as f: + f.write("=" * 60 + "\n") + f.write("CDN IP ACCESSIBILITY TEST SUMMARY REPORT\n") + f.write("=" * 60 + "\n") + f.write(f"Generated: {datetime.now().isoformat()}\n\n") + + # Overall statistics + f.write("OVERALL STATISTICS:\n") + f.write("-" * 20 + "\n") + f.write(f"Total IPs Tested: {stats['total_tested']}\n") + f.write(f"Total Accessible: {stats['total_accessible']}\n") + f.write(f"Overall Success Rate: {stats['total_accessible']/stats['total_tested']*100:.2f}%\n") + f.write(f"Average Response Time: {stats['avg_response_time']:.3f}s\n\n") + + # Provider breakdown + f.write("PROVIDER BREAKDOWN:\n") + f.write("-" * 20 + "\n") + for provider, provider_stats in stats['by_provider'].items(): + f.write(f"{provider.upper()}:\n") + f.write(f" Tested: {provider_stats['tested']}\n") + f.write(f" Accessible: {provider_stats['accessible']}\n") + f.write(f" Success Rate: {provider_stats['success_rate']*100:.2f}%\n\n") + + # Protocol usage + if stats.get('protocols_used'): + f.write("PROTOCOL USAGE:\n") + f.write("-" * 15 + "\n") + for protocol, count in stats['protocols_used'].items(): + f.write(f"{protocol.upper()}: {count} successful connections\n") + f.write("\n") + + # Top accessible IPs per provider (first 10) + accessible_by_provider = {} + for result in results: + if result.accessible: + if result.provider not in accessible_by_provider: + accessible_by_provider[result.provider] = [] + accessible_by_provider[result.provider].append(result.ip) + + f.write("SAMPLE ACCESSIBLE IPs (First 10 per provider):\n") + f.write("-" * 45 + "\n") + for provider, ips in accessible_by_provider.items(): + f.write(f"{provider.upper()}:\n") + for ip in sorted(ips)[:10]: + f.write(f" {ip}\n") + if len(ips) > 10: + f.write(f" ... and {len(ips) - 10} more\n") + f.write("\n") + + self.logger.info(f"Summary report saved to {filepath}") + return filepath + + except Exception as e: + self.logger.error(f"Error generating summary report: {e}") + return "" \ No newline at end of file