[Python-modules-commits] [dockerpty] 01/03: import dockerpty_0.3.3.orig.tar.gz

Jason Pleau jpleau-guest at moszumanska.debian.org
Tue May 19 23:01:10 UTC 2015


This is an automated email from the git hooks/post-receive script.

jpleau-guest pushed a commit to branch master
in repository dockerpty.

commit 6d354fcdd75e19471a6468d083aa64b05af79ed1
Author: Jason Pleau <jason at jpleau.ca>
Date:   Tue May 19 18:56:16 2015 -0400

    import dockerpty_0.3.3.orig.tar.gz
---
 LICENSE.txt                             | 202 +++++++++++++++++
 MANIFEST.in                             |   2 +
 PKG-INFO                                | 149 ++++++++++++
 README.md                               | 129 +++++++++++
 dockerpty.egg-info/PKG-INFO             | 149 ++++++++++++
 dockerpty.egg-info/SOURCES.txt          |  13 ++
 dockerpty.egg-info/dependency_links.txt |   1 +
 dockerpty.egg-info/requires.txt         |   1 +
 dockerpty.egg-info/top_level.txt        |   1 +
 dockerpty/__init__.py                   |  27 +++
 dockerpty/io.py                         | 388 ++++++++++++++++++++++++++++++++
 dockerpty/pty.py                        | 252 +++++++++++++++++++++
 dockerpty/tty.py                        | 130 +++++++++++
 setup.cfg                               |   5 +
 setup.py                                |  51 +++++
 15 files changed, 1500 insertions(+)

diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   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.
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..3e677d0
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,2 @@
+include README.md
+include LICENSE.txt
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..0b338d6
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,149 @@
+Metadata-Version: 1.1
+Name: dockerpty
+Version: 0.3.3
+Summary: Python library to use the pseudo-tty of a docker container
+Home-page: https://github.com/d11wtq/dockerpty
+Author: Chris Corbyn
+Author-email: chris at w3style.co.uk
+License: Apache 2.0
+Description: # Docker PTY
+        
+        Provides the functionality needed to operate the pseudo-tty (PTY) allocated to
+        a docker container, using the Python client.
+        
+        [![Build Status](https://travis-ci.org/d11wtq/dockerpty.svg?branch=master)]
+        (https://travis-ci.org/d11wtq/dockerpty)
+        
+        ## Installation
+        
+        Via pip:
+        
+        ```
+        pip install dockerpty
+        ```
+        
+        Dependencies:
+        
+          * docker-py>=0.3.2
+        
+        However, this library does not explicitly declare this dependency in PyPi for a
+        number of reasons. It is assumed you have it installed.
+        
+        ## Usage
+        
+        The following example will run busybox in a docker container and place the user
+        at the shell prompt via Python.
+        
+        This obviously only works when run in a terminal.
+        
+        ``` python
+        import docker
+        import dockerpty
+        
+        client = docker.Client()
+        container = client.create_container(
+            image='busybox:latest',
+            stdin_open=True,
+            tty=True,
+            command='/bin/sh',
+        )
+        
+        dockerpty.start(client, container)
+        ```
+        
+        Keyword arguments passed to `start()` will be forwarded onto the client to
+        start the container.
+        
+        When the dockerpty is started, control is yielded to the container's PTY until
+        the container exits, or the container's PTY is closed.
+        
+        This is a safe operation and all resources are restored back to their original
+        states.
+        
+        > **Note:** dockerpty does support attaching to non-tty containers to stream
+        container output, though it is obviously not possible to 'control' the
+        container if you do not allocate a pseudo-tty.
+        
+        If you press `C-p C-q`, the container's PTY will be closed, but the container
+        will keep running. In other words, you will have detached from the container
+        and can re-attach with another `dockerpty.start()` call.
+        
+        ## Tests
+        
+        If you want to hack on dockerpty and send a PR, you'll need to run the tests.
+        In the features/ directory, are features/user stories for how dockerpty is
+        supposed to work. To run them:
+        
+        ```
+        -bash$ pip install -r requirements-dev.txt
+        -bash$ behave features/
+        ```
+        
+        You'll need to have docker installed and running locally. The tests use busybox
+        container as a test fixture, so are not too heavy.
+        
+        Step definitions are defined in features/steps/.
+        
+        There are also unit tests for the parts of the code that are not inherently
+        dependent on controlling a TTY. To run those:
+        
+        ```
+        -bash$ pip install -r requirements-dev.txt
+        -bash$ py.test tests/
+        ```
+        
+        Travis CI runs this build inside a UML kernel that is new enough to run docker.
+        Your PR will need to pass the build before I can merge it.
+        
+          - Travis CI build: https://travis-ci.org/d11wtq/dockerpty
+        
+        ## How it works
+        
+        In a terminal, the three file descriptors stdin, stdout and stderr are all
+        connected to the controlling terminal (TTY). When you pass the `tty=True` flag
+        to docker's `create_container()`, docker allocates a fake TTY inside the
+        container (a PTY) to which the container's stdin, stdout and stderr are all
+        connected.
+        
+        The docker API provides a way to access the three sockets connected to the PTY.
+        If with access to the host system's TTY file descriptors and the container's
+        PTY file descriptors, it is trivial to simply 'pipe' data written to these file
+        descriptors between the host and the container. Doing this makes the user's
+        terminal effectively become the pseudo-terminal from inside the container.
+        
+        In reality it's a bit more complicated than this, since care must be taken to
+        put the host terminal into raw mode (where keys such as enter are not
+        interpreted with any special meaning) and restore it on exit. Additionally, the
+        container's stdout and stderr streams along with `sys.stdin` must be made
+        non-blocking so that they can be used with `select()` without blocking the main
+        process. These attributes are restored on exit.
+        
+        The size of a terminal cannot be controlled by sending data to stdin and can
+        only be controlled by the terminal program itself. Since the pseudo-terminal is
+        running inside a real terminal, it is import that the size of the PTY be kept
+        the same as that of the presenting TTY. For this reason, docker provides an API
+        call to resize the allocated PTY. A SIGWINCH handler is used to detect window
+        size changes and resize the pseudo-terminal as needed.
+        
+        ## Contributors
+        
+          - Primary author: [Chris Corbyn](https://github.com/d11wtq)
+          - Collaborator: [Daniel Nephin](https://github.com/dnephin)
+          - Contributor: [Stephen Moore](https://github.com/delfick)
+          - Contributor: [Ben Firshman](https://github.com/bfirsh)
+        
+        ## Copyright & Licensing
+        
+        Copyright © 2014 Chris Corbyn. See the LICENSE.txt file for details.
+        
+Keywords: docker,tty,pty,terminal
+Platform: UNKNOWN
+Classifier: Development Status :: 4 - Beta
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Programming Language :: Python
+Classifier: Environment :: Console
+Classifier: Intended Audience :: Developers
+Classifier: Topic :: Terminals
+Classifier: Topic :: Terminals :: Terminal Emulators/X Terminals
+Classifier: Topic :: Software Development :: Libraries
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..c4d17c1
--- /dev/null
+++ b/README.md
@@ -0,0 +1,129 @@
+# Docker PTY
+
+Provides the functionality needed to operate the pseudo-tty (PTY) allocated to
+a docker container, using the Python client.
+
+[![Build Status](https://travis-ci.org/d11wtq/dockerpty.svg?branch=master)]
+(https://travis-ci.org/d11wtq/dockerpty)
+
+## Installation
+
+Via pip:
+
+```
+pip install dockerpty
+```
+
+Dependencies:
+
+  * docker-py>=0.3.2
+
+However, this library does not explicitly declare this dependency in PyPi for a
+number of reasons. It is assumed you have it installed.
+
+## Usage
+
+The following example will run busybox in a docker container and place the user
+at the shell prompt via Python.
+
+This obviously only works when run in a terminal.
+
+``` python
+import docker
+import dockerpty
+
+client = docker.Client()
+container = client.create_container(
+    image='busybox:latest',
+    stdin_open=True,
+    tty=True,
+    command='/bin/sh',
+)
+
+dockerpty.start(client, container)
+```
+
+Keyword arguments passed to `start()` will be forwarded onto the client to
+start the container.
+
+When the dockerpty is started, control is yielded to the container's PTY until
+the container exits, or the container's PTY is closed.
+
+This is a safe operation and all resources are restored back to their original
+states.
+
+> **Note:** dockerpty does support attaching to non-tty containers to stream
+container output, though it is obviously not possible to 'control' the
+container if you do not allocate a pseudo-tty.
+
+If you press `C-p C-q`, the container's PTY will be closed, but the container
+will keep running. In other words, you will have detached from the container
+and can re-attach with another `dockerpty.start()` call.
+
+## Tests
+
+If you want to hack on dockerpty and send a PR, you'll need to run the tests.
+In the features/ directory, are features/user stories for how dockerpty is
+supposed to work. To run them:
+
+```
+-bash$ pip install -r requirements-dev.txt
+-bash$ behave features/
+```
+
+You'll need to have docker installed and running locally. The tests use busybox
+container as a test fixture, so are not too heavy.
+
+Step definitions are defined in features/steps/.
+
+There are also unit tests for the parts of the code that are not inherently
+dependent on controlling a TTY. To run those:
+
+```
+-bash$ pip install -r requirements-dev.txt
+-bash$ py.test tests/
+```
+
+Travis CI runs this build inside a UML kernel that is new enough to run docker.
+Your PR will need to pass the build before I can merge it.
+
+  - Travis CI build: https://travis-ci.org/d11wtq/dockerpty
+
+## How it works
+
+In a terminal, the three file descriptors stdin, stdout and stderr are all
+connected to the controlling terminal (TTY). When you pass the `tty=True` flag
+to docker's `create_container()`, docker allocates a fake TTY inside the
+container (a PTY) to which the container's stdin, stdout and stderr are all
+connected.
+
+The docker API provides a way to access the three sockets connected to the PTY.
+If with access to the host system's TTY file descriptors and the container's
+PTY file descriptors, it is trivial to simply 'pipe' data written to these file
+descriptors between the host and the container. Doing this makes the user's
+terminal effectively become the pseudo-terminal from inside the container.
+
+In reality it's a bit more complicated than this, since care must be taken to
+put the host terminal into raw mode (where keys such as enter are not
+interpreted with any special meaning) and restore it on exit. Additionally, the
+container's stdout and stderr streams along with `sys.stdin` must be made
+non-blocking so that they can be used with `select()` without blocking the main
+process. These attributes are restored on exit.
+
+The size of a terminal cannot be controlled by sending data to stdin and can
+only be controlled by the terminal program itself. Since the pseudo-terminal is
+running inside a real terminal, it is import that the size of the PTY be kept
+the same as that of the presenting TTY. For this reason, docker provides an API
+call to resize the allocated PTY. A SIGWINCH handler is used to detect window
+size changes and resize the pseudo-terminal as needed.
+
+## Contributors
+
+  - Primary author: [Chris Corbyn](https://github.com/d11wtq)
+  - Collaborator: [Daniel Nephin](https://github.com/dnephin)
+  - Contributor: [Stephen Moore](https://github.com/delfick)
+  - Contributor: [Ben Firshman](https://github.com/bfirsh)
+
+## Copyright & Licensing
+
+Copyright © 2014 Chris Corbyn. See the LICENSE.txt file for details.
diff --git a/dockerpty.egg-info/PKG-INFO b/dockerpty.egg-info/PKG-INFO
new file mode 100644
index 0000000..0b338d6
--- /dev/null
+++ b/dockerpty.egg-info/PKG-INFO
@@ -0,0 +1,149 @@
+Metadata-Version: 1.1
+Name: dockerpty
+Version: 0.3.3
+Summary: Python library to use the pseudo-tty of a docker container
+Home-page: https://github.com/d11wtq/dockerpty
+Author: Chris Corbyn
+Author-email: chris at w3style.co.uk
+License: Apache 2.0
+Description: # Docker PTY
+        
+        Provides the functionality needed to operate the pseudo-tty (PTY) allocated to
+        a docker container, using the Python client.
+        
+        [![Build Status](https://travis-ci.org/d11wtq/dockerpty.svg?branch=master)]
+        (https://travis-ci.org/d11wtq/dockerpty)
+        
+        ## Installation
+        
+        Via pip:
+        
+        ```
+        pip install dockerpty
+        ```
+        
+        Dependencies:
+        
+          * docker-py>=0.3.2
+        
+        However, this library does not explicitly declare this dependency in PyPi for a
+        number of reasons. It is assumed you have it installed.
+        
+        ## Usage
+        
+        The following example will run busybox in a docker container and place the user
+        at the shell prompt via Python.
+        
+        This obviously only works when run in a terminal.
+        
+        ``` python
+        import docker
+        import dockerpty
+        
+        client = docker.Client()
+        container = client.create_container(
+            image='busybox:latest',
+            stdin_open=True,
+            tty=True,
+            command='/bin/sh',
+        )
+        
+        dockerpty.start(client, container)
+        ```
+        
+        Keyword arguments passed to `start()` will be forwarded onto the client to
+        start the container.
+        
+        When the dockerpty is started, control is yielded to the container's PTY until
+        the container exits, or the container's PTY is closed.
+        
+        This is a safe operation and all resources are restored back to their original
+        states.
+        
+        > **Note:** dockerpty does support attaching to non-tty containers to stream
+        container output, though it is obviously not possible to 'control' the
+        container if you do not allocate a pseudo-tty.
+        
+        If you press `C-p C-q`, the container's PTY will be closed, but the container
+        will keep running. In other words, you will have detached from the container
+        and can re-attach with another `dockerpty.start()` call.
+        
+        ## Tests
+        
+        If you want to hack on dockerpty and send a PR, you'll need to run the tests.
+        In the features/ directory, are features/user stories for how dockerpty is
+        supposed to work. To run them:
+        
+        ```
+        -bash$ pip install -r requirements-dev.txt
+        -bash$ behave features/
+        ```
+        
+        You'll need to have docker installed and running locally. The tests use busybox
+        container as a test fixture, so are not too heavy.
+        
+        Step definitions are defined in features/steps/.
+        
+        There are also unit tests for the parts of the code that are not inherently
+        dependent on controlling a TTY. To run those:
+        
+        ```
+        -bash$ pip install -r requirements-dev.txt
+        -bash$ py.test tests/
+        ```
+        
+        Travis CI runs this build inside a UML kernel that is new enough to run docker.
+        Your PR will need to pass the build before I can merge it.
+        
+          - Travis CI build: https://travis-ci.org/d11wtq/dockerpty
+        
+        ## How it works
+        
+        In a terminal, the three file descriptors stdin, stdout and stderr are all
+        connected to the controlling terminal (TTY). When you pass the `tty=True` flag
+        to docker's `create_container()`, docker allocates a fake TTY inside the
+        container (a PTY) to which the container's stdin, stdout and stderr are all
+        connected.
+        
+        The docker API provides a way to access the three sockets connected to the PTY.
+        If with access to the host system's TTY file descriptors and the container's
+        PTY file descriptors, it is trivial to simply 'pipe' data written to these file
+        descriptors between the host and the container. Doing this makes the user's
+        terminal effectively become the pseudo-terminal from inside the container.
+        
+        In reality it's a bit more complicated than this, since care must be taken to
+        put the host terminal into raw mode (where keys such as enter are not
+        interpreted with any special meaning) and restore it on exit. Additionally, the
+        container's stdout and stderr streams along with `sys.stdin` must be made
+        non-blocking so that they can be used with `select()` without blocking the main
+        process. These attributes are restored on exit.
+        
+        The size of a terminal cannot be controlled by sending data to stdin and can
+        only be controlled by the terminal program itself. Since the pseudo-terminal is
+        running inside a real terminal, it is import that the size of the PTY be kept
+        the same as that of the presenting TTY. For this reason, docker provides an API
+        call to resize the allocated PTY. A SIGWINCH handler is used to detect window
+        size changes and resize the pseudo-terminal as needed.
+        
+        ## Contributors
+        
+          - Primary author: [Chris Corbyn](https://github.com/d11wtq)
+          - Collaborator: [Daniel Nephin](https://github.com/dnephin)
+          - Contributor: [Stephen Moore](https://github.com/delfick)
+          - Contributor: [Ben Firshman](https://github.com/bfirsh)
+        
+        ## Copyright & Licensing
+        
+        Copyright © 2014 Chris Corbyn. See the LICENSE.txt file for details.
+        
+Keywords: docker,tty,pty,terminal
+Platform: UNKNOWN
+Classifier: Development Status :: 4 - Beta
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Programming Language :: Python
+Classifier: Environment :: Console
+Classifier: Intended Audience :: Developers
+Classifier: Topic :: Terminals
+Classifier: Topic :: Terminals :: Terminal Emulators/X Terminals
+Classifier: Topic :: Software Development :: Libraries
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
diff --git a/dockerpty.egg-info/SOURCES.txt b/dockerpty.egg-info/SOURCES.txt
new file mode 100644
index 0000000..3131ce8
--- /dev/null
+++ b/dockerpty.egg-info/SOURCES.txt
@@ -0,0 +1,13 @@
+LICENSE.txt
+MANIFEST.in
+README.md
+setup.py
+dockerpty/__init__.py
+dockerpty/io.py
+dockerpty/pty.py
+dockerpty/tty.py
+dockerpty.egg-info/PKG-INFO
+dockerpty.egg-info/SOURCES.txt
+dockerpty.egg-info/dependency_links.txt
+dockerpty.egg-info/requires.txt
+dockerpty.egg-info/top_level.txt
\ No newline at end of file
diff --git a/dockerpty.egg-info/dependency_links.txt b/dockerpty.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/dockerpty.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/dockerpty.egg-info/requires.txt b/dockerpty.egg-info/requires.txt
new file mode 100644
index 0000000..82a6379
--- /dev/null
+++ b/dockerpty.egg-info/requires.txt
@@ -0,0 +1 @@
+six >= 1.3.0
\ No newline at end of file
diff --git a/dockerpty.egg-info/top_level.txt b/dockerpty.egg-info/top_level.txt
new file mode 100644
index 0000000..ba4766d
--- /dev/null
+++ b/dockerpty.egg-info/top_level.txt
@@ -0,0 +1 @@
+dockerpty
diff --git a/dockerpty/__init__.py b/dockerpty/__init__.py
new file mode 100644
index 0000000..5e7e306
--- /dev/null
+++ b/dockerpty/__init__.py
@@ -0,0 +1,27 @@
+# dockerpty.
+#
+# Copyright 2014 Chris Corbyn <chris at w3style.co.uk>
+#
+# 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.
+
+from dockerpty.pty import PseudoTerminal
+
+
+def start(client, container, interactive=True, stdout=None, stderr=None, stdin=None):
+    """
+    Present the PTY of the container inside the current process.
+
+    This is just a wrapper for PseudoTerminal(client, container).start()
+    """
+
+    PseudoTerminal(client, container, interactive=interactive, stdout=stdout, stderr=stderr, stdin=stdin).start()
diff --git a/dockerpty/io.py b/dockerpty/io.py
new file mode 100644
index 0000000..1dfca9b
--- /dev/null
+++ b/dockerpty/io.py
@@ -0,0 +1,388 @@
+# dockerpty: io.py
+#
+# Copyright 2014 Chris Corbyn <chris at w3style.co.uk>
+#
+# 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.
+
+import os
+import fcntl
+import errno
+import struct
+import select as builtin_select
+import six
+
+
+def set_blocking(fd, blocking=True):
+    """
+    Set the given file-descriptor blocking or non-blocking.
+
+    Returns the original blocking status.
+    """
+
+    old_flag = fcntl.fcntl(fd, fcntl.F_GETFL)
+
+    if blocking:
+        new_flag = old_flag & ~ os.O_NONBLOCK
+    else:
+        new_flag = old_flag | os.O_NONBLOCK
+
+    fcntl.fcntl(fd, fcntl.F_SETFL, new_flag)
+
+    return not bool(old_flag & os.O_NONBLOCK)
+
+
+def select(read_streams, write_streams, timeout=0):
+    """
+    Select the streams from `read_streams` that are ready for reading, and
+    streams from `write_streams` ready for writing.
+
+    Uses `select.select()` internally but only returns two lists of ready streams.
+    """
+
+    exception_streams = []
+
+    try:
+        return builtin_select.select(
+            read_streams,
+            write_streams,
+            exception_streams,
+            timeout,
+        )[0:2]
+    except builtin_select.error as e:
+        # POSIX signals interrupt select()
+        no = e.errno if six.PY3 else e[0]
+        if no == errno.EINTR:
+            return ([], [])
+        else:
+            raise e
+
+
+class Stream(object):
+    """
+    Generic Stream class.
+
+    This is a file-like abstraction on top of os.read() and os.write(), which
+    add consistency to the reading of sockets and files alike.
+    """
+
+    """
+    Recoverable IO/OS Errors.
+    """
+    ERRNO_RECOVERABLE = [
+        errno.EINTR,
+        errno.EDEADLK,
+        errno.EWOULDBLOCK,
+    ]
+
+    def __init__(self, fd):
+        """
+        Initialize the Stream for the file descriptor `fd`.
+
+        The `fd` object must have a `fileno()` method.
+        """
+        self.fd = fd
+        self.buffer = b''
+        self.close_requested = False
+        self.closed = False
+
+    def fileno(self):
+        """
+        Return the fileno() of the file descriptor.
+        """
+
+        return self.fd.fileno()
+
+    def set_blocking(self, value):
+        if hasattr(self.fd, 'setblocking'):
+            self.fd.setblocking(value)
+            return True
+        else:
+            return set_blocking(self.fd, value)
+
+    def read(self, n=4096):
+        """
+        Return `n` bytes of data from the Stream, or None at end of stream.
+        """
+
+        while True:
+            try:
+                if hasattr(self.fd, 'recv'):
+                    return self.fd.recv(n)
+                return os.read(self.fd.fileno(), n)
+            except EnvironmentError as e:
+                if e.errno not in Stream.ERRNO_RECOVERABLE:
+                    raise e
+
+
+    def write(self, data):
+        """
+        Write `data` to the Stream. Not all data may be written right away.
+        Use select to find when the stream is writeable, and call do_write()
+        to flush the internal buffer.
+        """
+
+        if not data:
+            return None
+
+        self.buffer += data
+        self.do_write()
+
+        return len(data)
+
+    def do_write(self):
+        """
+        Flushes as much pending data from the internal write buffer as possible.
+        """
+        while True:
+            try:
+                written = 0
+
+                if hasattr(self.fd, 'send'):
+                    written = self.fd.send(self.buffer)
+                else:
+                    written = os.write(self.fd.fileno(), self.buffer)
+
+                self.buffer = self.buffer[written:]
+
+                # try to close after writes if a close was requested
+                if self.close_requested and len(self.buffer) == 0:
+                    self.close()
+
+                return written
+            except EnvironmentError as e:
+                if e.errno not in Stream.ERRNO_RECOVERABLE:
+                    raise e
+
+    def needs_write(self):
+        """
+        Returns True if the stream has data waiting to be written.
+        """
+        return len(self.buffer) > 0
+
+    def close(self):
+        self.close_requested = True
+
+        # We don't close the fd immediately, as there may still be data pending
+        # to write.
+        if not self.closed and len(self.buffer) == 0:
+            self.closed = True
+            if hasattr(self.fd, 'close'):
+                self.fd.close()
+            else:
+                os.close(self.fd.fileno())
+
+    def __repr__(self):
+        return "{cls}({fd})".format(cls=type(self).__name__, fd=self.fd)
+
+
+class Demuxer(object):
+    """
+    Wraps a multiplexed Stream to read in data demultiplexed.
+
+    Docker multiplexes streams together when there is no PTY attached, by
+    sending an 8-byte header, followed by a chunk of data.
+
+    The first 4 bytes of the header denote the stream from which the data came
+    (i.e. 0x01 = stdout, 0x02 = stderr). Only the first byte of these initial 4
+    bytes is used.
+
+    The next 4 bytes indicate the length of the following chunk of data as an
+    integer in big endian format. This much data must be consumed before the
+    next 8-byte header is read.
+    """
+
+    def __init__(self, stream):
+        """
+        Initialize a new Demuxer reading from `stream`.
+        """
+
+        self.stream = stream
+        self.remain = 0
+
+    def fileno(self):
+        """
+        Returns the fileno() of the underlying Stream.
+
+        This is useful for select() to work.
+        """
+
+        return self.stream.fileno()
+
+    def set_blocking(self, value):
+        return self.stream.set_blocking(value)
+
+    def read(self, n=4096):
+        """
+        Read up to `n` bytes of data from the Stream, after demuxing.
+
+        Less than `n` bytes of data may be returned depending on the available
+        payload, but the number of bytes returned will never exceed `n`.
+
+        Because demuxing involves scanning 8-byte headers, the actual amount of
+        data read from the underlying stream may be greater than `n`.
+        """
+
+        size = self._next_packet_size(n)
... 615 lines suppressed ...

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/dockerpty.git



More information about the Python-modules-commits mailing list