sysvitals_web.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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. 'username': self.get_secure_cookie('username'),
  26. }
  27. def create_session(self, user_id, username):
  28. self.set_secure_cookie('user_id', str(user_id))
  29. self.set_secure_cookie('username', username)
  30. @property
  31. def db(self):
  32. return self.application.db
  33. class MainHandler(BaseHandler):
  34. @tornado.gen.coroutine
  35. def get(self):
  36. groups = servers = None
  37. if self.current_user:
  38. user_id = self.current_user['id']
  39. groups = yield self.db.get_groups(user_id)
  40. servers = yield self.db.get_servers(user_id)
  41. self.render('home.html', groups=groups, servers=servers)
  42. class RegisterHandler(BaseHandler):
  43. @tornado.gen.coroutine
  44. def get(self):
  45. self.render('register.html')
  46. @tornado.gen.coroutine
  47. def post(self):
  48. username = self.get_argument('username', '')
  49. password = self.get_argument('password', '')
  50. user_id = yield self.db.create_user(username, password)
  51. self.create_session(user_id, username)
  52. self.redirect('/')
  53. class LoginHandler(BaseHandler):
  54. @tornado.gen.coroutine
  55. def get(self):
  56. self.render('login.html')
  57. @tornado.gen.coroutine
  58. def post(self):
  59. username = self.get_argument('username', '')
  60. password = self.get_argument('password', '')
  61. user = yield self.db.check_user(username, password)
  62. if user:
  63. self.create_session(user['id'], user['username'])
  64. self.redirect('/')
  65. else:
  66. self.render('login.html')
  67. class LogoutHandler(BaseHandler):
  68. def get(self):
  69. self.clear_all_cookies()
  70. self.redirect('/')
  71. class StatsHandler(BaseHandler):
  72. @tornado.web.authenticated
  73. @tornado.gen.coroutine
  74. def get(self, group_id, server_id):
  75. group_id = int(group_id)
  76. api_key = yield self.db.get_api_key(group_id)
  77. servers = yield self.db.get_servers(self.current_user['id'])
  78. self.render('stats.html', group_id=group_id, api_key=api_key, servers=servers[group_id])
  79. class GroupsHandler(BaseHandler):
  80. @tornado.web.authenticated
  81. @tornado.gen.coroutine
  82. def get(self):
  83. user_id = self.current_user['id']
  84. groups = yield self.db.get_groups(user_id)
  85. self.render('groups.html', groups=groups)
  86. class GroupCreateHandler(BaseHandler):
  87. @tornado.web.authenticated
  88. @tornado.gen.coroutine
  89. def post(self):
  90. yield self.db.create_group(self.current_user['id'], self.get_body_argument('name'))
  91. self.redirect('/')
  92. class GroupInviteHandler(BaseHandler):
  93. @tornado.web.authenticated
  94. @tornado.gen.coroutine
  95. def post(self):
  96. group_id = int(self.get_body_argument('group'))
  97. yield self.db.invite_user_group(self.get_body_argument('username'), group_id)
  98. self.redirect('/')
  99. class CSSHandler(tornado.web.RequestHandler):
  100. def get(self, css_path):
  101. css_path = os.path.join(os.path.dirname(__file__), 'static', css_path) + '.ccss'
  102. with open(css_path, 'r') as f:
  103. self.set_header('Content-Type', 'text/css')
  104. self.write(cleancss.convert(f))
  105. if __name__ == '__main__':
  106. app = tornado.web.Application(
  107. handlers=[
  108. (r'/', MainHandler),
  109. (r'/register', RegisterHandler),
  110. (r'/login', LoginHandler),
  111. (r'/logout', LogoutHandler),
  112. (r'/stats/(\d+)/(\d+)', StatsHandler),
  113. (r'/groups', GroupsHandler),
  114. (r'/groups/create', GroupCreateHandler),
  115. (r'/groups/invite', GroupInviteHandler),
  116. (r'/(css/.+)\.css', CSSHandler),
  117. ],
  118. template_path=os.path.join(os.path.dirname(__file__), 'templates'),
  119. static_path=os.path.join(os.path.dirname(__file__), 'static'),
  120. login_url='/login',
  121. cookie_secret=config.cookie_secret,
  122. debug=config.debug,
  123. )
  124. app.listen(config.web_port)
  125. app.db = db.MomokoDB()
  126. print('listening on :%d' % config.web_port)
  127. tornado.ioloop.IOLoop.instance().start()