def transfer(self, files, dest_dir):
md5 = {}
def md5sum(file):
return run("md5sum %s | awk '{print $1}'" % file)
def wget_files(filenames, dest_dir):
mk_remote_dir(dest_dir)
with cd(dest_dir):
for each_filename in filenames:
#?????????????????ip?????????????????????md5??????????md5?????????????????????????wget -O?????!!)????????????????
file_exits = file_exists_check(each_filename)
if file_exits:
if md5[each_filename] == md5sum(each_filename):
break
run('''{0} -O {1} --header="Host:{2}" http://{3}/{1}'''.format(WGET, each_filename, self.server_name, self.source_ext_ip))
@hosts(self.source_ip)
def _transfer(files, dest_dir):
filenames = retrieve_file_names(files)
root_dir = '/app/opbak/download_{}_{}'.format(TIMESTAMP, self.server_name)
with setting_trans_env(self.server_name):
for each_file in files:
filename = os.path.basename(each_file)
md5[filename] = md5sum(each_file)
with cd(root_dir):
run('ln -sf {} {}'.format(each_file, filename))
execute(wget_files, filenames, dest_dir, hosts=[self.target_ip])
@hosts(self.source_ip)
def _copy(files, dest_dir):
for each_file in files:
run('{} {} {}/'.format(RSYNC, each_file, dest_dir))
def _execute_transfer():
if self.source_ip == self.target_ip:
execute(_copy, files, dest_dir)
else:
execute(_transfer, files, dest_dir)
if self._debug:
_execute_transfer()
else:
with settings(hide('everything')):
_execute_transfer()
#End class Uploader
########################################################################
python类execute()的实例源码
def upload_log(self, logtype=None, date=None, logfile=None, ftp_ip=None):
"""
An example: pandora --ftp -r 30 -t 1200 -z -m 42.62.119.164 /tjmob_log/tjmob_37wan_1 /app/tjmob_37wan_1/backend/logs/game/dayreport/dayreport_2015-05-03.log.bz2*
"""
from bible.utils import BZIP2
ftp_log_path = '/{}_log/{}'.format(self.game, self.name)
logtypes = ['dayreport', 'rtreport']
date = date if date else time.strftime('%Y-%m-%d')
ftp_ip = ftp_ip if ftp_ip else '42.62.119.164'
if logfile:
logfiles = [logfile]
else:
if logtype:
logfiles = ['/app/{0}/backend/logs/game/{1}/{1}_{2}.log'.format(self.name, logtype, date)]
else:
logfiles = ['/app/{0}/backend/logs/game/{1}/{1}_{2}.log'.format(self.name, each_logtype, date) for each_logtype in logtypes]
@hosts(self.int_ip)
def _upload_log():
for each_log in logfiles:
dir, filename = os.path.split(each_log)
with cd(dir):
file_bz2 = '{}.bz2'.format(filename)
file_md5 = '{}.MD5'.format(file_bz2)
run('[ -f {0} ] && echo "{0} already exists" || {1} {2}'.format(file_bz2, BZIP2, filename))
run('[ -f {0} ] && echo "{0} already exists" || md5sum {1} >{0}'.format(file_md5, file_bz2))
run('''pandora --ftp -r 30 -t 1200 -z -m {} {} {}.bz2*'''.format(ftp_ip, ftp_log_path, each_log) )
execute(_upload_log)
#class Resource(object):
# """
# ????????????????????????????????
# ?????????????????
#
# """
# def __init__(self,
#
# def upload(self, file):
# dir, filename = os.path.split(file)
# resource_dir = '/app/www/{}/{}/{}'.format(game, RELEASE_TYPE, TIMESTAMP)
# resource_ip = gameOption('www_ssh_ip')
# execute(mk_remote_dir, resource_dir, hosts=[resource_ip])
# local('rsync -aP {}/{{{},md5.txt}} {}:{}/'.format(dir, filename, resource_ip, resource_dir))
#
# def download(self, file):
# remote_dir, filename = os.path.split(file)
# mk_remote_dir(REMOTE_DIR)
# with cd(remote_dir):
# wget = 'wget -c -t 10 -T 10 -q'
# server_name = gameOption('www_header')
# for each_file in [filename, 'md5.txt']:
# run('''{} --header="Host:{}" http://{}/{}/{}/{}/{}'''.format(wget, server_name, gameOption('www_ip'), game, RELEASE_TYPE, TIMESTAMP, each_file))
# run('dos2unix md5.txt && md5sum -c md5.txt')
def flush(self, gameservers, command, table=None, path=None):
locate_gameservers = self.game_pj.transform(gameservers)
ips = locate_gameservers.keys()
def _flush(gameserver, http_port):
base_url = 'http://127.0.0.1:{}/root/gateway.action'.format(http_port)
real_url = '{}?command={}'.format(base_url, command)
if table is not None:
real_url += '&tableName={}'.format(table)
if path is not None:
real_url += '&path={}'.format(path)
return run('curl "{}"'.format(real_url))
def _flush_task():
if path is not None:
download_from_resource(self.game, path)
ret = {}
for gameserver in locate_gameservers[env.host_string]:
print('Working on {}...'.format(gameserver))
http_port = get_http_port(gameserver)
result = _flush(gameserver, http_port)
_result = result.lower()
success_tags = ['succ', 'success']
if any(each in _result for each in success_tags):
ret[gameserver] = (True, result)
else:
ret[gameserver] = (False, result)
return ret
result = execute(_flush_task, hosts=ips)
total = {}
for each_result in result:
for each_gameserver in result[each_result]:
total[each_gameserver] = result[each_result][each_gameserver]
return total