Files
IDCtools/idctools.py
2021-08-06 17:17:54 +08:00

1431 lines
72 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding:utf-8 -*-
import paramiko
import time
import datetime
import os
import sqlite3
import re
from configobj import ConfigObj
import pypinyin
import openpyxl
from openpyxl.styles import Font, Alignment
#菜单
def handleMenu():
userInput = input("\n请输入序列号或指令('quit''q'可返回菜单)")
return userInput
#管理和查看本地数据库
def manageLocalDB():
ColorLogDecorator().active()
if os.path.exists("alldata.db") == False:
print(ColorLogDecorator().yellow("【WARNING】未发现本地数据库正在初始化中...","strong"))
time.sleep(1)
conn = sqlite3.connect('alldata.db')
c = conn.cursor()
c.execute('''CREATE TABLE DEVICES
(ID INTEGER PRIMARY KEY autoincrement,
NAME varchar(255) NOT NULL,
IP varchar(255) NOT NULL,
TYPE varchar(255) NOT NULL,
IDC varchar(255) NOT NULL);
''')
c.execute("INSERT INTO DEVICES (NAME,IP,TYPE,IDC) \
VALUES ('IDC-example-NE40-RT01','1.1.1.1','华为','测试')")
conn.commit()
conn.close()
print(ColorLogDecorator().green("【INFO】数据库初始化完成","strong"))
else:
conn = sqlite3.connect('alldata.db')
c = conn.cursor()
print(ColorLogDecorator().green("【INFO】数据库连接成功","strong"))
selResult = c.execute("SELECT * FROM devices")
print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
print(" 【ID】 ---- 【设备名称】 ---- 【ip】 ---- 【厂商】 ---- 【IDC名称】 \n")
for row in selResult:
print(' ',row[0],'----',row[1],'----',row[2],'----',row[3],'----',row[4])
print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
conn.commit()
conn.close()
print("\n\n")
while True:
manaInput = input("【输入序列号 1.添加设备信息(单个录入) 2.批量添加设备信息 3.修改设备信息 4.删除设备 5.管理封堵设备】\n返回上一级请输入指令'quit''q'\n:")
if manaInput == "1":
# ColorLogDecorator().active()
devInfo = []
os.system('cls')
print("======================================")
print(" 单个设备录入")
print("当前进度:")
print(ColorLogDecorator().blue("> *设备名称", "strong"))
print("*设备IP\n*厂商名称\n*IDC名称")
print("======================================")
addInput = input("(取消保存并返回上一级菜单输入'q''quit')\n请输入信息:")
if addInput == "":
print(ColorLogDecorator().red("【WARNING】不允许输入空值正在跳转到上一级目录...", "strong"))
os.system('pause')
os.system('cls')
continue
elif addInput == "q" or addInput == "quit":
os.system('cls')
continue
else:
devInfo.append(addInput)
os.system('cls')
print("======================================")
print(" 单个设备录入")
print("当前进度:")
print("*设备名称")
print(ColorLogDecorator().blue("> *设备IP", "strong"))
print("*厂商名称\n*IDC名称")
print("======================================")
addInput = input("(取消保存并返回上一级菜单输入'q''quit')\n(重新输入上一步请输入'c')\n请输入信息:")
if addInput == "":
print(ColorLogDecorator().red("【WARNING】不允许输入空值正在跳转到上一级目录..."))
time.sleep(1.5)
continue
elif addInput == "q" or addInput == "quit":
os.system('cls')
continue
elif addInput == 'c':
os.system('cls')
print("======================================")
print(" 单个设备录入")
print("当前进度:")
print(ColorLogDecorator().blue("> *设备名称", "strong"))
print("*设备IP\n*厂商名称\n*IDC名称")
print("======================================")
addInput = input("(取消保存并返回上一级菜单输入'q''quit')\n请输入信息:")
if addInput == "":
print(ColorLogDecorator().red("【WARNING】不允许输入空值正在跳转到上一级目录..."))
time.sleep(1.5)
os.system('cls')
continue
elif addInput == "q" or addInput == "quit":
os.system('cls')
continue
else:
devInfo[0] = addInput
os.system('cls')
print("======================================")
print(" 单个设备录入")
print("当前进度:")
print("*设备名称")
print(ColorLogDecorator().blue("> *设备IP", "strong"))
print("*厂商名称\n*IDC名称")
print("======================================")
addInput = input("(取消保存并返回上一级菜单输入'q''quit')\n请输入信息:")
if addInput == "":
print(ColorLogDecorator().yellow("【WARNING】不允许输入空值正在跳转到上一级目录..."))
time.sleep(1.5)
os.system('cls')
continue
elif addInput == "q" or addInput == "quit":
os.system('cls')
continue
else:
devInfo.append(addInput)
else:
devInfo.append(addInput)
os.system('cls')
print("======================================")
print(" 单个设备录入")
print("当前进度:")
print("*设备名称")
print("*设备IP")
print(ColorLogDecorator().blue("> *厂商名称", "strong"))
print("*IDC名称")
print("======================================")
addInput = input("(取消保存并返回上一级菜单输入'q''quit')\n(重新输入上一步请输入'c')\n请输入信息:")
if addInput == "":
print(ColorLogDecorator().red("【WARNING】不允许输入空值", "strong"))
os.system('pause')
os.system('cls')
continue
elif addInput == "q" or addInput == "quit":
os.system('cls')
continue
elif addInput == 'c':
os.system('cls')
print("======================================")
print(" 单个设备录入")
print("当前进度:")
print("*设备名称")
print(ColorLogDecorator().blue("> *设备IP", "strong"))
print("*厂商名称\n*IDC名称")
print("======================================")
addInput = input("(取消保存并返回上一级菜单输入'q''quit')\n请输入信息:")
if addInput == "":
print(ColorLogDecorator().yellow("【WARNING】不允许输入空值正在跳转到上一级目录..."))
time.sleep(1.5)
os.system('cls')
continue
elif addInput == "q" or addInput == "quit":
os.system('cls')
continue
else:
devInfo[1] = addInput
os.system('cls')
print("======================================")
print(" 单个设备录入")
print("当前进度:")
print("*设备名称")
print("*设备IP")
print(ColorLogDecorator().blue("> *厂商名称", "strong"))
print("*IDC名称")
print("======================================")
addInput = input("(取消保存并返回上一级菜单输入'q''quit')\n请输入信息:")
if addInput == "":
print(ColorLogDecorator().yellow("【WARNING】不允许输入空值正在跳转到上一级目录..."))
time.sleep(1.5)
os.system('cls')
continue
elif addInput == "q" or addInput == "quit":
os.system('cls')
continue
else:
devInfo.append(addInput)
else:
devInfo.append(addInput)
os.system('cls')
print("======================================")
print(" 单个设备录入")
print("当前进度:")
print("*设备名称")
print("*设备IP")
print("*厂商名称")
print(ColorLogDecorator().blue("> *IDC名称", "strong"))
print("======================================")
addInput = input("(取消保存并返回上一级菜单输入'q''quit')\n(重新输入上一步请输入'c')\n请输入信息:")
if addInput == "":
print(ColorLogDecorator().red("【WARNING】不允许输入空值正在跳转到上一级目录..."))
time.sleep(1.5)
os.system('cls')
continue
elif addInput == "q" or addInput == "quit":
os.system('cls')
continue
elif addInput == 'c':
os.system('cls')
print("======================================")
print(" 单个设备录入")
print("当前进度:")
print("*设备名称")
print("*设备IP")
print(ColorLogDecorator().blue("> *厂商名称", "strong"))
print("*IDC名称")
print("======================================")
addInput = input("(取消保存并返回上一级菜单输入'q''quit')\n请输入信息:")
if addInput == "":
print(ColorLogDecorator().red("【WARNING】不允许输入空值正在跳转到上一级目录..."))
time.sleep(1.5)
os.system('cls')
continue
elif addInput == "q" or addInput == "quit" or addInput == 'c':
os.system('cls')
continue
else:
devInfo[2] = addInput
os.system('cls')
print("======================================")
print(" 单个设备录入")
print("当前进度:")
print("*设备名称")
print("*设备IP")
print("*厂商名称")
print(ColorLogDecorator().blue("> *IDC名称", "strong"))
print("======================================")
addInput = input("(取消保存并返回上一级菜单输入'q''quit')\n请输入信息:")
if addInput == "":
print(ColorLogDecorator().red("【WARNING】不允许输入空值正在跳转到上一级目录..."))
time.sleep(1.5)
os.system('cls')
continue
elif addInput == "q" or addInput == "quit":
os.system('cls')
continue
else:
devInfo.append(addInput)
else:
devInfo.append(addInput)
print(devInfo)
isWantSave = input(ColorLogDecorator().yellow("!!!是否要保存? [Y/N/C]"))
if isWantSave.upper() == "N" or isWantSave.upper() == "C":
print(ColorLogDecorator().red("【INFO】已取消保存)"))
time.sleep(1.5)
continue
elif isWantSave.upper() == "Y":
conn = sqlite3.connect('alldata.db')
c = conn.cursor()
sql = '''INSERT INTO DEVICES (NAME,IP,TYPE,IDC) VALUES ('{0}','{1}','{2}','{3}');'''.format(devInfo[0],devInfo[1],devInfo[2],devInfo[3])
print(sql)
c.execute(sql)
conn.commit()
conn.close()
print(ColorLogDecorator().green("【INFO】保存成功)"))
time.sleep(1.5)
os.system('cls')
continue
elif manaInput == "2":
if os.path.isfile('设备表.xlsx') == False:
wb = openpyxl.Workbook()
wb.create_sheet(index=0, title='Sheet1')
sheet = wb.worksheets[0]
font = Font(name='黑体', size=10, bold=True)
alignment = Alignment(horizontal='left',vertical='center')
sheet['A1'].value = '设备名称'
sheet['A1'].font = font
sheet['A1'].alignment = alignment
sheet['B1'].value = 'IP'
sheet['B1'].font = font
sheet['B1'].alignment = alignment
sheet['C1'].value = '设备厂商'
sheet['C1'].font = font
sheet['C1'].alignment = alignment
sheet['D1'].value = '机房'
sheet['D1'].font = font
sheet['D1'].alignment = alignment
wb.save('设备表.xlsx')
print(ColorLogDecorator().green('【INFO】检测到模板文件不存在已自动生成\n', 'strong'))
isY_input= input(' 请将设备信息填入模板后在此输入Y即可批量导入')
if isY_input.upper() == 'Y':
wb = openpyxl.load_workbook('设备表.xlsx')
sheet = wb.worksheets[0]
rowsList = []
cellsList = []
for row in sheet.iter_rows():
for cell in row:
cellsList.append(cell.value)
rowsList.append(cellsList)
cellsList = []
if len(rowsList) < 2:
print(ColorLogDecorator().red('【ERROR】无法检测到数据请先填写数据。\n', 'strong'))
continue
del rowsList[0]
conn = sqlite3.connect('alldata.db')
c = conn.cursor()
for devs in rowsList:
PreInDBvalue = c.execute("SELECT * FROM DEVICES WHERE IP = '{0}'".format(devs[1]))
if len(list(PreInDBvalue)) == 0:
c.execute("INSERT INTO DEVICES (NAME,IP,TYPE,IDC) VALUES ('{0}','{1}','{2}','{3}')".format(devs[0],devs[1],devs[2],devs[3]))
print(ColorLogDecorator().green("【INFO】已添加设备 {0}".format(devs[0]), "strong"))
else:
print(ColorLogDecorator().red("【ERROR】设备 {0} 已存在数据库!请勿重复添加!".format(devs[0]), "strong"))
conn.commit()
conn.close()
print(ColorLogDecorator().green('【INFO】批量导入完成 \n', 'strong'))
else:
print(ColorLogDecorator().yellow('【INFO】操作已取消\n', 'strong'))
continue
elif manaInput == "3":
print('\n-----------------------------')
IDnumInput = input("【选择要修改的设备ID号】")
#判断输入的值是否只由纯数字组成
if IDnumInput.isdigit() == True:
sql = '''SELECT * FROM devices WHERE ID='{0}';'''.format(IDnumInput)
conn = sqlite3.connect('alldata.db')
c = conn.cursor()
selResult = c.execute(sql)
selResult1 = list(selResult)
conn.commit()
conn.close()
if len(selResult1) == 0:
print(ColorLogDecorator().red('【结果】不存在该设备\n', 'strong'))
continue
else:
TheDevsInfo = []
titleList = [' ID',' 设备名称:',' IP',' 厂商:',' IDC名称']
#os.system('cls')
print('\n++++++++++++++++当前数据+++++++++++++++++\n')
print('{0}{1}\n'.format(titleList[0],str(selResult1[0][0])))
TheDevsInfo.append(str(selResult1[0][0]))
print('{0}{1}\n'.format(titleList[1],selResult1[0][1]))
TheDevsInfo.append(selResult1[0][1])
print('{0}{1}\n'.format(titleList[2],selResult1[0][2]))
TheDevsInfo.append(selResult1[0][2])
print('{0}{1}\n'.format(titleList[3],selResult1[0][3]))
TheDevsInfo.append(selResult1[0][3])
print('{0}{1}\n'.format(titleList[4],selResult1[0][4]))
TheDevsInfo.append(selResult1[0][4])
print('\n++++++++++++++++++++++++++++++++++++++++++++')
updateInput = input('修改 设备名称【不修改则留空】:')
if updateInput != "":
TheDevsInfo[1] = updateInput
updateInput = input('修改 IP【不修改则留空】')
if updateInput != "":
TheDevsInfo[2] = updateInput
updateInput = input('修改 厂商【不修改则留空】:')
if updateInput != "":
TheDevsInfo[3] = updateInput
updateInput = input('修改 IDC名称【不修改则留空】')
if updateInput != "":
TheDevsInfo[4] = updateInput
os.system('cls')
print('++++++++++++++++更新为以下数据+++++++++++++++++\n')
print('{0}{1}\n'.format(titleList[0], str(TheDevsInfo[0])))
print('{0}{1}\n'.format(titleList[1], TheDevsInfo[1]))
print('{0}{1}\n'.format(titleList[2], TheDevsInfo[2]))
print('{0}{1}\n'.format(titleList[3], TheDevsInfo[3]))
print('{0}{1}\n'.format(titleList[4], TheDevsInfo[4]))
print('\n++++++++++++++++++++++++++++++++++++++++++++')
updateResultInput = input(ColorLogDecorator().yellow(' 是否要保存【Y/N】 ','bg-strong'))
while True:
if updateResultInput.upper() == 'Y':
sql = "UPDATE devices SET NAME='{0}',IP='{1}',TYPE='{2}',IDC='{3}' WHERE ID='{4}';".format(TheDevsInfo[1],TheDevsInfo[2],TheDevsInfo[3],TheDevsInfo[4],TheDevsInfo[0])
conn = sqlite3.connect('alldata.db')
c = conn.cursor()
c.execute(sql)
conn.commit()
conn.close()
print(ColorLogDecorator().green('\n 【INFO】保存成功将返回主菜单...','strong'))
time.sleep(2)
break
elif updateResultInput.upper() == 'N':
break
else:
updateResultInput = input(ColorLogDecorator().yellow(' 是否要保存【Y/N】', 'bg-strong'))
os.system('cls')
break
else:
print(ColorLogDecorator().red('【WARNING】请输入正确的ID号\n','strong'))
elif manaInput == "4":
print('\n------------------------------------------------------')
delNumInput = input(' 请输入要删除的设备ID号【退出请输入c或q】')
if delNumInput == 'c' or delNumInput == 'q' or delNumInput == 'C' or delNumInput == 'Q':
continue
elif delNumInput.isdigit() == True:
sql = '''SELECT * FROM devices WHERE ID='{0}';'''.format(delNumInput)
conn = sqlite3.connect('alldata.db')
c = conn.cursor()
devsList = c.execute(sql)
if len(list(devsList)) != 0:
conn.commit()
conn.close()
while True:
wantDelInput = input(ColorLogDecorator().yellow(' 确定要删除?【Y/N】','strong'))
if wantDelInput.upper() == 'Y':
### 删除设备时,如果是关联的封堵设备,也会一同从封堵设备列表中删除
if os.path.isfile('blockconfig.ini'):
config = ConfigObj('blockconfig.ini', encoding='UTF-8')
cfgDict = config['devList']
for key, values in cfgDict.items():
if delNumInput + ',' in values:
repAfter = values.replace(delNumInput + ',', "")
config['devList'][key] = repAfter
config.write()
elif delNumInput == values:
conn = sqlite3.connect('alldata.db')
c = conn.cursor()
Currsql_res = c.execute(
"SELECT * FROM devices WHERE ID='{0}'".format(delNumInput))
Currsql_res_List = list(Currsql_res)
conn.commit()
conn.close()
saveVal = config['list']['jifang'].replace(Currsql_res_List[0][4] + "|", "")
config['list']['jifang'] = saveVal
config.write()
saveVal = config['list']['jifang'].replace("|" + Currsql_res_List[0][4], "")
config['list']['jifang'] = saveVal
config.write()
saveVal = config['list']['jifang'].replace(Currsql_res_List[0][4], "")
config['list']['jifang'] = saveVal
config.write()
del config['devList'][key]
config.write()
elif delNumInput in values:
repAfter = values.replace(',' + delNumInput, "")
config['devList'][key] = repAfter
config.write()
### END
sql = '''DELETE FROM devices WHERE ID='{0}';'''.format(delNumInput)
conn = sqlite3.connect('alldata.db')
c = conn.cursor()
c.execute(sql)
conn.commit()
conn.close()
print(ColorLogDecorator().green('\n【INFO】删除设备成功\n', 'strong'))
os.system('pause')
os.system('cls')
break
elif wantDelInput.upper() == 'N':
os.system('cls')
break
else:
continue
continue
else:
conn.commit()
conn.close()
print(ColorLogDecorator().yellow('【WARNING】不存在该设备\n','strong'))
os.system('pause')
os.system('cls')
continue
else:
print(ColorLogDecorator().red("【ERROR】ID号为纯数字请正确填写\n", "strong"))
os.system('pause')
os.system('cls')
continue
elif manaInput == "5":
os.system('cls')
if os.path.isfile('blockconfig.ini') == False:
config = ConfigObj()
config.filename = './blockconfig.ini'
config['list'] = {}
config['list']['jifang'] = ''
config['devList'] = {}
config['account'] = {}
config['account']['username'] = ''
config['account']['password'] = ''
config.write()
print(ColorLogDecorator().green('【INFO】封堵信息库已初始化完毕请添加封堵设备','strong'))
while True:
manaBlockInput = input("\n 【管理封堵设备】(返回上一级请输入指令'q''quit')\n 1.查看封堵设备列表 2.添加封堵设备 3.删除封堵设备 4.添加/更改通用设备登陆账号\n(输入)")
if manaBlockInput == "1":
os.system('cls')
if os.path.isfile('blockconfig.ini'):
config = ConfigObj('blockconfig.ini', encoding='UTF-8')
if config['list']['jifang'] == '':
print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
print(" 【封堵设备列表】")
print(" 【ID】 ---- 【设备名称】 ---- 【ip】 ---- 【厂商】 ---- 【机房名称】 ")
print(
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
os.system('pause')
os.system('cls')
continue
else:
print(
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
print(" 【封堵设备列表】")
print(" 【ID】 ---- 【设备名称】 ---- 【ip】 ---- 【厂商】 ---- 【机房名称】 ")
conn = sqlite3.connect('alldata.db')
c = conn.cursor()
# Currsql_res = c.execute("SELECT * FROM devices WHERE ID='{0}'".format(ipblock_Devices))
for key,values in config['devList'].items():
if ',' in values:
AfterID_Lst = values.split(',')
for textAfterID in AfterID_Lst:
returnsql = c.execute(
"SELECT * FROM devices WHERE ID='{0}'".format(textAfterID))
ressql = list(returnsql)
print(
" {0}----{1}----{2}----{3}----{4}\n".format(ressql[0][0], ressql[0][1],
ressql[0][2], ressql[0][3],
ressql[0][4]))
else:
returnsql = c.execute("SELECT * FROM devices WHERE ID='{0}'".format(values))
ressql = list(returnsql)
print(" {0}----{1}----{2}----{3}----{4}\n".format(ressql[0][0], ressql[0][1], ressql[0][2], ressql[0][3], ressql[0][4]))
print(
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
conn.commit()
conn.close()
os.system('pause')
continue
elif manaBlockInput == "2":
os.system('cls')
conn = sqlite3.connect('alldata.db')
c = conn.cursor()
print(ColorLogDecorator().green("【INFO】数据库连接成功", "strong"))
selResult = c.execute("SELECT * FROM devices")
print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
print(" 【ID】 ---- 【设备名称】 ---- 【ip】 ---- 【厂商】 ---- 【IDC名称】 \n")
for row in selResult:
print(row[0], '----', row[1], '----', row[2], '----', row[3], '----', row[4])
print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
conn.commit()
conn.close()
print("\n\n")
addValue = input('从设备信息总库导入到封堵设备列表 请输入要添加的设备ID(批量添加用英文逗号分隔)')
if addValue == '':
print(ColorLogDecorator().red("【ERROR】请正确输入值","strong"))
os.system('pause')
os.system('cls')
continue
# 批量添加
if ',' in addValue:
# 清除用户可能首尾多输入的逗号
addValue = addValue.strip(',')
# 分割判断一遍是否全为纯数字和输入是否合法,不合法则全部都跳过
ad_v = addValue.split(',')
for i in ad_v:
if i.isdigit() == False:
print(ColorLogDecorator().red("【ERROR】请正确输入值", "strong"))
os.system('pause')
continue
# 查询设备ID的归属机房以写入配置文件
conn = sqlite3.connect('alldata.db')
c = conn.cursor()
ini_path = "./blockconfig.ini"
for d_id in ad_v:
ressql = c.execute("SELECT * FROM devices WHERE ID='{0}'".format(d_id))
devs_info = list(ressql)
if len(devs_info) > 0:
config = ConfigObj(ini_path, encoding='UTF-8')
beforeLst = config['list']['jifang']
s = ''
for single_word in pypinyin.pinyin(devs_info[0][4], style=pypinyin.NORMAL):
s += ''.join(single_word)
if beforeLst != '' and devs_info[0][4] not in beforeLst:
config['list']['jifang'] = beforeLst + '|' + devs_info[0][4]
config['devList'][s] = d_id
config.write()
elif beforeLst != '' and devs_info[0][4] in beforeLst:
currIDC_devs = config['devList'][s] + ',' + d_id
config['devList'][s] = currIDC_devs
config.write()
elif beforeLst == '':
config['list']['jifang'] = devs_info[0][4]
config['devList'][s] = d_id
config.write()
print(ColorLogDecorator().green("【INFO】添加完成","strong"))
else:
print(ColorLogDecorator().red("【ERROR】不存在该设备无法添加","strong"))
conn.commit()
conn.close()
os.system('pause')
os.system('cls')
continue
# 单个添加
elif addValue.isdigit() == True:
# 查询设备ID的归属机房以写入配置文件
conn = sqlite3.connect('alldata.db')
c = conn.cursor()
ini_path = "./blockconfig.ini"
ressql = c.execute("SELECT * FROM devices WHERE ID='{0}'".format(addValue))
devs_info = list(ressql)
if len(devs_info) > 0:
config = ConfigObj(ini_path, encoding='UTF-8')
beforeLst = config['list']['jifang']
s = ''
for single_word in pypinyin.pinyin(devs_info[0][4], style=pypinyin.NORMAL):
s += ''.join(single_word)
if beforeLst != '' and devs_info[0][4] not in beforeLst:
config['list']['jifang'] = beforeLst + '|' + devs_info[0][4]
config['devList'][s] = addValue
config.write()
elif beforeLst != '' and devs_info[0][4] in beforeLst:
currIDC_devs = config['devList'][s] + ',' + addValue
config['devList'][s] = currIDC_devs
config.write()
elif beforeLst == '':
config['list']['jifang'] = devs_info[0][4]
config['devList'][s] = addValue
config.write()
print(ColorLogDecorator().green("【INFO】添加完成", "strong"))
else:
print(ColorLogDecorator().red("【ERROR】不存在该设备无法添加","strong"))
conn.commit()
conn.close()
os.system('pause')
os.system('cls')
continue
else:
print(ColorLogDecorator().red("【ERROR】请正确输入值", "strong"))
os.system('pause')
os.system('cls')
continue
elif manaBlockInput == "3":
deldevs = input(" 请输入要删除的设备id(多个设备用英文逗号分隔;留空或输入q则直接退出)")
if "," in deldevs and deldevs != "":
afterCutLst = deldevs.split(",")
config = ConfigObj('blockconfig.ini', encoding='UTF-8')
cfgDict = config['devList']
for afterCutValue in afterCutLst:
for key,values in cfgDict.items():
if afterCutValue + ',' in values:
repAfter = values.replace(afterCutValue + ',', "")
config['devList'][key] = repAfter
config.write()
elif afterCutValue == values:
conn = sqlite3.connect('alldata.db')
c = conn.cursor()
Currsql_res = c.execute("SELECT * FROM devices WHERE ID='{0}'".format(afterCutValue))
Currsql_res_List = list(Currsql_res)
conn.commit()
conn.close()
saveVal = config['list']['jifang'].replace(Currsql_res_List[0][4]+"|", "")
config['list']['jifang'] = saveVal
config.write()
config['list']['jifang'].replace("|"+Currsql_res_List[0][4], "")
config['list']['jifang'] = saveVal
config.write()
config['list']['jifang'].replace(Currsql_res_List[0][4],"")
config['list']['jifang'] = saveVal
config.write()
del config['devList'][key]
config.write()
elif afterCutValue in values:
repAfter = values.replace(',' + afterCutValue, "")
config['devList'][key] = repAfter
config.write()
print('【INFO】已完成删除\n')
os.system('pause')
os.system('cls')
continue
elif deldevs.isdigit() == True:
config = ConfigObj('blockconfig.ini', encoding='UTF-8')
cfgDict = config['devList']
for key, values in cfgDict.items():
if deldevs + ',' in values:
repAfter = values.replace(deldevs + ',', "")
config['devList'][key] = repAfter
config.write()
elif deldevs == values:
conn = sqlite3.connect('alldata.db')
c = conn.cursor()
Currsql_res = c.execute(
"SELECT * FROM devices WHERE ID='{0}'".format(deldevs))
Currsql_res_List = list(Currsql_res)
conn.commit()
conn.close()
saveVal = config['list']['jifang'].replace(Currsql_res_List[0][4] + "|", "")
config['list']['jifang'] = saveVal
config.write()
config['list']['jifang'].replace("|" + Currsql_res_List[0][4], "")
config['list']['jifang'] = saveVal
config.write()
config['list']['jifang'].replace(Currsql_res_List[0][4], "")
config['list']['jifang'] = saveVal
config.write()
del config['devList'][key]
config.write()
elif deldevs in values:
repAfter = values.replace(',' + deldevs, "")
config['devList'][key] = repAfter
config.write()
print(ColorLogDecorator().green('【INFO】已完成删除\n', 'strong'))
os.system('pause')
os.system('cls')
continue
elif deldevs == "" or deldevs.upper() == "Q":
os.system('cls')
continue
elif manaBlockInput == "4":
os.system('cls')
config = ConfigObj('blockconfig.ini', encoding='UTF-8')
print("============================")
print(" 【通用设备登录账号管理】")
print(" 账号:{0}".format(config['account']['username']))
print(" 密码:{0}".format(config['account']['password']))
print("============================\n")
modifyUser = input(" 修改账号为(留空则不修改)")
modifyPass = input(" 修改密码为(留空则不修改)")
if modifyUser != "":
config['account']['username'] = modifyUser
if modifyPass != "":
config['account']['password'] = modifyPass
config.write()
print(ColorLogDecorator().green("【INFO】修改完成\n", "strong"))
os.system('pause')
os.system('cls')
elif manaBlockInput.upper() == "Q" or manaBlockInput.upper() == "QUIT":
os.system('cls')
break
else:
os.system('cls')
continue
elif manaInput == "quit" or manaInput == "q":
os.system('cls')
break
else:
print(ColorLogDecorator.red("指令错误!\n", "strong"))
os.system('pause')
os.system('cls')
continue
# 导出所有设备配置信息
class devConfig_export:
def __init__(self):
self.out_filepath = ''
def main(self):
conn = sqlite3.connect('alldata.db')
c = conn.cursor()
sqlRes = c.execute("SELECT * FROM devices")
if os.path.isfile('blockconfig.ini'):
config = ConfigObj('blockconfig.ini', encoding='UTF-8')
conf_un = config['account']['username']
conf_pw = config['account']['password']
if conf_un == '' or conf_pw == '':
print('【ERROR】设备通用登录账号未设置,请设置后再操作!\n')
return
else:
print('【ERROR】设备通用登录账号未设置,请设置后再操作!\n')
return
self.out_filepath = "配置文件" + (datetime.datetime.today()).strftime('%Y-%m-%d')
if not os.path.exists(self.out_filepath):
os.mkdir(self.out_filepath)
for i in sqlRes:
if '华为' in i[3]:
self.setHuawei(i[1],i[2],conf_un,conf_pw)
elif 'H3C' in i[3]:
self.setH3C(i[1],i[2],conf_un,conf_pw)
elif '中兴' in i[3]:
self.setZhongxing(i[1],i[2],conf_un,conf_pw)
elif '锐捷' in i[3]:
self.setRuijie(i[1],i[2],conf_un,conf_pw)
elif '烽火' in i[3]:
self.setFenghuo(i[1],i[2],conf_un,conf_pw)
else:
print('【ERROR】设备【{0}】未导出配置,原因:程序暂不支持【{1}】厂商\n'.format(i[1], i[3]))
conn.commit()
conn.close()
def setHuawei(self, devName, conf_ip, conf_uname, conf_pass):
try:
# 创建ssh对象
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=conf_ip, port=22, username=conf_uname, password=conf_pass)
# 执行命令
command = ssh.invoke_shell() # 激活Terminal
time.sleep(3)
command.send("N\n")
command.send("screen-length 0 temporary\n")
command.send("dis cu\n")
data = []
while True:
out = command.recv(65535)
res = out.decode(encoding='UTF-8')
data.append(res)
if 'return' in res:
break
r_time = '.\\' + self.out_filepath + '\\' +devName + '.txt'
res = ''.join(data)
f1 = open(r_time, 'w')
f1.write(res)
f1.close()
with open(r_time, 'r') as f2:
final_data = f2.read().replace('\n\n', '\n')
f2.close()
f3 = open(r_time, 'w')
f3.write(final_data)
f3.close()
ssh.close()
print('{0}】执行完毕!'.format(devName))
except:
print('【ERROR】连接 [{0}] 超时!'.format(devName))
def setH3C(self, devName, conf_ip, conf_uname, conf_pass):
try:
# 创建ssh对象
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=conf_ip, port=22, username=conf_uname, password=conf_pass)
# 执行命令
command = ssh.invoke_shell() # 激活Terminal
time.sleep(3)
command.send("screen-length disable\n")
command.send("dis cu\n")
data = []
while True:
out = command.recv(65535)
res = out.decode(encoding='UTF-8')
data.append(res)
if 'return' in res:
break
r_time = '.\\' + self.out_filepath + '\\' + devName + '.txt'
res = ''.join(data)
f1 = open(r_time, 'w')
f1.write(res)
f1.close()
with open(r_time, 'r') as f2:
final_data = f2.read().replace('\n\n\n', '\n')
f2.close()
f3 = open(r_time, 'w')
f3.write(final_data)
f3.close()
ssh.close()
print('{0}】执行完毕!'.format(devName))
except:
print('【ERROR】连接 [{0}] 超时!'.format(devName))
def setZhongxing(self, devName, conf_ip, conf_uname, conf_pass):
try:
# 创建ssh对象
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=conf_ip, port=22, username=conf_uname, password=conf_pass)
# 执行命令
command = ssh.invoke_shell() # 激活Terminal
time.sleep(3)
command.send("enable\n")
command.send("terminal length 0\n")
command.send("show running-config\n")
data = []
while True:
out = command.recv(65535)
res = out.decode(encoding='UTF-8')
data.append(res)
if '!</static>' in res:
break
r_time = '.\\' + self.out_filepath + '\\' + devName + '.txt'
res = ''.join(data)
f1 = open(r_time, 'w')
f1.write(res)
f1.close()
with open(r_time, 'r') as f2:
final_data = f2.read().replace('\n\n', '\n')
f2.close()
f3 = open(r_time, 'w')
f3.write(final_data)
f3.close()
ssh.close()
print('{0}】执行完毕!'.format(devName))
except:
print('【ERROR】连接 [{0}] 超时!'.format(devName))
def setRuijie(self, devName, conf_ip, conf_uname, conf_pass):
try:
# 创建ssh对象
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=conf_ip, port=22, username=conf_uname, password=conf_pass)
# 执行命令
command = ssh.invoke_shell() # 激活Terminal
time.sleep(3)
command.send("terminal length 0\n")
command.send("show running-config\n")
command.send("show hosts\n")
data = []
while True:
out = command.recv(65535)
res = out.decode(encoding='UTF-8')
data.append(res)
if "!end" in res or "Host" in res:
break
r_time = '.\\' + self.out_filepath + '\\' + devName + '.txt'
res = ''.join(data)
f1 = open(r_time, 'w')
f1.write(res)
f1.close()
with open(r_time, 'r') as f2:
final_data = f2.read().replace('\n\n\n', '\n')
f2.close()
f3 = open(r_time, 'w')
f3.write(final_data)
f3.close()
ssh.close()
print('{0}】执行完毕!'.format(devName))
except:
print('【ERROR】连接 [{0}] 超时!'.format(devName))
def setFenghuo(self, devName, conf_ip, conf_uname, conf_pass):
try:
# 创建ssh对象
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=conf_ip, port=22, username=conf_uname, password=conf_pass)
# 执行命令
command = ssh.invoke_shell() # 激活Terminal
time.sleep(3)
command.send("terminal length 0\n")
command.send("show running-config\n")
data = []
while True:
out = command.recv(65535)
res = out.decode(encoding='UTF-8')
data.append(res)
if "!end" in res or "Host" in res:
break
r_time = '.\\' + self.out_filepath + '\\' + devName + '.txt'
res = ''.join(data)
f1 = open(r_time, 'w')
f1.write(res)
f1.close()
with open(r_time, 'r') as f2:
final_data = f2.read().replace('\n\n', '\n')
f2.close()
f3 = open(r_time, 'w')
f3.write(final_data)
f3.close()
ssh.close()
print('{0}】执行完毕!'.format(devName))
except:
print('【ERROR】连接 [{0}] 超时!'.format(devName))
# ip封堵 类只需调用main函数
class ip_block:
#初始化一些变量属性
def __init__(self):
self.jifang_list = []
self.jifang_select = ''
self.block_ip = ''
self.CurrBlockDev_Info = []
ColorLogDecorator.active()
# 读取和初始化封堵设备信息
def Init_jifang_list(self):
if os.path.isfile('blockconfig.ini'):
config = ConfigObj('blockconfig.ini', encoding='UTF-8')
if config['list']['jifang'] == '':
return False
else:
if '|' in config['list']['jifang']:
self.jifang_list = config['list']['jifang'].split('|')
else:
self.jifang_list.append(config['list']['jifang'])
return True
else:
return False
#执行封堵
def startFengdu(self):
s = ''
for single_word in pypinyin.pinyin(self.jifang_select, style=pypinyin.NORMAL):
s += ''.join(single_word)
config = ConfigObj('blockconfig.ini', encoding='UTF-8')
ipblock_Devices = config['devList'][s]
if ',' in ipblock_Devices:
Curr_devList = ipblock_Devices.split(',')
conn = sqlite3.connect('alldata.db')
c = conn.cursor()
self.CurrBlockDev_Info = []
for a in Curr_devList:
Currsql_res = c.execute("SELECT * FROM devices WHERE ID='{0}'".format(a))
Currsql_res_List = list(Currsql_res)
print(Currsql_res_List)
self.CurrBlockDev_Info.append(Currsql_res_List)
if 'HUAWEI' in Currsql_res_List[0][3] or 'huawei' in Currsql_res_List[0][3] or '华为' in Currsql_res_List[0][3]:
if self.setHuawei():
print(ColorLogDecorator().green('【INFO】封堵完成请自行Ping测是否有效', 'strong'))
# self.exportToFile()
# print(ColorLogDecorator.green('【INFO】已导出配置记录表和封堵脚本至程序运行目录下', 'strong'))
elif 'H3C' in Currsql_res_List[0][3] or '华三' in Currsql_res_List[0][3]:
if self.setH3C():
print(ColorLogDecorator().green('【INFO】封堵完成请自行Ping测是否有效', 'strong'))
# self.exportToFile()
elif 'RUIJIE'in Currsql_res_List[0][3] or '锐捷' in Currsql_res_List[0][3]:
if self.setRuijie():
pass
#self.exportToFile()
elif 'ZHONGXING'in Currsql_res_List[0][3] or 'ZTE' in Currsql_res_List[0][3] or '中兴'in Currsql_res_List[0][3]:
if self.setZhongxing():
pass
# self.exportToFile()
else:
print(ColorLogDecorator().red('【ERROR】抱歉本程序不支持该厂商设备', 'strong'))
conn.commit()
conn.close()
os.system('pause')
elif ipblock_Devices.isdigit() == True:
conn = sqlite3.connect('alldata.db')
c = conn.cursor()
Currsql_res = c.execute("SELECT * FROM devices WHERE ID='{0}'".format(ipblock_Devices))
Currsql_res_List = list(Currsql_res)
if 'HUAWEI' in Currsql_res_List[0][3] or 'huawei' in Currsql_res_List[0][3] or '华为' in Currsql_res_List[0][3]:
if self.setHuawei():
print(ColorLogDecorator().green('【INFO】封堵完成请自行Ping测是否有效', 'strong'))
# self.exportToFile()
# print(ColorLogDecorator.green('【INFO】已导出配置记录表和封堵脚本至程序运行目录下', 'strong'))
elif 'H3C' in Currsql_res_List[0][3] or '华三' in Currsql_res_List[0][3]:
if self.setH3C():
print(ColorLogDecorator().green('【INFO】封堵完成请自行Ping测是否有效', 'strong'))
#self.exportToFile()
elif 'RUIJIE' in Currsql_res_List[0][3] or '锐捷' in Currsql_res_List[0][3]:
if self.setRuijie():
pass
#self.exportToFile()
elif 'ZHONGXING' in Currsql_res_List[0][3] or 'ZTE' in Currsql_res_List[0][3] or '中兴' in Currsql_res_List[0][3]:
if self.setZhongxing():
pass
#self.exportToFile()
else:
print(ColorLogDecorator.red('【ERROR】抱歉本程序不支持该厂商设备', 'strong'))
os.system('pause')
else:
print(ColorLogDecorator.red('【ERROR】抱歉发生未知错误', 'strong'))
os.system('pause')
#导出封堵脚本和配置记录表
def exportToFile(self):
pass
def setHuawei(self):
config = ConfigObj('blockconfig.ini', encoding='UTF-8')
if config['account']['username'] == '' or config['account']['password'] == '':
print(ColorLogDecorator().red('【ERROR】设备通用SSH账号密码未设置请设置后再使用本功能', 'strong'))
return False
for i in range(len(self.CurrBlockDev_Info)):
# 创建ssh对象
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=self.CurrBlockDev_Info[i][0][2], port=22, username=config['account']['username'], password=config['account']['password'])
# 执行命令
command = ssh.invoke_shell() # 激活Terminal
time.sleep(3)
command.send("N\n")
command.send("sys\n")
command.send("ip route-static {0} 255.255.255.255 NULL0\n".format(self.block_ip))
# VRP8版本的高端设备需加commit
command.send("commit\n")
command.send("return\n")
command.send("save\n")
command.send("Y\n")
time.sleep(3)
# command.recv(65535) #这里可接收结果写入日志
ssh.close()
return True
def setRuijie(self):
pass
def setH3C(self):
config = ConfigObj('blockconfig.ini', encoding='UTF-8')
if config['account']['username'] == '' or config['account']['password'] == '':
print(ColorLogDecorator().red('【ERROR】设备通用SSH账号密码未设置请设置后再使用本功能', 'strong'))
return False
for i in range(len(self.CurrBlockDev_Info)):
# 创建ssh对象
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=self.CurrBlockDev_Info[i][0][2], port=22, username=config['account']['username'],password=config['account']['password'])
# 执行命令
command = ssh.invoke_shell() # 激活Terminal
time.sleep(3)
command.send("sys\n")
command.send("ip route-static {0} 255.255.255.255 NULL0\n".format(self.block_ip))
command.send("return\n")
command.send("save\n")
command.send("Y\n")
command.send("\n")
command.send("Y\n")
time.sleep(1)
# command.recv(65535) #这里可接收结果写入日志
ssh.close()
print(ColorLogDecorator().green('【INFO】封堵完成请自行Ping测是否有效', 'strong'))
return True
def setZhongxing(self):
pass
def setCisco(self):
pass
def main(self):
if self.Init_jifang_list():
while True:
os.system('cls')
print('''
===============================================
[选择] >>要封堵的机房<<
''')
for i in range(len(self.jifang_list)):
print(' {0}. {1}'.format(i+1, self.jifang_list[i]))
print('\n (tips: 返回上一级菜单请输入q或quit)')
print('===============================================\n')
sel_jifang = input('请输入:')
if sel_jifang == 'q' or sel_jifang == 'quit' or sel_jifang == 'Q':
break
elif sel_jifang.isdigit() == True and int(sel_jifang) <= len(self.jifang_list) and int(sel_jifang) != 0:
self.jifang_select = self.jifang_list[int(sel_jifang)-1]
print('\n\n')
print('*********************************************')
inBlockIP = input(' 请输入要封堵的IP')
check_ip = re.compile('^(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\.(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)$')
if check_ip.match(inBlockIP):
self.block_ip = inBlockIP
self.startFengdu()
os.system('cls')
continue
else:
print(ColorLogDecorator().red('【ERROR】IP不合法请重新操作', 'strong'))
os.system('pause')
os.system('cls')
continue
else:
print(ColorLogDecorator().red('【ERROR】ip封堵设备信息库为空请添加相关封堵设备', 'strong'))
os.system('pause')
### 自定义颜色
class ColorLogDecorator:
"""
class: ColorLogDecorator
Desc: ues for decorate the string with ANSI escape code (color function)
class_var:
__IS_ACTIVE: whether the decorate func active
__DEFAULT_STYLE: the default style for a color selected
__END_CODE: the end escape code
"""
__IS_ACTIVE = False
__DEFAULT_STYLE = "normal"
__COLOR_CODE = {
"red": {
"normal": "\033[31m",
"strong": "\033[1;31m",
"bg": "\033[0;37;41m",
"bg-strong": "\033[1;37;41m",
},
"green": {
"normal": "\033[32m",
"strong": "\033[1;32m",
"bg": "\033[0;37;42m",
"bg-strong": "\033[1;37;42m",
},
"yellow": {
"normal": "\033[33m",
"strong": "\033[1;33m",
"bg": "\033[0;30;43m",
"bg-strong": "\033[1;30;43m",
},
"blue": {
"normal": "\033[34m",
"strong": "\033[1;34m",
"bg": "\033[0;37;44m",
"bg-strong": "\033[1;37;44m",
},
"black": {
"normal": "\033[30m",
"strong": "\033[1;30m",
"bg": "\033[0;37;40m",
"bg-strong": "\033[1;37;40m",
},
"white": {
"normal": "\033[37m",
"strong": "\033[1;37;0m",
"bg": "\033[0;30;47m",
"bg-strong": "\033[1;30;47m",
}
}
__END_CODE = "\033[0m"
@classmethod
def active(cls) -> None:
"""
active the color decorate function
it will use a special menthol for windows os
:return: None
"""
cls.__IS_ACTIVE = True
if os.name == "nt":
os.system("")
@classmethod
def deactivate(cls) -> None:
"""
deactivate the color decorate function
:return: None
"""
cls.__IS_ACTIVE = False
@classmethod
def __msg_decorator(cls, msg: str, color: str, style: str) -> str:
"""
use to decorate the msg str with special style color escape code
:param msg: the msg str
:param color: the color str to select
:param style: the style str to select
:return: decorated str
"""
if not cls.__IS_ACTIVE:
return msg
style_selected = cls.__DEFAULT_STYLE if style.lower() not in cls.__COLOR_CODE[color].keys() \
else style.lower()
return cls.__COLOR_CODE[color][style_selected] + msg + cls.__END_CODE
@classmethod
def red(cls, msg: str, style: str = "normal") -> str:
"""
red log str
:param msg: the msg str
:param style: the style to select
:return: decorated str
"""
return cls.__msg_decorator(msg, "red", style)
@classmethod
def green(cls, msg: str, style: str = "normal") -> str:
"""
green log str
:param msg: the msg str
:param style: the style to select
:return: decorated str
"""
return cls.__msg_decorator(msg, "green", style)
@classmethod
def yellow(cls, msg: str, style: str = "normal") -> str:
"""
yellow log str
:param msg: the msg str
:param style: the style to select
:return: decorated str
"""
return cls.__msg_decorator(msg, "yellow", style)
@classmethod
def blue(cls, msg: str, style: str = "normal") -> str:
"""
blue log str
:param msg: the msg str
:param style: the style to select
:return: decorated str
"""
return cls.__msg_decorator(msg, "blue", style)
@classmethod
def black(cls, msg: str, style: str = "normal") -> str:
"""
black log str
:param msg: the msg str
:param style: the style to select
:return: decorated str
"""
return cls.__msg_decorator(msg, "black", style)
@classmethod
def white(cls, msg: str, style: str = "normal") -> str:
"""
white log str
:param msg: the msg str
:param style: the style to select
:return: decorated str
"""
return cls.__msg_decorator(msg, "white", style)
if __name__ == "__main__":
menu = """
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 简易运维自动化工具-测试版 +
+ +
+ 1. 导出所有网络设备配置信息 +
+ +
+ 2. Ping测ip地址暂未开发 +
+ +
+ 3. 封堵ip地址 +
+ +
+ 4. 管理和查看设备信息数据库 +
+ +
+ ----------------------------- +
+ 本工具使用帮助 请输入 help +
+ 作者信息 请输入 author +
+ +
+ Powered By HuiJi +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
"""
while True:
print(menu)
currInput = handleMenu()
if currInput == "quit" or currInput == "q":
os.system('cls')
continue
elif currInput == "1":
devOut = devConfig_export()
devOut.main()
os.system('pause')
os.system('cls')
continue
elif currInput == "2":
os.system('cls')
ColorLogDecorator().active()
print(ColorLogDecorator().blue('\n【INFO】功能待开发', 'strong'))
os.system('pause')
os.system('cls')
continue
elif currInput == "3":
use_test = ip_block()
use_test.main()
#os.system('pause')
os.system('cls')
continue
elif currInput == "4":
os.system('cls')
manageLocalDB()
os.system('cls')
continue
elif currInput == "help":
os.system('cls')
print('''
----------------------------------------------------------------------------
本工具可用于自动化运维代替一些重复的事情后续有时间会学习PyQT或
其它任何可行方式使工具改成UI界面更便于使用
***重点*** -----本工具完美适配Windows系统其它操作系统下会报错
使用说明:
*输入对应序列号或特定指令即可操作
*首次使用,请先进入[4]添加设备信息进数据库
*封堵功能首次使用准备步骤:添加设备信息进数据库->添加封堵设备->IP封堵
由于本人工作中只用到华为和H3C的设备其它设备的封堵命令没有写进去。
*导出所有设备配置信息即:导出所有配置记录,目前只支持 华为、H3C、
锐捷、中兴、烽火 设备。
----------------------------------------------------------------------------
''')
print("\n\n")
os.system('pause')
os.system('cls')
continue
elif currInput == "author":
os.system('cls')
print('''
------------------------------------------------
本人是一名网工,在工作中会有经常性的
重复工作,写这个工具目的除了能使工作
简要化之外,还能提升编程能力。
*作者网名:灰机
*具备技能:
Python、Linux、网络管理、路由交换、
PHP 等
*个人博客blog.huiji888.cn
平时喜欢写代码、搭建和维护网站、搞搞网络,
希望各路大佬前来交流,互相促进。
-------------------------------------------------
''')
print("\n\n")
os.system('pause')
os.system('cls')
continue