Exemple #1
0
def __load_project_file(options):
    jname = 'poker/project.json'
    datadict = __load_json_file(options, jname, list)

    if not datadict:
        return datadict

    game_packages = []
    gameids = []

    for proj in datadict:
        ppath = proj.get('path', None)
        if not isinstance(ppath, str):
            return actlog.error('the project path is not defined !', proj)
        if not fsutils.dirExists(ppath):
            return actlog.error('the project path not found !', ppath)

        srcpath = fsutils.appendPath(ppath, 'src')
        if fsutils.dirExists(srcpath):
            subdirs = os.listdir(srcpath)
            for subdir in subdirs:
                gamepy = fsutils.appendPath(srcpath, subdir, 'game.py')
                if fsutils.fileExists(gamepy):
                    if subdir in game_packages:
                        return actlog.error(
                            'the project package is double defined !', gamepy,
                            'proj=', proj)
                    game_packages.append(subdir)
                    proj['package'] = subdir
                    gameid = proj.get('gameId', 0)
                    if gameid > 0:
                        gameids.append(int(gameid))
                    actlog.log('find gam project-> GAMEID=', gameid,
                               'PACKAGE=', subdir)
    return datadict, game_packages, gameids
Exemple #2
0
def action(options):
    '''
    生成所有的进程启动脚本
    '''
    bin_path = options.env['bin_path']
    config_redis = options.pokerdict.get('local_config_redis',
                                         options.pokerdict['config_redis'])
    remotepy = loadResource('remote.py')
    remotepy = remotepy.replace('${TIME}', str(datetime.now()))
    remotepy = remotepy.replace('${BIN_PATH}', bin_path)
    remotepy = remotepy.replace('${LOG_PATH}', options.env['log_path'])
    remotepy = remotepy.replace('${REDIS_CONFIG}', config_redis)

    cfilepath = fsutils.appendPath(bin_path, 'remote.py')
    fsutils.writeFile('', cfilepath, remotepy)

    if options.pokerdict['mode'] <= 2:
        sendmail = '1'
    else:
        sendmail = '0'

    while1sh = loadResource('while1.sh')
    while1sh = while1sh.replace('${SENDMAIL}', sendmail)
    while1sh = while1sh.replace('${BIN_PATH}', bin_path)
    while1sh = while1sh.replace('${LOG_PATH}', options.env['log_path'])

    if os.environ.get('RUN_IN_DOCKER', 0):
        # 在开发docker模式下,设置PYTHONPATH环境变量
        paths = []
        for proj in options.projectlist:
            src = fsutils.appendPath(proj['path'], 'src')
            if fsutils.dirExists(src):
                paths.append(src)
            else:
                src = fsutils.appendPath(proj['path'], 'freetime')
                if fsutils.dirExists(src):
                    paths.append(proj['path'])
        paths.reverse()
        paths = ':'.join(paths)
        while1sh = while1sh.replace('${DOCKER_PROJECT_PATH}', paths)
        actlog.log('makeControlInDocker PYTHONPATH=', paths)

    shfile = fsutils.appendPath(bin_path, 'while1.sh')
    fsutils.writeFile('', shfile, while1sh)
    os.chmod(shfile, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)

    return 1
Exemple #3
0
def action(options):
    '''
    生成所有的进程启动脚本
    '''
    bin_path = options.env['bin_path']
    config_redis = options.pokerdict.get('local_config_redis', options.pokerdict['config_redis'])
    remotepy = loadResource('remote.py')
    remotepy = remotepy.replace('${TIME}', str(datetime.now()))
    remotepy = remotepy.replace('${BIN_PATH}', bin_path)
    remotepy = remotepy.replace('${LOG_PATH}', options.env['log_path'])
    remotepy = remotepy.replace('${REDIS_CONFIG}', config_redis)

    cfilepath = fsutils.appendPath(bin_path, 'remote.py')
    fsutils.writeFile('', cfilepath, remotepy)

    if options.pokerdict['mode'] <= 2 :
        sendmail = '1'
    else:
        sendmail = '0'

    while1sh = loadResource('while1.sh')
    while1sh = while1sh.replace('${SENDMAIL}', sendmail)
    while1sh = while1sh.replace('${BIN_PATH}', bin_path)
    while1sh = while1sh.replace('${LOG_PATH}', options.env['log_path'])

    if os.environ.get('RUN_IN_DOCKER', 0):
        # 在开发docker模式下,设置PYTHONPATH环境变量
        paths = []
        for proj in options.projectlist:
            src = fsutils.appendPath(proj['path'], 'src')
            if fsutils.dirExists(src):
                paths.append(src)
            else:
                src = fsutils.appendPath(proj['path'], 'freetime')
                if fsutils.dirExists(src):
                    paths.append(proj['path'])
        paths.reverse()
        paths = ':'.join(paths)
        while1sh = while1sh.replace('${DOCKER_PROJECT_PATH}', paths)
        actlog.log('makeControlInDocker PYTHONPATH=', paths)

    shfile = fsutils.appendPath(bin_path, 'while1.sh')
    fsutils.writeFile('', shfile, while1sh)
    os.chmod(shfile, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)

    return 1
Exemple #4
0
def main():
    from optparse import OptionParser
    from tyserver.tyutils import fsutils
    
    parser = OptionParser(version="%prog 1.0", usage="%prog --path entrancepath --port Num")  
    parser.add_option("--path", dest="pokerpath", default=None,
                      help="must specified the service entrance path, the poker.json's path")  
    parser.add_option("--httpport", dest="httpport", default=None,
                      help="the http port")  

    options, _ = parser.parse_args()
    pokerpath = options.pokerpath
    if not pokerpath :
        print "must specified the service entrance path"
        parser.print_help()
        return None

    pokerpath = fsutils.makeAsbpath(options.pokerpath)
    if not fsutils.dirExists(pokerpath) :
        print "the service entrance path not exists [" + pokerpath + ']'
        parser.print_help()
        return None

    setattr(options, 'pokerpath', pokerpath)

    port = options.httpport
    try:
        port = int(options.httpport)
        setattr(options, 'httpport', port)
    except:
        print "the http port must be a integer"
        parser.print_help()
        return

    workpath = fsutils.getParentDir(__file__, 1)
    setattr(options, 'workpath', workpath)

    fpath = os.environ.get('LOGDIR', '')
    if not fpath :
        fpath = fsutils.appendPath(workpath, './../logs')
        fpath = fsutils.abspath(fpath)
        fsutils.makeDirs(fpath)
    setattr(options, 'logpath', fpath)

    print "pokerpath =", options.pokerpath
    print "httpport  =", options.httpport
    print "workpath  =", options.workpath

    flogfile = fsutils.appendPath(fpath, 'webmagr.log') 
    setattr(options, 'logfile', flogfile)

    from tyserver.server import startup
    from webmgr.manager import initialize, heartbeat
    setattr(options, 'initialize', initialize)
    setattr(options, 'heartbeat', heartbeat)
    startup(options)
Exemple #5
0
def make_static_json_file(options, alldata):
    confs = {}
    _load_decorations(options, confs, alldata)
    _load_activity(options, confs, alldata)
    _load_gamelist2(options, confs, alldata)
    webroot = options.env['webroot_path'] + '/static_file/'
    staticjson = webroot + 'static.json'
    if not fsutils.dirExists(webroot):
        fsutils.makeDirs(webroot)
    fsutils.writeFile('', staticjson, confs)
    _remake_static_zip(options, confs, alldata)
    return 1
Exemple #6
0
def make_static_json_file(options, alldata):
    confs = {}
    _load_decorations(options, confs, alldata)
    _load_activity(options, confs, alldata)
    _load_gamelist2(options, confs, alldata)
    webroot = options.env['webroot_path'] + '/static_file/'
    staticjson = webroot + 'static.json'
    if not fsutils.dirExists(webroot) :
        fsutils.makeDirs(webroot)
    fsutils.writeFile('', staticjson, confs)
    _remake_static_zip(options, confs, alldata)
    return 1
Exemple #7
0
def action(options):
    '''
    拷贝源代码工程的webroot到编译输出目录,按照配置文件的工程列表进行顺序覆盖拷贝
    '''
    actlog.log('copy webroot to bin/webroot')

    if os.environ.get('RUN_IN_DOCKER', 0):
        # 在开发docker模式下,webroot为link模式,无需拷贝
        actlog.log('docker mode skip this step !')
        return 1

    allpaths = [
        options.env['webroot_path'],
        options.env['backup_path'],
    ]
    for mp in allpaths:
        fsutils.makePath(mp, False)

    paths = []
    for proj in options.projectlist:
        src = fsutils.appendPath(proj['path'], 'webroot')
        if fsutils.dirExists(src):
            paths.append({
                'path': src,
                'include': [],
                'exclude': [".*\\.svn\\.*", ".*pyc"]
            })

    if options.pokerdict['mode'] in (1, 2):
        fsutils.copyTree(paths, options.env['webroot_path'], logfun=actlog.log)
        return 1

    # MODE 3, 4: 只链接, 并且只链接 tygame-webroot/webroot
    dstpath = options.env['webroot_path']
    for pathconf in paths:
        if 'tygame-webroot' in pathconf['path']:
            srcpath = pathconf['path']
            if os.path.islink(dstpath):
                if os.readlink(dstpath) == srcpath:  # 已经链接好了
                    actlog.log('already linked.', dstpath, '->', srcpath)
                    return 1
            fsutils.deletePath(dstpath)
            os.symlink(srcpath, dstpath)
            actlog.log('symlink created.', dstpath, '->', srcpath)
            return 1
    else:
        fsutils.copyTree(paths, options.env['webroot_path'], logfun=actlog.log)
    return 1
Exemple #8
0
def action(options):
    '''
    拷贝源代码工程的webroot到编译输出目录,按照配置文件的工程列表进行顺序覆盖拷贝
    '''
    actlog.log('copy webroot to bin/webroot')

    if os.environ.get('RUN_IN_DOCKER', 0) :
        # 在开发docker模式下,webroot为link模式,无需拷贝
        actlog.log('docker mode skip this step !')
        return 1

    allpaths = [
                options.env['webroot_path'],
                options.env['backup_path'],
    ]
    for mp in allpaths:
        fsutils.makePath(mp, False)

    paths = []
    for proj in options.projectlist :
        src = fsutils.appendPath(proj['path'], 'webroot')
        if fsutils.dirExists(src) :
            paths.append({'path':src, 'include' : [], 'exclude' : [".*\\.svn\\.*", ".*pyc"]})

    if options.pokerdict['mode'] in (1, 2):
        fsutils.copyTree(paths, options.env['webroot_path'], logfun=actlog.log)
        return 1

    # MODE 3, 4: 只链接, 并且只链接 tygame-webroot/webroot
    dstpath = options.env['webroot_path']
    for pathconf in paths:
        if 'tygame-webroot' in pathconf['path']:
            srcpath = pathconf['path']
            if os.path.islink(dstpath):
                if os.readlink(dstpath) == srcpath:  # 已经链接好了
                    actlog.log('already linked.', dstpath, '->', srcpath)
                    return 1
            fsutils.deletePath(dstpath)
            os.symlink(srcpath, dstpath)
            actlog.log('symlink created.', dstpath, '->', srcpath)
            return 1
    else:
        fsutils.copyTree(paths, options.env['webroot_path'], logfun=actlog.log)
    return 1
Exemple #9
0
def action(options):
    """
    拷贝源代码工程的etc、src、src-robot、webroot到编译输出目录,按照配置文件的工程列表进行顺序覆盖拷贝
    """
    # 创建所有的路径
    allpaths = [
        options.env['log_path'],
        options.env['webroot_path'],
        options.env['backup_path'],
    ]
    for mp in allpaths:
        fsutils.makePath(mp, False)
    allpaths = [
        options.env['bin_path']
    ]
    for mp in allpaths:
        fsutils.makePath(mp, True)

    if os.environ.get('RUN_IN_DOCKER', 0):
        # 在开发docker模式下,webroot为link模式,无需拷贝
        copySourceInDocker(options)
        actlog.log('docker mode use original project src path !')
        return 1

    paths = []
    for proj in options.projectlist:
        src = fsutils.appendPath(proj['path'], 'src')
        if fsutils.dirExists(src):
            paths.append({'path': src, 'include': [], 'exclude': [".*\\.svn\\.*", ".*pyc"]})
        else:  # freetime project
            paths.append({'path': proj['path'],
                          "include": ["^/freetime/.*"],
                          "exclude": [".*\\.svn\\.*",
                                      ".*pyc",
                                      ".*\\logserver\\.*",
                                      ".*\\cold-data-server\\.*"]})

    if ide_debug():
        _, copy_files = fsutils.linkTree(paths, options.env['bin_path'], logfun=actlog.log)
    else:
        _, copy_files = fsutils.copyTree(paths, options.env['bin_path'], logfun=actlog.log)
    setattr(options, '_pyfiles', copy_files)

    return 1
Exemple #10
0
def main():
    from tyserver.tyutils import fsutils
    actlog._with_std = 1

    options = parse_cmd_lines()
    if not hasattr(options, 'pokerpath'):
        useage()
        actlog.log('You must input -m <poker path>')
        return
    if not hasattr(options, 'action'):
        useage()
        actlog.log('You Must input -a <action>')
        return

    pokerpath = options.pokerpath
    if not pokerpath:
        actlog.log("must specified the service entrance path")
        useage()
        return None

    pokerpath = fsutils.makeAsbpath(options.pokerpath)
    if not fsutils.dirExists(pokerpath):
        actlog.log("the service entrance path not exists [" + pokerpath + ']')
        useage()
        return None

    setattr(options, 'pokerpath', pokerpath)

    workpath = fsutils.getParentDir(__file__, 1)
    setattr(options, 'workpath', workpath)

    fpath = os.environ.get('LOGDIR', '')
    if fpath and fsutils.dirExists(fpath):
        fpath = fsutils.abspath(fpath)
        setattr(options, 'logpath', fpath)
        ct = datetime.now().strftime('%Y%m%d%H%M%S')
        actlog.open_act_log(options, {'uuid': ct})
    else:
        setattr(options, 'logpath', None)

    actlog.log("pokerpath =", options.pokerpath)
    actlog.log("workpath  =", options.workpath)
    actlog.log("logpath   =", options.logpath)

    flogfile = fsutils.appendPath(fpath, 'webmagr.log')
    setattr(options, 'logfile', flogfile)

    actlog.log("action    =", options.action)
    if options.action == 'config_check':
        action = {'action': 'config_check', 'params': {}}
        thread_do_action(options, action)
        return

    if options.action == 'config_reload':
        action = {'action': 'config_reload', 'params': {}}
        thread_do_action(options, action)
        return

    if options.action == 'config_update':
        keys = []
        if hasattr(options, 'keys'):
            keys = options.keys.split(',')
        action = {'action': 'config_update', 'params': {'keys': keys}}
        thread_do_action(options, action)
        return

    if options.action == 'config_reset':
        action = {'action': 'config_update', 'params': {'reset': 1}}
        thread_do_action(options, action)
        return

    if options.action == 'config_status':
        action = {'action': 'config_status', 'params': {}}
        thread_do_action(options, action)
        return

    if options.action == 'compile':
        action = {'action': 'compile_source', 'params': {}}
        thread_do_action(options, action)
        return

    if options.action == 'start':
        action = {'action': 'config_compile_start', 'params': {}}
        thread_do_action(options, action)
        return

    if options.action == 'reset':
        if not hasattr(options, 'serverIds'):
            useage()
            actlog.log('You must input -sid XXX,XXX')
            return
        processids = options.serverIds.split(',')
        if not processids:
            useage()
            actlog.log('You must input -sid XXX,XXX')
            return
        action = {'action': 'reset', 'params': {'processids': processids}}
        thread_do_action(options, action)
        return

    if options.action == 'stop':
        action = {'action': 'stop_all_process', 'params': {}}
        thread_do_action(options, action)
        return

    if options.action == 'push_code':
        action = {'action': 'push_bin', 'params': {}}
        thread_do_action(options, action)
        return

    if options.action == 'push_web':
        action = {'action': 'push_web', 'params': {}}
        thread_do_action(options, action)
        return

    hotfixwait = 1
    if options.action == 'hotfix_nowait':
        options.action = 'hotfix'
        hotfixwait = 0
    setattr(options, 'hotfixwait', hotfixwait)

    if options.action == 'hotfix':
        if not hasattr(options, 'serverIds'):
            useage()
            actlog.log('You must input -sid XXX,XXX or -sid all')
            return
        if not hasattr(options, 'hotfixpy'):
            useage()
            actlog.log('You Must input -py xxxx.py')
            return
        hotfix.action(options)
        return

    if options.action == 'rm_logs':
        action = {'action': 'remove_all_logs', 'params': {}}
        thread_do_action(options, action)
        return

    actlog.log('unknow action of :', options.action)
    useage()
Exemple #11
0
def __load_poker_file(options):
    pokerfile = options.pokerfile
    actlog.log('LOAD POKER FILE      :', pokerfile)
    pokerdict = fsutils.readJsonFile(pokerfile, True)
    pokerdict['poker_path'] = options.poker_path

    if not isinstance(pokerdict, dict):
        return actlog.error('POKER FILE : format error,must be a dict')

    gameId = pokerdict.get('id', None)
    if not isinstance(gameId, int) or gameId <= 0 or gameId >= 10000:
        return actlog.error('POKER FILE : id value is wrong')

    gameName = pokerdict.get('name', None)
    if not isinstance(gameName, (str, unicode)) or len(gameName) <= 0:
        return actlog.error('POKER FILE : name value is wrong')
    if gameName.find('-') >= 0:
        return actlog.error(
            'POKER FILE : name value is wrong, can not have "-" (reserved char)'
        )

    corporation = pokerdict.get('corporation', 'tuyoo')
    if corporation not in ('tuyoo', 'momo'):
        return actlog.error(
            'POKER FILE : corporation value wrong, choice: tuyoo or momo')
    pokerdict['corporation'] = corporation

    mode = pokerdict.get('mode', 0)
    if mode not in (1, 2, 3, 4):
        return actlog.error(
            'POKER FILE : mode value must be an integer, choice : 1(online) or 2(simulation) or 3(rich test) or 4(tiny test)'
        )

    port_redis = pokerdict.get('port_redis', 0)
    if not actutils.check_port(port_redis, True):
        return actlog.error(
            'POKER FILE : port_redis, socket port number wrong ' +
            str(port_redis))
    pokerdict['port_redis'] = port_redis

    local_internet = pokerdict.get('local_internet', '')
    if not isinstance(local_internet, (str, unicode)):
        return actlog.error('POKER FILE : local_internet value is wrong')
    pokerdict['local_internet'] = local_internet

    local_intranet = __get_value(pokerdict, 'local_intranet', None)
    if not isinstance(local_intranet, (str, unicode)):
        return actlog.error('POKER FILE : local_intranet value is wrong')
    pokerdict['local_intranet'] = local_intranet

    port_http = int(__get_value(pokerdict, 'port_http', 0))
    if not actutils.check_port(port_http, True):
        return actlog.error(
            'POKER FILE : port_http, socket port number wrong ' +
            str(port_http))
    pokerdict['port_http'] = port_http

    projects_path = __get_value(pokerdict, 'projects_path', None)
    if not isinstance(projects_path, str):
        return actlog.error(
            'POKER FILE : projects_path wrong, must pointing to the projects path'
        )
    projects_path = fsutils.makeAsbpath(projects_path, pokerfile)
    if not fsutils.dirExists(projects_path):
        return actlog.error(
            'POKER FILE : projects_path, the path not exists [' +
            projects_path + ']')
    pokerdict['projects_path'] = projects_path

    output_path = __get_value(pokerdict, 'output_path', None)
    if not isinstance(output_path, str):
        return actlog.error(
            'POKER FILE : output_path wrong, must pointing to the compile output path'
        )
    output_path = fsutils.makeAsbpath(output_path, pokerfile)
    if not fsutils.dirExists(output_path):
        return actlog.error(
            'POKER FILE : output_path wrong, the path not exists [' +
            output_path + ']')
    pokerdict['output_path'] = output_path

    http = __get_value(pokerdict, 'http_sdk', '')
    if not actutils.check_http_url(http, 'POKER FILE : http_sdk'):
        return 0
    pokerdict['http_sdk'] = http

    http = __get_value(pokerdict, 'http_sdk_inner', None)
    if http != None and not actutils.check_http_url(
            http, 'POKER FILE : http_sdk_inner'):
        return 0
    pokerdict['http_sdk_inner'] = http

    http = __get_value(pokerdict, 'http_game', None)
    if http != None and not actutils.check_http_url(http,
                                                    'POKER FILE : http_game'):
        return 0
    pokerdict['http_game'] = http

    http = __get_value(pokerdict, 'http_download', None)
    if http != None and not actutils.check_http_url(
            http, 'POKER FILE : http_download'):
        return 0
    pokerdict['http_download'] = http

    http = __get_value(pokerdict, 'http_gdss', None)
    if http != None and not actutils.check_http_url(http,
                                                    'POKER FILE : http_gdss'):
        return 0
    pokerdict['http_gdss'] = http

    config_redis = __get_value(pokerdict, 'config_redis', None)
    if not isinstance(config_redis, str):
        return actlog.error(
            'POKER FILE : config_redis wrong, must pointing to the configure redis <ip>:<port>:<dbid>'
        )
    confdb = config_redis.split(':')
    if len(confdb) != 3:
        return actlog.error(
            'POKER FILE : config_redis wrong, must pointing to the configure redis <ip>:<port>:<dbid>'
        )
    pokerdict['config_redis'] = config_redis

    return pokerdict
Exemple #12
0
def main():
    from tyserver.tyutils import fsutils
    actlog._with_std = 1

    options = parse_cmd_lines()
    if not hasattr(options, 'pokerpath') :
        useage()
        actlog.log('You must input -m <poker path>')
        return
    if not hasattr(options, 'action') :
        useage()
        actlog.log('You Must input -a <action>')
        return

    pokerpath = options.pokerpath
    if not pokerpath :
        actlog.log("must specified the service entrance path")
        useage()
        return None

    pokerpath = fsutils.makeAsbpath(options.pokerpath)
    if not fsutils.dirExists(pokerpath) :
        actlog.log("the service entrance path not exists [" + pokerpath + ']')
        useage()
        return None

    setattr(options, 'pokerpath', pokerpath)

    workpath = fsutils.getParentDir(__file__, 1)
    setattr(options, 'workpath', workpath)

    fpath = os.environ.get('LOGDIR', '')
    if fpath and fsutils.dirExists(fpath):
        fpath = fsutils.abspath(fpath)
        setattr(options, 'logpath', fpath)
        ct = datetime.now().strftime('%Y%m%d%H%M%S')
        actlog.open_act_log(options, {'uuid':ct})
    else:
        setattr(options, 'logpath', None)

    actlog.log("pokerpath =", options.pokerpath)
    actlog.log("workpath  =", options.workpath)
    actlog.log("logpath   =", options.logpath)

    flogfile = fsutils.appendPath(fpath, 'webmagr.log') 
    setattr(options, 'logfile', flogfile)
    
    actlog.log("action    =", options.action)
    if options.action == 'config_check' :
        action = {'action' : 'config_check',
                  'params':{}}
        thread_do_action(options, action)
        return

    if options.action == 'config_reload' :
        action = {'action' : 'config_reload',
                  'params':{}}
        thread_do_action(options, action)
        return

    if options.action == 'config_update' :
        keys = []
        if hasattr(options, 'keys') :
            keys =  options.keys.split(',')
        action = {'action' : 'config_update',
                  'params':{'keys' : keys}}
        thread_do_action(options, action)
        return

    if options.action == 'config_reset' :
        action = {'action' : 'config_update',
                  'params':{'reset' : 1}}
        thread_do_action(options, action)
        return

    if options.action == 'config_status' :
        action = {'action' : 'config_status',
                  'params':{}}
        thread_do_action(options, action)
        return
    
    if options.action == 'compile' :
        action = {'action' : 'compile_source',
                  'params':{}}
        thread_do_action(options, action)
        return

    if options.action == 'start' :
        action = {'action' : 'config_compile_start',
                  'params':{}}
        thread_do_action(options, action)
        return

    if options.action == 'reset' :
        if not hasattr(options, 'serverIds') :
            useage()
            actlog.log('You must input -sid XXX,XXX')
            return
        processids = options.serverIds.split(',')
        if not processids :
            useage()
            actlog.log('You must input -sid XXX,XXX')
            return
        action = {'action' : 'reset',
                  'params':{'processids' : processids}}
        thread_do_action(options, action)
        return
    
    if options.action == 'stop' :
        action = {'action' : 'stop_all_process',
                  'params':{}}
        thread_do_action(options, action)
        return
    
    if options.action == 'push_code' :
        action = {'action' : 'push_bin',
                  'params':{}}
        thread_do_action(options, action)
        return

    if options.action == 'push_web' :
        action = {'action' : 'push_web',
                  'params':{}}
        thread_do_action(options, action)
        return

    hotfixwait = 1
    if options.action == 'hotfix_nowait' :
        options.action = 'hotfix'
        hotfixwait = 0
    setattr(options, 'hotfixwait', hotfixwait)
        
    if options.action == 'hotfix' :
        if not hasattr(options, 'serverIds') :
            useage()
            actlog.log('You must input -sid XXX,XXX or -sid all')
            return
        if not hasattr(options, 'hotfixpy') :
            useage()
            actlog.log('You Must input -py xxxx.py')
            return
        hotfix.action(options)
        return

    if options.action == 'rm_logs' :
        action = {'action' : 'remove_all_logs',
                  'params':{}}
        thread_do_action(options, action)
        return

    actlog.log('unknow action of :', options.action)
    useage()