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属性を変更しなければなりません。これは困った。
なので、
のような感じで、ドメイン作成時に、マスターサーバのIPアドレスを指定できるようにしました。この”Master IP addr”のフォームにIPアドレスを入力して実際にスレーブサーバのdomainsテーブルに反映されるのは、選択したテンプレートがSLAVEの場合で、かつ、IPアドレスが入力されている場合にしています。
これも、パッチを作って issueに登録 しておきました。