import os import subprocess # <--- 1. ADICIONE ISSO from flask import Flask, request, jsonify from flask_cors import CORS from werkzeug.utils import secure_filename # Importa suas funções e configurações existentes from main import process_single_file, rebuild_indexes, generate_manifests # 2. ADICIONE BASE_PATH ABAIXO (Assume que utils tem o caminho raiz do projeto) from utils import MMP_FOLDER, MMPZ_FOLDER, CERT_PATH, KEY_PATH, BASE_DATA, SRC_MMPSEARCH app = Flask(__name__) CORS(app) ALLOWED_EXTENSIONS = {"mmp", "mmpz"} def allowed_file(filename): return "." in filename and filename.rsplit(".", 1)[1].lower() in ALLOWED_EXTENSIONS # --- 3. NOVA FUNÇÃO DE BUILD --- def run_jekyll_build(): """Roda o comando de build do Jekyll.""" print("Iniciando build do Jekyll...") # O comando que você pediu, separado em lista (mais seguro) command = [ "bundle", "exec", "jekyll", "build", "--destination", "/var/www/html/trens/mmpSearch/", ] try: # cwd=BASE_PATH garante que o comando rode na pasta onde está o Gemfile result = subprocess.run( command, check=True, cwd=BASE_DATA, capture_output=True, text=True ) print("Jekyll Build Sucesso!") print(result.stdout) # Opcional: ver log do jekyll except subprocess.CalledProcessError as e: print(f"ERRO no Jekyll Build: {e.stderr}") # Não vamos travar o retorno para o usuário se o site falhar, # mas logamos o erro no console do servidor. @app.route("/api/upload", methods=["POST"]) def upload_file(): # 1. Verificações Básicas if "project_file" not in request.files: return jsonify({"error": "Nenhum arquivo enviado"}), 400 file = request.files["project_file"] if file.filename == "": return jsonify({"error": "Nome do arquivo vazio"}), 400 if file and allowed_file(file.filename): filename = secure_filename(file.filename) if filename.endswith(".mmpz"): save_path = os.path.join(MMPZ_FOLDER, filename) else: save_path = os.path.join(MMP_FOLDER, filename) try: file.save(save_path) print(f"Arquivo salvo em: {save_path}") except Exception as e: return jsonify({"error": f"Falha ao salvar disco: {str(e)}"}), 500 # 3. DISPARA SEU PIPELINE result = process_single_file(filename) if result["success"]: # 4. Atualiza o site.data.all (all.json) rebuild_indexes() # --- 5. AQUI ESTÁ A MÁGICA --- # Só roda se o processamento e o indice derem certo run_jekyll_build() # ----------------------------- # Geração de Manifestos try: manifest_report = generate_manifests(SRC_MMPSEARCH) except Exception as e: manifest_report = {"generated": [], "failed": [str(e)]} return jsonify( { "message": "Projeto processado e Site Atualizado!", "data": result["data"], } ), 200 else: return jsonify({"error": f"Erro no processamento: {result['error']}"}), 500 return jsonify({"error": "Tipo de arquivo não permitido"}), 400 if __name__ == "__main__": print("Iniciando Servidor de Upload MMP...") # Opção 1: Usar certificado real (O ideal - Navegador aceita de primeira) if os.path.exists(CERT_PATH) and os.path.exists(KEY_PATH): print("Certificados encontrados! Rodando HTTPS seguro na porta 33002.") context = (CERT_PATH, KEY_PATH) # Use host='0.0.0.0' para garantir que escute externamente app.run(host="0.0.0.0", port=33002, ssl_context=context, debug=True) # Opção 2: Modo 'adhoc' (Certificado temporário gerado na hora) else: print( "Certificados reais não encontrados. Usando modo 'adhoc' (Auto-assinado)." ) print( "ATENÇÃO: O navegador vai avisar que 'Não é seguro'. Você precisará autorizar." ) # Requer: pip install pyopenssl try: app.run(host="0.0.0.0", port=33002, ssl_context="adhoc", debug=True) except Exception as e: print(f"Erro ao iniciar SSL adhoc: {e}") print("Tentando rodar em HTTP simples (pode dar erro de Mixed Content)...") app.run(host="0.0.0.0", port=33002, debug=True)