diff --git a/common/management/commands/cron.py b/common/management/commands/cron.py index 2e093f35..4aaebee4 100644 --- a/common/management/commands/cron.py +++ b/common/management/commands/cron.py @@ -3,6 +3,7 @@ from catalog.jobs import * # noqa from common.models import JobManager +from mastodon.jobs import * # noqa from users.jobs import * # noqa diff --git a/mastodon/jobs.py b/mastodon/jobs.py new file mode 100644 index 00000000..12b14b85 --- /dev/null +++ b/mastodon/jobs.py @@ -0,0 +1,40 @@ +from datetime import timedelta + +from django.utils import timezone +from loguru import logger + +from common.models import BaseJob, JobManager +from mastodon.api import detect_server_info +from mastodon.models import MastodonApplication + + +@JobManager.register +class MastodonSiteCheck(BaseJob): + max_unreachable_days = 31 + + def run(self): + 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." + )