forked from ungleich-public/cdist
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::
|
CDIST_ORDER_DEPENDENCY::
|
||||||
Create dependencies based on the execution order (see cdist-manifest(7))
|
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
|
SEE ALSO
|
||||||
--------
|
--------
|
||||||
- cdist(1)
|
- cdist(1)
|
||||||
|
|
|
@ -138,6 +138,11 @@ CDIST_LOCAL_SHELL::
|
||||||
CDIST_REMOTE_SHELL::
|
CDIST_REMOTE_SHELL::
|
||||||
Selects shell for remote scirpt execution, defaults to /bin/sh
|
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
|
EXIT STATUS
|
||||||
-----------
|
-----------
|
||||||
|
|
|
@ -21,33 +21,27 @@
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
def inspect_ssh_mux_opts():
|
def inspect_ssh_mux_opts(control_path_dir="~/.ssh/"):
|
||||||
import subprocess
|
|
||||||
|
|
||||||
"""Inspect whether or not ssh supports multiplexing options"""
|
"""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 = {
|
wanted_mux_opts = {
|
||||||
"ControlPath":"~/.ssh/master-%l-%r@%h:%p",
|
"ControlPath": control_path,
|
||||||
"ControlMaster":"auto",
|
"ControlMaster": "auto",
|
||||||
"ControlPersist":"125",
|
"ControlPersist": "125",
|
||||||
}
|
}
|
||||||
# if checked key option is present then this assumes
|
mux_opts = " ".join([" -o {}={}".format(x,
|
||||||
# all options in value are present
|
wanted_mux_opts[x]) for x in wanted_mux_opts])
|
||||||
check = {
|
try:
|
||||||
"ControlMaster": ("ControlMaster", "ControlPath"),
|
subprocess.check_output("ssh {}".format(mux_opts),
|
||||||
"ControlPersist": ("ControlPersist",),
|
stderr=subprocess.STDOUT, shell=True)
|
||||||
}
|
except subprocess.CalledProcessError as e:
|
||||||
mux_opts = {}
|
subproc_output = e.output.decode().lower()
|
||||||
for x in check:
|
if "bad configuration option" in subproc_output:
|
||||||
try:
|
return ""
|
||||||
subprocess.check_output("ssh -o {}".format(x),
|
return 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)
|
|
||||||
|
|
||||||
def commandline():
|
def commandline():
|
||||||
"""Parse command line"""
|
"""Parse command line"""
|
||||||
|
@ -56,6 +50,9 @@ def commandline():
|
||||||
import cdist.banner
|
import cdist.banner
|
||||||
import cdist.config
|
import cdist.config
|
||||||
import cdist.shell
|
import cdist.shell
|
||||||
|
import tempfile
|
||||||
|
import shutil
|
||||||
|
import os
|
||||||
|
|
||||||
# Construct parser others can reuse
|
# Construct parser others can reuse
|
||||||
parser = {}
|
parser = {}
|
||||||
|
@ -83,9 +80,18 @@ def commandline():
|
||||||
|
|
||||||
# Config
|
# Config
|
||||||
# inspect multiplexing options for default remote copy/exec scp/ssh
|
# inspect multiplexing options for default remote copy/exec scp/ssh
|
||||||
MUX_OPTS = inspect_ssh_mux_opts()
|
# but not if env vars are present
|
||||||
cdist.REMOTE_EXEC += MUX_OPTS
|
has_env_remote_exec = "CDIST_REMOTE_EXEC" in os.environ
|
||||||
cdist.REMOTE_COPY += MUX_OPTS
|
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',
|
parser['config'] = parser['sub'].add_parser('config',
|
||||||
parents=[parser['loglevel']])
|
parents=[parser['loglevel']])
|
||||||
|
|
Loading…
Reference in a new issue