diff options
Diffstat (limited to 'contrib/python/podman/libs')
-rw-r--r-- | contrib/python/podman/libs/_containers_attach.py | 46 | ||||
-rw-r--r-- | contrib/python/podman/libs/tunnel.py | 11 |
2 files changed, 30 insertions, 27 deletions
diff --git a/contrib/python/podman/libs/_containers_attach.py b/contrib/python/podman/libs/_containers_attach.py index 54e6a009e..bd73542b9 100644 --- a/contrib/python/podman/libs/_containers_attach.py +++ b/contrib/python/podman/libs/_containers_attach.py @@ -21,6 +21,9 @@ class Mixin: stderr is ignored. """ + if not self.containerrunning: + raise Exception('you can only attach to running containers') + if stdin is None: stdin = sys.stdin.fileno() @@ -48,7 +51,7 @@ class Mixin: packed = fcntl.ioctl(stdout, termios.TIOCGWINSZ, struct.pack('HHHH', 0, 0, 0, 0)) rows, cols, _, _ = struct.unpack('HHHH', packed) - + # TODO: Need some kind of timeout in case pipe is blocked with open(ctl_socket, 'w') as skt: # send conmon window resize message skt.write('1 {} {}\n'.format(rows, cols)) @@ -73,38 +76,37 @@ class Mixin: # catch any resizing events and send the resize info # to the control fifo "socket" signal.signal(signal.SIGWINCH, resize_handler) + except termios.error: original_attr = None try: - # Prepare socket for communicating with conmon/container + # TODO: socket.SOCK_SEQPACKET may not be supported in Windows with socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET) as skt: + # Prepare socket for communicating with conmon/container skt.connect(io_socket) skt.sendall(b'\n') sources = [skt, stdin] while sources: readable, _, _ = select.select(sources, [], []) - for r in readable: - if r is skt: - data = r.recv(CONMON_BUFSZ) - if not data: - sources.remove(skt) - - # Remove source marker when writing - os.write(stdout, data[1:]) - elif r is stdin: - data = os.read(stdin, CONMON_BUFSZ) - if not data: - sources.remove(stdin) - - skt.sendall(data) - - if eot in data: - sources.clear() - break - else: - raise ValueError('Unknown source in select') + if skt in readable: + data = skt.recv(CONMON_BUFSZ) + if not data: + sources.remove(skt) + + # Remove source marker when writing + os.write(stdout, data[1:]) + + if stdin in readable: + data = os.read(stdin, CONMON_BUFSZ) + if not data: + sources.remove(stdin) + + skt.sendall(data) + + if eot in data: + sources.clear() finally: if original_attr: termios.tcsetattr(stdout, termios.TCSADRAIN, original_attr) diff --git a/contrib/python/podman/libs/tunnel.py b/contrib/python/podman/libs/tunnel.py index 2cb178644..534326ff0 100644 --- a/contrib/python/podman/libs/tunnel.py +++ b/contrib/python/podman/libs/tunnel.py @@ -26,6 +26,7 @@ class Portal(collections.MutableMapping): self.sweap = sweap self.ttl = sweap * 2 self.lock = threading.RLock() + self._schedule_reaper() def __getitem__(self, key): """Given uri return tunnel and update TTL.""" @@ -73,11 +74,12 @@ class Portal(collections.MutableMapping): def reap(self): """Remove tunnels who's TTL has expired.""" + now = time.time() with self.lock: - now = time.time() - for entry, timeout in self.data: - if timeout < now: - self.__delitem__(entry) + reaped_data = self.data.copy() + for entry in reaped_data.items(): + if entry[1][1] < now: + del self.data[entry[0]] else: # StopIteration as soon as possible break @@ -121,7 +123,6 @@ class Tunnel(object): def close(self, id): """Close SSH tunnel.""" - print('Tunnel collapsed!') if self._tunnel is None: return |