sysvitals_web.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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.gen.coroutine
  73. def get(self, group_id, server_id):
  74. group_id = int(group_id)
  75. api_key = yield self.db.get_api_key(group_id)
  76. servers = yield self.db.get_servers(self.current_user['id'])
  77. self.render('stats.html', group_id=group_id, api_key=api_key, servers=servers[group_id])
  78. class GroupCreateHandler(BaseHandler):
  79. @tornado.gen.coroutine
  80. def post(self):
  81. yield self.db.create_group(self.current_user['id'], self.get_body_argument('name'))
  82. self.redirect('/')
  83. class CSSHandler(tornado.web.RequestHandler):
  84. def get(self, css_path):
  85. css_path = os.path.join(os.path.dirname(__file__), 'static', css_path) + '.ccss'
  86. with open(css_path, 'r') as f:
  87. self.set_header('Content-Type', 'text/css')
  88. self.write(cleancss.convert(f))
  89. if __name__ == '__main__':
  90. app = tornado.web.Application(
  91. handlers=[
  92. (r'/', MainHandler),
  93. (r'/register', RegisterHandler),
  94. (r'/login', LoginHandler),
  95. (r'/logout', LogoutHandler),
  96. (r'/stats/(\d+)/(\d+)', StatsHandler),
  97. (r'/groups/create', GroupCreateHandler),
  98. (r'/(css/.+)\.css', CSSHandler),
  99. ],
  100. template_path=os.path.join(os.path.dirname(__file__), 'templates'),
  101. static_path=os.path.join(os.path.dirname(__file__), 'static'),
  102. login_url='/login',
  103. cookie_secret=config.cookie_secret,
  104. debug=config.debug,
  105. )
  106. app.listen(config.web_port)
  107. app.db = db.MomokoDB()
  108. print('listening on :%d' % config.web_port)
  109. tornado.ioloop.IOLoop.instance().start()