跳转到主要内容

Zc buildout配方,提供备份脚本

项目描述

代码仓库: https://ingeniweb.svn.sourceforge.net/svnroot/ingeniweb/iw.recipe.backup/

变更历史

trunk (2009-11-25)

  • xxx [Ingeniweb]

0.2.1 (2008-11-24)

  • 添加了‘base-path’选项 [fdupre]。如果设置,则使用它而不是buildout-dir,如果数据存储在系统中的另一个位置(NAS、NFS挂载等),则非常有用。

0.2.0 (2008-05-08)

  • 添加了‘archive-before-backup’选项。[tdesvenain] 默认为True。如果设置为0,则恢复前不备份buildout

  • 添加了‘include-folders’选项,允许限制备份到某些目录[tdesvenain]

  • 如果不存在,则创建备份目录[tdesvenain]

  • 添加了format选项,而不是archive-root-name[gawel]

  • 修复了测试,使其在所有机器上通过[tarek]

0.1.2 (2008-04-11)

  • 添加了fs-location选项,允许对正在运行的Data.fs进行安全备份[tarek]

0.1.1 (2008-03-21)

  • 添加了exclude-folders选项

  • 在恢复之前询问一个问题。这更方便,因为无论如何都会备份所有内容[tarek]

0.1.0 (2008-03-12)

  • 初始实现[tarek]

  • 使用ZopeSkel创建了配方[Ingeniweb]。

详细文档

支持选项

该配方支持以下选项

backup-script-name

备份脚本的名称。默认:backup

restore-script-name

恢复脚本的名称。默认:restore

format

存档的格式化名称。默认为 %(name)s-%(year)s-%(month)s-%(day)s-%(hour)s-%(minute)s,其中 name 是部分名称

exclude-folders

要避免备份的文件夹名称。相对于构建根目录。

include-folders

如果设置,只备份这些文件夹。相对于构建根目录。

fs-location

如果给定,表示文件系统存储的路径。在备份时,该食谱将使用文件的事务级读取仔细复制它。这意味着您可以在不停止 Zope 服务器的情况下启动备份。

target-folder

存储存档的文件夹。 必填

log-file

记录所有调用的文件。 必填

archive-before-restore

如果没有设置为 0,则在恢复之前进行完整备份

prompt-before-restore

如果没有设置为 0,则在恢复之前提示

base-path

如果设置,将备份此路径而不是基于实例路径

示例用法

我们将开始创建一个使用该食谱的 buildout

>>> import os
>>> root =  os.path.split(sample_buildout)[0]
>>> if root == '':
...     root = '.'

让我们在我们的 buildout 中复制一个真实的数据.fs

>>> import shutil
>>> data_fs = os.path.join(test_dir, 'Data.fs')
>>> shutil.copyfile(data_fs, join(sample_buildout, 'Data.fs'))

>>> write('buildout.cfg',
... """
... [buildout]
... parts = backup
... index = http://pypi.python.org/simple
...
... [backup]
... recipe = iw.recipe.backup
...
... format = %(format)s
... target-folder = %(root)s
... log-file = %(root)s/backup.log
... fs-location = ${buildout:directory}/Data.fs
... """ % {'root': root, 'format':'%(name)s-%(year)s-%(month)s-%(day)s'})

让我们运行 buildout

>>> null = system(buildout)

让我们看看备份脚本中有什么

>>> print open(join(sample_buildout, 'bin', 'backup')).read()
#!...
<BLANKLINE>
import sys
sys.path[0:0] = [
  ...
  ]
<BLANKLINE>
import iw.recipe.backup.archive
<BLANKLINE>
if __name__ == '__main__':
    iw.recipe.backup.archive.archive_buildout(('/sample-buildout', '%(name)s-%(year)s-%(month)s-%(day)s', '..._TEST_', '/backup.log', [], [], '/sample-buildout/Data.fs', {'name': 'backup'}))
<BLANKLINE>

好的,让我们调用它来备份当前的 buildout

>>> print system(join(sample_buildout, 'bin', 'backup'))
Starting the backup...
Archived in /backup-XXXX-XX-XX.tar.gz
...
<BLANKLINE>

我们应该生成一个日志文件

>>> print open(join(root, 'backup.log')).read()
20... Starting the backup...
20... INFO Archived in /backup-XXXX-XX-XX.tar.gz

我们还有一个恢复功能

>>> print system(join(sample_buildout, 'bin', 'restore'))
Usage: ...restore archive_name
<BLANKLINE>

让我们设置用户输入

>>> from iw.recipe.backup.testing import set_input
>>> set_input('Y')

对了,恢复脚本需要存档的名称

>>> import glob
>>> arc = glob.glob('%s/*.tar.gz' % root)[0]
>>> print system(join(sample_buildout, 'bin', 'restore %s' % arc))
Are you sure you want to restore ? Every data will be lost ! (y/N)  Y
Archiving current folder before restoring
Starting the backup...
Archived in /before-restore-XXXX-XX-XX-XX-XX.tar.gz
Starting the restore...
Archive restored in /sample-buildout
...
<BLANKLINE>

恢复 总是 在应用之前在当前文件夹中创建一个存档,以确保永远不会丢失任何内容。

还有一件相当重要的事情:确保存档和日志文件不在 buildout 中!

>>> write('buildout.cfg',
... """
... [buildout]
... parts = backup
... index = http://pypi.python.org/simple
...
... [backup]
... recipe = iw.recipe.backup
...
... target-folder = %(root)s
... log-file = %(root)s/backup.log
... """ % {'root': sample_buildout})

>>> print system(buildout)
Uninstalling backup.
Installing backup.
While:
  Installing backup.
<BLANKLINE>
An internal error occured due to a bug in either zc.buildout or in a
recipe being used:
...
ValueError: Cannot backup within the buildout ! Check your values
<BLANKLINE>

一些清理工作

>>> import glob
>>> arc = glob.glob('%s/*.tar.gz' % root)
>>> for f in arc:
...     os.remove(f)

我们还可以排除一些文件夹进行存档

>>> os.mkdir(join(sample_buildout, 'not'))
>>> open(join(sample_buildout, 'not', 'f'), 'w').write('me file')

>>> os.mkdir(join(sample_buildout, 'neh'))

>>> write('buildout.cfg',
... """
... [buildout]
... parts = backup
... index = http://pypi.python.org/simple
...
... [backup]
... recipe = iw.recipe.backup
...
... target-folder = %(root)s
... log-file = %(root)s/backup.log
... fs-location = ${buildout:directory}/Data.fs
... exclude-folders =
...     %(sample_buildout)s/not
...     %(sample_buildout)s/neh
... """ % {'root': root, 'sample_buildout': sample_buildout})

再次运行 buildout

>>> print system(buildout+' -D')
Installing backup.
Generated script '...backup'.
Generated script '...restore'.
<BLANKLINE>

让我们备份

>>> print system(join(sample_buildout, 'bin', 'backup'))
Starting the backup...
Archived in /backup-XXXX-XX-XX-XX-XX.tar.gz
...
<BLANKLINE>

让我们删除文件夹和数据.fs

>>> import shutil
>>> shutil.rmtree(join(sample_buildout, 'not'))
>>> os.rmdir(join(sample_buildout, 'neh'))
>>> os.remove(join(sample_buildout, 'Data.fs'))

让我们恢复

>>> arc = glob.glob('%s/*.tar.gz' % root)[0]
>>> print system(join(sample_buildout, 'bin', 'restore %s' % arc))
Are you sure you want to restore ? Every data will be lost ! (y/N)  Y
...
<BLANKLINE>

并确保 not 文件夹没有恢复!

>>> os.path.exists(join(sample_buildout, 'not'))
False
>>> os.path.exists(join(sample_buildout, 'neh'))
False

并且 Data.fs 已恢复,所以我们没事

>>> os.path.exists(join(sample_buildout, 'Data.fs'))
True

我们还可以限制某些文件夹的存档

>>> os.mkdir(join(sample_buildout, 'not'))
>>> open(join(sample_buildout, 'not', 'f'), 'w').write('me file')

>>> os.mkdir(join(sample_buildout, 'neh'))
>>> open(join(sample_buildout, 'neh', 'f'), 'w').write('me file')

>>> os.mkdir(join(sample_buildout, 'neh/not'))
>>> open(join(sample_buildout, 'neh/not', 'f'), 'w').write('me file')

>>> write('buildout.cfg',
... """
... [buildout]
... parts = backup
... index = http://pypi.python.org/simple
...
... [backup]
... recipe = iw.recipe.backup
...
... target-folder = %(root)s
... log-file = %(root)s/backup.log
... fs-location = ${buildout:directory}/Data.fs
... exclude-folders =
...     %(sample_buildout)s/not
...     %(sample_buildout)s/neh/not
... include-folders =
...     %(sample_buildout)s/neh
... prompt-before-restore = 0
... archive-before-restore = 0
... """ % {'root': root, 'sample_buildout': sample_buildout})

再次运行 buildout

>>> print system(buildout+' -D')
Uninstalling backup.
Installing backup.
Generated script '...backup'.
Generated script '...restore'.
<BLANKLINE>

让我们看看备份脚本中有什么

>>> print open(join(sample_buildout, 'bin', 'backup')).read()
#!...
<BLANKLINE>
import sys
sys.path[0:0] = [
  ...
  ]
<BLANKLINE>
import iw.recipe.backup.archive
<BLANKLINE>
if __name__ == '__main__':
    iw.recipe.backup.archive.archive_buildout(('/sample-buildout', '...', '..._TEST_', '/backup.log', ['/sample-buildout/not', '/sample-buildout/neh/not'], ['/sample-buildout/neh'], '/sample-buildout/Data.fs', {'name': 'backup'}))
<BLANKLINE>

让我们备份

>>> print system(join(sample_buildout, 'bin', 'backup'))
Starting the backup...
Archived in /backup-XXXX-XX-XX-XX-XX.tar.gz
<BLANKLINE>

让我们删除文件夹和数据.fs

>>> import shutil
>>> shutil.rmtree(join(sample_buildout, 'not'))
>>> shutil.rmtree(join(sample_buildout, 'neh'))
>>> os.remove(join(sample_buildout, 'Data.fs'))

让我们恢复

>>> arc = glob.glob('%s/*.tar.gz' % root)[0]
>>> rest = os.popen(join(sample_buildout, 'bin', 'restore %s' % arc))
并确保 not 文件夹和‘neh/not’没有恢复,neh 已恢复!
>>> os.path.exists(join(sample_buildout, 'not'))
False
>>> os.path.exists(join(sample_buildout, 'neh/not'))
False
>>> os.path.exists(join(sample_buildout, 'neh'))
True

贡献者

Ingeniweb,作者

下载

项目详情


下载文件

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

源分布

iw.recipe.backup-0.2.1.tar.gz (12.9 kB 查看哈希)

上传时间

构建分布

iw.recipe.backup-0.2.1-py2.4.egg (22.6 kB 查看哈希)

上传时间

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面