~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to src/bin/python-server

  • Committer: drtomc
  • Date: 2007-12-18 23:28:52 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:80
More on the python server.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#!/usr/bin/python
2
2
 
 
3
# Notes
 
4
# -----
 
5
#
 
6
# 1. execute in a chroot jail
 
7
# 2. enforce resource limits
 
8
# 3. allow multiple connections
 
9
# 4. enforce some kind of auth.
 
10
#
 
11
# Another thing is to examine the commonality and difference between
 
12
# the console app and the python evaluator in the tutorial system.
 
13
 
3
14
import socket
4
15
import cStringIO
5
16
import codeop
7
18
import cjson
8
19
import signal
9
20
 
10
 
def req_lines(sok):
 
21
def recv_lines(sok):
11
22
    buf = ''
12
23
    s = sok.recv(4096)
13
24
    while len(s) > 0:
24
35
    print 'signal: ', signum
25
36
    raise Exception, 'Timeout!'
26
37
 
27
 
signal.signal(signal.SIGALRM, timeout)
28
 
 
29
 
sok = socket.socket(socket.AF_INET)
30
 
sok.bind(('localhost',9998))
31
 
sok.listen(1)
32
 
(new_sok,addr) = sok.accept()
33
 
 
34
 
c = codeop.CommandCompiler()
35
 
 
36
 
globs = {}
37
 
locos = {}
38
 
globs['__builtins__'] = globals()['__builtins__']
39
 
 
40
 
out = cStringIO.StringIO()
41
 
sys.stdout = out
42
 
first = True
43
 
for line in req_lines(new_sok):
44
 
    if first:
45
 
        src = line
46
 
        first = False
47
 
    else:
48
 
        src = src + '\n' + line
49
 
    cmd = c(src)
50
 
    if cmd is not None:
51
 
        signal.alarm(5)
52
 
        res = eval(cmd, globs, locos)
53
 
        signal.alarm(0)
54
 
        new_sok.send(cjson.encode((out.getvalue(),res)) + '\n')
55
 
        out = cStringIO.StringIO()
56
 
        sys.stdout = out
57
 
        first = True
58
 
 
59
 
sok.shutdown(socket.SHUT_RDWR)
 
38
# signal.signal(signal.SIGALRM, timeout)
 
39
 
40
# sok = socket.socket(socket.AF_INET)
 
41
# sok.bind(('localhost',9998))
 
42
# sok.listen(1)
 
43
# (new_sok,addr) = sok.accept()
 
44
 
45
# c = codeop.CommandCompiler()
 
46
 
47
# globs = {}
 
48
# locos = {}
 
49
# globs['__builtins__'] = globals()['__builtins__']
 
50
 
51
# out = cStringIO.StringIO()
 
52
# sys.stdout = out
 
53
# first = True
 
54
# for line in req_lines(new_sok):
 
55
#     if first:
 
56
#         src = line
 
57
#         first = False
 
58
#     else:
 
59
#         src = src + '\n' + line
 
60
#     cmd = c(src)
 
61
#     if cmd is not None:
 
62
#         signal.alarm(5)
 
63
#         res = eval(cmd, globs, locos)
 
64
#         signal.alarm(0)
 
65
#         new_sok.send(cjson.encode((out.getvalue(),res)) + '\n')
 
66
#         out = cStringIO.StringIO()
 
67
#         sys.stdout = out
 
68
#         first = True
 
69
 
70
# sok.shutdown(socket.SHUT_RDWR)
 
71
 
 
72
if __name__ == "__main__":
 
73
    try:
 
74
        uid = int(sys.argv[1])
 
75
    except ValueError, v:
 
76
        print >> sys.stderr, "uid must be an integer."
 
77
        sys.exit(1)
 
78
    jail = sys.argv[2]
 
79
    cwd = sys.argv[3]
 
80
    try:
 
81
        port = int(sys.argv[4])
 
82
    except ValueError, v:
 
83
        print >> sys.stderr, "port must be an integer."
 
84
        sys.exit(1)
 
85
    magic = sys.argv[5]
 
86
    # magic = raw_input()
 
87
 
 
88
    try:
 
89
        pid = os.fork()
 
90
        if pid > 0:
 
91
            sys.exit(0)
 
92
    except OSError, e:
 
93
        print >> sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror)
 
94
        sys.exit(1)
 
95
 
 
96
    # Okay, now decouple from the parent environment
 
97
    os.chdir('/')
 
98
    os.setsid()
 
99
    os.umask(0)
 
100
 
 
101
    # do second fork
 
102
    try:
 
103
        pid = os.fork()
 
104
        if pid > 0:
 
105
            sys.exit(0)
 
106
    except OSError, e:
 
107
        print >> sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror)
 
108
        sys.exit(1)
 
109
 
 
110
    # establish the chrooted environment
 
111
    setup_environment(uid, jail, cwd)
 
112
 
 
113
    signal.signal(signal.SIGALRM, timeout)
 
114
 
 
115
    main_sok = socket.socket(socket.AF_INET)
 
116
    main_sok.bind(('localhost',port))
 
117
    main_sok.listen(1)
 
118
 
 
119
    comp = codeop.CommandCompiler()
 
120
    globs = {}
 
121
    locos = {}
 
122
    globs['__builtins__'] = globals()['__builtins__']
 
123
 
 
124
    global keep_going
 
125
    keep_going = True
 
126
    while keep_going:
 
127
        (sok,addr) = main_sok.accept()
 
128
        # do checks on addr
 
129
 
 
130
        try:
 
131
            first = True
 
132
            for line in req_lines(new_sok):
 
133
                if first:
 
134
                    src = line
 
135
                    first = False
 
136
                else:
 
137
                    src = src + '\n' + line
 
138
                try:
 
139
                    cmd = comp(src)
 
140
                    if cmd is not None:
 
141
                        signal.alarm(5)
 
142
                        res = eval(cmd, globs, locos)
 
143
                        signal.alarm(0)
 
144
                        rval = (out.getvalue(), res, None)
 
145
                        sok.send(cjson.encode(rval) + '\n')
 
146
                        out = cStringIO.StringIO()
 
147
                        sys.stdout = out
 
148
                        first = True
 
149
                except Exception, e:
 
150
                        rval = (None, None, str(e))
 
151
                        sok.send(cjson.encode(rval) + '\n')
 
152
                        out = cStringIO.StringIO()
 
153
                        sys.stdout = out
 
154
                        first = True
 
155
        finally:
 
156
            sok.close()
 
157
 
 
158
 
 
159
    main_sok.shutdown(socket.SHUT_RDWR)