sysvitals_web.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. #!/usr/bin/env python3
  2. import os
  3. import urllib.parse
  4. import cleancss
  5. import tornado.gen
  6. import tornado.escape
  7. import tornado.httpclient
  8. import tornado.ioloop
  9. import tornado.web
  10. import config
  11. import db
  12. class BaseHandler(tornado.web.RequestHandler):
  13. def render(self, *args, **kwargs):
  14. kwargs['api_host'] = config.api_host
  15. kwargs['web_host'] = config.web_host
  16. return super(BaseHandler, self).render(*args, **kwargs)
  17. def render_string(self, *args, **kwargs):
  18. s = super(BaseHandler, self).render_string(*args, **kwargs)
  19. return s.replace(b'\n', b'') # this is like Django's {% spaceless %}
  20. def get_current_user(self):
  21. user_id = self.get_secure_cookie('user_id')
  22. if user_id:
  23. return {
  24. 'id': int(user_id),
  25. 'email': self.get_secure_cookie('email'),
  26. }
  27. def create_session(self, user_id, email):
  28. self.set_secure_cookie('user_id', str(user_id))
  29. self.set_secure_cookie('email', email)
  30. @property
  31. def db(self):
  32. return self.application.db
  33. class MainHandler(BaseHandler):
  34. @tornado.gen.coroutine
  35. def get(self):
  36. self.render('home.html')
  37. class RegisterHandler(BaseHandler):
  38. @tornado.gen.coroutine
  39. def get(self):
  40. self.render('register.html')
  41. @tornado.gen.coroutine
  42. def post(self):
  43. email = self.get_argument('email', '').lower()
  44. password = self.get_argument('password', '')
  45. user_id = yield self.db.create_user(email, password)
  46. self.create_session(user_id, email)
  47. self.redirect('/groups')
  48. class LoginHandler(BaseHandler):
  49. @tornado.gen.coroutine
  50. def get(self):
  51. self.render('login.html')
  52. @tornado.gen.coroutine
  53. def post(self):
  54. email = self.get_argument('email', '')
  55. password = self.get_argument('password', '')
  56. user = yield self.db.check_user(email, password)
  57. if user:
  58. self.create_session(user['id'], user['email'])
  59. self.redirect('/servers')
  60. else:
  61. self.render('login.html')
  62. class LogoutHandler(BaseHandler):
  63. def get(self):
  64. self.clear_all_cookies()
  65. self.redirect('/')
  66. class ServersHandler(BaseHandler):
  67. @tornado.gen.coroutine
  68. def get(self):
  69. if self.current_user:
  70. user_id = self.current_user['id']
  71. demo = False
  72. else:
  73. user_id = 1
  74. demo = True
  75. groups = yield self.db.get_groups(user_id)
  76. servers = yield self.db.get_servers(user_id)
  77. self.render('servers.html', groups=groups, servers=servers, demo=demo)
  78. class StatsHandler(BaseHandler):
  79. @tornado.gen.coroutine
  80. def get(self, group_id, server_id):
  81. group_id = int(group_id)
  82. if self.current_user:
  83. user_id = self.current_user['id']
  84. demo = False
  85. elif group_id == 1:
  86. user_id = 1
  87. demo = True
  88. else:
  89. raise tornado.web.HTTPError(401)
  90. servers = yield self.db.get_servers(user_id)
  91. if group_id not in servers:
  92. raise tornado.web.HTTPError(403)
  93. api_key = yield self.db.get_api_key(group_id)
  94. self.render('stats.html', group_id=group_id, api_key=api_key, servers=servers[group_id], demo=demo)
  95. class GroupsHandler(BaseHandler):
  96. @tornado.web.authenticated
  97. @tornado.gen.coroutine
  98. def get(self):
  99. user_id = self.current_user['id']
  100. groups = yield self.db.get_groups(user_id)
  101. self.render('groups.html', groups=groups)
  102. class GroupCreateHandler(BaseHandler):
  103. @tornado.web.authenticated
  104. @tornado.gen.coroutine
  105. def post(self):
  106. yield self.db.create_group(self.current_user['id'], self.get_body_argument('name'))
  107. self.redirect('/groups')
  108. class GroupInviteHandler(BaseHandler):
  109. @tornado.web.authenticated
  110. @tornado.gen.coroutine
  111. def post(self):
  112. group_id = int(self.get_body_argument('group'))
  113. yield self.db.invite_user_group(self.current_user['id'], self.get_body_argument('email'), group_id)
  114. self.redirect('/groups')
  115. class CSSHandler(tornado.web.RequestHandler):
  116. def get(self, css_path):
  117. css_path = os.path.join(os.path.dirname(__file__), 'static', css_path) + '.ccss'
  118. with open(css_path, 'r') as f:
  119. self.set_header('Content-Type', 'text/css')
  120. self.write(cleancss.convert(f))
  121. if __name__ == '__main__':
  122. app = tornado.web.Application(
  123. handlers=[
  124. (r'/', MainHandler),
  125. (r'/register', RegisterHandler),
  126. (r'/login', LoginHandler),
  127. (r'/logout', LogoutHandler),
  128. (r'/servers', ServersHandler),
  129. (r'/stats/(\d+)/(\d+)', StatsHandler),
  130. (r'/groups', GroupsHandler),
  131. (r'/groups/create', GroupCreateHandler),
  132. (r'/groups/invite', GroupInviteHandler),
  133. (r'/(css/.+)\.css', CSSHandler),
  134. ],
  135. template_path=os.path.join(os.path.dirname(__file__), 'templates'),
  136. static_path=os.path.join(os.path.dirname(__file__), 'static'),
  137. login_url='/login',
  138. cookie_secret=config.cookie_secret,
  139. debug=config.debug,
  140. )
  141. app.listen(config.web_port)
  142. app.db = db.MomokoDB()
  143. print('listening on :%d' % config.web_port)
  144. tornado.ioloop.IOLoop.instance().start()