株式会社クリアコード > ククログ

ククログ


設定変更時にのみ起こる問題の、原因となっている設定項目を特定する

FirefoxやThunderbirdは、MCD(別名:AutoConfig)ポリシー設定を使ってある程度の設定を集中管理できます。集中管理可能な設定項目の情報は当社のサポート業務で把握している頻出設定の一覧Mozilla公式のポリシーテンプレートの説明などで調べることができ、実際の運用では、これらの資料で得た情報に基づいて書き上げた設定ファイルをFirefox(Thunderbird)に読み込ませることになります。

ただ、それですんなりいけばよいのですが、時には単純な記述ミスや、記載した設定の未知の特性の影響などによって、想定外の問題が起こる場合も度々あります。そのような場面で、多数ある設定の中から問題の原因箇所を特定するのはなかなか大変です。項目が多い場合、しらみつぶしに調査していては時間がいくらあっても足りません。

このような場面では、後退バグの発生原因となったコミットを特定する際にも使用した二分探索が有用です。

設定ファイルを対象とした二分探索の基本的な手順は、以下のようになります。

  1. 設定ファイルを前半と後半に分け、どちらか一方、例えば前半を削除する。
  2. その設定ファイルをFirefox(Thundebrird)に読み込ませ、動作を確認する。
    • 問題が再現しないようであれば、削除した部分(前半)のどこかに問題があると見なす。
      削除した部分(前半)を元に戻し、削除する範囲と残す範囲を入れ換える。
    • 問題が再現するようであれば、現在残っている部分(後半)のどこかに問題があると見なす。
  3. 残った部分を対象として、同じ操作を繰り返す。

二分探索では、しらみつぶしに調べるよりもはるかに少ない試行回数で原因箇所を特定できます。しかしながら、やり方を誤ると、問題が無い箇所を問題の原因と誤認してしまう事もあり得ます。この記事では、Firefoxの集中管理用設定ファイルを対象に二分探索を行う際のよくある注意点を紹介します。

ファイルの形式を問わない注意点

Virtual Storeの影響の排除

MCDの場合もポリシー設定の場合も、Windowsにおいて集中管理用の設定ファイルを直接編集する場合には、Virtual Storeの影響を受けないように気をつける必要があります。

現在のWindowsでは C:\Program Files 配下などの位置にファイルを保存しようとすると管理者権限での認証を求められますが、古いWindows向けアプリケーションにはそのような認証処理に非対応の物があります。そこでWindowsは、認証を行えなかった場合には暫定的に C:\Users\username 配下にファイルを保存しておき、以後 C:\Program Files 配下のファイルにそのユーザーの権限でアクセスしようとした場合は、代わりに C:\Users\username 配下に保存した方のファイルの内容が返却する、という動作を行います。この機能が「Virtual Store」です。Firefox・Thunderbirdの集中管理用設定ファイルは、一般ユーザーが勝手に内容を変更してしまうことがないよう、変更に管理者権限が必要な位置に置かれますので、不用意に編集しようとするとVirtual Storeの影響を受けてしまうことがあります。

Virtual Storeの影響を受けないようにするためには、「EmEditor」のように管理者権限での認証に対応したテキストエディターを使うか、もしくは、以下の手順で操作する必要があります。

  1. 設定ファイルを一旦デスクトップにコピーする。
  2. デスクトップにコピーしたファイルを編集する。
  3. ファイルを上書き保存する。
  4. 編集後のファイルをC:\Program Files 配下の元の位置に上書きコピーする。
ファイルのエンコーディングの維持

MCD用設定ファイルもpolicies.jsonも、エンコーディング形式は「BOM無しのUTF-8(リトルエンディアン)」が正式です。しかしながら、Windowsのバージョンが古いと、「メモ帳」を使ってファイルを編集した場合にBOMが付与されてしまったり、意図せずエンコーディングが変更されてしまったり、といったトラブルが起こり得ます。この事が原因で、編集後のファイル全体がエラーとなり、まったく動作しない状態となってしまう場合もあります。

このようなトラブルを避けるためにも、集中管理用設定ファイルの編集には、先にも名前を挙げた「EmEditor」のように「BOMの有無やテキスト保存時のエンコーディングを自由に指定でき、また、ファイルの上書き保存時には元のエンコーディングを可能な限り維持する」性質を持つテキストエディターを使用する事を強くお勧めします。

MCD(AutoConfig)の設定ファイルで二分探索を実施する場合の注意

MCD用設定ファイルはJavaScript形式なので、単純な記述ミスであればeslintで文法エラーを検出できます。

文法エラーでない原因で起こる問題を二分探索で探る際にも、その過程での文法エラーの発生には気をつける必要があります。例えば、以下のように条件分岐を伴う設定が記述されている場合:

if (getenv('USERDOMAIN' == '...') {
  lockPref('...', true);
  lockPref('...', false);
  lockPref('...', 0);
}

このような箇所が二分探索の境界上にあると、

if (getenv('USERDOMAIN' == '...') {
  lockPref('...', true);

// ここでファイルが終了しており、開かれた括弧が
// 閉じられないままになっている

// ここでファイルが始まっており、開き括弧が無いまま
// 閉じ括弧だけがある状態になっている

  lockPref('...', 0);
}

のように文法的に不正な状態が発生してしまうことがあります。二分探索の境界は、このような箇所を避けて決めるように気をつけましょう。

ポリシー設定の設定ファイル(policies.json)で二分探索を実施する場合の注意

ポリシー設定をGPOではなくpolicies.jsonで行う場合、policies.jsonは(JavaScriptではなく)JSON形式として妥当である必要があります。

例えば、以下のような内容のpolicies.jsonがあった場合:

{
  "policies": {
    "DisableAppUpdate": true,
    "ExtensionUpdate": false,
    "EnableTrackingProtection": {
      "Value": true,
      "Locked": true
    }
  }
}

以下のように単純に行で区切って二分探索すると、閉じ括弧が欠けているために文法エラーとなり、内容が読み込まれません。

{
  "policies": {
    "DisableAppUpdate": true,
    "ExtensionUpdate": false,
    "EnableTrackingProtection": {
      "Value": true,
{
  "policies": {
    "DisableAppUpdate": true,
    "ExtensionUpdate": false,

また、見落としやすい注意点として、いわゆる「ケツカンマ」の存在があります。設定項目にあたる部分だけを削除して

{
  "policies": {
    "DisableAppUpdate": true,
    "ExtensionUpdate": false,
  }
}

のように最後の項目の末尾に「,」が残ったままになっていると、これはJavaScriptの文法上はエラーにならないのですが、JSON形式としては文法エラーになります。このような箇所は必ず、

{
  "policies": {
    "DisableAppUpdate": true,
    "ExtensionUpdate": false
  }
}

のように、最後の項目の後に残った「,」を取り除いておく必要があります。

編集後のファイルがJSONとして妥当かどうかは、JSONLintで確認できます。policies.jsonを組織外に晒すことを避けたい場合は、npmパッケージのjsonlint-cliのようにオフラインで実行できる文法チェックツールを使うと、同等の検証を行えます。

まとめ

Firefox・Thundebirdの集中管理に使うMCD用設定ファイルとポリシー設定ファイルについて、問題発生時の原因を二分探索で調査する手順と、その注意点をご紹介しました。

この記事でご紹介した調査方法は多くの場合で有効ですが、残念ながら万能ではありません。設定項目の中には複数が組み合わさった場合にのみ問題が起こる物もあり、二分探索を実施しても「前半と後半それぞれだけで読み込んだら問題無いのに、全体を合わせると問題が起こる」というような不可解な状況が発生する場合があります。そのようなケースでは、ログと突き合わせての調査なども併用する必要があります。どうしても問題の原因を掴めないという場合には、当社の法人向け有償サポートがお役に立てるかもしれませんので、ぜひ一度お問い合わせください

タグ: Mozilla
2020-05-16

«前の記事: ノータブルコード7 - Rustのif式を賢く使う 最新記事 次の記事: Groongaである時間範囲のデータを集計する方法 »
タグ:
年・日ごとに見る
2008|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|