cgi-script almost working
[progcomp2013.git] / qchess / qchess.cgi
1 #!/usr/bin/python
2
3 # CGI wrapper to qchess
4
5 import sys
6 import os
7
8 import cgi
9 import subprocess
10 import time
11 import threading
12
13
14 def open_fifo(name, mode, timeout=None):
15         if timeout == None:
16                 return open(name, mode)
17         
18         
19         class Worker(threading.Thread):
20                 def __init__(self):
21                         threading.Thread.__init__(self)
22                         self.result = None
23                         
24                 def run(self):          
25                         self.result = open(name, mode)
26                 
27
28         w = Worker()
29         w.start()
30         
31         start = time.time()
32         while time.time() - start < timeout:
33                 if w.is_alive() == False:
34                         w.join()
35                         return w.result
36                 time.sleep(0.1)
37         
38         
39         if w.is_alive():
40                 #sys.stderr.write("FIFO_TIMEOUT!\n")
41                 if mode == "r":
42                         f = open(name, "w")
43                 else:
44                         f = open(name, "r")
45                         
46                 #sys.stderr.write("Opened other end!\n")
47                 while w.is_alive():
48                         time.sleep(0.1)
49                         
50                 w.join()
51                 f.close()
52                 w.result.close()
53                 raise Exception("FIFO_TIMEOUT")
54         else:
55                 w.join()
56                 return w.result
57
58 def quit():
59         try:
60                 fifo_out = open_fifo("../cgi-data/"+client+".in", "w", 5)
61         except:
62                 pass
63         else:
64                 fifo_out.write("quit\n")
65                 fifo_out.close()
66                 
67         try:
68                 fifo_in = open_fifo("../cgi-data/"+client+".out", "w", 5)
69         except:
70                 pass
71         else:
72                 s = fifo_in.readline().strip(" \r\n")
73                 while s != "":
74                         #print s
75                         s = fifo_in.readline().strip(" \r\n")
76                         fifo_in.close()
77         time.sleep(0.5)
78         
79         
80
81
82 def main(argv):
83         global client
84         #form = cgi.FieldStorage()
85         #client = cgi.escape(os.environ["REMOTE_ADDR"])
86         
87         client = "127.0.0.1"
88         
89         
90         print "Content-Type: text/plain\r\n\r\n"
91
92         
93         try:
94                 request = argv[1]
95         except:
96                 request = None
97
98         
99         try:
100                 x = int(argv[1])        
101                 y = int(argv[2])
102         except:
103                 if request == "quit":
104                         quit()
105                         return 0
106                 
107                 if os.path.exists("../cgi-bin/"+client+".in") and os.path.exists("../cgi-bin/"+client+".out"):
108                         print "Error: Game in progress expects x and y"
109                         return 1
110                 else:
111                         print "NEW GAME"
112                         args = ["./qchess.py"]
113                         if request == None:
114                                 args += ["@fifo:../cgi-data/"+client, "@internal:AgentBishop"]
115                         elif request == "eigengame":
116                                 args += ["--server=progcomp.ucc.asn.au", "@fifo:../cgi-data/"+client]
117                         subprocess.Popen(args)
118                         time.sleep(1)
119                         
120         else:
121                 
122                 fifo_out = open_fifo("../cgi-data/"+client+".in", "w")
123                 fifo_out.write("%d %d\n" % (x, y))
124                 fifo_out.close()
125                 
126                 
127         
128         sys.stderr.write("\ncgi read from fifo here\n")
129         try:
130                 fifo_in = open_fifo("../cgi-data/"+client+".out", "r")
131         except:
132                 quit()
133         else:
134                 sys.stderr.write("Opened fine\n")
135                 s = fifo_in.readline().strip(" \r\n")
136         
137                 while s != "SELECT?" and s != "MOVE?" and s.split(" ")[0] not in ["white", "black"]:
138                         if s != "":
139                                 print s
140                         s = fifo_in.readline().strip(" \r\n")
141                 print s
142                 fifo_in.close()
143                 if s.split(" ")[0] in ["white", "black"]:
144                         quit()
145         
146         sys.stderr.write("Done\n")
147         return 0
148
149
150 if __name__ == "__main__":
151         try:
152                 sys.exit(main(sys.argv))
153         except Exception, e:
154                 print "Exception: ", e
155                 sys.exit(1)

UCC git Repository :: git.ucc.asn.au