| author | Mike Kinghan <mikek@symbian.org> | 
| Thu, 25 Nov 2010 14:28:39 +0000 | |
| branch | GCC_SURGE | 
| changeset 135 | 10852f1a0ae9 | 
| parent 1 | 2fb8b9db1c86 | 
| permissions | -rw-r--r-- | 
| 1 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 1 | #! /usr/bin/env python | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 2 | |
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 3 | """A multi-threaded telnet-like server that gives a Python prompt. | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 4 | |
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 5 | This is really a prototype for the same thing in C. | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 6 | |
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 7 | Usage: pysvr.py [port] | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 8 | |
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 9 | For security reasons, it only accepts requests from the current host. | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 10 | This can still be insecure, but restricts violations from people who | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 11 | can log in on your machine. Use with caution! | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 12 | |
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 13 | """ | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 14 | |
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 15 | import sys, os, string, getopt, thread, socket, traceback | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 16 | |
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 17 | PORT = 4000 # Default port | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 18 | |
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 19 | def main(): | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 20 | try: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 21 | opts, args = getopt.getopt(sys.argv[1:], "") | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 22 | if len(args) > 1: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 23 | raise getopt.error, "Too many arguments." | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 24 | except getopt.error, msg: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 25 | usage(msg) | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 26 | for o, a in opts: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 27 | pass | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 28 | if args: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 29 | try: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 30 | port = string.atoi(args[0]) | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 31 | except ValueError, msg: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 32 | usage(msg) | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 33 | else: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 34 | port = PORT | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 35 | main_thread(port) | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 36 | |
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 37 | def usage(msg=None): | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 38 | sys.stdout = sys.stderr | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 39 | if msg: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 40 | print msg | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 41 | print "\n", __doc__, | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 42 | sys.exit(2) | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 43 | |
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 44 | def main_thread(port): | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 45 | sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 46 |     sock.bind(("", port))
 | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 47 | sock.listen(5) | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 48 | print "Listening on port", port, "..." | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 49 | while 1: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 50 | (conn, addr) = sock.accept() | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 51 | if addr[0] != conn.getsockname()[0]: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 52 | conn.close() | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 53 | print "Refusing connection from non-local host", addr[0], "." | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 54 | continue | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 55 | thread.start_new_thread(service_thread, (conn, addr)) | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 56 | del conn, addr | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 57 | |
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 58 | def service_thread(conn, addr): | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 59 | (caddr, cport) = addr | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 60 | print "Thread %s has connection from %s.\n" % (str(thread.get_ident()), | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 61 | caddr), | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 62 |     stdin = conn.makefile("r")
 | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 63 |     stdout = conn.makefile("w", 0)
 | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 64 | run_interpreter(stdin, stdout) | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 65 | print "Thread %s is done.\n" % str(thread.get_ident()), | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 66 | |
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 67 | def run_interpreter(stdin, stdout): | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 68 |     globals = {}
 | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 69 | try: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 70 | str(sys.ps1) | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 71 | except: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 72 | sys.ps1 = ">>> " | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 73 | source = "" | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 74 | while 1: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 75 | stdout.write(sys.ps1) | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 76 | line = stdin.readline() | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 77 | if line[:2] == '\377\354': | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 78 | line = "" | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 79 | if not line and not source: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 80 | break | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 81 | if line[-2:] == '\r\n': | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 82 | line = line[:-2] + '\n' | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 83 | source = source + line | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 84 | try: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 85 | code = compile_command(source) | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 86 | except SyntaxError, err: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 87 | source = "" | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 88 | traceback.print_exception(SyntaxError, err, None, file=stdout) | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 89 | continue | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 90 | if not code: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 91 | continue | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 92 | source = "" | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 93 | try: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 94 | run_command(code, stdin, stdout, globals) | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 95 | except SystemExit, how: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 96 | if how: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 97 | try: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 98 | how = str(how) | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 99 | except: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 100 | how = "" | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 101 |                 stdout.write("Exit %s\n" % how)
 | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 102 | break | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 103 |     stdout.write("\nGoodbye.\n")
 | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 104 | |
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 105 | def run_command(code, stdin, stdout, globals): | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 106 | save = sys.stdin, sys.stdout, sys.stderr | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 107 | try: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 108 | sys.stdout = sys.stderr = stdout | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 109 | sys.stdin = stdin | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 110 | try: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 111 | exec code in globals | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 112 | except SystemExit, how: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 113 | raise SystemExit, how, sys.exc_info()[2] | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 114 | except: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 115 | type, value, tb = sys.exc_info() | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 116 | if tb: tb = tb.tb_next | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 117 | traceback.print_exception(type, value, tb) | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 118 | del tb | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 119 | finally: | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 120 | sys.stdin, sys.stdout, sys.stderr = save | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 121 | |
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 122 | from code import compile_command | 
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 123 | |
| 
2fb8b9db1c86
Initial QEMU (symbian-qemu-0.9.1-12) import
 martin.trojer@nokia.com parents: diff
changeset | 124 | main() |