Codebase list cedar-backup3 / c2b9b58
New upstream version 3.6.4 Kenneth J. Pronovici 2 years ago
21 changed file(s) with 85 addition(s) and 78 deletion(s). Raw diff Collapse all Expand all
0 Version 3.6.4 14 Nov 2021
1
2 * Adjust dependencies and build process to support Python 3.10.
3
04 Version 3.6.3 13 Mar 2021
15
26 * Improve logged output for failed pre/post action hooks.
00 Metadata-Version: 2.1
11 Name: cedar-backup3
2 Version: 3.6.3
2 Version: 3.6.4
33 Summary: Implements local and remote backups to CD/DVD and Amazon S3
44 Home-page: https://pypi.org/project/cedar-backup3/
55 License: GPL-2.0-only
(No changes)
00 alabaster==0.7.12; python_version >= "3.6"
1 appdirs==1.4.4; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
2 astroid==2.5.1; python_version >= "3.6" and python_version < "4.0"
3 babel==2.9.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6"
4 black==20.8b1; python_version >= "3.6"
5 certifi==2020.12.5; python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.5"
6 cfgv==3.2.0; python_full_version >= "3.6.1"
1 astroid==2.8.5; python_version >= "3.6" and python_version < "4.0"
2 babel==2.9.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6"
3 backports.entry-points-selectable==1.1.1; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "2.7"
4 black==21.10b0; python_full_version >= "3.6.2"
5 certifi==2021.10.8; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6"
6 cfgv==3.3.1; python_full_version >= "3.6.1"
77 chardet==3.0.4
8 click==7.1.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
9 colorama==0.4.4; python_version >= "3.6" and python_full_version < "3.0.0" and platform_system == "Windows" and python_version < "4.0" and sys_platform == "win32" or python_full_version >= "3.5.0" and platform_system == "Windows" and python_version >= "3.6" and python_version < "4.0" and sys_platform == "win32"
10 coverage==5.5; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0" and python_version < "4")
11 coveralls==3.0.1; python_version >= "3.5"
12 distlib==0.3.1; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0"
8 charset-normalizer==2.0.7; python_full_version >= "3.6.0" and python_version >= "3.6"
9 click==8.0.3; python_version >= "3.6" and python_full_version >= "3.6.2"
10 colorama==0.4.4; python_full_version >= "3.6.2" and platform_system == "Windows" and python_version >= "3.6" and python_version < "4.0" and sys_platform == "win32" and (python_version >= "3.6" and python_full_version < "3.0.0" and sys_platform == "win32" or sys_platform == "win32" and python_version >= "3.6" and python_full_version >= "3.5.0")
11 coverage==6.1.2; python_version >= "3.6"
12 coveralls==3.3.1; python_version >= "3.5"
13 distlib==0.3.3; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0"
1314 docopt==0.6.2; python_version >= "3.5"
14 docutils==0.16; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
15 docutils==0.17.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
1516 dparse==0.5.1; python_version >= "3.5"
16 filelock==3.0.12; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0"
17 identify==2.1.2; python_full_version >= "3.6.1"
18 idna==2.10; python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.5"
19 imagesize==1.2.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6"
20 importlib-metadata==3.7.2; python_full_version >= "3.6.1" and python_version < "3.8" and python_version >= "3.6" and (python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "3.8" or python_full_version >= "3.5.0" and python_version < "3.8" and python_version >= "3.6")
21 isort==5.7.0; python_version >= "3.6" and python_version < "4.0"
22 jinja2==2.11.3; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
23 lazy-object-proxy==1.5.2; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.5.0"
24 markupsafe==1.1.1; python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.5"
17 filelock==3.3.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
18 identify==2.3.5; python_full_version >= "3.6.1"
19 idna==3.3; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6"
20 imagesize==1.3.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6"
21 importlib-metadata==4.8.2; python_full_version >= "3.6.2" and python_version < "3.8" and python_version >= "3.6" and (python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "3.8" or python_full_version >= "3.5.0" and python_version >= "3.6" and python_version < "3.8")
22 isort==5.10.1; python_full_version >= "3.6.1" and python_version < "4.0"
23 jinja2==3.0.3; python_version >= "3.6"
24 lazy-object-proxy==1.6.0; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.6.0"
25 markupsafe==2.0.1; python_version >= "3.6"
2526 mccabe==0.6.1; python_version >= "3.6" and python_version < "4.0"
26 mypy-extensions==0.4.3; python_version >= "3.6"
27 nodeenv==1.5.0; python_full_version >= "3.6.1"
28 packaging==20.9; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
29 pathspec==0.8.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
30 pluggy==0.13.1; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0"
31 pre-commit==2.11.1; python_full_version >= "3.6.1"
32 py==1.10.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0"
33 pygments==2.8.1; python_version >= "3.6"
34 pylint==2.7.2; python_version >= "3.6" and python_version < "4.0"
35 pyparsing==2.4.7; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0"
36 pytz==2021.1; python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.5"
37 pyyaml==5.4.1; python_full_version >= "3.6.1" and python_version >= "3.6" and (python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.5")
38 regex==2020.11.13; python_version >= "3.6"
39 requests==2.25.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
27 mypy-extensions==0.4.3; python_full_version >= "3.6.2"
28 nodeenv==1.6.0; python_full_version >= "3.6.1"
29 packaging==21.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
30 pathspec==0.9.0; python_full_version >= "3.6.2"
31 platformdirs==2.4.0; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.6.2" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6")
32 pluggy==1.0.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
33 pre-commit==2.15.0; python_full_version >= "3.6.1"
34 py==1.11.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0"
35 pygments==2.10.0; python_version >= "3.6"
36 pylint==2.11.1; python_version >= "3.6" and python_version < "4.0"
37 pyparsing==2.4.7; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"
38 pytz==2021.3; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6"
39 pyyaml==6.0; python_version >= "3.6" and python_full_version >= "3.6.1"
40 regex==2021.11.10; python_full_version >= "3.6.2"
41 requests==2.26.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6"
4042 safety==1.10.3; python_version >= "3.5"
41 six==1.15.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0"
43 six==1.16.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0"
4244 snowballstemmer==2.1.0; python_version >= "3.6"
43 sphinx-autoapi==1.7.0; python_version >= "3.6"
44 sphinx==3.5.2; python_version >= "3.5"
45 sphinx-autoapi==1.8.4; python_version >= "3.6"
46 sphinx==4.3.0; python_version >= "3.6"
4547 sphinxcontrib-applehelp==1.0.2; python_version >= "3.6"
4648 sphinxcontrib-devhelp==1.0.2; python_version >= "3.6"
47 sphinxcontrib-htmlhelp==1.0.3; python_version >= "3.6"
49 sphinxcontrib-htmlhelp==2.0.0; python_version >= "3.6"
4850 sphinxcontrib-jsmath==1.0.1; python_version >= "3.6"
4951 sphinxcontrib-qthelp==1.0.3; python_version >= "3.6"
50 sphinxcontrib-serializinghtml==1.1.4; python_version >= "3.6"
52 sphinxcontrib-serializinghtml==1.1.5; python_version >= "3.6"
5153 toml==0.10.2; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.3.0")
52 tox==3.23.0; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0")
53 typed-ast==1.4.2; implementation_name == "cpython" and python_version < "3.8" and python_version >= "3.6"
54 typing-extensions==3.7.4.3; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "3.8" or python_full_version >= "3.5.0" and python_version < "3.8" and python_version >= "3.6"
55 unidecode==1.2.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6"
56 urllib3==1.26.3; python_version >= "3.5" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version < "4" and python_version >= "3.5"
57 virtualenv==20.4.2; python_full_version >= "3.6.1"
58 wrapt==1.12.1; python_version >= "3.6" and python_version < "4.0"
59 zipp==3.4.1; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "3.8" or python_full_version >= "3.5.0" and python_version < "3.8" and python_version >= "3.6"
54 tomli==1.2.2; python_version >= "3.6" and python_full_version >= "3.6.2"
55 tox==3.24.4; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0")
56 typed-ast==1.5.0; python_version < "3.8" and python_full_version >= "3.6.2" and python_version >= "3.6" and implementation_name == "cpython"
57 typing-extensions==4.0.0
58 unidecode==1.3.2; python_version >= "3.6"
59 urllib3==1.26.7; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.6"
60 virtualenv==20.10.0; python_full_version >= "3.6.1"
61 wrapt==1.13.3; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.5.0"
62 zipp==3.6.0; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "3.8" or python_full_version >= "3.5.0" and python_version < "3.8" and python_version >= "3.6"
00 [tool.poetry]
11 name = "cedar-backup3"
2 version = "3.6.3"
2 version = "3.6.4"
33 description = "Implements local and remote backups to CD/DVD and Amazon S3"
44 keywords = [ 'local', 'remote', 'backup', 'scp' ]
55 authors = ["Kenneth J. Pronovici <pronovic@ieee.org>"]
3232 chardet = "^3.0.4"
3333
3434 [tool.poetry.dev-dependencies]
35 coverage = "^5.0.3"
36 tox = "^3.14.5"
37 pylint = "^2.6.0"
38 sphinx = "^3.4.3"
39 toml = "^0.10.0"
40 pre-commit = "^2.2.0"
41 black = "^20.8b1"
42 isort = "^5.0.0"
43 sphinx-autoapi = "^1.2.1"
35 coverage = "^6.1.1"
36 tox = "^3.24.4"
37 pylint = "^2.11.1"
38 sphinx = "^4.3"
39 toml = "^0.10.2"
40 pre-commit = "^2.15.0"
41 black = "^21.10b0"
42 isort = "^5.10.0"
43 sphinx-autoapi = "^1.8.4"
4444 safety = "^1.10.3"
45 coveralls = "^3.0.0"
45 coveralls = "^3.3.1"
4646
4747 [tool.black]
4848 line-length = 132
2323
2424 setup_kwargs = {
2525 'name': 'cedar-backup3',
26 'version': '3.6.3',
26 'version': '3.6.4',
2727 'description': 'Implements local and remote backups to CD/DVD and Amazon S3',
2828 'long_description': '[![pypi](https://img.shields.io/pypi/v/cedar-backup3.svg)](https://pypi.org/project/cedar-backup3/)\n[![license](https://img.shields.io/pypi/l/cedar-backup3.svg)](https://github.com/pronovic/cedar-backup3/blob/master/LICENSE)\n[![wheel](https://img.shields.io/pypi/wheel/cedar-backup3.svg)](https://pypi.org/project/cedar-backup3/)\n[![python](https://img.shields.io/pypi/pyversions/cedar-backup3.svg)](https://pypi.org/project/cedar-backup3/)\n[![Test Suite](https://github.com/pronovic/cedar-backup3/workflows/Test%20Suite/badge.svg)](https://github.com/pronovic/cedar-backup3/actions?query=workflow%3A%22Test+Suite%22)\n[![docs](https://readthedocs.org/projects/cedar-backup3/badge/?version=stable&style=flat)](https://cedar-backup3.readthedocs.io/en/stable/)\n[![coverage](https://coveralls.io/repos/github/pronovic/cedar-backup3/badge.svg?branch=master)](https://coveralls.io/github/pronovic/cedar-backup3?branch=master)\n\n[Cedar Backup](https://github.com/pronovic/cedar-backup3) is a software package\ndesigned to manage system backups for a pool of local and remote machines.\nCedar Backup understands how to back up filesystem data as well as MySQL and\nPostgreSQL databases and Subversion repositories. It can also be easily\nextended to support other kinds of data sources.\n\nCedar Backup is focused around weekly backups to a single CD or DVD disc,\nwith the expectation that the disc will be changed or overwritten at the\nbeginning of each week. If your hardware is new enough, Cedar Backup can\nwrite multisession discs, allowing you to add incremental data to a disc on\na daily basis. Alternately, Cedar Backup can write your backups to the Amazon\nS3 cloud rather than relying on physical media. See \nthe [Cedar Backup v3 Software Manual](https://cedar-backup3.readthedocs.io/en/stable/manual/index.html) for details.\n\nBesides offering command-line utilities to manage the backup process, Cedar\nBackup provides a well-organized library of backup-related functionality.\nFor more information, see \nthe [API Reference](https://cedar-backup3.readthedocs.io/en/stable/autoapi/index.html).\n\nThere are many different backup software systems in the open source world.\nCedar Backup aims to fill a niche: it aims to be a good fit for people who need\nto back up a limited amount of important data on a regular basis. Cedar Backup\nisn’t for you if you want to back up your huge MP3 collection every night, or\nif you want to back up a few hundred machines. However, if you administer a\nsmall set of machines and you want to run daily incremental backups for things\nlike system configuration, current email, small web sites, source code\nrepositories, or small databases, then Cedar Backup is probably worth your\ntime.\n',
2929 'author': 'Kenneth J. Pronovici',
174174 filename = pathJoin(targetDir, indicatorFile)
175175 logger.debug("Writing indicator file [%s].", filename)
176176 try:
177 with open(filename, "w") as f:
177 with open(filename, "w") as f: # pylint: disable=unspecified-encoding
178178 f.write("")
179179 changeOwnership(filename, backupUser, backupGroup)
180180 except Exception as e:
45124512 if validate:
45134513 self.validate()
45144514 elif xmlPath is not None:
4515 with open(xmlPath) as f:
4515 with open(xmlPath) as f: # pylint: disable=unspecified-encoding
45164516 xmlData = f.read()
45174517 self._parseXmlData(xmlData)
45184518 if validate:
48234823 self.validate()
48244824 xmlData = self._extractXml()
48254825 if xmlPath is not None:
4826 with open(xmlPath, "w") as f:
4826 with open(xmlPath, "w") as f: # pylint: disable=unspecified-encoding
48274827 f.write(xmlData)
48284828 return None
48294829 else:
407407 if validate:
408408 self.validate()
409409 elif xmlPath is not None:
410 with open(xmlPath) as f:
410 with open(xmlPath) as f: # pylint: disable=unspecified-encoding
411411 xmlData = f.read()
412412 self._parseXmlData(xmlData)
413413 if validate:
886886 if os.path.isfile(cleartext):
887887 encrypted = "%s%s" % (encryptedDir, cleartext.replace(stagingDir, ""))
888888 if int(os.stat(cleartext).st_size) == 0:
889 with open(encrypted, "a") as f:
889 with open(encrypted, "a") as f: # pylint: disable=unspecified-encoding
890890 f.close() # don't bother encrypting empty files
891891 else:
892892 actualCommand = local.amazons3.encryptCommand.replace("${input}", cleartext).replace("${output}", encrypted)
360360 if validate:
361361 self.validate()
362362 elif xmlPath is not None:
363 with open(xmlPath) as f:
363 with open(xmlPath) as f: # pylint: disable=unspecified-encoding
364364 xmlData = f.read()
365365 self._parseXmlData(xmlData)
366366 if validate:
259259 if validate:
260260 self.validate()
261261 elif xmlPath is not None:
262 with open(xmlPath) as f:
262 with open(xmlPath) as f: # pylint: disable=unspecified-encoding
263263 xmlData = f.read()
264264 self._parseXmlData(xmlData)
265265 if validate:
765765 if validate:
766766 self.validate()
767767 elif xmlPath is not None:
768 with open(xmlPath) as f:
768 with open(xmlPath) as f: # pylint: disable=unspecified-encoding
769769 xmlData = f.read()
770770 self._parseXmlData(xmlData)
771771 if validate:
375375 if validate:
376376 self.validate()
377377 elif xmlPath is not None:
378 with open(xmlPath) as f:
378 with open(xmlPath) as f: # pylint: disable=unspecified-encoding
379379 xmlData = f.read()
380380 self._parseXmlData(xmlData)
381381 if validate:
342342 if validate:
343343 self.validate()
344344 elif xmlPath is not None:
345 with open(xmlPath) as f:
345 with open(xmlPath) as f: # pylint: disable=unspecified-encoding
346346 xmlData = f.read()
347347 self._parseXmlData(xmlData)
348348 if validate:
264264 if validate:
265265 self.validate()
266266 elif xmlPath is not None:
267 with open(xmlPath) as f:
267 with open(xmlPath) as f: # pylint: disable=unspecified-encoding
268268 xmlData = f.read()
269269 self._parseXmlData(xmlData)
270270 if validate:
796796 if validate:
797797 self.validate()
798798 elif xmlPath is not None:
799 with open(xmlPath) as f:
799 with open(xmlPath) as f: # pylint: disable=unspecified-encoding
800800 xmlData = f.read()
801801 self._parseXmlData(xmlData)
802802 if validate:
377377 if os.path.exists(targetFile):
378378 raise IOError("Target file [%s] already exists." % targetFile)
379379 if sourceFile is None:
380 with open(targetFile, "w") as f:
380 with open(targetFile, "w") as f: # pylint: disable=unspecified-encoding
381381 f.write("")
382382 else:
383383 if os.path.isfile(sourceFile) and not os.path.islink(sourceFile):
858858 targetFile = pathJoin(self.collectDir, stageIndicator)
859859 try:
860860 if not os.path.exists(sourceFile):
861 with open(sourceFile, "w") as f:
861 with open(sourceFile, "w") as f: # pylint: disable=unspecified-encoding
862862 f.write("")
863863 RemotePeer._pushLocalFile(
864864 self.remoteUser, self.localUser, self.name, self._rcpCommand, self._rcpCommandList, sourceFile, targetFile
3434 AUTHOR = "Kenneth J. Pronovici"
3535 EMAIL = "pronovic@ieee.org"
3636 COPYRIGHT = "2004-2021"
37 VERSION = "3.6.3"
38 DATE = "13 Mar 2021"
37 VERSION = "3.6.4"
38 DATE = "14 Nov 2021"
3939 URL = "https://github.com/pronovic/cedar-backup3"
17801780 """
17811781 if os.path.exists(MTAB_FILE) and os.access(MTAB_FILE, os.R_OK):
17821782 realPath = os.path.realpath(devicePath)
1783 with open(MTAB_FILE) as f:
1783 with open(MTAB_FILE) as f: # pylint: disable=unspecified-encoding
17841784 lines = f.readlines()
17851785 for line in lines:
17861786 (mountDevice, mountPoint, remainder) = line.split(None, 2)