diff --git a/scripts/cdist b/scripts/cdist index 39449666..d5737f9c 100755 --- a/scripts/cdist +++ b/scripts/cdist @@ -2,6 +2,7 @@ # -*- coding: utf-8 -*- # # 2010-2013 Nico Schottelius (nico-cdist at schottelius.org) +# 2016 Darko Poljak (darko.poljak at gmail.com) # # This file is part of cdist. # @@ -20,6 +21,32 @@ # # +def inspect_ssh_mux_opts(): + """Inspect whether or not ssh supports multiplexing options""" + wanted_mux_opts = { + "ControlPath":"~/.ssh/master-%l-%r@%h:%p", + "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: + try: + subprocess.check_output("ssh -o {}".format(x), + stderr=subprocess.STDOUT) + 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(): """Parse command line""" import argparse @@ -53,6 +80,11 @@ def commandline(): parser['banner'].set_defaults(func=cdist.banner.banner) # Config + # inspect multiplexing options for default remote copy/exec scp/ssh + MUX_OPTS = inspect_ssh_mux_opts() + cdist.REMOTE_EXEC += MUX_OPTS + cdist.REMOTE_COPY += MUX_OPTS + parser['config'] = parser['sub'].add_parser('config', parents=[parser['loglevel']]) parser['config'].add_argument('host', nargs='+',