Spaces:
Runtime error
Runtime error
File size: 4,050 Bytes
8f10eaa 1abd012 8f10eaa |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
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
@app.route('/api/execute', methods=['POST'])
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
@app.route('/api/health', methods=['GET'])
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) |