summaryrefslogtreecommitdiffstats
path: root/Demo/pysvr/pysvr.py
diff options
context:
space:
mode:
Diffstat (limited to 'Demo/pysvr/pysvr.py')
-rwxr-xr-xDemo/pysvr/pysvr.py135
1 files changed, 135 insertions, 0 deletions
diff --git a/Demo/pysvr/pysvr.py b/Demo/pysvr/pysvr.py
new file mode 100755
index 0000000..4488386
--- /dev/null
+++ b/Demo/pysvr/pysvr.py
@@ -0,0 +1,135 @@
+#! /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]
+
+"""
+
+import sys, os, string, getopt, thread, socket, traceback
+
+OK_DOMAINS = [".cnri.reston.va.us", ".python.org"]
+
+PORT = 7585892 % 0xFFFF # == 49367
+
+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)
+ while 1:
+ (conn, addr) = sock.accept()
+ thread.start_new_thread(service_thread, (conn, addr))
+ del conn, addr
+
+def service_thread(conn, addr):
+ (caddr, cport) = addr
+ try:
+ host, aliases, ipaddrs = socket.gethostbyaddr(caddr)
+ except socket.error:
+ print "Don't know hostname for", caddr
+ return
+ if '.' not in host:
+ for a in aliases:
+ if '.' in a:
+ host = a
+ break
+ else:
+ print "Only a local name (%s) for %s" % (host, caddr)
+ return
+ i = string.find(host, '.')
+ domain = string.lower(host[i:])
+ if domain not in OK_DOMAINS:
+ print "Connection from", host, "not accepted"
+ return
+ print "Thread %s has connection from %s.\n" % (str(thread.get_ident()),
+ host),
+ 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()