Update flask_script_runner.py

This commit is contained in:
MacRimi
2025-12-01 00:17:04 +01:00
parent 6c3e21339d
commit c88f3dcf75

View File

@@ -48,6 +48,10 @@ class ScriptRunner:
session = self.active_sessions[session_id] session = self.active_sessions[session_id]
log_file = session['log_file'] log_file = session['log_file']
print(f"[DEBUG] execute_script called for session {session_id}", file=sys.stderr, flush=True)
print(f"[DEBUG] Script path: {script_path}", file=sys.stderr, flush=True)
print(f"[DEBUG] Log file: {log_file}", file=sys.stderr, flush=True)
# Prepare environment # Prepare environment
env = os.environ.copy() env = os.environ.copy()
env['EXECUTION_MODE'] = 'web' env['EXECUTION_MODE'] = 'web'
@@ -56,54 +60,91 @@ class ScriptRunner:
if env_vars: if env_vars:
env.update(env_vars) env.update(env_vars)
print(f"[DEBUG] Environment variables set: EXECUTION_MODE=web, LOG_FILE={log_file}", file=sys.stderr, flush=True)
# Initialize log file # Initialize log file
with open(log_file, 'w') as f: with open(log_file, 'w') as f:
f.write(json.dumps({ init_line = json.dumps({
'type': 'init', 'type': 'init',
'session_id': session_id, 'session_id': session_id,
'script': script_path, 'script': script_path,
'timestamp': int(time.time()) 'timestamp': int(time.time())
}) + '\n') }) + '\n'
f.write(init_line)
print(f"[DEBUG] Wrote init line to log: {init_line.strip()}", file=sys.stderr, flush=True)
try: try:
# Execute script # Execute script
session['status'] = 'running' session['status'] = 'running'
print(f"[DEBUG] Starting subprocess with /bin/bash {script_path}", file=sys.stderr, flush=True)
process = subprocess.Popen( process = subprocess.Popen(
['/bin/bash', script_path], ['/bin/bash', script_path],
env=env, env=env,
stdout=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, stderr=subprocess.STDOUT,
universal_newlines=True bufsize=0 # Unbuffered
) )
print(f"[DEBUG] Process started with PID: {process.pid}", file=sys.stderr, flush=True)
session['process'] = process session['process'] = process
lines_read = [0] # Lista para compartir entre threads
# Monitor output for interactions # Monitor output for interactions
def monitor_output(): def monitor_output():
for line in process.stdout: print(f"[DEBUG] monitor_output thread started for session {session_id}", file=sys.stderr, flush=True)
with open(log_file, 'a') as f: try:
f.write(line) with open(log_file, 'a') as log_f:
while True:
line = process.stdout.readline()
if not line:
print(f"[DEBUG] No more lines from stdout (EOF reached)", file=sys.stderr, flush=True)
break
decoded_line = line.decode('utf-8', errors='replace').rstrip()
lines_read[0] += 1
print(f"[DEBUG] Read line {lines_read[0]}: {decoded_line[:100]}...", file=sys.stderr, flush=True)
log_f.write(decoded_line + '\n')
log_f.flush()
# Check for interaction requests
try:
if decoded_line.strip().startswith('{'):
data = json.loads(decoded_line.strip())
if data.get('type') == 'interaction_request':
session['pending_interaction'] = data
print(f"[DEBUG] Detected interaction request: {data}", file=sys.stderr, flush=True)
except json.JSONDecodeError:
pass
# Check for interaction requests print(f"[DEBUG] monitor_output thread finished. Total lines read: {lines_read[0]}", file=sys.stderr, flush=True)
try: except Exception as e:
if line.strip().startswith('{'): print(f"[DEBUG ERROR] Exception in monitor_output: {e}", file=sys.stderr, flush=True)
data = json.loads(line.strip())
if data.get('type') == 'interaction_request':
session['pending_interaction'] = data
except json.JSONDecodeError:
pass
monitor_thread = threading.Thread(target=monitor_output, daemon=True) monitor_thread = threading.Thread(target=monitor_output, daemon=False)
monitor_thread.start() monitor_thread.start()
print(f"[DEBUG] Waiting for process to complete...", file=sys.stderr, flush=True)
# Wait for completion # Wait for completion
process.wait() process.wait()
monitor_thread.join(timeout=5) print(f"[DEBUG] Process exited with code: {process.returncode}", file=sys.stderr, flush=True)
monitor_thread.join(timeout=30)
if monitor_thread.is_alive():
print(f"[DEBUG WARNING] monitor_thread still alive after 30s timeout", file=sys.stderr, flush=True)
else:
print(f"[DEBUG] monitor_thread joined successfully", file=sys.stderr, flush=True)
session['exit_code'] = process.returncode session['exit_code'] = process.returncode
session['status'] = 'completed' if process.returncode == 0 else 'failed' session['status'] = 'completed' if process.returncode == 0 else 'failed'
session['end_time'] = datetime.now().isoformat() session['end_time'] = datetime.now().isoformat()
print(f"[DEBUG] Script execution completed. Lines captured: {lines_read[0]}", file=sys.stderr, flush=True)
return { return {
'success': True, 'success': True,
'session_id': session_id, 'session_id': session_id,
@@ -112,6 +153,7 @@ class ScriptRunner:
} }
except Exception as e: except Exception as e:
print(f"[DEBUG ERROR] Exception in execute_script: {e}", file=sys.stderr, flush=True)
session['status'] = 'error' session['status'] = 'error'
session['error'] = str(e) session['error'] = str(e)
return { return {