跳转到主要内容

ZC Buildout recipes for ZODB

项目描述

用于处理ZODB的食谱。

变更

3.0 (2023-02-07)

  • 添加对Python 3.7、3.8、3.9、3.10、3.11的支持。

  • 停止对Python < 3.7的支持。

2.0.0 (2014-02-12)

此版本不向后兼容

它使用ZODB,而不是ZODB3。

  • 添加Python 3支持

  • 从ZODB3更改为ZODB。

0.6.2 (2012-10-31)

已修复的bug

  • 将“zope.testing”需求从安装更改为测试需求。

0.6.1 (2010-05-25)

已修复的bug

  • 为未在存储配置中命名的存储空间生成的打包脚本不正确。

0.6.0 (2009-12-03)

新功能

  • 现在可以通过提供值为“false”的logrotate选项来禁用日志轮转配置的生成。

  • 增加了关于eggs选项的文档以及为什么通常不应该使用它的原因。

  • 改进了错误处理。

已修复的bug

  • 当使用eggs选项时,没有正确处理。

0.5.0 (2008-11-03)

新功能

您现在可以在服务器部分中指定一个名称选项,使安装的文件使用与部分名称不同的名称。

已修复的bug

在删除或重命名部分时,未删除打包的crontab文件。

0.4 (2008-02-18)

新功能

服务器配方现在尊重部署名称选项。

0.3.1 (2008-01-03)

已修复的bug

使用su的shell脚本生成不正确。

0.3 (2008-01-03)

新功能

  • 您现在可以在打包的crontab文件中指定一个电子邮件地址,以控制错误发送的位置。

  • 如果您使用zdaemon部分安装通用的ZEO脚本

    [zdaemon]
    recipe = zc.recipe.egg:script
    eggs = zdaemon

    您可以请求生成使用通用zdaemon脚本的shell脚本。这可以使更新已部署系统的软件更容易,因为特定实例的脚本不依赖于可能更改的路径,如egg名称。

已修复的bug

  • ZODB3及其大部分需求是配方中的虚假依赖项。这导致ZODB3使用运行buildout的Python进行安装,在某些情况下引起问题。

0.2.1 (2007-04-23)

已修复的bug

  • crontab和logrotate配置文件生成不正确。

0.2 (2007-04-17)

增加了对%import指令的处理。

0.1 (2007-04-13)

初始版本。

详细文档

定义ZEO存储服务器

可以使用zc.zodbrecipes:server配方来定义ZEO存储服务器。要定义存储服务器,您为服务器定义一个部分并指定配置数据。

>>> write('buildout.cfg',
... '''
... [buildout]
... parts = server
...
... [server]
... recipe = zc.zodbrecipes:server
... zeo.conf =
...    <zeo>
...       address 8100
...       monitor-address 8101
...       transaction-timeout 300
...    </zeo>
...    %import foo
...    <foo>
...       path /databases/Data.fs
...    </foo>
... ''')

这里我们使用一个“foo”存储指定了一个最小配置。我们可以使用任何我们想要的存储类型。这里我们使用导入语句来导入定义foo部分的模式定义。任何导入都被简单地复制到生成的配置文件中。当我们运行buildout

>>> print(system(buildout), end='') # doctest: +NORMALIZE_WHITESPACE
Installing server.
zc.zodbrecipes:
A runzeo script couldn't be found at:
<BLANKLINE>
  '/sample-buildout/bin/runzeo'
<BLANKLINE>
You may need to generate a runzeo script using the
zc.recipe.eggs:script recipe and the ZEO egg, or you may need
to specify the location of a script using the runzeo option.
<BLANKLINE>
Generated script '/sample-buildout/bin/server'.

我们得到了一个警告,因为配方期望存在runzeo脚本,但我们还没有创建它。这是使用zc.recipe.egg:script配方完成的

>>> write('buildout.cfg',
... '''
... [buildout]
... parts = zodb server
...
... [zodb]
... recipe = zc.recipe.egg:script
... eggs = ZEO
...
... [server]
... recipe = zc.zodbrecipes:server
... zeo.conf =
...    <zeo>
...       address 8100
...       monitor-address 8101
...       transaction-timeout 300
...    </zeo>
...    %import foo
...    <foo>
...       path /databases/Data.fs
...    </foo>
... ''')
>>> print(system(buildout), end='') # doctest: +ELLIPSIS
Installing zodb...
Generated script '/sample-buildout/bin/runzeo'...
Updating server.

我们得到了两样东西。我们在parts目录中得到了一个包含ZEO和zdaemon配置文件的目录

>>> ls('parts', 'server')
-  zdaemon.conf
-  zeo.conf

让我们看看配置文件

>>> cat('parts', 'server', 'zeo.conf')
%import foo
<BLANKLINE>
<zeo>
  address 8100
  monitor-address 8101
  transaction-timeout 300
</zeo>
<BLANKLINE>
<foo>
  path /databases/Data.fs
</foo>
<BLANKLINE>
<eventlog>
  <logfile>
    path STDOUT
  </logfile>
</eventlog>

我们看到我们输入的相同数据,以及添加了一个将日志记录到标准输出的eventlog部分。在生产环境中,我们将使用zdaemon的transacript日志来捕获此日志输出到一个文件中。如果我们愿意,我们可以指定自己的日志文件

>>> write('buildout.cfg',
... '''
... [buildout]
... parts = zodb server
...
... [zodb]
... recipe = zc.recipe.egg:script
... eggs = ZEO
...
... [server]
... recipe = zc.zodbrecipes:server
... zeo.conf =
...    <zeo>
...       address 8100
...       monitor-address 8101
...       transaction-timeout 300
...    </zeo>
...    %import foo
...    <foo>
...       path /databases/Data.fs
...    </foo>
...    <eventlog>
...      <logfile>
...        path /var/log/zeo.log
...      </logfile>
...    </eventlog>
... ''')
>>> print(system(buildout), end='')
Uninstalling server.
Updating zodb.
Installing server.
Generated script '/sample-buildout/bin/server'.
>>> cat('parts', 'server', 'zeo.conf')
%import foo
<BLANKLINE>
<zeo>
  address 8100
  monitor-address 8101
  transaction-timeout 300
</zeo>
<BLANKLINE>
<foo>
  path /databases/Data.fs
</foo>
<BLANKLINE>
<eventlog>
  <logfile>
    path /var/log/zeo.log
  </logfile>
</eventlog>

但我们还是使用默认设置

>>> write('buildout.cfg',
... '''
... [buildout]
... parts = zodb server
...
... [zodb]
... recipe = zc.recipe.egg:script
... eggs = ZEO
...
... [server]
... recipe = zc.zodbrecipes:server
... zeo.conf =
...    <zeo>
...       address 8100
...       monitor-address 8101
...       transaction-timeout 300
...    </zeo>
...    %import foo
...    <foo>
...       path /databases/Data.fs
...    </foo>
... ''')
>>> print(system(buildout), end='')
Uninstalling server.
Updating zodb.
Installing server.
Generated script '/sample-buildout/bin/server'.

让我们看看zdaemon日志文件

>>> cat('parts', 'server', 'zdaemon.conf')
<runner>
  daemon on
  directory /sample-buildout/parts/server
  program /sample-buildout/bin/runzeo -C /sample-buildout/parts/server/zeo.conf
  socket-name /sample-buildout/parts/server/zdaemon.sock
  transcript /sample-buildout/parts/server/zeo.log
</runner>
<BLANKLINE>
<eventlog>
  <logfile>
    path /sample-buildout/parts/server/zeo.log
  </logfile>
</eventlog>

我们使用zeo.conf文件运行runzeo脚本。日志和运行时文件放置在服务器部分目录中。我们使用transcript日志提供ZEO服务器日志。我喜欢使用transcript日志,因为它可以捕获程序输出,例如启动异常,这些异常不会在程序日志中捕获。

并且我们在bin目录中生成了一个控制脚本

>>> cat('bin', 'server')  # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS
#!/usr/local/bin/python2.4
<BLANKLINE>
import sys
sys.path[0:0] = [...]
<BLANKLINE>
<BLANKLINE>
import zdaemon.zdctl
<BLANKLINE>
if __name__ == '__main__':
    sys.exit(zdaemon.zdctl.main([
        '-C', '/sample-buildout/parts/server/zdaemon.conf',
        ]+sys.argv[1:]
        ))

这是一个zdaemon脚本。我们可以使用它来控制ZEO服务器进程。

指定额外的egg

您可以指定额外的eggs以供zdaemon脚本使用

>>> write('buildout.cfg',
... '''
... [buildout]
... parts = zodb server
...
... [zodb]
... recipe = zc.recipe.egg:script
... eggs = ZEO
...
... [server]
... recipe = zc.zodbrecipes:server
... eggs = zope.event
... zeo.conf =
...    <zeo>
...       address 8100
...       monitor-address 8101
...       transaction-timeout 300
...    </zeo>
...    %import foo
...    <foo>
...       path /databases/Data.fs
...    </foo>
... ''')
>>> print(system(buildout), end='')
Uninstalling server.
Updating zodb.
Installing server.
Generated script '/sample-buildout/bin/server'.

我们可以看到zope.event egg出现在我们bin目录中生成的控制脚本中

>>> cat('bin', 'server')  # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS
#!/usr/local/bin/python2.4
<BLANKLINE>
import sys
sys.path[0:0] = [...]
<BLANKLINE>
import zdaemon.zdctl
<BLANKLINE>
if __name__ == '__main__':
    sys.exit(zdaemon.zdctl.main([
        '-C', '/sample-buildout/parts/server/zdaemon.conf',
        ]+sys.argv[1:]
        ))
注意:这是一个zdaemon脚本。如果您的ZEO服务器需要额外的eggs,例如

提供额外的存储类型或日志处理程序,它们应出现在上面的例子中的[zodb]部分,而不是[server]部分!

Unix部署支持

服务器配方与zc.recipe.deployment一起工作。特别是,如果指定了部署选项,则命名一个定义以下选项的部分或部分

crontab-directory

crontab文件的目录。

etc-directory

配置文件的目录。

log-directory

日志文件的目录。

logrotate-directory

logrotate配置文件的目录。

rc-directory

运行控制脚本的目录。

运行目录

用于运行时文件的目录。

用户

服务器进程应该以哪个用户身份运行

让我们创建一些目录并在我们的构建配置中添加一个部署部分

>>> for d in 'cron', 'etc', 'log', 'rotate', 'rc', 'run':
...     mkdir(d)
...     globals()[d] = join(sample_buildout, d)
>>> write('buildout.cfg',
... '''
... [buildout]
... parts = zodb server
...
... [zodb]
... recipe = zc.recipe.egg:script
... eggs = ZEO
...
... [server]
... recipe = zc.zodbrecipes:server
... zeo.conf =
...    <zeo>
...       address 8100
...       monitor-address 8101
...       transaction-timeout 300
...    </zeo>
...    %%import foo
...    <foo>
...       path /databases/Data.fs
...    </foo>
... deployment = demo
...
... [demo]
... crontab-directory = %(cron)s
... etc-directory = %(etc)s
... log-directory = %(log)s
... logrotate-directory = %(rotate)s
... rc-directory = %(rc)s
... run-directory = %(run)s
... user = bob
... ''' % globals())
>>> print(system(buildout), end='')
Uninstalling server.
Updating zodb.
Installing server.
Generated script '/sample-buildout/rc/demo-server'.

现在,部分目录和控制脚本将不再存在

>>> import os
>>> os.path.exists(join('parts', 'server'))
False
>>> os.path.exists(join('bin', 'server'))
False

相反,控制脚本将在rc目录中

>>> cat('rc', 'demo-server')  # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS
#!/usr/local/bin/python2.4
<BLANKLINE>
import sys
sys.path[0:0] = [...]
<BLANKLINE>
import zdaemon.zdctl
<BLANKLINE>
if __name__ == '__main__':
    sys.exit(zdaemon.zdctl.main([
        '-C', '/sample-buildout/etc/server-zdaemon.conf',
        ]+sys.argv[1:]
        ))

运行控制脚本名称现在结合了部署名称和脚本名称。

而配置文件将在etc目录中

>>> ls('etc')
-  server-zdaemon.conf
-  server-zeo.conf

日志轮转

如果使用部署,我们还会得到一个logrotate配置文件

>>> cat('rotate', 'demo-server')
/sample-buildout/log/server-zeo.log {
  rotate 5
  weekly
  postrotate
    /sample-buildout/rc/demo-server -C /sample-buildout/etc/server-zdaemon.conf reopen_transcript
  endscript
}

这将每周旋转一次zeo日志文件。

如果我们查看zdaemon配置文件,我们可以看到它反映了部署位置

>>> cat('etc', 'server-zdaemon.conf')
<runner>
  daemon on
  directory /sample-buildout/run
  program /sample-buildout/bin/runzeo -C /sample-buildout/etc/server-zeo.conf
  socket-name /sample-buildout/run/server-zdaemon.sock
  transcript /sample-buildout/log/server-zeo.log
  user bob
</runner>
<BLANKLINE>
<eventlog>
  <logfile>
    path /sample-buildout/log/server-zeo.log
  </logfile>
</eventlog>

注意,使用了不同的文件名。由于部署可能(通常也是)由多个部分共享,文件名前缀为它们的部分名称。另外,请注意,部署用户已在zdaemon配置中设置。

如果您想管理自己的日志轮转,您可以在部署部分中放置“logrotate = false”以防止生成logrotate配置

>>> write('buildout.cfg',
... '''
... [buildout]
... parts = zodb server
...
... [zodb]
... recipe = zc.recipe.egg:script
... eggs = ZEO
...
... [server]
... recipe = zc.zodbrecipes:server
... zeo.conf =
...    <zeo>
...       address 8100
...       monitor-address 8101
...       transaction-timeout 300
...    </zeo>
...    %%import foo
...    <foo>
...       path /databases/Data.fs
...    </foo>
... deployment = demo
...
... [demo]
... logrotate = false
... crontab-directory = %(cron)s
... etc-directory = %(etc)s
... log-directory = %(log)s
... logrotate-directory = %(rotate)s
... rc-directory = %(rc)s
... run-directory = %(run)s
... user = bob
... ''' % globals())
>>> print(system(buildout), end='')
Uninstalling server.
Updating zodb.
Installing server.
Generated script '/sample-buildout/rc/demo-server'.

logrotate配置文件不存在,但rc脚本仍然存在

>>> ls('rotate')
>>> ls('rc')
-  demo-server

如果更方便的话,这可以放在[服务器]部分中

>>> write('buildout.cfg',
... '''
... [buildout]
... parts = zodb server
...
... [zodb]
... recipe = zc.recipe.egg:script
... eggs = ZEO
...
... [server]
... recipe = zc.zodbrecipes:server
... zeo.conf =
...    <zeo>
...       address 8100
...       monitor-address 8101
...       transaction-timeout 300
...    </zeo>
...    %%import foo
...    <foo>
...       path /databases/Data.fs
...    </foo>
... deployment = demo
... logrotate = false
...
... [demo]
... crontab-directory = %(cron)s
... etc-directory = %(etc)s
... log-directory = %(log)s
... logrotate-directory = %(rotate)s
... rc-directory = %(rc)s
... run-directory = %(run)s
... user = bob
... ''' % globals())
>>> print(system(buildout), end='')
Updating zodb.
Updating server.

logrotate配置文件不存在,但rc脚本仍然存在

>>> ls('rotate')
>>> ls('rc')
-  demo-server

打包cron作业

我们可以通过指定pack选项来请求定义一个cron作业来打包数据库。此选项接受5到7个值。前5个值是Unix crontab文件中定义的时间和日期字段。第六个字段是要打包的过去天数,默认为1。

让我们添加一个pack选项

>>> write('buildout.cfg',
... '''
... [buildout]
... parts = zodb server
...
... [zodb]
... recipe = zc.recipe.egg:script
... eggs = ZEO
...
... [server]
... recipe = zc.zodbrecipes:server
... zeo.conf =
...    <zeo>
...       address 8100
...       monitor-address 8101
...       transaction-timeout 300
...    </zeo>
...    %%import foo
...    <foo>
...       path /databases/Data.fs
...    </foo>
... deployment = demo
... pack = 1 1 * * 0 3
...
... [demo]
... crontab-directory = %(cron)s
... etc-directory = %(etc)s
... log-directory = %(log)s
... logrotate-directory = %(rotate)s
... rc-directory = %(rc)s
... run-directory = %(run)s
... user = bob
... ''' % globals())
>>> print(system(buildout+' -D'), end='')
Uninstalling server.
Updating zodb.
Installing server.
Generated script '/sample-buildout/rc/demo-server'.

现在,我们将得到一个crontab文件

>>> cat(cron, 'pack-demo-server')
1 1 * * 0 bob /sample-buildout/bin/zeopack -p 8100 -S 1 -d 3

在这个例子中,我们将每周日1:01到3天内打包数据库。

我们可以在pack选项中添加电子邮件地址。如果我们这样做,那么将在cron文件中添加一个MAILTO变量

>>> write('buildout.cfg',
... '''
... [buildout]
... parts = zodb server
...
... [zodb]
... recipe = zc.recipe.egg:script
... eggs = ZEO
...
... [server]
... recipe = zc.zodbrecipes:server
... zeo.conf =
...    <zeo>
...       address 8100
...       monitor-address 8101
...       transaction-timeout 300
...    </zeo>
...    %%import foo
...    <foo>
...       path /databases/Data.fs
...    </foo>
... deployment = demo
... pack = 1 1 * * 0 3 jim@zope.com
...
... [demo]
... crontab-directory = %(cron)s
... etc-directory = %(etc)s
... log-directory = %(log)s
... logrotate-directory = %(rotate)s
... rc-directory = %(rc)s
... run-directory = %(run)s
... user = bob
... ''' % globals())
>>> print(system(buildout+' -D'), end='')
Uninstalling server.
Updating zodb.
Installing server.
Generated script '/sample-buildout/rc/demo-server'.
>>> cat(cron, 'pack-demo-server')
MAILTO=jim@zope.com
1 1 * * 0 bob /sample-buildout/bin/zeopack -p 8100 -S 1 -d 3

这会导致将电子邮件发送到指定的地址,而不是发送到crontab文件中指定的用户。

shell启动脚本

默认情况下,启动脚本是由使用zdaemon模块的Python脚本生成的。有时这很麻烦。特别是当部署软件时,生成的Python脚本可能在软件更新后损坏,因为它们包含对软件egg的引用。我们可以请求调用通用zdaemon脚本的shell脚本。shell脚本只依赖于zdaemon脚本的路径,这在更新软件时通常不会改变。

要请求shell脚本,请添加一个shell-script选项并设置为true。我们还需要生成zdaemon脚本

>>> write('buildout.cfg',
... '''
... [buildout]
... parts = zodb zdaemon server
...
... [zodb]
... recipe = zc.recipe.egg:script
... eggs = ZEO
...
... [zdaemon]
... recipe = zc.recipe.egg:script
... eggs = zdaemon
...
... [server]
... recipe = zc.zodbrecipes:server
... zeo.conf =
...    <zeo>
...       address 8100
...       monitor-address 8101
...       transaction-timeout 300
...    </zeo>
...    %%import foo
...    <foo>
...       path /databases/Data.fs
...    </foo>
... deployment = demo
... pack = 1 1 * * 0 3 jim@zope.com
... shell-script = true
...
... [demo]
... crontab-directory = %(cron)s
... etc-directory = %(etc)s
... log-directory = %(log)s
... logrotate-directory = %(rotate)s
... rc-directory = %(rc)s
... run-directory = %(run)s
... user = bob
... ''' % globals())
>>> print(system(buildout+' -D'), end='')
Uninstalling server.
Updating zodb.
Installing zdaemon.
Generated script '/sample-buildout/bin/zdaemon'.
Installing server.
zc.zodbrecipes: Generated shell script '/sample-buildout/rc/demo-server'.
>>> cat('rc', 'demo-server')
#!/bin/sh
su bob -c \
  "/sample-buildout/bin/zdaemon -C '/sample-buildout/etc/server-zdaemon.conf' $*"

名称

可以为部署和单个服务器部分指定名称。这些名称决定了生成文件的名称。

>>> write('buildout.cfg',
... '''
... [buildout]
... parts = zodb zdaemon server
...
... [zodb]
... recipe = zc.recipe.egg:script
... eggs = ZEO
...
... [zdaemon]
... recipe = zc.recipe.egg:script
... eggs = zdaemon
...
... [server]
... name = Server
... recipe = zc.zodbrecipes:server
... zeo.conf =
...    <zeo>
...       address 8100
...       monitor-address 8101
...       transaction-timeout 300
...    </zeo>
...    %%import foo
...    <foo>
...       path /databases/Data.fs
...    </foo>
... deployment = demo
... pack = 1 1 * * 0 3 jim@zope.com
... shell-script = true
...
... [demo]
... name = Demo
... crontab-directory = %(cron)s
... etc-directory = %(etc)s
... log-directory = %(log)s
... logrotate-directory = %(rotate)s
... rc-directory = %(rc)s
... run-directory = %(run)s
... user = bob
... ''' % globals())
>>> print(system(buildout+' -D'), end='')
Uninstalling server.
Updating zodb.
Updating zdaemon.
Installing server.
zc.zodbrecipes: Generated shell script '/sample-buildout/rc/Demo-Server'.
>>> ls(cron)
-  pack-Demo-Server
>>> ls(etc)
-  Server-zdaemon.conf
-  Server-zeo.conf
>>> ls(rotate)
-  Demo-Server
>>> ls(rc)
-  Demo-Server

当您犯错误时的反馈

如果您在zeo.conf中犯了一个错误,某些错误将导致返回一个简单、有信息量的消息

>>> write('buildout.cfg',
... '''
... [buildout]
... parts = zodb server
...
... [zodb]
... recipe = zc.recipe.egg:script
... eggs = ZEO
...
... [server]
... recipe = zc.zodbrecipes:server
... zeo.conf =
...    nothing useful
... ''')
>>> print(system(buildout+' -q'), end='')
Couldn't clean up '/sample-buildout/bin/server'.
While:
  Installing server.
Error: No zeo section was defined.

如果您的zeo.conf有语法错误,您将看到有问题的文本和错误消息

>>> write('buildout.cfg',
... '''
... [buildout]
... parts = zodb server
...
... [zodb]
... recipe = zc.recipe.egg:script
... eggs = ZEO
...
... [server]
... recipe = zc.zodbrecipes:server
... zeo.conf = <bad
... ''')
>>> print(system(buildout+' -q'), end='')
Couldn't clean up '/sample-buildout/bin/server'.
While:
  Installing server.
Error: malformed section start (line 1) in:
<bad
<BLANKLINE>

下载

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

zc.zodbrecipes-3.0.tar.gz (17.1 kB 查看散列)

上传于

构建分发

zc.zodbrecipes-3.0-py3-none-any.whl (15.2 kB 查看哈希值)

上传于 Python 3

由以下支持