From bd520050849ee8bb2789be0117143d60938de854 Mon Sep 17 00:00:00 2001 From: Michele Carignani <michele.carignani@etsi.org> Date: Thu, 18 Mar 2021 11:56:18 +0100 Subject: [PATCH] attach logs to the generated zip file --- src/doc2tosca.py | 39 ++++++++++++------------ src/web_app.py | 78 +++++++++++++++++++++++++++++++----------------- 2 files changed, 71 insertions(+), 46 deletions(-) diff --git a/src/doc2tosca.py b/src/doc2tosca.py index 861d320..6d1bfc7 100644 --- a/src/doc2tosca.py +++ b/src/doc2tosca.py @@ -6,6 +6,7 @@ Generate tosca definitions from Docx specfication import sys import os import re +import logging from io import StringIO import docx @@ -141,9 +142,9 @@ def get_content(doc): ret.append(Table(element, body)) table_count = table_count + 1 # else: - # print("Non paragraph or table " + str(type(element))) - print("Paragraphs: " + str(parag_count)) - print("Tables: " + str(table_count)) + # logging.info("Non paragraph or table " + str(type(element))) + logging.info("Paragraphs: " + str(parag_count)) + logging.info("Tables: " + str(table_count)) return ret @@ -160,7 +161,7 @@ def find_sect(sect_to_find, start_idx, doc_content): break start_idx = start_idx + 1 - print("FOUND " + sect_to_find + " at " + str(start_idx)) + logging.info("FOUND " + sect_to_find + " at " + str(start_idx)) return start_idx @@ -249,7 +250,7 @@ def gen_tables_btwn(a_id, b_id, content, buf): for idx in range(a_id, b_id): if idx >= len(content): - print( + logging.info( range_err_mess.format(a_id, b_id, idx, len(content))) return definitions_count @@ -257,7 +258,7 @@ def gen_tables_btwn(a_id, b_id, content, buf): if isinstance(tmp_elem, Paragraph) and \ is_lvl2_section_hdn(tmp_elem.text): - print(tmp_elem.text) + logging.info(tmp_elem.text) write_subsection_to_file(tmp_elem.text.split("\t")[1], buf) definitions_count = definitions_count + 1 @@ -300,11 +301,11 @@ def init_models(yaml_root, spec_ver, tosc_ver): spec_ver, import_stmt ) - MODELS[model] = tosca_model_info( - model, - spec_ver, - '- ' + import_stmt - ) + MODELS[model] = tosca_model_info( + model, + spec_ver, + '- ' + import_stmt + ) for mod in MODELS: generate_header( @@ -326,14 +327,14 @@ def generate_templates( the MODELS dictionary ''' if isinstance(filename, str): - print("Opening " + filename) + logging.info("Opening " + filename) init_models(yaml_root, spec_ver, tosc_ver) try: sol_001 = docx.Document(filename) except: - print("Error opening the submitted Docx file") + logging.info("Error opening the submitted Docx file") raise ValueError("Cannot open the submitted Docx file") content = get_content(sol_001) @@ -347,13 +348,13 @@ def generate_templates( count = gen_tables_btwn( sect.from_id, sect.to_id, content, MODELS[model]['buf'] ) - print("Printed " + str(count) + " types to " + model) + logging.info("Printed " + str(count) + " types to " + model) else: if sect.letter == "A" or sect.letter == "E": count = generate_examples_between( sect.from_id, sect.to_id, content, EXAMPLES ) - print("Printed {} types to Annex {}".format( + logging.info("Printed {} types to Annex {}".format( str(count), sect.letter) ) @@ -367,7 +368,7 @@ def print_to_files(prefix=None): if prefix is not None: mod['fn'] = os.path.join(prefix, mod['fn']) - print("Writing to " + mod['fn']) + logging.info("Writing to " + mod['fn']) mod['fd'] = open(mod['fn'], 'w') mod['buf'].seek(0) mod['fd'].write(mod['buf'].read()) @@ -379,7 +380,7 @@ def print_to_files(prefix=None): fnm = os.path.join(prefix, "example_"+EXAMPLES[k].filename) else: fnm = EXAMPLES[k].filename - print("Writing example file: " + fnm) + logging.info("Writing example file: " + fnm) with open(fnm, 'w') as newf: newf.write(EXAMPLES[k].text) newf.write("\n") @@ -410,8 +411,8 @@ if __name__ == "__main__": try: SOL001_FN = sys.argv[1] except: - print('Error: Filename missing or filename not a docx document') - print('Usage: doc2tosca <docx-with-tosca-definitions>') + logging.info('Error: Filename missing or filename not a docx document') + logging.info('Usage: doc2tosca <docx-with-tosca-definitions>') sys.exit(1) ver = parse_version_from_filename(SOL001_FN) diff --git a/src/web_app.py b/src/web_app.py index d787300..913b75e 100644 --- a/src/web_app.py +++ b/src/web_app.py @@ -7,6 +7,8 @@ Web app to offer a frontend to the doc2tosca and tosca2doc tools import os import shutil import tempfile +import logging +import traceback from zipfile import ZipFile from flask import Flask, flash, request, redirect, send_file, render_template, g @@ -17,6 +19,7 @@ import config import tosca2doc import doc2tosca + class ReverseProxied(object): def __init__(self, the_app, script_name=None, scheme=None, server=None): @@ -40,6 +43,7 @@ class ReverseProxied(object): environ['HTTP_HOST'] = server return self.app(environ, start_response) + app = Flask(__name__) app.wsgi_app = ReverseProxied(app.wsgi_app, script_name='/tosca-ie') @@ -57,6 +61,7 @@ MISSING_MODULE_ERR_MSG = \ 'Error: some TOSCA module missing. Make sure to \ upload definitions for NSD, VNFD, PNFD.' + def allowed_file(filename): ''' Check filename is in the list of allowed extensions @@ -64,6 +69,7 @@ def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS + @app.route("/") def hello(): ''' @@ -75,14 +81,15 @@ def hello(): link = "#" return render_template( - "./home.html", - VERSION=config.VERSION, + "./home.html", + VERSION=config.VERSION, doc_allowed_versions=doc2tosca.allowed_versions, default_tosca_version=doc2tosca.DEFAULT_TOSCA_VERSION, last_rev=config.LAST_COMMIT, rev_link=link ) + @app.route("/doc2tosca-info") def doc2tosca_info(): ''' @@ -90,6 +97,7 @@ def doc2tosca_info(): ''' return render_template("./doc2tosca-details.html", VERSION=config.VERSION) + @app.route("/tosca2doc-info") def tosca2doc_info(): ''' @@ -97,6 +105,7 @@ def tosca2doc_info(): ''' return render_template("./tosca2doc-details.html", VERSION=config.VERSION) + @app.route("/tosca2doc", methods=['POST']) def mk_tosca2doc(): ''' @@ -107,14 +116,14 @@ def mk_tosca2doc(): flash('Error: No file uploaded.') return redirect("/tosca-ie") - ufiles=request.files.getlist("file") + ufiles = request.files.getlist("file") for tosca_def in TOSCA_DEFS: - found=False + found = False for uploaded_file in ufiles: if tosca_def in uploaded_file.filename or \ - tosca_def.lower() in uploaded_file.filename: - found=True + tosca_def.lower() in uploaded_file.filename: + found = True if not found: flash(MISSING_MODULE_ERR_MSG) print('Error: TOSCA module missing.') @@ -129,7 +138,7 @@ def mk_tosca2doc(): tmp_dir = tempfile.mkdtemp() g.tmp_dir = tmp_dir - doc = docx.Document() + doc = docx.Document() for tosca_def in TOSCA_DEFS: for file in ufiles: @@ -149,7 +158,8 @@ def mk_tosca2doc(): #return ("No content found") -def get_all_yaml_file_paths(directory): + +def get_all_yaml_file_paths_and_logs(directory): ''' Finds yaml files within a directory and sub directories and returns the list of paths @@ -159,12 +169,13 @@ def get_all_yaml_file_paths(directory): for root, _, files in os.walk(directory): for filename in files: - if ".yaml" in filename: + if ".yaml" in filename or ".log" in filename: filepath = os.path.join(root, filename) file_paths.append(filepath) return file_paths + @app.after_request def after_request(response): ''' @@ -175,16 +186,26 @@ def after_request(response): if g.get('tmp_dir') is None: return response shutil.rmtree(g.tmp_dir, ignore_errors=True) - print("Deleted {}\n\n".format(g.tmp_dir)) + logging.debug("Deleted {}\n\n".format(g.tmp_dir)) return response + @app.route("/doc2tosca", methods=['POST']) def mk_doc2tosca(): ''' Executes doc2tosca on the uploaded file ''' + tmp_dir = tempfile.mkdtemp() + + logfilename = os.path.join(tmp_dir, 'toscatools.log') + logging.basicConfig(filename=logfilename, level=logging.INFO) + + logging.info("Starting") + logging.debug("TMP DIR: " + tmp_dir) + zip_fn = "tosca_defs.zip" + zip_path = os.path.join(tmp_dir, zip_fn) if 'file' not in request.files: flash('No file uploaded') @@ -193,7 +214,7 @@ def mk_doc2tosca(): ufiles = request.files.getlist("file") try: - print(request.form) + logging.debug(request.form) doc_version = request.form.get('doc-version') custom_doc_version = request.form.get('custom-doc-version') custom_tosca_version = request.form.get('custom-tosca-version') @@ -217,29 +238,32 @@ def mk_doc2tosca(): tosca_version = custom_tosca_version try: - doc2tosca.generate_templates(sol001_file, doc_version, yaml_root_path, tosca_version) + doc2tosca.generate_templates( + sol001_file, doc_version, yaml_root_path, tosca_version + ) + doc2tosca.print_to_files(tmp_dir) + except ValueError as e: flash(str(e)) return redirect("/tosca-ie") except BaseException as e: + print(e) + # logging.error(traceback.print_exc()) flash(str(e)) - flash("Unknown error in the generation of the files. Please contact the support.") - return redirect("/tosca-ie") - - tmp_dir = tempfile.mkdtemp() - print("TMP DIR: " + tmp_dir) - doc2tosca.print_to_files(tmp_dir) + flash("Unknown error in the generation of the files. \ + Please contact the support.") + finally: + file_paths = get_all_yaml_file_paths_and_logs(tmp_dir) - file_paths = get_all_yaml_file_paths(tmp_dir) + with ZipFile(zip_path, 'w') as archive: + for myfile in file_paths: + print(myfile) + logging.info(myfile) + archive.write(myfile, arcname=os.path.basename(myfile)) - zip_path = os.path.join(tmp_dir, zip_fn) - - with ZipFile( zip_path, 'w') as archive: - for myfile in file_paths: - archive.write(myfile, arcname=os.path.basename(myfile)) + g.tmp_dir = tmp_dir + return send_file(zip_path, as_attachment=True) - g.tmp_dir = tmp_dir - return send_file(zip_path, as_attachment=True) if __name__ == '__main__': - app.run(debug=True,host='0.0.0.0') + app.run(debug=True, host='0.0.0.0') -- GitLab