slqt
# 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)

  

posted on 2019-03-11 15:08  slqt  阅读(1419)  评论(0编辑  收藏  举报

分类:

技术点:

相关文章: