import pandas as pd
from concurrent.futures import ThreadPoolExecutor
import netmiko
import os
from threading import Lock
class net_dev():
def __init__(self,excel_name):
"""
try :
os.mkdir("./log")
except:
os.system("rm -rf log/")
os.mkdir("./log")
"""
self.excel_name = excel_name
self.list = [] # 空列表存储设备信息数据
self.pool = ThreadPoolExecutor(3) # 初始化线程数量
self.lock = Lock() # 添加线程锁,避免写入数据丢失
self.path = ("./log") # 创建保存log路径
def get_dev_info(self):
# 获取设备信息dataframe
dataframe = pd.read_excel(self.excel_name,sheet_name="设备信息")
#print(dataframe)
self.list = dataframe.to_dict(orient="records") # 将数据变为列表
def mult_cmd_in(self,ip,user,dev_type,passwd,dev_name,cmd):
try:
devices = {
'device_type': dev_type, # 锐捷os:ruijie_os, 华三:hp_comware 中兴:zte_zxros huawei:huawei
'ip': ip,
'username': user,
'password': passwd,
}
connect_dev = netmiko.ConnectHandler(**devices)
cmd_out = connect_dev.send_config_set(cmd,enter_config_mode=False,bypass_commands="$$")
with open (dev_name + ".txt", "w",encoding="utf-8") as tmp_fle:
tmp_fle.write(cmd_out)
print(dev_name + " 执行成功")
except netmiko.exceptions.NetmikoAuthenticationException:
self.lock.acquire()
with open("登录失败列表", "a", encoding="utf-8") as failed_ip:
failed_ip.write(ip + " 用户名密码错误 " + dev_name +"\n")
print(dev_name + " 用户名密码错误")
self.lock.release()
except netmiko.exceptions.NetmikoTimeoutException:
self.lock.acquire()
with open("登录失败列表", "a", encoding="utf-8") as failed_ip:
failed_ip.write(ip + " 登录超时 " + dev_name + "\n")
print(dev_name + " 登录超时")
self.lock.release()
def main(self):
#print(self.list)
for dev_info in self.list:
ip = dev_info["ip"]
#print(ip)
user = dev_info["user"]
dev_type = dev_info["dev_type"]
passwd = dev_info["password"]
dev_name = dev_info["dev_name"]
cmd_tmp = dev_info["cmd"]
cmd = cmd_tmp.split("\n")
print(cmd)
self.pool.submit(self.mult_cmd_in,ip,user,dev_type,passwd,dev_name,cmd)
os.chdir(self.path)
self.pool.shutdown(True)
yc_use = net_dev("iplist.xlsx") # 传入excel名字
yc_use.get_dev_info()
yc_use.main()