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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 5eb2bcf5ca934df19eaa8b43bf0179a2f883e0a0016c88700261041f886be52f |
|
MD5 | 5fc57dd2c5b88453d1b248c6b3008ad2 |
|
BLAKE2b-256 | fc3a055fa50f5fb21d199e62ad2d5553bbf8d7e2ed37188bcb6d8b1f37f1049d |
iw.recipe.backup-0.2.1-py2.4.egg 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7f5ca8bbba2ddc57da1a7acdd43142117e5dd767350ae610475b25b727fe3fe3 |
|
MD5 | 66c703f24bd3894f6a2a46642ece6917 |
|
BLAKE2b-256 | df28112841a9158d6eb3b7de40f34cc4fd3007d19ce37f0b6bd485a2fb181901 |