From 06d37dddee1ca04be65e27fab2835102f1210dbe Mon Sep 17 00:00:00 2001 From: Spencer Date: Tue, 2 Sep 2025 13:55:45 -0400 Subject: [PATCH] Update files --- .flake8 | 4 +- .github/workflows/ci.yml | 80 +- .github/workflows/coverage-guard.yml | 134 +-- .github/workflows/test.yml | 4 +- .gitignore | 2 +- .pre-commit-config.yaml | 35 + CLAUDE.md | 2 +- LICENSE | 2 +- README.md | 6 +- coverage_tracker.py | 45 +- docs/{API.md => API 2.md} | 8 +- docs/DEPLOYMENT.md | 56 +- docs/EXAMPLES.md | 182 +-- docs/TESTING.md | 80 +- generate_coverage_badge.py | 11 +- indexhtml.log | 1290 -------------------- integration_tests.py | 4 +- nohup.out | 1632 -------------------------- pyproject.toml => pyproject 2.toml | 4 +- pytest.ini => pytest 2.ini | 2 +- sms_notifier.py | 21 +- test_sms_notifications.py | 33 +- test_textbelt.py | 3 +- test_url_watcher.py | 38 +- url_watcher.py | 35 +- 25 files changed, 416 insertions(+), 3297 deletions(-) create mode 100644 .pre-commit-config.yaml rename docs/{API.md => API 2.md} (99%) delete mode 100644 indexhtml.log delete mode 100644 nohup.out rename pyproject.toml => pyproject 2.toml (94%) rename pytest.ini => pytest 2.ini (82%) diff --git a/.flake8 b/.flake8 index a484535..385c76a 100644 --- a/.flake8 +++ b/.flake8 @@ -1,4 +1,4 @@ [flake8] max-line-length = 100 -extend-ignore = E203, W503 -exclude = venv, .git, __pycache__, build, dist, htmlcov \ No newline at end of file +extend-ignore = E203, W503, E231 +exclude = venv, .git, __pycache__, build, dist, htmlcov diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7c3a3c7..18ed150 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,12 +39,12 @@ jobs: steps: - uses: actions/checkout@v4 - + - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - + - name: Cache pip dependencies uses: actions/cache@v4 with: @@ -52,65 +52,59 @@ jobs: key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} restore-keys: | ${{ runner.os }}-pip- - + - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt - + - name: Run tests with coverage run: | set -e python -m pytest --cov=. --cov-report=xml --cov-report=term-missing --cov-report=html -v - + - name: Run coverage tracker run: | set -e python coverage_tracker.py env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - + - name: Generate coverage summary if: matrix.python-version == '3.11' run: | # Create coverage summary for job summary + echo "## 📊 Coverage Summary" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + # Get current coverage + CURRENT_COV=$(python -m pytest --cov=. --cov-report=term --quiet | grep TOTAL | awk '{print $4}' | sed 's/%//') + if [ -f .coverage_baseline.json ]; then - python -c " -import json -import subprocess -import re -import os - -# Get current coverage -result = subprocess.run(['python', '-m', 'pytest', '--cov=.', '--cov-report=term-missing', '--quiet'], capture_output=True, text=True) -match = re.search(r'TOTAL.*?(\d+)%', result.stdout) -current_cov = float(match.group(1)) if match else 0 - -# Get baseline -try: - with open('.coverage_baseline.json') as f: - baseline = json.load(f) - baseline_cov = baseline['total_coverage'] -except: - baseline_cov = current_cov - -diff = current_cov - baseline_cov - -with open(os.environ['GITHUB_STEP_SUMMARY'], 'a') as f: - f.write('\n## 📊 Coverage Summary\n\n') - f.write(f'- **Current Coverage**: {current_cov}%\n') - f.write(f'- **Baseline Coverage**: {baseline_cov}%\n') - f.write(f'- **Change**: {diff:+.1f}%\n\n') - - if diff >= 0: - f.write('✅ Coverage maintained or improved\n') - elif diff >= -2: - f.write('📊 Coverage within acceptable tolerance (2%)\n') - else: - f.write('âš ī¸ Significant coverage decline detected\n') -" + # Get baseline coverage + BASELINE_COV=$(python -c "import json; print(json.load(open('.coverage_baseline.json'))['total_coverage'])") + + # Calculate difference + DIFF=$(echo "$CURRENT_COV - $BASELINE_COV" | bc 2>/dev/null || echo "0") + + echo "- **Current Coverage**: ${CURRENT_COV}%" >> $GITHUB_STEP_SUMMARY + echo "- **Baseline Coverage**: ${BASELINE_COV}%" >> $GITHUB_STEP_SUMMARY + echo "- **Change**: ${DIFF}%" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + + # Add status based on difference + if (( $(echo "$DIFF >= 0" | bc -l) )); then + echo "✅ Coverage maintained or improved" >> $GITHUB_STEP_SUMMARY + elif (( $(echo "$DIFF >= -2" | bc -l) )); then + echo "📊 Coverage within acceptable tolerance (2%)" >> $GITHUB_STEP_SUMMARY + else + echo "âš ī¸ Significant coverage decline detected" >> $GITHUB_STEP_SUMMARY + fi + else + echo "- **Current Coverage**: ${CURRENT_COV}%" >> $GITHUB_STEP_SUMMARY + echo "- **Baseline**: Not available" >> $GITHUB_STEP_SUMMARY fi - + - name: Upload coverage to Codecov if: matrix.python-version == '3.11' uses: codecov/codecov-action@v4 @@ -120,14 +114,14 @@ with open(os.environ['GITHUB_STEP_SUMMARY'], 'a') as f: name: codecov-umbrella fail_ci_if_error: false continue-on-error: true - + - name: Archive coverage reports if: matrix.python-version == '3.11' uses: actions/upload-artifact@v4 with: name: coverage-report path: htmlcov/ - + - name: Upload coverage baseline if: matrix.python-version == '3.11' && github.ref == 'refs/heads/main' uses: actions/upload-artifact@v4 diff --git a/.github/workflows/coverage-guard.yml b/.github/workflows/coverage-guard.yml index caf8c14..7723649 100644 --- a/.github/workflows/coverage-guard.yml +++ b/.github/workflows/coverage-guard.yml @@ -11,7 +11,7 @@ jobs: contents: read pull-requests: write issues: write - + steps: - uses: actions/checkout@v4 with: @@ -54,49 +54,40 @@ jobs: else MAIN_COVERAGE="unknown" fi - - # Get current coverage from pytest output - CURRENT_COVERAGE=$(python -c " - import subprocess - result = subprocess.run(['python', '-m', 'pytest', '--cov=.', '--cov-report=term-missing', '--quiet'], capture_output=True, text=True) - import re - match = re.search(r'TOTAL.*?(\d+)%', result.stdout) - print(match.group(1) if match else '0') - ") - + + # Get current coverage from the last pytest run + CURRENT_COVERAGE=$(python -m pytest --cov=. --cov-report=term --quiet | grep TOTAL | awk '{print $4}' | sed 's/%//') + echo "MAIN_COVERAGE=$MAIN_COVERAGE" >> $GITHUB_OUTPUT echo "CURRENT_COVERAGE=$CURRENT_COVERAGE" >> $GITHUB_OUTPUT - - # Create GitHub Job Summary using Python for comparisons + + # Create GitHub Job Summary + echo "# 📊 Coverage Report" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + if [ "$MAIN_COVERAGE" != "unknown" ]; then - python -c " -import os - -main_cov = float('$MAIN_COVERAGE') -current_cov = float('$CURRENT_COVERAGE') -diff = current_cov - main_cov - -with open(os.environ['GITHUB_STEP_SUMMARY'], 'w') as f: - f.write('# 📊 Coverage Report\n\n') - f.write('| Branch | Coverage | Change |\n') - f.write('|--------|----------|--------|\n') - f.write(f'| main | {main_cov}% | baseline |\n') - f.write(f'| ${{ github.head_ref }} | {current_cov}% | {diff:+.1f}% |\n\n') - - if diff > 2: - f.write(f'✅ **Coverage improved significantly** by {diff:.1f}%\n') - elif diff > 0: - f.write(f'✅ **Coverage improved** by {diff:.1f}%\n') - elif diff >= -2: - f.write(f'📊 **Coverage maintained** ({diff:+.1f}% change, within 2% tolerance)\n\n') - f.write('> ✅ **Within tolerance** - small coverage changes are acceptable.\n') - else: - f.write(f'âš ī¸ **Coverage declined significantly** by {abs(diff):.1f}%\n\n') - f.write('> ❌ **Significant regression detected!** This exceeds the 2% tolerance.\n') -" - else - echo "# 📊 Coverage Report" >> $GITHUB_STEP_SUMMARY + echo "| Branch | Coverage | Change |" >> $GITHUB_STEP_SUMMARY + echo "|--------|----------|--------|" >> $GITHUB_STEP_SUMMARY + echo "| main | ${MAIN_COVERAGE}% | baseline |" >> $GITHUB_STEP_SUMMARY + + # Calculate difference using bc or awk + DIFF=$(echo "$CURRENT_COVERAGE - $MAIN_COVERAGE" | bc 2>/dev/null || echo "$CURRENT_COVERAGE - $MAIN_COVERAGE" | awk '{print $1 - $3}') + + echo "| PR | ${CURRENT_COVERAGE}% | ${DIFF}% |" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY + + # Add status message based on difference + if (( $(echo "$DIFF > 2" | bc -l) )); then + echo "✅ **Coverage improved significantly**" >> $GITHUB_STEP_SUMMARY + elif (( $(echo "$DIFF > 0" | bc -l) )); then + echo "✅ **Coverage improved**" >> $GITHUB_STEP_SUMMARY + elif (( $(echo "$DIFF >= -2" | bc -l) )); then + echo "📊 **Coverage maintained** (within 2% tolerance)" >> $GITHUB_STEP_SUMMARY + else + echo "âš ī¸ **Coverage declined significantly**" >> $GITHUB_STEP_SUMMARY + echo "> ❌ **Significant regression detected!** This exceeds the 2% tolerance." >> $GITHUB_STEP_SUMMARY + fi + else echo "âš ī¸ **No baseline available** - this may be the first run." >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "| Current Coverage |" >> $GITHUB_STEP_SUMMARY @@ -104,65 +95,8 @@ with open(os.environ['GITHUB_STEP_SUMMARY'], 'w') as f: echo "| ${CURRENT_COVERAGE}% |" >> $GITHUB_STEP_SUMMARY fi - - name: Comment PR with coverage results - if: github.event_name == 'pull_request' && steps.coverage.outputs.MAIN_COVERAGE != 'unknown' - continue-on-error: true - uses: actions/github-script@v7 - with: - script: | - try { - const mainCoverage = '${{ steps.coverage.outputs.MAIN_COVERAGE }}'; - const currentCoverage = '${{ steps.coverage.outputs.CURRENT_COVERAGE }}'; - const diff = parseFloat(currentCoverage) - parseFloat(mainCoverage); - - console.log(`Coverage data: main=${mainCoverage}%, current=${currentCoverage}%, diff=${diff.toFixed(1)}%`); - - let emoji, status, message; - if (diff > 2) { - emoji = "✅"; - status = "improved significantly"; - message = `Coverage ${status} by ${diff.toFixed(1)}%`; - } else if (diff > 0) { - emoji = "✅"; - status = "improved"; - message = `Coverage ${status} by ${diff.toFixed(1)}%`; - } else if (diff >= -2) { - emoji = "📊"; - status = "maintained"; - message = `Coverage ${status} (${diff.toFixed(1)}% change, within tolerance)`; - } else { - emoji = "âš ī¸"; - status = "declined significantly"; - message = `Coverage ${status} by ${Math.abs(diff).toFixed(1)}%`; - } - - const body = `## ${emoji} Coverage Report - -| Branch | Coverage | -|--------|----------| -| main | ${mainCoverage}% | -| ${context.payload.pull_request.head.ref} | ${currentCoverage}% | - -**${message}** (${mainCoverage}% → ${currentCoverage}%) - -${diff < -2 ? '❌ **Significant regression detected!** This exceeds the 2% tolerance.' : ''}${diff >= -2 && diff < 0 ? '✅ **Within tolerance** - small coverage changes are acceptable.' : ''}`; - - console.log(`Attempting to comment on PR #${context.payload.pull_request.number}`); - - const result = await github.rest.issues.createComment({ - issue_number: context.payload.pull_request.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: body - }); - - console.log(`Comment created successfully: ${result.data.html_url}`); - - } catch (error) { - console.error('Error creating PR comment:', error); - console.error('Context payload:', JSON.stringify(context.payload, null, 2)); - // Don't fail the workflow if commenting fails - } + # PR commenting removed - use GitHub Actions summary instead + # The coverage report is available in the workflow summary - name: Upload coverage reports uses: codecov/codecov-action@v4 @@ -171,4 +105,4 @@ ${diff < -2 ? '❌ **Significant regression detected!** This exceeds the 2% tole flags: unittests name: pr-coverage fail_ci_if_error: false - continue-on-error: true \ No newline at end of file + continue-on-error: true diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5f40f17..c148dd9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -47,11 +47,11 @@ jobs: name: codecov-umbrella fail_ci_if_error: false continue-on-error: true - + - name: Upload coverage baseline if: matrix.python-version == '3.11' && github.ref == 'refs/heads/main' uses: actions/upload-artifact@v4 with: name: coverage-baseline path: .coverage_baseline.json - retention-days: 30 \ No newline at end of file + retention-days: 30 diff --git a/.gitignore b/.gitignore index 4077f6e..25104c5 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,4 @@ htmlcov/ .coverage_baseline.json export_env.sh .env -.env.local \ No newline at end of file +.env.local diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..b13ec24 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,35 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files + - id: check-merge-conflict + + # Python formatting + - repo: https://github.com/psf/black + rev: 23.7.0 + hooks: + - id: black + + # Import sorting + - repo: https://github.com/pycqa/isort + rev: 5.12.0 + hooks: + - id: isort + args: ["--profile", "black"] + + # Python linting + - repo: https://github.com/pycqa/flake8 + rev: 6.0.0 + hooks: + - id: flake8 + + # Type checking (optional but recommended) + - repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.5.1 + hooks: + - id: mypy + additional_dependencies: [types-requests] diff --git a/CLAUDE.md b/CLAUDE.md index 0114251..acab6a1 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -24,4 +24,4 @@ URL Watcher - A Python application that monitors URLs for changes and sends SMS - Always run linting before committing: `flake8 . && black --check .` - Use black for formatting: `black .` - Max line length is configured to 100 characters -- SMS notifications require TEXTBELT_API_KEY and SMS_PHONE_NUMBER environment variables \ No newline at end of file +- SMS notifications require TEXTBELT_API_KEY and SMS_PHONE_NUMBER environment variables diff --git a/LICENSE b/LICENSE index 8887281..427d184 100644 --- a/LICENSE +++ b/LICENSE @@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +SOFTWARE. diff --git a/README.md b/README.md index 5ab57af..b401364 100644 --- a/README.md +++ b/README.md @@ -28,10 +28,10 @@ A simple Python tool that monitors websites for content changes and sends SMS no ```bash # Single check python url_watcher.py https://example.com - + # Continuous monitoring python url_watcher.py https://example.com --continuous - + # With SMS alerts python url_watcher.py https://example.com --sms ``` @@ -58,4 +58,4 @@ pytest ## License -MIT \ No newline at end of file +MIT diff --git a/coverage_tracker.py b/coverage_tracker.py index bb04016..22c8ca1 100755 --- a/coverage_tracker.py +++ b/coverage_tracker.py @@ -6,18 +6,21 @@ import json import os -import sys -import subprocess import re -import requests +import subprocess +import sys from datetime import datetime -from typing import Dict, Optional, Tuple +from typing import Any, Dict, Optional, Tuple + +import requests class CoverageTracker: """Tracks code coverage over time and prevents regression""" - def __init__(self, baseline_file: str = ".coverage_baseline.json", tolerance: float = 2.0): + def __init__( + self, baseline_file: str = ".coverage_baseline.json", tolerance: float = 2.0 + ): self.baseline_file = baseline_file self.tolerance = tolerance # Allow up to 2% decline before failing self.github_token = os.environ.get("GITHUB_TOKEN") @@ -100,7 +103,7 @@ def download_baseline_from_github(self) -> bool: "Accept": "application/vnd.github.v3+json", } - params = { + params: Dict[str, Any] = { "branch": "main", "status": "completed", "conclusion": "success", @@ -131,7 +134,9 @@ def download_baseline_from_github(self) -> bool: # Look for coverage baseline artifact for artifact in artifacts: if artifact["name"] == "coverage-baseline": - return self._download_artifact(artifact["archive_download_url"], headers) + return self._download_artifact( + artifact["archive_download_url"], headers + ) print("â„šī¸ No previous coverage baseline found in GitHub artifacts") return False @@ -142,8 +147,8 @@ def download_baseline_from_github(self) -> bool: def _download_artifact(self, download_url: str, headers: dict) -> bool: """Download and extract the coverage baseline artifact""" - import zipfile import tempfile + import zipfile try: # Download the artifact zip @@ -199,7 +204,10 @@ def save_baseline(self, total_coverage: float, per_file_coverage: Dict[str, floa json.dump(baseline_data, f, indent=2) def compare_coverage( - self, current_total: float, current_per_file: Dict[str, float], baseline_data: Dict + self, + current_total: float, + current_per_file: Dict[str, float], + baseline_data: Dict, ) -> Tuple[bool, str]: """ Compare current coverage with baseline @@ -231,13 +239,16 @@ def compare_coverage( elif current_total > baseline_total: diff = current_total - baseline_total messages.append( - f"✅ Total coverage improved: {baseline_total}% → {current_total}% (+{diff}%)" + f"✅ Total coverage improved: {baseline_total}% → " + f"{current_total}% (+{diff}%)" ) else: messages.append(f"📊 Total coverage maintained: {current_total}%") # Check per-file coverage (use smaller tolerance for individual files) - file_tolerance = max(1.0, self.tolerance / 2) # At least 1%, or half the total tolerance + file_tolerance = max( + 1.0, self.tolerance / 2 + ) # At least 1%, or half the total tolerance for filename, current_cov in current_per_file.items(): baseline_cov = baseline_per_file.get(filename, 0) @@ -255,11 +266,15 @@ def compare_coverage( ) elif current_cov > baseline_cov: diff = current_cov - baseline_cov - messages.append(f"✅ {filename}: {baseline_cov}% → {current_cov}% (+{diff}%)") + messages.append( + f"✅ {filename}: {baseline_cov}% → {current_cov}% (+{diff}%)" + ) return is_acceptable, "\n".join(messages) - def run_check(self, fail_on_decline: bool = True, update_baseline: bool = True) -> bool: + def run_check( + self, fail_on_decline: bool = True, update_baseline: bool = True + ) -> bool: """ Run coverage check @@ -339,7 +354,9 @@ def main(): help="Don't update baseline", ) parser.add_argument( - "--reset-baseline", action="store_true", help="Reset the baseline to current coverage" + "--reset-baseline", + action="store_true", + help="Reset the baseline to current coverage", ) parser.add_argument( "--tolerance", diff --git a/docs/API.md b/docs/API 2.md similarity index 99% rename from docs/API.md rename to docs/API 2.md index 86ca8fb..c7a3c1b 100644 --- a/docs/API.md +++ b/docs/API 2.md @@ -160,7 +160,7 @@ Sends an SMS notification about a URL change. notifier = SMSNotifier(phone_number="+1234567890", api_key="your_key") success = notifier.send_notification( - "https://example.com", + "https://example.com", "Content changes detected" ) @@ -248,7 +248,7 @@ except Exception as e: notifier = SMSNotifier() if not notifier.is_configured(): print("SMS not configured properly") - + result = notifier.send_notification("https://example.com", "test") if not result: print("SMS sending failed - check logs for details") @@ -294,6 +294,6 @@ The URL cache is stored as JSON: ## Performance Notes - **Randomized Intervals**: Continuous monitoring uses random intervals to avoid detection -- **Content Hashing**: Quick hash comparison before expensive diff generation +- **Content Hashing**: Quick hash comparison before expensive diff generation - **Efficient Storage**: Only stores necessary data in cache files -- **SMS Rate Limiting**: TextBelt has rate limits - avoid excessive notifications \ No newline at end of file +- **SMS Rate Limiting**: TextBelt has rate limits - avoid excessive notifications diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md index 0d5664d..5eca967 100644 --- a/docs/DEPLOYMENT.md +++ b/docs/DEPLOYMENT.md @@ -107,7 +107,7 @@ python url_watcher.py https://httpbin.org/uuid --sms TEXTBELT_API_KEY=your_production_api_key LOG_LEVEL=INFO EOF - + chmod 600 /home/urlwatcher/watcher/.env ``` @@ -118,7 +118,7 @@ python url_watcher.py https://httpbin.org/uuid --sms Description=URL Watcher Service After=network.target Wants=network.target - + [Service] Type=simple User=urlwatcher @@ -130,7 +130,7 @@ python url_watcher.py https://httpbin.org/uuid --sms RestartSec=30 StandardOutput=journal StandardError=journal - + [Install] WantedBy=multi-user.target EOF @@ -174,14 +174,14 @@ logging.basicConfig( def monitor_url(url, interval_min=60, interval_max=300): """Monitor a single URL in a separate thread""" logger = logging.getLogger(f'monitor-{url}') - + try: sms_notifier = create_notifier_from_env() watcher = URLWatcher( storage_file=f"/home/urlwatcher/data/{url.replace('://', '_').replace('/', '_')}.json", sms_notifier=sms_notifier ) - + watcher.watch_continuously(url, interval_min, interval_max) except Exception as e: logger.error(f"Error monitoring {url}: {e}") @@ -193,10 +193,10 @@ def main(): "https://httpbin.org/uuid", "https://api.github.com/zen" ] - + # Create data directory os.makedirs("/home/urlwatcher/data", exist_ok=True) - + # Start monitoring threads threads = [] for url in urls: @@ -204,7 +204,7 @@ def main(): thread.start() threads.append(thread) time.sleep(1) # Stagger starts - + # Keep main thread alive try: while True: @@ -214,8 +214,8 @@ def main(): if not thread.is_alive(): logging.warning(f"Thread {i} died, restarting...") new_thread = threading.Thread( - target=monitor_url, - args=(urls[i],), + target=monitor_url, + args=(urls[i],), daemon=True ) new_thread.start() @@ -253,10 +253,10 @@ ExecStart=/home/urlwatcher/watcher/.venv/bin/python /home/urlwatcher/watcher/mul #!/bin/bash apt update && apt upgrade -y apt install -y python3 python3-pip python3-venv git - + # Create service user useradd --system --create-home --shell /bin/bash urlwatcher - + # Install application sudo -u urlwatcher bash << 'EOF' cd /home/urlwatcher @@ -266,7 +266,7 @@ ExecStart=/home/urlwatcher/watcher/.venv/bin/python /home/urlwatcher/watcher/mul source .venv/bin/activate pip install -r requirements.txt EOF - + # Create systemd service and start systemctl enable urlwatcher systemctl start urlwatcher @@ -315,7 +315,7 @@ ExecStart=/home/urlwatcher/watcher/.venv/bin/python /home/urlwatcher/watcher/mul 2. **Environment Variables** Set in Railway dashboard: - `SMS_PHONE_NUMBER`: Your phone number - - `TEXTBELT_API_KEY`: Your TextBelt API key + - `TEXTBELT_API_KEY`: Your TextBelt API key - `TARGET_URL`: URL to monitor ## Container Deployment @@ -372,7 +372,7 @@ services: - ./data:/app/data - ./logs:/app/logs command: ["python", "multi_monitor.py"] - + # Optional: Add monitoring prometheus: image: prom/prometheus:latest @@ -381,7 +381,7 @@ services: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml - + grafana: image: grafana/grafana:latest container_name: grafana @@ -481,7 +481,7 @@ data: # Use requests session for connection pooling import requests from requests.adapters import HTTPAdapter - + class OptimizedURLWatcher(URLWatcher): def __init__(self, **kwargs): super().__init__(**kwargs) @@ -489,7 +489,7 @@ data: adapter = HTTPAdapter(pool_connections=10, pool_maxsize=20) self.session.mount('http://', adapter) self.session.mount('https://', adapter) - + def _fetch_url_content(self, url): response = self.session.get(url, timeout=10) response.raise_for_status() @@ -501,22 +501,22 @@ data: # Respect TextBelt rate limits import time from functools import wraps - + class RateLimitedSMSNotifier(SMSNotifier): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.last_sms_time = 0 self.min_interval = 60 # Minimum 1 minute between SMS - + def send_notification(self, url, message, subject=None): # Enforce rate limiting current_time = time.time() time_since_last = current_time - self.last_sms_time - + if time_since_last < self.min_interval: sleep_time = self.min_interval - time_since_last time.sleep(sleep_time) - + result = super().send_notification(url, message, subject) self.last_sms_time = time.time() return result @@ -527,9 +527,9 @@ data: 1. **Health Check Endpoint** ```python from flask import Flask, jsonify - + app = Flask(__name__) - + @app.route('/health') def health_check(): """Health check endpoint""" @@ -537,7 +537,7 @@ data: # Test TextBelt configuration notifier = create_notifier_from_env() is_configured = notifier.is_configured() - + return jsonify({ 'status': 'healthy' if is_configured else 'degraded', 'sms_configured': is_configured, @@ -548,7 +548,7 @@ data: 'status': 'unhealthy', 'error': str(e) }), 503 - + @app.route('/metrics') def metrics(): """Prometheus metrics endpoint""" @@ -579,7 +579,7 @@ cp /home/urlwatcher/watcher/.env.example "$BACKUP_DIR/config_template_$DATE.env" # Upload to cloud storage (example with rclone) rclone copy "$BACKUP_DIR/cache_backup_$DATE.tar.gz" remote:urlwatcher-backups/ -# Clean old backups (keep last 30 days) +# Clean old backups (keep last 30 days) find "$BACKUP_DIR" -name "*.tar.gz" -mtime +30 -delete ``` @@ -592,4 +592,4 @@ find "$BACKUP_DIR" -name "*.tar.gz" -mtime +30 -delete | `LOG_LEVEL` | Logging level | `INFO`, `DEBUG` | No | | `URL_WATCHER_ENV` | Environment name | `production`, `development` | No | -This deployment guide focuses on TextBelt integration and removes all AWS dependencies, providing modern, cloud-agnostic deployment options. \ No newline at end of file +This deployment guide focuses on TextBelt integration and removes all AWS dependencies, providing modern, cloud-agnostic deployment options. diff --git a/docs/EXAMPLES.md b/docs/EXAMPLES.md index 9e4a4fb..35e83ab 100644 --- a/docs/EXAMPLES.md +++ b/docs/EXAMPLES.md @@ -32,8 +32,8 @@ Difference: --- https://httpbin.org/uuid (previous) +++ https://httpbin.org/uuid (current) @@ -3,5 +3,5 @@ - "origin": "203.0.113.12", -- "url": "https://httpbin.org/uuid", + "origin": "203.0.113.12", +- "url": "https://httpbin.org/uuid", - "uuid": "f47ac10b-58cc-4372-a567-0e02b2c3d479" + "url": "https://httpbin.org/uuid", + "uuid": "6ba7b810-9dad-11d1-80b4-00c04fd430c8" @@ -108,11 +108,11 @@ from url_watcher import URLWatcher def main(): watcher = URLWatcher() - + # Monitor every 10-30 seconds (good for testing) watcher.watch_continuously( - "http://localhost:8080", - min_interval=10, + "http://localhost:8080", + min_interval=10, max_interval=30 ) @@ -139,10 +139,10 @@ from url_watcher import URLWatcher def monitor_multiple_urls(urls, interval=60): watcher = URLWatcher() - + while True: print(f"\n=== Checking {len(urls)} URLs at {time.strftime('%H:%M:%S')} ===") - + for url in urls: try: changed, diff = watcher.check_url(url) @@ -156,7 +156,7 @@ def monitor_multiple_urls(urls, interval=60): print(f"❌ No change: {url}") except Exception as e: print(f"❌ ERROR: {url} - {e}") - + print(f"\nSleeping for {interval} seconds...") time.sleep(interval) @@ -166,7 +166,7 @@ if __name__ == "__main__": "https://api.github.com/zen", "https://httpbin.org/delay/1" ] - + monitor_multiple_urls(urls_to_monitor, interval=30) ``` @@ -187,17 +187,17 @@ class FilteredURLWatcher(URLWatcher): def __init__(self, css_selector=None, **kwargs): super().__init__(**kwargs) self.css_selector = css_selector - + def _fetch_url_content(self, url): """Override to filter content using CSS selector""" response = requests.get(url, timeout=10) response.raise_for_status() - + if self.css_selector: soup = BeautifulSoup(response.text, 'html.parser') elements = soup.select(self.css_selector) return '\n'.join(str(el) for el in elements) - + return response.text # Usage examples @@ -205,11 +205,11 @@ if __name__ == "__main__": # Monitor only H1 tags h1_watcher = FilteredURLWatcher(css_selector="h1") changed, diff = h1_watcher.check_url("https://example.com") - + # Monitor specific div content_watcher = FilteredURLWatcher(css_selector="div.content") changed, diff = content_watcher.check_url("https://news.ycombinator.com") - + print(f"Changed: {changed}") if diff: print(f"Diff: {diff}") @@ -236,38 +236,38 @@ class PriceWatcher(URLWatcher): def __init__(self, price_selector, **kwargs): super().__init__(**kwargs) self.price_selector = price_selector - + def _fetch_url_content(self, url): """Extract only price information""" response = requests.get(url, timeout=10, headers={ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36' }) response.raise_for_status() - + soup = BeautifulSoup(response.text, 'html.parser') price_element = soup.select_one(self.price_selector) - + if price_element: price_text = price_element.get_text().strip() # Extract numeric price price_match = re.search(r'[\d,]+\.?\d*', price_text) if price_match: return f"Price: ${price_match.group()}" - + return "Price not found" def monitor_product_price(): # Setup SMS notifications sms_notifier = create_notifier_from_env() - + # Create price watcher (example CSS selector - adjust for actual site) watcher = PriceWatcher( price_selector=".price-current", sms_notifier=sms_notifier ) - + product_url = "https://example-store.com/product/123" - + try: changed, diff = watcher.check_url(product_url) if changed: @@ -298,22 +298,22 @@ class NewsFeedWatcher(URLWatcher): def _fetch_url_content(self, url): """Parse RSS/Atom feed and return formatted content""" feed = feedparser.parse(url) - + if feed.bozo: raise Exception(f"Invalid feed: {feed.bozo_exception}") - + content_lines = [f"Feed: {feed.feed.get('title', 'Unknown')}"] - + # Get latest 10 articles for entry in feed.entries[:10]: title = entry.get('title', 'No title') link = entry.get('link', '') published = entry.get('published', 'Unknown date') - + content_lines.append(f"- {title} ({published})") if link: content_lines.append(f" {link}") - + return '\n'.join(content_lines) def monitor_news(): @@ -322,9 +322,9 @@ def monitor_news(): "https://rss.cnn.com/rss/edition.rss", "https://feeds.npr.org/1001/rss.xml" ] - + watcher = NewsFeedWatcher() - + for feed_url in feeds: try: changed, diff = watcher.check_url(feed_url) @@ -355,10 +355,10 @@ class APIWatcher(URLWatcher): def _fetch_url_content(self, url): """Format JSON responses for better diff viewing""" import requests - + response = requests.get(url, timeout=10) response.raise_for_status() - + try: # Pretty-print JSON for better diffs json_data = response.json() @@ -373,9 +373,9 @@ def monitor_api_endpoints(): "https://httpbin.org/uuid", "https://api.coindesk.com/v1/bpi/currentprice.json" ] - + watcher = APIWatcher() - + for endpoint in api_endpoints: try: changed, diff = watcher.check_url(endpoint) @@ -410,7 +410,7 @@ from url_watcher import URLWatcher class SlackNotifier: def __init__(self, webhook_url): self.webhook_url = webhook_url - + def send_notification(self, url, message): """Send change notification to Slack""" payload = { @@ -433,7 +433,7 @@ class SlackNotifier: } ] } - + try: response = requests.post( self.webhook_url, @@ -450,7 +450,7 @@ class SlackURLWatcher(URLWatcher): def __init__(self, slack_notifier, **kwargs): super().__init__(**kwargs) self.slack_notifier = slack_notifier - + def check_url(self, url): changed, diff = super().check_url(url) if changed and self.slack_notifier: @@ -461,10 +461,10 @@ class SlackURLWatcher(URLWatcher): if __name__ == "__main__": # Replace with your Slack webhook URL SLACK_WEBHOOK = "https://hooks.slack.com/services/YOUR/WEBHOOK/URL" - + slack_notifier = SlackNotifier(SLACK_WEBHOOK) watcher = SlackURLWatcher(slack_notifier=slack_notifier) - + # Monitor with Slack notifications watcher.watch_continuously("https://httpbin.org/uuid") ``` @@ -487,12 +487,12 @@ class DatabaseLogger: def __init__(self, db_path="url_changes.db"): self.db_path = db_path self._init_db() - + def _init_db(self): """Initialize database schema""" conn = sqlite3.connect(self.db_path) cursor = conn.cursor() - + cursor.execute(""" CREATE TABLE IF NOT EXISTS url_changes ( id INTEGER PRIMARY KEY AUTOINCREMENT, @@ -502,42 +502,42 @@ class DatabaseLogger: content_hash TEXT ) """) - + conn.commit() conn.close() - + def log_change(self, url, diff_content, content_hash): """Log a URL change to database""" conn = sqlite3.connect(self.db_path) cursor = conn.cursor() - + cursor.execute(""" INSERT INTO url_changes (url, changed_at, diff_content, content_hash) VALUES (?, ?, ?, ?) """, (url, datetime.now(), diff_content, content_hash)) - + conn.commit() conn.close() - + def get_changes(self, url=None, limit=10): """Get recent changes from database""" conn = sqlite3.connect(self.db_path) cursor = conn.cursor() - + if url: cursor.execute(""" - SELECT * FROM url_changes - WHERE url = ? - ORDER BY changed_at DESC + SELECT * FROM url_changes + WHERE url = ? + ORDER BY changed_at DESC LIMIT ? """, (url, limit)) else: cursor.execute(""" - SELECT * FROM url_changes - ORDER BY changed_at DESC + SELECT * FROM url_changes + ORDER BY changed_at DESC LIMIT ? """, (limit,)) - + results = cursor.fetchall() conn.close() return results @@ -546,7 +546,7 @@ class DatabaseURLWatcher(URLWatcher): def __init__(self, db_logger, **kwargs): super().__init__(**kwargs) self.db_logger = db_logger - + def check_url(self, url): changed, diff = super().check_url(url) if changed and self.db_logger: @@ -560,10 +560,10 @@ if __name__ == "__main__": # Setup database logging db_logger = DatabaseLogger() watcher = DatabaseURLWatcher(db_logger=db_logger) - + # Monitor and log changes watcher.watch_continuously("https://httpbin.org/uuid") - + # Query recent changes # recent_changes = db_logger.get_changes(limit=5) # for change in recent_changes: @@ -588,7 +588,7 @@ class WebhookNotifier: def __init__(self, webhook_url, secret=None): self.webhook_url = webhook_url self.secret = secret - + def send_webhook(self, url, diff_content): """Send webhook notification""" payload = { @@ -601,14 +601,14 @@ class WebhookNotifier: "diff_length": len(diff_content) if diff_content else 0 } } - + headers = {'Content-Type': 'application/json'} - + # Add HMAC signature if secret provided if self.secret: import hmac import hashlib - + payload_bytes = json.dumps(payload).encode('utf-8') signature = hmac.new( self.secret.encode('utf-8'), @@ -616,7 +616,7 @@ class WebhookNotifier: hashlib.sha256 ).hexdigest() headers['X-Signature'] = f"sha256={signature}" - + try: response = requests.post( self.webhook_url, @@ -624,7 +624,7 @@ class WebhookNotifier: headers=headers, timeout=10 ) - + print(f"Webhook sent: {response.status_code}") return response.status_code < 400 except Exception as e: @@ -635,7 +635,7 @@ class WebhookURLWatcher(URLWatcher): def __init__(self, webhook_notifier, **kwargs): super().__init__(**kwargs) self.webhook_notifier = webhook_notifier - + def check_url(self, url): changed, diff = super().check_url(url) if changed and self.webhook_notifier: @@ -649,7 +649,7 @@ if __name__ == "__main__": webhook_url="https://your-server.com/webhook", secret="your-webhook-secret" ) - + watcher = WebhookURLWatcher(webhook_notifier=webhook_notifier) watcher.watch_continuously("https://httpbin.org/uuid") ``` @@ -675,7 +675,7 @@ class RateLimitedWatcher(URLWatcher): super().__init__(**kwargs) self.max_retries = max_retries self.base_delay = base_delay - + def _fetch_url_content(self, url): """Fetch with retry logic for rate limits""" for attempt in range(self.max_retries + 1): @@ -683,17 +683,17 @@ class RateLimitedWatcher(URLWatcher): response = requests.get(url, timeout=10, headers={ 'User-Agent': 'URL-Watcher/1.0' }) - + if response.status_code == 429: # Rate limited if attempt < self.max_retries: delay = self.base_delay * (2 ** attempt) + random.uniform(0, 1) print(f"Rate limited, waiting {delay:.2f} seconds...") time.sleep(delay) continue - + response.raise_for_status() return response.text - + except requests.exceptions.RequestException as e: if attempt < self.max_retries: delay = self.base_delay * (2 ** attempt) @@ -726,7 +726,7 @@ class AuthenticatedWatcher(URLWatcher): self.auth = auth self.cookies = cookies self.headers = headers or {} - + def _fetch_url_content(self, url): """Fetch with authentication""" response = requests.get( @@ -746,7 +746,7 @@ basic_auth_watcher = AuthenticatedWatcher( auth=HTTPBasicAuth('username', 'password') ) -# Digest Auth +# Digest Auth digest_auth_watcher = AuthenticatedWatcher( auth=HTTPDigestAuth('username', 'password') ) @@ -787,10 +787,10 @@ class HeaderOnlyWatcher(URLWatcher): """Use HEAD request to check only headers""" response = requests.head(url, timeout=10) response.raise_for_status() - + # Create content from relevant headers content_parts = [] - + # Common headers that indicate file changes relevant_headers = [ 'Last-Modified', @@ -798,11 +798,11 @@ class HeaderOnlyWatcher(URLWatcher): 'Content-Length', 'Content-Type' ] - + for header in relevant_headers: if header in response.headers: content_parts.append(f"{header}: {response.headers[header]}") - + return '\n'.join(content_parts) # Usage for monitoring large files @@ -856,43 +856,43 @@ class ResilientWatcher(URLWatcher): self.max_consecutive_failures = max_consecutive_failures self.failure_backoff = failure_backoff self.last_failure_time = {} - + def check_url_with_recovery(self, url): """Check URL with error recovery logic""" now = datetime.now() - + # Check if we're in backoff period if url in self.last_failure_time: time_since_failure = now - self.last_failure_time[url] if time_since_failure < timedelta(seconds=self.failure_backoff): logging.info(f"Skipping {url} - in backoff period") return False, None - + try: changed, diff = self.check_url(url) - + # Reset failure count on success if url in self.failure_counts: del self.failure_counts[url] if url in self.last_failure_time: del self.last_failure_time[url] - + logging.info(f"Successfully checked {url} - Changed: {changed}") return changed, diff - + except Exception as e: # Increment failure count self.failure_counts[url] = self.failure_counts.get(url, 0) + 1 self.last_failure_time[url] = now - + failure_count = self.failure_counts[url] logging.error(f"Failed to check {url} ({failure_count} consecutive failures): {e}") - + # Stop checking URL if too many failures if failure_count >= self.max_consecutive_failures: logging.warning(f"Disabling {url} after {failure_count} consecutive failures") return None, None # Signal to remove from monitoring - + return False, None def resilient_monitoring(): @@ -903,22 +903,22 @@ def resilient_monitoring(): "https://invalid-domain-12345.com", # This will fail "https://api.github.com/zen" ] - + watcher = ResilientWatcher( max_consecutive_failures=3, failure_backoff=600 # 10 minutes ) - + active_urls = set(urls_to_monitor) - + while active_urls: logging.info(f"Checking {len(active_urls)} active URLs") - + urls_to_remove = [] - + for url in list(active_urls): result = watcher.check_url_with_recovery(url) - + if result[0] is None: # Signal to remove URL urls_to_remove.append(url) logging.warning(f"Removing {url} from monitoring") @@ -926,15 +926,15 @@ def resilient_monitoring(): logging.info(f"Content changed: {url}") if result[1]: logging.info(f"Diff preview: {result[1][:200]}...") - + # Remove failed URLs for url in urls_to_remove: active_urls.remove(url) - + if not active_urls: logging.warning("No active URLs remaining") break - + logging.info("Sleeping for 60 seconds...") time.sleep(60) @@ -942,4 +942,4 @@ if __name__ == "__main__": resilient_monitoring() ``` -These examples demonstrate various ways to use the URL Watcher for different scenarios, from basic monitoring to advanced integrations with external services and robust error handling. Each example can be adapted to your specific needs and requirements. \ No newline at end of file +These examples demonstrate various ways to use the URL Watcher for different scenarios, from basic monitoring to advanced integrations with external services and robust error handling. Each example can be adapted to your specific needs and requirements. diff --git a/docs/TESTING.md b/docs/TESTING.md index 4758345..b8807eb 100644 --- a/docs/TESTING.md +++ b/docs/TESTING.md @@ -156,28 +156,28 @@ from your_module import YourClass class TestYourClass(unittest.TestCase): """Test cases for YourClass""" - + def setUp(self): """Set up test fixtures before each test method""" self.test_data = "example" self.mock_object = Mock() - + def tearDown(self): """Clean up after each test method""" # Remove test files, reset state, etc. pass - + def test_basic_functionality(self): """Test basic functionality - descriptive docstring""" # Arrange expected_result = "expected" - + # Act actual_result = your_function("input") - + # Assert self.assertEqual(actual_result, expected_result) - + def test_error_handling(self): """Test error handling""" with self.assertRaises(ValueError): @@ -200,11 +200,11 @@ def test_url_fetch(self, mock_get): mock_response.text = "Test content" mock_response.raise_for_status.return_value = None mock_get.return_value = mock_response - + # Test the function watcher = URLWatcher() content = watcher._fetch_url_content("http://example.com") - + # Verify self.assertEqual(content, "Test content") mock_get.assert_called_once_with("http://example.com", timeout=10) @@ -220,11 +220,11 @@ def test_sns_functionality(self, mock_boto_client): mock_client = Mock() mock_client.publish.return_value = {'MessageId': 'test-123'} mock_boto_client.return_value = mock_client - + # Test SMS notification notifier = SMSNotifier(topic_arn="arn:aws:sns:us-east-1:123456789012:test") result = notifier.send_notification("http://example.com", "test message") - + # Verify self.assertTrue(result) mock_client.publish.assert_called_once() @@ -238,10 +238,10 @@ def test_sns_functionality(self, mock_boto_client): def test_cache_loading(self, mock_exists, mock_file): """Test cache loading with mocked file operations""" mock_exists.return_value = True - + watcher = URLWatcher() cache = watcher._load_cache() - + self.assertEqual(cache, {"test": "data"}) mock_file.assert_called_once_with(watcher.storage_file, 'r') ``` @@ -259,12 +259,12 @@ class TestWithTempFiles(unittest.TestCase): """Create temporary files for testing""" self.temp_dir = tempfile.mkdtemp() self.temp_cache = os.path.join(self.temp_dir, "test_cache.json") - + def tearDown(self): """Clean up temporary files""" import shutil shutil.rmtree(self.temp_dir) - + def test_with_temp_file(self): """Test functionality with temporary file""" watcher = URLWatcher(storage_file=self.temp_cache) @@ -287,13 +287,13 @@ class TestWithFixtures(unittest.TestCase): """ - + cls.sample_json = { "id": 123, "name": "Test Item", "timestamp": "2025-07-29T16:45:32Z" } - + def test_html_parsing(self): """Test HTML parsing with fixture data""" # Use self.sample_html in test @@ -317,7 +317,7 @@ class TestWithLocalServer(unittest.TestCase): cls.port = 8888 cls.server_thread = None cls._start_server() - + @classmethod def _start_server(cls): """Start HTTP server in background thread""" @@ -326,22 +326,22 @@ class TestWithLocalServer(unittest.TestCase): with socketserver.TCPServer(("", cls.port), handler) as httpd: cls.httpd = httpd httpd.serve_forever() - + cls.server_thread = threading.Thread(target=run_server, daemon=True) cls.server_thread.start() sleep(0.5) # Give server time to start - + @classmethod def tearDownClass(cls): """Stop local HTTP server""" if hasattr(cls, 'httpd'): cls.httpd.shutdown() - + def test_local_server_monitoring(self): """Test monitoring of local HTTP server""" watcher = URLWatcher() changed, diff = watcher.check_url(f"http://localhost:{self.port}") - + # First check should be "no change" (first time) self.assertFalse(changed) ``` @@ -358,7 +358,7 @@ class TestWithDatabase(unittest.TestCase): self.db_file = tempfile.NamedTemporaryFile(delete=False, suffix='.db') self.db_path = self.db_file.name self.db_file.close() - + # Initialize test database self.conn = sqlite3.connect(self.db_path) self.cursor = self.conn.cursor() @@ -369,12 +369,12 @@ class TestWithDatabase(unittest.TestCase): ) """) self.conn.commit() - + def tearDown(self): """Clean up test database""" self.conn.close() os.unlink(self.db_path) - + def test_database_operations(self): """Test database operations""" # Test database functionality @@ -394,13 +394,13 @@ def time_test(func): start_time = time.time() result = func(self) end_time = time.time() - + execution_time = end_time - start_time print(f"{func.__name__} took {execution_time:.4f} seconds") - + # Assert performance requirements self.assertLess(execution_time, 1.0, "Test took too long") - + return result return wrapper @@ -409,14 +409,14 @@ class TestPerformance(unittest.TestCase): def test_url_checking_performance(self): """Test URL checking performance""" watcher = URLWatcher() - + # Test with mocked fast response with patch('requests.get') as mock_get: mock_response = Mock() mock_response.text = "test content" mock_response.raise_for_status.return_value = None mock_get.return_value = mock_response - + # This should complete quickly changed, diff = watcher.check_url("http://example.com") ``` @@ -456,17 +456,17 @@ def test_timestamp_generation(self, mock_datetime): def test_error_conditions(self): """Test various error conditions""" watcher = URLWatcher() - + # Test network errors with patch('requests.get', side_effect=requests.ConnectionError()): with self.assertRaises(Exception): watcher.check_url("http://example.com") - + # Test timeout errors with patch('requests.get', side_effect=requests.Timeout()): with self.assertRaises(Exception): watcher.check_url("http://example.com") - + # Test HTTP errors mock_response = Mock() mock_response.raise_for_status.side_effect = requests.HTTPError("404 Not Found") @@ -497,17 +497,17 @@ def test_environment_configuration(self): ```python class URLWatcherTestCase(unittest.TestCase): """Base test case with custom assertions for URL Watcher""" - + def assertURLChanged(self, watcher, url, expected_change=True): """Custom assertion for URL change detection""" changed, diff = watcher.check_url(url) - + if expected_change: self.assertTrue(changed, f"Expected {url} to have changed") self.assertIsNotNone(diff, "Expected diff content for changed URL") else: self.assertFalse(changed, f"Expected {url} to be unchanged") - + def assertSMSConfigured(self, notifier): """Custom assertion for SMS configuration""" self.assertTrue(notifier.is_configured(), "SMS notifier not properly configured") @@ -565,24 +565,24 @@ jobs: steps: - uses: actions/checkout@v3 - + - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v3 with: python-version: ${{ matrix.python-version }} - + - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt pip install coverage - + - name: Run tests with coverage run: | coverage run -m unittest discover -s . -p "test_*.py" coverage report coverage xml - + - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 with: @@ -637,4 +637,4 @@ python -m unittest test_sms_notifications.TestSMSNotifier.test_send_notification python -m unittest test_performance.TestPerformance -v ``` -This testing guide provides comprehensive coverage of testing practices for the URL Watcher project, ensuring reliability and maintainability of the codebase. \ No newline at end of file +This testing guide provides comprehensive coverage of testing practices for the URL Watcher project, ensuring reliability and maintainability of the codebase. diff --git a/generate_coverage_badge.py b/generate_coverage_badge.py index 665c9cd..263d8aa 100644 --- a/generate_coverage_badge.py +++ b/generate_coverage_badge.py @@ -3,15 +3,22 @@ Generate a simple coverage badge for README """ import os -import subprocess import re +import subprocess def get_current_coverage(): """Get current coverage percentage""" try: result = subprocess.run( - ["python", "-m", "pytest", "--cov=.", "--cov-report=term-missing", "--quiet"], + [ + "python", + "-m", + "pytest", + "--cov=.", + "--cov-report=term-missing", + "--quiet", + ], capture_output=True, text=True, ) diff --git a/indexhtml.log b/indexhtml.log deleted file mode 100644 index 3463378..0000000 --- a/indexhtml.log +++ /dev/null @@ -1,1290 +0,0 @@ -📱 SMS notifications enabled -Starting continuous monitoring of: http://127.0.0.1:3000 -Check interval: 60-300 seconds -Press Ctrl+C to stop - -[2025-08-28 23:44:12] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 247 seconds... - -[2025-08-28 23:48:19] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 148 seconds... - -[2025-08-28 23:50:47] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 123 seconds... - -[2025-08-28 23:52:50] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 111 seconds... - -[2025-08-28 23:54:41] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 275 seconds... - -[2025-08-28 23:59:16] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 221 seconds... - -[2025-08-29 00:02:57] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 222 seconds... - -[2025-08-29 00:06:39] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 81 seconds... - -[2025-08-29 00:08:00] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 152 seconds... - -[2025-08-29 00:10:32] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 249 seconds... - -[2025-08-29 00:14:41] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 256 seconds... - -[2025-08-29 00:18:57] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 191 seconds... - -[2025-08-29 00:22:09] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 221 seconds... - -[2025-08-29 00:25:50] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 213 seconds... - -[2025-08-29 00:29:23] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 95 seconds... - -[2025-08-29 00:30:58] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 147 seconds... - -[2025-08-29 00:33:25] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 94 seconds... - -[2025-08-29 00:34:59] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 159 seconds... - -[2025-08-29 00:37:38] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 91 seconds... - -[2025-08-29 00:39:09] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 87 seconds... - -[2025-08-29 00:40:36] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 127 seconds... - -[2025-08-29 00:42:43] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 248 seconds... - -[2025-08-29 00:46:51] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 296 seconds... - -[2025-08-29 00:51:47] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 146 seconds... - -[2025-08-29 00:54:13] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 105 seconds... - -[2025-08-29 00:55:58] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 103 seconds... - -[2025-08-29 00:57:42] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 247 seconds... - -[2025-08-29 01:01:49] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 79 seconds... - -[2025-08-29 01:03:08] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 111 seconds... - -[2025-08-29 01:04:59] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 257 seconds... - -[2025-08-29 01:09:16] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 287 seconds... - -[2025-08-29 01:14:03] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 89 seconds... - -[2025-08-29 01:15:32] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 96 seconds... - -[2025-08-29 01:17:08] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 229 seconds... - -[2025-08-29 01:20:57] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 98 seconds... - -[2025-08-29 01:22:35] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 226 seconds... - -[2025-08-29 01:26:21] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 294 seconds... - -[2025-08-29 01:31:15] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 127 seconds... - -[2025-08-29 01:33:22] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 204 seconds... - -[2025-08-29 01:36:47] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 213 seconds... - -[2025-08-29 01:40:20] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 92 seconds... - -[2025-08-29 01:41:52] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 90 seconds... - -[2025-08-29 01:43:22] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 249 seconds... - -[2025-08-29 01:47:31] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 100 seconds... - -[2025-08-29 01:49:11] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 134 seconds... - -[2025-08-29 01:51:25] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 260 seconds... - -[2025-08-29 01:55:45] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 194 seconds... - -[2025-08-29 01:58:59] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 196 seconds... - -[2025-08-29 02:02:15] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 105 seconds... - -[2025-08-29 02:04:00] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 202 seconds... - -[2025-08-29 02:07:22] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 220 seconds... - -[2025-08-29 02:11:02] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 74 seconds... - -[2025-08-29 02:12:16] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 211 seconds... - -[2025-08-29 02:15:48] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 225 seconds... - -[2025-08-29 02:19:33] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 251 seconds... - -[2025-08-29 02:23:44] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 174 seconds... - -[2025-08-29 02:26:38] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 137 seconds... - -[2025-08-29 02:28:55] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 159 seconds... - -[2025-08-29 02:31:34] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 165 seconds... - -[2025-08-29 02:34:19] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 253 seconds... - -[2025-08-29 02:38:32] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 267 seconds... - -[2025-08-29 02:42:59] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 227 seconds... - -[2025-08-29 02:46:46] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 81 seconds... - -[2025-08-29 02:48:07] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 134 seconds... - -[2025-08-29 02:50:21] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 229 seconds... - -[2025-08-29 02:54:10] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 96 seconds... - -[2025-08-29 02:55:47] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 296 seconds... - -[2025-08-29 03:00:43] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 254 seconds... - -[2025-08-29 03:04:57] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 101 seconds... - -[2025-08-29 03:06:38] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 92 seconds... - -[2025-08-29 03:08:10] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 280 seconds... - -[2025-08-29 03:12:50] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 224 seconds... - -[2025-08-29 03:16:34] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 142 seconds... - -[2025-08-29 03:18:56] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 234 seconds... - -[2025-08-29 03:22:50] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 156 seconds... - -[2025-08-29 03:25:26] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 212 seconds... - -[2025-08-29 03:28:58] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 296 seconds... - -[2025-08-29 03:33:54] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 260 seconds... - -[2025-08-29 03:38:14] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 214 seconds... - -[2025-08-29 03:41:48] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 152 seconds... - -[2025-08-29 03:44:20] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 68 seconds... - -[2025-08-29 03:45:28] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 280 seconds... - -[2025-08-29 03:50:08] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 78 seconds... - -[2025-08-29 03:51:26] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 196 seconds... - -[2025-08-29 03:54:43] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 183 seconds... - -[2025-08-29 03:57:46] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 111 seconds... - -[2025-08-29 03:59:37] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 92 seconds... - -[2025-08-29 04:01:09] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 102 seconds... - -[2025-08-29 04:02:51] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 147 seconds... - -[2025-08-29 04:05:18] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 266 seconds... - -[2025-08-29 04:09:44] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 278 seconds... - -[2025-08-29 04:14:22] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 276 seconds... - -[2025-08-29 04:18:58] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 91 seconds... - -[2025-08-29 04:20:29] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 119 seconds... - -[2025-08-29 04:22:28] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 200 seconds... - -[2025-08-29 04:25:48] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 275 seconds... - -[2025-08-29 04:30:24] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 288 seconds... - -[2025-08-29 04:35:12] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 64 seconds... - -[2025-08-29 04:36:16] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 206 seconds... - -[2025-08-29 04:39:42] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 209 seconds... - -[2025-08-29 04:43:11] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 246 seconds... - -[2025-08-29 04:47:17] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 108 seconds... - -[2025-08-29 04:49:05] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 228 seconds... - -[2025-08-29 04:52:53] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 174 seconds... - -[2025-08-29 04:55:47] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 78 seconds... - -[2025-08-29 04:57:05] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 256 seconds... - -[2025-08-29 05:01:21] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 244 seconds... - -[2025-08-29 05:05:25] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 267 seconds... - -[2025-08-29 05:09:52] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 251 seconds... - -[2025-08-29 05:14:03] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 136 seconds... - -[2025-08-29 05:16:19] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 275 seconds... - -[2025-08-29 05:20:55] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 73 seconds... - -[2025-08-29 05:22:08] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 171 seconds... - -[2025-08-29 05:24:59] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 225 seconds... - -[2025-08-29 05:28:44] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 286 seconds... - -[2025-08-29 05:33:30] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 86 seconds... - -[2025-08-29 05:34:56] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 91 seconds... - -[2025-08-29 05:36:27] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 130 seconds... - -[2025-08-29 05:38:37] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 221 seconds... - -[2025-08-29 05:42:18] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 142 seconds... - -[2025-08-29 05:44:40] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 281 seconds... - -[2025-08-29 05:49:21] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 135 seconds... - -[2025-08-29 05:51:36] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 141 seconds... - -[2025-08-29 05:53:57] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 127 seconds... - -[2025-08-29 05:56:04] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 79 seconds... - -[2025-08-29 05:57:24] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 112 seconds... - -[2025-08-29 05:59:16] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 137 seconds... - -[2025-08-29 06:01:33] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 298 seconds... - -[2025-08-29 06:06:31] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 294 seconds... - -[2025-08-29 06:11:25] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 229 seconds... - -[2025-08-29 06:15:14] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 68 seconds... - -[2025-08-29 06:16:22] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 172 seconds... - -[2025-08-29 06:19:14] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 91 seconds... - -[2025-08-29 06:20:45] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 103 seconds... - -[2025-08-29 06:22:28] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 298 seconds... - -[2025-08-29 06:27:26] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 278 seconds... - -[2025-08-29 06:32:04] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 85 seconds... - -[2025-08-29 06:33:29] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 106 seconds... - -[2025-08-29 06:35:15] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 80 seconds... - -[2025-08-29 06:36:36] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 267 seconds... - -[2025-08-29 06:41:03] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 171 seconds... - -[2025-08-29 06:43:54] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 220 seconds... - -[2025-08-29 06:47:34] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 137 seconds... - -[2025-08-29 06:49:51] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 93 seconds... - -[2025-08-29 06:51:24] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 183 seconds... - -[2025-08-29 06:54:27] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 235 seconds... - -[2025-08-29 06:58:22] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 119 seconds... - -[2025-08-29 07:00:21] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 60 seconds... - -[2025-08-29 07:01:21] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 243 seconds... - -[2025-08-29 07:05:24] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 107 seconds... - -[2025-08-29 07:07:11] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 175 seconds... - -[2025-08-29 07:10:06] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 282 seconds... - -[2025-08-29 07:14:48] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 258 seconds... - -[2025-08-29 07:19:07] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 106 seconds... - -[2025-08-29 07:20:53] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 258 seconds... - -[2025-08-29 07:25:11] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 135 seconds... - -[2025-08-29 07:27:26] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 269 seconds... - -[2025-08-29 07:31:55] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 265 seconds... - -[2025-08-29 07:36:20] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 81 seconds... - -[2025-08-29 07:37:41] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 209 seconds... - -[2025-08-29 07:41:10] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 246 seconds... - -[2025-08-29 07:45:16] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 160 seconds... - -[2025-08-29 07:47:56] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 169 seconds... - -[2025-08-29 07:50:45] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 248 seconds... - -[2025-08-29 07:54:53] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 124 seconds... - -[2025-08-29 07:56:57] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 224 seconds... - -[2025-08-29 08:00:41] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 260 seconds... - -[2025-08-29 08:05:02] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 246 seconds... - -[2025-08-29 08:09:08] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 84 seconds... - -[2025-08-29 08:10:32] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 186 seconds... - -[2025-08-29 08:13:38] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 114 seconds... - -[2025-08-29 08:15:32] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 146 seconds... - -[2025-08-29 08:17:58] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 251 seconds... - -[2025-08-29 08:22:09] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 161 seconds... - -[2025-08-29 08:24:50] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 210 seconds... - -[2025-08-29 08:28:20] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 237 seconds... - -[2025-08-29 08:32:17] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 228 seconds... - -[2025-08-29 08:36:05] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 120 seconds... - -[2025-08-29 08:38:05] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 232 seconds... - -[2025-08-29 08:41:57] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 90 seconds... - -[2025-08-29 08:43:27] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 224 seconds... - -[2025-08-29 08:47:11] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 108 seconds... - -[2025-08-29 08:48:59] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 158 seconds... - -[2025-08-29 08:51:38] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 290 seconds... - -[2025-08-29 08:56:28] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 217 seconds... - -[2025-08-29 09:00:05] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 173 seconds... - -[2025-08-29 09:02:58] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 151 seconds... - -[2025-08-29 09:05:29] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 206 seconds... - -[2025-08-29 09:08:55] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 282 seconds... - -[2025-08-29 09:13:37] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 218 seconds... - -[2025-08-29 09:17:15] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 205 seconds... - -[2025-08-29 09:20:40] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 199 seconds... - -[2025-08-29 09:23:59] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 274 seconds... - -[2025-08-29 09:28:34] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 289 seconds... - -[2025-08-29 09:33:23] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 275 seconds... - -[2025-08-29 09:37:58] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 140 seconds... - -[2025-08-29 09:40:18] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 188 seconds... - -[2025-08-29 09:43:26] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 245 seconds... - -[2025-08-29 09:47:31] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 158 seconds... - -[2025-08-29 09:50:09] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 292 seconds... - -[2025-08-29 09:55:01] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 124 seconds... - -[2025-08-29 09:57:05] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 173 seconds... - -[2025-08-29 09:59:58] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 273 seconds... - -[2025-08-29 10:04:31] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 129 seconds... - -[2025-08-29 10:06:40] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 97 seconds... - -[2025-08-29 10:08:18] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 219 seconds... - -[2025-08-29 10:11:57] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 273 seconds... - -[2025-08-29 10:16:30] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 61 seconds... - -[2025-08-29 10:17:31] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 211 seconds... - -[2025-08-29 10:21:02] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 280 seconds... - -[2025-08-29 10:25:42] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 241 seconds... - -[2025-08-29 10:29:43] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 254 seconds... - -[2025-08-29 10:33:57] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 130 seconds... - -[2025-08-29 10:36:07] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 140 seconds... - -[2025-08-29 10:38:27] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 233 seconds... - -[2025-08-29 10:42:20] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 127 seconds... - -[2025-08-29 10:44:27] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 169 seconds... - -[2025-08-29 10:47:16] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 197 seconds... - -[2025-08-29 10:50:34] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 91 seconds... - -[2025-08-29 10:52:05] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 253 seconds... - -[2025-08-29 10:56:18] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 104 seconds... - -[2025-08-29 10:58:02] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 98 seconds... - -[2025-08-29 10:59:40] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 179 seconds... - -[2025-08-29 11:02:39] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 71 seconds... - -[2025-08-29 11:03:50] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 242 seconds... - -[2025-08-29 11:07:52] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 76 seconds... - -[2025-08-29 11:09:08] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 278 seconds... - -[2025-08-29 11:13:46] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 162 seconds... - -[2025-08-29 11:16:28] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 270 seconds... - -[2025-08-29 11:20:58] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 145 seconds... - -[2025-08-29 11:23:23] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 142 seconds... - -[2025-08-29 11:25:45] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 256 seconds... - -[2025-08-29 11:30:01] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 81 seconds... - -[2025-08-29 11:31:22] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 136 seconds... - -[2025-08-29 11:33:39] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 128 seconds... - -[2025-08-29 11:35:47] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 121 seconds... - -[2025-08-29 11:37:48] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 240 seconds... - -[2025-08-29 11:41:48] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 67 seconds... - -[2025-08-29 11:42:55] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 171 seconds... - -[2025-08-29 11:45:46] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 296 seconds... - -[2025-08-29 11:50:42] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 175 seconds... - -[2025-08-29 11:53:37] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 275 seconds... - -[2025-08-29 11:58:12] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 80 seconds... - -[2025-08-29 11:59:32] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 106 seconds... - -[2025-08-29 12:01:18] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 68 seconds... - -[2025-08-29 12:02:27] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 103 seconds... - -[2025-08-29 12:04:10] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 223 seconds... - -[2025-08-29 12:07:53] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 234 seconds... - -[2025-08-29 12:11:47] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 80 seconds... - -[2025-08-29 12:13:07] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 181 seconds... - -[2025-08-29 12:16:08] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 248 seconds... - -[2025-08-29 12:20:16] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 109 seconds... - -[2025-08-29 12:22:05] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 94 seconds... - -[2025-08-29 12:23:39] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 84 seconds... - -[2025-08-29 12:25:03] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 189 seconds... - -[2025-08-29 12:28:12] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 245 seconds... - -[2025-08-29 12:32:17] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 71 seconds... - -[2025-08-29 12:33:28] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 147 seconds... - -[2025-08-29 12:35:55] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 253 seconds... - -[2025-08-29 12:40:08] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 184 seconds... - -[2025-08-29 12:43:13] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 241 seconds... - -[2025-08-29 12:47:14] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 267 seconds... - -[2025-08-29 12:51:41] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 151 seconds... - -[2025-08-29 12:54:12] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 116 seconds... - -[2025-08-29 12:56:08] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 213 seconds... - -[2025-08-29 12:59:41] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 205 seconds... - -[2025-08-29 13:03:06] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 217 seconds... - -[2025-08-29 13:06:43] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 144 seconds... - -[2025-08-29 13:09:07] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 67 seconds... - -[2025-08-29 13:10:14] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 271 seconds... - -[2025-08-29 13:14:45] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 75 seconds... - -[2025-08-29 13:16:00] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 296 seconds... - -[2025-08-29 13:20:56] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 80 seconds... - -[2025-08-29 13:22:16] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 229 seconds... - -[2025-08-29 13:26:06] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 79 seconds... - -[2025-08-29 13:27:25] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 164 seconds... - -[2025-08-29 13:30:09] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 77 seconds... - -[2025-08-29 13:31:26] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 161 seconds... - -[2025-08-29 13:34:07] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 107 seconds... - -[2025-08-29 13:35:54] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 144 seconds... - -[2025-08-29 13:38:18] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 178 seconds... - -[2025-08-29 13:41:16] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 71 seconds... - -[2025-08-29 13:42:27] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 111 seconds... - -[2025-08-29 13:44:18] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 249 seconds... - -[2025-08-29 13:48:27] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 200 seconds... - -[2025-08-29 13:51:47] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 75 seconds... - -[2025-08-29 13:53:02] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 215 seconds... - -[2025-08-29 13:56:38] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 68 seconds... - -[2025-08-29 13:57:46] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 125 seconds... - -[2025-08-29 13:59:51] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 181 seconds... - -[2025-08-29 14:02:52] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 222 seconds... - -[2025-08-29 14:06:34] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 87 seconds... - -[2025-08-29 14:08:01] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 98 seconds... - -[2025-08-29 14:09:39] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 193 seconds... - -[2025-08-29 14:12:52] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 236 seconds... - -[2025-08-29 14:16:48] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 177 seconds... - -[2025-08-29 14:19:45] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 189 seconds... - -[2025-08-29 14:22:54] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 297 seconds... - -[2025-08-29 14:27:51] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 169 seconds... - -[2025-08-29 14:30:40] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 141 seconds... - -[2025-08-29 14:33:02] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 292 seconds... - -[2025-08-29 14:37:54] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 189 seconds... - -[2025-08-29 14:41:03] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 214 seconds... - -[2025-08-29 14:44:37] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 166 seconds... - -[2025-08-29 14:47:23] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 105 seconds... - -[2025-08-29 14:49:08] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 61 seconds... - -[2025-08-29 14:50:09] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 134 seconds... - -[2025-08-29 14:52:23] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 62 seconds... - -[2025-08-29 14:53:25] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 167 seconds... - -[2025-08-29 14:56:12] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 232 seconds... - -[2025-08-29 15:00:04] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 284 seconds... - -[2025-08-29 15:04:48] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 177 seconds... - -[2025-08-29 15:07:45] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 120 seconds... - -[2025-08-29 15:09:45] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 266 seconds... - -[2025-08-29 15:14:11] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 88 seconds... - -[2025-08-29 15:15:39] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 285 seconds... - -[2025-08-29 15:20:25] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 128 seconds... - -[2025-08-29 15:22:33] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 107 seconds... - -[2025-08-29 15:24:20] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 123 seconds... - -[2025-08-29 15:26:23] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 89 seconds... - -[2025-08-29 15:27:52] Checking URL... -Error during check: Failed to fetch URL: HTTPConnectionPool(host='127.0.0.1', port=3000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused')) -Next check in 167 seconds... - -[2025-08-29 15:30:39] Checking URL... diff --git a/integration_tests.py b/integration_tests.py index c912604..5f183ef 100644 --- a/integration_tests.py +++ b/integration_tests.py @@ -3,9 +3,11 @@ Test script for URL watcher functionality """ +import os import time + import requests -import os + from url_watcher import URLWatcher diff --git a/nohup.out b/nohup.out deleted file mode 100644 index 86856d1..0000000 --- a/nohup.out +++ /dev/null @@ -1,1632 +0,0 @@ -ERROR:root:TextBelt API error: Sorry, ability to send URLs via text is limited to verified accounts. Please go to https://textbelt.com/whitelist?key=05938834333553d10ee8d619025219cce853f7c4H9mQKQN1g7U6NzXRS2qTGl7XW or email support@textbelt.com with your use case and we will verify your key ASAP. -ERROR:root:TextBelt API error: Sorry, ability to send URLs via text is limited to verified accounts. Please go to https://textbelt.com/whitelist?key=05938834333553d10ee8d619025219cce853f7c4H9mQKQN1g7U6NzXRS2qTGl7XW or email support@textbelt.com with your use case and we will verify your key ASAP. -📱 SMS notifications enabled -Starting continuous monitoring of: https://atwoodknives.blogspot.com -Check interval: 60-300 seconds -Press Ctrl+C to stop - -[2025-08-28 23:44:33] Checking URL... -❌ No changes detected -Next check in 299 seconds... - -[2025-08-28 23:49:32] Checking URL... -❌ No changes detected -Next check in 294 seconds... - -[2025-08-28 23:54:26] Checking URL... -✅ Content has CHANGED! - -Difference: ---- https://atwoodknives.blogspot.com (previous)+++ https://atwoodknives.blogspot.com (current)@@ -5091,7 +5091,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -