diff --git a/mastodon/management/commands/check_sites.py b/mastodon/management/commands/check_sites.py new file mode 100644 index 00000000..4a074bd8 --- /dev/null +++ b/mastodon/management/commands/check_sites.py @@ -0,0 +1,42 @@ +import pprint +from datetime import timedelta + +from django.core.management.base import BaseCommand +from django.utils import timezone +from loguru import logger + +from mastodon.api import detect_server_info +from mastodon.models import MastodonApplication + + +class Command(BaseCommand): + help = "Check mastodon sites' status and disable unreachable sites." + + max_unreachable_days = 31 + + def handle(self, *args, **options): + logger.info("Mastodon Site Check start.") + count_checked = 0 + count_unreachable = 0 + count_disabled = 0 + for site in MastodonApplication.objects.exclude(disabled=True): + domain = None + count_checked += 1 + try: + domain, api_domain, v = detect_server_info(site.domain_name) + site.last_reachable_date = timezone.now() + except: + logger.warning(f"Failed to detect server info for {site.domain_name}") + count_unreachable += 1 + if site.last_reachable_date is None: + site.last_reachable_date = timezone.now() - timedelta(days=1) + if timezone.now() > site.last_reachable_date + timedelta( + days=self.max_unreachable_days + ): + site.disabled = True + count_disabled += 1 + finally: + site.save(update_fields=["last_reachable_date", "disabled"]) + logger.info( + f"Mastodon Site Check finished, {count_checked} checked, {count_unreachable} unreachable, {count_disabled} disabled." + )