导航

 
# coding: UTF-8
import os
import time
from concurrent import futures


HEADERS = {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
}

def connect(host, username, password, **kwargs):
    client = None
    if Network.check_port(host, 23):
        print("{}: Try Use Telnet ".format(host))
        client = Network.DoTelnet(host, username, password, **kwargs)
    elif Network.check_port(host, 22):
        print("{}: Try Use SSH ".format(host))
        client = Network.DoSSH(host, username, password, **kwargs)
        if not client.login() and Network.check_port(host, 23):
            print("{}: Try Use Telnet ".format(host))
            client = Network.DoTelnet(host, username, password, **kwargs)
    else:
        print('{}: SSH 和 Telnet 端口都不通,请确认网络正常或端口是否被修改'.format(host))
    if client and client.login():
        return client

def save_to_file(save_dir, file_name, content):
    try:
        if not os.path.exists(save_dir):
            os.makedirs(save_dir)
        conf_path = os.path.abspath(os.path.join(save_dir, file_name))
        with open(conf_path, 'w') as cf:
            cf.write(content)
        return conf_path
    except Exception as e:
        print('Error, 保存到文件失败, {}'.format(e))


def switch_conf_bak(host, username, password, enable_passwd=None, **kwargs):
    global SUCCESS
    """支持cisco、 h3c 、huawei 交换机的配置文件备份"""
    client = connect(host, username, password, **kwargs)
    if not client:  # 连接失败退出
        print("Error, {} 连接失败".format(host))
        return
    if client.device_type in ['cisco']:
        conf_name = 'startup'
        code, out = client.run('show startup-config', 5)
        if code:
            if not enable_passwd:
                print "Error, {}: 需要特权密码".format(host)
                return
            if not client.enter_enable(enable_passwd):
                return
            code, out = client.run('show running-config', 5)
            conf_name = 'running'
    elif client.device_type in ['ruijie']:
        code, out = client.run('show running-config', 5)
        conf_name = 'running'
        if code:
            if not enable_passwd:
                print "Error, {}: 需要特权密码".format(host)
                return
            if not client.enter_enable(enable_passwd):
                return
            code, out = client.run('show running-config', 5)
    elif client.device_type in ['h3c', 'huawei']:
        conf_name = 'current'
        code, out = client.run('display current-configuration', 5)
        if code:
            if client.run('system-view')[0]:
                print 'Error, {}: 进入特权模式失败'.format(host, client.device_type)
                return False
            code, out = client.run('display current-configuration', 5)
    else:
        print 'Error, {}, 不支持的设备类型:{}'.format(host, client.device_type)
        return
    client.close()

    if not code:
        filename = '{}_{}_{}_{}.txt'.format(host, client.device_type, conf_name, time.strftime('%Y%m%d_%H%M%S'))
        conf = '\n'.join(out)
        print('{}: 获取配置成功, {} 字节'.format(host, len(conf)))
        file_path = save_to_file(save_path, filename, conf)
        if file_path:
            bak_path.append(file_path)
            print('{}: 保存到文件成功, {}'.format(host, file_path))
            SUCCESS += 1
        return file_path
    else:
        print "Error, {}: 命令错误,备份失败".format(host)
        print(out)


if __name__ == '__main__':
    start_time = time.time()
    SUCCESS = 0
    save_path = '/tmp/switch_bak'
    bak_path = []


    hosts = [ip.strip() for ip in ips.split() if ip.strip()]

    # 多线程执行
    with futures.ThreadPoolExecutor(max_workers=15) as executor:
        for host in hosts:
            executor.submit(switch_conf_bak, host, username, password, enable_passwd)

    print('执行结束,总 {} ,成功 {}, 失败{}, 耗时 {}s'.format(len(hosts),
            SUCCESS, len(hosts) - SUCCESS, time.time() - start_time))
    bak_path = ','.join(bak_path)
    print(bak_path)

  

posted on 2019-05-22 17:35  slqt  阅读(646)  评论(0编辑  收藏  举报