Code repository: https://ingeniweb.svn.sourceforge.net/svnroot/ingeniweb/iw.recipe.backup/
Change history
trunk (2009-11-25)
xxx [Ingeniweb]
0.2.1 (2008-11-24)
added ‘base-path’ option [fdupre] if set, use it instead buildout-dir, really usefull if datas are stored in another place in the system (NAS, NFS mount…).
0.2.0 (2008-05-08)
added ‘archive-before-backup’ option. [tdesvenain] True by default. If set to 0, buildout is not backuped before a restore
added ‘include-folders’ option, that allows to limit backup on some directories [tdesvenain]
create backups dir if not exists [tdesvenain]
add format option instead of archive-root-name [gawel]
fixing test so it passes on all machines [tarek]
0.1.2 (2008-04-11)
Added the fs-location option, that allows doing a safe backup of a running Data.fs. [tarek]
0.1.1 (2008-03-21)
Added the exclude-folders option
Now asks a question before restoring. It is more a conveniency since everything is backed up in any case. [tarek]
0.1.0 (2008-03-12)
Initial implementation. [tarek]
Created recipe with ZopeSkel [Ingeniweb].
Detailed Documentation
Supported options
The recipe supports the following options:
- backup-script-name
Name of the backup script. Default: backup
- restore-script-name
Name of the restore script. Default: restore
- format
Formated name of the archive. Default to %(name)s-%(year)s-%(month)s-%(day)s-%(hour)s-%(minute)s where name is the section name
- exclude-folders
Names of folder to avoid backing up. Relative to buildout root.
- include-folders
If set, back up those folders only. Relative to buildout root.
- fs-location
If given, indicates the path of the file system storage. The recipe will carefully copy it when doing a backup, by using a transaction-level read of the file. This means that you can launch a backup without stopping the Zope server.
- target-folder
Folder where the archives are stored. Mandatory
- log-file
File where all calls are recorded. Mandatory
- archive-before-restore
If not set to 0, do a complete backup before a restore
- prompt-before-restore
If not set to 0, prompt before a restore
- base-path
If set, backup this path instead base on instance path
Example usage
We’ll start by creating a buildout that uses the recipe:
>>> import os >>> root = os.path.split(sample_buildout)[0] >>> if root == '': ... root = '.'
Let’s copy a real Data.fs in our buildout:
>>> 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'})
Let’s run the buildout:
>>> null = system(buildout)
Let’s see what we got in the backup script:
>>> 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>
Ok, let’s call it to backup the current buildout:
>>> print system(join(sample_buildout, 'bin', 'backup')) Starting the backup... Archived in /backup-XXXX-XX-XX.tar.gz ... <BLANKLINE>
We should have a log file generated as well:
>>> print open(join(root, 'backup.log')).read() 20... Starting the backup... 20... INFO Archived in /backup-XXXX-XX-XX.tar.gz
We also have a restore feature:
>>> print system(join(sample_buildout, 'bin', 'restore')) Usage: ...restore archive_name <BLANKLINE>
Let’s set the user input:
>>> from iw.recipe.backup.testing import set_input
>>> set_input('Y')
Oh right, the restore script takes the name of the archive:
>>> 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>
And a restore always makes an archive on the current folder before it is applied, to make sure nothing is never lost.
There’s also something quite important: make sure the archive and log files are not located in the 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>
A bit of cleaning:
>>> import glob
>>> arc = glob.glob('%s/*.tar.gz' % root)
>>> for f in arc:
... os.remove(f)
We can also exclude some folders from being archived:
>>> 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})
Running the buildout again:
>>> print system(buildout+' -D') Installing backup. Generated script '...backup'. Generated script '...restore'. <BLANKLINE>
Let’s backup:
>>> print system(join(sample_buildout, 'bin', 'backup')) Starting the backup... Archived in /backup-XXXX-XX-XX-XX-XX.tar.gz ... <BLANKLINE>
Let’s remove the folder and the Data.fs:
>>> import shutil >>> shutil.rmtree(join(sample_buildout, 'not')) >>> os.rmdir(join(sample_buildout, 'neh')) >>> os.remove(join(sample_buildout, 'Data.fs'))
Let’s restore:
>>> 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>
And make sure the not folder is not back !
>>> os.path.exists(join(sample_buildout, 'not')) False >>> os.path.exists(join(sample_buildout, 'neh')) False
And the Data.fs is back, so we’re OK:
>>> os.path.exists(join(sample_buildout, 'Data.fs')) True
We can also restrict archive on some folders
>>> 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})
Running the buildout again:
>>> print system(buildout+' -D') Uninstalling backup. Installing backup. Generated script '...backup'. Generated script '...restore'. <BLANKLINE>
Let’s see what we got in the backup script:
>>> 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>
Let’s backup:
>>> print system(join(sample_buildout, 'bin', 'backup')) Starting the backup... Archived in /backup-XXXX-XX-XX-XX-XX.tar.gz <BLANKLINE>
Let’s remove the folder and the Data.fs:
>>> import shutil >>> shutil.rmtree(join(sample_buildout, 'not')) >>> shutil.rmtree(join(sample_buildout, 'neh')) >>> os.remove(join(sample_buildout, 'Data.fs'))
Let’s restore:
>>> arc = glob.glob('%s/*.tar.gz' % root)[0]
>>> rest = os.popen(join(sample_buildout, 'bin', 'restore %s' % arc))
- And make sure the not folder and ‘neh/not’ are not back and neh is back !
>>> 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
Contributors
Ingeniweb, Author
Download
Release files for iw.recipe.backup 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| iw.recipe.backup-0.2.1.tar.gz | 12.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| iw.recipe.backup-0.2.1-py2.4.egg | Legacy Egg format | - | - | Details |
Total release size: 35.5 kB
Release files / iw.recipe.backup-0.2.1.tar.gz
| Download URL | iw.recipe.backup-0.2.1.tar.gz |
|---|---|
| Size | 12.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5eb2bcf5ca934df19eaa8b43bf0179a2f883e0a0016c88700261041f886be52f
|
|
BLAKE2b-256 checksum How to use checksums |
fc3a055fa50f5fb21d199e62ad2d5553bbf8d7e2ed37188bcb6d8b1f37f1049d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
Release files / iw.recipe.backup-0.2.1-py2.4.egg
| Download URL | iw.recipe.backup-0.2.1-py2.4.egg |
|---|---|
| Size | 22.6 kB |
| Tags | Egg |
|
SHA-256 checksum How to use checksums |
7f5ca8bbba2ddc57da1a7acdd43142117e5dd767350ae610475b25b727fe3fe3
|
|
BLAKE2b-256 checksum How to use checksums |
df28112841a9158d6eb3b7de40f34cc4fd3007d19ce37f0b6bd485a2fb181901
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |