Add ping.py
This commit is contained in:
@@ -0,0 +1,152 @@
|
|||||||
|
#!/bin/python3
|
||||||
|
|
||||||
|
#importing the required modules
|
||||||
|
|
||||||
|
import json
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
|
||||||
|
#file which will hold the online/offline status of servers
|
||||||
|
|
||||||
|
file = "status.json"
|
||||||
|
|
||||||
|
|
||||||
|
#dictionary containing current server hostnames/ips
|
||||||
|
|
||||||
|
servers = {
|
||||||
|
"link": "1.2.3.4",
|
||||||
|
"ganon": "5.6.7.8",
|
||||||
|
"zelda": "9.10.1.12",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#function for pinging servers to check if they are offline
|
||||||
|
#logic: create empty dictionary called status
|
||||||
|
#loop over pre-defined servers dictionary, key is server, value is ip
|
||||||
|
#ping each server's ip
|
||||||
|
#if the return code for the ping is 0, the server's online status is true
|
||||||
|
#else its false/offline/unreachable
|
||||||
|
|
||||||
|
def online_check():
|
||||||
|
status = {}
|
||||||
|
|
||||||
|
for server, ip in servers.items():
|
||||||
|
result = subprocess.run(
|
||||||
|
["ping", "-c", "2", "-W", "1", ip],
|
||||||
|
stdout=subprocess.DEVNULL,
|
||||||
|
stderr=subprocess.DEVNULL
|
||||||
|
)
|
||||||
|
|
||||||
|
if result.returncode == 0:
|
||||||
|
status[server] = True
|
||||||
|
else:
|
||||||
|
status[server] = False
|
||||||
|
|
||||||
|
return status
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#function for sending an email notification
|
||||||
|
#logic: we are defining this subprocess as notify
|
||||||
|
#any argument given to it becomes "email"
|
||||||
|
#we later pass offline_message/online_message to it as the email to send
|
||||||
|
|
||||||
|
def notify(email):
|
||||||
|
subprocess.run(
|
||||||
|
["msmtp", "cool@dude.wow"],
|
||||||
|
input=email,
|
||||||
|
text=True
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#check to see if we can ping apache-intranet
|
||||||
|
#(primary server for porygon monitoring)
|
||||||
|
|
||||||
|
|
||||||
|
result = subprocess.run(
|
||||||
|
["ping", "-c", "5", "-W", "2", "200.201.202.203"],
|
||||||
|
stdout=subprocess.DEVNULL,
|
||||||
|
stderr=subprocess.DEVNULL
|
||||||
|
)
|
||||||
|
|
||||||
|
#if apache-intranet is currently offline
|
||||||
|
#and we have a current status.json
|
||||||
|
#build previous status dictionary from it
|
||||||
|
try:
|
||||||
|
with open(file) as f:
|
||||||
|
previous_status = json.load(f)
|
||||||
|
except FileNotFoundError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
if result.returncode == 0:
|
||||||
|
print("apache-intranet is online")
|
||||||
|
#apache-intranet is online
|
||||||
|
#delete status.json
|
||||||
|
#only need to keep track during outages
|
||||||
|
#this server is the backup
|
||||||
|
subprocess.run(["rm", "-f", file])
|
||||||
|
else:
|
||||||
|
#apache-intranet is not offline
|
||||||
|
#check if status.json exists
|
||||||
|
#if it does we are currently in the midst of an outage
|
||||||
|
check = subprocess.run(["test", "-f", file])
|
||||||
|
if check.returncode == 0:
|
||||||
|
status = online_check()
|
||||||
|
for server, ip in servers.items():
|
||||||
|
|
||||||
|
if status[server] == True:
|
||||||
|
if previous_status.get(server) == False:
|
||||||
|
|
||||||
|
online_message = f"""To: this@again.com
|
||||||
|
Subject: {server} is back online
|
||||||
|
|
||||||
|
{server} at {ip} looks to be back online and is now respon>
|
||||||
|
"""
|
||||||
|
notify(online_message)
|
||||||
|
|
||||||
|
if status[server] == False:
|
||||||
|
if previous_status.get(server) == True:
|
||||||
|
offline_message = f"""To: lmao@haha.lol
|
||||||
|
Subject: {server} is offline
|
||||||
|
|
||||||
|
{server} at {ip} looks to be offline and is no longer responding to pings.
|
||||||
|
"""
|
||||||
|
notify(offline_message)
|
||||||
|
with open(file, "w") as f:
|
||||||
|
json.dump(status, f, indent=4)
|
||||||
|
|
||||||
|
|
||||||
|
#if status.json does not exist
|
||||||
|
#but apache-intranet is not reachable
|
||||||
|
#then this is the moment porygon has become aware of the outage
|
||||||
|
#we have no reference to track back online/healing alerts
|
||||||
|
#only offline ones
|
||||||
|
else:
|
||||||
|
subprocess.run(["touch", file])
|
||||||
|
|
||||||
|
status = online_check()
|
||||||
|
|
||||||
|
for server, ip in servers.items():
|
||||||
|
|
||||||
|
offline_message = f"""To: oh.no@all.offline
|
||||||
|
Subject: {server} is offline
|
||||||
|
|
||||||
|
{server} at {ip} looks to be offline and is no longer responding to pings.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if status[server] == True:
|
||||||
|
print(f"{server} is online")
|
||||||
|
status[server] = True
|
||||||
|
else:
|
||||||
|
print(f"{server} is offline")
|
||||||
|
notify(offline_message)
|
||||||
|
|
||||||
|
with open(file, "w") as f:
|
||||||
|
json.dump(status, f, indent=4)
|
||||||
Reference in New Issue
Block a user