sysvitals_web.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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('/')
  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('/')
  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.web.authenticated
  68. @tornado.gen.coroutine
  69. def get(self):
  70. groups = servers = None
  71. user_id = self.current_user['id']
  72. groups = yield self.db.get_groups(user_id)
  73. servers = yield self.db.get_servers(user_id)
  74. self.render('servers.html', groups=groups, servers=servers)
  75. class StatsHandler(BaseHandler):
  76. @tornado.web.authenticated
  77. @tornado.gen.coroutine
  78. def get(self, group_id, server_id):
  79. group_id = int(group_id)
  80. api_key = yield self.db.get_api_key(group_id)
  81. servers = yield self.db.get_servers(self.current_user['id'])
  82. self.render('stats.html', group_id=group_id, api_key=api_key, servers=servers[group_id])
  83. class GroupsHandler(BaseHandler):
  84. @tornado.web.authenticated
  85. @tornado.gen.coroutine
  86. def get(self):
  87. user_id = self.current_user['id']
  88. groups = yield self.db.get_groups(user_id)
  89. self.render('groups.html', groups=groups)
  90. class GroupCreateHandler(BaseHandler):
  91. @tornado.web.authenticated
  92. @tornado.gen.coroutine
  93. def post(self):
  94. yield self.db.create_group(self.current_user['id'], self.get_body_argument('name'))
  95. self.redirect('/')
  96. class GroupInviteHandler(BaseHandler):
  97. @tornado.web.authenticated
  98. @tornado.gen.coroutine
  99. def post(self):
  100. group_id = int(self.get_body_argument('group'))
  101. yield self.db.invite_user_group(self.get_body_argument('email'), group_id)
  102. self.redirect('/')
  103. class CSSHandler(tornado.web.RequestHandler):
  104. def get(self, css_path):
  105. css_path = os.path.join(os.path.dirname(__file__), 'static', css_path) + '.ccss'
  106. with open(css_path, 'r') as f:
  107. self.set_header('Content-Type', 'text/css')
  108. self.write(cleancss.convert(f))
  109. if __name__ == '__main__':
  110. app = tornado.web.Application(
  111. handlers=[
  112. (r'/', MainHandler),
  113. (r'/register', RegisterHandler),
  114. (r'/login', LoginHandler),
  115. (r'/logout', LogoutHandler),
  116. (r'/servers', ServersHandler),
  117. (r'/stats/(\d+)/(\d+)', StatsHandler),
  118. (r'/groups', GroupsHandler),
  119. (r'/groups/create', GroupCreateHandler),
  120. (r'/groups/invite', GroupInviteHandler),
  121. (r'/(css/.+)\.css', CSSHandler),
  122. ],
  123. template_path=os.path.join(os.path.dirname(__file__), 'templates'),
  124. static_path=os.path.join(os.path.dirname(__file__), 'static'),
  125. login_url='/login',
  126. cookie_secret=config.cookie_secret,
  127. debug=config.debug,
  128. )
  129. app.listen(config.web_port)
  130. app.db = db.MomokoDB()
  131. print('listening on :%d' % config.web_port)
  132. tornado.ioloop.IOLoop.instance().start()