#python-3.x #tkinter #netmiko
#python-3.x #tkinter #netmiko
Вопрос:
Я новичок в программировании и сейчас занимаюсь небольшим проектом для своей работы сетевого инженера.
Вся идея этого приложения: введите IP, MAC, имя пользователя, пароль: и посмотрите отпечатки из таких функций, как:
регистрация на устройстве!
сбор информации
и т. Д
и показывать всю эту информацию в режиме реального времени в print_out = tkinter.Текстовое поле
В настоящее время у меня есть 2 файла .py: MAC_search_GUI.py
MAC_search.py
MAC_search_GUI.py есть окно tkinter, в котором я могу ввести IP, MAC, имя пользователя и пароль есть еще одно окно, в котором я могу видеть журналы:
import tkinter
from tkinter import Button, Text
from tkinter import simpledialog
from MAC_search import MAC_search_func
def show_entry_fields():
IP = e1.get()
MAC = e2.get()
username = e3.get()
password = e4.get()
"""
e1.delete(0, tkinter.END)
e2.delete(0, tkinter.END)
e3.delete(0, tkinter.END)
e4.delete(0, tkinter.END)
"""
SESSION = {'ip': IP,
'device_type':'cisco_ios',
'username': username,
'password': password}
result = MAC_search_func(IP, MAC, **SESSION)
return print(result)
# f4b5.2fa0.8fca
root = tkinter.Tk()
tkinter.Label(root, text="IP:").grid(row=1)
tkinter.Label(root, text="MAC:").grid(row=2)
tkinter.Label(root, text="Username").grid(row=3)
tkinter.Label(root, text="Password").grid(row=4)
e1 = tkinter.Entry(root)
e2 = tkinter.Entry(root)
e3 = tkinter.Entry(root)
e4 = tkinter.Entry(root)
e1.grid(row=1, column=1)
e2.grid(row=2, column=1)
e3.grid(row=3, column=1)
e4.grid(row=4, column=1)
print_out = tkinter.Text(root, height = 20, width = 60, bg = "light cyan").grid(row=7, column=2)
tkinter.Button(root, text='Apply', command=show_entry_fields).grid(row=5, column=1, sticky=tkinter.W,
pady=4)
root.geometry("600x600")
root.mainloop()
Функция MAC_search_func находится в MAC_search.py , подключение к входному IP-адресу и сбор информации об этом устройстве:
import netmiko
from netmiko import ConnectHandler
from netmiko.ssh_exception import NetMikoTimeoutException
from netmiko.ssh_exception import NetMikoAuthenticationException
from paramiko.ssh_exception import SSHException
def MAC_search_func(arg_ip, arg_mac, **arg_session):
def conv_Po_to_Int(arg_int):
JSON = connection.send_command("show etherchannel summary", use_textfsm=True)
for line in JSON:
if line['po_name'] == arg_int:
int_status = line['interfaces']
return int_status[0]
interface = ''
try:
connection = netmiko.ConnectHandler(**arg_session)
print("Connection is succefull")
except NetMikoTimeoutException:
return print(" #### Device is not reachable! ####")
except NetMikoAuthenticationException:
return print(" #### Wrong Username or Password! ####")
except SSHException:
return print(" #### Make sure SSH is enabled! ####")
# Looking for MAC in Mac address table
JSON = connection.send_command("show mac address-table", use_textfsm=True)
for line in JSON:
if line['destination_address'] == arg_mac:
interface = line['destination_port']
# Checking if interface is Port channel
if interface[0:2] == "Po":
interface = conv_Po_to_Int(interface)
# IF MAC is not found
if interface == '':
return print("This MAC-ADDRESS IS NOT FOUND ON THIS IP: " arg_ip)
# If Mac was found on switch checking if Int is Trunk or Access
JSON = connection.send_command("show interfaces status", use_textfsm=True)
for line in JSON:
if line['port'] == interface:
int_status = line['vlan']
# if port is trunk checking which device located on another end
if int_status == "trunk":
JSON = connection.send_command("show cdp neighbors " interface, use_textfsm=True)
for line in JSON:
next_switch = line['neighbor']
JSON = connection.send_command("show cdp entry " next_switch)
result = JSON.find('IP address:')
return print("Looks like this mac located on device with " JSON[result:(result 21)] " and hostname: " next_switch)
else:
return print("MAC was found on " interface)
connection.disconnect()
Итак, у меня есть несколько проблем с этим:
-
Я не знаю, как отправить RETURN из моей функции MAC_searc h обратно в MAC_search_GUI, поэтому я могу распечатать его с помощью:
print_out = tkinter.Text(root, height = 20, width = 60, bg = "light cyan").grid(row=7, column=2)
-
Когда я нажимаю Применить, приложение не отвечает, пока все функции не будут завершены (5-10 секунд), потому что для подключения и получения информации от коммутатора требуется время. Как сделать так, чтобы после того, как я нажму кнопку Применить, приложение не будет ждать до конца, а просто продолжит работу, пока Return не появится в окне print_out
Ответ №1:
Извините, мачта,
Решение:
-
для моей первой проблемы:
result = MAC_search_func(IP, MAC, **SESSION) return print_out.insert("end-1c", result)
-
Для моей второй проблемы я не нашел полного решения, но теперь оно работает быстрее.