1. 23 Sep, 2015 4 commits
    • Implement ssh connection handling as a state machine · ac98fe9e
      The event loop (even after it was brought into one place in _run in the
      previous commit) was hard to follow. The states and transitions weren't
      clear or documented, and the privilege escalation code was non-blocking
      while the rest was blocking.
      
      Now we have a state machine with four states: awaiting_prompt,
      awaiting_escalation, ready_to_send (initial data), and awaiting_exit.
      The actions in each state and the transitions between then are clearly
      documented.
      
      The check_incorrect_password() method no longer checks for empty strings
      (since they will always match), and check_become_success() uses equality
      rather than a substring match to avoid thinking an echoed command is an
      indication of successful escalation. Also adds a check_missing_password
      connection method to detect the error from sudo -n/doas -n.
      Abhijit Menon-Sen committed
    • Reorganise ssh.py to cleanly separate responsibilities · 840a32bc
      The main exec_command/put_file/fetch_file methods now _build_command and
      call _run to handle input from/output to the ssh process. The purpose is
      to bring connection handling together in one place so that the locking
      doesn't have to be split across functions.
      
      Note that this doesn't change the privilege escalation and connection IO
      code at all—just puts it all into one function.
      
      Most of the changes are just moving code from one place to another (e.g.
      from _connect to _build_command, from _exec_command and _communicate to
      _run), but there are some other notable changes:
      
      1. We test for the existence of sshpass the first time we need to use
         password authentication, and remember the result.
      2. We set _persistent in _build_command if we're using ControlPersist,
         for later use in close(). (The detection could be smarter.)
      3. Some apparently inadvertent inconsistencies between put_file and
         fetch_file (e.g. argument quoting, sftp -b use) have been removed.
      
      Also reorders functions into a logical sequence, removes unused imports
      and functions, etc.
      
      Aside: the high-level EXEC/PUT/FETCH description should really be logged
      from ConnectionBase, while individual subclasses log transport-specific
      details.
      Abhijit Menon-Sen committed
  2. 22 Sep, 2015 22 commits
  3. 21 Sep, 2015 13 commits
  4. 20 Sep, 2015 1 commit