Spaces:
Runtime error
Runtime error
from flask import Flask, request, jsonify | |
import subprocess | |
import os | |
import tempfile | |
import uuid | |
import time | |
import logging | |
from flask_cors import CORS | |
app = Flask(__name__) | |
CORS(app) # Habilitar CORS para todas las rutas | |
# Configuraci贸n de logging | |
logging.basicConfig(level=logging.INFO) | |
logger = logging.getLogger(__name__) | |
# Directorio temporal para los archivos de c贸digo | |
TEMP_DIR = os.path.join(tempfile.gettempdir(), '42coderunner') | |
os.makedirs(TEMP_DIR, exist_ok=True) | |
# Tiempo m谩ximo de ejecuci贸n (en segundos) | |
MAX_EXECUTION_TIME = 5 | |
def execute_code(): | |
try: | |
# Obtener el c贸digo C del request | |
data = request.get_json() | |
if not data or 'code' not in data: | |
return jsonify({'success': False, 'error': 'No se proporcion贸 c贸digo'}), 400 | |
code = data['code'] | |
# Crear un ID 煤nico para este trabajo | |
job_id = str(uuid.uuid4()) | |
# Crear archivos temporales para el c贸digo y la salida | |
code_file = os.path.join(TEMP_DIR, f"{job_id}.c") | |
executable = os.path.join(TEMP_DIR, f"{job_id}.exe") | |
# Guardar el c贸digo en un archivo temporal | |
with open(code_file, 'w') as f: | |
f.write(code) | |
# Compilar el c贸digo | |
logger.info(f"Compilando c贸digo para job {job_id}") | |
compile_process = subprocess.run( | |
['gcc', code_file, '-o', executable], | |
capture_output=True, | |
text=True | |
) | |
# Verificar si la compilaci贸n fue exitosa | |
if compile_process.returncode != 0: | |
return jsonify({ | |
'success': False, | |
'error': compile_process.stderr | |
}) | |
# Ejecutar el c贸digo compilado | |
logger.info(f"Ejecutando c贸digo para job {job_id}") | |
try: | |
start_time = time.time() | |
run_process = subprocess.run( | |
[executable], | |
capture_output=True, | |
text=True, | |
timeout=MAX_EXECUTION_TIME | |
) | |
execution_time = time.time() - start_time | |
# Preparar la respuesta | |
result = { | |
'success': run_process.returncode == 0, | |
'output': run_process.stdout, | |
'error': run_process.stderr, | |
'execution_time': execution_time | |
} | |
except subprocess.TimeoutExpired: | |
result = { | |
'success': False, | |
'error': f'La ejecuci贸n excedi贸 el tiempo l铆mite de {MAX_EXECUTION_TIME} segundos' | |
} | |
# Limpiar archivos temporales | |
try: | |
os.remove(code_file) | |
if os.path.exists(executable): | |
os.remove(executable) | |
except Exception as e: | |
logger.error(f"Error al limpiar archivos temporales: {e}") | |
return jsonify(result) | |
except Exception as e: | |
logger.error(f"Error inesperado: {e}") | |
return jsonify({'success': False, 'error': f'Error interno del servidor: {str(e)}'}), 500 | |
def health_check(): | |
# Verificar que el directorio temporal existe | |
temp_dir_exists = os.path.exists(TEMP_DIR) | |
# Verificar que podemos compilar c贸digo C | |
compiler_available = True | |
try: | |
subprocess.run(['gcc', '--version'], capture_output=True, check=True) | |
except (subprocess.SubprocessError, FileNotFoundError): | |
compiler_available = False | |
return jsonify({ | |
'status': 'ok', | |
'timestamp': time.time(), | |
'environment': { | |
'temp_dir': temp_dir_exists, | |
'compiler': compiler_available | |
} | |
}) | |
if __name__ == '__main__': | |
port = int(os.environ.get('PORT', 5000)) | |
app.run(host='0.0.0.0', port=port) |