{ "info": { "author": "Seantis GmbH", "author_email": "info@seantis.ch", "bugtrack_url": null, "classifiers": [ "Intended Audience :: System Administrators", "License :: OSI Approved :: MIT License", "Operating System :: Unix", "Programming Language :: Python :: 3", "Topic :: System :: Archiving :: Backup" ], "description": "\n\nDescription\n-----------\n\nThis tool is used at Seantis to create backups stored on various S3 compatible\nservices using a very limited subset of S3 commands.\n\nThis is what you need to know:\n\n* Spare should not be used in production yet! **Use at your own risk.**\n\n* Buckets should be managed by spare exclusively, other files are deleted!\n\n* Each hostname must have a separate bucket for each backed up path.\n\n* Spare stores exactly one copy of your data.\n\n* Files are compressed using LZMA and encrypted on the client using AES-SIV.\n\n* During upload, spare is limited to one core and less than 100MiB of memory.\n\n* Duplicated files are stored only once.\n\n* If you forget your password, you cannot restore your files.\n\n* Spare is meant to be used with configuration management, the cli is minimal.\n\n* Python 3.6.2+ is required.\n\nUsage\n-----\n\nTo install spare::\n\n pip install spare\n\nTo set the connection parameters::\n\n export SPARE_ENDPOINT=host\n export SPARE_ACCESS_KEY=access-key\n export SPARE_SECRET_KEY=secret-key\n\nTo backup a folder::\n\n spare create --password my-password --bucket my-bucket --path /my-path\n\nTo restore a backup::\n\n spare restore --password my-password --bucket my-bucket --path /my-path\n\nTo verify the backup (downloads everything!)::\n\n spare verify --password my-password --bucket my-bucket --path /my-path\n\nLocking\n-------\n\nDuring a spare run, the bucket is locked, so other Spare instances know not\nto touch it. However, it's possible that a lock persists when Spare crashes.\n\nIf that happens, make sure that the host pushing the backup is truly not\nrunning any spare processes, then use the unlock command:\n\nTo unlock a backup (if locked)\n\n spare unlock --password my-password --bucket my-bucket\n\nIf however, you would like to lock a backup to avoid anyone from changing it,\nrun the following command:\n\n spare lock --password my-password --bucket my-bucket\n\nRun the Tests\n-------------\n\nSpare uses `Minio ` to run tests against a real object\nstorage server. As a result it can take a bit for the first test run to\ncomplete, as Minio is downloaded and stored in the pytest cache directory::\n\n pip install -e '.[test]'\n py.test\n\nBuild Status\n------------\n\n.. image:: https://travis-ci.org/seantis/spare.png\n :target: https://travis-ci.org/seantis/spare\n :alt: Build Status\n\nLicense\n-------\nspare is released under the MIT license\n\nChangelog\n---------\n\n0.4.0 (2019-07-29)\n~~~~~~~~~~~~~~~~~~~~~\n\n- Improves handling of SIGINT/SIGTERM.\n\n It should now be safe to kill Spare during backup runs. Spare will still\n block until the current object is properly uploaded, but it won't try to\n finish the snapshot.\n\n The uploaded files might of course be discarded, but the bucket should be\n unlocked and the uploaded files should either be fully uploaded, or not at\n all.\n [href]\n\n0.3.0 (2019-05-28)\n~~~~~~~~~~~~~~~~~~~~~\n\n- Adds a lock/unlock commands.\n [href]\n\n0.2.6 (2019-05-09)\n~~~~~~~~~~~~~~~~~~~~~\n\n- Fixes tests failing on Travis, again.\n [href]\n\n0.2.5 (2019-05-09)\n~~~~~~~~~~~~~~~~~~~~~\n\n- Fixes tests failing on Travis.\n [href]\n\n0.2.4 (2019-05-09)\n~~~~~~~~~~~~~~~~~~~~~\n\n- Stops showing errors when files go missing during operation.\n [href]\n\n0.2.3 (2018-06-20)\n~~~~~~~~~~~~~~~~~~~~~\n\n- Fixes large snapshots getting pruned after creation.\n [href]\n\n0.2.2 (2018-05-25)\n~~~~~~~~~~~~~~~~~~~~~\n\n- Fixes tests.\n [href]\n\n0.2.1 (2018-05-25)\n~~~~~~~~~~~~~~~~~~~~~\n\n- Delay sigterm handling during backup and restore operations.\n [href]\n\n- Changes '--force' into a flag.\n [href]\n\n0.2.0 (2018-05-11)\n~~~~~~~~~~~~~~~~~~~~~\n\n- Adds the inode to the snapshot identity to ensure that a newly setup host\n doesn't overwrite existing backups.\n [href]\n\n0.1.3 (2018-05-10)\n~~~~~~~~~~~~~~~~~~~~~\n\n- Adds the ability to exclude files from the backup.\n [href]\n\n0.1.2 (2018-05-10)\n~~~~~~~~~~~~~~~~~~~~~\n\n- Increases the download speed during restore operations.\n [href]\n\n- Shows a warning when a user/group could not be found during restore.\n [href]\n\n- Lowers the timeouts and retry rates.\n [href]\n\n0.1.1 (2018-05-04)\n~~~~~~~~~~~~~~~~~~~~~\n\n- Lowers the number of requests needed to upload data.\n [href]\n\n0.1.0 (2018-04-26)\n~~~~~~~~~~~~~~~~~~~~~\n\n- Initial Release.\n [href]\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/seantis/spare", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "spare", "package_url": "https://pypi.org/project/spare/", "platform": "any", "project_url": "https://pypi.org/project/spare/", "project_urls": { "Homepage": "http://github.com/seantis/spare" }, "release_url": "https://pypi.org/project/spare/0.4.0/", "requires_dist": [ "boto3", "cached-property", "click", "cryptography", "logbook", "miscreant", "ulid-py", "hypothesis ; extra == 'test'", "mirakuru ; extra == 'test'", "flake8 ; extra == 'test'", "port-for ; extra == 'test'", "pytest ; extra == 'test'", "pytest-cov ; extra == 'test'", "pytest-flake8 ; extra == 'test'", "pytest-logbook ; extra == 'test'" ], "requires_python": ">=3.6.2", "summary": "One S3 backup, encrypted on the fly.", "version": "0.4.0" }, "last_serial": 5599483, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "0df4f87a1aa6f993fac46546ee9eacaa", "sha256": "13d9d1691f115627346e9a4682a66372317d56b25d5e79f3ee7e614bb27d16b1" }, "downloads": -1, "filename": "spare-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "0df4f87a1aa6f993fac46546ee9eacaa", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.2", "size": 25113, "upload_time": "2018-04-26T10:08:07", "url": "https://files.pythonhosted.org/packages/1d/f6/9ff4ff12b52d6641c2a83e7e45de0e012ed4ed1120fbbec44479c5ede687/spare-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1a7a3dc0bf5bfa3d09d22f6a8db98607", "sha256": "513ea3de9c60a466d529b31ddc1aa7f55c8b1efa6dc081ff7476cda7ceccd705" }, "downloads": -1, "filename": "spare-0.1.0.tar.gz", "has_sig": false, "md5_digest": "1a7a3dc0bf5bfa3d09d22f6a8db98607", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.2", "size": 18707, "upload_time": "2018-04-26T10:08:08", "url": "https://files.pythonhosted.org/packages/1f/53/fb6d3b4270455024416a12c770436145d37ba549eecbce0eff43255485d2/spare-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "ab8b51de9104d2ff19e10ebea02fe168", "sha256": "6bc78cdbb992e948df7a1bbb6a8d1a490367b4ea342ac2e4d0e9e89ad370dabf" }, "downloads": -1, "filename": "spare-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "ab8b51de9104d2ff19e10ebea02fe168", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.2", "size": 25468, "upload_time": "2018-05-04T08:53:39", "url": "https://files.pythonhosted.org/packages/8e/da/e4eb1cf4b7162ee84e08df2b0c667976684d92f5e2f5bc54e6327cd05c92/spare-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "df022d2d0e9e8d294c6cb706726abd9a", "sha256": "06c01f6946d9822d9ff0d608da2b2de213c2c11570a687438058a2b84837da7b" }, "downloads": -1, "filename": "spare-0.1.1.tar.gz", "has_sig": false, "md5_digest": "df022d2d0e9e8d294c6cb706726abd9a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.2", "size": 19056, "upload_time": "2018-05-04T08:53:41", "url": "https://files.pythonhosted.org/packages/ef/23/6b9e0add0d8ae45fa9510afb08d3ae15a83e066ceda76dfad5f34cc47e54/spare-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "b07aa9b53aa687d5823c39b2a22b3e96", "sha256": "ae886d933ea6b898588d486730d85a5500f5885bece711ff6304666b41597563" }, "downloads": -1, "filename": "spare-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "b07aa9b53aa687d5823c39b2a22b3e96", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.2", "size": 26438, "upload_time": "2018-05-10T12:58:28", "url": "https://files.pythonhosted.org/packages/cc/bd/62e332725c21f731ada8714421af86825870b8b380cdbd0b6049c3f287c6/spare-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e9b3c68e09f58aedef31dff096ea784b", "sha256": "5cf57f421313fce67150673734a854a3faa76a5fb2c58d2a83627ff6a6de8ed5" }, "downloads": -1, "filename": "spare-0.1.2.tar.gz", "has_sig": false, "md5_digest": "e9b3c68e09f58aedef31dff096ea784b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.2", "size": 19941, "upload_time": "2018-05-10T12:58:29", "url": "https://files.pythonhosted.org/packages/e5/5f/e514ed2bddf534b1436c32636760eeed4cc55cac67422c4373be5fdf145d/spare-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "d6f12e9cea9f4fdb735fc4b8b24436ee", "sha256": "234c1b71fd26615a1425f3d75de346ebab78fa484ad816dcd6b840232002deef" }, "downloads": -1, "filename": "spare-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "d6f12e9cea9f4fdb735fc4b8b24436ee", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.2", "size": 26761, "upload_time": "2018-05-10T14:55:36", "url": "https://files.pythonhosted.org/packages/31/51/fffc8e0325b437e5c626ba3338a88f798ab61d6b2cf2706cf42c77d15723/spare-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "803789691756d95602248d981eb5e548", "sha256": "7e9aeb8d2d73a194fa2334faeddf20e57b36b70f9ac39c000d4de33de0044b48" }, "downloads": -1, "filename": "spare-0.1.3.tar.gz", "has_sig": false, "md5_digest": "803789691756d95602248d981eb5e548", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.2", "size": 20249, "upload_time": "2018-05-10T14:55:37", "url": "https://files.pythonhosted.org/packages/45/26/2c99ea944862b32a934db32e085976d96f1dc193a9381a470d066ac63525/spare-0.1.3.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "6fb0ebb56fe034ec506fb7bae490ef0c", "sha256": "fe5029cacb20cc836831924ff18003a238f7e3493826a654137aaae004398ede" }, "downloads": -1, "filename": "spare-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "6fb0ebb56fe034ec506fb7bae490ef0c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.2", "size": 26983, "upload_time": "2018-05-11T07:43:02", "url": "https://files.pythonhosted.org/packages/31/03/521ce4777da1a18cc1282a329133f8bee82f7de63115fc8fd0aead739ec7/spare-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "48cac09df305b262f9e5ad42f4e6a579", "sha256": "67b44a327962ac8fa582b892f5d8abf51811b3c8d0c33b935b73c10183ec5cd1" }, "downloads": -1, "filename": "spare-0.2.0.tar.gz", "has_sig": false, "md5_digest": "48cac09df305b262f9e5ad42f4e6a579", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.2", "size": 20432, "upload_time": "2018-05-11T07:43:03", "url": "https://files.pythonhosted.org/packages/8b/3b/186810be13ca0671d4a6ee775aaba6451c57ab0bde800c8f13763e0370dd/spare-0.2.0.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "c7beef6cafd6472b5a88cbedc1fc6757", "sha256": "29c8ebc933782f316efab53873305c34c5dd790586e1a4d897f7756b40b751a7" }, "downloads": -1, "filename": "spare-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "c7beef6cafd6472b5a88cbedc1fc6757", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.2", "size": 27889, "upload_time": "2018-05-25T13:36:38", "url": "https://files.pythonhosted.org/packages/df/3d/c27e4bdcdae08496746d21773fbb43974c81049d8ca4c2b4311f5eabec01/spare-0.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2a1dde476452b46c97874c230f36bb9b", "sha256": "9c12e723d7f3c3f75e2cba77bdfe525b776d13465d2fc534e4177bd05343f684" }, "downloads": -1, "filename": "spare-0.2.2.tar.gz", "has_sig": false, "md5_digest": "2a1dde476452b46c97874c230f36bb9b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.2", "size": 21168, "upload_time": "2018-05-25T13:36:39", "url": "https://files.pythonhosted.org/packages/ea/19/ce9cf55af68b2f35c267567a61bd27415fdd57895b2cfc2661d2500ff98c/spare-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "23cd11ea05e04a568645f34485b4fc54", "sha256": "c14d9bf1c5a5228450d45fadfb5b7bec4697b2d4756a306e9ca7632259688351" }, "downloads": -1, "filename": "spare-0.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "23cd11ea05e04a568645f34485b4fc54", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.2", "size": 27996, "upload_time": "2018-06-20T08:58:31", "url": "https://files.pythonhosted.org/packages/8c/72/b5865c621c95ae7ad4c302486811f52b4d7feef5a4dda4c0dca29082ab49/spare-0.2.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "54240eb45fbd88b561b21868d32d0af5", "sha256": "8970f408e4da68efc4fdc13ec812db4381816d2ffed11e88764d060430c02d27" }, "downloads": -1, "filename": "spare-0.2.3.tar.gz", "has_sig": false, "md5_digest": "54240eb45fbd88b561b21868d32d0af5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.2", "size": 21291, "upload_time": "2018-06-20T08:58:32", "url": "https://files.pythonhosted.org/packages/ba/3d/9b57a1442159a6a9aceaabee2c9c49e75094f9b566af4994d0847c19f138/spare-0.2.3.tar.gz" } ], "0.2.6": [ { "comment_text": "", "digests": { "md5": "885d14c11ff79059a857670bf269de84", "sha256": "0697d9e1fc5742d4a77259eec47ede18387b0fb98c6bf0dbc49f5a918eca4a0b" }, "downloads": -1, "filename": "spare-0.2.6-py3-none-any.whl", "has_sig": false, "md5_digest": "885d14c11ff79059a857670bf269de84", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.2", "size": 29378, "upload_time": "2019-05-09T13:43:16", "url": "https://files.pythonhosted.org/packages/e2/ab/42024be7a6ca7c9ad094939baef996ee4b3996cae1f1f2cac0237332888e/spare-0.2.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "388be8591095632f94b806b5311fb8dc", "sha256": "fa5629a28d409804ddbe5e2b42876ef9cb914ee6455d72cfbdea10a8a0a85a9f" }, "downloads": -1, "filename": "spare-0.2.6.tar.gz", "has_sig": false, "md5_digest": "388be8591095632f94b806b5311fb8dc", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.2", "size": 22450, "upload_time": "2019-05-09T13:43:18", "url": "https://files.pythonhosted.org/packages/7c/40/da87f6e0061bed907945700956889d7ff0b4e30c05d40adafaa68973fa2c/spare-0.2.6.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "07ac6e680ca65bc00cf6573800a2dbbd", "sha256": "997f8a71f630553c1b6848844cf779c4fd09e4affdeca4d60186ba79bad45278" }, "downloads": -1, "filename": "spare-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "07ac6e680ca65bc00cf6573800a2dbbd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.2", "size": 29479, "upload_time": "2019-05-28T13:45:59", "url": "https://files.pythonhosted.org/packages/62/df/4b53b83438db8e0cde661a0038ccf7ad700c060e7a58dd1d7010d9551703/spare-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d13fc6b8c39409346b5a0f01d44aaa2f", "sha256": "f633cebd4dc8f3315e6a072278f8b4ffa65c85e2630cfbc054bf24cb93f120c2" }, "downloads": -1, "filename": "spare-0.3.0.tar.gz", "has_sig": false, "md5_digest": "d13fc6b8c39409346b5a0f01d44aaa2f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.2", "size": 23153, "upload_time": "2019-05-28T13:46:00", "url": "https://files.pythonhosted.org/packages/3a/9b/fba1924e3883b63f5b2e19baf9f58c07b612a84401076ad7c7a735dd3043/spare-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "5bd7d12e1748514f9485df8ee73a33bc", "sha256": "3bc377b4ff87a2ea2cd522fcf06014edd15a61283efeb5ff8593ea6fb7033668" }, "downloads": -1, "filename": "spare-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "5bd7d12e1748514f9485df8ee73a33bc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.2", "size": 30353, "upload_time": "2019-07-29T13:22:49", "url": "https://files.pythonhosted.org/packages/97/0a/cb2cec8f9ba3e059a8956b9c3e2e96a5488a7373af3e7f5833cb6b6b3061/spare-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "96fc7b737993986c83de0eef23cbfea6", "sha256": "b5ede901c913dec2537df2142ed44b021e8a832f60eb32cccd15be8966ccfafb" }, "downloads": -1, "filename": "spare-0.4.0.tar.gz", "has_sig": false, "md5_digest": "96fc7b737993986c83de0eef23cbfea6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.2", "size": 23935, "upload_time": "2019-07-29T13:22:51", "url": "https://files.pythonhosted.org/packages/3d/74/b67d9d47125e054c35dd922b638d7a43f9b1fa905f97d8447abe9773fc92/spare-0.4.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "5bd7d12e1748514f9485df8ee73a33bc", "sha256": "3bc377b4ff87a2ea2cd522fcf06014edd15a61283efeb5ff8593ea6fb7033668" }, "downloads": -1, "filename": "spare-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "5bd7d12e1748514f9485df8ee73a33bc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.2", "size": 30353, "upload_time": "2019-07-29T13:22:49", "url": "https://files.pythonhosted.org/packages/97/0a/cb2cec8f9ba3e059a8956b9c3e2e96a5488a7373af3e7f5833cb6b6b3061/spare-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "96fc7b737993986c83de0eef23cbfea6", "sha256": "b5ede901c913dec2537df2142ed44b021e8a832f60eb32cccd15be8966ccfafb" }, "downloads": -1, "filename": "spare-0.4.0.tar.gz", "has_sig": false, "md5_digest": "96fc7b737993986c83de0eef23cbfea6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.2", "size": 23935, "upload_time": "2019-07-29T13:22:51", "url": "https://files.pythonhosted.org/packages/3d/74/b67d9d47125e054c35dd922b638d7a43f9b1fa905f97d8447abe9773fc92/spare-0.4.0.tar.gz" } ] }