create a service to log monitor from guacd

This commit is contained in:
root 2024-06-04 22:45:10 +00:00
parent 77f1ee32d3
commit 661cbdf77f
3 changed files with 75 additions and 0 deletions

View File

@ -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:

View File

@ -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"]

View File

@ -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/<session_id>')
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)