{ "info": { "author": "Reinout van Rees, Maurits van Rees", "author_email": "m.van.rees@zestsoftware.nl", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Framework :: Buildout", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: OSI Approved :: GNU General Public License (GPL)", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Build Tools", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "Easy Zope backup/restore recipe for buildout\n********************************************\n\n.. image:: https://travis-ci.org/collective/collective.recipe.backup.png\n :target: https://travis-ci.org/collective/collective.recipe.backup\n\n.. contents::\n\n\nIntroduction\n============\n\nThis recipe is mostly a wrapper around the ``bin/repozo`` script in\nyour Zope buildout. It requires that this script is already made\navailable. If this is not the case, you will get an error like this\nwhen you run one of the scripts: ``bin/repozo: No such file or\ndirectory``. You should be fine when you are on Plone 3 or when you\nare on Plone 4 and are using ``plone.recipe.zeoserver``. If this is\nnot the case, the easiest way of getting a ``bin/repozo`` script is to\nadd a new section in your ``buildout.cfg`` (do not forget to add it in the\n``parts`` directive)::\n\n [repozo]\n recipe = zc.recipe.egg\n eggs = ZODB\n # or this for an older version:\n # eggs = ZODB3\n scripts = repozo\n dependent-scripts = true\n\n``bin/repozo`` is a Zope script to make backups of your ``Data.fs``.\nLooking up the settings can be a chore. And you have to pick a\ndirectory where to put the backups. This recipe provides **sensible\ndefaults** for your common backup tasks. Making backups a piece of\ncake is important!\n\n- ``bin/backup`` makes an incremental backup.\n\n- ``bin/fullbackup`` always makes a full backup, in the same directory\n as the normal backups. You can enable this by setting the\n ``enable_fullbackup`` option to true.\n\n- ``bin/restore`` restores the latest backup, created by the backup or\n fullbackup script.\n\n- ``bin/snapshotbackup`` makes a full snapshot backup, separate from the\n regular backups. Handy right before a big change in the site.\n\n- ``bin/snapshotrestore`` restores the latest full snapshot backup.\n\n- ``bin/zipbackup`` makes a zip backup. This zips the Data.fs and the\n blobstorage, handy for copying production data to your local\n machine, especially the blobstorage with its many files. *Note*:\n the Data.fs and blobstorage (or other storages) are *not* combined\n in one file; you need to download multiple files. Enable this\n script by using the ``enable_zipbackup`` option.\n\n- ``bin/ziprestore`` restores the latest zipbackup.\n\n\nCompatibility\n=============\n\nThe recipe is tested with Python 2.6, 2.7, and 3.6.\nIn Plone terms it works fine on Plone 4 and 5.\n\nNote that the integration with ``plone.recipe.zope2instance`` is not tested on Python 3.6.\nThere is not yet a Python 3 compatible version of this recipe and its ``mailinglogger`` dependency.\n\n\nDevelopment\n===========\n\n- Code repository: https://github.com/collective/collective.recipe.backup\n\n- Issue tracker: https://github.com/collective/collective.recipe.backup/issues\n\n- Obvious fixes, like fixing typos, are fine on master.\n For larger changes or if you are unsure, please create a branch or a pull request.\n\n- The code comes with a ``buildout.cfg``. Please bootstrap the\n buildout and run the created ``bin/test`` to see if the tests still\n pass. Please try to add tests if you add code.\n\n- The long description of this package (as shown on PyPI), used to\n contain a big file with lots of test code that showed how to use the\n recipe. This grew too large, so we left it out. It is probably\n still good reading if you are wondering about the effect some\n options have. See ``src/collective/recipe/backup/tests/*.txt``.\n\n- We are tested on Travis:\n https://travis-ci.org/collective/collective.recipe.backup\n\n- Questions and comments to https://community.plone.org or to\n `Maurits van Rees `_.\n\n\nExample usage\n=============\n\nThe simplest way to use this recipe is to add a part in ``buildout.cfg`` like this::\n\n [buildout]\n parts = backup\n\n [backup]\n recipe = collective.recipe.backup\n\nYou can set lots of extra options, but the recipe authors like to\nthink they have created sane defaults, so this single line stating the\nrecipe name should be enough in most cases.\n\nRunning the buildout adds the ``backup``, ``fullbackup``,\n``snapshotbackup``, ``zipbackup``, ``restore``, ``snapshotrestore``\nand ``ziprestore`` scripts to the ``bin/`` directory of the buildout.\nSome are not added by default, others can be switched off.\n\n\nBacked up data\n==============\n\nWhich data does this recipe backup?\n\n- The Zope Object DataBase (ZODB) filestorage, by default located at\n ``var/filestorage/Data.fs``.\n\n- Possibly additional filestorages, see the\n ``additional_filestorages`` option.\n\n- The blobstorage (since version 2.0) if your buildout uses it, by\n default located at ``var/blobstorage``.\n\n\nData that is *not* backed up\n============================\n\nWhich data does this recipe *not* backup? Everything else of course,\nbut specifically:\n\n- Data stored in ``RelStorage`` will *not* be backed up. (You could\n still use this recipe to back up the filesystem blobstorage,\n possibly with the ``only_blobs`` option.)\n\n- Other data stored in SQL, perhaps via SQLAlchemy, will *not* be\n backed up.\n\n- It does *not* create a backup of your entire buildout directory.\n\n\nIs your backup backed up?\n=========================\n\nNote that the backups are by default created in the ``var`` directory\nof the buildout, so if you accidentally remove the entire buildout,\nyou also lose your backups. It should be standard practice to use the\n``location`` option to specify a backup location in for example the\nhome directory of the user. You should also arrange to copy that\nbackup to a different machine/country/continent/planet.\n\n\nBackup\n======\n\nCalling ``bin/backup`` results in a normal incremental repozo backup\nthat creates a backup of the ``Data.fs`` in ``var/backups``. When you\nhave a blob storage it is by default backed up to\n``var/blobstoragebackups``.\n\n\nFull backup\n===========\n\nCalling ``bin/fullbackup`` results in a normal FULL repozo backup\nthat creates a backup of the ``Data.fs`` in ``var/backups``. When you\nhave a blob storage it is by default backed up to\n``var/blobstoragebackups``. This script is provided so that you can\nset different cron jobs for full and incremental backups. You may\nwant to have incrementals done daily, with full backups done weekly.\nNow you can!\n\nSince version 4.0, the fullbackup script is not created by default.\nEnable it by setting ``enable_fullbackup`` to ``true``\n\nYou should normally do a ``bin/zeopack`` regularly, say once a week,\nto remove unused objects from your Zope ``Data.fs``. The next time\n``bin/backup`` is called, a complete fresh backup is made, because an\nincremental backup is not possible anymore. This is standard\n``bin/repozo`` behaviour. So you might not need the\n``bin/fullbackup`` script.\n\n\nSnapshots\n=========\n\nA quick backup just before updating the production server is a good\nidea. But you may not want to interfere with the regular backup\nregime. For that, the ``bin/snapshotbackup`` is great. It places a\nfull backup in, by default, ``var/snapshotbackups``.\n\n\nZipbackups\n==========\n\nFor quickly grabbing the current state of a production database so you\ncan download it to your development laptop, you want a full and zipped\nbackup. The zipped part is important for the blobstorage, because you\ndo not want to use ``scp`` to recursively copy over all those blob\nfiles: downloading one tarball is faster.\n\nYou can use the ``bin/zipbackup`` script for this. This script\noverrides a few settings, ignoring whatever is set in the buildout\nconfig section:\n\n- ``gzip`` is explicitly turned on for the filestorage (this is\n already the default, but we make sure).\n\n- ``archive_blob`` is turned on.\n\n- ``keep`` is set to 1 to avoid keeping lots of needless backups.\n\n- ``keep_blob_days`` is ignored because it is a full backup.\n\nThe script places a full backup in, by default, ``var/zipbackups`` and\nit puts a tarball of the blobstorage in ``var/blobstoragezips``.\n\nThis script is not created by default.\nYou can enable it by setting the ``enable_zipbackup`` option to true.\nAlso, if ``backup_blobs`` is false, the scripts are useless, so we do not create them, even when you have enabled them explicitly.\n\n\nRestore\n=======\n\nCalling ``bin/restore`` restores the very latest normal incremental\n``repozo`` backup and restores the blobstorage if you have that.\n\nYou can restore the very latest snapshotbackup with ``bin/snapshotrestore``.\n\nYou can restore the zipbackup with ``bin/ziprestore``.\n\nYou can also restore the backup as of a certain date. Just pass a date argument.\nAccording to ``repozo``: specify UTC (not local) time.\nThe format is ``yyyy-mm-dd[-hh[-mm[-ss]]]``.\nSo as a simple example, restore to 25 december 1972::\n\n bin/restore 1972-12-25\n\nor to that same date, at 2,03 seconds past 1::\n\n bin/restore 1972-12-25-01-02-03\n\nSince version 2.3 this also works for restoring blobs.\nWe restore the directory from the first backup at or before the specified date.\n(Note that before version 4.0 we restored the directory from the first backup after the specified date,\nwhich should be fine as long as you did not do a database pack in between.)\n\nSince version 2.0, the restore scripts ask for confirmation before\nstarting the restore, as this is a potentially dangerous command.\n(\"Oops, I have restored the live site but I meant to restore the test\nsite.\") You need to explicitly type 'yes'::\n\n This will replace the filestorage (Data.fs).\n This will replace the blobstorage.\n Are you sure? (yes/No)?\n\nNote that for large filestorages and blobstorages **it may take long to restore**.\nYou should do a test restore and check how long it takes.\nSeconds? Minutes? Hours?\nIs that time acceptable or should you take other measures?\n\nNames of created scripts\n========================\n\nA backup part will normally be called ``[backup]``, leading to a\n``bin/backup`` and ``bin/snapshotbackup``. Should you name your part\nsomething else, the script names will also be different, as will the created\n``var/`` directories (since version 1.2)::\n\n [buildout]\n parts = plonebackup\n\n [plonebackup]\n recipe = collective.recipe.backup\n enable_zipbackup = true\n\nThat buildout snippet will create these scripts::\n\n bin/plonebackup\n bin/plonebackup-full\n bin/plonebackup-zip\n bin/plonebackup-snapshot\n bin/plonebackup-restore\n bin/plonebackup-ziprestore\n bin/plonebackup-snapshotrestore\n\n\nSupported options\n=================\n\nThe recipe supports the following options, none of which are needed by\ndefault. The most common ones to change are ``location`` and\n``blobbackuplocation``, as those allow you to place your backups in\nsome system-wide directory like ``/var/zopebackups/instancename/`` and\n``/var/zopebackups/instancename-blobs/``.\n\n.. Note: keep this in alphabetical order please.\n\n``additional_filestorages``\n Advanced option, only needed when you have split for instance a\n ``catalog.fs`` out of the regular ``Data.fs``.\n Use it to specify the extra filestorages.\n (See `Advanced usage: multiple Data.fs files`_).\n\n``archive_blob``\n Use ``tar`` archiving functionality. ``false`` by default. Set it to ``true``\n and backup/restore will be done with ``tar`` command. Note that ``tar``\n command must be available on machine if this option is set to ``true``.\n This option also works with snapshot backup/restore commands. As this\n counts as a full backup ``keep_blob_days`` is ignored.\n See the ``compress_blob`` option if you want to compress the archive.\n\n``alternative_restore_sources``\n You can restore from an alternative source. Use case: first make\n a backup of your production site, then go to the testing or\n staging server and restore the production data there. See\n `Alternative restore sources`_\n\n``backup_blobs``\n Backup the blob storage. Default is ``True`` on Python 2.6 (Plone\n 4) and higher, and ``False`` otherwise. This requires the\n ``blob_storage`` location to be set. If no ``blob_storage``\n location has been set and we cannot find one by looking in the\n other buildout parts, we quit with an error (since version 2.22).\n If ``backup_blobs`` is false, ``enable_zipbackup`` cannot be true,\n because the ``zipbackup`` script is not useful then.\n\n``blob_storage``\n Location of the directory where the blobs (binary large objects)\n are stored. This is used in Plone 4 and higher, or on Plone 3 if\n you use ``plone.app.blob``. This option is ignored if backup_blobs is\n ``false``. The location is not set by default. When there is a part\n using ``plone.recipe.zeoserver``, ``plone.recipe.zope2instance`` or\n ``plone.recipe.zope2zeoserver``, we check if that has a\n blob-storage option and use that as default. Note that we pick\n the first one that has this option and we do not care about\n shared-blob settings, so there are probably corner cases where we\n do not make the best decision here. Use this option to override\n it in that case.\n\n``blob-storage``\n Alternative spelling for the preferred ``blob_storage``, as\n ``plone.recipe.zope2instance`` spells it as ``blob-storage`` and we are\n using underscores in all the other options. Pick one.\n\n``blob_timestamps``\n New in version 4.0. Default is false.\n By default we create ``blobstorage.0``.\n The next time, we rotate this to ``blobstorage.1`` and create a new ``blobstorage.0``.\n With ``blob_timestamps = true``, we create stable directories that we do not rotate.\n They get a timestamp, the same timestamp that the ZODB filestorage backup gets.\n For example: ``blobstorage.1972-12-25-01-02-03``.\n Or with ``archive_blob = true``: ``blobstorage.1972-12-25-01-02-03.tar.gz``.\n Because the filename is unpredictable, since version 4.1 we create a ``latest`` symlink\n to the most recent backup.\n\n``blobbackuplocation``\n Directory where the blob storage will be backed up to. Defaults\n to ``var/blobstoragebackups`` inside the buildout directory.\n\n``blobsnapshotlocation``\n Directory where the blob storage snapshots will be created.\n Defaults to ``var/blobstoragesnapshots`` inside the buildout\n directory.\n\n``blobziplocation``\n Directory where the blob storage zipbackups will be created.\n Defaults to ``var/blobstoragezips`` inside the buildout\n directory.\n\n``compress_blob``\n New in version 4.0. Default is false.\n This is only used when the ``archive_blob`` option is true.\n When switched on, it will compress the archive,\n resulting in a ``.tar.gz`` instead of a ``tar`` file.\n When restoring, we always look for both compressed and normal archives.\n We used to always compress them, but in most cases it hardly decreases the size\n and it takes a long time anyway. I have seen archiving take 15 seconds,\n and compressing take an additional 45 seconds.\n The result was an archive of 5.0 GB instead of 5.1 GB.\n\n``datafs``\n In case the ``Data.fs`` isn't in the default ``var/filestorage/Data.fs``\n location, this option can overwrite it.\n\n``debug``\n In rare cases when you want to know exactly what's going on, set debug to\n ``true`` to get debug level logging of the recipe itself. ``repozo`` is also run\n with ``--verbose`` if this option is enabled.\n\n``enable_fullbackup``\n Create ``fullbackup`` script. Default: false (changed in 4.0).\n\n``enable_snapshotrestore``\n Having a ``snapshotrestore`` script is very useful in development\n environments, but can be harmful in a production buildout. The\n script restores the latest snapshot directly to your filestorage\n and it used to do this without asking any questions whatsoever\n (this has been changed to require an explicit ``yes`` as answer).\n If you don't want a ``snapshotrestore`` script, set this option to false.\n\n``enable_zipbackup``\n Create ``zipbackup`` and ``ziprestore`` scripts. Default: false.\n If ``backup_blobs`` is not on, these scripts are always disabled,\n because they are not useful then.\n\n``full``\n By default, incremental backups are made. If this option is set to ``true``,\n ``bin/backup`` will always make a full backup. This option is (obviously)\n the default when using the ``fullbackup`` script.\n\n``gzip``\n Use repozo's zipping functionality. ``true`` by default. Set it to ``false``\n and repozo will not gzip its files. Note that gzipped databases are called\n ``*.fsz``, not ``*.fs.gz``. **Changed in 0.8**: the default used to be\n false, but it so totally makes sense to gzip your backups that we changed\n the default.\n\n``gzip_blob``\n Backwards compatibility alias for ``archive_blob`` option.\n\n``incremental_blobs``\n New in version 4.0. Default is false.\n When switched on, it will use the ``--listed-incremental`` option of ``tar``.\n Note: this only works with the GNU version of ``tar``.\n On Mac you may need to install this with ``brew install gnu-tar`` and change your ``PATH`` according to the instructions.\n It will create a metadata or `snapshot file `_\n so that a second call to the backup script will create a second tarball with only the differences.\n For some reason, all directories always end up in the second tarball,\n even when there are no changes; this may depend on the used file system.\n This option is ignored when the ``archive_blob`` option is false.\n This option *requires* the ``blob_timestamps`` option to be true,\n because it needs the tarball names to be stable, instead of getting rotated.\n If you have explicitly set ``blob_timestamps`` to false, buildout will exit with an error.\n Note that the ``latest`` symlink to the most recent backup is not created with ``incremental_blobs`` true.\n For large blobstorages it may take long to restore, so do test it out.\n But that is wise in all cases.\n Essentially, this feature seems to trade off storage space reduction with restore time.\n\n``keep``\n Number of full backups to keep. Defaults to ``2``, which means that the\n current and the previous full backup are kept. Older backups are removed,\n including their incremental backups. Set it to ``0`` to keep all backups.\n\n``keep_blob_days``\n Number of *days* of blob backups to keep. Defaults to ``14``, so\n two weeks. This is **only** used for partial (full=False)\n backups, so this is what gets used normally when you do a\n ``bin/backup``. This option has been added in 2.2. For full\n backups (snapshots) we just use the ``keep`` option. Recommended\n is to keep these values in sync with how often you do a ``zeopack`` on\n the ``Data.fs``, according to the formula ``keep *\n days_between_zeopacks = keep_blob_days``. The default matches one\n zeopack per seven days (``2*7=14``).\n Since version 4.0, this option is ignored unless ``only_blobs`` is true.\n Instead, we remove the blob backups that have no matching filestorage backup.\n\n``location``\n Location where backups are stored. Defaults to ``var/backups`` inside the\n buildout directory.\n\n``locationprefix``\n Location of the folder where all other backup and snapshot folders will\n be created. Defaults to ``var/``.\n Note that this does not influence where we look for a source filestorage or blobstorage.\n\n``only_blobs``\n Only backup the blobstorage, not the ``Data.fs`` filestorage. False\n by default. May be a useful option if for example you want to\n create one ``bin/filestoragebackup`` script and one\n ``bin/blobstoragebackup`` script, using ``only_blobs`` in one and\n ``backup_blobs`` in the other.\n\n``post_command``\n Command to execute after the backup has finished. One use case\n would be to unmount the remote file system that you mounted\n earlier using the ``pre_command``. See that ``pre_command`` above for\n more info.\n\n``pre_command``\n Command to execute before starting the backup. One use case would\n be to mount a remote file system using NFS or sshfs and put the\n backup there. Any output will be printed. If you do not like\n that, you can always redirect output somewhere else (``mycommand >\n /dev/null`` on Unix). Refer to your local Unix guru for more\n information. If the command fails, the backup script quits with\n an error. You can specify multiple commands.\n\n``quick``\n Call ``repozo`` with the ``--quick`` option. This option was\n introduced to ``collective.recipe.backup`` in version 2.19, with\n **default value true**. Due to all the checksums that the repozo\n default non-quick behavior does, an amount of data is read that is\n three to four times as much as is in the actual filestorage. With\n the quick option it could easily be just a few kilobytes.\n Theoretically the quick option is less safe, but it looks like it\n can only go wrong when someone edits the ``.dat`` file in the\n repository or removes a ``.deltafs`` file.\n\n The ``quick`` option only influences the created ``bin/backup``\n script. It has no effect on the snapshot or restore scripts.\n\n The repozo help says about this option: \"Verify via md5 checksum\n only the last incremental written. This significantly reduces the\n disk i/o at the (theoretical) cost of inconsistency. This is a\n probabilistic way of determining whether a full backup is\n necessary.\"\n\n``rsync_options``\n Add extra options to the default ``rsync -a`` command. Default is no\n extra parameters. This can be useful for example when you want to restore\n a backup from a symlinked directory, in which case\n ``rsync_options = --no-l -k`` does the trick.\n\n``snapshotlocation``\n Location where snapshot backups of the filestorage are stored. Defaults to\n ``var/snapshotbackups`` inside the buildout directory.\n\n``use_rsync``\n Use ``rsync`` with hard links for backing up the blobs. Default is\n true. ``rsync`` is probably not available on all machines though, and\n I guess hard links will not work on Windows. When you set this to\n false, we fall back to a simple copy (``shutil.copytree`` from\n Python in fact).\n\n``ziplocation``\n Location where zip backups of the filestorage are stored. Defaults to\n ``var/zipbackups`` inside the buildout directory.\n\n\nAn example buildout snippet using various options, would look like this::\n\n [backup]\n recipe = collective.recipe.backup\n location = ${buildout:directory}/myproject\n keep = 2\n datafs = subfolder/myproject.fs\n full = true\n debug = true\n snapshotlocation = snap/my\n gzip = false\n enable_snapshotrestore = true\n pre_command = echo 'Can I have a backup?'\n post_command =\n echo 'Thanks a lot for the backup.'\n echo 'We are done.'\n\nPaths in directories or files can use relative (``../``) paths, and\n``~`` (home dir) and ``$BACKUP``-style environment variables are\nexpanded.\n\n\nCron job integration\n====================\n\n``bin/backup`` is of course ideal to put in your cronjob instead of a whole\n``bin/repozo ....`` line. But you don't want the \"INFO\" level logging that you\nget, as you'll get that in your mailbox. In your cronjob, just add ``-q`` or\n``--quiet``, and ``bin/backup`` will shut up unless there's a problem.\nThis option ignores the debug variable, if set to true in buildout.\n\nSpeaking of cron jobs? Take a look at `zc.recipe.usercrontab\n`_ if you want to handle\ncronjobs from within your buildout. For example::\n\n [backupcronjob]\n recipe = z3c.recipe.usercrontab\n times = 0 12 * * *\n command = ${buildout:directory}/bin/backup\n\n\nAdvanced usage: multiple Data.fs files\n======================================\n\nSometimes, a filestorage is split into several files. Most common reason is to\nhave a regular ``Data.fs`` and a ``catalog.fs`` which contains the\n``portal_catalog``. This is supported with the ``additional_filestorages``\noption::\n\n [backup]\n recipe = collective.recipe.backup\n additional_filestorages =\n catalog\n another\n\nThis means that, with the standard ``Data.fs``, the ``bin/backup``\nscript will now backup three filestorages::\n\n var/filestorage/Data.fs\n var/filestorage/catalog.fs\n var/filestorage/another.fs\n\nThe additional backups have to be stored separate from the ``Data.fs``\nbackup. That's done by appending the file's name and creating extra backup\ndirectories named that way::\n\n var/backups_catalog\n var/snapshotbackups_catalog\n var/backups_another\n var/snapshotbackups_another\n\nThe various backups are done one after the other. They cannot be done at the\nsame time with ``repozo``. So they are not completely in sync. The \"other\"\ndatabases are backed up first as a small difference in the catalog is just\nmildly irritating, but the other way around users can get real errors.\n\nIn the ``additional_filestorages`` option you can define different\nfilestorages using this syntax::\n\n additional_filestorages =\n storagename1 [datafs1_path [blobdir1]]\n storagename2 [datafs2_path [blobdir2]]\n ...\n\nSo if you want more control over the filestorage source path, you can\nexplicitly set it, with or without the blobstorage path. For\nexample::\n\n [backup]\n recipe = collective.recipe.backup\n additional_filestorages =\n foo ${buildout:directory}/var/filestorage/foo/foo.fs ${buildout:directory}/var/blobstorage-foo\n bar ${buildout:directory}/var/filestorage/bar/bar.fs\n\nIf the ``datafs_path`` is missing, then the default value will be used\n(``var/filestorage/storagename1.fs``). If you do not specify a\n``blobdir``, then this means no blobs will be backed up for that\nstorage. Note that if you specify ``blobdir`` you must specify\n``datafs_path`` as well.\n\nNote that ``collective.recipe.filestorage`` creates additional\nfilestorages in a slightly different location, but you can explictly define the\npaths of filestorage and blobstorage for all the ``parts`` defined in the recipe.\nWork is in progress to improve this.\n\n\nBlob storage\n============\n\nAdded in version 2.0.\n\nWe can backup the blob storage. Plone 4 uses a blob storage to store\nfiles (Binary Large OBjects) on the file system. In Plone 3 this is\noptional. When this is used, it should be backed up of course. You\nmust specify the source blob_storage directory where Plone (or Zope)\nstores its blobs. As indicated earlier, when we do not set it\nspecifically, we try to get the location from other parts, for example\nthe ``plone.recipe.zope2instance`` recipe::\n\n [buildout]\n parts = instance backup\n\n [instance]\n recipe = plone.recipe.zope2instance\n user = admin:admin\n blob-storage = ${buildout:directory}/var/somewhere\n\n [backup]\n recipe = collective.recipe.backup\n\nIf needed, we can tell buildout that we *only* want to backup blobs or\nspecifically do *not* want to backup the blobs. Specifying this using\nthe ``backup_blobs`` and ``only_blobs`` options might be useful in\ncase you want to separate this into several scripts::\n\n [buildout]\n newest = false\n parts = filebackup blobbackup\n\n [filebackup]\n recipe = collective.recipe.backup\n backup_blobs = false\n\n [blobbackup]\n recipe = collective.recipe.backup\n blob_storage = ${buildout:directory}/var/blobstorage\n only_blobs = true\n\nWith this setup ``bin/filebackup`` now only backs up the filestorage\nand ``bin/blobbackup`` only backs up the blobstorage.\n\nNew in version 4.0: you may want to specify ``blob_timestamps = true``.\nThen we create stable directories that we do not rotate.\nFor example: ``blobstorage.1972-12-25-01-02-03`` instead of ``blobstorage.0``.\n\n\nrsync\n=====\n\nBy default we use ``rsync`` to create backups. We create hard links\nwith this tool, to save disk space and still have incremental backups.\nThis probably requires a unixy (Linux, Mac OS X) operating system.\nIt is based on this article by Mike Rubel:\nhttp://www.mikerubel.org/computers/rsync_snapshots/\n\nWe have not tried this on Windows. Reports are welcome, but best is\nprobably to set the ``use_rsync = false`` option in the backup part.\nThen we simply copy the blobstorage directory.\n\n\nAlternative restore sources\n===========================\n\nAdded in version 2.17.\n\nYou can restore from an alternative source. Use case: first make a\nbackup of your production site, then go to the testing or staging\nserver and restore the production data there.\n\nIn the ``alternative_restore_sources`` option you can define different\nfilestorage and blobstorage backup source directories using this\nsyntax::\n\n alternative_restore_sources =\n storagename1 datafs1_backup [blobdir1_backup]\n storagename2 datafs2_backup [blobdir2_backup]\n ...\n\nThe storagenames *must* be the same as in the additional_filestorages\noption, plus a key ``Data`` (or ``1``) for the standard ``Data.fs``\nand optionally its blobstorage.\n\nThe result is a ``bin/altrestore`` script.\n\nThis will work for a standard buildout with a single filestorage and\nblobstorage::\n\n [backup]\n recipe = collective.recipe.backup\n alternative_restore_sources =\n Data /path/to/production/var/backups /path/to/production/var/blobstoragebackups\n\nThe above configuration uses ``repozo`` to restore the Data.fs from\nthe ``/path/to/production/var/backups`` repository to the standard\n``var/filestorage/Data.fs`` location. It copies the most recent\nblobstorage backup from\n``/path/to/production/var/blobstoragebackups/`` to the standard\n``var/blobstorage`` location.\n\nCalling the script with a specific date is supported just like the\nnormal restore script::\n\n bin/altrestore 2000-12-31-23-59\n\nIf you have additional filestorages, it would be like this::\n\n [backup]\n recipe = collective.recipe.backup\n additional_filestorages =\n foo ${buildout:directory}/var/filestorage/foo/foo.fs ${buildout:directory}/var/blobstorage-foo\n bar ${buildout:directory}/var/filestorage/bar/bar.fs\n alternative_restore_sources =\n Data /path/to/production/var/backups /path/to/production/var/blobstoragebackups\n foo /path/to/production/var/backups_foo /path/to/production/var/blobstoragebackups_foo\n bar /path/to/production/var/backups_bar\n\nThe recipe will fail if the alternative sources do not match the\nstandard filestorage, blobstorage and additional storages. For\nexample, you get an error when the ``alternative_restore_sources`` is\nmissing the ``Data`` key, when it has extra or missing keys, when a\nkey has no paths, when a key has an extra or missing blobstorage.\n\nDuring install of the recipe, so during the ``bin/buildout`` run, it\ndoes not check if the sources exist: you might have the production\nbackups on a different server and need to setup a remote shared\ndirectory, or you copy the data over manually.\n\nNote that the script takes the ``archive_blob`` and ``use_rsync`` options\ninto account. So if the alternative restore source contains a blob\nbackup that was made with ``archive_blob = true``, you need an\n``altrestore`` script that also uses this setting.\n\nContributors\n************\n\ncollective.recipe.backup is basically a port of ye olde instancemanager_'s\nbackup functionality. That backup functionality was coded mostly by Reinout\nvan Rees and Maurits van Rees, both from `Zest software`_\n\nCreating the buildout recipe was done by Reinout_ with some fixes by Maurits_, who is now the main developer and maintainer.\n\nThe snapshotrestore script was added by Nejc Zupan (niteoweb_).\n\nThe fullbackup script was added by `Tom 'Spanky' Kapanka`_.\n\nArchive blob backups feature added by `Matej Cotman`_ (niteoweb_).\n\n\nSponsorship\n===========\n\nWork on collective.recipe.backup has been made possible by Ghent University, or UGent.\nSee https://www.ugent.be.\nGhent University is a top 100 university and one of the major universities in Belgium.\n\n.. Links used above.\n\n.. _Zest software: http://zestsoftware.nl/\n\n.. _Reinout: http://reinout.vanrees.org/\n\n.. _Maurits: http://maurits.vanrees.org/\n\n.. _instancemanager: https://pypi.python.org/pypi/instancemanager\n\n.. _`Tom 'Spanky' Kapanka`: https://github.com/spanktar\n\n.. _`Sylvain Bouchard`: https://github.com/bouchardsyl\n\n.. _`Matej Cotman`: https://github.com/matejc\n\n.. _niteoweb: http://www.niteoweb.com\n\nChange history\n**************\n\n.. NOTE: You should *NOT* be adding new change log entries to this file, this\n file is managed by towncrier. You *may* edit previous change logs to\n fix problems like typo corrections or such.\n\n To add a new change log entry, please see the notes from the ``pip`` project at\n https://pip.pypa.io/en/latest/development/#adding-a-news-entry\n\n.. towncrier release notes start\n\n4.1.1 (2019-10-07)\n==================\n\nBug fixes:\n\n\n- When using timestamps, use correct filestorage backup location for blob timestamp of snapshot and zip backup.\n [maurits] (`Issue #55 `_)\n\n\n4.1.0 (2019-04-10)\n==================\n\nNew features:\n\n\n- Create symlink to latest timestamped blobstorage backup.\n When ``blob_timestamps`` is false, ``blobstorage.0`` is a stable filename,\n but with ``blob_timestamps`` true, such a stable name was missing.\n [maurits] (`Issue #48 `_)\n- Dropped official Python 2.6 support, added Python 3.7 support.\n No code change, but we are no longer testing 2.6.\n [maurits] (`Issue #49 `_)\n\n\nBug fixes:\n\n\n- Updated package versions in test buildout.\n Improved code quality according to flake8 and with black.\n [maurits] (`Issue #49 `_)\n- Removed already disabled support for sitepackage_safe_scripts. [maurits] (`Issue #51 `_)\n\n\n4.0.1 (2018-04-19)\n==================\n\nBug fixes:\n\n\n- With archive_blob true, still allow restoring non archives. We prefer\n archives then, but if no proper archive is found, we look for non archives.\n [maurits] (`Issue #44\n `_)\n- Sort os.listdir, for improved functioning on Mac. [maurits] (`Issue #45\n `_)\n\n\n4.0 (2017-12-22)\n================\n\n- Updated readme and added sponsorship note. [maurits]\n\n\n4.0b5 (2017-11-17)\n==================\n\n- Added ``incremental_blobs`` option.\n This creates tarballs with only the changes compared to the previous blob backups.\n This option is ignored when the ``archive_blob`` option is false.\n [maurits]\n\n- Improved code quality, reducing complexity. [maurits]\n\n- Refactored the main functions to not have so much code duplication.\n The normal, full, snapshot and zip backups had almost the same code.\n This made it hard to add new options.\n [maurits]\n\n\n4.0b4 (2017-08-18)\n==================\n\n- Test Python 3.6 (and 2.6 and 2.7) on Travis from now on. [maurits]\n\n- Ignore the zope2instance recipe integration tests on Python 3.\n They would need a compatible ``mailinglogger`` package.\n See `issue #31 `_. [maurits]\n\n- Tests: use cleaner way to check the mock repozo output.\n Share this setup between tests.\n This makes the output order the same on Python 2 and 3.\n See `issue #31 `_. [maurits]\n\n\n4.0b3 (2017-07-05)\n==================\n\n- Added basic Python 3 support. We do not test with it yet,\n but you should not get NameErrors anymore.\n See `issue #31 `_. [maurits]\n\n\n4.0b2 (2017-06-26)\n==================\n\n- No longer create the ``fullbackup`` script by default.\n You can still enable it by setting ``enable_fullbackup`` to ``true``.\n [maurits]\n\n- Without explicit ``blob-storage`` option, default to ``var/blobstorage``.\n Take the ``var`` option from zeoserver/client recipes into account.\n Fixes `issue #27 `_.\n [maurits]\n\n- Do not create hidden backup ``.0`` when blob_storage ends with a slash.\n Fixes `issue #26 `_.\n [maurits]\n\n\n4.0b1 (2017-05-31)\n==================\n\n- Make custom backup locations relative to the ``locationprefix`` option or the ``var`` directory.\n Until now, the ``locationprefix`` option was only used if you did not set custom locations.\n Custom location would be relative to the buildout directory.\n Now they are relative to the ``locationprefix`` option, with the ``var`` directory as default.\n So if you used a relative path, your backups may end up in a different path.\n Absolute paths are not affected: they ignore the locationprefix.\n [maurits]\n\n- When log level is DEBUG, show time stamps in the log. [maurits]\n\n- Added ``compress_blob`` option. Default is false.\n This is only used when the ``archive_blob`` option is true.\n When switched on, it will compress the archive,\n resulting in a ``.tar.gz`` instead of a ``tar`` file.\n When restoring, we always look for both compressed and normal archives.\n We used to always compress them, but in most cases it hardly decreases the size\n and it takes a long time anyway. I have seen archiving take 15 seconds,\n and compressing take an additional 45 seconds.\n The result was an archive of 5.0 GB instead of 5.1 GB.\n [maurits]\n\n- Renamed ``gzip_blob`` option to ``archive_blob``.\n Kept the old name as alias for backwards compatibility.\n This makes room for letting this create an archive without zipping it.\n [maurits]\n\n- Automatically remove old blobs backups that have no corresponding filestorage backup.\n We compare the timestamp of the oldest filestorage backup with the timestamps of the\n blob backups. This can be the name, if you use ``blob_timestamps = true``,\n or the modification date of the blob backup.\n This means that the ``keep_blob_days`` option is ignored, unless you use ``only_blobs = true``.\n [maurits]\n\n- When backing up a blobstorage, use the timestamp of the latest filestorage backup.\n If a blob backup with that name is already there, then there were no database changes,\n so we do not make a backup.\n This is only done when you use the new ``blob_timestamps = true`` option.\n [maurits]\n\n- When restoring to a specific date, find the first blob backup at or before\n the specified date. Otherwise fail. The repozo script does the same.\n We used to pick the first blob backup *after* the specified date,\n because we assumed that the user would specify the exact date that is\n in the filestorage backup.\n Note that the timestamp of the filestorage and blobstorage backups may be\n a few seconds apart, unless you use the ``blob_timestamps == true`` option.\n In the new situation, the user should pick the date of the blob backup\n or slightly later.\n [maurits]\n\n- Added ``blob_timestamps`` option. Default is false.\n By default we create ``blobstorage.0``.\n The next time, we rotate this to ``blobstorage.1`` and create a new ``blobstorage.0``.\n With ``blob_timestamps = true``, we create stable directories that we do not rotate.\n They get a timestamp, the same timestamp that the ZODB filestorage backup gets.\n For example: ``blobstorage.1972-12-25-01-02-03``.\n [maurits]\n\n- When restoring, first run checks for all filestorages and blobstorages.\n When one of the backups is missing, we quit with an error.\n This avoids restoring a filestorage and then getting into trouble\n due to a missing blobstorage backup. [maurits]\n\n\n3.1 (2017-02-24)\n================\n\n- Add a ``locationprefix`` option to configure a folder where all other\n backup and snapshot folders will be created [erral]\n\n- Only claim compatibility with Python 2.6 and 2.7. [maurits]\n\n- Updated test buildout to use most recent versions. [maurits]\n\n\n3.0.0 (2015-12-31)\n==================\n\n- Refactored the init and install methods of this recipe. During the\n init phase we were reading the buildout configuration, but during\n this phase the configuration is still being build. So differences\n could occur, especially in the order of execution of parts. This\n was not good. Most code is now moved from the init to the install\n (and update) method. This has less possible problems. Downside:\n some configuration errors are caught later.\n [maurits]\n\n- Read ``zeo-var``, ``var``, ``file-storage`` from buildout sections.\n Update default backup and Data.fs locations based on this.\n [maurits]\n\n\n2.22 (2015-12-30)\n=================\n\n- Do not accept ``backup_blobs`` false and ``enable_zipbackup`` true.\n The zipbackup script is useless without blobs.\n [maurits]\n\n- Set default ``backup_blobs`` to true on Python 2.6 (Plone 4) and\n higher. Otherwise false. If no ``blob_storage`` can be found, we\n quit with an error.\n [maurits]\n\n- Accept ``true``, ``yes``, ``on``, ``1``, in lower, upper or mixed\n case as true value. Treat all other values in the buildout options\n as false.\n [maurits]\n\n- Find plone.recipe.zope2instance recipes also when they are not\n completely lower case. The zope2instance recipe itself works fine\n when it has mixed case, so we should accept this too.\n [maurits]\n\n\n2.21 (2015-10-06)\n=================\n\n- When restoring, create ``var/filestorage`` if needed.\n Fixes #23.\n [maurits]\n\n\n2.20 (2014-11-11)\n=================\n\n- Add ``enable_fullbackup`` option. Default: true, so no change\n compared to previous version.\n [maurits]\n\n- Create backup/snapshot/zipbackup directories only when needed.\n Running the backup script should not create the snapshot\n directories.\n [maurits]\n\n- Add zipbackup and ziprestore scripts when ``enable_zipbackup = true``.\n [maurits]\n\n\n2.19 (2014-06-16)\n=================\n\n- Call repozo with ``--quick`` when making an incremental backup.\n This is a lot faster. Theoretically it lead to inconsistency if\n someone is messing in your backup directory. You can return to the\n previous behavior by specifying ``quick = false`` in the backup\n recipe part in your buildout config.\n [maurits]\n\n- check and create folders now happens after pre_commands is run\n [@djay]\n\n\n2.18 (2014-04-29)\n=================\n\n- Add ``rsync_options`` option. These are added to the default\n ``rsync -a`` command. Default is no extra parameters. This can be\n useful for example when you want to restore a backup from a\n symlinked directory, in which case ``rsync_options = --no-l -k``\n does the trick.\n [fiterbek]\n\n\n\n2.17 (2014-02-07)\n=================\n\n- Add ``alternative_restore_sources`` option. This creates a\n ``bin/altrestore`` script that restores from an alternative backup\n location, specified by that option. You can use this to restore a\n backup of the production data to your testing or staging server.\n [maurits]\n\n- When checking if the backup script will be able to create a path,\n remove all created directories. Until now, only the final directory\n was removed, and not any created parent directories.\n [maurits]\n\n- Testing: split the single big doctest file into multiple files, to\n make the automated tests less dependent on one another, making it\n easier to change them and add new ones.\n [maurits]\n\n- No longer test with Python 2.4, because Travis does not support it\n out of the box. Should still work fine.\n [maurits]\n\n\n2.16 (2014-01-14)\n=================\n\n- Do not create blob backup dirs when not backing up blobs.\n Do not create filestorage backup dirs when not backing up filestorage.\n Fixes https://github.com/collective/collective.recipe.backup/issues/17\n [maurits]\n\n\n2.15 (2013-09-16)\n=================\n\n- Restore compatibility with Python 2.4 (Plone 3).\n [maurits]\n\n\n2.14 (2013-09-09)\n=================\n\n- Archive blob backups with buildout option ``gzip_blob``.\n [matejc]\n\n\n2.13 (2013-07-15)\n=================\n\n- When printing that we halt the execution due to an error running\n repozo, actually halt the execution.\n [maurits]\n\n\n2.12 (2013-06-28)\n=================\n\n- Backup directories are now created when we launch ``backup`` or\n ``fullbackup`` or ``snapshotbackup`` scripts, no more during\n initialization.\n [bsuttor]\n\n\n2.11 (2013-05-06)\n=================\n\n- Print the names of filestorages and blobstorages that will be\n restored. Issue #8.\n [maurits]\n\n- Added a new command-line argument : ``--no-prompt`` disables user\n input when restoring a backup or snapshot. Useful for shell scripts.\n [bouchardsyl]\n\n- Fixed command-line behavior with many arguments and not only a date.\n [bouchardsyl]\n\n\n2.10 (2013-03-30)\n=================\n\n- Added ``fullbackup`` script that defaults to ``full=true``. This\n could have been handled by making a new part, but it seemed like\n overkill to have to generate a complete new set of backup scripts,\n just to get one for full.\n [spanky]\n\n\n2.9 (2013-03-06)\n================\n\n- Fixed possible KeyError: ``blob_snapshot_location``.\n [gforcada]\n\n\n\n2.8 (2012-11-13)\n================\n\n- Fixed possible KeyError: ``blob_backup_location``.\n https://github.com/collective/collective.recipe.backup/issues/3\n [maurits]\n\n\n2.7 (2012-09-27)\n================\n\n- additional_filestorages improved: blob support and custom location.\n [mamico]\n\n\n2.6 (2012-08-29)\n================\n\n- Added pre_command and post_command options. See the documentation.\n [maurits]\n\n\n2.5 (2012-08-08)\n================\n\n- Moved code to github:\n https://github.com/collective/collective.recipe.backup\n [maurits]\n\n\n2.4 (2011-12-20)\n================\n\n- Fixed silly indentation error that prevented old blob backups from\n being deleted when older than ``keep_blob_days`` days.\n [maurits]\n\n\n2.3 (2011-10-05)\n================\n\n- Quit the rest of the backup or restore when a repozo call gives an\n error. Main use case: when restoring to a specific date repozo will\n quit with an error when no files can be found, so we should also not\n try to restore blobs then.\n [maurits]\n\n- Allow restoring the blobs to the specified date as well.\n [maurits]\n\n\n2.2 (2011-09-14)\n================\n\n- Refactored script generation to make a split between initialization\n code and script arguments. This restores compatibility with\n zc.buildout 1.5 for system pythons. Actually we no longer create so\n called 'site package safe scripts' but just normal scripts that work\n for all zc.buildout versions.\n [maurits]\n\n- Added option ``keep_blob_days``, which by default specifies that\n only for partial backups we keep 14 days of backups. See the\n documentation.\n [maurits]\n\n- Remove old blob backups when doing a snapshot backup.\n [maurits]\n\n\n2.1 (2011-09-01)\n================\n\n- Raise an error when the four backup location options\n (blobbackuplocation, blobsnapshotlocation, location and\n snapshotlocation) are not four distinct locations (or empty\n strings).\n [maurits]\n\n- Fixed possible TypeError: 'Option values must be strings'.\n Found by Alex Clark, thanks.\n [maurits]\n\n\n2.0 (2011-08-26)\n================\n\n- Backup and restore blobs, using rsync.\n [maurits]\n\n- Ask if the user is sure before doing a restore.\n [maurits]\n\n\n1.7 (2010-12-10)\n================\n\n- Fix generated repozo commands to work also\n when recipe is configured to have a non **Data.fs**\n main db plus additional filestorages.\n e.g.:\n datafs= var/filestorage/main.fs\n additional = catalog\n [hplocher]\n\n\n1.6 (2010-09-21)\n================\n\n- Added the option enable_snapshotrestore so that the creation of the\n script can be removed. Backwards compatible, if you don't specify it\n the script will still be created. Rationale: you may not want this\n script in a production buildout where mistakenly using\n snapshotrestore instead of snapshotbackup could hurt.\n [fredvd]\n\n\n1.5 (2010-09-08)\n================\n\n- Fix: when running buildout with a config in a separate directory\n (like ``bin/buildout -c conf/prod.cfg``) the default backup\n directories are no longer created inside that separate directory.\n If you previously manually specified one of the location,\n snapshotlocation, or datafs parameters to work around this, you can\n probably remove those lines. So: slightly saner defaults.\n [maurits]\n\n\n1.4 (2010-08-06)\n================\n\n- Added documentation about how to get the required bin/repozo script\n in your buildout if for some reason you do not have it yet (like on\n Plone 4 when you do not have a zeo setup).\n Thanks to Vincent Fretin for the extra buildout lines.\n [maurits]\n\n\n1.3 (2009-12-08)\n================\n\n- Added snapshotrestore script. [Nejc Zupan]\n\n\n1.2 (2009-10-26)\n================\n\n- The part name is now reflected in the created scripts and var/ directories.\n Originally bin/backup, bin/snapshotbackup, bin/restore and var/backups\n plus var/snapshotbackups were hardcoded. Those are still there when you\n name your part ``[backup]``. With a part named ``[NAME]``, you get\n bin/NAME, bin/NAME-snapshot, bin/NAME-restore and var/NAMEs plus\n var/NAME-snapshots. Request by aclark for plone.org. [reinout]\n\n\n1.1 (2009-08-21)\n================\n\n- Run the cleanup script (removing too old backups that we no longer\n want to keep) for additional file storages as well.\n Fixes https://bugs.launchpad.net/collective.buildout/+bug/408224\n [maurits]\n\n- Moved everything into a src/ subdirectory to ease testing on buildbot (which\n would grab all egss in the eggs/ dir that buildbot's mechanism creates.\n [reinout]\n\n\n1.0 (2009-02-06)\n================\n\n- Quote all paths and arguments so that it works on paths that contain\n spaces (specially on Windows). [sidnei]\n\n\n0.9 (2008-12-05)\n================\n\n- Windows path compatibility fix. [Juan A. Diaz]\n\n\n0.8 (2008-09-23)\n================\n\n- Changed the default for gzipping to True. Adding ``gzip = true`` to all our\n server deployment configs gets tired pretty quickly, so doing it by default\n is the best default. Stuff like this needs to be changed **before** a 1.0\n release :-) [reinout]\n\n- Backup of additional databases (if you have configured them) now takes place\n before the backup of the main database (same with restore). [reinout]\n\n\n0.7 (2008-09-19)\n================\n\n- Added $BACKUP-style enviroment variable subsitution in addition to the tilde\n expansion offered by 0.6. [reinout, idea by Fred van Dijk]\n\n\n0.6 (2008-09-19)\n================\n\n- Fixed the test setup so both bin/test and python setup.py test\n work. [reinout+maurits]\n\n- Added support for ~ in path names. And fixed a bug at the same time that\n would occur if you call the backup script from a different location than\n your buildout directory in combination with a non-absolute backup\n location. [reinout]\n\n\n0.5 (2008-09-18)\n================\n\n- Added support for additional_filestorages option, needed for for instance a\n split-out catalog.fs. [reinout]\n\n- Test setup fixes. [reinout+maurits]\n\n\n0.4 (2008-08-19)\n================\n\n- Allowed the user to make the script more quiet (say in a cronjob)\n by using 'bin/backup -q' (or --quiet). [maurits]\n\n- Refactored initialization template so it is easier to change. [maurits]\n\n\n0.3.1 (2008-07-04)\n==================\n\n- Added 'gzip' option, including changes to the cleanup functionality that\n treats .fsz also as a full backup like .fs. [reinout]\n\n- Fixed typo: repoze is now repozo everywhere... [reinout]\n\n\n0.2 (2008-07-03)\n================\n\n- Extra tests and documentation change for 'keep': the default is to keep 2\n backups instead of all backups. [reinout]\n\n- If debug=true, then repozo is also run in --verbose mode. [reinout]\n\n\n0.1 (2008-07-03)\n================\n\n- Added bin/restore. [reinout]\n\n- Added snapshot backups. [reinout]\n\n- Enabled cleaning up of older backups. [reinout]\n\n- First working version that runs repozo and that creates a backup dir if\n needed. [reinout]\n\n- Started project based on zopeskel template. [reinout]\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/collective/collective.recipe.backup", "keywords": "buildout backup repozo zope", "license": "GPL", "maintainer": "", "maintainer_email": "", "name": "collective.recipe.backup", "package_url": "https://pypi.org/project/collective.recipe.backup/", "platform": "", "project_url": "https://pypi.org/project/collective.recipe.backup/", "project_urls": { "Homepage": "https://github.com/collective/collective.recipe.backup" }, "release_url": "https://pypi.org/project/collective.recipe.backup/4.1.1/", "requires_dist": [ "zc.buildout", "setuptools", "zc.recipe.egg", "zope.testing ; extra == 'tests'", "zc.buildout[test] ; extra == 'tests'", "zc.recipe.egg ; extra == 'tests'" ], "requires_python": "", "summary": "bin/backup script: sensible defaults around bin/repozo", "version": "4.1.1" }, "last_serial": 5937756, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "8ee5e6d435bc586bc67ae56fc0b0d12f", "sha256": "3686bf7078b5d5897d6f3152756d4e15827909a48331c8c88ab499db216b9f50" }, "downloads": -1, "filename": "collective.recipe.backup-0.1.tar.gz", "has_sig": false, "md5_digest": "8ee5e6d435bc586bc67ae56fc0b0d12f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10010, "upload_time": "2008-07-03T14:03:21", "url": "https://files.pythonhosted.org/packages/17/8f/dfbf3b731cf85e339a9f6c4d415d85a4f7ba42cb84283c6b61760a02b8dc/collective.recipe.backup-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "5721e281778e0f0a3dbc7eecc84b7e0c", "sha256": "c5318a393acd0aa62efc0ce03e31466c2df03fe31b1cb34da317b3cce854b057" }, "downloads": -1, "filename": "collective.recipe.backup-0.2.tar.gz", "has_sig": false, "md5_digest": "5721e281778e0f0a3dbc7eecc84b7e0c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10284, "upload_time": "2008-07-03T15:56:36", "url": "https://files.pythonhosted.org/packages/8f/62/00d2162775adaaab067170f27560ae447c19fa000d720c24beca8828fbf2/collective.recipe.backup-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "69a38d058271999a8ce95064c4a01beb", "sha256": "28e4ddbb545e888ceced70ab1b1e82e9bee04e6043bfcbcd067fac335b8b5cdb" }, "downloads": -1, "filename": "collective.recipe.backup-0.3.tar.gz", "has_sig": false, "md5_digest": "69a38d058271999a8ce95064c4a01beb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10839, "upload_time": "2008-07-04T09:34:53", "url": "https://files.pythonhosted.org/packages/77/07/a7dc76f48aa6e549acf81d08df178ce6c77e01a0e4eb744b312c864c375b/collective.recipe.backup-0.3.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "447edf18767893b28f9de8c84f09e2a2", "sha256": "1e8e08bc5015f4e2be1a713ab32ef4e8695dd0f4d62f816cfabdee15feae595e" }, "downloads": -1, "filename": "collective.recipe.backup-0.3.1.tar.gz", "has_sig": false, "md5_digest": "447edf18767893b28f9de8c84f09e2a2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10889, "upload_time": "2008-07-04T09:38:45", "url": "https://files.pythonhosted.org/packages/8e/b4/3cb40a9a6ff2ab741b5501a306264f015562a11c5ac221cbac6843b5f49c/collective.recipe.backup-0.3.1.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "1bd85bcc5fc5c3dc5356b5d7f1f121e4", "sha256": "00449f4d5cdaa64919e81d790aad3da67f1730fee39598b7ebbe2a6ee8327a38" }, "downloads": -1, "filename": "collective.recipe.backup-0.4.tar.gz", "has_sig": false, "md5_digest": "1bd85bcc5fc5c3dc5356b5d7f1f121e4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12493, "upload_time": "2008-08-19T19:18:55", "url": "https://files.pythonhosted.org/packages/91/01/0096b9b66e0d173b4f0c30eddd77254b7fd965440d858033b93c99fcd63f/collective.recipe.backup-0.4.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "143f927fe2ece7da12d4aed47eb00229", "sha256": "c3a77edf8f77be194e846da6fb0fb5cf23231733464a310118151ac99f357e73" }, "downloads": -1, "filename": "collective.recipe.backup-0.5.tar.gz", "has_sig": false, "md5_digest": "143f927fe2ece7da12d4aed47eb00229", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13644, "upload_time": "2008-09-18T18:03:09", "url": "https://files.pythonhosted.org/packages/7a/b4/3edda39d0ea858167d55814c1a89db542dca1b604523cf04ee0a924cadef/collective.recipe.backup-0.5.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "6e995602eff04ae4989a69f090c55c93", "sha256": "b52551ae27b61c7529791b3aca71038eacf7180e8d85b901cfedcbe3f367e2fd" }, "downloads": -1, "filename": "collective.recipe.backup-0.6.tar.gz", "has_sig": false, "md5_digest": "6e995602eff04ae4989a69f090c55c93", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14595, "upload_time": "2008-09-19T13:42:00", "url": "https://files.pythonhosted.org/packages/9b/08/9c1b7ecc0e2ca724a8390468ddd06e3c3180c4936eec2ee8c1d88bfc0923/collective.recipe.backup-0.6.tar.gz" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "2fa2a1103c9be369e5165cb942be8eb8", "sha256": "fc511511528407099202c5eab815cacc5ae283ade046e0d642587570e06fc7e0" }, "downloads": -1, "filename": "collective.recipe.backup-0.7.tar.gz", "has_sig": false, "md5_digest": "2fa2a1103c9be369e5165cb942be8eb8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14873, "upload_time": "2008-09-19T14:01:55", "url": "https://files.pythonhosted.org/packages/5b/a1/cf1e8df6bfbff7eeb644b7fb2bcc57be1a6ce3dfd431b79338b45e56d173/collective.recipe.backup-0.7.tar.gz" } ], "0.8": [ { "comment_text": "", "digests": { "md5": "4b864bcdc8baa6b9788c0834b04bf078", "sha256": "ce577707f794bbe0f5c12d6a7c8e479ed5736cd76cf9e9b87f4a9dc9c5ba6624" }, "downloads": -1, "filename": "collective.recipe.backup-0.8.tar.gz", "has_sig": false, "md5_digest": "4b864bcdc8baa6b9788c0834b04bf078", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15797, "upload_time": "2008-09-23T09:21:44", "url": "https://files.pythonhosted.org/packages/b5/fd/07cfb399ebf0d24a524a78ef53e6985b766e728864f408200e695ac3830b/collective.recipe.backup-0.8.tar.gz" } ], "0.9": [ { "comment_text": "", "digests": { "md5": "14d11eb4e7abcfc8eb486137fa5e2860", "sha256": "ef00ab6e99a81ea73736c014df9ad80c754a384f6ee3dcb8c1c6d0aa9dcdd3a4" }, "downloads": -1, "filename": "collective.recipe.backup-0.9.tar.gz", "has_sig": false, "md5_digest": "14d11eb4e7abcfc8eb486137fa5e2860", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15803, "upload_time": "2008-12-05T14:49:43", "url": "https://files.pythonhosted.org/packages/09/da/d47043bc4b7cc5e0f7a79991a0a935a96ed9ac3f1725998ac67e203ba606/collective.recipe.backup-0.9.tar.gz" } ], "1.0": [ { "comment_text": "", "digests": { "md5": "b10773da3866a44abeca259a40863722", "sha256": "4a6543391150293d406f2b65696239577757d42dc3e916ab81c2b22b9c8be25e" }, "downloads": -1, "filename": "collective.recipe.backup-1.0.tar.gz", "has_sig": false, "md5_digest": "b10773da3866a44abeca259a40863722", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16172, "upload_time": "2009-02-06T14:04:25", "url": "https://files.pythonhosted.org/packages/52/5f/f151b0d7dfc02653ef7bf51a75292a4309c9cbf38087aacf0e1da926a3b0/collective.recipe.backup-1.0.tar.gz" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "1077358d276c15442e5638a5d3fe7439", "sha256": "b70d73aa36e18ea56258bcd02e696a3af76c24fb039867584f622740bf4d7caa" }, "downloads": -1, "filename": "collective.recipe.backup-1.1.tar.gz", "has_sig": false, "md5_digest": "1077358d276c15442e5638a5d3fe7439", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17745, "upload_time": "2009-08-21T15:17:34", "url": "https://files.pythonhosted.org/packages/a5/d7/251bfcfce4ac7fbba210bc617a2c03b0f31183ce1bf77fcebe2031deb8ea/collective.recipe.backup-1.1.tar.gz" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "89121e658cc413e406f1723e9bed0aa0", "sha256": "0223b79b53998da428768a9ffb625049595c59303e2a755047f0a47026c86537" }, "downloads": -1, "filename": "collective.recipe.backup-1.2.tar.gz", "has_sig": false, "md5_digest": "89121e658cc413e406f1723e9bed0aa0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23190, "upload_time": "2009-10-26T11:41:36", "url": "https://files.pythonhosted.org/packages/fe/6e/213c83983e087899f0cf9df2eb289324b83119ed2d2b2d6ba7648953b125/collective.recipe.backup-1.2.tar.gz" } ], "1.3": [ { "comment_text": "", "digests": { "md5": "3882f23beabf2eddd96e5ff60b69e86d", "sha256": "b295bac5b46d6c2514569e47649699201dd999cba5d7c24f445b1b5112b06d36" }, "downloads": -1, "filename": "collective.recipe.backup-1.3.tar.gz", "has_sig": false, "md5_digest": "3882f23beabf2eddd96e5ff60b69e86d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23661, "upload_time": "2009-12-08T17:24:34", "url": "https://files.pythonhosted.org/packages/9e/c5/b9de41c9005259dc141ffc4165a05ab590a8c4a71758dfdd23dc38aa43bd/collective.recipe.backup-1.3.tar.gz" } ], "1.4": [ { "comment_text": "", "digests": { "md5": "3c43666a35da3459d89618e90aa3c357", "sha256": "d26dc18de604a39743d06defd652525d9fb206e1d7caac6e52404eba68a7c969" }, "downloads": -1, "filename": "collective.recipe.backup-1.4.zip", "has_sig": false, "md5_digest": "3c43666a35da3459d89618e90aa3c357", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33431, "upload_time": "2010-08-06T16:31:37", "url": "https://files.pythonhosted.org/packages/e3/59/4c5b3283abaf10c53605ed3768baa8425847f82a14bf94c380f38a663b1f/collective.recipe.backup-1.4.zip" } ], "1.5": [ { "comment_text": "", "digests": { "md5": "4aab35a4aafe2adc79f401cf50da1e46", "sha256": "f57f6ad9e29db8ca2cfce46b444e38c7ab88b9784a523c5ecc68e65a177c445a" }, "downloads": -1, "filename": "collective.recipe.backup-1.5.zip", "has_sig": false, "md5_digest": "4aab35a4aafe2adc79f401cf50da1e46", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34582, "upload_time": "2010-09-08T17:30:01", "url": "https://files.pythonhosted.org/packages/81/00/27f09278ee7fafbd76d777312c64497f1ed6450d04578a70a250fe07d305/collective.recipe.backup-1.5.zip" } ], "1.6": [ { "comment_text": "", "digests": { "md5": "e0a9bb66ff74e233bc6d4ec3b76a4167", "sha256": "d8378931a2f2690ec4cfef09620c38effe2321ad2ca3cc75ddddda704a825a62" }, "downloads": -1, "filename": "collective.recipe.backup-1.6.zip", "has_sig": false, "md5_digest": "e0a9bb66ff74e233bc6d4ec3b76a4167", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35683, "upload_time": "2010-09-21T23:13:37", "url": "https://files.pythonhosted.org/packages/65/49/c86653b6ffb57f0067a361bbfa7dcb7c94b70bc29106404591beefdb4603/collective.recipe.backup-1.6.zip" } ], "1.7": [ { "comment_text": "", "digests": { "md5": "a291cbb9f4d14b6e622da885d2cc0113", "sha256": "a40c841bdeb52bfa168eddf17d7cddfb57581c9996adf187642e834dbd5902e0" }, "downloads": -1, "filename": "collective.recipe.backup-1.7.zip", "has_sig": false, "md5_digest": "a291cbb9f4d14b6e622da885d2cc0113", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35987, "upload_time": "2010-12-10T13:42:07", "url": "https://files.pythonhosted.org/packages/5a/8b/21fd6f44466b0d8439f75bb933eac3cd7c180eccfdbea8c9030fa35f4b04/collective.recipe.backup-1.7.zip" } ], "2.0": [ { "comment_text": "", "digests": { "md5": "0e1c411414e7c15515cb5ca2ba245bc3", "sha256": "644b1b69c2b1213e3e4f8a69d8d9db08e3085a4ba63bce59ca6264cb3601054b" }, "downloads": -1, "filename": "collective.recipe.backup-2.0.zip", "has_sig": false, "md5_digest": "0e1c411414e7c15515cb5ca2ba245bc3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53496, "upload_time": "2011-08-26T01:02:14", "url": "https://files.pythonhosted.org/packages/fa/d0/417402349eed4f3cf7f121c86097b758a857de986fe681e7d1d24328fd33/collective.recipe.backup-2.0.zip" } ], "2.1": [ { "comment_text": "", "digests": { "md5": "fa4f7fe2fe132d5aa9a10b2fd1fd02aa", "sha256": "6545a67f0a1ff570fe7548727789cb7e85855269c53507a80adc2343bce744cb" }, "downloads": -1, "filename": "collective.recipe.backup-2.1.zip", "has_sig": false, "md5_digest": "fa4f7fe2fe132d5aa9a10b2fd1fd02aa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 54374, "upload_time": "2011-09-01T00:09:06", "url": "https://files.pythonhosted.org/packages/f6/5b/c90d05e7c2186fe98c171c7c1f19d678c3822272ada8066ef7387ec575f7/collective.recipe.backup-2.1.zip" } ], "2.10": [ { "comment_text": "", "digests": { "md5": "034f62fe7b43c888809b09ac70ec8ee4", "sha256": "3ecd8a9f2be91093330c34cc5946e31d2597f20256d9bb2eaade9238cb7897b5" }, "downloads": -1, "filename": "collective.recipe.backup-2.10.zip", "has_sig": false, "md5_digest": "034f62fe7b43c888809b09ac70ec8ee4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 64825, "upload_time": "2013-03-30T21:30:21", "url": "https://files.pythonhosted.org/packages/ac/9d/8400911795a65ee98f5c0fea90aa7f12bf9b59248013de8812c15a46d875/collective.recipe.backup-2.10.zip" } ], "2.11": [ { "comment_text": "", "digests": { "md5": "66b62c2a9e41f0ccc23c874af6a69f1e", "sha256": "c5d1b4d694c9d14c7b8d2009be001db89dec747c367ac73170ede7dad162ee94" }, "downloads": -1, "filename": "collective.recipe.backup-2.11.zip", "has_sig": false, "md5_digest": "66b62c2a9e41f0ccc23c874af6a69f1e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 65582, "upload_time": "2013-05-06T09:51:14", "url": "https://files.pythonhosted.org/packages/d4/7d/4e4ac0b4d6b7ac09fdebcee620b2a349b5b598e93e68c99ac6ce1909056c/collective.recipe.backup-2.11.zip" } ], "2.12": [ { "comment_text": "", "digests": { "md5": "dc41913716f25d6af3dee79901a62766", "sha256": "4bb900514e158d6156c75fb97dfa2b0002bd0c18548424ccd3266731ecce80bc" }, "downloads": -1, "filename": "collective.recipe.backup-2.12.zip", "has_sig": false, "md5_digest": "dc41913716f25d6af3dee79901a62766", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 66153, "upload_time": "2013-06-28T13:44:20", "url": "https://files.pythonhosted.org/packages/4a/7a/a5d3900baa40f3e4193f01e97d0bc0414b9d6394479102f601fb563c5827/collective.recipe.backup-2.12.zip" } ], "2.13": [ { "comment_text": "", "digests": { "md5": "fb0fed3c64abe4bd0b01110b13752fc7", "sha256": "c01da61e6031d453a8d69b380f208cfb4f0365cf01c3475d3eef7cb49c92e67c" }, "downloads": -1, "filename": "collective.recipe.backup-2.13.zip", "has_sig": false, "md5_digest": "fb0fed3c64abe4bd0b01110b13752fc7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 66305, "upload_time": "2013-07-15T09:51:57", "url": "https://files.pythonhosted.org/packages/5d/4a/33dab25a150449037200ba983987b6731001613da5e654ba58a9b01085d0/collective.recipe.backup-2.13.zip" } ], "2.14": [ { "comment_text": "", "digests": { "md5": "83c97a1f17d59cd9b1d63d2054fa12dd", "sha256": "753212ca39f651079d79580ad1ca4bb54d6cdc9f8b6d25472aad194cc586a809" }, "downloads": -1, "filename": "collective.recipe.backup-2.14.zip", "has_sig": false, "md5_digest": "83c97a1f17d59cd9b1d63d2054fa12dd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 68730, "upload_time": "2013-09-09T10:03:19", "url": "https://files.pythonhosted.org/packages/e0/67/8604c32a14e6f8c38c0d667846a1ccce17a35b860dad24bf291bdf3c4e3b/collective.recipe.backup-2.14.zip" } ], "2.15": [ { "comment_text": "", "digests": { "md5": "43d088c072095a19bdc5e3f1f6b4f421", "sha256": "0ea088788b6bc4811592d2c1a4adf3d990c477ef3561fab53d34fc7be32db18f" }, "downloads": -1, "filename": "collective.recipe.backup-2.15.zip", "has_sig": false, "md5_digest": "43d088c072095a19bdc5e3f1f6b4f421", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 68893, "upload_time": "2013-09-16T15:01:48", "url": "https://files.pythonhosted.org/packages/75/0c/e1a22dbe6a3be49776c8ddee25e57e981a582c36037f61c611d30c480c3b/collective.recipe.backup-2.15.zip" } ], "2.16": [ { "comment_text": "", "digests": { "md5": "2cd7621932db346d05da214f1271d772", "sha256": "83ab68c71d34649a3801ce2ed312ffd36ff36a28366256a4b6cfd0b53b0fb455" }, "downloads": -1, "filename": "collective.recipe.backup-2.16.zip", "has_sig": false, "md5_digest": "2cd7621932db346d05da214f1271d772", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 68915, "upload_time": "2014-01-14T11:51:46", "url": "https://files.pythonhosted.org/packages/31/b3/0e71078e95abda6ecfe14b8374fff88126d3a4d80c6bb9e1bc95a6139cdb/collective.recipe.backup-2.16.zip" } ], "2.17": [ { "comment_text": "", "digests": { "md5": "c12b543d71603b3eecc27ae1b949eb3e", "sha256": "99cbf140019097a972025d2238700fa63e5cf3c2e09723ea02bba5a5bf5762f3" }, "downloads": -1, "filename": "collective.recipe.backup-2.17.zip", "has_sig": false, "md5_digest": "c12b543d71603b3eecc27ae1b949eb3e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 79306, "upload_time": "2014-02-07T17:57:46", "url": "https://files.pythonhosted.org/packages/f0/88/95415cd3869659be5d3e33a16a756714855f6fcf69ed8ac0f36bcf899157/collective.recipe.backup-2.17.zip" } ], "2.18": [ { "comment_text": "", "digests": { "md5": "206b220983aa80fb814f37967d426ce6", "sha256": "82deb208f3dd6f2c6278de65316766a607886a5b3426d77380b1d2267023e1b9" }, "downloads": -1, "filename": "collective.recipe.backup-2.18.zip", "has_sig": false, "md5_digest": "206b220983aa80fb814f37967d426ce6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 80605, "upload_time": "2014-04-29T08:14:38", "url": "https://files.pythonhosted.org/packages/8f/dc/a586e8303196d187794f6765bf2442600c0eb361da57170b32dcda0375f2/collective.recipe.backup-2.18.zip" } ], "2.19": [ { "comment_text": "", "digests": { "md5": "85f9431c6453ba3d902deeb4680dddb7", "sha256": "f53b24fcac12e0be14683fad14677ceaef11e5baac3114f732a80cc729679c18" }, "downloads": -1, "filename": "collective.recipe.backup-2.19.zip", "has_sig": false, "md5_digest": "85f9431c6453ba3d902deeb4680dddb7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 82748, "upload_time": "2014-06-16T21:24:19", "url": "https://files.pythonhosted.org/packages/bd/49/e0c7c66f320cdfd78a668ef7537a879bc291d7c85c1f28e105daa17d9f14/collective.recipe.backup-2.19.zip" } ], "2.2": [ { "comment_text": "", "digests": { "md5": "9b096fa03e93197e8a2641129a5f834a", "sha256": "fdd96ce80ce67b5c02eb13e10b748e2788969fb335f1b96fb90315d68587bcc3" }, "downloads": -1, "filename": "collective.recipe.backup-2.2.zip", "has_sig": false, "md5_digest": "9b096fa03e93197e8a2641129a5f834a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 58717, "upload_time": "2011-09-14T01:33:30", "url": "https://files.pythonhosted.org/packages/f4/b6/c4b7abd3c3bd6d9221fe84079dd7a23c2c6062f8ef538637201506f15db6/collective.recipe.backup-2.2.zip" } ], "2.20": [ { "comment_text": "", "digests": { "md5": "0041655bfce723802744870cfdbf7c54", "sha256": "6a224012d048879fa90a6fda7e5ec71b4ee36bb9d8391ea49ebaab246fed442d" }, "downloads": -1, "filename": "collective.recipe.backup-2.20.zip", "has_sig": false, "md5_digest": "0041655bfce723802744870cfdbf7c54", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 87521, "upload_time": "2014-11-11T14:06:09", "url": "https://files.pythonhosted.org/packages/21/08/412c800417eff2edb01132893a8ab77793a430e4e4967f71a86c82980959/collective.recipe.backup-2.20.zip" } ], "2.21": [ { "comment_text": "", "digests": { "md5": "8ce1aae38689ee1c7c4e9bb97a487287", "sha256": "c48513c0560d4697b3bb4ce3635c1a37a8c5c7d76255c98b4e02a43a00d34aca" }, "downloads": -1, "filename": "collective.recipe.backup-2.21.tar.gz", "has_sig": false, "md5_digest": "8ce1aae38689ee1c7c4e9bb97a487287", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 71760, "upload_time": "2015-10-06T12:59:28", "url": "https://files.pythonhosted.org/packages/d1/29/9ea751b3a3442b10f06bb781c1b5e7491f31709a7e2077bf527af53eb910/collective.recipe.backup-2.21.tar.gz" } ], "2.22": [ { "comment_text": "", "digests": { "md5": "ba4006753e54fc62db3b716f629ebb89", "sha256": "cd737b81bc63f24cb2a584efe808afda824779343a49327dd559c8b088969e53" }, "downloads": -1, "filename": "collective.recipe.backup-2.22.tar.gz", "has_sig": false, "md5_digest": "ba4006753e54fc62db3b716f629ebb89", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 73758, "upload_time": "2015-12-30T13:27:53", "url": "https://files.pythonhosted.org/packages/6e/33/81e6d00d61be334360b4f26561ed10f26f877275105e69160d73dd56a3b2/collective.recipe.backup-2.22.tar.gz" } ], "2.3": [ { "comment_text": "", "digests": { "md5": "b08a4bb34fa06f0b987384cf03fb9873", "sha256": "22c2b0a80a89cf7d9207f4d239057c91b4f75a56ffb9a00836efd1d275c9a038" }, "downloads": -1, "filename": "collective.recipe.backup-2.3.zip", "has_sig": false, "md5_digest": "b08a4bb34fa06f0b987384cf03fb9873", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 60240, "upload_time": "2011-10-05T18:00:43", "url": "https://files.pythonhosted.org/packages/c0/d5/09ab6fa6bb8531509e19f8f59a57801f2feb8a26d8e40204093237ee4fa6/collective.recipe.backup-2.3.zip" } ], "2.4": [ { "comment_text": "", "digests": { "md5": "5bd07820f8369b30119a9f2faf9c03c1", "sha256": "33c4a06268a5be0ec90a9c9849dd6fdab42aa737fa5bf0695873ecb17bdcd9d2" }, "downloads": -1, "filename": "collective.recipe.backup-2.4.tar.gz", "has_sig": false, "md5_digest": "5bd07820f8369b30119a9f2faf9c03c1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41761, "upload_time": "2011-12-20T16:27:59", "url": "https://files.pythonhosted.org/packages/6d/71/22b6586b9be4f10f87f43a1118b5abc1d3cb941019a9f831094bbe2ce31e/collective.recipe.backup-2.4.tar.gz" } ], "2.5": [ { "comment_text": "", "digests": { "md5": "4d1d64dff48a2ae53256260393c8784f", "sha256": "fe3ff492e8ad85e9ab076b83fbfbf9a052943574a939647dd0877cf609952076" }, "downloads": -1, "filename": "collective.recipe.backup-2.5.zip", "has_sig": false, "md5_digest": "4d1d64dff48a2ae53256260393c8784f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 61151, "upload_time": "2012-08-08T12:43:40", "url": "https://files.pythonhosted.org/packages/ee/71/a6d79ad2b6be74c31fb7a3b93b1dc15e6831b9332632a63a7f49e2aa9b48/collective.recipe.backup-2.5.zip" } ], "2.6": [ { "comment_text": "", "digests": { "md5": "aec648ce41cbd4b2147e1f23bbabfe71", "sha256": "fa6f16a1175c7cb35865cf9077bc63347837dba305a6426a285acb38e22e3918" }, "downloads": -1, "filename": "collective.recipe.backup-2.6.zip", "has_sig": false, "md5_digest": "aec648ce41cbd4b2147e1f23bbabfe71", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 62623, "upload_time": "2012-08-29T15:36:17", "url": "https://files.pythonhosted.org/packages/90/50/7bf51da65335ae3c59ab8d6fae3a5486d41e0b7eccd4afe4e282e60e3792/collective.recipe.backup-2.6.zip" } ], "2.7": [ { "comment_text": "", "digests": { "md5": "00a966d81ad59f50a63c38e07dbd563d", "sha256": "0e34a9a361115b376bdab80d047a0770320f495aea8b4eca47869617606ab1b3" }, "downloads": -1, "filename": "collective.recipe.backup-2.7.zip", "has_sig": false, "md5_digest": "00a966d81ad59f50a63c38e07dbd563d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 65667, "upload_time": "2012-09-27T10:51:53", "url": "https://files.pythonhosted.org/packages/b0/3a/c238ad38957f5e67cf1e5765e6bde6ecd14b7835987294a87698529baed1/collective.recipe.backup-2.7.zip" } ], "2.8": [ { "comment_text": "", "digests": { "md5": "af36c28bf7a2495a3a1e9cec21b1a55c", "sha256": "be707a551bcc147bbb1fbec838e1f1b4b379c03e8ab2d7f1e6612c59365978a8" }, "downloads": -1, "filename": "collective.recipe.backup-2.8.zip", "has_sig": false, "md5_digest": "af36c28bf7a2495a3a1e9cec21b1a55c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 65776, "upload_time": "2012-11-13T08:53:54", "url": "https://files.pythonhosted.org/packages/8c/a1/d3c9b13c693216abd9052cf2aa4c4c77bbfde60d9704cd4d35152345c762/collective.recipe.backup-2.8.zip" } ], "2.9": [ { "comment_text": "", "digests": { "md5": "64991eb3183696188dcff51c4deec57b", "sha256": "295bc6818b0607903cec696f3a4e4b0c5c977d0b88ac944b945ee4a40b42c224" }, "downloads": -1, "filename": "collective.recipe.backup-2.9.zip", "has_sig": false, "md5_digest": "64991eb3183696188dcff51c4deec57b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 68774, "upload_time": "2013-03-06T15:23:01", "url": "https://files.pythonhosted.org/packages/92/be/81ad4400a58322a248690afdc9ca22cd2636b02057abaa25a8cb8f03950f/collective.recipe.backup-2.9.zip" } ], "3.0.0": [ { "comment_text": "", "digests": { "md5": "e3b4634f61e35a757c2968b1983e53c9", "sha256": "af812370abb803eeb07b84b65e25b981fe9eadb2d598ccb263bf07c1d4b0c8af" }, "downloads": -1, "filename": "collective.recipe.backup-3.0.0.tar.gz", "has_sig": false, "md5_digest": "e3b4634f61e35a757c2968b1983e53c9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 75061, "upload_time": "2015-12-31T01:20:35", "url": "https://files.pythonhosted.org/packages/c7/5b/51ec8b3126bfbb4a65035aef8b9de356234f48555321fc93a02911daa935/collective.recipe.backup-3.0.0.tar.gz" } ], "3.1": [ { "comment_text": "", "digests": { "md5": "dcd7892d0e4ec77233ab5c46e380b284", "sha256": "ef54764b56e0b26f27013504c1e07fccb5028ec0dc0cd79063c64e5043930d2e" }, "downloads": -1, "filename": "collective.recipe.backup-3.1.tar.gz", "has_sig": false, "md5_digest": "dcd7892d0e4ec77233ab5c46e380b284", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 76739, "upload_time": "2017-02-24T14:48:39", "url": "https://files.pythonhosted.org/packages/a0/61/af999dcd3375e18c3c3cd74588655da95199b5424eaee79399966769e6e4/collective.recipe.backup-3.1.tar.gz" } ], "4.0": [ { "comment_text": "", "digests": { "md5": "794745a382b8973a7eaf088f114c2889", "sha256": "a5ce6eed4576e4a4afc458a8df4f7b2472b440b066d70c0801a164998c72160a" }, "downloads": -1, "filename": "collective.recipe.backup-4.0-py2-none-any.whl", "has_sig": false, "md5_digest": "794745a382b8973a7eaf088f114c2889", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 104017, "upload_time": "2017-12-22T17:51:46", "url": "https://files.pythonhosted.org/packages/1a/00/248eb51ab9e62ff7c2cd7ce956d7a920a5c805fc88f16f7a997a62298b70/collective.recipe.backup-4.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0e18322eda8a5636b1dbd9f2a27a310f", "sha256": "f3ff328e9e7c87dbbf866d257fe18ec7dd94597a17dbe82f180737f5a198a63d" }, "downloads": -1, "filename": "collective.recipe.backup-4.0.tar.gz", "has_sig": false, "md5_digest": "0e18322eda8a5636b1dbd9f2a27a310f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 103216, "upload_time": "2017-12-22T17:50:07", "url": "https://files.pythonhosted.org/packages/76/66/9b37ea2616e2cdcd5a94fd9e55029ee06244152f71506e870c94ea50b0a3/collective.recipe.backup-4.0.tar.gz" } ], "4.0.1": [ { "comment_text": "", "digests": { "md5": "3f576c7cbe49d63781a3e5b8a6911b2a", "sha256": "9a6caef1d688e6c545d809dde4300731c74e71d6066ac5bbb553d93c8144e8bd" }, "downloads": -1, "filename": "collective.recipe.backup-4.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "3f576c7cbe49d63781a3e5b8a6911b2a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 105028, "upload_time": "2018-04-18T23:25:15", "url": "https://files.pythonhosted.org/packages/41/6f/31b85f9a1e99343b47e7bb2fbdd9a8e026633122f9faff4e95f513049571/collective.recipe.backup-4.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aedf58e36683a3e9f47b1054a1a8e1fb", "sha256": "92f7f4779240ed0c5f2f39ebe7c725100acebb3873a8e6d50f3eedf268bb71da" }, "downloads": -1, "filename": "collective.recipe.backup-4.0.1.tar.gz", "has_sig": false, "md5_digest": "aedf58e36683a3e9f47b1054a1a8e1fb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 103727, "upload_time": "2018-04-18T23:25:16", "url": "https://files.pythonhosted.org/packages/c1/ad/4e4e4cabb515c1893822ad8d8606f10ab066b544e3d16154caa26d075907/collective.recipe.backup-4.0.1.tar.gz" } ], "4.0b1": [ { "comment_text": "", "digests": { "md5": "62cb15dd0110bd26f7b2e11ffdd3f5c1", "sha256": "23fe358b375e99d0fbf5e8873b5b42304267e55f56a1b1091f686a30f8491ba2" }, "downloads": -1, "filename": "collective.recipe.backup-4.0b1.tar.gz", "has_sig": false, "md5_digest": "62cb15dd0110bd26f7b2e11ffdd3f5c1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 91265, "upload_time": "2017-05-31T13:58:23", "url": "https://files.pythonhosted.org/packages/7b/ba/1679c44058fb4db526b934334025d23d8b26fa60f664960eef204613ace1/collective.recipe.backup-4.0b1.tar.gz" } ], "4.0b2": [ { "comment_text": "", "digests": { "md5": "b95b221f8fc8884cdb67fe7270e9beba", "sha256": "9d636d7f7a5f7519caba9d93a66523da544c3380cc6fd0b20f387aedc6770da9" }, "downloads": -1, "filename": "collective.recipe.backup-4.0b2.tar.gz", "has_sig": false, "md5_digest": "b95b221f8fc8884cdb67fe7270e9beba", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 91808, "upload_time": "2017-06-26T20:12:02", "url": "https://files.pythonhosted.org/packages/87/5b/ce290ac95c7ca02f593d51219a84acc64e0b32e8476fe5c15a12c8603ba6/collective.recipe.backup-4.0b2.tar.gz" } ], "4.0b3": [ { "comment_text": "", "digests": { "md5": "614c0ef80562eb8bc4052b62582ef16b", "sha256": "171db11cdd2dcf6f0a06c07ae684c1a03a0ecdd443c5367298db0b9faddba82a" }, "downloads": -1, "filename": "collective.recipe.backup-4.0b3.tar.gz", "has_sig": false, "md5_digest": "614c0ef80562eb8bc4052b62582ef16b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 92269, "upload_time": "2017-07-05T10:31:18", "url": "https://files.pythonhosted.org/packages/ba/46/a6a43a2dd6df96f56f75d5c3eaa23abdaab173dd9abbf4410e4eab459a06/collective.recipe.backup-4.0b3.tar.gz" } ], "4.0b4": [ { "comment_text": "", "digests": { "md5": "fdf355c18f302d4798eeaa3135546642", "sha256": "4178e1fe24b17e7c116d573ad8e6af38456a6d452480867ce2d2bd1f8a06f7d0" }, "downloads": -1, "filename": "collective.recipe.backup-4.0b4.tar.gz", "has_sig": false, "md5_digest": "fdf355c18f302d4798eeaa3135546642", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 93213, "upload_time": "2017-08-18T09:57:20", "url": "https://files.pythonhosted.org/packages/6b/84/869977eb00e4ac5e030d7e36d4657e759d04097a75d2bc15832b097fc9b4/collective.recipe.backup-4.0b4.tar.gz" } ], "4.0b5": [ { "comment_text": "", "digests": { "md5": "eb040bc85bb1131068ed3734f0110c1c", "sha256": "ff3d43ca407b8bb5c17401cd77f5b605b788e6339d18ff748f6c9babb19bb277" }, "downloads": -1, "filename": "collective.recipe.backup-4.0b5.tar.gz", "has_sig": false, "md5_digest": "eb040bc85bb1131068ed3734f0110c1c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 102581, "upload_time": "2017-11-17T21:33:15", "url": "https://files.pythonhosted.org/packages/23/02/bfcaa225995bd5b0e4bf6e339c62c30eb57516f873d523d9cd2197b8b7a6/collective.recipe.backup-4.0b5.tar.gz" } ], "4.1.0": [ { "comment_text": "", "digests": { "md5": "cbc68d68f4ae20a8b0a4bbdca076c6e1", "sha256": "e6125137cdb99a987c541aeaeca7f26e3f5835a15cb455ace319acc079a0eb2d" }, "downloads": -1, "filename": "collective.recipe.backup-4.1.0-py2-none-any.whl", "has_sig": false, "md5_digest": "cbc68d68f4ae20a8b0a4bbdca076c6e1", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 88590, "upload_time": "2019-04-10T20:39:37", "url": "https://files.pythonhosted.org/packages/f0/cb/2fbe389ea246dc6622f3e5b1a93c38705d3fc8aeb0097d16b099fa1352ab/collective.recipe.backup-4.1.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b38884ddd9d5c7c12d78902c5e114827", "sha256": "32ff39a7c914619deced6cde6b4a355a33a874f8e73fa0a2220c9da09ef4d98c" }, "downloads": -1, "filename": "collective.recipe.backup-4.1.0.tar.gz", "has_sig": false, "md5_digest": "b38884ddd9d5c7c12d78902c5e114827", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 105049, "upload_time": "2019-04-10T20:39:40", "url": "https://files.pythonhosted.org/packages/8d/4a/1b28e08cfb29538e5b955276419c7873a19acb693e6609083c103c8413fa/collective.recipe.backup-4.1.0.tar.gz" } ], "4.1.1": [ { "comment_text": "", "digests": { "md5": "8d90dceffbd343b96a9765573c683b2f", "sha256": "d39d8479ae96bcbfa7187b2586ee1e6233262c82bb31b8392346859dd994acff" }, "downloads": -1, "filename": "collective.recipe.backup-4.1.1-py2-none-any.whl", "has_sig": false, "md5_digest": "8d90dceffbd343b96a9765573c683b2f", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 89233, "upload_time": "2019-10-07T09:16:48", "url": "https://files.pythonhosted.org/packages/de/fb/708ad25c8f2df8809c305a282cec45d6345646f27b8349441c49102467e2/collective.recipe.backup-4.1.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9f970ef53a2c88e6d4fff6bc14d8b88a", "sha256": "cf6cfd65fbd74d5a3fad170c63763b6cf9113313164c2c164a7f872ae3dca1f1" }, "downloads": -1, "filename": "collective.recipe.backup-4.1.1.tar.gz", "has_sig": false, "md5_digest": "9f970ef53a2c88e6d4fff6bc14d8b88a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 105980, "upload_time": "2019-10-07T09:16:51", "url": "https://files.pythonhosted.org/packages/b4/98/e2b832c591e5517dbce8772941f64ebfcb45db0419335c8a83f2d1f0a806/collective.recipe.backup-4.1.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "8d90dceffbd343b96a9765573c683b2f", "sha256": "d39d8479ae96bcbfa7187b2586ee1e6233262c82bb31b8392346859dd994acff" }, "downloads": -1, "filename": "collective.recipe.backup-4.1.1-py2-none-any.whl", "has_sig": false, "md5_digest": "8d90dceffbd343b96a9765573c683b2f", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 89233, "upload_time": "2019-10-07T09:16:48", "url": "https://files.pythonhosted.org/packages/de/fb/708ad25c8f2df8809c305a282cec45d6345646f27b8349441c49102467e2/collective.recipe.backup-4.1.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9f970ef53a2c88e6d4fff6bc14d8b88a", "sha256": "cf6cfd65fbd74d5a3fad170c63763b6cf9113313164c2c164a7f872ae3dca1f1" }, "downloads": -1, "filename": "collective.recipe.backup-4.1.1.tar.gz", "has_sig": false, "md5_digest": "9f970ef53a2c88e6d4fff6bc14d8b88a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 105980, "upload_time": "2019-10-07T09:16:51", "url": "https://files.pythonhosted.org/packages/b4/98/e2b832c591e5517dbce8772941f64ebfcb45db0419335c8a83f2d1f0a806/collective.recipe.backup-4.1.1.tar.gz" } ] }