aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArmin Rigo <arigo@tunes.org>2008-03-20 14:15:09 +0000
committerArmin Rigo <arigo@tunes.org>2008-03-20 14:15:09 +0000
commit48be8f2ce8adf0b2a272b103de2965429a6cf294 (patch)
treedeeba8147f046e2d0b817774fd7cfa62afce8ebf /dotviewer/sshgraphserver.py
parentTest and a fix for hlstr called directly on top of pypy-c (diff)
downloadpypy-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-xdotviewer/sshgraphserver.py71
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:])