hugo-teek is loading...

集成工程线缆检查脚本

最后更新于:

集成工程线缆检查脚本

脚本位置

https://onedayxyy.cn/scripts/check_line/

image-20240405142747410

CheckLine_2019-10-27.py

  1[root@docusaurus-wiki check_line]#cat CheckLine_2019-10-27.py 
  2###19-10-25 《加入光衰检查 带外ipmi模块加载》
  3###19-10-27 《加入关闭系统自带的lldp,第一次使用较久》
  4import datetime
  5import xlrd
  6import xlsxwriter
  7import paramiko
  8import time
  9import string
 10def Sysname_cut(host_port):    #交换机主机名
 11   try:
 12      stdin, stdout, stderr = ssh.exec_command("lldptool -t -n -i " + host_port + " | grep -A 1 \'System Name TLV\'")
 13      tx = stdout.read().decode()
 14      if tx == "":
 15         stdin, stdout, stderr = ssh.exec_command("for i in `ls /sys/kernel/debug/i40e/`; do echo 'lldp stop' > /sys/kernel/debug/i40e/$i/command ; done;")
 16         time.sleep(10)
 17         stdin, stdout, stderr = ssh.exec_command("lldptool -t -n -i " + host_port + " | grep -A 1 \'System Name TLV\'")
 18         tx = stdout.read().decode()
 19      else:
 20         pass
 21      temp=str(tx)
 22      temp1 = temp.split("      ")
 23      sysname = str(temp1[1])
 24      sysname=sysname.split("\n")[0]
 25      return sysname
 26   except IndexError:
 27      print("list index out of range")
 28
 29def Port_cut(host_port):     #交换机端口
 30   try:
 31      stdin, stdout, stderr = ssh.exec_command("lldptool -t -n -i "+host_port+" | grep Ifname")
 32      tx = stdout.read().decode()
 33      temp = tx.split(": ")
 34      port = str(str(temp[1]).split("\n")[0])
 35      return port
 36   except IndexError:
 37      print("list index out of range")
 38      
 39def Hostname():           #服务器主机名
 40   try:
 41      stdin, stdout, stderr = ssh.exec_command("hostname")
 42      hostname = stdout.read().decode().strip()
 43      return hostname
 44   except IndexError:
 45      print("list index out of range")
 46 
 47def ServerIPMI():          #服务器IPMI地址
 48   try:
 49      stdin1, stdout1, stderr1 = ssh.exec_command("lsmod |grep ^ipmi")
 50      m = stdout1.read().decode().strip()
 51      if m != "":
 52         stdin, stdout, stderr = ssh.exec_command("ipmitool lan print | grep 'IP Address  '")
 53         s = stdout.read().decode().strip()
 54         ipmi = s.split(":")[1]
 55         return ipmi
 56      else:
 57         stdin2, stdout2, stderr2 = ssh.exec_command("modprobe ipmi_watchdog&&modprobe ipmi_poweroff&&modprobe ipmi_devintf&&modprobe ipmi_si&&modprobe ipmi_msghandler")
 58         f = stdout2.read().decode().strip()
 59         time.sleep(2)
 60         if f == None:
 61            print("error")
 62         else:
 63            stdin, stdout, stderr = ssh.exec_command("ipmitool lan print | grep 'IP Address  '")
 64            s = stdout.read().decode().strip()
 65            ipmi = s.split(":")[1]
 66            return ipmi
 67   except Exception as e:
 68      print("ErrorInfo:  %s" % e)
 69
 70 
 71def ServerIPMImask():          #服务器IPMI掩码
 72   try:
 73      stdin, stdout, stderr = ssh.exec_command("ipmitool lan print | grep \'Subnet Mask\'")
 74      s = stdout.read().decode().strip()
 75      ipmi = s.split(":")[1]
 76      return ipmi
 77   except IndexError:
 78      print("list index out of range")
 79
 80 
 81def ServerIPMIgway():          #服务器IPMI网关
 82   try:
 83      stdin, stdout, stderr = ssh.exec_command("ipmitool lan print | grep \'Default Gateway IP\'")
 84      s = stdout.read().decode().strip()
 85      ipmi = s.split(":")[1]
 86      return ipmi
 87   except IndexError:
 88      print("list index out of range")
 89
 90def ServerSN():         #服务器序列号SN
 91   try:
 92      stdin, stdout, stderr = ssh.exec_command("dmidecode -s system-serial-number")
 93      SN = stdout.read().decode()
 94      return SN
 95   except IndexError:
 96      print("list index out of range")
 97
 98def ServerNetMAC(port):         #服务器网卡MAC地址
 99   try:
100      stdin, stdout, stderr = ssh.exec_command(" cat /sys/class/net/" + port + "/address")
101      netMac = stdout.read().decode()
102      return netMac
103   except IndexError:
104      print("list index out of range")
105
106def ServerNetSpeed(port):         #服务器网卡速率
107   try:
108      stdin, stdout, stderr = ssh.exec_command("ethtool " + port + " | grep Speed | awk -F \':\' \'{print $2}\'")
109      netSpeed = stdout.read().decode().strip()
110      return netSpeed
111   except IndexError:
112      print("list index out of range")
113
114def SysHostname(port):         #交换机端口描述中服务器编号
115   try:
116      stdin, stdout, stderr = ssh.exec_command("lldptool -t -n -i " + port + " | grep -A 1 \'Port Description TLV\'")
117      s = stdout.read().decode().strip()
118      temp=str(s)
119      temp1 = temp.split("      ")
120      sysname = str(temp1[1])
121      sysHostname1 = sysname.split("\n")[0]
122      if "." in sysHostname1:
123         sysHostname = sysHostname1.split(":")[1].split(".")[0]
124         return sysHostname
125      else:
126         return sysHostname1
127   except IndexError:
128      print("list index out of range")
129
130def SysVlan(port):         #交换机端口所属VLAN
131   try:
132      stdin, stdout, stderr = ssh.exec_command("lldptool -t -n -i " + port + " | grep -A 1 \'Port VLAN ID TLV\' ")
133      s = stdout.read().decode()
134      temp=str(s)
135      temp1 = temp.split("      ")
136      vlan = str(temp1[1])
137      temp2 = vlan.split("\n")[0]
138      sysvlan = temp2.split(":")[1] 
139      return sysvlan
140   except IndexError:
141      print("list index out of range")
142      
143def Send_Light(port):
144    stdin, stdout, stderr = ssh.exec_command("ethtool -m "+ port+" | grep \"Laser output power\" |  head -1 | awk -F \'\/\' \'{print $2}\'")
145    tx = stdout.read().decode().strip()
146    return tx
147
148def Receive_Light(port):
149    stdin, stdout, stderr = ssh.exec_command("ethtool -m "+ port +" | grep \"Receiver signal\"| awk -F \'/\' \'{print $2}\'")
150    rx = stdout.read().decode().strip()
151    return rx
152
153def LightRS(Port):
154   send_light = Send_Light(Port)
155   if "dBm" not in send_light:
156      worksheet.write(i, 9, "no lightinfo",color)
157   else:
158      sl = str(send_light.split(" ")[0])
159      if "+" in sl:
160         worksheet.write(i, 9, send_light,color)
161      else:
162         sl1 = int(str(sl.replace("-","").split(".")[0]))
163         #print(sl1)
164         if sl1>=5:
165            worksheet.write(i, 9, send_light,color)
166         else:
167            worksheet.write(i, 9, send_light)     #光衰发光
168   receive_light = Receive_Light(Port)
169   if "dBm" not in receive_light:
170      worksheet.write(i, 10, "no lightinfo",color)
171   else:
172      rl = str(receive_light.split(" ")[0])
173      if "+" in rl:
174         worksheet.write(i, 10, receive_light,color)
175      else:
176         rl1 = int(str(rl.replace("-","").split(".")[0]))
177         #print(rl1)
178         if rl1>=5:
179            worksheet.write(i, 10, receive_light,color)
180         else:
181            worksheet.write(i, 10, receive_light)    #光衰收光
182
183data = xlrd.open_workbook('D:/Port2.xlsx')
184#data = xlrd.open_workbook('C:/Users/liwei/Desktop/Port-huawei-CD.xlsx')
185table = data.sheets()[0]
186nrows = table.nrows
187
188workbook = xlsxwriter.Workbook('D:/SFG.xlsx')
189worksheet = workbook.add_worksheet()
190title = [u'服务器IP',u'服务器主机名',u'服务器IPMI',u'IPMI地址掩码',u'IPMI地址网关',u'序列号SN',u'服务器网卡名称',u'服务器网卡MAC',u'服务器网卡速率',u'光衰发光',u'光衰收光',u'交换机主机名',u'交换机端口',u'交换机端口所属VLAN',u'交换机端口描述中服务器编号',u'是否与服务器一致',u'lldp收集时间']
191format=workbook.add_format()
192format.set_border(1)
193format_title=workbook.add_format()
194format_title.set_border(1)
195format_title.set_bg_color('#cccccc')
196format_title.set_align('center')
197format_title.set_bold()
198format_ave=workbook.add_format()
199format_ave.set_border(1)
200format_ave.set_num_format('0.00')
201worksheet.write_row('A1',title,format_title)
202color = workbook.add_format({'bg_color':'red'})
203Now_Time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
204i = 1
205while i < nrows:
206   ip = table.cell(i,0)
207   Port = table.cell(i,1)
208   Port = str(Port).split("'")[1]
209   ip = str(ip).split("'")[1]
210   print(ip)
211   ssh = paramiko.SSHClient()
212   ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
213   try:
214      ssh.connect(hostname=ip, port=22, username='root', password='123456',timeout=3)
215      worksheet.write(i, 0, ip)        #服务器IP
216      hostname = Hostname()
217      worksheet.write(i, 1, hostname)      #服务器主机名
218      worksheet.write(i, 2, ServerIPMI())      #服务器IPMI
219      worksheet.write(i, 3, ServerIPMImask())      #服务器IPMI掩码
220      worksheet.write(i, 4, ServerIPMIgway())      #服务器IPMI网关
221      worksheet.write(i, 5, ServerSN())      #服务器SN
222      worksheet.write(i, 6, Port)      #服务器网卡名称
223      worksheet.write(i, 7, ServerNetMAC(Port))      #服务器网卡MAC
224      speed = ServerNetSpeed(Port)
225      worksheet.write(i, 8, speed)      #服务器网卡速率
226      value = str(speed.strip().split("M")[0])
227      if int(value) > 1000:
228         LightRS(Port)             
229      else:
230         worksheet.write(i, 9, "非光口")
231         worksheet.write(i, 10, "非光口")
232      worksheet.write(i, 11, Sysname_cut(Port))       #交换机主机名
233      worksheet.write(i, 12, Port_cut(Port))      #交换机端口
234      worksheet.write(i, 13, SysVlan(Port))      #交换机端口所属VLAN
235      sys_hostname = SysHostname(Port)
236      worksheet.write(i, 14, sys_hostname)      #交换机端口描述中服务器编号
237      if hostname != sys_hostname:
238         status = "false"
239      else:
240         status = "true"
241      worksheet.write(i, 15, status)     #是否与服务器一致
242      worksheet.write(i, 16, Now_Time)     #lldp收集时间
243      time.sleep(1)
244      i=i+1
245      ssh.close()
246   except Exception as e:
247      print("Errorinfo:%s" %e)
248      i=i+1
249workbook.close()

lldp.sh

 1[root@docusaurus-wiki check_line]#cat lldp.sh 
 2#!/bin/bash
 3lldpad -d
 4
 5for i in `ls /sys/class/net/ | grep e` ;
 6      do echo "enabling lldp for interface: $i" ;
 7      lldptool set-lldp -i $i adminStatus=rxtx  ;
 8      lldptool -T -i $i -V  sysName enableTx=yes;
 9      lldptool -T -i $i -V  portDesc enableTx=yes ;
10      lldptool -T -i $i -V  sysDesc enableTx=yes;
11      lldptool -T -i $i -V sysCap enableTx=yes;
12      lldptool -T -i em1 -V mngAddr ipv4=`hostname -I`;
13      lldptool -T -i $i -V mngAddr enableTx=yes;
14done

脚本使用前提条件

1.目标设备必须是linux机器

2.目标机器可以被ssh 次是通过python ssh模块来获取信息的,因此设备必须要可以ssh到其上面的;

3.本次py脚本是在windows机器下的(请注意,可上外网),即winodws上有python环境(python3版本)

脚本使用时需要修改的地方

image-20240405141604229

1.运行次py脚本前,必须先要在所有linux机器上运行lldp.sh脚本:

image-20240405141710922

即在安装系统前,要保证安装lldpad软件包:

image-20240405141820036

2.修改py脚本中ssh端口,用户名及用户密码即可。

image-20240405141931672

3.注意ip列表/输出文件存放路径

image-20240405142110884

image-20240405142157276

4.保证如下python模块已被安装,如未安装,则在执行过程会报错,根据提示,使用pip安装即可:

image-20240405142223078

脚本输出结果说明

1.输出结果如下文件:SFG.xlsx

image-20240405142248245

# 次脚本输出的信息如下:

系统主机名;

带外ip、掩码、网关;

sn;

服务器网卡名、网卡mac、网卡速率、收发光衰;

上联交换机主机名、交换机端口、所属vlan、交换机下服务器描述信息、

2.注意:如果有光衰异常的情况,次脚本会对次目标进行标注:

image-20240405142312754

推荐使用微信支付
微信支付二维码
推荐使用支付宝
支付宝二维码
最新文章

文档导航