import os import pty import select import shlex import subprocess import threading from flask import Flask, render_template, request, jsonify, send_from_directory from flask_socketio import SocketIO, emit import eventlet eventlet.monkey_patch() app = Flask(__name__) socketio = SocketIO(app, cors_allowed_origins="*") UPLOAD_DIR = "/tmp/vpskw/uploads" os.makedirs(UPLOAD_DIR, exist_ok=True) # Buka PTY untuk shell master_fd, slave_fd = pty.openpty() subprocess.Popen(["/bin/bash"], preexec_fn=os.setsid, stdin=slave_fd, stdout=slave_fd, stderr=slave_fd) # Baca output dari shell dan kirim ke client @socketio.on('connect') def connect(): def read_output(): while True: r, _, _ = select.select([master_fd], [], []) if master_fd in r: output = os.read(master_fd, 1024).decode(errors="ignore") socketio.emit('output', output) threading.Thread(target=read_output, daemon=True).start() # Terima input dari terminal web @socketio.on('input') def handle_input(data): os.write(master_fd, data.encode()) # Endpoint upload file @app.route('/upload', methods=['POST']) def upload(): f = request.files['file'] path = os.path.join(UPLOAD_DIR, f.filename) f.save(path) return jsonify({"status": "uploaded", "path": path}) # Serve halaman utama @app.route('/') def index(): return render_template('index.html') # Serve xterm.js kalau gak dari CDN @app.route('/xterm.js') def xterm_js(): return send_from_directory('static', 'xterm.js') # Start if __name__ == "__main__": socketio.run(app, host="0.0.0.0", port=7860)