PowerDNS pgsql Backend

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
hec_tech
Beiträge: 1096
Registriert: 28.06.2007 21:49:36
Wohnort: Wien
Kontaktdaten:

PowerDNS pgsql Backend

Beitrag von hec_tech » 26.02.2025 10:17:43

Ich habe ein Setup mit 3 PowerDNS Auth Servern mit PostgreSQL als Backend.

Es läuft auch alles sehr gut nur ist mir ein Problem aufgefallen:

Die comments funktionieren nicht bzw sind nicht den records zugewiesen:

Code: Alles auswählen

CREATE TABLE 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 rec_name_index ON records(name);
CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);
CREATE INDEX recordorder ON records (domain_id, ordername text_pattern_ops);



CREATE TABLE 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 comments_domain_id_idx ON comments (domain_id);
CREATE INDEX comments_name_type_idx ON comments (name, type);
CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);

Bis auf TXT fällt dies jedoch nicht auf da die anderen Records ja meist unique sind.

Meiner Meinung nach fehlt record_id in der comments table. domain_id wäre dann ansich überflüssig da ja über records auflösbar oder man nimmt beides.

Hat sonst noch jemand das Problem? Ich will nur ungern das Schema ändern aber eben doch die Kommentarfunktion nutzen.

Benutzeravatar
heisenberg
Beiträge: 4236
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: PowerDNS pgsql Backend

Beitrag von heisenberg » 26.02.2025 10:40:41

Ich nutze hier PowerDNS mit MySQL. Das Datenbankschema ist hier gleich und es funktioniert einwandfrei. Würde mich wundern, wenn hier ein kaputtes Schema vorläge.

Ich vermute, PowerDNS nutzt hier zur Zuordnung der Kommentare domain_id, name und type sowie eine Enumeration im Falle mehrerer gleicher Records. (Würde ich selbst so zwar nicht machen. Plausible Gründe, dass so umzusetzen, kann ich aber sehen. Ansonsten kann ich mit Bert Hubert in Sachen Programmierkompetenz vermutlich nicht so ganz mithalten.)

So sieht das bei mir in der Tabelle aus:

Code: Alles auswählen

MariaDB [pdns]> select * from records where domain_id=2 and type="TXT" and name = "mydomain.de";
+--------+-----------+-------------+------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+------+-------------+----------+-----------+------+
| id     | domain_id | name        | type | content                                                                                                                                                          | ttl   | prio | change_date | disabled | ordername | auth |
+--------+-----------+-------------+------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+------+-------------+----------+-----------+------+
| 202094 |         2 | mydomain.de | TXT  | "google-site-verification=0000000000000000000000000000000000000000000"                                                                                           | 86400 |    0 |        NULL |        0 | NULL      |    1 |
| 202095 |         2 | mydomain.de | TXT  | "v=spf1 ....."                                                                                                                                                   | 86400 |    0 |        NULL |        0 | NULL      |    1 |
| 202096 |         2 | mydomain.de | TXT  | "zone-ownership-verification-0000000000000000000000000000000000000000000000000000000000000000"                                                                   | 86400 |    0 |        NULL |        0 | NULL      |    1 |
+--------+-----------+-------------+------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+------+-------------+----------+-----------+------+
3 rows in set (0,002 sec)

MariaDB [pdns]> select * from comments where name = "mydomain.de";
+----+-----------+-------------+------+-------------+---------+---------------------------+
| id | domain_id | name        | type | modified_at | account | comment                   |
+----+-----------+-------------+------+-------------+---------+---------------------------+
| 37 |         2 | mydomain.de | TXT  |  1740562524 |         | Das ist der Google-Verify |
| 38 |         2 | mydomain.de | TXT  |  1740562524 |         | Das ist ein SPF-Record    |
| 39 |         2 | mydomain.de | TXT  |  1740562524 |         |                           |
+----+-----------+-------------+------+-------------+---------+---------------------------+
3 rows in set (0,001 sec)
Einfachste Möglichkeit der Zuordnung ist, dass er die Reihenfolge von records.id übernimmt und auf die Position innerhalb der Reihenfolge vom entsprechenden Satz in der comments Tabelle zuordnet.

Die obigen Daten habe ich angelegt mit meiner Management-GUI (PowerDNS-Admin).

Was konkret funktioniert denn nicht? Wie sehen die Daten in Deiner DB zu den entsprechenden Records aus? Zeige die doch mal analog zu dem, was ich hier aufgelistet habe.

P. S.: Hier noch meine Tabellendefinitionen:

Code: Alles auswählen

MariaDB [pdns]> describe records;
+-------------+----------------+------+-----+---------+----------------+
| Field       | Type           | Null | Key | Default | Extra          |
+-------------+----------------+------+-----+---------+----------------+
| id          | bigint(20)     | NO   | PRI | NULL    | auto_increment |
| domain_id   | int(11)        | YES  | MUL | NULL    |                |
| name        | varchar(255)   | YES  | MUL | NULL    |                |
| type        | varchar(10)    | YES  |     | NULL    |                |
| content     | varchar(64000) | YES  |     | NULL    |                |
| ttl         | int(11)        | YES  |     | NULL    |                |
| prio        | int(11)        | YES  |     | NULL    |                |
| change_date | int(11)        | YES  |     | NULL    |                |
| disabled    | tinyint(1)     | YES  |     | 0       |                |
| ordername   | varchar(255)   | YES  | MUL | NULL    |                |
| auth        | tinyint(1)     | YES  |     | 1       |                |
+-------------+----------------+------+-----+---------+----------------+
11 rows in set (0,002 sec)

MariaDB [pdns]> describe comments;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| domain_id   | int(11)      | NO   | MUL | NULL    |                |
| name        | varchar(255) | NO   | MUL | NULL    |                |
| type        | varchar(10)  | NO   |     | NULL    |                |
| modified_at | int(11)      | NO   |     | NULL    |                |
| account     | varchar(40)  | YES  |     | NULL    |                |
| comment     | text         | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
7 rows in set (0,001 sec)

Antworten