Ping, обработать процент потерянных пакетов
Привет всем… Написал программу, который делает мониторинг сети, если нет соединение, запускает другой скрипт для рестарта модема. Сам код
import os
import schedule
import time
import pyautogui
def host():
hostname = "10.0.0.21"
response = os.system("ping "+hostname+" -n 1 ")
if response == 0:
return (host)
else:
os.system(r'c:/watchdog/k.bat'), pyautogui.press('F10')
host()
schedule.every(2).minutes.do(host)
while True:
schedule.run_pending()
time.sleep(1)
Но есть одна проблема: если из 20 покетов хоть один раз пингуется, оператор else не работает. Хочу добавить условие, если потерия (LOST) состовляет 60% и больше, сработал else. Как реализовать это?
Ответы (3 шт):
Попробуйте так
import os
import schedule
import time
import pyautogui
results = []
def host():
global results
hostname = "10.0.0.21"
results = [os.system("ping "+hostname+" -n 1 ")] + results[:19]
if sum(results) < 20 * 0.6:
return (host)
else:
results = []
os.system(r'c:/watchdog/k.bat'), pyautogui.press('F10')
# else:
# os.system(r'c:/watchdog/k.bat'), pyautogui.press('F10')
host()
schedule.every(2).minutes.do(host)
while True:
schedule.run_pending()
time.sleep(1)
Перенаправьте свой вывод в переменную, используя subprocess
import subprocess
host = "10.0.0.21"
response = subprocess.check_output(
['ping', '-n', '1', host],
stderr=subprocess.STDOUT,
universal_newlines=True
)
response будет содержать строку с выводом. И воспользуйтесь например регулярным выражением, чтобы достать процент потеряных пакетов
import re
pattern = r"\d{0,}\%"
lost = re.findall(pattern, response)
print(lost)
# OUT
# ['0%']
Эту строку думаю не будет сложности обработать, чтобы достать значение.
Как нибудь так:
import subprocess
import os
import re
import pyautogui
def host(hostname="192.168.1.1"):
try:
response = subprocess.check_output(
['ping', '-n', '5', hostname],
stderr=subprocess.STDOUT,
universal_newlines=True
)
print(response)
pattern = r"\d{0,}\%"
lost = int(re.findall(pattern, response)[0].replace("%",''))
print(f"Lost {lost}%")
if lost < 60:
return (host)
else:
os.system(r'c:/watchdog/k.bat'), pyautogui.press('F10')
except Exception as err:
# раскомментить
# os.system(r'c:/watchdog/k.bat'), pyautogui.press('F10')
# это для теста
print(f"Something went wrong. Error is {err}")
Здесь добавлю тест с пингом на google.com. Также изменил количество пингов с 1 на 5 и вывел ответ выполнения.
host("google.com")
Вывод
Pinging google.com [142.250.74.142] with 32 bytes of data:
Reply from 142.250.74.142: bytes=32 time=23ms TTL=51
Reply from 142.250.74.142: bytes=32 time=23ms TTL=51
Reply from 142.250.74.142: bytes=32 time=30ms TTL=51
Reply from 142.250.74.142: bytes=32 time=21ms TTL=51
Reply from 142.250.74.142: bytes=32 time=22ms TTL=51
Ping statistics for 142.250.74.142:
Packets: Sent = 5, Received = 5, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 21ms, Maximum = 30ms, Average = 23ms
Lost 0%
<function host at 0x00000142D9D054C0>
Тест на исключение:
host("h")
# OUT
# Something went wrong. Error is Command '['ping', '-n', '5', 'hostname']' returned non-zero exit status 1.
У вас вместо вывода строки с ошибкой, оставьте директиву вызова перегрузки оборудования.
Благодарю всем, кто помог... рабочий код выглядет так
import subprocess
import re
import pyautogui
import os
import schedule
import time
def host(hostname="192.168.1.1"):
try:
response = subprocess.check_output(
['ping', '-n', '5', hostname],
stderr=subprocess.STDOUT,
universal_newlines=True
)
print(response)
pattern = r"\d{0,}\%"
lost = int(re.findall(pattern, response)[0].replace("%",''))
print(f"Lost {lost}%")
if lost < 60:
return (host)
else:
os.system(r'C:/Users/Lenovo/Desktop/a.bat'), pyautogui.press('F10')
except Exception as err:
os.system(r'C:/Users/Lenovo/Desktop/a.bat'), pyautogui.press('F10')
# для теста
# print(f"Something went wrong. Error is {err}")
host(hostname="192.168.1.1")
schedule.every(10).seconds.do(host)
while True:
schedule.run_pending()
time.sleep(1)