124 lines
4.0 KiB
Python
124 lines
4.0 KiB
Python
#!/usr/bin/env python3
|
|
# =======================================================================
|
|
#
|
|
# Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions are met:
|
|
#
|
|
# 1 Redistributions of source code must retain the above copyright notice,
|
|
# this list of conditions and the following disclaimer.
|
|
#
|
|
# 2 Redistributions in binary form must reproduce the above copyright notice,
|
|
# this list of conditions and the following disclaimer in the documentation
|
|
# and/or other materials provided with the distribution.
|
|
#
|
|
# 3 Neither the names of the copyright holders nor the names of the
|
|
# contributors may be used to endorse or promote products derived from this
|
|
# software without specific prior written permission.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
# POSSIBILITY OF SUCH DAMAGE.
|
|
# =======================================================================
|
|
#
|
|
|
|
"""presenter server module"""
|
|
|
|
import os
|
|
import sys
|
|
import signal
|
|
import argparse
|
|
import logging
|
|
|
|
WEB_SERVER = None
|
|
APP_SERVER = None
|
|
RUN_SERVER = None
|
|
SERVER_TYPE = ""
|
|
USAGE_INFO = "python3 prensenter_server.py [-h] --app \n\t\t\t\t{body_pose}"
|
|
|
|
BODY_MAP = {"web_server": "body_pose.src.web",
|
|
"app_server": "body_pose.src.body_pose_server"
|
|
}
|
|
|
|
APP_CONF_MAP = {"body_pose": BODY_MAP}
|
|
|
|
|
|
def arg_parse():
|
|
'''arg_parse'''
|
|
global WEB_SERVER
|
|
global APP_SERVER
|
|
global SERVER_TYPE
|
|
|
|
parser = argparse.ArgumentParser(usage=USAGE_INFO)
|
|
parser.add_argument('--app', type=str, required=True,
|
|
choices=['body_pose'],
|
|
help="Application type corresponding to Presenter Server.")
|
|
args = parser.parse_args()
|
|
SERVER_TYPE = args.app
|
|
app_conf = APP_CONF_MAP.get(SERVER_TYPE)
|
|
|
|
WEB_SERVER = __import__(app_conf.get("web_server"), fromlist=True)
|
|
APP_SERVER = __import__(app_conf.get("app_server"), fromlist=True)
|
|
|
|
def start_app():
|
|
global RUN_SERVER
|
|
# start socket server for presenter agent communication
|
|
RUN_SERVER = APP_SERVER.run()
|
|
if RUN_SERVER is None:
|
|
return False
|
|
|
|
logging.info("presenter server starting, type: %s", SERVER_TYPE)
|
|
# start web ui
|
|
return WEB_SERVER.start_webapp()
|
|
|
|
def stop_app():
|
|
WEB_SERVER.stop_webapp()
|
|
RUN_SERVER.stop_thread()
|
|
|
|
|
|
def close_all_thread(signum, frame):
|
|
'''close all thread of the process, and exit.'''
|
|
logging.info("receive signal, signum:%s, frame:%s", signum, frame)
|
|
stop_app()
|
|
|
|
logging.info("presenter server exit by Ctrl + c")
|
|
|
|
sys.exit()
|
|
|
|
def check_server_exist():
|
|
pid = os.getpid()
|
|
|
|
cmd = "ps -ef|grep -v {}|grep -w presenter_server|grep {}" \
|
|
.format(pid, SERVER_TYPE)
|
|
|
|
ret = os.system(cmd)
|
|
|
|
return ret
|
|
|
|
def main_process():
|
|
'''Main function entrance'''
|
|
arg_parse()
|
|
|
|
if check_server_exist() == 0:
|
|
print("Presenter Server type \"%s\" already exist!" %(SERVER_TYPE))
|
|
return True
|
|
# process signal, when receive "Ctrl + c" signal,
|
|
# stop all thead and exit the progress.
|
|
signal.signal(signal.SIGINT, close_all_thread)
|
|
signal.signal(signal.SIGTERM, close_all_thread)
|
|
start_app()
|
|
|
|
return True
|
|
|
|
if __name__ == "__main__":
|
|
main_process()
|