PowerDNS GUIの困った話(その1)。

PowerDNS のフロントエンドとして PowerDNS GUI (pdns-gui)を使おうとしているのですが、ちょっと困った問題があったのでメモしておきます。

ドメインのテンプレートが作成出来ない話。

テンプレートを作る際に、SOAレコードのcontentの値がinvalidとなり、登録できないという問題があります。pdns-guiのインストール時に自動的に設定されるdomainテンプレートのSOAレコードのcontentの値は、”ns5.dnsmadeeasy.com hostmaster.%DOMAIN% %SERIAL%”という文字列で [1] 、テンプレートからdomainを作成する際にはフォームで入力したdomainの値がこの%DOMAIN%に代入されて作成されます。pdns-guiで運用する際は、dns.madeeasy.comというドメインではなく任意のドメインを指定したいので、テンプレートとして作成する際には、例えば”ns.%DOMAIN% hostmaster.%DOMAIN% %SERIAL%”という文字列も使いたいですよね。ですが、実際にはテンプレート作成を行うapps/frontend/modules/template/actions/actions.class.phpの中で、

282       switch ($data['type'])
283       {
284         case 'SOA':
285           if (!preg_match('/^[a-z0-9\.\-_]+\s[a-z0-9\.\-_]+\s%SERIAL%/',$data['content']))
286           {
287             $this->getRequest()->setError('record',"Row $i: invalid SOA content.");
288             return false;
289           }
290           break;

となっており、”%DOMAIN%”という文字列は許可されておらず、”ns0.ca.local hostmaster.ca.local %SERIAL%” のように、文字列%DOMAIN%を使わずドメインを個別に設定する必要があります。これじゃあテンプレートの意味がありません。これじゃ使い物になりませんので、以下のような、 2行パッチ書いてissueに登録 しておきました。

diff --git a/apps/frontend/modules/template/actions/actions.class.php b/apps/frontend/modules/template/actions/actions.class.php
index 9c6b6c0..2f67b9a 100644
--- a/apps/frontend/modules/template/actions/actions.class.php
+++ b/apps/frontend/modules/template/actions/actions.class.php
@@ -282,7 +282,8 @@ class templateActions extends MyActions
       switch ($data['type'])
       {
         case 'SOA':
-          if (!preg_match('/^[a-z0-9\.\-_]+\s[a-z0-9\.\-_]+\s%SERIAL%/',$data['content']))
+          if (!preg_match('/^[a-z0-9\.\-_]+\s[a-z0-9\.\-_]+\s%SERIAL%/',$data['content']) &&
+             !preg_match('/^[a-z0-9\.\-_]+\.%DOMAIN%\s[a-z0-9\-_]+\.%DOMAIN%\s%SERIAL%/',$data['content']))
           {
             $this->getRequest()->setError('record',"Row $i: invalid SOA content.");
             return false;
--
1.7.6.3

NSレコードも同じだった。

ので、追加パッチを登録しておいた。

[1]これはdata/fixtures/sample-data.ymlファイルで指定されており、template_recordテーブルに自動的にinsertされます。