设为首页 收藏本站
查看: 952|回复: 0

[经验分享] pythonxml-rpc记录(游戏自动发布)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-7-22 08:59:01 | 显示全部楼层 |阅读模式
#!/usr/bin/python
# -*- encoding=utf-8 -*-

####################################
from SimpleXMLRPCServer import SimpleXMLRPCServer
from SocketServer import ThreadingMixIn
import subprocess, os.path, os, stat
import re, getopt, sys

ERR_INSECURE = '[INSECURE_NAME]'
ERR_NO_SCRIPT = '[NO_SCRIPT]'
ERR_DUP_SCRIPT = '[DUP_SCRIPT]'
ERR_OK = '[OK]'

PT = re.compile(r'^[0-9a-zA-Z\._]*$')

SCRIPT_DIR = 'script' #will be init to absolute path

class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):pass

#############################################
def hello():
    print "hello,world!"

def is_name_secure(script_name):
    global PT
    if PT.match(script_name):
        return True


def init_script_path():
    '''Init script_dir to absolute dir'''
    global SCRIPT_DIR
    SCRIPT_DIR = os.path.join(os.path.dirname(__file__), SCRIPT_DIR)

def get_file_data(script_name):
    global SCRIPT_DIR
    full_name = os.path.join(SCRIPT_DIR, script_name)
    with open(full_name, 'rb') as f:
        return f.read()

def single_process():
    import platform

    pf = platform.system()
    if pf == 'Linux':
        import fcntl

        pid_file ='/var/run/rpc.pid'
        fp = open(pid_file,'w')

        try:
            fcntl.lockf(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
        except IOError:
            # another instance is running
            sys.exit(0)

def install(prefix):
    main_path = os.path.join(prefix, "rpc")
    if not os.path.isdir(main_path):
        os.makedirs(main_path)

    log_path = os.path.join(main_path, "log")
    if not os.path.isdir(log_path):
        os.makedirs(log_path, 0777)

    script_path = os.path.join(main_path, "script")
    if not os.path.isdir(script_path):
        os.makedirs(script_path)

    target_file = os.path.join(main_path, "rpc.py")
    if not os.path.isfile(target_file):
        #os.renames(__file__, target_file)
        os.system ("cp %s %s" % (__file__, target_file))
        os.chmod(target_file, stat.S_IRWXU|stat.S_IRWXG|stat.S_IROTH)

    with open('/etc/crontab', 'a+') as f:
        has_croned = False
        for line in f.readlines():
            if line.find('rpc.py') >= 0 and line.lstrip()[0] != '#':
                break
        else:# not found
            #f.seek(0, os.SEEK_END)
            f.write('*/1 * * * * root %s >> %s 2>&1 &\n'%(target_file, os.path.join(log_path, 'rpc.log')))

    print 'install ok.'
#############################################
def run_script(script_name, *args):
    global SCRIPT_DIR
    if not is_name_secure(script_name):
        return ERR_INSECURE
    full_name = os.path.join(SCRIPT_DIR, script_name)
    if not os.path.isfile(full_name):
        return ERR_NO_SCRIPT
    print "run:" + full_name, args
    return check_output([full_name] + list(args))

def set_script(script_name, data):
    global SCRIPT_DIR
    if not is_name_secure(script_name):
        return ERR_INSECURE
    full_name = os.path.join(SCRIPT_DIR, script_name)
    if os.path.isfile(full_name):
        return ERR_DUP_SCRIPT
    print "set:" + full_name, len(data), 'bytes'
    with open(full_name, 'wb') as f:
        f.write(data)
    os.chmod(full_name, stat.S_IRWXU|stat.S_IRWXG|stat.S_IROTH)
    return ERR_OK

def list_all():
    pass
#############################################

def check_output(*popenargs, **kwargs):
    r"""Run command with arguments and return its output as a byte string.

    If the exit code was non-zero it raises a CalledProcessError.  The
    CalledProcessError object will have the return code in the returncode
    attribute and output in the output attribute.

    The arguments are the same as for the Popen constructor.  Example:

    >>> check_output(["ls", "-l", "/dev/null"])
    'crw-rw-rw- 1 root root 1, 3 Oct 18  2007 /dev/null\n'

    The stdout argument is not allowed as it is used internally.
    To capture standard error in the result, use stderr=STDOUT.

    >>> check_output(["/bin/sh", "-c",
    ...               "ls -l non_existent_file ; exit 0"],
    ...              stderr=STDOUT)
    'ls: non_existent_file: No such file or directory\n'
    """
    if 'stdout' in kwargs:
        raise ValueError('stdout argument not allowed, it will be overridden.')
    process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs)
    output, unused_err = process.communicate()
    retcode = process.poll()
    if retcode:
        cmd = kwargs.get("args")
        if cmd is None:
            cmd = popenargs[0]
        raise subprocess.CalledProcessError(retcode, cmd, output=output)
    return output
#############################################
def serve_forever():
    svr=ThreadXMLRPCServer(("", 8282), allow_none=True)
    svr.register_function(hello)
    svr.register_function(run_script)
    svr.register_function(set_script)
    svr.register_function(list_all)
    print 'running at :8282'
    svr.serve_forever()

if __name__ == '__main__':
    args = sys.argv[1:]
    if len(args) == 0: #server
        init_script_path()
        single_process()
        serve_forever()
    else: #client
        init_script_path()
        opts, args = getopt.getopt(sys.argv[1:], "i:h:s:a:")
        host = None
        script_name = None
        arg_str = ''
        prefix = ''
        for o, a in opts:
            if o == "-h":
                host = a
            elif o == "-s":
                script_name = a
            elif o == "-a":
                arg_str = a
            elif o == "-i":
                prefix = a
                install(prefix)
                exit()
        if host and script_name:
            from xmlrpclib import ServerProxy
            svr=ServerProxy("http://%s:8282"%host)
            ret = svr.run_script(script_name, *arg_str.split())
            print ret
            if ret == ERR_NO_SCRIPT:
                ret = svr.set_script(script_name, get_file_data(script_name))
                print ret
                if ret == ERR_OK:
                    ret = svr.run_script(script_name, *arg_str.split())
                    print ret




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-22461-1-1.html 上篇帖子: linux 全自动提权 exp perl脚本 下篇帖子: python基础(序列,元祖,列表,字典,对象,类) 记录 游戏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表