diff --git a/tes/apiendpoints.py b/tes/apiendpoints.py index 7654db41c2a34f5a5c17efa7962abbfe98ade971..c5ba97add158440294c58b8d4f30eeae8a3bb4d2 100644 --- a/tes/apiendpoints.py +++ b/tes/apiendpoints.py @@ -205,28 +205,17 @@ class JobStat(Resource): """ import logging logger = logging.getLogger() - try: - params = get_conn_params() - except: - flask_restful.abort(400, "connection parameters not correctly defined") try: sshsess = SSHSession.get_sshsession() sshsess.refresh() except: - flask_restful.abort(500, "Error relating to the ssh sessions") - try: - host = params['identity']['site']['host'] - except (TypeError, KeyError) as e: - flask_restful.abort(400, message="stat: definition of login host incomplete") + flask_restful.abort(500, message="Error relating to the ssh sessions") try: - user = params['identity']['username'] + cmd = json.loads(request.args.get('statcmd')) + host = json.loads(request.args.get('host')) + user = json.loads(request.args.get('username')) except (TypeError, KeyError) as e: - flask_restful.abort(400, message="stat: definition of username incomplete") - try: - cmd = params['interface']['statcmd'] - except (TypeError, KeyError) as e: - flask_restful.abort(400, message="stat: definition of batch interface incomplete") - logger.debug('ssh sess socket is {}'.format(sshsess.socket)) + flask_restful.abort(400, message="Missing required parameter {}".format(e)) try: logger.debug('attempting ssh execute {} {} {}'.format(host,user,cmd)) @@ -240,10 +229,6 @@ class JobStat(Resource): try: jobs = json.loads(res['stdout'].decode()) - # Attach the identity information to the job before returning it - for j in jobs: - j['identity'] = params['identity'] - return jobs except Exception as e: import traceback @@ -282,6 +267,9 @@ class MkDir(Resource): class DirList(Resource): def get(self): + import logging + logger = logging.getLogger() + params = get_conn_params() sshsess = SSHSession.get_sshsession() site = params['identity']['site'] @@ -296,6 +284,7 @@ class DirList(Resource): if cd == "": cd = "." if 'lscmd' in site and site['lscmd'] is not None and site['lscmd'] is not "": + logger.debug('using ssh.execute with lscmd') res = Ssh.execute(sshsess, host=params['identity']['site']['host'], user=params['identity']['username'], sshport=sshport, cmd="{} {} {}".format(site['lscmd'],path,cd)) @@ -304,6 +293,7 @@ class DirList(Resource): except: flask_restful.abort(404,message="You don't have permission to view that directory") else: + logger.debug('using ssh.sftpls') dirls = Ssh.sftpls(sshsess, host=params['identity']['site']['host'], user=params['identity']['username'], path=params['path'],changepath=params['cd'], sshport=sshport) @@ -341,7 +331,16 @@ class JobSubmit(Resource): logger.debug(data) try: script = data['app']['startscript'].format(**data) - except: + except Exception as e: + import traceback + logger.error(e) + logger.error(traceback.format_exc()) + logger.error('formating data') + logger.error(data) + logger.error('end formating data') + logger.error('body') + logger.error(request.data) + logger.error('end body') flask_restful.abort(400, message='Incomplete job information was passed to the backend.') logger.debug('script formated to {}'.format(script)) diff --git a/tes/sshwrapper/__init__.py b/tes/sshwrapper/__init__.py index ec60bd23e536769dc2bf89bf3f5cff4180b07189..98053e997f8dd6726ac314afc9e2700db59db86a 100644 --- a/tes/sshwrapper/__init__.py +++ b/tes/sshwrapper/__init__.py @@ -3,6 +3,7 @@ This module handles SSH Connections """ import subprocess +TIMEOUT=10 class SshAgentException(Exception): """ Raised if an SSH Agent isn't running (Normally the SPA client should invoke the agent @@ -268,7 +269,6 @@ class Ssh: else: ctrlsocket = Ssh.get_ctrl_master_socket(sess, bastion, user, bastionsshport) logger.debug('ssh.execute: got ctrlsocket {}'.format(ctrlsocket)) - if bastion == None: # we are executing this command on the login node, so no more magic is needed sshcmd = ['ssh', '-o', 'Stricthostkeychecking=no', @@ -288,9 +288,13 @@ class Ssh: exec_p = subprocess.Popen(sshcmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,stdin=subprocess.PIPE,env=env) if stdin is not None: - (stdout, stderr) = exec_p.communicate(stdin.encode()) + (stdout, stderr) = exec_p.communicate(stdin.encode(),timeout=TIMEOUT) else: + (stdout, stderr) = exec_p.communicate(timeout=TIMEOUT) + except subprocess.TimeoutExpired: + exec_p.kill() (stdout, stderr) = exec_p.communicate() + return {'stdout':stdout, 'stderr':stderr} @staticmethod