annotate mamba/forest.py @ 550:91e1a95343b2

Add option to inform CIA of new levels.
author Simon Cross <hodgestar@gmail.com>
date Tue, 20 Sep 2011 17:29:38 +0200
parents 0c5853bb7a14
children 16344424dfcc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
328
af947a20c212 First server.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
1 """Where mamba's hang out with each other."""
af947a20c212 First server.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
2
330
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
3 from werkzeug.utils import secure_filename
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
4 from flask import Flask, request, abort
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
5
496
0c5853bb7a14 Timestamp uncurated level files.
Simon Cross <hodgestar@gmail.com>
parents: 340
diff changeset
6 from datetime import datetime
550
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
7 import xmlrpclib
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
8 import time
330
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
9 import os
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
10 import sys
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
11
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
12 app = Flask(__name__)
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
13 app.config['LEVEL_FOLDER'] = None # set later
550
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
14 app.config['CIA_PROJECT'] = None # set to activate CIA sending
330
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
15
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
16
340
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
17 def path(ctype):
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
18 if ctype == "curated":
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
19 return os.path.join(app.config['LEVEL_FOLDER'], 'curated')
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
20 elif ctype == "uncurated":
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
21 return os.path.join(app.config['LEVEL_FOLDER'], 'uncurated')
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
22 abort(404, "Not found")
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
23
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
24
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
25 def list_levels(folder):
330
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
26 endl = len(".txt")
340
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
27 files = [x[:-endl] for x in os.listdir(folder)
330
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
28 if not x.startswith('.') and x.endswith('.txt')]
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
29 return "\n".join(files)
328
af947a20c212 First server.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
30
af947a20c212 First server.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
31
340
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
32 @app.route("/<ctype>/index")
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
33 def index(ctype):
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
34 ctype = path(ctype)
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
35 return list_levels(ctype)
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
36
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
37
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
38 @app.route("/<ctype>/level/<levelname>")
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
39 def level(ctype, levelname):
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
40 ctype = path(ctype)
330
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
41 levelname = "%s.txt" % secure_filename(levelname)
340
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
42 levelpath = os.path.join(ctype, levelname)
330
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
43 if not os.path.isfile(levelpath):
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
44 abort(404, "Level not found. Hsss.")
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
45 with open(levelpath) as level:
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
46 return level.read()
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
47
328
af947a20c212 First server.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
48
330
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
49 @app.route("/save/<levelname>", methods=['GET', 'POST'])
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
50 def save(levelname):
496
0c5853bb7a14 Timestamp uncurated level files.
Simon Cross <hodgestar@gmail.com>
parents: 340
diff changeset
51 ts = datetime.now().strftime("%Y%m%d.%H%M%S")
0c5853bb7a14 Timestamp uncurated level files.
Simon Cross <hodgestar@gmail.com>
parents: 340
diff changeset
52 levelname = "%s.%s.txt" % (secure_filename(levelname), ts)
340
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
53 levelpath = os.path.join(path("uncurated"), levelname)
330
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
54 if request.method == 'POST':
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
55 if os.path.exists(levelpath):
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
56 abort(409, "Mamba already resident.")
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
57 leveldata = request.form['data'].encode('ascii')
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
58 with open(levelpath, 'w') as level:
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
59 level.write(leveldata)
550
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
60 inform_cia(levelname, "New level uploaded.", branch="uncurated")
330
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
61 return "Ssss."
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
62 else:
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
63 abort(405, "Post levels here. Hsss.")
328
af947a20c212 First server.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
64
af947a20c212 First server.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
65
550
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
66 MAMBA_VERSION = "0.1"
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
67 MAMBA_URL = "https://ctpug.org.za/hg/mamba"
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
68 CIA_URL = "http://cia.navi.cx"
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
69 CIA_MSG_TEMPLATE = """
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
70 <message
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
71 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
72 xsi:noNamespaceSchemaLocation="schema.xsd">
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
73 <generator>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
74 <name>Mutable Mamba Level Server</name>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
75 <version>%(mamba_version)s</version>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
76 <url>%(mamba_url)s</url>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
77 </generator>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
78 <source>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
79 <project>%(project)s</project>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
80 <module>%(module)s</module>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
81 <branch>%(branch)s</branch>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
82 </source>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
83 <timestamp>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
84 %(timestamp)d
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
85 </timestamp>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
86 <body>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
87 <commit>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
88 <revision>%(revision)s</revision>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
89 <author>%(author)s</author>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
90 <files>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
91 <file>%(file)s</file>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
92 </files>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
93 <log>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
94 %(log)s
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
95 </log>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
96 </commit>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
97 </body>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
98 </message>
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
99 """
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
100
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
101
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
102 def inform_cia(filename, log, branch='uncurated'):
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
103 if app.config['CIA_PROJECT'] is None:
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
104 return
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
105 msg = CIA_MSG_TEMPLATE % {
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
106 'mamba_version': MAMBA_VERSION,
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
107 'mamba_url': MAMBA_URL,
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
108 'project': app.config['CIA_PROJECT'],
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
109 'module': 'level-server',
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
110 'branch': branch,
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
111 'timestamp': int(time.time()),
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
112 'revision': '0',
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
113 'author': 'unknown',
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
114 'file': filename,
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
115 'log': log,
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
116 }
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
117 srv = xmlrpclib.Server(CIA_URL)
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
118 srv.hub.deliver(msg)
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
119
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
120
328
af947a20c212 First server.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
121 if __name__ == "__main__":
550
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
122 if len(sys.argv) not in (3, 4):
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
123 print ("Usage: python -m mamba.forest <port> <level folder>"
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
124 " [<cia project>]")
330
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
125 sys.exit(1)
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
126
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
127 host = '0.0.0.0'
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
128 port = int(sys.argv[1])
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
129 level_folder = sys.argv[2]
340
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
130 for ctype in ("curated", "uncurated"):
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
131 folder = os.path.join(level_folder, ctype)
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
132 if not os.path.exists(folder):
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
133 os.makedirs(folder)
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
134 if not os.path.isdir(folder):
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
135 print "Level folder must be a folder."
5456db312f7f Curated and uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 330
diff changeset
136 sys.exit(1)
550
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
137 cia_project = sys.argv[3] if len(sys.argv) > 3 else None
330
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
138
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
139 app.config['LEVEL_FOLDER'] = level_folder
550
91e1a95343b2 Add option to inform CIA of new levels.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
140 app.config['CIA_PROJECT'] = cia_project
330
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
141 # app.debug = True
a2724d0078d8 Mamba in a flask.
Simon Cross <hodgestar@gmail.com>
parents: 328
diff changeset
142 app.run(host=host, port=port)