時間がない人へのまとめ

この記事では、Whrisというサイトがどこのサーバーで動いているか一発でわかるコマンドを作った話をします。 また公開から少し反響を受け、最初からこうしておけばなどの知見をまとめようと思います。

目次

まずwhrisの紹介

今回作ったコマンドは、whris というコマンドで、サイトがどこのサーバーで動いているか一発でわかるようにしたものです。

このコマンドの動作イメージは以下のような感じです。

$ whris yaserarenai.com
Target domain:yaserarenai.com
Target ip    :163.44.185.212

Network Admin:GMO Pepabo, Inc.
Network name :LOLIPOP
ip range     :163.44.185.0 - 163.44.185.255
country      :JP

上記のように、 whris [調べたいドメイン] で実行すると、そのドメインに紐付いているサーバーの情報が取得できます。 これで、このブログの yaserarenai.com はロリポップを使っていることがすぐに分かります。

また、vオプションを使用することでより詳細に上位の管理団体の情報まで見ることができます。

$ whris -v yaserarenai.com
Target domain:yaserarenai.com
Target ip    :163.44.185.212

Network Admin:GMO Pepabo, Inc.
Network name :LOLIPOP
ip range     :163.44.185.0 - 163.44.185.255
country      :JP

=========Network Details=========
0:
 Network Admin:Administered by APNIC
 Network name :
 ip range     :163.0.0.0 - 163.255.255.255
 country      :
1:
 Network Admin:GMO Internet, Inc.
 Network name :interQ
 ip range     :163.44.64.0 - 163.44.191.255
 country      :JP
2:
 Network Admin:GMO Pepabo, Inc.
 Network name :LOLIPOP
 ip range     :163.44.185.0 - 163.44.185.255
 country      :JP

こうやって見ると、管理の委任がどのようにされてるのかわかりやすいですね。 上記の例だと、アジアのIPを管理しているAPNICからGMO Internetが 163.44.64.0 - 163.44.191.255 というレンジのIPの管理を委任されており、 さらに、GMO InternetからGMO Pepaboが 163.44.185.0 - 163.44.185.255 というレンジのIPの管理を委任されていることが分かります。

Whrisはいままで上記のような情報を取得したいときに、digってIPを調べてWhoisで情報を取得するという小さな手間を省くことができます。

whrisの内部について

whrisの内部でやっていることは至って簡単です。 大きく分けると下記の4つになります。

  1. net.ResolveIPAddr で名前解決する
  2. 1の結果を使って github.com/likexian/whois でwhois問い合わせする
  3. 結果をパースする
  4. 結果の表示をする

一番肝になってくるのは、3のパースですね。 パースの手順は以下になります。

  1. 帰ってきたwhoisの情報から応答サーバーを確認
  2. 1の結果にあった区切り文字で文章を分解
  3. 2の結果を改行文字で分解し、さらに : で分解
  4. 3の帰ってきたスライスの先頭によって、構造体に保存する場所を振り分る
  5. 終わりまで3~4を繰り返す
  6. パースした結果を確認してwhoisの応答が転送されていないか確認し、転送されていれば転送先のサーバーをwhoisの応答サーバーに指定して1からやり直す

ちょっと寄り道(IPの管理団体について)

IPの管理は、ICANN(正確にはIANA)が行っています。しかし、1団体で世界中を管理するのは大変です。 なので、下記のように各地域ごと管理する団体に権限を委譲しています。

地域レジストリの説明

それぞれのレジストリが管理する地域を世界地図に色付けして視覚的にわかるようにしたものが下記です。

*1

コマンドを公開してから

このコマンドを公開してすぐ、Tweetしたところフォロワーが多い方に引用リツイートしていただけたこともあり今までで一番反響をもらえました。 現状では、以下のように61starもいただけています。

whrisのstar数

ただ、こんなに反響をいただけると思っていなかったので自分の中で後々「もっとこうしておけば・・・」と後悔が生まれました。 次回に活かすためにもそれをまとめてみようと思います。

この経験を通して得た知見

ネーミングをもっと気にしておけばよかった

経緯

このwhrisの初期リリースでは名前が whereis でした。 whoisをもじって「どこのサーバかすぐ分かる!」というのを現したかったのでこの名前にしていました。

何が問題だったか

whereis というのはすでにコマンドがあったので名前が被っていました。 その影響で、せっかくインストールしてもらってもこちらのコマンドが動き、whrisが動かないなどあったと思います。 せっかく試してもらったのに申し訳ない・・・

対応

Twitterで指摘を受けすぐに変更しました。 また、Githubにもissueを作ってくれた方がいたのもありがたかったです。 次回から、こう言った自作コマンドを公開するときは名前をしっかりチェックしてからつけようと思います。

テストをしっかり書いておけばよかった

経緯(というか言い訳)

軽い気持ちで作った自作コマンドだったので、テストもろくに整備していませんでした。

何が問題だったか

PRを作成し、「まぁ大丈夫やろ!マージ!」ってやってmainの内容が動かないものになってしまった!!ということが何度もありました。 動かないものがmainブランチにマージされてしまい慌てて直すというのは良くなかったです。

対応

いろいろな人が見始めてくれたその矢先で、動かないものをmainブランチにマージしてしまい肝を冷やしたので、テストをゴリゴリ追加しました。 こう言ったことを起こさない、自分自身が安心できるようにするためテストはしっかり書こうと改めて思いました。

CIを早いうちに準備しておけばよかった

経緯(というか言い訳)

テストをしっかり書いておけばよかったと全く同じです

何が問題だったか

テストをしっかり書いておけばよかったと全く同じです

対応

テストがCIで通らないとマージできないように設定しました。 これも、自分自身が安心できるように、肝を冷やさないようにするために大切なことだと改めて思いました。

その他

自身のOSSに対してPRをもっともらうためにも、コントリビューターのためのガイドラインを書いておくべきだったな〜と思います。 また、whrisのバージョンを表示するオプションもまだ実装できていないのでそれもやらなければな〜と思ってます。

おわりに

今回期せずして(自分史上)多くの反響を得て、後から「もっとこうしておけば。。。」という知見をまとめました。 今後も同じ後悔をしないように忘れずやっていきたいと思います。

whrisのスター、PRお待ちしてます!!

参照資料

*1: https://commons.wikimedia.org/wiki/File:Regional_Internet_Registries_world_map.svg の画像をwebpに変換して使用