On Tue, Feb 2, 2010 at 2:45 AM, Lucas Meneghel Rodrigues <[email protected]> wrote: > 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.
Just for the record, we can implement this in such a way that each instance of abstract_ssh gets its own unique temporary file, so it is safer when considering multiple autoserv executions. However, this is a first pass implementation, if you guys think it's a better idea going with unique temporary files per autoserv execution, let me know! > 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 > -- Lucas _______________________________________________ Autotest mailing list [email protected] http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
