Commit c36cfb56558fd781bfeb0a4a834f9fd9b860cffb

Authored by Miguel Barão
1 parent 43785de6
Exists in master and in 1 other branch dev

- added try/catch to check if certificates are present.

- fixed 3 bugs in serve.py.
- show total topics and questions loaded in logs.
learnapp.py
... ... @@ -287,6 +287,7 @@ def build_dependency_graph(config={}):
287 287  
288 288 # iterate over topics and build graph
289 289 topics = config.get('topics', {})
  290 + tcount = qcount = 0 # topic and question counters
290 291 for ref,attr in topics.items():
291 292 g.add_node(ref)
292 293 tnode = g.node[ref] # current node (topic)
... ... @@ -313,5 +314,8 @@ def build_dependency_graph(config={}):
313 314 tnode['factory'][q['ref']] = QFactory(q)
314 315  
315 316 logger.info(f'{len(tnode["questions"]):6} {ref}')
  317 + qcount += len(tnode["questions"]) # count total questions
  318 + tcount += 1
316 319  
  320 + logger.info(f'Total loaded: {tcount} topics, {qcount} questions')
317 321 return g
... ...
serve.py
... ... @@ -13,7 +13,7 @@ from concurrent.futures import ThreadPoolExecutor
13 13 import tornado.ioloop
14 14 import tornado.web
15 15 import tornado.httpserver
16   -from tornado import template #, gen
  16 +from tornado import template, iostream, gen
17 17  
18 18 from tornado.concurrent import run_on_executor
19 19 from tornado.platform.asyncio import to_tornado_future
... ... @@ -101,7 +101,7 @@ class ChangePasswordHandler(BaseHandler):
101 101 @tornado.web.authenticated
102 102 def post(self):
103 103 uid = self.current_user
104   - pw = self.get_body_arguments('new_password')[0];
  104 + pw = self.get_body_arguments('new_password')[0]
105 105  
106 106 if self.learn.change_password(uid, pw):
107 107 notification = tornado.escape.to_unicode(self.render_string('notification.html', type='success', msg='A password foi alterada!'))
... ... @@ -152,12 +152,13 @@ class TopicHandler(BaseHandler):
152 152 # Based on https://bhch.github.io/posts/2017/12/serving-large-files-with-tornado-safely-without-blocking/
153 153 # ----------------------------------------------------------------------------
154 154 class FileHandler(BaseHandler):
  155 + chunk_size = 4 * 1024 * 1024 # serve up to 4 MiB multiple times
  156 +
155 157 @tornado.web.authenticated
156 158 async def get(self, filename):
157 159 uid = self.current_user
158 160 public_dir = self.learn.get_current_public_dir(uid)
159 161 filepath = path.expanduser(path.join(public_dir, filename))
160   - chunk_size = 1024 * 1024 # serve up to 1MiB multiple times
161 162 try:
162 163 f = open(filepath, 'rb')
163 164 except FileNotFoundError:
... ... @@ -166,7 +167,7 @@ class FileHandler(BaseHandler):
166 167 logging.error(f'No permission: {filepath}')
167 168 else:
168 169 with f:
169   - chunk = f.read(chunk_size)
  170 + chunk = f.read(self.chunk_size)
170 171 while chunk:
171 172 try:
172 173 self.write(chunk) # write the cunk to response
... ... @@ -178,7 +179,7 @@ class FileHandler(BaseHandler):
178 179 del chunk
179 180 await gen.sleep(0.000000001) # 1 nanosecond (hack)
180 181 # in tornnado 5.0 use `await asyncio.sleep(0)` instead
181   - chunk = f.read(chunk_size)
  182 + chunk = f.read(self.chunk_size)
182 183  
183 184  
184 185 # ----------------------------------------------------------------------------
... ... @@ -320,12 +321,17 @@ def main():
320 321 raise e
321 322  
322 323 # --- create webserver
323   - http_server = tornado.httpserver.HTTPServer(webapp,
324   - ssl_options={
325   - "certfile": "certs/cert.pem",
326   - "keyfile": "certs/privkey.pem"
327   - })
328   - http_server.listen(8443)
  324 + try:
  325 + http_server = tornado.httpserver.HTTPServer(webapp,
  326 + ssl_options={
  327 + "certfile": "certs/cert.pem",
  328 + "keyfile": "certs/privkey.pem"
  329 + })
  330 + except ValueError:
  331 + logging.critical('Certificates cert.pem, privkey.pem not found')
  332 + sys.exit(1)
  333 + else:
  334 + http_server.listen(8443)
329 335  
330 336 # --- run webserver
331 337 logging.info('Webserver running...')
... ...
templates/maintopics.html
... ... @@ -98,9 +98,11 @@
98 98 </a>
99 99 {% end %}
100 100 {% end %}
101   - </div> <!-- list-group -->
  101 + </div>
  102 + <!-- list-group -->
102 103 </div>
103 104  
  105 +
104 106 <!-- === Change Password Modal =========================================== -->
105 107 <div id="password_modal" class="modal fade" tabindex="-1" role="dialog">
106 108 <div class="modal-dialog modal-sm" role="document">
... ...