diff options
author | Armin Rigo <arigo@tunes.org> | 2008-03-20 14:15:09 +0000 |
---|---|---|
committer | Armin Rigo <arigo@tunes.org> | 2008-03-20 14:15:09 +0000 |
commit | 48be8f2ce8adf0b2a272b103de2965429a6cf294 (patch) | |
tree | deeba8147f046e2d0b817774fd7cfa62afce8ebf /dotviewer/sshgraphserver.py | |
parent | Test and a fix for hlstr called directly on top of pypy-c (diff) | |
download | pypy-48be8f2ce8adf0b2a272b103de2965429a6cf294.tar.gz pypy-48be8f2ce8adf0b2a272b103de2965429a6cf294.tar.bz2 pypy-48be8f2ce8adf0b2a272b103de2965429a6cf294.zip |
A bit hackish but probably convenient: a zero-configuration
remote graph viewer.
Diffstat (limited to 'dotviewer/sshgraphserver.py')
-rwxr-xr-x | dotviewer/sshgraphserver.py | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/dotviewer/sshgraphserver.py b/dotviewer/sshgraphserver.py new file mode 100755 index 0000000000..edd7a8d9a3 --- /dev/null +++ b/dotviewer/sshgraphserver.py @@ -0,0 +1,71 @@ +#! /usr/bin/env python +"""This script displays locally the graphs that are built by dotviewer +on remote machines. + +Usage: + sshgraphserver.py hostname [more args for ssh...] + +This logs in to 'hostname' by passing the arguments on the command-line +to ssh. No further configuration is required: it works for all programs +using the dotviewer library as long as they run on 'hostname' under the +same username as the one sshgraphserver logs as. +""" + +import graphserver, socket, subprocess, random + + +def ssh_graph_server(sshargs): + s1 = socket.socket() + s1.bind(('127.0.0.1', socket.INADDR_ANY)) + localhost, localport = s1.getsockname() + remoteport = random.randrange(10000, 20000) + # ^^^ and just hope there is no conflict + + args = ['ssh', '-C', '-R%d:127.0.0.1:%d' % (remoteport, localport)] + args = args + sshargs + ['python -u -c "exec input()"'] + print ' '.join(args[:-1]) + p = subprocess.Popen(args, bufsize=0, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE) + p.stdin.write(repr('port=%d\n%s' % (remoteport, REMOTE_SOURCE)) + '\n') + line = p.stdout.readline() + assert line == 'OK\n' + + graphserver.listen_server(None, s1=s1) + + +REMOTE_SOURCE = r""" +import tempfile, getpass, os, sys + +def main(port): + tmpdir = tempfile.gettempdir() + user = getpass.getuser() + fn = os.path.join(tmpdir, 'dotviewer-sshgraphsrv-%s' % user) + try: + os.unlink(fn) + except OSError: + pass + f = open(fn, 'w') + print >> f, port + f.close() + try: + sys.stdout.write('OK\n') + # just wait for the loss of the remote link, ignoring any data + while sys.stdin.read(1024): + pass + finally: + try: + os.unlink(fn) + except OSError: + pass + +main(port) +""" + + +if __name__ == '__main__': + import sys + if len(sys.argv) <= 1: + print __doc__ + sys.exit(2) + ssh_graph_server(sys.argv[1:]) |