diff --git a/authentik/blueprints/migrations/0001_initial.py b/authentik/blueprints/migrations/0001_initial.py index d337f8364..5c5703e60 100644 --- a/authentik/blueprints/migrations/0001_initial.py +++ b/authentik/blueprints/migrations/0001_initial.py @@ -1,21 +1,51 @@ # Generated by Django 4.0.6 on 2022-07-31 17:35 - import uuid +from glob import glob +from pathlib import Path import django.contrib.postgres.fields from django.apps.registry import Apps from django.db import migrations, models from django.db.backends.base.schema import BaseDatabaseSchemaEditor +from yaml import load + +from authentik.lib.config import CONFIG + + +def check_blueprint_v1_file(BlueprintInstance: type["BlueprintInstance"], path: Path): + """Check if blueprint should be imported""" + from authentik.blueprints.models import BlueprintInstanceStatus + from authentik.blueprints.v1.common import BlueprintLoader + + with open(path, "r", encoding="utf-8") as blueprint_file: + raw_blueprint = load(blueprint_file.read(), BlueprintLoader) + version = raw_blueprint.get("version", 1) + if version != 1: + return + blueprint_file.seek(0) + instance: BlueprintInstance = BlueprintInstance.objects.filter(path=path).first() + if not instance: + instance = BlueprintInstance( + name=path.name, + path=str(path), + context={}, + status=BlueprintInstanceStatus.UNKNOWN, + enabled=True, + managed_models=[], + last_applied_hash="", + ) + instance.save() def migration_blueprint_import(apps: Apps, schema_editor: BaseDatabaseSchemaEditor): - from authentik.blueprints.v1.tasks import blueprints_discover - BlueprintInstance = apps.get_model("authentik_blueprints", "BlueprintInstance") Flow = apps.get_model("authentik_flows", "Flow") db_alias = schema_editor.connection.alias - blueprints_discover() + for folder in CONFIG.y("blueprint_locations"): + for file in glob(f"{folder}/**/*.yaml", recursive=True): + check_blueprint_v1_file(BlueprintInstance, Path(file)) + for blueprint in BlueprintInstance.objects.using(db_alias).all(): # If we already have flows (and we should always run before flow migrations) # then this is an existing install and we want to disable all blueprints diff --git a/authentik/blueprints/v1/tasks.py b/authentik/blueprints/v1/tasks.py index 8f81c1377..528ab6ed1 100644 --- a/authentik/blueprints/v1/tasks.py +++ b/authentik/blueprints/v1/tasks.py @@ -63,7 +63,7 @@ def apply_blueprint(self: MonitoredTask, instance_pk: str): self.save_on_success = False try: instance: BlueprintInstance = BlueprintInstance.objects.filter(pk=instance_pk).first() - if not instance: + if not instance or not instance.enabled: return with open(instance.path, "r", encoding="utf-8") as blueprint_file: importer = Importer(blueprint_file.read())