3

私は現在、collective.xsendfile、Apache mod_xsendfile、およびPlone4を構成しようとしています。

どうやら、Apacheプロセスは、パーミッションが含まれているため、ファイルシステム上のblobstrageファイルを認識しません。

ls -lh var / blobstorage / 0x00 / 0x00 / 0x00 / 0x00 / 0x00 / 0x18 / 0xd5 / 0x19 / 0x038ea09d0eddc611.blob -r -------- 1 plone plone1006K5月28日15:30var/ blobstorage / 0x00 /0x00/0x00/0x00/0x00/0x18/0xd5/0x19/0x038ea09d0eddc611.blob

Apacheがこれらのファイルにアクセスできるように、追加のアクセス許可を与えるようにblobstorageを構成するにはどうすればよいですか?

4

2 に答える 2

4

blobstorageがディレクトリとファイルを書き込むモードは、にハードコーディングされていZODB.blobます。具体的には、標準ZODB.blob.FileSystemHelperクラスはデフォルトで安全なディレクトリ(現在のユーザーに対してのみ読み取りおよび書き込み可能)を作成します。

FileSystemHelperこれを構成可能にするか、ディレクトリモードをに設定し、デフォルトの代わりにクラスを使用するように0750パッチを適用する独自の実装を提供できます。ZODB.blob.BlobStorageMixin

import os
from ZODB import utils
from ZODB.blob import FilesystemHelper, BlobStorageMixin
from ZODB.blob import log, LAYOUT_MARKER

class GroupReadableFilesystemHelper(FilesystemHelper):
    def create(self):
        if not os.path.exists(self.base_dir):
            os.makedirs(self.base_dir, 0750)
            log("Blob directory '%s' does not exist. "
                "Created new directory." % self.base_dir)
        if not os.path.exists(self.temp_dir):
            os.makedirs(self.temp_dir, 0750)
            log("Blob temporary directory '%s' does not exist. "
                "Created new directory." % self.temp_dir)

        if not os.path.exists(os.path.join(self.base_dir, LAYOUT_MARKER)):
            layout_marker = open(
                os.path.join(self.base_dir, LAYOUT_MARKER), 'wb')
            layout_marker.write(self.layout_name)
        else:
            layout = open(os.path.join(self.base_dir, LAYOUT_MARKER), 'rb'
                          ).read().strip()
            if layout != self.layout_name:
                raise ValueError(
                    "Directory layout `%s` selected for blob directory %s, but "
                    "marker found for layout `%s`" %
                    (self.layout_name, self.base_dir, layout))

    def isSecure(self, path):
        """Ensure that (POSIX) path mode bits are 0750."""
        return (os.stat(path).st_mode & 027) == 0

    def getPathForOID(self, oid, create=False):
        """Given an OID, return the path on the filesystem where
        the blob data relating to that OID is stored.

        If the create flag is given, the path is also created if it didn't
        exist already.

        """
        # OIDs are numbers and sometimes passed around as integers. For our
        # computations we rely on the 64-bit packed string representation.
        if isinstance(oid, int):
            oid = utils.p64(oid)

        path = self.layout.oid_to_path(oid)
        path = os.path.join(self.base_dir, path)

        if create and not os.path.exists(path):
            try:
                os.makedirs(path, 0750)
            except OSError:
                # We might have lost a race.  If so, the directory
                # must exist now
                assert os.path.exists(path)
        return path


def _blob_init_groupread(self, blob_dir, layout='automatic'):
    self.fshelper = GroupReadableFilesystemHelper(blob_dir, layout)
    self.fshelper.create()
    self.fshelper.checkSecure()
    self.dirty_oids = []

BlobStorageMixin._blob_init = _blob_init_groupread

かなり手一杯ですが、これをZODB3の機能リクエストにすることをお勧めします:-)

于 2011-05-29T17:18:18.063 に答える
2

ZOPE / ZEOセットアップのバックアップルーチンをセットアップしているときに、blobパーミッションで同じ問題が発生しました。

ミッコが書いたモンキーパッチを適用しようとした後(それほど簡単ではありません)、問題を解決するための「本物の」パッチを思いつきました。

Martijnによって提案されたパッチは完全ではありませんが、それでもblobファイルに適切なモードを設定しません。

だからここに私の解決策があります:

1.)以下を含むパッチを作成します。

Index: ZODB/blob.py
===================================================================
--- ZODB/blob.py    (Revision 121959)
+++ ZODB/blob.py    (Arbeitskopie)
@@ -337,11 +337,11 @@

     def create(self):
         if not os.path.exists(self.base_dir):
-            os.makedirs(self.base_dir, 0700)
+            os.makedirs(self.base_dir, 0750)
             log("Blob directory '%s' does not exist. "
                 "Created new directory." % self.base_dir)
         if not os.path.exists(self.temp_dir):
-            os.makedirs(self.temp_dir, 0700)
+            os.makedirs(self.temp_dir, 0750)
             log("Blob temporary directory '%s' does not exist. "
                 "Created new directory." % self.temp_dir)

@@ -359,8 +359,8 @@
                     (self.layout_name, self.base_dir, layout))

     def isSecure(self, path):
-        """Ensure that (POSIX) path mode bits are 0700."""
-        return (os.stat(path).st_mode & 077) == 0
+        """Ensure that (POSIX) path mode bits are 0750."""
+        return (os.stat(path).st_mode & 027) == 0

     def checkSecure(self):
         if not self.isSecure(self.base_dir):
@@ -385,7 +385,7 @@

         if create and not os.path.exists(path):
             try:
-                os.makedirs(path, 0700)
+                os.makedirs(path, 0750)
             except OSError:
                 # We might have lost a race.  If so, the directory
                 # must exist now
@@ -891,7 +891,7 @@
             file2.close()
         remove_committed(f1)
     if chmod:
-        os.chmod(f2, stat.S_IREAD)
+        os.chmod(f2, stat.S_IRUSR | stat.S_IRGRP)

 if sys.platform == 'win32':
     # On Windows, you can't remove read-only files, so make the

こちらからパッチをご覧になることもできます-> http://pastebin.com/wNLYyXvw

2.)ビルドアウトルートディレクトリに「blob.patch」という名前でパッチを保存します

3.)ビルドアウト構成を拡張します。

parts += 
    patchblob
    postinstall

[patchblob]
recipe = collective.recipe.patch
egg = ZODB3
patches = blob.patch

[postinstall]
recipe = plone.recipe.command
command = 
    chmod -R g+r ${buildout:directory}/var
    find ${buildout:directory}/var -type d | xargs chmod g+x
update-command = ${:command}

インストール後のセクションでは、既存のBLOBに必要なグループ読み取り権限を設定します。また、実行権限はblobフォルダーに付与する必要があり、そのグループはディレクトリに入ることができます。

このパッチをZODB3.10.2および3.10.3でテストしました。

Martijnが提案したように、これは構成可能であり、ZODBの一部である必要があります。

于 2011-06-17T08:20:08.590 に答える