32 lines
1.5 KiB
Python
32 lines
1.5 KiB
Python
"""Temporary deployment transport. Passwords stay in memory; host key is pinned."""
|
|
import getpass,json,sys,traceback
|
|
from pathlib import Path
|
|
sys.path.insert(0,str(Path(__file__).resolve().parent/'deploy-python'))
|
|
import paramiko
|
|
|
|
client=paramiko.SSHClient()
|
|
client.load_host_keys(str(Path(__file__).resolve().parent/'deploy-known-hosts'))
|
|
client.set_missing_host_key_policy(paramiko.RejectPolicy())
|
|
password=getpass.getpass('SSH password (not stored): ')
|
|
client.connect('39.97.232.35',username='root',password=password,look_for_keys=False,allow_agent=False,timeout=12,auth_timeout=12)
|
|
del password
|
|
print('SSH_READY',flush=True)
|
|
for line in sys.stdin:
|
|
try:
|
|
request=json.loads(line)
|
|
if request['action']=='close':break
|
|
if request['action']=='exec':
|
|
_,stdout,stderr=client.exec_command(request['command'],timeout=request.get('timeout',45))
|
|
out=stdout.read().decode('utf-8','replace');err=stderr.read().decode('utf-8','replace')
|
|
result={'exit':stdout.channel.recv_exit_status(),'out':out,'err':err}
|
|
elif request['action'] in ('upload','download'):
|
|
with client.open_sftp() as sftp:
|
|
if request['action']=='upload':sftp.put(request['local'],request['remote'])
|
|
else:sftp.get(request['remote'],request['local'])
|
|
result={'ok':True}
|
|
else:raise ValueError('Unsupported deployment action')
|
|
print(json.dumps(result,ensure_ascii=False),flush=True)
|
|
except Exception as exc:
|
|
print(json.dumps({'error':type(exc).__name__,'message':str(exc)},ensure_ascii=False),flush=True)
|
|
client.close()
|