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