PowerDNS MongoDB: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
Строка 52: Строка 52:
 
<BR>
 
<BR>
 
Имена используемых коллекций я не менял: (определяется в конфиге PowerDNS вероятно).
 
Имена используемых коллекций я не менял: (определяется в конфиге PowerDNS вероятно).
  +
<PRE>
 
collection-domains = domains
 
collection-domains = domains
 
collection-records = records
 
collection-records = records
Строка 57: Строка 58:
 
collection-cryptokeys = cryptokeys
 
collection-cryptokeys = cryptokeys
 
collection-tsigkeys = tsigkeys
 
collection-tsigkeys = tsigkeys
  +
</PRE>
 
<BR>
 
<BR>
   

Версия 15:10, 8 июня 2012

PowerDNS + MongoDB

Требуется - настроить ДНС сервер который будет брать данные из Монго. Почему Монго - так хочет заказчик. Заполнять базу будет отдельное приложение, днс будет частью системы.

Сборка плагина

Ни одна из бинарных сборок которые я попробовал не включала плагина для работы с монго. В gentoo не было ключа для включение плагина при компиляции. Путь один - собирать сервер руками. (чуть позже - собрать пакет для своей системы, rpm )
Для сборки требуются исходники mongo. Я не нашел как передать путь к хедерам монго - насколько я могу судить путь захардкожен. Потому (знаю что не правильно) просто скопировал все хедеры в папку с плагином (/usr/src/pdns-3.0.1/modules/mongodbbackend/)
Далее традиционно

./configure
make

Обратить внимание на описание проблем со сборкой ниже - мне пришлось "патчить" модуль до рабочего состояния. Возможно вам не прийдется, или это особенность моего дистрибутива или сборки.
make install не делаю а беру модуль и подкладываю его там где ищет pdns_server

Ошибка в плагине

Мне пришлось закоментировать использование хинтов - с ними я получал ошибку:

Jun 08 14:15:19 [MONGODBBackend: (1)] (getSOA) Query: { name: "smtp-servers.example.com" }
Jun 08 14:15:19 [MONGODBBackend: (1)] (getSOA) Query: { name: "example.com" }
Jun 08 14:15:19 We have authority, zone='example.com', id=10
Jun 08 14:15:19 UeberBackend received question for ANY of smtp-servers.example.com
Jun 08 14:15:19 [MONGODBBackend: (1)] (lookup) Query: { query: { name: "smtp-servers.example.com" }, $hint: { name: 1 } }
Jun 08 14:15:19 Ueber get() was called for a ANY record
Jun 08 14:15:19 [MONGODBBackend: (1)] (get) Error: The record '{ $err: "bad hint", code: 10113 }' is missing required element(s) for the query '{ query: { name: "smtp-servers.example.com" }, $hint: { name: 1 } }'
Jun 08 14:15:19 UeberBackend reached end of backends
Jun 08 14:15:19 After first ANY query for 'smtp-servers.example.com', id=10: weDone=0, weHaveUnauth=0, weRedirected=0
Jun 08 14:15:19 Found nothing in the ANY, but let's try wildcards..
Jun 08 14:15:19 UeberBackend received question for ANY of *.example.com
Jun 08 14:15:19 [MONGODBBackend: (1)] (lookup) Query: { query: { name: "*.example.com" }, $hint: { name: 1 } }
Jun 08 14:15:19 Ueber get() was called for a ANY record
Jun 08 14:15:19 [MONGODBBackend: (1)] (get) Error: The record '{ $err: "bad hint", code: 10113 }' is missing required element(s) for the query '{ query: { name: "*.example.com" }, $hint: { name: 1 } }'
Jun 08 14:15:19 UeberBackend reached end of backends
Jun 08 14:15:19 Found nothing in the ANY and wildcards, let's try NS referral
Jun 08 14:15:19 UeberBackend received question for NS of smtp-servers.example.com
Jun 08 14:15:19 [MONGODBBackend: (1)] (lookup) Query: { query: { name: "smtp-servers.example.com", type: "NS" }, $hint: { name: 1, type: 1 } }
Jun 08 14:15:19 Ueber get() was called for a NS record
Jun 08 14:15:19 [MONGODBBackend: (1)] (get) Error: The record '{ $err: "bad hint", code: 10113 }' is missing required element(s) for the query '{ query: { name: "smtp-servers.example.com", type: "NS" }, $hint: { name: 1, type: 1 } }'

Насколько я могу понять - нужно писать hint { ... } а не $hint. Предположительно это баг.

В файле minimal.cc удалил строку:

mongo_query.hint(q_type == "ANY" ? BSON("name" << 1) : BSON("name" << 1 << "type" << 1));

MongoDB - минимальные записи записи

Для того что бы ДНС заработал нужно внести некоторое минимально число записей и описание зоны. в Монго при попытке вставить данные в несуществующий объект он будет создан что несколько упрощает жизнь.
Имена используемых коллекций я не менял: (определяется в конфиге PowerDNS вероятно).

collection-domains = domains
collection-records = records
collection-domainmetadata = domainmetadata
collection-cryptokeys = cryptokeys
collection-tsigkeys = tsigkeys



Я сделал следующие записи:

domains

records

 db.records.find();
{ "_id" : ObjectId("4fd1dae01ac5e9baad14dc49"), "domain_id" : 10, "name" : "smtp-servers.example.com", "type" : "A", "ttl" : 120, "content" : [ 	{ 	"data" : "192.168.0.2" }, 	{ 	"data" : "192.168.0.3", 	"ttl" : 60 }, 	{ 	"data" : "192.168.0.4" } ] }
{ "_id" : ObjectId("4fd1dccd1ac5e9baad14dc4a"), "domain_id" : 10, "name" : "ns1.example.com", "type" : "A", "ttl" : 120, "content" : [ { "data" : "192.168.1.1" } ] }
{ "_id" : ObjectId("4fd1dce71ac5e9baad14dc4b"), "domain_id" : 10, "name" : "example.com", "type" : "NS", "ttl" : 120, "content" : [ { "data" : "ns1.example.com" }, { "data" : "ns2.example.com" } ] }
{ "_id" : ObjectId("4fd1dd7a1ac5e9baad14dc4c"), "domain_id" : 10, "name" : "ns2.example.com", "type" : "A", "ttl" : 120, "content" : [ { "data" : "192.168.1.2" } ] }
{ "_id" : ObjectId("4fd1de521ac5e9baad14dc4d"), "domain_id" : 10, "name" : "example.com", "type" : "NS", "ttl" : 120, "content" : [ { "data" : "ns1.example.com" }, { "data" : "ns2.example.com" } ] }