X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=pdm%2Fsshsock.py;h=dd53e6aaf6b98cbd2f678cbc7c15ab03469cb330;hb=9e3c83b113c519d0073457ae0cfe80291bcda7e9;hp=3a641228ab1598514c7c10a50e9fffcc2cd673d1;hpb=16e7fd3d4abbec9f5e6d976a2feca87176e79e29;p=pdm.git diff --git a/pdm/sshsock.py b/pdm/sshsock.py index 3a64122..dd53e6a 100644 --- a/pdm/sshsock.py +++ b/pdm/sshsock.py @@ -9,9 +9,33 @@ class sshsocket(object): if port is not None: args += ["-p", str(int(port))] args += [host] - args += ["python3", "-m", "pdm.sshsock", path] + args += ["python", "-m", "pdm.sshsock", path] self.proc = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, close_fds=True) fcntl.fcntl(self.proc.stdout, fcntl.F_SETFL, fcntl.fcntl(self.proc.stdout, fcntl.F_GETFL) | os.O_NONBLOCK) + head = self.recv(5) + if head != "SSOCK": + raise socket.error("unexpected reply from %s: %r" % (host, head)) + head = self.recv(1) + if head == "+": + buf = "" + while True: + r = self.recv(1) + if r == "": + raise socket.error("unexpected EOF in SSH socket stream") + elif r == "\n": + break + buf += r + return + elif head == "-": + buf = "" + while True: + r = self.recv(1) + if r in ("\n", ""): + break + buf += r + raise socket.error(buf) + else: + raise socket.error("unexpected reply from %s: %r" % (host, head)) def close(self): if self.proc is not None: @@ -36,36 +60,43 @@ class sshsocket(object): self.close() def cli(): - fcntl.fcntl(sys.stdin.buffer, fcntl.F_SETFL, fcntl.fcntl(sys.stdin.buffer, fcntl.F_GETFL) | os.O_NONBLOCK) + fcntl.fcntl(sys.stdin, fcntl.F_SETFL, fcntl.fcntl(sys.stdin, fcntl.F_GETFL) | os.O_NONBLOCK) sk = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) try: - sk.connect(sys.argv[1]) - buf1 = b"" - buf2 = b"" + try: + sk.connect(sys.argv[1]) + except socket.error as err: + sys.stdout.write("SSOCK-connect: %s\n" % err) + sys.stdout.flush() + return + sys.stdout.write("SSOCK+\n") + sys.stdout.flush() + buf1 = "" + buf2 = "" while True: wfd = [] if buf1: wfd.append(sk) - if buf2: wfd.append(sys.stdout.buffer) - rfd, wfd, efd = select.select([sk, sys.stdin.buffer], wfd, []) + if buf2: wfd.append(sys.stdout) + rfd, wfd, efd = select.select([sk, sys.stdin], wfd, []) if sk in rfd: ret = sk.recv(65536) - if ret == b"": + if ret == "": break else: buf2 += ret - if sys.stdin.buffer in rfd: - ret = sys.stdin.buffer.read() - if ret == b"": + if sys.stdin in rfd: + ret = sys.stdin.read() + if ret == "": break else: buf1 = ret if sk in wfd: ret = sk.send(buf1) buf1 = buf1[ret:] - if sys.stdout.buffer in wfd: - sys.stdout.buffer.write(buf2) - sys.stdout.buffer.flush() - buf2 = b"" + if sys.stdout in wfd: + sys.stdout.write(buf2) + sys.stdout.flush() + buf2 = "" finally: sk.close()