diff --git a/app/__init__.py b/app/__init__.py index 962cc542..e9953eec 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,6 +1,7 @@ # -*- coding: UTF-8 -* # pylint: disable=invalid-name +import base64 import datetime import os import socket @@ -69,13 +70,19 @@ def handle_access_denied(exc): def internal_server_error(exc): """Bugs scodoc, erreurs 500""" # note that we set the 500 status explicitly + from app.scodoc import sco_utils as scu + return ( render_template( "error_500.html", SCOVERSION=sco_version.SCOVERSION, date=datetime.datetime.now().isoformat(), exc=exc, + traceback_str_base64=base64.urlsafe_b64encode( + traceback.format_exc().encode(scu.SCO_ENCODING) + ).decode(scu.SCO_ENCODING), request_url=request.url, + scu=scu, ), 500, ) diff --git a/app/scodoc/sco_dump_db.py b/app/scodoc/sco_dump_db.py index fd0b15c0..94cf73a0 100644 --- a/app/scodoc/sco_dump_db.py +++ b/app/scodoc/sco_dump_db.py @@ -46,10 +46,12 @@ pg_dump SCORT | psql ANORT """ -import os +import base64 import fcntl -import subprocess +import os import requests +import subprocess +import traceback from flask import g, request from flask_login import current_user @@ -64,8 +66,14 @@ from app.scodoc.sco_exceptions import ScoValueError SCO_DUMP_LOCK = "/tmp/scodump.lock" -def sco_dump_and_send_db(message: str = "", request_url: str = ""): +def sco_dump_and_send_db( + message: str = "", request_url: str = "", traceback_str_base64: str = "" +): """Dump base de données et l'envoie anonymisée pour debug""" + breakpoint() + traceback_str = base64.urlsafe_b64decode(traceback_str_base64).decode( + scu.SCO_ENCODING + ) # get current (dept) DB name: cursor = ndb.SimpleQuery("SELECT current_database()", {}) db_name = cursor.fetchone()[0] @@ -92,7 +100,7 @@ def sco_dump_and_send_db(message: str = "", request_url: str = ""): _anonymize_db(ano_db_name) # Send - r = _send_db(ano_db_name, message, request_url) + r = _send_db(ano_db_name, message, request_url, traceback_str=traceback_str) code = r.status_code finally: @@ -152,7 +160,9 @@ def _get_scodoc_serial(): return 0 -def _send_db(ano_db_name: str, message: str = "", request_url: str = ""): +def _send_db( + ano_db_name: str, message: str = "", request_url: str = "", traceback_str: str = "" +): """Dump this (anonymized) database and send it to tech support""" log(f"dumping anonymized database {ano_db_name}") try: @@ -164,7 +174,7 @@ def _send_db(ano_db_name: str, message: str = "", request_url: str = ""): raise ScoValueError( f"erreur lors de l'anonymisation de la base {ano_db_name}" ) from e - + log(f"traceback_str={traceback_str}") log("uploading anonymized dump...") files = {"file": (ano_db_name + ".dump", dump)} try: @@ -180,9 +190,11 @@ def _send_db(ano_db_name: str, message: str = "", request_url: str = ""): "sent_by": sco_users.user_info(str(current_user))["nomcomplet"], "sco_version": sco_version.SCOVERSION, "sco_fullversion": scu.get_scodoc_version(), + "traceback_str": traceback_str, }, ) except requests.exceptions.ConnectionError as exc: + log("ConnectionError: Impossible de joindre le serveur d'assistance") raise ScoValueError( """ Impossible de joindre le serveur d'assistance (scodoc.org). diff --git a/app/scodoc/sco_utils.py b/app/scodoc/sco_utils.py index 247788b1..c3d189a9 100644 --- a/app/scodoc/sco_utils.py +++ b/app/scodoc/sco_utils.py @@ -369,6 +369,8 @@ SCO_USER_MANUAL = "https://scodoc.org/GuideUtilisateur" SCO_ANNONCES_WEBSITE = "https://listes.univ-paris13.fr/mailman/listinfo/scodoc-annonces" SCO_DEVEL_LIST = "scodoc-devel@listes.univ-paris13.fr" SCO_USERS_LIST = "notes@listes.univ-paris13.fr" +SCO_LISTS_URL = "https://scodoc.org/ListesDeDiffusion/" +SCO_DISCORD_ASSISTANCE = "https://discord.gg/ybw6ugtFsZ" # Mails avec exceptions (erreurs) anormales envoyés à cette adresse: # mettre '' pour désactiver completement l'envois de mails d'erreurs. diff --git a/app/templates/error_500.html b/app/templates/error_500.html index 4e77aa63..dffc113c 100644 --- a/app/templates/error_500.html +++ b/app/templates/error_500.html @@ -3,6 +3,7 @@ {% import 'bootstrap/wtf.html' as wtf %} {% block title %}Une erreur est survenue !{% endblock %} + {% block app_content %}

Une erreur est survenue !

Oups... ScoDoc version @@ -11,25 +12,32 @@

{{date}}

Si le problème persiste, contacter l'administrateur de votre site, - ou écrire la liste "notes" notes@listes.univ-paris13.fr en - indiquant la version du logiciel. + ou l'assistance sur le canal Discord.

{% if 'scodoc_dept' in g %} -

Pour aider les développeurs à corriger le problème, nous vous suggérons d'envoyer les données - sur votre configuration: -

+

Pour aider les développeurs à corriger le problème, nous vous + suggérons d'envoyer les données anonymisées sur votre configuration: + +

Message optionnel:
- +

{% endif %} -

Pour plus d'informations sur les listes de diffusion voir - cette page. +

Vous pouvez aussi envoyer un mail à la liste "notes" + {{scu.SCO_USERS_LIST}} +

+

Pour plus d'informations sur les listes de diffusion + voir cette page.

-

retour à la page d'accueil

+

+ retour à la page d'accueil +

{% endblock %} \ No newline at end of file diff --git a/app/views/scolar.py b/app/views/scolar.py index b1f04c6a..ffd5a080 100644 --- a/app/views/scolar.py +++ b/app/views/scolar.py @@ -2282,10 +2282,12 @@ def stat_bac(formsemestre_id): @scodoc @permission_required(Permission.ScoView) @scodoc7func -def sco_dump_and_send_db(message="", request_url=""): +def sco_dump_and_send_db(message="", request_url="", traceback_str_base64=""): "Send anonymized data to supervision" - status_code = sco_dump_db.sco_dump_and_send_db(message, request_url) + status_code = sco_dump_db.sco_dump_and_send_db( + message, request_url, traceback_str_base64=traceback_str_base64 + ) H = [html_sco_header.sco_header(page_title="Assistance technique")] if status_code == requests.codes.INSUFFICIENT_STORAGE: # pylint: disable=no-member H.append(