Files
FunguyBot/plugins/isup.py
T
2026-05-07 17:37:20 -05:00

71 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
This plugin provides a command to check if a website or server is up.
"""
import logging
import aiohttp
import socket
import simplematrixbotlib as botlib
from plugins.utils import is_public_destination
async def check_http(domain):
"""Check if HTTP service is up for the given domain."""
try:
async with aiohttp.ClientSession() as session:
async with session.get(f"http://{domain}") as response:
return response.status == 200
except aiohttp.ClientError:
return False
async def check_https(domain):
"""Check if HTTPS service is up for the given domain."""
try:
async with aiohttp.ClientSession() as session:
async with session.get(f"https://{domain}") as response:
return response.status == 200
except aiohttp.ClientError:
return False
async def handle_command(room, message, bot, prefix, config):
"""Handle the !isup command."""
match = botlib.MessageMatch(room, message, bot, prefix)
if match.is_not_from_this_bot() and match.prefix() and match.command("isup"):
logging.info("Received !isup command")
args = match.args()
if len(args) != 1:
await bot.api.send_markdown_message(room.room_id, "Usage: !isup <ipv4/ipv6/domain>")
return
target = args[0]
try:
ip_address = socket.gethostbyname(target)
except socket.gaierror:
logging.info(f"DNS resolution failed for {target}")
await bot.api.send_markdown_message(room.room_id, f"❌ DNS resolution failed for **{target}**")
return
if not is_public_destination(ip_address):
await bot.api.send_text_message(room.room_id,
"❌ Checking internal/private IPs is not allowed.")
return
await bot.api.send_markdown_message(room.room_id,
f"✅ DNS resolution successful for **{target}**: **{ip_address}** (A record)")
if await check_http(target):
await bot.api.send_markdown_message(room.room_id, f"🖧 **{target}** HTTP service is up")
elif await check_https(target):
await bot.api.send_markdown_message(room.room_id, f"🖧 **{target}** HTTPS service is up")
else:
await bot.api.send_markdown_message(room.room_id, f"😕 **{target}** HTTP/HTTPS services are down")
# ---------------------------------------------------------------------------
# Plugin Metadata
# ---------------------------------------------------------------------------
__version__ = "1.0.1"
__author__ = "Funguy Bot"
__description__ = "Check if a site is up"
__help__ = """
<details>
<summary><strong>!isup</strong> Is it up?</summary>
<p><code>!isup &lt;domain or IP&gt;</code> Performs DNS resolution and checks HTTP/HTTPS availability.</p>
</details>
"""