Otto の動作を調べていて気付いたのですが、ottoコマンドを実行すると ~/.otto.d ディレクトリ以下に checkpoint_signature というファイルが自動的に作られるようです。
例えば、一度 ~/.otto.d ディレクトリを削除してから otto version
を実行すると、以下のようにファイルが作られます。
% rm -rf ~/.otto.d % otto version Otto v0.1.2 % tree -F ~/.otto.d /Users/myoshiz/.otto.d ├── checkpoint_cache └── checkpoint_signature 0 directories, 2 files
checkpoint_signature の中身は、以下のようなテキストファイルです。
8e7691ee-fa98-9ccb-260b-27031234fd81 This signature is a randomly generated UUID used to de-duplicate alerts and version information. This signature is random, it is not based on any personally identifiable information. To create a new signature, you can simply delete this file at any time. See the documentation for the software using Checkpoint for more information on how to disable it.
手元の環境で見てみたら ~/.vagrant.d/data ディレクトリ以下にも checkpoint_signature と checkpoint_cache がありました。これって一体何だろう?と思って、少し調べてみました。
Checkpoint は HashiCorp 製品の最新情報を取得する機能
"hashicorp checkpoint" で検索したところ、Checkpoint (https://checkpoint.hashicorp.com/) のページが見つかりました。
このサイトにある説明が、Checkpoint のほとんどすべてなのですが、日本語訳すると次の通りです。
- Checkpoint は、OSSまたはプロプライエタリ製品の、バージョンおよびアラート情報を提供するために HashiCorp が動作させているサービス
- HashiCorp 製品は、時々、Checkpoint API に対して、その製品が動作する環境の情報を送信する
- この送信は必須ではなく、送信するかどうかは設定可能
- Checkpoint は HashiCorp 製品に対して、動作中のバージョンが最新か、セキュリティ脆弱性があるか、などの情報を提供する
また、この Checkpoint サービスのクライアント側の(Ottoなどに組み込まれている)ソースコードは、GitHubで公開されていました。
hashicorp/go-checkpoint
https://github.com/hashicorp/go-checkpoint
クライアント側は checkpoint.go(約350行)のみ、Go に詳しくなくても簡単に読める内容で、主な動作は以下の通りでした。
- 環境変数 CHECKPOINT_DISABLE が設定されていたら、動作しない
- ランダムな16バイトの signature (ファイル:checkpoint_signature)を作成する
- signature には以下の2通りの用途がある
- キャッシュに含まれる signature と比較し、キャッシュが正しいか確認する
- signature をサーバに送信し、同じアラート情報を何回も繰り返し受信することを防ぐ
- HTTPリクエストの送信先は
https://checkpoint-api.hashicorp.com/v1/check/{{製品名}} - HTTPリクエストのURLパラメータは、以下の情報を含む
- version: バージョン番号
- arch: runtime.GOARCH の値、または呼び出し元で指定した文字列
- os: runtime.GOOS の値、または呼び出し元で指定した文字列
- signature: signature の値
- HTTPレスポンスは、以下の情報を含むJSON
- product: 製品名
- current_version: 最新バージョンのバージョン番号
- current_release: 最新バージョンのリリース日(UNIX時間)
- current_download: ダウンロードページのURL
- current_changelog_url: 最新バージョンのChangeLogのURL
- project_website: 製品のWebサイトのURL
- outdated: 古いバージョンの場合は true
- alerts: アラートメッセージの配列
- 前回のリクエストから CacheDuration(デフォルトは48時間)以内なら、リクエストを送信せずにキャッシュ(checkpoint_cache)を使う
- キャッシュには、signature、バージョン番号、レスポンスの内容が書き込まれている
Checkpoint API を直接叩いてみる
例えば、Otto 用のURLに対してHTTPリクエストを送ると、以下のようなレスポンスが得られます。
% curl https://checkpoint-api.hashicorp.com/v1/check/otto {"product":"otto","current_version":"0.1.2","current_release":1446498717,"current_download_url":"https://ottoproject.io/downloads.html","current_changelog_url":"https://github.com/hashicorp/otto/blob/v0.1.2/CHANGELOG.md","project_website":"https://ottoproject.io","alerts":[]}
Otto の現時点での最新版は 0.1.2 です。ここで 0.1.0 というバージョン番号を与えて呼び出すと、レスポンスに "outdated":true が追加されているのがわかります。
% curl "https://checkpoint-api.hashicorp.com/v1/check/otto?version=0.1.0" {"product":"otto","current_version":"0.1.2","current_release":1446498717,"current_download_url":"https://ottoproject.io/downloads.html","current_changelog_url":"https://github.com/hashicorp/otto/blob/v0.1.2/CHANGELOG.md","outdated":true,"project_website":"https://ottoproject.io","alerts":[]}
まとめ
Checkpoint は、ソフトウェアの最新バージョンを自動的にチェックして、重要なセキュリティ脆弱性があればユーザに通知するための機能でした。ソースコードを読んでも、それ以外に、特に変わった機能は見当たりませんでした。同じような機能を作っている会社はあちこちにあると思います。
ただ、ローカル環境の情報をサーバに自動アップロードする、という機能は不信感を持たれがちなところです。それを、Vagrantなどのツールの一部として公開するのではなく、たとえ1ファイルでも個別のリポジトリとして公開するのは、ユーザからの信頼を得るには良い方法だと思いました。