From 5b7f4c3178a0c9d3c15f6f8910e9fc8d109b8e4c Mon Sep 17 00:00:00 2001
From: Chris Hines <chris.hines@monash.edu>
Date: Tue, 21 Feb 2023 16:37:12 +1100
Subject: [PATCH] more try except to make sure locks are released

---
 tes/sshwrapper/__init__.py | 42 +++++++++++++++++++++-----------------
 tes/tunnelstat/__init__.py | 16 +++++++++++----
 2 files changed, 35 insertions(+), 23 deletions(-)

diff --git a/tes/sshwrapper/__init__.py b/tes/sshwrapper/__init__.py
index a38aa1f..45c3339 100644
--- a/tes/sshwrapper/__init__.py
+++ b/tes/sshwrapper/__init__.py
@@ -113,8 +113,8 @@ class Ssh:
         import logging
         logger = logging.getLogger()
         logger.debug("enter get_ctrl_master_socket")
-        sess.lock.acquire()
         ctrlsocket = "/tmp/cm-{}-{}-{}".format(user,host,sess.sshsessid)
+        sess.lock.acquire()
         if Ssh.check_ctrlsocket(sess,ctrlsocket):
             sess.lock.release()
             return ctrlsocket
@@ -126,25 +126,29 @@ class Ssh:
         except FileNotFoundError as e:
             pass
 
-        sshcmd = Ssh.SSHCMDWITHOPTS.copy()
-        sshcmd.extend([
-                  "-S", ctrlsocket,
-                  "-M", '-o', 'ControlPersist=60s',
-                  '-p', sshport, '-N','-l', user, host])
-        env = os.environ.copy()
-        if sess.socket is None:
+        try:
+            sshcmd = Ssh.SSHCMDWITHOPTS.copy()
+            sshcmd.extend([
+                    "-S", ctrlsocket,
+                    "-M", '-o', 'ControlPersist=60s',
+                    '-p', sshport, '-N','-l', user, host])
+            env = os.environ.copy()
+            if sess.socket is None:
+                sess.lock.release()
+                logger.debug("Exception get_ctrl_master_socket")
+                raise SshAgentException("No ssh-agent yet")
+            env['SSH_AUTH_SOCK'] = sess.socket
+            logger.debug("creating master socket")
+            logger.debug("ssh_auth_sock {}".format(sess.socket))
+            logger.debug(" ".join(sshcmd))
+            ctrl_p = subprocess.Popen(sshcmd,
+                                    stdout=subprocess.PIPE, stderr=subprocess.PIPE,
+                                    stdin=None,
+                                    env=env)
+            (stderr,stdout) = ctrl_p.communicate() # The process should exit, while the mux persists
+        except Exception as e:
             sess.lock.release()
-            logger.debug("Exception get_ctrl_master_socket")
-            raise SshAgentException("No ssh-agent yet")
-        env['SSH_AUTH_SOCK'] = sess.socket
-        logger.debug("creating master socket")
-        logger.debug("ssh_auth_sock {}".format(sess.socket))
-        logger.debug(" ".join(sshcmd))
-        ctrl_p = subprocess.Popen(sshcmd,
-                                  stdout=subprocess.PIPE, stderr=subprocess.PIPE,
-                                  stdin=None,
-                                  env=env)
-        (stderr,stdout) = ctrl_p.communicate() # The process should exit, while the mux persists
+            raise e
         if ctrl_p.returncode == 0:
             sess.lock.release()
             return ctrlsocket
diff --git a/tes/tunnelstat/__init__.py b/tes/tunnelstat/__init__.py
index d8bdf10..bddc41b 100644
--- a/tes/tunnelstat/__init__.py
+++ b/tes/tunnelstat/__init__.py
@@ -64,8 +64,12 @@ class SSHSession:
         import logging
         logger = logging.getLogger()
         self.lock.acquire()
-        if self.socket is None:
-            self.start_agent()
+        try:
+            if self.socket is None:
+                self.start_agent()
+        except Exception as e:
+            self.lock.release()
+            raise e
         self.lock.release()
         keyf = tempfile.NamedTemporaryFile(mode='w',delete=False)
         keyname = keyf.name
@@ -206,8 +210,12 @@ class SSHSession:
         logger=logging.getLogger()
         env = os.environ.copy()
         sess.lock.acquire()
-        if sess.socket is None:
-            sess.start_agent()
+        try:
+            if sess.socket is None:
+                sess.start_agent()
+        except Exception as e:  
+            sess.lock.release()
+            raise e
         sess.lock.release()
         env['SSH_AUTH_SOCK'] = sess.socket
         cmd = [sess.sshadd,'-l']
-- 
GitLab