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 |