[PythonCE] Unix->CE. Telnet into your PythonCE !

Olivier Fambon Olivier.Fambon@xrce.xerox.com
Fri, 29 Nov 2002 15:46:37 +0100


--=-=-=


Hi there,

I don't know if it might be of any use to you WindoZ-enabled people...

Might be trivial too. However, I can share my practice here
[and may be update the Wiki pages ?]

Enjoy.

A+O.


For people who have no Windows+ActiveSync machine at hand, only an
iPaq+WLan.

1/ Install

To install PythonCE, downloaded the cab via IE. As long as you can
stick the cab on some [Wlan-accessible] web server (*), it's fine.

The plot is that you have no "save-as" in IE... However, browsed files
are stored locally in /Windows/Temporary Internet Files/<some nice name>

There are several <some nice name> tmp dirs. Spot the one containing
the cab with File Exploder, and click the cab.


2/ Testing/Running scripts

You can develop scripts on a host, serve them via a web server, and
execute them via IE.

Just set the mime-type for .py files to application/python, and IE
will run Python for you.

Mime-types are in web.xml for Tomcat, or use (*) SimpleHTTPServer as
web-server and hack the mime-types mappings [see trace bellow]


--=-=-=
Content-Disposition: attachment

Python 2.2.2 (#2, Nov 19 2002, 14:36:35) 
[GCC 3.2] on sunos5
Type "help", "copyright", "credits" or "license" for more information.
>>> import SimpleHTTPServer
>>> SimpleHTTPServer.SimpleHTTPRequestHandler.extensions_map.update({'.py':'application/python'})
>>> SimpleHTTPServer.test()
Serving HTTP on 0.0.0.0 port 8000 ...


--=-=-=



3/ Handy Python prompt

In case you would like to have a usable python prompt - and a
keyboard, you can telnet into your PythonCE.

Just run pysrv.py on your PythonCE [see script bellow], and telnet
into it [or use a python telnet-client like for history may be].

The script is a modified [and not-fully-ok ] copy/paste from
Python-1.5.2/Demo/pysvr/pysvr.py

Note that there are other [non-threaded] such server scripts out there
which might work better...


--=-=-=
Content-Disposition: attachment

#! /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 = 23 # 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()
        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': # normalize windoz clients
            line = line[:-2] + '\n'
        source = source + line[:-1] # no newline for compile
        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) # kills telnet client
            print "error:", value
            del tb
    finally:
        sys.stdin, sys.stdout, sys.stderr = save

from code import compile_command

main()

--=-=-=--