# 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.loadssys_type) else: sys_types={} for i in agent_ids: sys_types.update{i:sys_type}) def get_source_file_pathsource_file_path,agent_id): global sys_types sys_type=sys_types.getagent_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 isinstancesource_file_path, unicode): source_file_path = source_file_path.encode'utf8') file_paths = source_file_path.split' ') return file_paths if isinstanceftp_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.joinproxy_path, 'conf', 'master') if not os.path.existsmaster_conf): print'Proxy 路径不正确 {}'.formatproxy_path)) sys.exit1) opts = salt.config.client_configmaster_conf) LocalClient = salt.client.LocalClientmaster_conf) CACHE_DIR = opts['cachedir'] for agent_id in agent_ids: file_paths=get_source_file_pathsource_file_path, agent_id) print file_paths ret = LocalClient.cmdagent_id, 'cp.push', file_paths, expr_form='list') no_exist_hosts = setret.keys)) - setagent_ids) print no_exist_hosts if no_exist_hosts: print'异常:{} agent 不存在'.formatlistno_exist_hosts))) sys.exit1) for file_path in file_paths: for host, status in ret.iteritems): if status is True: proxy_file_path = os.path.joinCACHE_DIR, 'minions', host, 'files', file_path.lstrip'/')) res = proxy_to_ftpproxy_file_path) if res: print file_path, '上传成功' else: fail.append'{}:{}'.formathost, file_path)) elif status is False: print'{}:{} 上传失败,可能文件不存在'.formathost, file_path)) fail.append'{}:{}'.formathost, file_path)) else: print'异常:{}:{} 上传失败,{}'.formathost, file_path, status)) fail.append'{}:{}'.formathost, file_path)) def _conn_ftpuser, 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.connecthost=strftp_url), port=intport)) else: ftp = FTPftp_url) ftp.loginuser, passwd) except Exception as e: if 'requires SSL.' in '{}'.formate): try: if conn: ftp = FTP_TLS) ftp.connecthost=ftp_url, port=intport)) else: ftp = FTP_TLSftp_url) ftp.loginuser, passwd) except Exception as e: print e sys.exit1) else: print e sys.exit1) return ftp, ispasv def proxy_to_ftpproxy_file_path): global username, password, ftp_dir ftp, ispasv = _conn_ftpusername, password) ftp.encoding = "utf-8" try: ftp.set_pasvispasv) # ftp.retrlines'LIST') except: ftp.set_pasvnot ispasv) now_path = ftp.pwd) print now_path if ftp_dir and ftp_dir != '/': try: ftp.cwdftp_dir) except: new_path = os.path.joinnow_path, ftp_dir.lstrip'/')) print new_path ftp.mkdnew_path) ftp.cwdnew_path) try: ftp.renameos.path.basenameproxy_file_path).decode"utf8").encode'gbk'), os.path.basenameproxy_file_path).decode"utf8").encode'gbk')+'.'+time.strftime'%Y-%m-%d_%H:%M:%S')) except: pass print proxy_file_path with openproxy_file_path, 'rb') as f_: result = ftp.storbinary'STOR %s' % os.path.basenameproxy_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','.joinsuccess)) if fail: print '文件传输失败:{}'.format','.joinfail)) sys.exit1) except Exception as e: print e sys.exit1)