Spaces:
Sleeping
Sleeping
| import eventlet | |
| eventlet.monkey_patch() | |
| import utils.model_selector | |
| import logging | |
| from flask import Flask, jsonify | |
| from flask_cors import CORS | |
| from flask_socketio import SocketIO | |
| import os | |
| import socket | |
| # lightweight logging | |
| logging.getLogger('werkzeug').setLevel(logging.ERROR) | |
| logging.getLogger('socketio').setLevel(logging.ERROR) | |
| app = Flask(__name__) | |
| # UPDATED: More robust CORS for deployment | |
| CORS(app, resources={r"/api/*": {"origins": "*"}}) | |
| socketio = SocketIO(app, cors_allowed_origins="*", async_mode="eventlet") | |
| # Mail initialization | |
| try: | |
| from extensions import mail | |
| app.config.update( | |
| MAIL_SERVER="smtp.gmail.com", | |
| MAIL_PORT=587, | |
| MAIL_USE_TLS=True, | |
| MAIL_USERNAME=os.environ.get("MAIL_USERNAME"), | |
| MAIL_PASSWORD=os.environ.get("MAIL_PASSWORD"), | |
| MAIL_DEFAULT_SENDER=("Adaptive AI NIDS", os.environ.get("MAIL_USERNAME")) | |
| ) | |
| mail.init_app(app) | |
| except Exception: | |
| pass | |
| sniffer = None | |
| def _get_sniffer(): | |
| global sniffer | |
| if sniffer is None: | |
| try: | |
| # CLOUD GUARD: Don't import sniffer if on a cloud server that blocks raw sockets | |
| # Render and Hugging Face usually set specific env variables | |
| if os.environ.get("RENDER") or os.environ.get("SPACE_ID"): | |
| print("⚠️ Cloud environment detected. Skipping sniffer initialization.") | |
| return None | |
| from capture.live_manager import sniffer as _s | |
| sniffer = _s | |
| except Exception as e: | |
| print(f"⚠️ Could not initialize sniffer: {e}") | |
| return None | |
| return sniffer | |
| def register_blueprints(app): | |
| from importlib import import_module | |
| routes = [ | |
| ("routes.live_route", "live_bp", "/api/live"), | |
| ("routes.logs_route", "logs_bp", "/api/logs"), | |
| ("routes.predict_route", "predict_bp", "/api/predict"), | |
| ("routes.reports_route", "reports_bp", "/api/reports"), | |
| ("routes.ip_lookup_route", "ip_lookup_bp", "/api/ip"), | |
| ("routes.geo_route", "geo_bp", "/api/geo"), | |
| ("routes.alerts_route", "alerts_bp", "/api"), | |
| ("routes.system_info", "system_bp", "/api"), | |
| ("routes.ml_route", "ml_bp", "/api"), | |
| ("routes.traffic_routes", "traffic_bp", "/api"), | |
| ("routes.ml_switch_route","ml_switch","/api/model"), | |
| ("routes.manual_predict_route","manual_predict","/api"), | |
| ("routes.ai_route","ai_bp","/api/ai"), | |
| ("routes.chat_route","chat_bp","/api"), | |
| ("routes.offline_detection","offline_bp","/api/offline") | |
| ] | |
| for module_name, varname, prefix in routes: | |
| try: | |
| mod = import_module(module_name) | |
| bp = getattr(mod, varname) | |
| app.register_blueprint(bp, url_prefix=prefix) | |
| print(f"✅ Registered route: {module_name} -> {prefix}") | |
| except Exception as e: | |
| print(f"⚠️ Skipping {module_name}: {e}") | |
| register_blueprints(app) | |
| with app.app_context(): | |
| try: | |
| from utils.model_selector import load_model | |
| print("📥 Pre-loading AI models...") | |
| # Start with 'bcc' as it's the default | |
| load_model("bcc") | |
| print("✅ Default models ready.") | |
| except Exception as e: | |
| print(f"❌ Startup Model Error: {e}") | |
| def home(): | |
| # Detect environment for frontend awareness | |
| is_cloud = os.environ.get("RENDER") or os.environ.get("SPACE_ID") | |
| s = _get_sniffer() | |
| return jsonify({ | |
| "status": "✅ Backend Active", | |
| "env": "cloud" if is_cloud else "local", | |
| "capture_capability": "limited" if is_cloud else "full", | |
| "capture_running": s.is_running() if s else False, | |
| "tip": "Live sniffing requires local deployment." | |
| }) | |
| if __name__ == "__main__": | |
| # Use port 7860 if on HF, otherwise use 5000 | |
| port = int(os.environ.get("PORT", 7860)) | |
| print(f"🚀 Starting Backend on port {port}...") | |
| socketio.run(app, host="0.0.0.0", port=port, debug=False) | |