ryoma's note

マイペース ੯•́ʔ̋ ͙͛*͛ ͙͛*͛ ͙͛̋و

Goでdicというツールを作った

ホスティングサービスの運用をしていると、dig コマンドの力を借りてドメイン情報をしらべる機会がよくあります。

たとえばウェブサイト表示に問題があったり、ブラウザから SSL 証明書を確認できなかったり、メールの不通で困っているようなお問合せに関する調査です。トラブルシューティングの際に、自社管理をふくむ複数の DNS サーバーに登録されているレコード情報が誤っていないかをしらべる必要があります。

また特定のレコード情報を更新したあとは、DNS キャッシュサーバに問い合わせると TTL の影響を受けるので、権威 DNS サーバやパブリック DNS に対して問い合わせをすることになります。

クエリタイプやDNS サーバをコマンド引数で都度わたしてあげる作業がすこし手間だったので、あらかじめ知りたい条件を定義した config ファイルに沿って、ドメイン情報を集めてくれる dic *1 という CLI ツールを作りました。

並行処理がどうしても必要になりそうだったのと、以前から勉強してみたかった言語だったので、今回は Go でつくることを選択しました。

つくったもの

つかいかた

config ファイルを TOML で記述。

# config.toml
[[sec]]
  name = "demo"

  [[sec.args]]
    server = ""
    qtypes = ["a", "txt"]

  [[sec.args]]
    server = "1.1.1.1"
    qtypes = ["a", "txt"]

  [[sec.args]]
    server = "ns"
    qtypes = ["a", "txt"]

[[sec]]
  name = "demo2"

  [[sec.args]]
    server = ""
    qtypes = ["any"]

デフォルトで利用するセクションを設定。(一時的な利用は -n, --name

$ dic e
$ dic s demo
Changed the default section to "demo"
$ dic l
DEFAULT SECTION
 demo

SECTION NAME        SERVER          QUERY TYPES
*demo               -               [a txt]
                    1.1.1.1         [a txt]
                    ns              [a txt]

 demo2              -               [any]
$ dic example.com www.example.com
[example.com]
  -
    example.com.        40170   IN      A       93.184.216.34
    example.com.        86400   IN      TXT     "v=spf1 -all"
  @1.1.1.1
    example.com.        3200    IN      A       93.184.216.34
    example.com.        5668    IN      TXT     "v=spf1 -all"
 *@a.iana-servers.net.
    example.com.        86400   IN      A       93.184.216.34
    example.com.        86400   IN      TXT     "v=spf1 -all"

[www.example.com]
  -
    www.example.com.    66099   IN      A       93.184.216.34
    www.example.com.    86388   IN      TXT     "v=spf1 -all"
  @1.1.1.1
    www.example.com.    9276    IN      A       93.184.216.34
    www.example.com.    10788   IN      TXT     "v=spf1 -all"
 *@b.iana-servers.net.
    www.example.com.    86400   IN      A       93.184.216.34
    www.example.com.    86400   IN      TXT     "v=spf1 -all"

おまけ

config ファイルに server = "ns" と記述すると、 NS レコード(サブドメインの場合はそのスーパードメインに設定される NS レコード)の DNS サーバに対して問い合わせを行います。用途として、レコード情報の更新や DNS サーバをお引越しした直後に、 DNS キャッシュサーバの TTL を待つことなく正常に変更されたことを確認したかった 👀

また server = "" のように空欄にすると resolv.conf を利用します。

ref. https://github.com/ryoma123/dic/blob/master/README.md#example

感想

  • ずっと気になっていた Go の学習機会をつくれてよかった!
  • シンプルで書きやすいところが大好きになってしまったのでもっと触っていこう〜 🙌
  • 正しい設計がわからずリファクタリングにだいぶ苦労してしまったので、Go のデザインパターンなどから学んでみようかなぁと思っている

*1:dic: Domain Infomation Collector