# -*- encoding: utf-8 -*- # @author : vincent.benoit@benserv.fr # @brief : log routes ######################################################### # Importation de modules externes # import sys, re, os import logging as log from datetime import datetime, timezone from flask import Flask, Blueprint, request, abort, jsonify, current_app from flask_api import status from flask_jwt_extended import create_access_token from flask_jwt_extended import get_jwt from flask_jwt_extended import set_access_cookies from flask_jwt_extended import get_jwt_identity from flask_jwt_extended import jwt_required import json from werkzeug.exceptions import HTTPException ######################################################### # Class et Methods # log = Blueprint('log', __name__, url_prefix='/api/configurateur') @log.errorhandler(HTTPException) def handle_exception(e): ''' return JSON instead of HTML for HTTP errors ''' response = e.get_response() # replace the body with JSON response.data = json.dumps({ 'code': e.code, 'name': e.name, 'description': e.description, }) response.content_type = "application/json" return response @log.after_request def refresh_expiring_tokens(response): ''' Using an 'after_request' callback, we refresh any token that is within 30 minutes of expiring.''' try: exp_timestamp = get_jwt()['exp'] now = datetime.now(timezone.utc) target_timestamp = datetime.timestamp(now + current_app.config['DELTA']) if target_timestamp > exp_timestamp: current_app.logger.warning("On doit recréer un token ....") access_token = create_access_token(identity=get_jwt_identity()) # refresh token in storage place if os.path.exists(os.path.join("/tmp", current_app.config['PROJECT'])): with open(os.path.join("/tmp", current_app.config['PROJECT'], get_jwt_identity()['id']), 'w') as f: f.write(access_token) # Modifiy a Flask Response to set a cookie containing the access JWT. set_access_cookies(response, access_token) return response except (RuntimeError, KeyError): return response @log.route('/conf_logs', methods=['GET']) @jwt_required() def get_conf_logs(): ''' Retreive conf logs ''' # Access the identity of the current user with get_jwt_identity current_user = get_jwt_identity() lines = [] logfile = os.path.join(current_app.config['LOG_FOLDER'], current_app.config['CONF_LOGNAME']) try: with open(logfile) as f: current_app.logger.debug("conf log file: {}".format(logfile)) for idx, line in enumerate(f.readlines()): try: date_time, head, gravity, msg = line.split(' - ', 3) content = {'datetime': date_time, 'header': head, 'gravity': gravity, 'msg':msg} lines.append(content) except ValueError as e: lines[-1]['msg'] = lines[-1]['msg'] + line except FileNotFoundError as e: current_app.logger.error("Fichier de log ({}) manquant".format(logfile)) abort(status.HTTP_406_NOT_ACCEPTABLE, description="Fichier log manquant") return jsonify(lines), status.HTTP_200_OK @log.route('/app_logs', methods=['GET']) @jwt_required() def get_app_logs(): ''' Retreive app logs ''' # Access the identity of the current user with get_jwt_identity current_user = get_jwt_identity() lines = [] logfile = os.path.join(current_app.config['LOG_FOLDER'], current_app.config['PROCESS_LOGNAME']) try: with open(logfile) as f: current_app.logger.debug("app log file: {}".format(logfile)) for idx, line in enumerate(f.readlines()): try: date_time, head, gravity, msg = line.split(' - ', 3) content = {'datetime': date_time, 'header': head, 'gravity': gravity, 'msg':msg} lines.append(content) except ValueError as e: lines[-1]['msg'] = lines[-1]['msg'] + line except FileNotFoundError as e: current_app.logger.error("Fichier de log ({}) manquant".format(logfile)) abort(status.HTTP_406_NOT_ACCEPTABLE, description="Fichier log manquant") return jsonify(lines), status.HTTP_200_OK