Add ssh mux options by default if available.
This commit is contained in:
		
					parent
					
						
							
								b4ac23b4f8
							
						
					
				
			
			
				commit
				
					
						d0d0c258d6
					
				
			
		
					 3 changed files with 44 additions and 27 deletions
				
			
		|  | @ -249,6 +249,12 @@ CDIST_OVERRIDE:: | |||
| CDIST_ORDER_DEPENDENCY:: | ||||
|     Create dependencies based on the execution order (see cdist-manifest(7)) | ||||
| 
 | ||||
| CDIST_REMOTE_EXEC:: | ||||
|     Use this command for remote execution (should behave like ssh) | ||||
| 
 | ||||
| CDIST_REMOTE_COPY:: | ||||
|     Use this command for remote copy (should behave like scp) | ||||
| 
 | ||||
| SEE ALSO | ||||
| -------- | ||||
| - cdist(1) | ||||
|  |  | |||
|  | @ -138,6 +138,11 @@ CDIST_LOCAL_SHELL:: | |||
| CDIST_REMOTE_SHELL:: | ||||
|     Selects shell for remote scirpt execution, defaults to /bin/sh | ||||
| 
 | ||||
| CDIST_REMOTE_EXEC:: | ||||
|     Use this command for remote execution (should behave like ssh) | ||||
| 
 | ||||
| CDIST_REMOTE_COPY:: | ||||
|     Use this command for remote copy (should behave like scp) | ||||
| 
 | ||||
| EXIT STATUS | ||||
| ----------- | ||||
|  |  | |||
|  | @ -21,33 +21,27 @@ | |||
| # | ||||
| # | ||||
| 
 | ||||
| def inspect_ssh_mux_opts(): | ||||
|     import subprocess | ||||
| 
 | ||||
| def inspect_ssh_mux_opts(control_path_dir="~/.ssh/"): | ||||
|     """Inspect whether or not ssh supports multiplexing options""" | ||||
|     import subprocess | ||||
|     import os | ||||
| 
 | ||||
|     control_path = os.path.join(control_path_dir, "cdist.master-%l-%r@%h:%p") | ||||
|     wanted_mux_opts = { | ||||
|         "ControlPath":"~/.ssh/master-%l-%r@%h:%p", | ||||
|         "ControlMaster":"auto", | ||||
|         "ControlPersist":"125", | ||||
|         "ControlPath": control_path, | ||||
|         "ControlMaster": "auto", | ||||
|         "ControlPersist": "125", | ||||
|     } | ||||
|     # if checked key option is present then this assumes | ||||
|     # all options in value are present | ||||
|     check = { | ||||
|         "ControlMaster": ("ControlMaster", "ControlPath"), | ||||
|         "ControlPersist": ("ControlPersist",), | ||||
|     } | ||||
|     mux_opts = {} | ||||
|     for x in check: | ||||
|     mux_opts = " ".join([" -o {}={}".format(x, | ||||
|         wanted_mux_opts[x]) for x in wanted_mux_opts]) | ||||
|     try: | ||||
|             subprocess.check_output("ssh -o {}".format(x), | ||||
|         subprocess.check_output("ssh {}".format(mux_opts), | ||||
|                 stderr=subprocess.STDOUT, shell=True) | ||||
|     except subprocess.CalledProcessError as e: | ||||
|             foo = e.output.decode().lower() | ||||
|             if not "bad configuration option" in foo: | ||||
|                 for o in check[x]: | ||||
|                     mux_opts[o] = wanted_mux_opts[o] | ||||
|     foo = [" -o {}={}".format(x, mux_opts[x]) for x in mux_opts] | ||||
|     return " ".join(foo) | ||||
|         subproc_output = e.output.decode().lower() | ||||
|         if "bad configuration option" in subproc_output: | ||||
|             return "" | ||||
|     return mux_opts | ||||
| 
 | ||||
| def commandline(): | ||||
|     """Parse command line""" | ||||
|  | @ -56,6 +50,9 @@ def commandline(): | |||
|     import cdist.banner | ||||
|     import cdist.config | ||||
|     import cdist.shell | ||||
|     import tempfile | ||||
|     import shutil | ||||
|     import os | ||||
| 
 | ||||
|     # Construct parser others can reuse | ||||
|     parser = {} | ||||
|  | @ -83,8 +80,17 @@ def commandline(): | |||
| 
 | ||||
|     # Config | ||||
|     # inspect multiplexing options for default remote copy/exec scp/ssh | ||||
|     MUX_OPTS = inspect_ssh_mux_opts() | ||||
|     # but not if env vars are present | ||||
|     has_env_remote_exec = "CDIST_REMOTE_EXEC" in os.environ | ||||
|     has_env_remote_copy = "CDIST_REMOTE_COPY" in os.environ | ||||
|     if not has_env_remote_exec or not has_env_remote_copy: | ||||
|         control_path_dir = tempfile.mkdtemp(prefix="cdist.control.path") | ||||
|         import atexit | ||||
|         atexit.register(lambda: shutil.rmtree(control_path_dir)) | ||||
|         MUX_OPTS = inspect_ssh_mux_opts(control_path_dir) | ||||
|         if not has_env_remote_exec: | ||||
|             cdist.REMOTE_EXEC += MUX_OPTS | ||||
|         if not has_env_remote_copy: | ||||
|             cdist.REMOTE_COPY += MUX_OPTS | ||||
| 
 | ||||
|     parser['config'] = parser['sub'].add_parser('config', | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue