pythonxml-rpc记录(游戏自动发布)

#!/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

				
时间: 2024-10-26 05:52:55

pythonxml-rpc记录(游戏自动发布)的相关文章

游戏自动发布系统思路

⑴ftp.rsync.shell实现游戏资源自动发布至cdn集群; ⑵利用svn的hooks.python实现游戏代码自动发布至web集群; 游戏自动发布系统思路

svn hooks的post-commit(游戏自动发布)

#!/bin/sh # POST-COMMIT HOOK # # The post-commit hook is invoked after a commit.  Subversion runs # this hook by invoking a program (script, executable, binary, etc.) # named 'post-commit' (for which this file is a template) with the # following orde

Azure 基础:用 PowerShell 自动发布 CloudServices

在软件的开发过程中,自动化的编译和部署能够带来很多的优势.下面我们聊聊如何自动发布云应用程序到 azure 上的 cloud services. 打包要发布的内容 首先使用 msbuild 编译 *.ccproj 文件,我们需要使用生成产物中的:app.publish\xxx.cspkgapp.publish\yyy.cscfg 下载 publishsettings 文件 使用你的 Azure 账号登录下面的地址,就可以下载 publishsettings 文件(国际版):https://man

利用GitHook实现博客园文章的备份和自动发布

在使用vscode中的writecnblog插件时有所启发,链接: 用vscode写博客和发布,大家可以看看. 我们在本地可以利用git轻松实现博客园文章的历史记录管理,利用博客园的MetaWeblog API 别人的介绍编写小程序来自动化上传文章(参考插件). 更进一步,将这个程序放到githook里,每次commit时自动执行,就实现了现博客园文章的备份和自动发布. 这样,你每次发布文章的步骤就简化为: 编写本地一个Git仓库内的xx.md文件 commit更改 程序会自动获取diff,然后

利用GitHook实现博客园文章的备份和自动发布.md

在使用vscode中的writecnblog插件时有所启发,链接: [用vscode写博客和发布](https://www.cnblogs.com/caipeiyu/p/5475761.html),大家可以看看. 我们在本地可以利用git轻松实现博客园文章的历史记录管理,利用博客园的MetaWeblog API [别人的介绍](https://www.cnblogs.com/caipeiyu/p/5354341.html)编写小程序来自动化上传文章(参考插件). 更进一步,将这个程序放到gith

node js 修改js代码自动发布到服务器

重新修改js代码后,不需要手动重启服务.需要安装supervisor 工具替代手工. 在联网的前提下在cmd中输入npm install supervisor -g 命令行会自动安装supervisor 工具 然后启动服务时就不用node  XXX.js  使用supervisor XXX.js后 修改js后不再需要手动重启node服务,supervisor 会自动发布最新修改的代码.

raspberry pi 自动发布天气信息到QQ空间/微博

raspberry pi 自动发布天气信息到QQ空间/微博 参考链接: https://aoaoao.me/951.html/comment-page-1 http://www.ipip5.com/today/api.php?type=json 说明: 天气信息来自于百度地图API,历史上的今天来自于网络API(见上). 准备工作: 安装python(没有的,自行下载安装) 安装requests: git clone git://github.com/kennethreitz/requests.

ExtJS4.2 Grid知识点六:自动选中指定记录、自动选中全部记录、反向选择

本节主要学习ExtJS4.2 Grid自动选中指定记录.自动选中全部记录.反向选择,即在表格Grid加载数据后自动将符合条件的记录行选中,示例图片: 示例代码  /  在线演示 本例是通过监听Grid的afterrender事件来实现自动选择指定记录行,代码如下实现自动选中性别为男性的记录行: 自动选中指定记录代码 'userlist': {     afterrender: function(testGrid){//侦听goodslistview渲染           // 选中所有记录  

使用VisualSVN Server自动发布站点

使用VisualSVN Server自动发布站点可以节省大量的发布时间. 适用于项目测试版本 通常一个项目在测试阶段会遇到以下问题 1.开发人员修改缺陷要实时反应到测试环境 2.项目经理想让客户及时看到缺陷修改的结果 3.不要求测试环境程序稳定,但要求更新及时 4.部署人员想偷懒 5.位于不同地点.但各自都可以发布版本的小团队 下面看看步骤 1.在SVN服务器上第一次checkout版本 "D:/Program Files/VisualSVN Server/bin/svn.exe" c