| | 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) |
| |
|
| | |
| | master_fd, slave_fd = pty.openpty() |
| | subprocess.Popen(["/bin/bash"], preexec_fn=os.setsid, stdin=slave_fd, stdout=slave_fd, stderr=slave_fd) |
| |
|
| | |
| | @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() |
| |
|
| | |
| | @socketio.on('input') |
| | def handle_input(data): |
| | os.write(master_fd, data.encode()) |
| |
|
| | |
| | @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}) |
| |
|
| | |
| | @app.route('/') |
| | def index(): |
| | return render_template('index.html') |
| |
|
| | |
| | @app.route('/xterm.js') |
| | def xterm_js(): |
| | return send_from_directory('static', 'xterm.js') |
| |
|
| | |
| | if __name__ == "__main__": |
| | socketio.run(app, host="0.0.0.0", port=7860) |