Files
Status/status.py
2024-05-05 23:47:56 +02:00

87 lines
3.1 KiB
Python

import argparse
from pythonping import ping
import ipaddress
import requests
import logging
DISCORD_WEBHOOK_URL='https://discord.com/api/webhooks/1229025346385608824/kIt2dp2znu0jR85QbOPmoMAteHaB9BCJDTMfn0cHE9mwpxHkbUNc9By2Y7n6gpufoyco'
logging.basicConfig(filename='/var/log/status.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def read_document(document_name):
with open(document_name, 'r') as file:
# Leer todas las líneas del archivo y guardarlas en un conjunto
return {linea.rstrip('\n') for linea in file}
def parseArguments():
# Crear un objeto ArgumentParser
parser = argparse.ArgumentParser(description='Ejemplo de script con flags')
# Agregar los argumentos con sus respectivos flags
parser.add_argument('-F', '--fail', action='store', dest='failed', help='Indicar un archivo con lista de Fails')
parser.add_argument('-H', '--host', action='store', dest='host', help='Indicar un archivo con lista de hosts')
try:
# Parsear los argumentos de la línea de comandos
return parser.parse_args()
except argparse.ArgumentError as e:
# Si ocurre un error al analizar los argumentos, mostrar un mensaje de error
#print("Error:", e)
# Mostrar el mensaje de ayuda
parser.print_help()
exit()
def toIP(hosts):
ips = set()
for host in hosts:
try:
ip = ipaddress.IPv4Address(host)
ips.add(ip)
except ipaddress.AddressValueError:
logging.info(f"La entrada '{host}' no es una dirección IP válida.")
return ips
def check_ping(hosts, fails):
for host in hosts:
try:
response = ping(str(host), count=4, timeout=2) # verbose=True -> Para ver la respuesta del ping
if not response.success():
logging.info(f"Bad ping: {host}")
if (host not in fails):
send_discord_message(f"Ping fallido para el host: {host}")
# Añadir el host a fails
fails.add(host)
elif response.success():
if host in fails:
fails.remove(host)
send_discord_message(f"{host} disponible de nuevo")
logging.info(f"Ping correct: {host}")
except Exception as e:
logging.info(f"Bad ping: {host}")
save_status(fails)
def save_status(fails):
with open(args.failed, "w") as file:
for fail in fails:
file.write(str(fail) + "\n")
file.close
def send_discord_message(message):
data = {
"content": message
}
try:
response = requests.post(DISCORD_WEBHOOK_URL, json=data)
response.raise_for_status()
except requests.exceptions.RequestException as e:
logging.info(f"Error sending Discord message: {e}")
else:
logging.info("Discord message sent successfully!")
if __name__ == '__main__':
args = parseArguments()
ips_and_hosts = set()
fails = set()
if args.host:
ips_and_hosts.update(toIP(read_document(args.host)))
fails.update(toIP(read_document(args.failed)))
check_ping(ips_and_hosts, fails)