Я новичок в Python и пытаюсь настроить скрипт для проверки состояния определенных IOT-устройств, подключенных к Wi-Fi, в моей локальной сети.
По сути, скрипт принимает аппаратные идентификаторы Mac, которые я хочу проверить;пингует сеть для запуска ARP;ищет ответ на arp-a для соответствующих идентификаторов Mac, которые печатаются с датой и временем, если они найдены успешно.
Два вопроса- 1) В данный момент я просто ищу это по 2 адресам Mac, однако в будущемскорее всего, это будет 20. Как я могу изменить мою функцию detect_mac, чтобы она брала двумерный массив (или аналогичный) и перебирала результаты, чтобы избежать необходимости повторять строку if any(address in str_output for address in input_address_list1):
20 раз.
2) Если я оставлю этот скрипт запущенным постоянно (у него есть 10-минутный таймер между запусками), этот питон в конце концов потерпит крах?Есть ли какая-то сборка мусора, переполнение журнала и т. Д., Которые мне нужно учитывать?
import pdb, os
import subprocess
import re
import time
from subprocess import Popen, PIPE, DEVNULL
lower=1
upper=25
MAC_address_list1 = ["58:e2:zz:xx:28:d7"]
MAC_address_list2 = ["08:05:xx:zz:75:c5"]
MAC_address_list3 = ["##:##:##:##:##:##"]
MAC_address_list4 = ["##:##:##:##:##:##"]
p = {}
# Get The Current Date and Time
def getdatetime():
import time
return time.strftime("%H:%M %d/%m/%Y ")
def detect_mac(input_address_list1, input_address_list2):
# Assign list of devices on the network to "output"
output = subprocess.check_output("arp -a", shell=True)
str_output = output.decode("utf-8")
if any(address in str_output for address in input_address_list1):
print(getdatetime() + str(input_address_list1))
if any(address in str_output for address in input_address_list2):
print(getdatetime() + str(input_address_list2))
#sleep 10 minutes
time.sleep(600)
return True
while 1:
# ping all IPs in range to make ARP available
for i in range(lower,upper):
ip = "192.168.1.%d" % i
p[ip] = Popen(['ping', '-n', '-w5', '-c3', ip], stdout=DEVNULL)
detect_mac(MAC_address_list1, MAC_address_list2)