| # Copyright 2022 The Fuchsia Authors |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| """Create a SshSettings from a dictionary from an ACTS config |
| |
| Args: |
| config dict instance from an ACTS config |
| |
| Returns: |
| An instance of SshSettings or None |
| """ |
| |
| |
| def from_config(config): |
| if config is None: |
| return None # Having no settings is not an error |
| |
| user = config.get('user', None) |
| host = config.get('host', None) |
| port = config.get('port', 22) |
| identity_file = config.get('identity_file', None) |
| ssh_config = config.get('ssh_config', None) |
| connect_timeout = config.get('connect_timeout', 30) |
| if user is None or host is None: |
| raise ValueError('Malformed SSH config did not include user and ' |
| 'host keys: %s' % config) |
| |
| return SshSettings(host, user, port=port, identity_file=identity_file, |
| ssh_config=ssh_config, connect_timeout=connect_timeout) |
| |
| |
| class SshSettings(object): |
| """Contains settings for ssh. |
| |
| Container for ssh connection settings. |
| |
| Attributes: |
| username: The name of the user to log in as. |
| hostname: The name of the host to connect to. |
| executable: The ssh executable to use. |
| port: The port to connect through (usually 22). |
| host_file: The known host file to use. |
| connect_timeout: How long to wait on a connection before giving a |
| timeout. |
| alive_interval: How long between ssh heartbeat signals to keep the |
| connection alive. |
| """ |
| |
| def __init__(self, |
| hostname, |
| username, |
| port=22, |
| host_file='/dev/null', |
| connect_timeout=30, |
| alive_interval=300, |
| executable='/usr/bin/ssh', |
| identity_file=None, |
| ssh_config=None): |
| self.username = username |
| self.hostname = hostname |
| self.executable = executable |
| self.port = port |
| self.host_file = host_file |
| self.connect_timeout = connect_timeout |
| self.alive_interval = alive_interval |
| self.identity_file = identity_file |
| self.ssh_config = ssh_config |
| |
| def construct_ssh_options(self): |
| """Construct the ssh options. |
| |
| Constructs a dictionary of option that should be used with the ssh |
| command. |
| |
| Returns: |
| A dictionary of option name to value. |
| """ |
| current_options = {} |
| current_options['StrictHostKeyChecking'] = False |
| current_options['UserKnownHostsFile'] = self.host_file |
| current_options['ConnectTimeout'] = self.connect_timeout |
| current_options['ServerAliveInterval'] = self.alive_interval |
| return current_options |
| |
| def construct_ssh_flags(self): |
| """Construct the ssh flags. |
| |
| Constructs what flags should be used in the ssh connection. |
| |
| Returns: |
| A dictonary of flag name to value. If value is none then it is |
| treated as a binary flag. |
| """ |
| current_flags = {} |
| current_flags['-a'] = None |
| current_flags['-x'] = None |
| current_flags['-p'] = self.port |
| if self.identity_file: |
| current_flags['-i'] = self.identity_file |
| if self.ssh_config: |
| current_flags['-F'] = self.ssh_config |
| return current_flags |