# coding: UTF-8
import os
import sys
import salt.client
import salt.config
import time
from ftplib import FTP, FTP_TLS
import json
from subprocess import Popen, PIPE, STDOUT
agent_ids = agent_ip.split(\',\')
if \'{\' in sys_type:
sys_types=json.loads(sys_type)
else:
sys_types={}
for i in agent_ids:
sys_types.update({i:sys_type})
def get_source_file_path(source_file_path,agent_id):
global sys_types
sys_type=sys_types.get(agent_id)
if sys_type == \'windows\':
if source_file_path.startswith(\'/\'):
source_file_path=\'c:\'+source_file_path
source_file_path = source_file_path.replace(\'\\\\\', \'/\')
source_file_path = source_file_path.replace(\'\\\', \'/\')
source_file_path=source_file_path.decode(\'gbk\')
print source_file_path
else:
if isinstance(source_file_path, unicode):
source_file_path = source_file_path.encode(\'utf8\')
file_paths = source_file_path.split(\'\n\')
return file_paths
if isinstance(ftp_dir, unicode):
ftp_dir = ftp_dir.encode(\'utf8\')
BASE_URL = os.getenv(\'ANT_BASEURL\')
fail = []
success = []
def agent_to_proxy():
global agent_ids, source_file_path, success, fail, BASE_URL
proxy_path = os.getenv(\'ANT_MODULE_ROOT\', \'\')
master_conf = os.path.join(proxy_path, \'conf\', \'master\')
if not os.path.exists(master_conf):
print(\'Proxy 路径不正确 {}\'.format(proxy_path))
sys.exit(1)
opts = salt.config.client_config(master_conf)
LocalClient = salt.client.LocalClient(master_conf)
CACHE_DIR = opts[\'cachedir\']
for agent_id in agent_ids:
file_paths=get_source_file_path(source_file_path, agent_id)
print file_paths
ret = LocalClient.cmd(agent_id, \'cp.push\', file_paths, expr_form=\'list\')
no_exist_hosts = set(ret.keys()) - set(agent_ids)
print no_exist_hosts
if no_exist_hosts:
print(\'异常:{} agent 不存在\'.format(list(no_exist_hosts)))
sys.exit(1)
for file_path in file_paths:
for host, status in ret.iteritems():
if status is True:
proxy_file_path = os.path.join(CACHE_DIR, \'minions\', host, \'files\',
file_path.lstrip(\'/\'))
res = proxy_to_ftp(proxy_file_path)
if res:
print file_path, \'上传成功\'
else:
fail.append(\'{}:{}\'.format(host, file_path))
elif status is False:
print(\'{}:{} 上传失败,可能文件不存在\'.format(host, file_path))
fail.append(\'{}:{}\'.format(host, file_path))
else:
print(\'异常:{}:{} 上传失败,{}\'.format(host, file_path, status))
fail.append(\'{}:{}\'.format(host, file_path))
def _conn_ftp(user, passwd):
global ftp_host, ftp_port, connect_type
conn = False
ispasv = False if user in (None, \'false\') else True
ftp_url = ftp_host
connect_type = connect_type.lower()
port = ftp_port
try:
if \':\' in ftp_url:
conn = True
ftp_url, port = ftp_url.split(\':\')
if conn:
ftp = FTP()
ftp.connect(host=str(ftp_url), port=int(port))
else:
ftp = FTP(ftp_url)
ftp.login(user, passwd)
except Exception as e:
if \'requires SSL.\' in \'{}\'.format(e):
try:
if conn:
ftp = FTP_TLS()
ftp.connect(host=ftp_url, port=int(port))
else:
ftp = FTP_TLS(ftp_url)
ftp.login(user, passwd)
except Exception as e:
print e
sys.exit(1)
else:
print e
sys.exit(1)
return ftp, ispasv
def proxy_to_ftp(proxy_file_path):
global username, password, ftp_dir
ftp, ispasv = _conn_ftp(username, password)
ftp.encoding = "utf-8"
try:
ftp.set_pasv(ispasv)
# ftp.retrlines(\'LIST\')
except:
ftp.set_pasv(not ispasv)
now_path = ftp.pwd()
print now_path
if ftp_dir and ftp_dir != \'/\':
try:
ftp.cwd(ftp_dir)
except:
new_path = os.path.join(now_path, ftp_dir.lstrip(\'/\'))
print new_path
ftp.mkd(new_path)
ftp.cwd(new_path)
try:
ftp.rename(os.path.basename(proxy_file_path).decode("utf8").encode(\'gbk\'), os.path.basename(proxy_file_path).decode("utf8").encode(\'gbk\')+\'.\'+time.strftime(\'%Y-%m-%d_%H:%M:%S\'))
except:
pass
print proxy_file_path
with open(proxy_file_path, \'rb\') as f_:
result = ftp.storbinary(\'STOR %s\' % os.path.basename(proxy_file_path).decode("utf8").encode(\'gbk\'), f_)
ftp.close()
if \'Transfer complete.\' in result:
return True
else:
return False
try:
agent_to_proxy()
if success:
print \'文件传输成功:{}\'.format(\',\'.join(success))
if fail:
print \'文件传输失败:{}\'.format(\',\'.join(fail))
sys.exit(1)
except Exception as e:
print e
sys.exit(1)