Implementing the approach suggested by Jongki Suwandi to resolve the multiple messages like:
[stderr] Warning: Permanently added '192.168.122.99' (RSA) to the list of known hosts. By redirecting them to a filedescriptor of a temporary file, once an abstract ssh instance finishes, the file is unlinked, so we get rid of all fingerprint registers. This way we're able to drop the -q flag to the base ssh command, and we have only one message like the above per autoserv execution. Signed-off-by: Lucas Meneghel Rodrigues <[email protected]> --- server/hosts/abstract_ssh.py | 24 +++++++++++++++--------- server/hosts/ssh_host.py | 9 +++++---- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/server/hosts/abstract_ssh.py b/server/hosts/abstract_ssh.py index e3bfe61..e386b53 100644 --- a/server/hosts/abstract_ssh.py +++ b/server/hosts/abstract_ssh.py @@ -10,15 +10,16 @@ enable_master_ssh = global_config.get_config_value('AUTOSERV', type=bool, default=False) -def make_ssh_command(user="root", port=22, opts='', connect_timeout=30, - alive_interval=300): - base_command = ("/usr/bin/ssh -a -q -x %s -o StrictHostKeyChecking=no " - "-o UserKnownHostsFile=/dev/null -o BatchMode=yes " +def make_ssh_command(user="root", port=22, opts='', hosts_file='/dev/null', + connect_timeout=30, alive_interval=300): + base_command = ("/usr/bin/ssh -a -x %s -o StrictHostKeyChecking=no " + "-o UserKnownHostsFile=%s -o BatchMode=yes " "-o ConnectTimeout=%d -o ServerAliveInterval=%d " "-l %s -p %d") assert isinstance(connect_timeout, (int, long)) assert connect_timeout > 0 # can't disable the timeout - return base_command % (opts, connect_timeout, alive_interval, user, port) + return base_command % (opts, hosts_file, connect_timeout, + alive_interval, user, port) # import site specific Host class @@ -44,6 +45,9 @@ class AbstractSSHHost(SiteHost): self.port = port self.password = password self._use_rsync = None + self.known_hosts_file = os.tmpfile() + known_hosts_fd = self.known_hosts_file.fileno() + self.known_hosts_fd = '/dev/fd/%s' % known_hosts_fd """ Master SSH connection background job, socket temp directory and socket @@ -94,8 +98,9 @@ class AbstractSSHHost(SiteHost): appropriate rsync command for copying them. Remote paths must be pre-encoded. """ - ssh_cmd = make_ssh_command(self.user, self.port, - self.master_ssh_option) + ssh_cmd = make_ssh_command(user=self.user, port=self.port, + opts=self.master_ssh_option, + hosts_file=self.known_hosts_fd) if delete_dest: delete_flag = "--delete" else: @@ -116,8 +121,8 @@ class AbstractSSHHost(SiteHost): pre-encoded. """ command = ("scp -rq %s -o StrictHostKeyChecking=no " - "-o UserKnownHostsFile=/dev/null -P %d %s '%s'") - return command % (self.master_ssh_option, + "-o UserKnownHostsFile=%s -P %d %s '%s'") + return command % (self.master_ssh_option, self.known_hosts_fd, self.port, " ".join(sources), dest) @@ -512,6 +517,7 @@ class AbstractSSHHost(SiteHost): def close(self): super(AbstractSSHHost, self).close() self._cleanup_master_ssh() + self.known_hosts_file.close() def _cleanup_master_ssh(self): diff --git a/server/hosts/ssh_host.py b/server/hosts/ssh_host.py index 32d42ba..2f5a080 100644 --- a/server/hosts/ssh_host.py +++ b/server/hosts/ssh_host.py @@ -54,10 +54,11 @@ class SSHHost(abstract_ssh.AbstractSSHHost): Construct an ssh command with proper args for this host. """ options = "%s %s" % (options, self.master_ssh_option) - base_cmd = abstract_ssh.make_ssh_command(self.user, self.port, - options, - connect_timeout, - alive_interval) + base_cmd = abstract_ssh.make_ssh_command(user=self.user, port=self.port, + opts=options, + hosts_file=self.known_hosts_fd, + connect_timeout=connect_timeout, + alive_interval=alive_interval) return "%s %s" % (base_cmd, self.hostname) -- 1.6.6 _______________________________________________ Autotest mailing list [email protected] http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
