From 661cbdf77f6a663a6638b7749077fb34d0f3be1e Mon Sep 17 00:00:00 2001 From: root Date: Tue, 4 Jun 2024 22:45:10 +0000 Subject: [PATCH] create a service to log monitor from guacd --- docker-compose.yml | 10 ++++++ docker-monitor/Dockerfile | 8 +++++ docker-monitor/log_service.py | 57 +++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 docker-monitor/Dockerfile create mode 100644 docker-monitor/log_service.py diff --git a/docker-compose.yml b/docker-compose.yml index ebd53ad..b08d529 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -36,5 +36,15 @@ services: depends_on: - guacdb - guacd + log_service: + container_name: log_service + build: ./docker-monitor + restart: unless-stopped + ports: + - 8085:8085 + volumes: + - /var/run/docker.sock:/var/run/docker.sock + depends_on: + - guacd volumes: db-data: diff --git a/docker-monitor/Dockerfile b/docker-monitor/Dockerfile new file mode 100644 index 0000000..9e98e24 --- /dev/null +++ b/docker-monitor/Dockerfile @@ -0,0 +1,8 @@ +FROM python:3.8-slim + +WORKDIR /app + +COPY log_service.py /app/log_service.py +RUN pip install docker bottle + +CMD ["python", "log_service.py"] diff --git a/docker-monitor/log_service.py b/docker-monitor/log_service.py new file mode 100644 index 0000000..d492a56 --- /dev/null +++ b/docker-monitor/log_service.py @@ -0,0 +1,57 @@ +import re +import docker +import threading +from bottle import Bottle, run, response + +app = Bottle() +client = docker.from_env() +session_data = { + "last_id": None, + "sessions": {} +} + +# Expressões regulares para capturar o início e término da conexão +start_pattern = re.compile(r'Connection ID is "\$([^"]+)"') +end_pattern = re.compile(r'Connection "\$([^"]+)" removed') + +def capture_logs(): + for log in client.containers.get('guacd').logs(stream=True): + log = log.decode('utf-8').strip() + start_match = start_pattern.search(log) + end_match = end_pattern.search(log) + + if start_match: + session_id = start_match.group(1) + session_data["last_id"] = session_id + session_data["sessions"][session_id] = {"start": log} + print(f"Captured Connection Start ID: {session_id}") + + if end_match: + session_id = end_match.group(1) + if session_id in session_data["sessions"]: + session_data["sessions"][session_id]["end"] = log + else: + session_data["sessions"][session_id] = {"end": log} + print(f"Captured Connection End ID: {session_id}") + +@app.route('/last_id') +def get_last_id(): + if session_data["last_id"]: + return {"last_id": session_data["last_id"]} + response.status = 404 + return {"error": "No Connection ID found"} + +@app.route('/session/') +def get_session(session_id): + session = session_data["sessions"].get(session_id) + if session: + return session + response.status = 404 + return {"error": f"No session found with ID {session_id}"} + +if __name__ == "__main__": + # Inicia a captura de logs em uma thread separada + threading.Thread(target=capture_logs, daemon=True).start() + # Executa o servidor Bottle + run(app, host='0.0.0.0', port=8085) +