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

PowerDNS GUIはインストールするだけなら、PowerDNS自体のゾーン転送の機能を使う方法も、バックエンドのDBのレプリケーションの機能を使う方法 1 のどちらも使えます。しかし、画面上の右上の”Commit changes”ボタンは、前者でしか実質的に使えません。このボタンは裏では下記のようにshell execして、/usr/bin/pdns_controlコマンドを実行しています。

  public static function commit()
  {
    // do some checks first
    $pdns_version = trim(shell_exec("sudo /usr/bin/pdns_control version 2>&1"));


    if (!preg_match('/^[0-9,\.]+$/',$pdns_version))
    {
      if (preg_match('/\[sudo\] password/',$pdns_version))
      {
        return "Unable to run 'sudo /usr/bin/pdns_control'. Is it defined in sud
oers file?";
      }
      else
      {
        return $pdns_version;
      }
    }

このコマンドはpdnsユーザとしての実行権限が必要なので、

$ sudo bash -c "
chmod 640 /etc/sudoers
sed -i 's/\(Defaults\).*env_reset/\1 visiblepw/' /etc/sudoers
echo 'www-data       localhost=(pdns) NOPASSWD: /usr/bin/pdns_control' >> /etc/sudoers
chmod 440 /etc/sudoers"

のように、Defaultsをvisiblepwに、www-dataユーザにパスワード無しでpdnsユーザとして/usr/bin/pdns_controlの実行を許可してやらないといけません。 2

そもそも、このCommit changesボタンはpdns-guiを介した変更履歴の専用のauditテーブルを更新し、マスターからPowerDNSのゾーン転送をスレーブに通知するので、ネイティブモードの場合は実質的には必要ありません。が、変更したままCommit changesボタンを押して正常にバックグラウンドの処理が実行されないと、auditテーブルが更新されず、変更したレコードにフラグが立ったままで太字のままになっているというかなーり気持ち悪い状態です 3 。そもそも、/usr/bin/pdns_controlコマンドがsudoで実行されない様に、コードを変更してもそれとは無関係でServer Internal Error 500が返ってしまいます。何だかなぁ。

で、今回はこの修正を、と思ったのですが、時間がかかりそうなので、もう一つ別の問題を修正しました。

PowerDNS自体のレプリケーションでの問題。

前述のとおり、PowerDNS自体の機能でゾーン転送を行うのですが、PowerDNSの設定 4 を変更するだけではできません。スレーブサーバ側で、ドメイン情報を格納しているdomainsテーブルで、ドメイン毎にTYPE属性をSLAVEに、MASTER属性をマスターサーバのIPアドレスを指定しなければなりません。pdns-guiのWeb管理画面ではDomainテンプレートをMASTER, SLAVE, NATIVEの三種類を選べるのですが、残念ながらSLAVEを指定してドメインを作成しようとしても、マスターサーバのIPアドレスは指定できないため、mysqlで直接MASTER属性を変更しなければなりません。これは困った。

なので、

../../../_images/20111018021147.png

のような感じで、ドメイン作成時に、マスターサーバのIPアドレスを指定できるようにしました。この”Master IP addr”のフォームにIPアドレスを入力して実際にスレーブサーバのdomainsテーブルに反映されるのは、選択したテンプレートがSLAVEの場合で、かつ、IPアドレスが入力されている場合にしています。

これも、パッチを作って issueに登録 しておきました。

1

これはPowerDNSの用語ではネイティブモードと呼びます。

2

DebianやUbuntuでの例

3

単に気持ち悪いだけでPowerDNS自体そのものには影響はありません。

4

/etc/powerdns/pdns.conf