sysvitals_web.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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['host'] = config.host
  15. return super(BaseHandler, self).render(*args, **kwargs)
  16. def render_string(self, *args, **kwargs):
  17. s = super(BaseHandler, self).render_string(*args, **kwargs)
  18. return s.replace(b'\n', b'') # this is like Django's {% spaceless %}
  19. def get_current_user(self):
  20. user_id = self.get_secure_cookie('user_id')
  21. if user_id:
  22. return {
  23. 'id': int(user_id),
  24. 'username': self.get_secure_cookie('username'),
  25. }
  26. def create_session(self, user_id, username):
  27. self.set_secure_cookie('user_id', str(user_id))
  28. self.set_secure_cookie('username', username)
  29. @property
  30. def db(self):
  31. return self.application.db
  32. class MainHandler(BaseHandler):
  33. @tornado.gen.coroutine
  34. def get(self):
  35. groups = servers = None
  36. if self.current_user:
  37. user_id = self.current_user['id']
  38. groups = yield self.db.get_groups(user_id)
  39. servers = yield self.db.get_servers(user_id)
  40. self.render('home.html', groups=groups, servers=servers)
  41. class RegisterHandler(BaseHandler):
  42. @tornado.gen.coroutine
  43. def get(self):
  44. self.render('register.html')
  45. @tornado.gen.coroutine
  46. def post(self):
  47. username = self.get_argument('username', '')
  48. password = self.get_argument('password', '')
  49. user_id = yield self.db.create_user(username, password)
  50. self.create_session(user_id, username)
  51. self.redirect('/')
  52. class LoginHandler(BaseHandler):
  53. @tornado.gen.coroutine
  54. def get(self):
  55. self.render('login.html')
  56. @tornado.gen.coroutine
  57. def post(self):
  58. username = self.get_argument('username', '')
  59. password = self.get_argument('password', '')
  60. user = yield self.db.check_user(username, password)
  61. if user:
  62. self.create_session(user['id'], user['username'])
  63. self.redirect('/')
  64. else:
  65. self.render('login.html')
  66. class LogoutHandler(BaseHandler):
  67. def get(self):
  68. self.clear_all_cookies()
  69. self.redirect('/')
  70. class StatsHandler(BaseHandler):
  71. @tornado.gen.coroutine
  72. def get(self, group_id, server_id):
  73. group_id = int(group_id)
  74. servers = yield self.db.get_servers(self.current_user['id'])
  75. self.render('stats.html', group_id=group_id, servers=servers[group_id])
  76. class GroupCreateHandler(BaseHandler):
  77. @tornado.gen.coroutine
  78. def post(self):
  79. yield self.db.create_group(self.current_user['id'], self.get_body_argument('name'))
  80. self.redirect('/')
  81. class CSSHandler(tornado.web.RequestHandler):
  82. def get(self, css_path):
  83. css_path = os.path.join(os.path.dirname(__file__), 'static', css_path) + '.ccss'
  84. with open(css_path, 'r') as f:
  85. self.set_header('Content-Type', 'text/css')
  86. self.write(cleancss.convert(f))
  87. if __name__ == '__main__':
  88. app = tornado.web.Application(
  89. handlers=[
  90. (r'/', MainHandler),
  91. (r'/register', RegisterHandler),
  92. (r'/login', LoginHandler),
  93. (r'/logout', LogoutHandler),
  94. (r'/stats/(\d+)/(\d+)', StatsHandler),
  95. (r'/groups/create', GroupCreateHandler),
  96. (r'/(css/.+)\.css', CSSHandler),
  97. ],
  98. template_path=os.path.join(os.path.dirname(__file__), 'templates'),
  99. static_path=os.path.join(os.path.dirname(__file__), 'static'),
  100. login_url='/login',
  101. cookie_secret=config.cookie_secret,
  102. debug=config.debug,
  103. )
  104. app.listen(config.web_port)
  105. app.db = db.MomokoDB()
  106. print('listening on :%d' % config.web_port)
  107. tornado.ioloop.IOLoop.instance().start()