/*
 * これは named を使うにあたり、考えうるすべての書式要素を持つ、
 * 意味がなく実行することができない named.conf ファイルの例である。
 * 我々はこれをパーザのテストのために使用した。これは新しい機能を
 * 使うユーザのための概念としてのテンプレートになりうるであろう。
 */
/*
 * C スタイルのコメントを使用できる
 */

// C++ スタイルのコメントも使える

# シェルスタイルのコメントも使える

// ";" に気を付けて欲しい。これは重要である!

options {
    directory ".";          // カレントディレクトリを使用する
    named-xfer "/usr/libexec/named-xfer";   // _PATH_XFER
    pid-file "/var/run/named.pid";  // _PATH_PIDFILE
    check-names master fail;
    check-names slave warn;
    check-names response ignore;
    datasize default;
    stacksize default;
    coresize default;
    files unlimited;
    recursion yes;
    fetch-glue yes;
    fake-iquery no;
    notify yes;     // NOTIFY メッセージを送る。
                    // "zone" ステートメントでゾーンからゾーンを
                    // 基本とした通知機能をセットすることができる。
                    // これに付いては後述する。
    auth-nxdomain yes;  //  NXDOMAIN で常に AA をセットする。
                    // 意味が分からない場合はこれを 'no' にしないこと。
                    // --- 古いサーバでは理解できない。
    multiple-cnames no; //  yes の場合、1 つの名前 my が
                    // 1 つ以上の CNAME RR を持つ。これは非標準であり、
                    // 使用は推奨されていないが、以前のリリースでも
                    //  サポートされており、負荷のバランスを取るために
                    //  巨大なサイトで使われていたので使用できる。
    allow-query { any; };
    allow-transfer { any; };
    transfers-in 10;//  DEFAULT_XFERS_RUNNING 。
                    //  MAX_XFERS_RUNNING (20) より大きくしてはならない。
    transfers-per-ns 2; // DEFAULT_XFERS_PER_NS
    transfers-out 0;    // 実装されていない
    max-transfer-time-in 120;   // MAX_XFER_TIME; インバウンド(内向け)
                    //  ゾーン転送が動作するデフォルト時間間隔を分で
                    //  指定する。ゾーンごとに設定しても良い。
    /*
     * "transfer-format" オプションは、アウトバウンド(外向け)ゾーン
     * 転送(たとえば us から それら)がフォーマットされる方法を指定する。
     * 2 つの値を指定できる。
     *
     *  one-answer  各 RR が自分自身の DNS メッセージを得る。この
     *              フォーマットはそう効率的ではないが、広く理解される。
     *              BIND 8.1 以前のすべてのバージョンではアウトバウンド
     *              ゾーンに対してこのフォーマットを生成し、インバウンド
     *              転送時はこれを要求する。
     *
     *  many-answers    各 DNS メッセージに、必要な RR だけを入れる。
     *              このフォーマットは一番効率的だが、BIND 8 でしか
     *              動作しない。'many-answers' を理解するようにする
     *              ための BIND 4.9.5 named-xfer へのパッチも使える
     *              はずである。
     *
     * 古いサーバにゾーン転送を行おうとする場合は、 'many-answers' を
     * 使用するべきではない。'server' ステートメントを使えば、
     * 'transfer-format' をホストからホストごとにセットすることもできる。
     */
    transfer-format one-answer;
    query-source address * port *;
    /*
     * "forward" オプションは、"forwarders" オプションを定義した場合
     * のみ意味を持つ。
     * "forward first" を指定すると、BIND は通常の動作を行う。
     * すなわち、まずフォワーダに問い合わせを行い、それが使えなければ
     * 全検索を行う。
     * "forward only" を指定すると、BIND 4.x の "slave" や 
     * "options forward-only" と同じ動作を行なう。
     * この場合は全検索は行なわず、フォワーダだけが使用される。
     */
    forward first;
    forwarders { };         // デフォルトではフォワードは使用しない。
    /*
     * 平凡なフォワーダの例を示す。
     */
    /*
    forwarders {
        1.2.3.4;
        5.6.7.8;
    };
    */
    topology { localhost; localnets; }; // ローカルのネームサーバを選ぶ
    /*
     * 少し複雑なトポロジーの例である。topology ブロックは 1 つだけしか
     * 指定できないのでここはコメントアウトしてある。
     *
    topology {
        10/8;           // ネットワーク 10.0.0.0 を選ぶ
                        // ネットマスクは 255.0.0.0 となる
        !1.2.3/24;      // 1.2.3.0 ネットマスク 255.255.255.0 は選ばない
        { 1.2/16; 3/8; };   // 1.2.0.0 ネットマスク 255.255.0.0 または
                    // 3.0.0.0 ネットマスク 255.0.0.0 を選ぶが、
                    // 10/8 よりは小さい。
    };
    */

    listen-on port 53 { any; }; // システム内のすべてのインターフェースで
                    //  53 番ポートからの問い合わせを待つ。port 53 は
                    // オプションである。ポート番号を指定しない場合は
                    // 53 番ポートであると見なされる。
    /*
     * 複数の listen-on ステートメントを記述することができる。
     * これはより複雑な例である。
     */
    /*
    listen-on { 5.6.7.8; }; // インターフェース 5.6.7.8 で 53 番
                    //  ポートを listen する。
    listen-on port 1234 {   // ネットワーク 1.2.3、ネットマスク
                    //  255.255.255.0 の中の、インターフェース
                    //  1.2.3.4 を除くすべてのインターフェースで
                    //  ポート番号 1234 を listen する。
    };
    */
};

zone "master.demo.zone" {
    type master;            // プライマリとして使用するもの
    file "master.demo.zone";
    check-names fail;
    allow-update { none; };
    allow-transfer { any; };
    allow-query { any; };
    // notify yes;      //  NOTIFY メッセージをこのゾーンに対して
                        //  送るか?もしここで "notify" が指定されて
                        //  いなければ、グローバルオプションが使われる。
};

zone "slave.demo.zone" {
    type slave;         // セカンダリとして使われるもの
    file "slave.demo.zone";
    masters {
        1.2.3.4;        // ゾーン転送がここから行われる
        5.6.7.8;
    };
    check-names warn;
    allow-update { none; };
    allow-transfer { any; };
    allow-query { any; };
    max-transfer-time-in 120;   // 指定されていなければ、
};                              //  グローバルオプションが使われる。

zone "stub.demo.zone" {
    type stub;          //  スタブゾーンはスレーブゾーンと同じ
                        //  ようなものだが、NS レコードのみが
                        //  転送される点が異なる。
    file "stub.demo.zone";
    masters {
        1.2.3.4;        // ゾーン転送がここから行われる
        5.6.7.8;
    };
    check-names warn;
    allow-update { none; };
    allow-transfer { any; };
    allow-query { any; };
    max-transfer-time-in 120;   // 指定されていなければ、
};                              //  グローバルオプションが使われる。

zone "." {
    type hint;          // キャッシュとして使われる
    file "cache.db";    
};

acl can_query {         //  ネットワーク 1.2.3.0 ネットマスク  
    !1.2.3/24;          //  255.255.255.0 は問い合わせできない。
    any;                //  その他はよい。
};
acl can_axfr {
    1.2.3.4;            //  ホスト 1.2.3.4 と
    can_query;          //  can_query で指定されたものはOK.
};

zone "non-default-acl.demo.zone" {
    type master;
    file "foo";
    allow-query { can_query; };
    allow-transfer { can_axfr; };
    allow-update {
        1.2.3.4;
        5.6.7.8;
    };
};

key sample_key {            // TSIG 用。パーザではサポートされているが、
    algorithm hmac-md5;         // サーバの残りの部分ではまだ実装
    secret "your secret here";  // されていない。
};

key key2 {
    algorithm hmac-md5;
    secret "ereh terces rouy";
};

server 1.2.3.4 {
    bogus no;       //  yes であれば、このサーバに対しては問い合わせも
                    //  listen も行わない。
    transfer-format one-answer; // このサーバに対する転送フォーマットを
                    //  セットする(前述の 'transfer-format' を参照)。
                    //  指定されていなければ、グローバルオプション
                    //  が使われる。
    transfers 0;    // 未実装
    keys { sample_key; key2; }; // TSIG 用。パーザではサポート
                    //  されているが、サーバの残りの部分ではまだ実装
                    //  されていない。
};

logging {
    /*
     * すべてのログ出力は、1 つ以上の "チャネル" に対して行われる。
     * チャネルは必要なだけ作ることができる。
     */

    channel syslog_errors { //  このチャネルではエラーや致命的エラーを
        syslog user;        //  syslog(user 機能)に送信する。
        severity error;
    };

    /*
     * チャネルには致命度レベルがある。チャネルのレベル以上の
     * 致命度レベルを持つメッセージがそのチャネルにロギングされる。
     * 致命度レベルを下げるには、以下のレベルを使う。
     *
     *  critical        致命的エラー
     *  error
     *  warning         
     *  notice          通常だが重要なイベント
     *  info            情報メッセージ
     *  debug 1         最小の詳細デバッグ情報
     *  ...
     *  debug 99        最大の詳細デバッグ情報
     */

    /*
     * これはシステムに組み込み済みのチャネルである。
     *
     *  channel default_syslog {
     *      syslog daemon;
     *      severity info;
     *  };
     *
     *  channel default_debug {
     *      file "named.run";
     *      severity dynamic;   //  これは、サーバがどのデバッグレベル
     *                          //  にあってもデバッグログを出力し、
     *                          //  デバッグ状態でない場合は全くログ
     *  };                      //  出力しないことを意味する。
     *
     *  channel null {          //  これは最小のバケツであり、
     *      file "/dev/null"    //  このチャネルにロギングされた
     *                          //  ものはすべて破棄される。
     *  };
     *
     *  channel default_stderr {//  標準エラー出力へ送る。
     *      file "";    //  これは単なる例であり、現在のところ
     *                          //  構成言語で "stderr" を指定することは
     *      severity info;      //  できない。すなわち、試してみたり
     *  };                      //  しないように。
     *
     *  default_stderr は、サーバがデーモン化する前(すなわち初期化中
     *  の間のみ)または、(-f コマンドラインオプションで)フォアグラウンド
     *  モードで実行した場合のみ動作する。
     */

    /*
     *  ログには多くのカテゴリがあるので、ログを見たい時はいつでも、
     *  見たくないログは見ないで必要なログだけを送信することができる。
     *  そのカテゴリを以下に示す。
     *
     *  default         すべてのログを捕らえる。まだカテゴリにクラス分け
     *                  されていないログも多く存在するが、これらもすべて
     *                  捕らえることができる。また、カテゴリに対して
     *                  チャネルを指定しなかった場合、デフォルトの
     *                  カテゴリが使用される。
     *  config          高水準の構成ファイル処理
     *  parser          低水準の構成ファイル処理
     *  queries         "query logging" として使われるもの
     *  lame-servers    "Lame server on ..." のようなメッセージ
     *  statistics
     *  panic           サーバが内部の問題により終了しなければならなく
     *                  なった場合、(その問題固有のカテゴリだけでなく)
     *                  ここにもその問題を出力する
     *  update          動的更新
     *  ncache          ネガティブキャッシュ
     *  xfer-in         受信したゾーン転送
     *  xfer-out        送信するゾーン転送
     *  db              すべてのデータベース操作
     *  eventlib        イベントシステムからのデバッグ情報(後述)
     *  packet          送受信したパケットのダンプ(後述)
     *  notify          NOTIFY プロトコル
     *  cname           "XX points to a CNAME" のようなメッセージ
     *  security        認可された/されなかった要求
     *  os              OS の問題
     *  insist          妥当性チェックの失敗
     *  maintenance     定期保守
     *  load            ゾーンの読み込み(loading -- 負荷?)
     *  response-checks 以下のようなメッセージ
     *              "Malformed response ..."
     *              "wrong ans. name ..."
     *              "unrelated additional info ..."
     *              "invalid RR type ..."
     *              "bad referral ..."
     */

    category parser {
        syslog_errors;      //  必要なだけのチャネルへログを取る
        default_syslog;     //  ことができる。
    };

    category lame-servers { null; };    //  これらはロギングしない

    channel moderate_debug {            
        severity debug 3;       // レベル 3 デバッグ情報をファイルへ
        file "foo";             // foo
        print-time yes;         // タイムスタンプを付加する
        print-category yes;     // カテゴリ名を付加する
        print-severity yes;     // 致命度レベルを付加する
        /*
         *  デバッグ出力を得るには、コマンドラインまたはシグナルで
         *  デバッギングをオンにしておかなければならない。
         *  (非デバッグ出力はこのチャネルに行われる)
         */
    };

    /*
     *  "zone XXXX loaded" メッセージは不要だが、何か問題が起こった
     *  ことを知りたい場合、以下のようにすればよい。
     */
    channel no_info_messages {
        syslog;
        severity notice;
    };

    category load { no_info_messages; };

    /*
     *  カテゴリ "default" を定義することもできる。これは、カテゴリ
     *  に対して "category" ステートメントがない場合に使われる。
     */
    category default {
        default_syslog;
        moderate_debug;
    };

    /*
     *  自分自身のカテゴリ "default" を定義しない場合は、以下の
     *  デフォルトカテゴリが使用される。
     *
     *  category default { default_syslog; default_debug; };
     */

    /*
     *  自分自身のカテゴリ "panic" を定義しない場合は、以下の
     *  デフォルトの panic カテゴリが使用される。
     *
     *  category panic { default_syslog; default_stderr; };
     */

    /*
     *  2 つのカテゴリ 'packet' と 'eventlib' は特別である。これら各々に
     *  対してただ 1 つのチャネルだけを割り当てる場合は、それはファイル
     *  チャネルでなければならない。これらを定義しない場合のデフォルトは
     *  以下のようになる。
     *
     *  category eventlib { default_debug; };
     *
     *  category packet { default_debug; };
     */
};

include "filename";         // ステートメント中ではできない。