diff options
author | cinap_lenrek <cinap_lenrek@localhost> | 2011-05-03 11:25:13 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@localhost> | 2011-05-03 11:25:13 +0000 |
commit | 458120dd40db6b4df55a4e96b650e16798ef06a0 (patch) | |
tree | 8f82685be24fef97e715c6f5ca4c68d34d5074ee /sys/src/cmd/python/Demo/pysvr/pysvr.py | |
parent | 3a742c699f6806c1145aea5149bf15de15a0afd7 (diff) |
add hg and python
Diffstat (limited to 'sys/src/cmd/python/Demo/pysvr/pysvr.py')
-rwxr-xr-x | sys/src/cmd/python/Demo/pysvr/pysvr.py | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/sys/src/cmd/python/Demo/pysvr/pysvr.py b/sys/src/cmd/python/Demo/pysvr/pysvr.py new file mode 100755 index 000000000..dd0abdc77 --- /dev/null +++ b/sys/src/cmd/python/Demo/pysvr/pysvr.py @@ -0,0 +1,124 @@ +#! /usr/bin/env python + +"""A multi-threaded telnet-like server that gives a Python prompt. + +This is really a prototype for the same thing in C. + +Usage: pysvr.py [port] + +For security reasons, it only accepts requests from the current host. +This can still be insecure, but restricts violations from people who +can log in on your machine. Use with caution! + +""" + +import sys, os, string, getopt, thread, socket, traceback + +PORT = 4000 # Default port + +def main(): + try: + opts, args = getopt.getopt(sys.argv[1:], "") + if len(args) > 1: + raise getopt.error, "Too many arguments." + except getopt.error, msg: + usage(msg) + for o, a in opts: + pass + if args: + try: + port = string.atoi(args[0]) + except ValueError, msg: + usage(msg) + else: + port = PORT + main_thread(port) + +def usage(msg=None): + sys.stdout = sys.stderr + if msg: + print msg + print "\n", __doc__, + sys.exit(2) + +def main_thread(port): + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.bind(("", port)) + sock.listen(5) + print "Listening on port", port, "..." + while 1: + (conn, addr) = sock.accept() + if addr[0] != conn.getsockname()[0]: + conn.close() + print "Refusing connection from non-local host", addr[0], "." + continue + thread.start_new_thread(service_thread, (conn, addr)) + del conn, addr + +def service_thread(conn, addr): + (caddr, cport) = addr + print "Thread %s has connection from %s.\n" % (str(thread.get_ident()), + caddr), + stdin = conn.makefile("r") + stdout = conn.makefile("w", 0) + run_interpreter(stdin, stdout) + print "Thread %s is done.\n" % str(thread.get_ident()), + +def run_interpreter(stdin, stdout): + globals = {} + try: + str(sys.ps1) + except: + sys.ps1 = ">>> " + source = "" + while 1: + stdout.write(sys.ps1) + line = stdin.readline() + if line[:2] == '\377\354': + line = "" + if not line and not source: + break + if line[-2:] == '\r\n': + line = line[:-2] + '\n' + source = source + line + try: + code = compile_command(source) + except SyntaxError, err: + source = "" + traceback.print_exception(SyntaxError, err, None, file=stdout) + continue + if not code: + continue + source = "" + try: + run_command(code, stdin, stdout, globals) + except SystemExit, how: + if how: + try: + how = str(how) + except: + how = "" + stdout.write("Exit %s\n" % how) + break + stdout.write("\nGoodbye.\n") + +def run_command(code, stdin, stdout, globals): + save = sys.stdin, sys.stdout, sys.stderr + try: + sys.stdout = sys.stderr = stdout + sys.stdin = stdin + try: + exec code in globals + except SystemExit, how: + raise SystemExit, how, sys.exc_info()[2] + except: + type, value, tb = sys.exc_info() + if tb: tb = tb.tb_next + traceback.print_exception(type, value, tb) + del tb + finally: + sys.stdin, sys.stdout, sys.stderr = save + +from code import compile_command + +main() |