• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1Connection
2==========
3
4A :class:`Connection` abstracts an actual physical connection to a device. The
5first connection is created when :func:`Target.connect` method is called. If a
6:class:`Target` is used in a multi-threaded environment, it will maintain a
7connection for each thread in which it is invoked. This allows the same target
8object to be used in parallel in multiple threads.
9
10:class:`Connection`\ s will be automatically created and managed by
11:class:`Target`\ s, so there is usually no reason to create one manually.
12Instead, configuration for a :class:`Connection` is passed as
13`connection_settings` parameter when creating a :class:`Target`. The connection
14to be used target is also specified on instantiation by `conn_cls` parameter,
15though all concrete :class:`Target` implementations will set an appropriate
16default, so there is typically no need to specify this explicitly.
17
18:class:`Connection` classes are not a part of an inheritance hierarchy, i.e.
19they do not derive from a common base. Instead, a :class:`Connection` is any
20class that implements the following methods.
21
22
23.. method:: push(self, source, dest, timeout=None)
24
25   Transfer a file from the host machine to the connected device.
26
27   :param source: path of to the file on the host
28   :param dest: path of to the file on the connected device.
29   :param timeout: timeout (in seconds) for the transfer; if the transfer does
30       not  complete within this period, an exception will be raised.
31
32.. method:: pull(self, source, dest, timeout=None)
33
34   Transfer a file, or files matching a glob pattern, from the connected device
35   to the host machine.
36
37   :param source: path of to the file on the connected device. If ``dest`` is a
38       directory, may be a glob pattern.
39   :param dest: path of to the file on the host
40   :param timeout: timeout (in seconds) for the transfer; if the transfer does
41       not  complete within this period, an exception will be raised.
42
43.. method:: execute(self, command, timeout=None, check_exit_code=False, as_root=False)
44
45   Execute the specified command on the connected device and return its output.
46
47   :param command: The command to be executed.
48   :param timeout: Timeout (in seconds) for the execution of the command. If
49       specified, an exception will be raised if execution does not complete
50       with the specified period.
51   :param check_exit_code: If ``True`` the exit code (on connected device)
52       from execution of the command will be checked, and an exception will be
53       raised if it is not ``0``.
54   :param as_root: The command will be executed as root. This will fail on
55       unrooted connected devices.
56
57.. method:: background(self, command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, as_root=False)
58
59   Execute the command on the connected device, invoking it via subprocess on the host.
60   This will return :class:`subprocess.Popen` instance for the command.
61
62   :param command: The command to be executed.
63   :param stdout: By default, standard output will be piped from the subprocess;
64      this may be used to redirect it to an alternative file handle.
65   :param stderr: By default, standard error will be piped from the subprocess;
66      this may be used to redirect it to an alternative file handle.
67   :param as_root: The command will be executed as root. This will fail on
68       unrooted connected devices.
69
70   .. note:: This **will block the connection** until the command completes.
71
72.. note:: The above methods are directly wrapped by :class:`Target` methods,
73          however note that some of the defaults are different.
74
75.. method:: cancel_running_command(self)
76
77   Cancel a running command (previously started with :func:`background`) and free up the connection.
78   It is valid to call this if the command has already terminated (or if no
79   command was issued), in which case this is a no-op.
80
81.. method:: close(self)
82
83   Close the connection to the device. The :class:`Connection` object should not
84   be used after this method is called. There is no way to reopen a previously
85   closed connection, a new connection object should be created instead.
86
87.. note:: There is no :func:`open` method, as the connection is assumed to be
88          opened on instantiation.
89
90
91.. _connection-types:
92
93Connection Types
94----------------
95
96.. class:: AdbConnection(device=None, timeout=None)
97
98    A connection to an android device via ``adb`` (Android Debug Bridge).
99    ``adb`` is part of the Android SDK (though stand-alone versions are also
100    available).
101
102    :param device: The name of the adb divice. This is usually a unique hex
103                   string for USB-connected devices, or an ip address/port
104                   combination. To see connected devices, you can run ``adb
105                   devices`` on the host.
106    :param timeout: Connection timeout in seconds. If a connection to the device
107                    is not esblished within this period, :class:`HostError`
108                    is raised.
109
110
111.. class:: SshConnection(host, username, password=None, keyfile=None, port=None,\
112                         timeout=None, password_prompt=None)
113
114    A connectioned to a device on the network over SSH.
115
116    :param host: SSH host to which to connect
117    :param username: username for SSH login
118    :param password: password for the SSH connection
119
120                     .. note:: In order to user password-based authentication,
121                               ``sshpass`` utility must be installed on the
122                               system.
123
124    :param keyfile: Path to the SSH private key to be used for the connection.
125
126                    .. note:: ``keyfile`` and ``password`` can't be specified
127                              at the same time.
128
129    :param port: TCP port on which SSH server is litening on the remoted device.
130                 Omit to use the default port.
131    :param timeout: Timeout for the connection in seconds. If a connection
132                    cannot be established within this time, an error will be
133                    raised.
134    :param password_prompt: A string with the password prompt used by
135                            ``sshpass``. Set this if your version of ``sshpass``
136                            uses somethin other than ``"[sudo] password"``.
137
138
139.. class:: TelnetConnection(host, username, password=None, port=None,\
140                            timeout=None, password_prompt=None,\
141                            original_prompt=None)
142
143    A connectioned to a device on the network over Telenet.
144
145    .. note:: Since Telenet protocol is does not support file transfer, scp is
146              used for that purpose.
147
148    :param host: SSH host to which to connect
149    :param username: username for SSH login
150    :param password: password for the SSH connection
151
152                     .. note:: In order to user password-based authentication,
153                               ``sshpass`` utility must be installed on the
154                               system.
155
156    :param port: TCP port on which SSH server is litening on the remoted device.
157                 Omit to use the default port.
158    :param timeout: Timeout for the connection in seconds. If a connection
159                    cannot be established within this time, an error will be
160                    raised.
161    :param password_prompt: A string with the password prompt used by
162                            ``sshpass``. Set this if your version of ``sshpass``
163                            uses somethin other than ``"[sudo] password"``.
164    :param original_prompt: A regex for the shell prompted presented in the Telenet
165                            connection (the prompt will be reset to a
166                            randomly-generated pattern for the duration of the
167                            connection to reduce the possibility of clashes).
168                            This paramer is ignored for SSH connections.
169
170
171.. class:: LocalConnection(keep_password=True, unrooted=False, password=None)
172
173    A connection to the local host allowing it to be treated as a Target.
174
175
176    :param keep_password: If this is ``True`` (the default) user's password will
177                          be cached in memory after it is first requested.
178    :param unrooted: If set to ``True``, the platform will be assumed to be
179                     unrooted without testing for root. This is useful to avoid
180                     blocking on password request in scripts.
181    :param password: Specify password on connection creation rather than
182                     prompting for it.
183
184
185.. class:: Gem5Connection(platform, host=None, username=None, password=None,\
186                          timeout=None, password_prompt=None,\
187                          original_prompt=None)
188
189    A connection to a gem5 simulation using a local Telnet connection.
190
191    .. note:: Some of the following input parameters are optional and will be ignored during
192              initialisation. They were kept to keep the anology with a :class:`TelnetConnection`
193              (i.e. ``host``, `username``, ``password``, ``port``,
194              ``password_prompt`` and ``original_promp``)
195
196
197    :param host: Host on which the gem5 simulation is running
198
199                     .. note:: Even thought the input parameter for the ``host``
200                               will be ignored, the gem5 simulation needs to on
201                               the same host as the user as the user is
202                               currently on, so if the host given as input
203                               parameter is not the same as the actual host, a
204                               ``TargetError`` will be raised to prevent
205                               confusion.
206
207    :param username: Username in the simulated system
208    :param password: No password required in gem5 so does not need to be set
209    :param port: Telnet port to connect to gem5. This does not need to be set
210                 at initialisation as this will either be determined by the
211                 :class:`Gem5SimulationPlatform` or can be set using the
212                 :func:`connect_gem5` method
213    :param timeout: Timeout for the connection in seconds. Gem5 has high
214                    latencies so unless the timeout given by the user via
215                    this input parameter is higher than the default one
216                    (3600 seconds), this input parameter will be ignored.
217    :param password_prompt: A string with password prompt
218    :param original_prompt: A regex for the shell prompt
219
220There are two classes that inherit from :class:`Gem5Connection`:
221:class:`AndroidGem5Connection` and :class:`LinuxGem5Connection`.
222They inherit *almost* all methods from the parent class, without altering them.
223The only methods discussed belows are those that will be overwritten by the
224:class:`LinuxGem5Connection` and :class:`AndroidGem5Connection` respectively.
225
226.. class:: LinuxGem5Connection
227
228    A connection to a gem5 simulation that emulates a Linux system.
229
230.. method:: _login_to_device(self)
231
232    Login to the gem5 simulated system.
233
234.. class:: AndroidGem5Connection
235
236    A connection to a gem5 simulation that emulates an Android system.
237
238.. method:: _wait_for_boot(self)
239
240    Wait for the gem5 simulated system to have booted and finished the booting animation.
241