Как правильно использовать функции с GUI и netmiko

#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()
  

Итак, у меня есть несколько проблем с этим:

  1. Я не знаю, как отправить RETURN из моей функции MAC_searc h обратно в MAC_search_GUI, поэтому я могу распечатать его с помощью:

       print_out = tkinter.Text(root, height = 20,  width = 60,  bg = "light cyan").grid(row=7, column=2)
      
  2. Когда я нажимаю Применить, приложение не отвечает, пока все функции не будут завершены (5-10 секунд), потому что для подключения и получения информации от коммутатора требуется время. Как сделать так, чтобы после того, как я нажму кнопку Применить, приложение не будет ждать до конца, а просто продолжит работу, пока Return не появится в окне print_out

Ответ №1:

Извините, мачта,

Решение:

  1. для моей первой проблемы:

            result = MAC_search_func(IP, MAC, **SESSION)
           return print_out.insert("end-1c", result)
      
  2. Для моей второй проблемы я не нашел полного решения, но теперь оно работает быстрее.