File size: 4,001 Bytes
4252e58
 
 
ee1c180
 
0f8fe33
 
 
 
d58a19f
 
0f8fe33
 
 
 
 
 
 
d58a19f
 
0f8fe33
f52cb69
0f8fe33
d58a19f
0f8fe33
 
 
 
 
 
3fdf4b6
 
 
0f8fe33
 
 
 
 
 
 
 
 
 
d58a19f
 
 
 
 
 
 
 
 
 
 
 
0f8fe33
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ee1c180
 
 
 
 
 
 
 
 
 
0f8fe33
 
d58a19f
 
0f8fe33
d58a19f
0f8fe33
d58a19f
 
 
 
 
0f8fe33
 
5182442
d29d188
6814aac
d29d188
 
0f8fe33
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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}")

@app.route("/")
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)