68 lines
3.4 KiB
Python
68 lines
3.4 KiB
Python
from fediseer.fediverse import InstanceInfo
|
|
from fediseer.database import functions as database
|
|
from fediseer.classes.instance import Instance
|
|
from fediseer.flask import db
|
|
import fediseer.exceptions as e
|
|
from datetime import datetime
|
|
from loguru import logger
|
|
|
|
def ensure_instance_registered(domain, allow_unreachable=False, record_unreachable = False, allowed_timeout=5):
|
|
if domain == "localhost":
|
|
raise e.BadRequest("Cannot seek for localhost")
|
|
instance = database.find_instance_by_domain(domain)
|
|
try:
|
|
instance_info = InstanceInfo(domain,allow_unreachable=allow_unreachable, req_timeout=allowed_timeout)
|
|
instance_info.get_instance_info()
|
|
except Exception as err:
|
|
if record_unreachable and instance and instance.software != "wildcard":
|
|
# We only consider an instance unreachable if we can't reach its nodeinfo
|
|
# This means that a misconfigured instance will also be considered as 'down'
|
|
if instance_info.node_info is None:
|
|
logger.warning(f"Recorded {domain} as unreachable.")
|
|
instance.updated = datetime.utcnow()
|
|
if instance_info.domain_exists():
|
|
instance.poll_failures += 1
|
|
else:
|
|
instance.poll_failures += 60
|
|
db.session.commit()
|
|
if not allow_unreachable:
|
|
raise e.BadRequest(str(err))
|
|
if instance:
|
|
if (
|
|
instance.software != instance_info.software or
|
|
instance.version != instance_info.version or
|
|
instance.open_registrations != instance_info.open_registrations or
|
|
instance.approval_required != instance_info.approval_required or
|
|
instance.email_verify != instance_info.email_verify or
|
|
instance.has_captcha != instance_info.has_captcha or
|
|
instance.poll_failures > 0
|
|
):
|
|
# logger.debug(["new",instance_info.software,instance_info.open_registrations,instance_info.approval_required,instance_info.email_verify,instance_info.has_captcha])
|
|
# logger.debug(["old", instance.software,instance.open_registrations,instance.approval_required,instance.email_verify,instance.has_captcha])
|
|
logger.debug(f"Updated instance info for {domain}")
|
|
instance.software = instance_info.software
|
|
instance.version = instance_info.version
|
|
instance.open_registrations = instance_info.open_registrations
|
|
instance.approval_required = instance_info.approval_required
|
|
instance.email_verify = instance_info.email_verify
|
|
instance.has_captcha = instance_info.has_captcha
|
|
instance.updated = datetime.utcnow()
|
|
instance.poll_failures = 0
|
|
db.session.commit()
|
|
return instance, instance_info
|
|
poll_failures = 0
|
|
if not instance_info.domain_exists():
|
|
# If the domain is gone, we assume straight decommission
|
|
poll_failures = 100
|
|
new_instance = Instance(
|
|
domain=domain,
|
|
open_registrations=instance_info.open_registrations,
|
|
email_verify=instance_info.email_verify,
|
|
approval_required=instance_info.approval_required,
|
|
has_captcha=instance_info.has_captcha,
|
|
software=instance_info.software,
|
|
version=instance_info.version,
|
|
poll_failures=poll_failures,
|
|
)
|
|
new_instance.create()
|
|
return new_instance, instance_info |