terminal_backend.py gelöscht
This commit is contained in:
@ -1,110 +0,0 @@
|
|||||||
import os
|
|
||||||
import pty
|
|
||||||
import select
|
|
||||||
import shlex
|
|
||||||
import subprocess
|
|
||||||
from flask import session, request, render_template
|
|
||||||
from flask_socketio import emit
|
|
||||||
from threading import Thread
|
|
||||||
|
|
||||||
clients = {}
|
|
||||||
running_threads = {}
|
|
||||||
|
|
||||||
|
|
||||||
def init_terminal_routes(app, socketio, db, Vault, LocalUser, fernet):
|
|
||||||
|
|
||||||
@app.route('/terminal/<vault_id>')
|
|
||||||
def terminal(vault_id):
|
|
||||||
if 'user' not in session:
|
|
||||||
return "Nicht eingeloggt", 403
|
|
||||||
|
|
||||||
current_user = db.session.query(LocalUser).filter_by(username=session['user']).first()
|
|
||||||
vault = db.session.query(Vault).filter_by(id=vault_id).first()
|
|
||||||
|
|
||||||
if not current_user or not vault:
|
|
||||||
return "Nicht gefunden", 404
|
|
||||||
|
|
||||||
if current_user.role == 'user' and vault not in current_user.vaults:
|
|
||||||
return "Kein Zugriff", 403
|
|
||||||
|
|
||||||
return render_template('terminal.html', vault_id=vault_id)
|
|
||||||
|
|
||||||
@socketio.on('connect', namespace='/terminal')
|
|
||||||
def handle_connect(auth):
|
|
||||||
vault_id = auth.get('vault_id') if auth else None
|
|
||||||
if not vault_id:
|
|
||||||
emit('output', 'Kein Vault angegeben.')
|
|
||||||
return
|
|
||||||
|
|
||||||
current_user = db.session.query(LocalUser).filter_by(username=session['user']).first()
|
|
||||||
vault = db.session.query(Vault).filter_by(id=vault_id).first()
|
|
||||||
|
|
||||||
if not vault or (current_user.role == 'user' and vault not in current_user.vaults):
|
|
||||||
emit('output', 'Zugriff verweigert.')
|
|
||||||
return
|
|
||||||
|
|
||||||
sid = request.sid
|
|
||||||
|
|
||||||
def spawn_shell():
|
|
||||||
try:
|
|
||||||
hostname = vault.host_ip or vault.hostname
|
|
||||||
if vault.auth_type == 'password':
|
|
||||||
decrypted_pw = fernet.decrypt(vault.password_hash.encode()).decode()
|
|
||||||
ssh_cmd = f"sshpass -p {shlex.quote(decrypted_pw)} ssh -o StrictHostKeyChecking=no -p {vault.port} {vault.user}@{hostname}"
|
|
||||||
else:
|
|
||||||
key_path = f"/tmp/sshkey_{vault.id}.pem"
|
|
||||||
with open(key_path, "w") as f:
|
|
||||||
f.write(vault.ssh_key)
|
|
||||||
os.chmod(key_path, 0o600)
|
|
||||||
ssh_cmd = f"ssh -i {key_path} -o StrictHostKeyChecking=no -p {vault.port} {vault.user}@{hostname}"
|
|
||||||
|
|
||||||
def read(fd):
|
|
||||||
while True:
|
|
||||||
try:
|
|
||||||
data = os.read(fd, 1024)
|
|
||||||
if not data:
|
|
||||||
break
|
|
||||||
socketio.emit('output', data.decode(errors='ignore'), namespace='/terminal', to=sid)
|
|
||||||
except OSError:
|
|
||||||
break
|
|
||||||
|
|
||||||
pid, fd = pty.fork()
|
|
||||||
if pid == 0:
|
|
||||||
os.execvp("bash", ["bash", "-c", ssh_cmd])
|
|
||||||
|
|
||||||
clients[sid] = fd
|
|
||||||
thread = Thread(target=read, args=(fd,))
|
|
||||||
thread.daemon = True
|
|
||||||
thread.start()
|
|
||||||
running_threads[sid] = thread
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
emit('output', f'Fehler beim Starten der Shell: {e}')
|
|
||||||
|
|
||||||
thread = Thread(target=spawn_shell)
|
|
||||||
thread.daemon = True
|
|
||||||
thread.start()
|
|
||||||
|
|
||||||
@socketio.on('input', namespace='/terminal')
|
|
||||||
def handle_input(data):
|
|
||||||
sid = request.sid
|
|
||||||
fd = clients.get(sid)
|
|
||||||
if fd:
|
|
||||||
try:
|
|
||||||
os.write(fd, data.encode())
|
|
||||||
except Exception as e:
|
|
||||||
print(f"❌ INPUT-Fehler: {e}")
|
|
||||||
|
|
||||||
@socketio.on('disconnect', namespace='/terminal')
|
|
||||||
def handle_disconnect():
|
|
||||||
sid = request.sid
|
|
||||||
fd = clients.pop(sid, None)
|
|
||||||
if fd:
|
|
||||||
try:
|
|
||||||
os.close(fd)
|
|
||||||
except OSError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
thread = running_threads.pop(sid, None)
|
|
||||||
if thread and thread.is_alive():
|
|
||||||
print(f"Thread für SID {sid} wird beendet (disconnect).")
|
|
Reference in New Issue
Block a user