| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- import traceback
- import thread
- import signal
- import time
- import jimit as ji
- import json
- import os
- from flask import g
- from models import Utils
- from models.event_processor import EventProcessor
- from models.initialize import app, logger, q_ws
- import api_route_table
- import views_route_table
- from models import Database as db
- from api.boot_job import blueprint as boot_job_blueprint
- from api.boot_job import blueprints as boot_job_blueprints
- from api.operate_rule import blueprint as operate_rule_blueprint
- from api.operate_rule import blueprints as operate_rule_blueprints
- from api.os_template import blueprint as os_template_blueprint
- from api.os_template import blueprints as os_template_blueprints
- from api.guest import blueprint as guest_blueprint
- from api.guest import blueprints as guest_blueprints
- from api.disk import blueprint as disk_blueprint
- from api.disk import blueprints as disk_blueprints
- from api.config import blueprint as config_blueprint
- from api.log import blueprint as log_blueprint
- from api.log import blueprints as log_blueprints
- from api.host import blueprint as host_blueprint
- from api.host import blueprints as host_blueprints
- from api.performance import blueprint as performance_blueprint
- from api.performance import blueprints as performance_blueprints
- from views.guest import blueprint as view_guest_blueprint
- from views.guest import blueprints as view_guest_blueprints
- from views.disk import blueprint as view_disk_blueprint
- from views.disk import blueprints as view_disk_blueprints
- from websockify.websocketproxy import WebSocketProxy
- __author__ = 'James Iter'
- __date__ = '2017/3/31'
- __contact__ = 'james.iter.cn@gmail.com'
- __copyright__ = '(c) 2017 by James Iter.'
- def instantiation_ws_vnc(listen_port, target_host, target_port):
- # 用于 Web noVNC 代理
- ws = WebSocketProxy(listen_host="0.0.0.0", listen_port=listen_port, target_host=target_host,
- target_port=target_port, run_once=True, daemon=True, idle_timeout=10)
- ws.start_server()
- def ws_engine_for_vnc():
- while True:
- payload = q_ws.get()
- payload = json.loads(payload)
- c_pid = os.fork()
- if c_pid == 0:
- instantiation_ws_vnc(payload['listen_port'], payload['target_host'], payload['target_port'])
- # 因为 WebSocketProxy 使用了 daemon 参数,所以当执行到 ws.start_server() 时,会退出其所在的子进程,
- # 故而这里设置wait来处理结束的子进程的环境,避免出现僵尸进程。
- os.wait()
- q_ws.task_done()
- @app.before_request
- @Utils.dumps2response
- def r_before_request():
- try:
- g.ts = ji.Common.ts()
- except ji.JITError, e:
- ret = json.loads(e.message)
- return ret
- # noinspection PyBroadException
- try:
- db.init_conn_mysql()
- thread.start_new_thread(db.keepalived_mysql, ())
- db.init_conn_redis()
- app.register_blueprint(boot_job_blueprint)
- app.register_blueprint(boot_job_blueprints)
- app.register_blueprint(operate_rule_blueprint)
- app.register_blueprint(operate_rule_blueprints)
- app.register_blueprint(os_template_blueprint)
- app.register_blueprint(os_template_blueprints)
- app.register_blueprint(guest_blueprint)
- app.register_blueprint(guest_blueprints)
- app.register_blueprint(disk_blueprint)
- app.register_blueprint(disk_blueprints)
- app.register_blueprint(config_blueprint)
- app.register_blueprint(log_blueprint)
- app.register_blueprint(log_blueprints)
- app.register_blueprint(host_blueprint)
- app.register_blueprint(host_blueprints)
- app.register_blueprint(performance_blueprint)
- app.register_blueprint(performance_blueprints)
- app.register_blueprint(view_guest_blueprint)
- app.register_blueprint(view_guest_blueprints)
- app.register_blueprint(view_disk_blueprint)
- app.register_blueprint(view_disk_blueprints)
- except:
- logger.error(traceback.format_exc())
- if __name__ == '__main__':
- # noinspection PyBroadException
- try:
- signal.signal(signal.SIGTERM, Utils.signal_handle)
- signal.signal(signal.SIGINT, Utils.signal_handle)
- pid = os.fork()
- if pid == 0:
- ws_engine_for_vnc()
- else:
- # 父进程退出时,会清理所有提前退出的子进程的环境。所以这里无需对子进程做等待操作。
- # 即:即使子进程提前退出,且因父进程没有做wait处理,使其变成了僵尸进程。但当父进程退出时,会对因其所产生的僵尸进程做统一清理操作。
- thread.start_new_thread(EventProcessor.launch, ())
- Utils.thread_counter += 1
- app.run(host=app.config['jimv_listen'], port=app.config['jimv_port'], use_reloader=False, threaded=True)
- while Utils.thread_counter > 0:
- time.sleep(1)
- print 'Main say bye-bye!'
- except:
- logger.error(traceback.format_exc())
- exit(-1)
|