From dfc4cb91cc9e591291c3c679531cdb97a20d38a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Kr=C3=B6ger?= Date: Wed, 19 Jul 2023 15:43:31 +0200 Subject: [PATCH] Remove abandoned (for now) powerdns integration --- .docker/db/pdns-db.sql | 3 - .docker/pdns-auth/Dockerfile | 12 -- .docker/pdns-auth/entrypoint.sh | 19 --- .docker/pdns-auth/pdns.conf | 2 - .docker/web/entrypoint.sh | 1 - .env.dist | 9 -- .github/workflows/tests.yml | 25 ---- docker-compose.yml | 18 +-- docs/source/extensions.rst | 84 ------------- docs/source/index.rst | 1 - serveradmin/local_settings.py.example | 2 +- serveradmin/powerdns/__init__.py | 0 serveradmin/powerdns/admin.py | 3 - serveradmin/powerdns/apps.py | 21 ---- .../powerdns/fixtures/powerdns_auth.json | 20 --- .../powerdns/fixtures/powerdns_serverdb.json | 39 ------ .../powerdns/migrations/0001_initial.py | 41 ------ .../migrations/0002_powerdns_schema.py | 119 ------------------ serveradmin/powerdns/migrations/__init__.py | 0 serveradmin/powerdns/models.py | 62 --------- serveradmin/powerdns/routers.py | 37 ------ serveradmin/powerdns/signals.py | 108 ---------------- .../powerdns/templates/powerdns/menu.html | 1 - serveradmin/powerdns/tests.py | 97 -------------- serveradmin/powerdns/utils.py | 26 ---- serveradmin/powerdns/views.py | 3 - serveradmin/settings.py | 30 ----- 27 files changed, 2 insertions(+), 781 deletions(-) delete mode 100644 .docker/db/pdns-db.sql delete mode 100644 .docker/pdns-auth/Dockerfile delete mode 100755 .docker/pdns-auth/entrypoint.sh delete mode 100644 .docker/pdns-auth/pdns.conf delete mode 100644 docs/source/extensions.rst delete mode 100644 serveradmin/powerdns/__init__.py delete mode 100644 serveradmin/powerdns/admin.py delete mode 100644 serveradmin/powerdns/apps.py delete mode 100644 serveradmin/powerdns/fixtures/powerdns_auth.json delete mode 100644 serveradmin/powerdns/fixtures/powerdns_serverdb.json delete mode 100644 serveradmin/powerdns/migrations/0001_initial.py delete mode 100644 serveradmin/powerdns/migrations/0002_powerdns_schema.py delete mode 100644 serveradmin/powerdns/migrations/__init__.py delete mode 100644 serveradmin/powerdns/models.py delete mode 100644 serveradmin/powerdns/routers.py delete mode 100644 serveradmin/powerdns/signals.py delete mode 100644 serveradmin/powerdns/templates/powerdns/menu.html delete mode 100644 serveradmin/powerdns/tests.py delete mode 100644 serveradmin/powerdns/utils.py delete mode 100644 serveradmin/powerdns/views.py diff --git a/.docker/db/pdns-db.sql b/.docker/db/pdns-db.sql deleted file mode 100644 index 998896a02..000000000 --- a/.docker/db/pdns-db.sql +++ /dev/null @@ -1,3 +0,0 @@ -CREATE DATABASE powerdns; -CREATE USER powerdns WITH PASSWORD 'powerdns'; -GRANT ALL ON DATABASE powerdns TO powerdns; diff --git a/.docker/pdns-auth/Dockerfile b/.docker/pdns-auth/Dockerfile deleted file mode 100644 index 4f5099d14..000000000 --- a/.docker/pdns-auth/Dockerfile +++ /dev/null @@ -1,12 +0,0 @@ -FROM powerdns/pdns-auth-46:latest - -ARG GPGSQL_HOST -ARG GPGSQL_PORT -ARG GPGSQL_DBNAME -ARG GPGSQL_USER -ARG GPGSQL_PASSWORD - -COPY pdns.conf /etc/powerdns/pdns.conf -COPY entrypoint.sh / - -ENTRYPOINT ["/entrypoint.sh"] diff --git a/.docker/pdns-auth/entrypoint.sh b/.docker/pdns-auth/entrypoint.sh deleted file mode 100755 index 182ce4245..000000000 --- a/.docker/pdns-auth/entrypoint.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -cat < /etc/powerdns/pdns.d/pdns.local.gpgsql.conf -launch=gpgsql -gpgsql-host=$GPGSQL_HOST -gpgsql-port=$GPGSQL_PORT -gpgsql-dbname=$GPGSQL_DBNAME -gpgsql-user=$GPGSQL_USER -gpgsql-password=$GPGSQL_PASSWORD -gpgsql-dnssec=no -EOF - -until timeout 5 bash -c " /dev/null; do - echo "Waiting for database to be ready ..." - sleep 5 -done - -# https://github.com/PowerDNS/pdns/blob/master/Dockerfile-auth#L106 -/usr/bin/tini -- /usr/local/sbin/pdns_server-startup diff --git a/.docker/pdns-auth/pdns.conf b/.docker/pdns-auth/pdns.conf deleted file mode 100644 index daa8ae2d7..000000000 --- a/.docker/pdns-auth/pdns.conf +++ /dev/null @@ -1,2 +0,0 @@ -local-address=0.0.0.0,:: -include-dir=/etc/powerdns/pdns.d diff --git a/.docker/web/entrypoint.sh b/.docker/web/entrypoint.sh index bea111960..b1f6b7791 100755 --- a/.docker/web/entrypoint.sh +++ b/.docker/web/entrypoint.sh @@ -13,7 +13,6 @@ done # Apply pending migrations on every start python3 -m pipenv run python -m serveradmin migrate --no-input -python3 -m pipenv run python -m serveradmin migrate --database=powerdns --no-input # Requires Django >= 3.x # pipenv run python -m serveradmin createsuper --no-input diff --git a/.env.dist b/.env.dist index 5f313767e..50b2f95d9 100644 --- a/.env.dist +++ b/.env.dist @@ -1,5 +1,3 @@ -POSTGRES_VERSION=14 - # db service database settings POSTGRES_DB=serveradmin POSTGRES_USER=serveradmin @@ -7,13 +5,6 @@ POSTGRES_PASSWORD=serveradmin POSTGRES_HOST=db POSTGRES_PORT=5432 -# PowerDNS db service database settings -POSTGRES_POWERDNS_DB=powerdns -POSTGRES_POWERDNS_USER=powerdns -POSTGRES_POWERDNS_PASSWORD=powerdns -POSTGRES_POWERDNS_HOST=db -POSTGRES_POWERDNS_PORT=5432 - # Credentials for default super user (requires Django >= 3.x) DJANGO_SUPERUSER_USERNAME=serveradmin DJANGO_SUPERUSER_EMAIL=serveradmin@example.com diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 40ea99eb1..4bf000f11 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -31,19 +31,6 @@ jobs: --health-interval 10s --health-timeout 5s --health-retries 5 - pdns-db: - image: 'postgres:15' - env: - POSTGRES_USER: powerdns - POSTGRES_PASSWORD: powerdns - POSTGRES_DB: powerdns - ports: - - 5432/tcp - options: >- - --health-cmd pg_isready - --health-interval 10s - --health-timeout 5s - --health-retries 5 steps: - name: Setup python @@ -71,18 +58,6 @@ jobs: 'client_encoding': 'UTF8', }, }, - 'powerdns': { - 'ENGINE': 'django.db.backends.postgresql', - 'HOST': '127.0.0.1', - 'PORT': '${{ job.services.pdns-db.ports[5432] }}', - 'NAME': 'powerdns', - 'USER': 'powerdns', - 'PASSWORD': 'powerdns', - 'OPTIONS': { - 'connect_timeout': 1, - 'client_encoding': 'UTF8', - }, - }, } SECRET_KEY = 'TEST' TIME_ZONE = 'Europe/Berlin' diff --git a/docker-compose.yml b/docker-compose.yml index e8fbf9a9b..603a23ba7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,14 +2,13 @@ version: "3.9" services: db: - image: "postgres:${POSTGRES_VERSION}" + image: "postgres:15" environment: - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} volumes: - ".docker/db/postgres.conf:/etc/postgresql/postgres.conf:ro" - - ".docker/db/pdns-db.sql:/docker-entrypoint-initdb.d/pdns-db.sql:ro" - postgres-data:/var/lib/postgresql/data ports: - "127.0.0.1:5432:5432" @@ -24,20 +23,5 @@ services: depends_on: - db - pdns-auth: - build: .docker/pdns-auth - environment: - - GPGSQL_HOST=${POSTGRES_POWERDNS_HOST} - - GPGSQL_PORT=5432 - - GPGSQL_DBNAME=${POSTGRES_POWERDNS_DB} - - GPGSQL_USER=${POSTGRES_POWERDNS_USER} - - GPGSQL_PASSWORD=${POSTGRES_POWERDNS_PASSWORD} - ports: - - "127.0.0.1:1053:53" - - "127.0.0.1:1053:53/udp" - depends_on: - - db - - web - volumes: postgres-data: diff --git a/docs/source/extensions.rst b/docs/source/extensions.rst deleted file mode 100644 index fb4bdf7d4..000000000 --- a/docs/source/extensions.rst +++ /dev/null @@ -1,84 +0,0 @@ -Extensions -========== - -The PowerDNS extension is not production ready and under development. - -.. image:: images/under_construction.png - -PowerDNS --------- - -*Serveradmin PowerDNS extension is optional and not enabled by default.* - -PowerDNS is an authoritative nameserver and recursor with different (SQL) -backends. - -See `PowerDNS Homepage `_ - - -What it is -^^^^^^^^^^ - -PowerDNS extension can be used to manage DNS domains and records in -Serveradmin and synchronise them to a PowerDNS authoritative nameserver with a -PostgreSQL database backend. - -This allows to manage DNS information for your hosts from the Serveradmin -Servershell and Remote API (and it's benefits such as authentication and -authorisation). - - -How to use it -^^^^^^^^^^^^^ - -PowerDNS Authoritative Nameserver -""""""""""""""""""""""""""""""""" - -To use the PowerDNS extension you must have a running PowerDNS authoritative -nameserver with a PostgreSQL backend. - -See `Installing PowerDNS `_ -and `Generic PostgreSQL backend `_ - -Note that Serveradmin does not manage the PowerDNS database schema! - -A simple setup could look like this: - -.. image:: images/powerdns_simple_setup.png - -Depending on your needs for scalability, performance and redundancy your -setup might look different. - -Django Database Settings -"""""""""""""""""""""""" - -To advertise PowerDNS PostgreSQL backend to Serveradmin add the *pdns* -connection via .env file, environment variables or settings.py:: - - DATABASES = { - # Serveradmin database connection - 'default': {}, - # Optional PowerDNS database connection - 'pdns': { - 'ENGINE': 'django.db.backends.postgresql', - 'NAME': env('POSTGRES_PDNS_DB', default=None), - 'USER': env('POSTGRES_PDNS_USER', default=None), - 'PASSWORD': env('POSTGRES_PDNS_PASSWORD', default=None), - 'HOST': env('POSTGRES_PDNS_HOST', default=None), - 'PORT': env('POSTGRES_PDNS_PORT', default=5432), - 'OPTIONS': { - 'client_encoding': 'UTF8', - }, - }, - } - -The user role must have at least the privileges - -* SELECT -* INSERT -* UPDATE -* DELETE -* CONNECT - -See `PostgreSQL Privileges `_ - diff --git a/docs/source/index.rst b/docs/source/index.rst index e76e6ed4f..686a842a9 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -7,4 +7,3 @@ Serveradmin Documentation extending.rst python-api.rst module-adminapi.rst - extensions.rst diff --git a/serveradmin/local_settings.py.example b/serveradmin/local_settings.py.example index e0f0eb9ce..5bb80e73d 100644 --- a/serveradmin/local_settings.py.example +++ b/serveradmin/local_settings.py.example @@ -31,7 +31,7 @@ Copyright (c) 2019 InnoGames GmbH # LOGGING['loggers']['myapp'] = {'level': LOG_LEVEL} # # See https://docs.djangoproject.com/en/dev/ref/settings/#databases -# # for more detauls on how to configure your database connection. +# # for more defaults on how to configure your database connection. # DATABASES = { # } diff --git a/serveradmin/powerdns/__init__.py b/serveradmin/powerdns/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/serveradmin/powerdns/admin.py b/serveradmin/powerdns/admin.py deleted file mode 100644 index 8c38f3f3d..000000000 --- a/serveradmin/powerdns/admin.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.contrib import admin - -# Register your models here. diff --git a/serveradmin/powerdns/apps.py b/serveradmin/powerdns/apps.py deleted file mode 100644 index d7682dd8d..000000000 --- a/serveradmin/powerdns/apps.py +++ /dev/null @@ -1,21 +0,0 @@ -from django.apps import AppConfig -from django.conf import settings -from django.dispatch import Signal - -from serveradmin.serverdb.signals import post_commit - - -class PowerdnsConfig(AppConfig): - default_auto_field = 'django.db.models.BigAutoField' - name = 'serveradmin.powerdns' - - def ready(self): - if settings.PDNS_ENABLE: - from . import signals - - # Connect signals here instead of using the @receiver decorator to - # avoid accidental connection of signals when importing the signals - # module (e.g. in unit tests). - Signal.connect(post_commit, signals.create_domains) - Signal.connect(post_commit, signals.update_domains) - Signal.connect(post_commit, signals.delete_domains) diff --git a/serveradmin/powerdns/fixtures/powerdns_auth.json b/serveradmin/powerdns/fixtures/powerdns_auth.json deleted file mode 100644 index 6eca9bf2f..000000000 --- a/serveradmin/powerdns/fixtures/powerdns_auth.json +++ /dev/null @@ -1,20 +0,0 @@ -[ - { - "model": "auth.user", - "pk": 1, - "fields": { - "password": "pbkdf2_sha256$260000$FQ50K49aOkQnzZWhjW1Uxb$QeMvKAQwkw5mBsgjtEilSC6E3TdxbWbdCEhSs0JlSq8=", - "last_login": "2022-02-11T10:48:23.437Z", - "is_superuser": true, - "username": "serveradmin", - "first_name": "", - "last_name": "", - "email": "", - "is_staff": true, - "is_active": true, - "date_joined": "2022-02-11T10:47:40.821Z", - "groups": [], - "user_permissions": [] - } - } -] diff --git a/serveradmin/powerdns/fixtures/powerdns_serverdb.json b/serveradmin/powerdns/fixtures/powerdns_serverdb.json deleted file mode 100644 index e1a05e8fa..000000000 --- a/serveradmin/powerdns/fixtures/powerdns_serverdb.json +++ /dev/null @@ -1,39 +0,0 @@ -[ - { - "model": "serverdb.servertype", - "pk": "domain", - "fields": { - "description": "PowerDNS domain", - "ip_addr_type": "null" - } - }, - { - "model": "serverdb.attribute", - "pk": "type", - "fields": { - "type": "string", - "multi": false, - "hovertext": "PowerDNS domain type", - "group": "dns", - "help_link": null, - "readonly": false, - "target_servertype": null, - "reversed_attribute": null, - "clone": false, - "regexp": "\\A(MASTER|SLAVE|NATIVE)\\Z" - } - }, - { - "model": "serverdb.servertypeattribute", - "pk": 1, - "fields": { - "servertype": "domain", - "attribute": "type", - "related_via_attribute": null, - "consistent_via_attribute": null, - "required": true, - "default_value": "NATIVE", - "default_visible": false - } - } -] diff --git a/serveradmin/powerdns/migrations/0001_initial.py b/serveradmin/powerdns/migrations/0001_initial.py deleted file mode 100644 index 730f1a00f..000000000 --- a/serveradmin/powerdns/migrations/0001_initial.py +++ /dev/null @@ -1,41 +0,0 @@ -# Generated by Django 3.2.11 on 2022-01-24 09:55 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Domain', - fields=[ - ('id', models.IntegerField(primary_key=True, serialize=False)), - ('name', models.CharField(max_length=255)), - ('master', models.CharField(default=None, max_length=128)), - ('type', models.CharField(choices=[('MASTER', 'MASTER'), ('SLAVE', 'SLAVE'), ('NATIVE', 'NATIVE')], max_length=6)), - ], - options={ - 'db_table': 'domains', - 'managed': False, - }, - ), - migrations.CreateModel( - name='Record', - fields=[ - ('id', models.BigIntegerField(primary_key=True, serialize=False)), - ('name', models.CharField(default=None, max_length=255)), - ('type', models.CharField(choices=[('A', 'A'), ('AAAA', 'AAAA'), ('CNAME', 'CNAME'), ('TXT', 'TXT'), ('SSHFP', 'SSHFP'), ('SOA', 'SOA'), ('MX', 'MX'), ('PTR', 'PTR'), ('NS', 'NS')], default=None, max_length=10)), - ('content', models.CharField(default=None, max_length=65535)), - ('ttl', models.IntegerField()), - ], - options={ - 'db_table': 'records', - 'managed': False, - }, - ), - ] diff --git a/serveradmin/powerdns/migrations/0002_powerdns_schema.py b/serveradmin/powerdns/migrations/0002_powerdns_schema.py deleted file mode 100644 index e068bc645..000000000 --- a/serveradmin/powerdns/migrations/0002_powerdns_schema.py +++ /dev/null @@ -1,119 +0,0 @@ -# Generated by Django 3.2.12 on 2022-03-09 10:50 - -from django.db import migrations - - - - -class Migration(migrations.Migration): - - dependencies = [ - ('powerdns', '0001_initial'), - ] - - operations = [ - # https://doc.powerdns.com/authoritative/backends/generic-postgresql.html - # - # Added "IF NOT EXISTS" statements to not break when this is an already - # setup PowerDNS server. - migrations.RunSQL( - """ - CREATE TABLE IF NOT EXISTS domains ( - id SERIAL PRIMARY KEY, - name VARCHAR(255) NOT NULL, - master VARCHAR(128) DEFAULT NULL, - last_check INT DEFAULT NULL, - type VARCHAR(6) NOT NULL, - notified_serial BIGINT DEFAULT NULL, - account VARCHAR(40) DEFAULT NULL, - CONSTRAINT c_lowercase_name CHECK (((name)::TEXT = LOWER((name)::TEXT))) - ); - - CREATE UNIQUE INDEX IF NOT EXISTS name_index ON domains(name); - - - CREATE TABLE IF NOT EXISTS records ( - id BIGSERIAL PRIMARY KEY, - domain_id INT DEFAULT NULL, - name VARCHAR(255) DEFAULT NULL, - type VARCHAR(10) DEFAULT NULL, - content VARCHAR(65535) DEFAULT NULL, - ttl INT DEFAULT NULL, - prio INT DEFAULT NULL, - disabled BOOL DEFAULT 'f', - ordername VARCHAR(255), - auth BOOL DEFAULT 't', - CONSTRAINT domain_exists - FOREIGN KEY(domain_id) REFERENCES domains(id) - ON DELETE CASCADE, - CONSTRAINT c_lowercase_name CHECK (((name)::TEXT = LOWER((name)::TEXT))) - ); - - CREATE INDEX IF NOT EXISTS rec_name_index ON records(name); - CREATE INDEX IF NOT EXISTS nametype_index ON records(name,type); - CREATE INDEX IF NOT EXISTS domain_id ON records(domain_id); - CREATE INDEX IF NOT EXISTS recordorder ON records (domain_id, ordername text_pattern_ops); - - - CREATE TABLE IF NOT EXISTS supermasters ( - ip INET NOT NULL, - nameserver VARCHAR(255) NOT NULL, - account VARCHAR(40) NOT NULL, - PRIMARY KEY(ip, nameserver) - ); - - - CREATE TABLE IF NOT EXISTS comments ( - id SERIAL PRIMARY KEY, - domain_id INT NOT NULL, - name VARCHAR(255) NOT NULL, - type VARCHAR(10) NOT NULL, - modified_at INT NOT NULL, - account VARCHAR(40) DEFAULT NULL, - comment VARCHAR(65535) NOT NULL, - CONSTRAINT domain_exists - FOREIGN KEY(domain_id) REFERENCES domains(id) - ON DELETE CASCADE, - CONSTRAINT c_lowercase_name CHECK (((name)::TEXT = LOWER((name)::TEXT))) - ); - - CREATE INDEX IF NOT EXISTS comments_domain_id_idx ON comments (domain_id); - CREATE INDEX IF NOT EXISTS comments_name_type_idx ON comments (name, type); - CREATE INDEX IF NOT EXISTS comments_order_idx ON comments (domain_id, modified_at); - - - CREATE TABLE IF NOT EXISTS domainmetadata ( - id SERIAL PRIMARY KEY, - domain_id INT REFERENCES domains(id) ON DELETE CASCADE, - kind VARCHAR(32), - content TEXT - ); - - CREATE INDEX IF NOT EXISTS domainidmetaindex ON domainmetadata(domain_id); - - - CREATE TABLE IF NOT EXISTS cryptokeys ( - id SERIAL PRIMARY KEY, - domain_id INT REFERENCES domains(id) ON DELETE CASCADE, - flags INT NOT NULL, - active BOOL, - published BOOL DEFAULT TRUE, - content TEXT - ); - - CREATE INDEX IF NOT EXISTS domainidindex ON cryptokeys(domain_id); - - - CREATE TABLE IF NOT EXISTS tsigkeys ( - id SERIAL PRIMARY KEY, - name VARCHAR(255), - algorithm VARCHAR(50), - secret VARCHAR(255), - CONSTRAINT c_lowercase_name CHECK (((name)::TEXT = LOWER((name)::TEXT))) - ); - - CREATE UNIQUE INDEX IF NOT EXISTS namealgoindex ON tsigkeys(name, algorithm); - """, - hints={'target_db': 'powerdns'} - ) - ] diff --git a/serveradmin/powerdns/migrations/__init__.py b/serveradmin/powerdns/migrations/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/serveradmin/powerdns/models.py b/serveradmin/powerdns/models.py deleted file mode 100644 index fec008311..000000000 --- a/serveradmin/powerdns/models.py +++ /dev/null @@ -1,62 +0,0 @@ -from django.db import models - -# We provide the PowerDNS database schema for PostgreSQL with a Django -# migration using RunSQL. It creates the necessary relations etc. if they -# do not already exist. -# -# But we DON'T want Django to manage the based on the models because below -# models only contain the fields we need for the "Serveradmin to PowerDNS" -# integration and therefore are incomplete. - - -class Domain(models.Model): - """PowerDNS Domain - - Model to access domain in the PowerDNS db. - - See https://doc.powerdns.com/authoritative/backends/generic-postgresql.html#default-schema - """ - TYPES = [ - ('MASTER', 'MASTER'), - ('SLAVE', 'SLAVE'), - ('NATIVE', 'NATIVE'), - ] - - id = models.IntegerField(primary_key=True) - name = models.CharField(max_length=255, null=False) - type = models.CharField(max_length=6, null=False, choices=TYPES) - - class Meta: - managed = False - db_table = 'domains' - - -class Record(models.Model): - """PowerDNS Record - - Model to access records in the PowerDNS db. - - See https://doc.powerdns.com/authoritative/backends/generic-postgresql.html#default-schema - """ - TYPES = [ - ('A', 'A'), - ('AAAA', 'AAAA'), - ('CNAME', 'CNAME'), - ('TXT', 'TXT'), - ('SSHFP', 'SSHFP'), - ('SOA', 'SOA'), - ('MX', 'MX'), - ('PTR', 'PTR'), - ('NS', 'NS'), - ] - - id = models.BigIntegerField(primary_key=True) - domain = models.ForeignKey('Domain', on_delete=models.CASCADE) - name = models.CharField(max_length=255, default=None) - type = models.CharField(max_length=10, default=None, choices=TYPES) - content = models.CharField(max_length=65535, default=None) - ttl = models.IntegerField() - - class Meta: - managed = False - db_table = 'records' diff --git a/serveradmin/powerdns/routers.py b/serveradmin/powerdns/routers.py deleted file mode 100644 index 1de79e6ed..000000000 --- a/serveradmin/powerdns/routers.py +++ /dev/null @@ -1,37 +0,0 @@ -class PowerDNSRouter: - """ - A router to control all database operations on models in the - auth and contenttypes applications. - """ - route_app_labels = {'powerdns'} - - def db_for_read(self, model, **hints): - """ - Attempts to read powerdns models go to the pdns db. - """ - if model._meta.app_label in self.route_app_labels: - return 'powerdns' - return None - - def db_for_write(self, model, **hints): - """ - Attempts to write powerdns models go to the pdns db. - """ - if model._meta.app_label in self.route_app_labels: - return 'powerdns' - return None - - def allow_migrate(self, db, app_label, model_name=None, **hints): - """ - Apply migrations to PowerDNS db only if target_db hint is set to pdns. - - :param db: - :param app_label: - :param model_name: - :param hints: - :return: - """ - if 'target_db' in hints: - return db == hints['target_db'] - - return db != 'powerdns' diff --git a/serveradmin/powerdns/signals.py b/serveradmin/powerdns/signals.py deleted file mode 100644 index a7962b2be..000000000 --- a/serveradmin/powerdns/signals.py +++ /dev/null @@ -1,108 +0,0 @@ -import logging - -from django.conf import settings - -from serveradmin.common.utils import profile -from serveradmin.dataset import Query -from serveradmin.powerdns.models import Domain -from serveradmin.powerdns.utils import DomainSettings - -logger = logging.getLogger(__package__) - - -@profile -def create_domains(sender, **kwargs): - """Create PowerDNS domain for newly created objects - - :param sender: - :param kwargs: - :return: - """ - - if not kwargs['created']: - return - - domain_settings = settings.PDNS.get('domain') - for new_object in kwargs['created']: - servertype = new_object['servertype'] - - for domain_setting in domain_settings: - if servertype != domain_setting['servertype']: - continue - - # The Serveradmin attribute object_id is not present in the - # post_commit created data so we query the data again. - attrs = domain_setting['attributes'] - queried_object = Query( - {'hostname': new_object[attrs['name']]}, - list(attrs.values())).get() - - # All attributes are mandatory - domain = Domain() - domain.id = queried_object['object_id'] - domain.name = queried_object[attrs['name']] - domain.type = queried_object[attrs['type']] - domain.save() - - # Ensure only one domain setting is applied - break - - -@profile -def delete_domains(sender, **kwargs): - """Delete PowerDNS domain for deleted objects - - :param sender: - :param kwargs: - :return: - """ - - if not kwargs['deleted']: - return - - # deleted contains a list of object_ids that were deleted and no further - # information about e.g. servertype so we just try to delete everything - # that matches. - # - # @TODO: Find a way to avoid querying the database for irrelevant objects - Domain.objects.filter(id__in=kwargs['deleted']).delete() - - -@profile -def update_domains(sender, **kwargs): - """Update PowerDNS domain when changed - - :param sender: - :param kwargs: - :return: - """ - - if not kwargs['changed']: - return - - # Is any of the updated objects mapped to PowerDNS domain ? - object_ids = [changed['object_id'] for changed in kwargs['changed']] - domains_to_update = Domain.objects.filter(id__in=object_ids) - if not domains_to_update.exists(): - return - - domain_settings = DomainSettings() - for domain in domains_to_update: - attributes = domain_settings.get_attributes() + ['servertype'] - # @TODO Find a way to avoid this extra Query if possible - queried_object = Query({'object_id': domain.id}, attributes).get() - servertype = queried_object['servertype'] - this_settings = domain_settings.get_settings(servertype) - changed_object = next( - filter(lambda o: o['object_id'] == domain.id, kwargs['changed'])) - - has_changed = False - for pdns_key, sa_key in this_settings['attributes'].items(): - if sa_key not in changed_object.keys(): - continue - - has_changed = True - setattr(domain, pdns_key, changed_object[sa_key]['new']) - - if has_changed: - domain.save() diff --git a/serveradmin/powerdns/templates/powerdns/menu.html b/serveradmin/powerdns/templates/powerdns/menu.html deleted file mode 100644 index 0459b1148..000000000 --- a/serveradmin/powerdns/templates/powerdns/menu.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/serveradmin/powerdns/tests.py b/serveradmin/powerdns/tests.py deleted file mode 100644 index 2c94834e8..000000000 --- a/serveradmin/powerdns/tests.py +++ /dev/null @@ -1,97 +0,0 @@ -from django.contrib.auth.models import User -from django.test import TransactionTestCase - -from serveradmin.dataset import Query -from serveradmin.powerdns.models import Domain, Record -from serveradmin.powerdns.signals import ( - create_domains, - delete_domains, - update_domains, -) - - -def _create_serveradmin_domain(): - serveradmin_domain = Query().new_object('domain') - serveradmin_domain['hostname'] = 'innogames.net' - serveradmin_domain['type'] = 'NATIVE' - serveradmin_domain.commit(user=User.objects.first()) - - return serveradmin_domain - - -def _create_powerdns_domain(): - domain = Domain() - domain.id = 1 - domain.name = 'innogames.net' - domain.type = 'NATIVE' - domain.save() - - return domain - - -class DomainTests(TransactionTestCase): - reset_sequences = True - databases = '__all__' - fixtures = ['powerdns_auth.json', 'powerdns_serverdb.json'] - - def tearDown(self) -> None: - # Because PowerDNS models are unmanaged we need to take care of - # cleaning up after each test case on our own. - Domain.objects.all().delete() - Record.objects.all().delete() - - def test_create_powerdns_domain_from_post_commit_signal(self): - serveradmin_domain = _create_serveradmin_domain() - - sender = None - created = [serveradmin_domain] - create_domains(sender, created=created) - - self.assertEqual(Domain.objects.count(), 1) - - def test_delete_powerdns_domain_from_post_commit_signal(self): - domain = _create_powerdns_domain() - - self.assertEqual(Domain.objects.count(), 1) - - sender = None - deleted = [domain.id] - delete_domains(sender, deleted=deleted) - - self.assertEqual(Domain.objects.count(), 0) - - def test_update_powerdns_domain_name_from_post_commit_signal(self): - # update_domains requires a Serveradmin object to be present - _create_serveradmin_domain() - _create_powerdns_domain() - - self.assertEqual( - Domain.objects.filter(name='innogames.net').count(), 1) - - sender = None - changed = [{ - 'object_id': 1, - 'hostname': {'action': 'update', 'new': 'innogames.de'}, - }] - update_domains(sender, changed=changed) - - self.assertEqual( - Domain.objects.filter(name='innogames.de').count(), 1) - - def test_update_powerdns_domain_type_from_post_commit_signal(self): - # update_domains requires a Serveradmin object to be present - _create_serveradmin_domain() - _create_powerdns_domain() - - self.assertEqual( - Domain.objects.filter(type='NATIVE').count(), 1) - - sender = None - changed = [{ - 'object_id': 1, - 'type': {'action': 'update', 'new': 'MASTER'}, - }] - update_domains(sender, changed=changed) - - self.assertEqual( - Domain.objects.filter(type='MASTER').count(), 1) diff --git a/serveradmin/powerdns/utils.py b/serveradmin/powerdns/utils.py deleted file mode 100644 index eca3d6840..000000000 --- a/serveradmin/powerdns/utils.py +++ /dev/null @@ -1,26 +0,0 @@ -from itertools import chain -from typing import List, Dict - -from django.conf import settings - - -class DomainSettings: - def __init__(self): - self.__settings = None - - def _settings(self) -> List[Dict]: - if not self.__settings: - self.__settings = settings.PDNS.get('domain') - - return self.__settings - - def get_servertypes(self) -> List: - return [d['servertype'] for d in self._settings()] - - def get_attributes(self) -> List: - return list( - set(chain(*[d['attributes'].values() for d in self._settings()]))) - - def get_settings(self, servertype: str) -> dict: - return next( - filter(lambda d: d['servertype'] == servertype, self._settings())) diff --git a/serveradmin/powerdns/views.py b/serveradmin/powerdns/views.py deleted file mode 100644 index 91ea44a21..000000000 --- a/serveradmin/powerdns/views.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.shortcuts import render - -# Create your views here. diff --git a/serveradmin/settings.py b/serveradmin/settings.py index 9aa24bfa6..e26bd51b7 100644 --- a/serveradmin/settings.py +++ b/serveradmin/settings.py @@ -28,7 +28,6 @@ # Try to connect to a local postgres DB called serveradmin via user based # authentication by default. DATABASES = { - # Serveradmin database connection 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': env('POSTGRES_DB', default=None), @@ -41,21 +40,7 @@ 'client_encoding': 'UTF8', }, }, - # Optional PowerDNS database connection - 'powerdns': { - 'ENGINE': 'django.db.backends.postgresql', - 'NAME': env('POSTGRES_POWERDNS_DB', default=None), - 'USER': env('POSTGRES_POWERDNS_USER', default=None), - 'PASSWORD': env('POSTGRES_POWERDNS_PASSWORD', default=None), - 'HOST': env('POSTGRES_POWERDNS_HOST', default=None), - 'PORT': env('POSTGRES_POWERDNS_PORT', default=5432), - 'OPTIONS': { - 'connect_timeout': 1, - 'client_encoding': 'UTF8', - }, - }, } -DATABASE_ROUTERS = ['serveradmin.powerdns.routers.PowerDNSRouter'] MIDDLEWARE = [ 'django.middleware.common.CommonMiddleware', @@ -83,14 +68,12 @@ 'serveradmin.resources', 'serveradmin.serverdb', 'serveradmin.servershell', - 'serveradmin.powerdns', 'compressor', ] MENU_TEMPLATES = [ 'servershell/menu.html', 'resources/menu.html', - 'powerdns/menu.html', ] ROOT_URLCONF = 'serveradmin.urls' @@ -213,19 +196,6 @@ 'graphOnly=true' ) -# Disable PowerDNS integration by default -PDNS_ENABLE = False -# Serveradmin to PowerDNS mapping -PDNS = { - 'domain': [{ - 'servertype': 'domain', - 'attributes': { - 'name': 'hostname', - 'type': 'type', - } - }], -} - # Using exec certainly isn't an awesome solution but it's the best we've got. # The problem boils down to django configs being python files but python only # imports code from modules in its path. One solution would be to generate a