Files
Kine-backend/ConfBack/log/views.py

113 lines
4.4 KiB
Python

# -*- 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['PROJECT'] + '.log')
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['APP_NAME'] + '.log')
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