Delete backend.py.bacca
This commit is contained in:
parent
b2a5f85e4e
commit
b204e32a49
1 changed files with 0 additions and 88 deletions
|
@ -1,88 +0,0 @@
|
||||||
# backend.py
|
|
||||||
from fastapi import FastAPI, Query
|
|
||||||
from fastapi.middleware.cors import CORSMiddleware
|
|
||||||
from typing import Optional
|
|
||||||
import pandas as pd
|
|
||||||
import geoip2.database
|
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
# ----------------------------
|
|
||||||
# 1. Load Access Logs
|
|
||||||
# ----------------------------
|
|
||||||
logs = []
|
|
||||||
with open("access.log") as f:
|
|
||||||
for line in f:
|
|
||||||
# Example log format: "2025-08-28T12:34:56Z 192.0.2.1 GET /api/service1"
|
|
||||||
parts = line.strip().split(" ", 3)
|
|
||||||
if len(parts) != 4:
|
|
||||||
continue # skip malformed lines
|
|
||||||
timestamp, ip, method, path = parts
|
|
||||||
logs.append({
|
|
||||||
"timestamp": timestamp,
|
|
||||||
"ip": ip,
|
|
||||||
"method": method,
|
|
||||||
"path": path
|
|
||||||
})
|
|
||||||
df = pd.DataFrame(logs)
|
|
||||||
df["timestamp"] = pd.to_datetime(df["timestamp"])
|
|
||||||
# ----------------------------
|
|
||||||
# 2. GeoIP Lookup
|
|
||||||
# ----------------------------
|
|
||||||
reader = geoip2.database.Reader("GeoLite2-City.mmdb")
|
|
||||||
|
|
||||||
def ip_to_geo(ip):
|
|
||||||
try:
|
|
||||||
response = reader.city(ip)
|
|
||||||
return response.location.latitude, response.location.longitude
|
|
||||||
except Exception as e:
|
|
||||||
print(f"GeoIP lookup failed for {ip}: {e}")
|
|
||||||
return None, None
|
|
||||||
df["lat"], df["lon"] = zip(*df["ip"].apply(ip_to_geo))
|
|
||||||
print(df)
|
|
||||||
df = df.dropna(subset=["lat", "lon"])
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# ----------------------------
|
|
||||||
# 3. FastAPI Setup
|
|
||||||
# ----------------------------
|
|
||||||
app = FastAPI(title="Reverse Proxy Connections Map API")
|
|
||||||
|
|
||||||
# Allow frontend to query API from any origin
|
|
||||||
app.add_middleware(
|
|
||||||
CORSMiddleware,
|
|
||||||
allow_origins=["*"],
|
|
||||||
allow_methods=["*"],
|
|
||||||
allow_headers=["*"]
|
|
||||||
)
|
|
||||||
|
|
||||||
# ----------------------------
|
|
||||||
# 4. API Endpoint
|
|
||||||
# ----------------------------
|
|
||||||
@app.get("/connections")
|
|
||||||
def get_connections(
|
|
||||||
service: Optional[str] = Query(None, description="Filter by service path"),
|
|
||||||
start: Optional[str] = Query(None, description="Start datetime in ISO format"),
|
|
||||||
end: Optional[str] = Query(None, description="End datetime in ISO format")
|
|
||||||
):
|
|
||||||
data = df.copy()
|
|
||||||
|
|
||||||
if service:
|
|
||||||
data = data[data["path"].str.contains(service)]
|
|
||||||
|
|
||||||
if start:
|
|
||||||
data = data[data["timestamp"] >= pd.to_datetime(start)]
|
|
||||||
if end:
|
|
||||||
data = data[data["timestamp"] <= pd.to_datetime(end)]
|
|
||||||
return data[["timestamp", "path", "lat", "lon"]].to_dict(orient="records")
|
|
||||||
|
|
||||||
# ----------------------------
|
|
||||||
# 5. Healthcheck Endpoint
|
|
||||||
# ----------------------------
|
|
||||||
@app.get("/health")
|
|
||||||
def health():
|
|
||||||
return {"status": "ok", "total_connections": len(df)}
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
import uvicorn
|
|
||||||
uvicorn.run("backend:app", host="0.0.0.0", port=8000, reload=True)
|
|
Loading…
Add table
Add a link
Reference in a new issue