-
Notifications
You must be signed in to change notification settings - Fork 0
/
telepinger.py
94 lines (77 loc) · 3.6 KB
/
telepinger.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import os
import subprocess
import platform
import re
import argparse
import influxdb_client
import socket
from influxdb_client.client.write_api import SYNCHRONOUS
from datetime import datetime
parser = argparse.ArgumentParser(description='Ping a host and return the results')
parser.add_argument('host', help='The host to ping')
parser.add_argument('-c', '--count', help='The number of packets to send', type=int, default=5)
parser.add_argument('-i', '--interval', help='The interval between packets', type=float, default=0.5)
args = parser.parse_args()
print("Starting Telepinger")
print('Getting environment variables')
bucket = os.environ.get('INFLUXDB_BUCKET', 'telepinger-no-bucket')
org = os.environ.get('INFLUXDB_ORG', 'my_org')
token = os.environ.get('INFLUXDB_TOKEN', 'my-token')
url = os.environ.get('INFLUXDB_URL', 'http://localhost:8086')
notify_always = os.environ.get('NOTIFY_ALWAYS', 'True')
notify_always = notify_always.lower() in ['true', '1', 'yes']
hostname = socket.gethostname()
os_name = platform.system()
print(f'Running PING on {os_name} to {args.host}')
if os_name == 'Linux':
PING_CMD = f'ping -q -c {args.count} -i {args.interval} {args.host}'
elif os_name == 'Windows':
PING_CMD = f'ping -n {args.count} -w {args.interval * 1000} {args.host}'
ping_result = subprocess.check_output(PING_CMD, shell=True, text=True)
packets_sent = 0
packets_received = 0
packet_loss = 0
min_ms = 0
max_ms = 0
avg_ms = 0
if os_name == 'Windows':
packets_sent = int(re.search(r'Packets: Sent = (\d+)', ping_result).group(1))
packets_received = int(re.search(r'Received = (\d+)', ping_result).group(1))
packet_loss = float(re.search(r'Lost = (\d+)', ping_result).group(1))
min_ms = float(re.search(r'Minimum = (\d+)ms', ping_result).group(1))
max_ms = float(re.search(r'Maximum = (\d+)ms', ping_result).group(1))
avg_ms = float(re.search(r'Average = (\d+)ms', ping_result).group(1))
elif os_name == 'Linux':
packets_sent = int(re.search(r'(\d+) packets transmitted', ping_result).group(1))
packets_received = int(re.search(r'(\d+) received', ping_result).group(1))
packet_loss = float(re.search(r'(\d+)% packet loss', ping_result).group(1))
min_ms = float(re.search(r'rtt min/avg/max/mdev = ([\d.]+)/', ping_result).group(1))
max_ms = float(re.search(r'rtt min/avg/max/mdev = [\d.]+/([\d.]+)/', ping_result).group(1))
avg_ms = float(re.search(r'rtt min/avg/max/mdev = [\d.]+/[\d.]+/([\d.]+)/', ping_result).group(1))
if notify_always or packet_loss > 0:
if packet_loss > 0:
print('Packet loss detected!')
if bucket!='telepinger-no-bucket':
# open Influx
print('Sending to InfluxDB')
client = influxdb_client.InfluxDBClient(
url=url,
token=token,
org=org
)
write_api = client.write_api(write_options=SYNCHRONOUS)
p = influxdb_client.Point("ping") \
.tag("host", hostname) \
.tag("dest", args.host) \
.field("trx", packets_sent) \
.field("rcx", packets_received) \
.field("loss", packet_loss) \
.field("min", min_ms) \
.field("max", max_ms) \
.field("avg", avg_ms)
write_api.write(bucket=bucket, org=org, record=p)
else:
print('InfluxDB details have not been specified, not sending to InfluxDB')
current_time = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ')
message = f'{current_time} - Pinged {args.host} from {hostname} and got {packets_received} packets back out of {packets_sent} sent with {packet_loss}% packet loss. Min: {min_ms}ms, Max: {max_ms}ms, Avg: {avg_ms}ms'
print(message)