main.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import traceback
  4. import thread
  5. import signal
  6. import time
  7. import jimit as ji
  8. import json
  9. import os
  10. import sys
  11. from flask import g
  12. from models import Utils
  13. from models.event_processor import EventProcessor
  14. from models.initialize import app, logger, q_ws
  15. import api_route_table
  16. import views_route_table
  17. from models import Database as db
  18. from api.os_init import blueprint as os_init_blueprint
  19. from api.os_init import blueprints as os_init_blueprints
  20. from api.os_init_write import blueprint as os_init_write_blueprint
  21. from api.os_init_write import blueprints as os_init_write_blueprints
  22. from api.os_template import blueprint as os_template_blueprint
  23. from api.os_template import blueprints as os_template_blueprints
  24. from api.guest import blueprint as guest_blueprint
  25. from api.guest import blueprints as guest_blueprints
  26. from api.disk import blueprint as disk_blueprint
  27. from api.disk import blueprints as disk_blueprints
  28. from api.config import blueprint as config_blueprint
  29. from api.log import blueprint as log_blueprint
  30. from api.log import blueprints as log_blueprints
  31. from api.host import blueprint as host_blueprint
  32. from api.host import blueprints as host_blueprints
  33. from views.guest import blueprint as view_guest_blueprint
  34. from views.guest import blueprints as view_guest_blueprints
  35. from websockify.websocketproxy import WebSocketProxy
  36. __author__ = 'James Iter'
  37. __date__ = '2017/3/31'
  38. __contact__ = 'james.iter.cn@gmail.com'
  39. __copyright__ = '(c) 2017 by James Iter.'
  40. def instantiation_ws_vnc(listen_port, target_host, target_port):
  41. # 用于 Web noVNC 代理
  42. ws = WebSocketProxy(listen_host="0.0.0.0", listen_port=listen_port, target_host=target_host,
  43. target_port=target_port, run_once=True, daemon=True, idle_timeout=10)
  44. ws.start_server()
  45. def ws_engine_for_vnc():
  46. while True:
  47. payload = q_ws.get()
  48. payload = json.loads(payload)
  49. c_pid = os.fork()
  50. if c_pid == 0:
  51. instantiation_ws_vnc(payload['listen_port'], payload['target_host'], payload['target_port'])
  52. # 因为 WebSocketProxy 使用了 daemon 参数,所以当执行到 ws.start_server() 时,会退出其所在的子进程,
  53. # 故而这里设置wait来处理结束的子进程的环境,避免出现僵尸进程。
  54. os.wait()
  55. q_ws.task_done()
  56. @app.before_request
  57. @Utils.dumps2response
  58. def r_before_request():
  59. try:
  60. g.ts = ji.Common.ts()
  61. except ji.JITError, e:
  62. ret = json.loads(e.message)
  63. return ret
  64. # noinspection PyBroadException
  65. try:
  66. db.init_conn_mysql()
  67. thread.start_new_thread(db.keepalived_mysql, ())
  68. db.init_conn_redis()
  69. app.register_blueprint(os_init_blueprint)
  70. app.register_blueprint(os_init_blueprints)
  71. app.register_blueprint(os_init_write_blueprint)
  72. app.register_blueprint(os_init_write_blueprints)
  73. app.register_blueprint(os_template_blueprint)
  74. app.register_blueprint(os_template_blueprints)
  75. app.register_blueprint(guest_blueprint)
  76. app.register_blueprint(guest_blueprints)
  77. app.register_blueprint(disk_blueprint)
  78. app.register_blueprint(disk_blueprints)
  79. app.register_blueprint(config_blueprint)
  80. app.register_blueprint(log_blueprint)
  81. app.register_blueprint(log_blueprints)
  82. app.register_blueprint(host_blueprint)
  83. app.register_blueprint(host_blueprints)
  84. app.register_blueprint(view_guest_blueprint)
  85. app.register_blueprint(view_guest_blueprints)
  86. except:
  87. logger.error(traceback.format_exc())
  88. if __name__ == '__main__':
  89. # noinspection PyBroadException
  90. try:
  91. signal.signal(signal.SIGTERM, Utils.signal_handle)
  92. signal.signal(signal.SIGINT, Utils.signal_handle)
  93. pid = os.fork()
  94. if pid == 0:
  95. ws_engine_for_vnc()
  96. else:
  97. # 父进程退出时,会清理所有提前退出的子进程的环境。所以这里无需对子进程做等待操作。
  98. # 即:即使子进程提前退出,且因父进程没有做wait处理,使其变成了僵尸进程。但当父进程退出时,会对因其所产生的僵尸进程做统一清理操作。
  99. thread.start_new_thread(EventProcessor.launch, ())
  100. Utils.thread_counter += 1
  101. app.run(host=app.config['jimv_listen'], port=app.config['jimv_port'], use_reloader=False, threaded=True)
  102. while Utils.thread_counter > 0:
  103. time.sleep(1)
  104. print 'Main say bye-bye!'
  105. except:
  106. logger.error(traceback.format_exc())
  107. exit(-1)