Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 5, 2022 14:48:01

Stepan89
Зарегистрирован: 2022-10-05
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Интерфейс скрипта snmp на python

Имеется скрипт, который по snmp опрашивает оборудование (температура, аптайм, уровень и т.п). У этого устройства нет NMS, поэтому пришлось искать в интернете его OID и как их считывать (через web интерфейс возможно, но чуть заморочнее). Хотелось бы сделать интерфейс для этого скрипта, а в последующем и .exe расширение (но это пока не так важно). Требуется на форме: поле для ввода IP адреса (пользователем), Кнопка (которая будет отправлять запрос) и поле для вывода результата. Возможно ли сделать такое и куда копать? И возможно ли сделать это при помощи Qt Designer? Либо мб уже есть где то на просторах интернета что то подобное?
p.s. Фото желаемого результата (+сам скрипт) ниже. Спасибо.

Прикреплённый файлы:
attachment FORO.py (1,1 KБ)

Офлайн

#2 Окт. 5, 2022 16:07:29

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1352
Репутация: +  118  -
Профиль   Отправить e-mail  

Интерфейс скрипта snmp на python

попробуйте

  
from pysnmp.entity.rfc3413.oneliner import cmdgen
import tkinter as tk
def get_data_from_sensor(ip):
	cmdGen = cmdgen.CommandGenerator()
	errorIndication, errorStatus, errorIndex, \
	varBindTable = cmdgen.CommandGenerator().bulkCmd(
		cmdgen.CommunityData('test-agent', 'community'),
		cmdgen.UdpTransportTarget((ip, 161)),
		0,
		25,
		('1.3.6.1.4.1.41927.2.15.2.6'),  # Температура
		('1.3.6.1.4.1.41927.2.15.2.7'),  # Вольтаж
		('1.3.6.1.4.1.41927.2.15.2.1'),  # Входящий оптический сигнал
		('1.3.6.1.4.1.41927.2.15.1.4'),  # Время работы
	)
	if errorIndication:
		return errorIndication
	else:
		if errorStatus:
			return'%s at %s' % (
				errorStatus.prettyPrint(),
				errorIndex and varBindTable[-1][int(errorIndex) - 1] or '?'
			)
		else:
			data = []
			for varBindTableRow in varBindTable:
				for name, val in varBindTableRow:
					data.append('%s = %s' % (name.prettyPrint(), val.prettyPrint()))
			return '\n'.join(data)
def on_click():
	ip = sv.get()
	text = get_data_from_sensor(ip)
	text_area.insert(1.0, text)
root = tk.Tk()
sv = tk.StringVar()
lbl = tk.Label(text='введите ip').pack()
entry = tk.Entry(textvariable=sv, width=50)
entry.pack()
btn = tk.Button(text='получить данные', command=on_click)
btn.pack()
text_area = tk.Text(width=50, height=10)
text_area.pack()
root.mainloop()

Офлайн

#3 Окт. 6, 2022 09:09:18

Stepan89
Зарегистрирован: 2022-10-05
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Интерфейс скрипта snmp на python

xam1816
попробуйте
Знали бы вы, как выручили. На форуме отблагодарил, но вопрос еще в том, как сделать, что бы вместо OID типа
 SNMPv2-SMI::enterprises.41927.2.15.2.6.0
отображалось название показания. Сигнал оптический и т.п.
p.s. если просто даже наставите на путь, то уже хорошо будет. Или просто лучше сделать подписи по строчкам на самой форме)))

Отредактировано Stepan89 (Окт. 6, 2022 09:12:47)

Офлайн

#4 Окт. 6, 2022 14:40:56

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Интерфейс скрипта snmp на python

Создаете словарь типа

 translates = {
    "SNMPv2-SMI::enterprises.41927.2.15.2.6.0": "Сигнал оптический",
    "SNMPv2-SMI::enterprises.41927.2.15.1.4.0": "Сигнал атаке",
}
 # потом преобразуете по нему значения
data.append('%s = %s' % (translates.get(name.prettyPrint()), val.prettyPrint()))
# или более современно
data.append(f"{translates.get(name.prettyPrint())} = {val.prettyPrint()}")



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#5 Окт. 6, 2022 14:54:55

Stepan89
Зарегистрирован: 2022-10-05
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Интерфейс скрипта snmp на python

ZerG
Создаете словарь типа
Спасибо за внимание. Будет время обязательно попробую

Офлайн

#6 Окт. 18, 2022 10:15:51

Stepan89
Зарегистрирован: 2022-10-05
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Интерфейс скрипта snmp на python

Снова я(( Время работы показывает в миллисекундах, хотелось бы в часах и минутах. Наставьте на путь истинный, как и чем лучше сделать.

Прикреплённый файлы:
attachment FORO.py (1,9 KБ)

Офлайн

#7 Окт. 18, 2022 11:52:01

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1352
Репутация: +  118  -
Профиль   Отправить e-mail  

Интерфейс скрипта snmp на python

  
from pysnmp.entity.rfc3413.oneliner import cmdgen
from datetime import datetime
import tkinter as tk
def get_data_from_sensor(ip):
    cmdGen = cmdgen.CommandGenerator()
    errorIndication, errorStatus, errorIndex, \
    varBindTable = cmdgen.CommandGenerator().bulkCmd(
        cmdgen.CommunityData('test-agent', 'public'),
        cmdgen.UdpTransportTarget((ip, 161)),
        0,
        25,
        ('1.3.6.1.4.1.41927.2.15.2.6'),  # Температура
        ('1.3.6.1.4.1.41927.2.15.2.7'),  # Вольтаж
        ('1.3.6.1.4.1.41927.2.15.2.1'),  # Входящий оптический сигнал
        ('1.3.6.1.4.1.41927.2.15.1.4'),  # Время работы
    )
    if errorIndication:
        return errorIndication
    else:
        if errorStatus:
            return'%s at %s' % (
                errorStatus.prettyPrint(),
                errorIndex and varBindTable[-1][int(errorIndex) - 1] or '?'
            )
        else:
            out = {}
            dictData = {'SNMPv2-SMI::enterprises.41927.2.15.2.6.0': 'Температура',
                        'SNMPv2-SMI::enterprises.41927.2.15.2.7.0': 'Вольтаж',
                        'SNMPv2-SMI::enterprises.41927.2.15.2.1.0': 'Входящий оптический сигнал',
                        'SNMPv2-SMI::enterprises.41927.2.15.1.4.0': 'Время работы' }
            for varBindTableRow in varBindTable:
                for name, val in varBindTableRow:
                    out.update({dictData[name.prettyPrint()]: val.prettyPrint()})
            return out
def format_data(data):
    out = ''
    for k, v in data.items():
        if k == 'Время работы':
            out += f'{k} = {datetime.fromtimestamp(v).strftime("%H:%M:%S")}\n'
        else:
            out += f'{k} = {v}\n'
    return out
def on_click():
    ip = sv.get()
    data = get_data_from_sensor(ip)
    text = format_data(data)
    text_area.insert(1.0, text)
root = tk.Tk()
sv = tk.StringVar()
lbl = tk.Label(text='IP ОП FORO').pack()
entry = tk.Entry(textvariable=sv, width=60)
entry.pack()
btn = tk.Button(text='получить данные', command=on_click)
btn.pack()
text_area = tk.Text(width=60, height=5)
text_area.pack()
root.mainloop()

Отредактировано xam1816 (Окт. 19, 2022 11:57:45)

Офлайн

#8 Окт. 19, 2022 10:51:59

Stepan89
Зарегистрирован: 2022-10-05
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Интерфейс скрипта snmp на python

xam1816
return out
Ход мыслей вроде более менее понятен) Только код срабатывает без каких либо изменений.

Офлайн

#9 Окт. 19, 2022 11:37:01

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Интерфейс скрипта snmp на python

 'Время работы' != 'время работы'

 d = {"Время работы": 1, "время работы": 2}
for key, value in d.items():
    if key == "Время работы":
        print(f"{key}:{value} is matched.")
    else:
        print(f"{key}:{value} is NOT matched.")



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Отредактировано ZerG (Окт. 19, 2022 11:42:18)

Офлайн

#10 Окт. 19, 2022 12:00:14

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1352
Репутация: +  118  -
Профиль   Отправить e-mail  

Интерфейс скрипта snmp на python

Stepan89
Только код срабатывает без каких либо изменений.
да, там “время работы” с большой буквы нужно сделать, исправил
 if k == 'Время работы':
    out += f'{k} = {datetime.fromtimestamp(v).strftime("%H:%M:%S")}\n'

Отредактировано xam1816 (Окт. 19, 2022 12:00:48)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version