はじめに
Windows版のFirefoxでは、メニューから「Firefoxについて」を選択すると、最新のバージョンのチェックを行えます。 この際、更新があればアップデートを適用できるようになっています。1
今回は、Firefoxのアップデートのしくみがどのようになっているのかを以下の技術資料を参考に紹介します。
Firefoxアップデートの流れ
Firefoxの更新がある場合、以下の流れで適用されます。(手動で明示的に更新する場合)
-
「Firefoxについて」をメニューからクリック
-
Firefoxが更新サーバにバージョンチェックのリクエストを出す
-
更新サーバがバージョンチェック結果をレスポンスとして返す
-
Firefoxはレスポンスを確認して、アップデートがあればアップデートファイルを更新サーバにリクエストする(なければなにもしない)
-
更新サーバがアップデートファイルを返す
-
Firefoxはアップデートファイルをダウンロードし、ダイアログに「Firefoxを再起動して更新」ボタンを表示する
-
ユーザーがボタンをクリックするとFirefoxを再起動、更新を適用する
ここでポイントとなるのがバージョンチェックとアップデートファイルのダウンロードの部分です。 それぞれもう少し詳しく説明します。
バージョンチェックのリクエスト
バージョンチェックでは、実際にどのようなリクエストを更新サーバに出しているのでしょうか。実際に確認してみましょう。
これはURL入力欄に about:config
とタイプして設定画面を表示させ、 app.update.url
を検索してみるとわかります。
app.update.url
はバージョンチェックするためにアクセスするURLです。
45.6.0ESRの場合は以下のとおりです。2
https://aus5.mozilla.org/update/6/%PRODUCT%/%VERSION%/%BUILD_ID%/%BUILD_TARGET%/%LOCALE%/%CHANNEL%/%OS_VERSION%(nowebsense)/%SYSTEM_CAPABILITIES%/%DISTRIBUTION%/%DISTRIBUTION_VERSION%/update.xml
いくつか %XXX%
というパラメータがあります。これはリクエストするときに実際の値に置換されます。それぞれの意味は次の通りです。
-
%PRODUCT%
プロダクト名です。「Firefox」となります。 -
%VERSION%
45.6.0ESRの場合「45.6.0」です。 -
%BUILD_ID%
45.6.0ESRの場合は「20161209150850」です。 -
%BUILD_TARGET%
32bit版のFirefoxでは「WINNT_x86-msvc-x64」です。64bit版だと「WINNT_x86_64-msvc-x64」です。 -
%LOCALE%
日本語版なので「ja」です。 -
%CHANNEL%
どのエディションなのかを示す値です。ESR版なので「esr」です。 -
%OS_VERSION%
使用しているOSを示す値です。Windows 7 64bit版だと「Windows_NT%206.1.1.0%20(x64)」です。 -
%SYSTEM_CAPABILITIES%
環境によっておそらく異なる値となります。手元の環境では「SSE3」でした。 -
%DISTRIBUTION%
Firefox公式なので「default」です。 -
%DISTRIBUTION_VERSION%
Firefox公式なので「default」です。
したがって、実際のリクエストは以下のようになります。
https://aus5.mozilla.org/update/6/Firefox/45.6.0/20161209150850/WINNT_x86-msvc-x64/ja/esr/Windows_NT%206.1.1.0%20(x64)(nowebsense)/SSE3/default/default/update.xml
このとき実際に更新サーバから返ってくるレスポンスは以下のとおりです。
<?xml version="1.0"?>
<updates>
<update type="minor" displayVersion="45.7.0esr" appVersion="45.7.0" platformVersion="45.7.0" buildID="20170118123525" detailsURL="https://www.mozilla.org/ja/firefox/45.7.0/releasenotes/">
<patch type="complete" URL="http://download.mozilla.org/?product=firefox-45.7.0esr-complete&os=win&lang=ja" hashFunction="sha512" hashValue="6168bcaa9424fe1d789c80cf54fe55c8b4e70f2d5468ebbeaef1f2776a3a840806b1ac270306852684a45ff9ad050de3f46a149dc2747d4a6b9440e0c27bf8a5" size="52388819"/>
<patch type="partial" URL="http://download.mozilla.org/?product=firefox-45.7.0esr-partial-45.6.0esr&os=win&lang=ja" hashFunction="sha512" hashValue="885218494c4b2b8ecd9c1c696b84f5850e78898cd289e28aa6cd8b6f727fa4dbd363de3edb6da861456ab01bb2c38639fbdc93f01746e89e7de4c3d836fceab5" size="6470506"/>
</update>
</updates>
更新対象として、45.7.0ESRが存在していることがわかります。3
次のようにコマンドラインからパラメータを明示してバージョンチェックのリクエストを投げることもできます。4
curl "https://aus5.mozilla.org/update/6/Firefox/45.6.0/20161209150850/WINNT_x86-msvc-x64/ja/esr/Windows_NT%206.1.1.0%20(x64)(nowebsense)/SSE3/default/default/update.xml"
アップデートファイルのダウンロード
レスポンスの例で示したように、更新サーバはアップデートファイルへのリンクを返します。アップデートがなければ以下のように空のタグを返します。
<?xml version="1.0"?>
<updates>
</updates>
アップデートがあるときには差分版もしくは完全版がダウンロードされますが、これらはどこから入手したらよいのでしょうか。
これには、CDN経由でダウンロードするやりかたがあります。以下のような所定のディレクトリ階層でアップデートファイルが提供されています。
http://download.cdn.mozilla.net/pub/firefox/releases/(ESRのバージョン)/update/(32bit or 64bit)/(言語)/
したがって45.7.0ESRの場合、45.6.0ESRから45.7.0ESRへの差分版と45.7.0ESRへの完全版のアップデートファイルが以下から入手できます。
http://download.cdn.mozilla.net/pub/firefox/releases/45.7.0esr/update/win32/ja/
このディレクトリには以下の3つのファイルがあります。
-
firefox-45.6.0esr-45.7.0esr.partial.mar
-
firefox-45.6.0esr-45.7.0esr.partial.mar.asc
-
firefox-45.7.0esr.complete.mar
このうち、アップデートファイルは拡張子が.marのものです。marとは Mozilla ARchive
に由来しています。
marファイルのフォーマットに興味がある方は、Software_Update:MARを参照するとよいでしょう。
firefox-45.6.0esr-45.7.0esr.partial.mar
は45.6.0ESRから45.7.0ESRへ差分更新する際に適用されるファイルで、 firefox-45.7.0esr.complete.mar
は45.7.0ESRへ完全版でアップデートするときに適用されるファイルです。
まとめ
今回は、Firefoxのアップデートのしくみについて紹介しました。 このしくみを利用すれば、企業内でFirefoxの更新サーバを独自に立てることも可能です。 そのあたりの話は別の記事にて紹介したいと考えています。