introduce nginex-proxy
use host ip if working in wsl
This commit is contained in:
@@ -10,7 +10,7 @@ WORKDIR /app
|
||||
# --- Systemabhängigkeiten für MariaDB-Client & Locale ---
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
libmariadb-dev-compat libmariadb-dev locales \
|
||||
libmariadb-dev-compat libmariadb-dev locales git\
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# --- Locale konfigurieren ---
|
||||
|
||||
@@ -34,6 +34,7 @@ RUN pip install --upgrade pip \
|
||||
|
||||
# Expose Ports für Flask API
|
||||
EXPOSE 8000
|
||||
EXPOSE 5678
|
||||
|
||||
# Setze Env für Dev
|
||||
ENV FLASK_ENV=development
|
||||
@@ -43,4 +44,4 @@ ENV ENV_FILE=.env
|
||||
USER infoscreen_taa
|
||||
|
||||
# Default Command: Flask Development Server
|
||||
CMD ["flask", "run", "--host=0.0.0.0", "--port=8000"]
|
||||
CMD ["python", "-m", "debugpy", "--listen", "0.0.0.0:5678", "wsgi.py"]
|
||||
|
||||
@@ -1,15 +1,19 @@
|
||||
import sys
|
||||
sys.path.append('/workspace')
|
||||
import os
|
||||
import json
|
||||
import base64
|
||||
import glob
|
||||
from datetime import datetime, timezone
|
||||
# import paho.mqtt.client as mqtt
|
||||
from datetime import datetime
|
||||
from paho.mqtt import client as mqtt_client
|
||||
import pytz
|
||||
from sqlalchemy import create_engine, func
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from models import Client, Base
|
||||
from helpers.check_folder import ensure_folder_exists
|
||||
import shutil
|
||||
|
||||
# Basisverzeichnis relativ zum aktuellen Skript
|
||||
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
# Konfiguration
|
||||
MQTT_BROKER = os.getenv("MQTT_BROKER_HOST", "localhost")
|
||||
@@ -27,24 +31,26 @@ topics = [
|
||||
("infoscreen/heartbeat", 0),
|
||||
# ... weitere Topics hier
|
||||
]
|
||||
SAVE_DIR = "received_screenshots"
|
||||
|
||||
# Verzeichnisse für Screenshots
|
||||
RECEIVED_DIR = os.path.join(BASE_DIR, "received_screenshots")
|
||||
LATEST_DIR = os.path.join(BASE_DIR, "screenshots")
|
||||
MAX_PER_CLIENT = 20
|
||||
|
||||
# Ordner für empfangene Screenshots anlegen
|
||||
ensure_folder_exists(SAVE_DIR)
|
||||
# Ordner für empfangene Screenshots und den neuesten Screenshot anlegen
|
||||
ensure_folder_exists(RECEIVED_DIR)
|
||||
ensure_folder_exists(LATEST_DIR)
|
||||
|
||||
# Datenbank konfigurieren (MariaDB)
|
||||
# Ersetze user, password, host und datenbankname entsprechend.
|
||||
DB_URL = f"mysql+pymysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}/{DB_NAME}"
|
||||
engine = create_engine(DB_URL, echo=False)
|
||||
Session = sessionmaker(bind=engine)
|
||||
# Falls Tabellen noch nicht existieren
|
||||
Base.metadata.create_all(engine)
|
||||
|
||||
|
||||
def prune_old_screenshots(client_id: str):
|
||||
"""Löscht alte Screenshots, wenn mehr als MAX_PER_CLIENT vorhanden sind."""
|
||||
pattern = os.path.join(SAVE_DIR, f"{client_id}_*.jpg")
|
||||
pattern = os.path.join(RECEIVED_DIR, f"{client_id}_*.jpg")
|
||||
files = sorted(glob.glob(pattern), key=os.path.getmtime)
|
||||
while len(files) > MAX_PER_CLIENT:
|
||||
oldest = files.pop(0)
|
||||
@@ -68,12 +74,17 @@ def handle_screenshot(msg):
|
||||
|
||||
# Dateiname mit Client-ID und Zeitstempel
|
||||
filename = ts.strftime(f"{client_id}_%Y%m%d_%H%M%S.jpg")
|
||||
filepath = os.path.join(SAVE_DIR, filename)
|
||||
received_path = os.path.join(RECEIVED_DIR, filename)
|
||||
|
||||
# Bild speichern
|
||||
with open(filepath, "wb") as f:
|
||||
# Bild im Verzeichnis "received_screenshots" speichern
|
||||
with open(received_path, "wb") as f:
|
||||
f.write(img_data)
|
||||
print(f"Bild gespeichert: {filepath}")
|
||||
print(f"Bild gespeichert: {received_path}")
|
||||
|
||||
# Kopiere den neuesten Screenshot in das Verzeichnis "screenshots"
|
||||
latest_path = os.path.join(LATEST_DIR, f"{client_id}.jpg")
|
||||
shutil.copy(received_path, latest_path)
|
||||
print(f"Neuester Screenshot aktualisiert: {latest_path}")
|
||||
|
||||
# Alte Screenshots beschneiden
|
||||
prune_old_screenshots(client_id)
|
||||
@@ -81,6 +92,7 @@ def handle_screenshot(msg):
|
||||
except Exception as e:
|
||||
print("Fehler beim Verarbeiten der Screenshot-Nachricht:", e)
|
||||
|
||||
|
||||
def handle_heartbeat(msg):
|
||||
"""Verarbeitet Heartbeat und aktualisiert oder legt Clients an."""
|
||||
session = Session()
|
||||
@@ -100,7 +112,6 @@ def handle_heartbeat(msg):
|
||||
else:
|
||||
# Neuer Client: Location per input abfragen
|
||||
location = input(f"Neuer Client {uuid} gefunden. Bitte Standort eingeben: ")
|
||||
# ip_address = msg._sock.getpeername()[0]
|
||||
new_client = Client(
|
||||
uuid=uuid,
|
||||
hardware_hash=hardware_hash,
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
python-dotenv>=1.1.0
|
||||
python-dotenv>=1.1.0
|
||||
debugpy
|
||||
|
||||
@@ -1,6 +1,20 @@
|
||||
# server/wsgi.py
|
||||
import glob
|
||||
import os
|
||||
from flask import Flask, jsonify, send_from_directory
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from sqlalchemy import create_engine
|
||||
from models import Client, Base
|
||||
|
||||
from flask import Flask, jsonify
|
||||
DB_USER = os.getenv("DB_USER")
|
||||
DB_PASSWORD = os.getenv("DB_PASSWORD")
|
||||
DB_HOST = os.getenv("DB_HOST")
|
||||
DB_NAME = os.getenv("DB_NAME")
|
||||
|
||||
# Datenbank-Engine und Session anlegen (passe ggf. die DB-URL an)
|
||||
DB_URL = f"mysql+pymysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}/{DB_NAME}"
|
||||
engine = create_engine(DB_URL, echo=False)
|
||||
Session = sessionmaker(bind=engine)
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
@@ -14,3 +28,40 @@ def index():
|
||||
return "Hello from Infoscreen‐API!"
|
||||
|
||||
# (Weitere Endpunkte, Blueprints, Datenbank-Initialisierung usw. kommen hierher)
|
||||
@app.route("/screenshots/<uuid>")
|
||||
def get_screenshot(uuid):
|
||||
"""Liefert den aktuellen Screenshot für die angegebene UUID zurück."""
|
||||
print(f"Anfrage für Screenshot mit UUID: {uuid}")
|
||||
pattern = os.path.join("screenshots", f"{uuid}*.jpg")
|
||||
files = glob.glob(pattern)
|
||||
if not files:
|
||||
return jsonify({"error": "Screenshot not found"}), 404
|
||||
# Es gibt nur eine Datei pro UUID
|
||||
filename = os.path.basename(files[0])
|
||||
print(filename)
|
||||
print("Arbeitsverzeichnis:", os.getcwd())
|
||||
print("Suchmuster:", pattern)
|
||||
print("Gefundene Dateien:", files)
|
||||
return send_from_directory("screenshots", filename)
|
||||
|
||||
@app.route("/api/clients")
|
||||
def get_clients():
|
||||
# from models import Client # Import lokal, da im selben Container
|
||||
print("Abrufen der Clients aus der Datenbank...")
|
||||
session = Session()
|
||||
clients = session.query(Client).all()
|
||||
result = [
|
||||
{
|
||||
"uuid": c.uuid,
|
||||
"location": c.location,
|
||||
"hardware_hash": c.hardware_hash,
|
||||
"ip_address": c.ip_address,
|
||||
"last_alive": c.last_alive.isoformat() if c.last_alive else None
|
||||
}
|
||||
for c in clients
|
||||
]
|
||||
session.close()
|
||||
return jsonify(result)
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run(host="0.0.0.0", port=8000, debug=True)
|
||||
Reference in New Issue
Block a user