3

(プラットフォーム: Linux、具体的には Fedora および Red Hat Enterprise Linux 6)

次のことを行う Python で書かれた統合テストがあります。

  • 一時ディレクトリを作成します
  • ファイルをそのディレクトリにコピーするrsyncジョブを実行するようにWebサービス(Apacheで実行)に指示します
  • ファイルが正しくコピーされていることを確認します (つまり、構成が Web サービスを介してクライアントから rsync 呼び出しに正しく渡されました)。
  • (試みます) 一時ディレクトリを削除します

現時点では、rsync が所有権を apache ユーザーの所有権に設定してファイルを作成しているため、最後のステップが失敗しています。そのため、テスト ケースにはファイルを削除するために必要な権限がありません。

このServer Fault questionは、統合テストが設定した状況でクリーンアップ手順が現在失敗する理由を説明しています。

私が現在行っていること: テストのクリーンアップで一時ディレクトリを削除しないため、これらの統合テストでは/tmp手動でクリアする必要があるダミー ファイルが残ります。

私が現在検討している主な解決策は、特にテスト スイートのクリーンアップ操作を処理するための setuid スクリプトを追加することです。これは機能するはずですが、他の誰かがよりエレガントなソリューションを提案できることを願っています。具体的には、統合テスト クライアントで apache プロセスの uid を気にする必要がないものがあれば、それが本当に好きです。

私が検討したが、さまざまな理由で拒否したアプローチ:

  • テスト ケースをルートとして実行します。これは実際に機能しますが、root としてテスト スイートを実行する必要があるのはかなり見苦しいものです。
  • テスト スイートによって作成されたディレクトリにスティッキー ビットを設定します。私が知る限り、リモートサーバーからフラグをコピーするように設定されているため、rsyncはこれを無視しています。ただし、実行ビットのみをコピーするように設定を微調整しても効果がないように見えたので、なぜこれが機能しなかったのかはまだよくわかりません。
  • test ユーザーを apache グループに追加します。rsync はグループの書き込み権限なしでファイルを作成しているため、これは役に立ちませんでした。
  • テスト ユーザーとして Apache インスタンスを実行し、それに対してテストします。これにはいくつかの利点があります (統合テストで apache が既に実行されている必要がないという点で) が、実稼働設定で事前構成された Apache インスタンスに対して統合テストを実行できないという欠点があります。それらが正しいことを確認してください。したがって、最終的にはこの機能をテスト スイートに追加する可能性がありますが、現在の問題をより直接的に解決する代わりになるものではありません。

テスト スイートが一時ディレクトリを正しくクリーンアップできるように、rsync に渡される設定を変更することは、絶対にやりたくないことの 1 つです。これはサービス デーモンの統合テストなので、できるだけ本番環境に近い構成を使用したいと考えています。

4

2 に答える 2

1

そのサーバー障害の質問への回答の助けを借りて、setfacl.

統合テスト用の一時ディレクトリを作成するコードは、次のことを行います (unittest.TestCaseインスタンスの一部であるため、 への参照ですaddCleanup)。

local_path = tempfile.mkdtemp().decode("utf-8")
self.addCleanup(shutil.rmtree, local_path)
acl = "d:u:{0}:rwX".format(os.geteuid())
subprocess.check_call(["setfacl", "-m", acl, local_path])

最初の 2 行は、一時ディレクトリを作成し、テストの最後に削除されるようにします。

最後の 2 行は新しい部分で、テスト ユーザーが常に読み取り/書き込みアクセス権を持ち、実行ビットが設定されているすべてのものに対する実行権限も持つように、ディレクトリの既定の ACL を設定します。

于 2012-05-21T07:08:03.717 に答える
1

test ユーザーを apache グループ (またはファイルのグループ所有権を持つ httpd グループ) に追加します。

于 2012-05-20T20:37:27.333 に答える