web: status bug fix
Local Docker Build (Dev) / build-dev (push) Successful in 5s

This commit is contained in:
2025-10-22 17:48:29 -04:00
parent 4095ca18c8
commit a8176d2f05
2 changed files with 52 additions and 89 deletions
+36 -77
View File
@@ -1362,100 +1362,59 @@ def register_web_routes(app, dependencies):
except Exception as e: except Exception as e:
raise HTTPException(status_code=500, detail=f"Manual scan request failed: {str(e)}") raise HTTPException(status_code=500, detail=f"Manual scan request failed: {str(e)}")
# Simple scan tracking (since we can't reliably access docker logs from container)
scan_tracking = {"last_scan_time": None, "scanning": False}
@app.post("/api/scan/track")
async def track_scan_start():
"""Called when a scan is initiated to track timing"""
from datetime import datetime
scan_tracking["last_scan_time"] = datetime.now()
scan_tracking["scanning"] = True
return {"status": "tracked"}
@app.get("/api/scan/status") @app.get("/api/scan/status")
async def api_scan_status(): async def api_scan_status():
"""Check scan status by attempting to detect scan activity""" """Check scan status using simple time-based tracking"""
import urllib.request import urllib.request
import urllib.error import urllib.error
import json import json
import os import os
import socket import socket
import subprocess
import re
from datetime import datetime, timedelta from datetime import datetime, timedelta
# Get core container URL to check if it's responsive # Check if we have a recent scan
if scan_tracking["last_scan_time"]:
time_since_scan = datetime.now() - scan_tracking["last_scan_time"]
# Assume scan is active for up to 10 minutes after initiation
# This is a reasonable estimate for most scan operations
if time_since_scan < timedelta(minutes=10) and scan_tracking["scanning"]:
minutes_elapsed = int(time_since_scan.total_seconds() / 60)
seconds_elapsed = int(time_since_scan.total_seconds() % 60)
if minutes_elapsed > 0:
elapsed_str = f"{minutes_elapsed}m {seconds_elapsed}s"
else:
elapsed_str = f"{seconds_elapsed}s"
return {
"scanning": True,
"message": f"Scan in progress ({elapsed_str} elapsed) - check core logs for details"
}
# Check if core container is responsive
core_host = os.environ.get("CORE_API_HOST", "nfoguard-core") core_host = os.environ.get("CORE_API_HOST", "nfoguard-core")
core_port = os.environ.get("CORE_API_PORT", "8080") core_port = os.environ.get("CORE_API_PORT", "8080")
try:
# Try to get recent logs from core container to detect scanning activity
# This uses docker logs with timestamp filtering
result = subprocess.run([
'docker', 'logs', '--since', '30s', 'nfoguard-core'
], capture_output=True, text=True, timeout=5)
if result.returncode == 0:
logs = result.stdout
# Look for scan activity patterns
scan_patterns = [
r'Processing TV series: (.+?) \[imdb',
r'INFO: Scanning movies in: (.+)',
r'Processed (\d+) TV series',
r'MANUAL SCAN STARTED: (.+?) scan',
r'MANUAL SCAN COMPLETED: (.+?) scan'
]
current_activity = None
scan_active = False
series_count = 0
# Parse recent logs for activity
lines = logs.split('\n')
for line in reversed(lines[-50:]): # Check last 50 lines
# Check for completion
if 'MANUAL SCAN COMPLETED' in line:
break
# Check for start
if 'MANUAL SCAN STARTED' in line:
scan_active = True
match = re.search(r'MANUAL SCAN STARTED: (.+?) scan', line)
if match:
scan_type = match.group(1)
break
# Check for current processing
if 'Processing TV series:' in line:
match = re.search(r'Processing TV series: (.+?) \[imdb', line)
if match:
current_activity = f"Processing: {match.group(1)}"
scan_active = True
elif 'Scanning movies in:' in line:
match = re.search(r'Scanning movies in: (.+)', line)
if match:
current_activity = f"Scanning movies in: {match.group(1)}"
scan_active = True
elif 'Processed' in line and 'TV series' in line:
match = re.search(r'Processed (\d+) TV series', line)
if match:
series_count = int(match.group(1))
if scan_active and current_activity:
message = current_activity
if series_count > 0:
message += f" ({series_count} series processed)"
return {"scanning": True, "message": message}
elif scan_active:
return {"scanning": True, "message": "Scan in progress..."}
else:
return {"scanning": False, "message": "No scan detected"}
except subprocess.TimeoutExpired:
pass
except subprocess.SubprocessError:
pass
except Exception:
pass
# Fallback to basic health check
try: try:
health_url = f"http://{core_host}:{core_port}/health" health_url = f"http://{core_host}:{core_port}/health"
req = urllib.request.Request(health_url) req = urllib.request.Request(health_url)
with urllib.request.urlopen(req, timeout=5) as response: with urllib.request.urlopen(req, timeout=5) as response:
return {"scanning": False, "message": "No recent scan activity detected"} # Mark scanning as false if we reach here and enough time has passed
scan_tracking["scanning"] = False
return {"scanning": False, "message": "No active scan detected"}
except (urllib.error.URLError, socket.timeout): except (urllib.error.URLError, socket.timeout):
return {"scanning": False, "message": "Core container unavailable"} return {"scanning": False, "message": "Core container unavailable"}
+16 -12
View File
@@ -1443,7 +1443,14 @@ async function handleManualScan(event) {
showToast(`✅ Manual scan initiated: ${result.message}`, 'success'); showToast(`✅ Manual scan initiated: ${result.message}`, 'success');
// Start polling for scan status with log-based detection // Track scan start time for status monitoring
try {
await apiCall('/api/scan/track', { method: 'POST' });
} catch (e) {
console.log('Failed to track scan start:', e);
}
// Start polling for scan status
startScanStatusPolling(); startScanStatusPolling();
} catch (error) { } catch (error) {
@@ -1486,7 +1493,14 @@ async function handleCustomScan(event) {
showToast(`✅ Custom scan initiated: ${result.message}`, 'success'); showToast(`✅ Custom scan initiated: ${result.message}`, 'success');
// Start polling for scan status with log-based detection // Track scan start time for status monitoring
try {
await apiCall('/api/scan/track', { method: 'POST' });
} catch (e) {
console.log('Failed to track scan start:', e);
}
// Start polling for scan status
startScanStatusPolling(); startScanStatusPolling();
} catch (error) { } catch (error) {
@@ -1528,10 +1542,7 @@ function updateScanStatus(message, isActive = false) {
const statusBanner = document.getElementById('dashboard-scan-status'); const statusBanner = document.getElementById('dashboard-scan-status');
const statusText = document.getElementById('dashboard-scan-text'); const statusText = document.getElementById('dashboard-scan-text');
console.log('updateScanStatus called:', { message, isActive, statusBanner: !!statusBanner, statusText: !!statusText });
if (!statusBanner || !statusText) { if (!statusBanner || !statusText) {
console.log('Scan status elements not found, skipping update');
return; return;
} }
@@ -1540,15 +1551,12 @@ function updateScanStatus(message, isActive = false) {
if (isActive) { if (isActive) {
statusBanner.className = 'scan-status-banner active'; statusBanner.className = 'scan-status-banner active';
statusBanner.style.display = 'block'; statusBanner.style.display = 'block';
console.log('Scan status banner activated:', message);
} else { } else {
statusBanner.className = 'scan-status-banner'; statusBanner.className = 'scan-status-banner';
console.log('Scan status banner deactivated:', message);
// Don't hide completely, just mark as inactive // Don't hide completely, just mark as inactive
setTimeout(() => { setTimeout(() => {
if (statusBanner.className === 'scan-status-banner') { if (statusBanner.className === 'scan-status-banner') {
statusBanner.style.display = 'none'; statusBanner.style.display = 'none';
console.log('Scan status banner hidden after timeout');
} }
}, 3000); }, 3000);
} }
@@ -1556,16 +1564,13 @@ function updateScanStatus(message, isActive = false) {
async function checkScanStatus() { async function checkScanStatus() {
try { try {
console.log('Checking scan status...');
const status = await apiCall('/api/scan/status'); const status = await apiCall('/api/scan/status');
console.log('Scan status response:', status);
if (status.scanning) { if (status.scanning) {
updateScanStatus(status.message || 'Scan in progress...', true); updateScanStatus(status.message || 'Scan in progress...', true);
// Start polling if not already polling // Start polling if not already polling
if (!scanStatusInterval) { if (!scanStatusInterval) {
console.log('Starting scan status polling from checkScanStatus');
startScanStatusPolling(); startScanStatusPolling();
} }
return true; // Continue polling return true; // Continue polling
@@ -1602,7 +1607,6 @@ function startScanStatusPolling() {
} }
}, 2000); }, 2000);
console.log('Started scan status polling');
} }
function stopScanStatusPolling() { function stopScanStatusPolling() {