summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2020-10-16 15:21:13 +0200
committerAnton Khirnov <anton@khirnov.net>2020-10-16 15:21:13 +0200
commitcfe2ffcc23b714804c42109868a964d1b40f1630 (patch)
tree8afa4d0f04566c9c756259b4e4bb300c0c0e1248
parent63eef7e44e1ecb2ccf4c88237fab8731fddf48b3 (diff)
repository: rewrite results processing
Drop the use of retcode, as it is not very meaningful. Drop all_ok, as it is not very useful. Catch all exceptions from individual targets and wrap them as failed results.
-rwxr-xr-xexample.py32
-rw-r--r--lbup/repository.py29
-rw-r--r--lbup/targets.py2
3 files changed, 33 insertions, 30 deletions
diff --git a/example.py b/example.py
index ba3e09c..1643a17 100755
--- a/example.py
+++ b/example.py
@@ -1,6 +1,7 @@
#!/usr/bin/python3
import argparse
+import logging
import sys
from lbup.repository import Repo
@@ -26,6 +27,8 @@ if args.list_targets:
list_targets(tgts)
sys.exit(0)
+logging.basicConfig(level = logging.INFO)
+
if len(args.targets) > 0:
tgts_run = []
for requested in args.targets:
@@ -39,17 +42,18 @@ else:
repo = Repo()
res = repo.backup(tgts_run)
-if not res.all_ok:
- sys.stderr.write('Error while backing up:\n')
- for tgt, tgt_res in zip(tgts_run, res.target_results):
- if tgt_res.retcode == 0:
- continue
-
- sys.stderr.write('Backing up target "%s" failed with code %d, bup output:\n' %
- (tgt.name, tgt_res.retcode))
- sys.stderr.write(tgt_res.output.decode('utf-8', errors = 'backslashreplace') + '\n')
-
- if res.par2_result.retcode != 0:
- sys.stderr.write('Generating par2 recovery information failed with code %d, bup output:\n' %
- (res.par2_result.retcode))
- sys.stderr.write(res.par2_result.output.decode('utf-8', errors = 'backslashreplace') + '\n')
+for tgt, tgt_res in res.target_results.items():
+ if tgt_res.success:
+ continue
+
+ logging.error('Backing up target "%s" failed', tgt)
+ if tgt_res.output:
+ output = tgt_res.output.decode('utf-8', errors = 'backslashreplace')
+ output = '\n'.join((' ' + line for line in output.splitlines()))
+ logging.error('Target output:')
+ logging.error('%s', output)
+
+if not res.par2_result.success:
+ sys.stderr.write('Generating par2 recovery information failed with code %d, bup output:\n' %
+ (res.par2_result.retcode))
+ sys.stderr.write(res.par2_result.output.decode('utf-8', errors = 'backslashreplace') + '\n')
diff --git a/lbup/repository.py b/lbup/repository.py
index 6a6e215..6c4752b 100644
--- a/lbup/repository.py
+++ b/lbup/repository.py
@@ -5,10 +5,10 @@ import os.path
import subprocess
class StepResult:
- retcode = None
+ success = None
output = None
- def __init__(self, retcode = 0, output = None):
- self.retcode = retcode
+ def __init__(self, success = True, output = ''):
+ self.success = success
self.output = output
class BackupResult:
@@ -16,14 +16,8 @@ class BackupResult:
par2_result = None
def __init__(self):
- self.target_results = []
- self.par2_result = StepResult()
-
- @property
- def all_ok(self):
- return (all(map(lambda tgtres: tgtres.retcode == 0, self.target_results)) and
- self.par2_result.retcode == 0)
-
+ self.target_results = {}
+ self.par2_result = StepResult()
class Repo:
"""
@@ -77,10 +71,15 @@ class Repo:
try:
for tgt in tgts:
self._logger.info('Backing up %s...' % tgt.name)
- res = tgt.save(self.data_dir)
- self._logger.info('Backing up %s done' % tgt.name)
+ try:
+ res = tgt.save(self.data_dir)
+ except Exception as e:
+ self._logger.error('Exception backing up %s: %s' % (tgt.name, str(e)))
+ res = StepResult(False, str(e).encode('utf-8'))
+ else:
+ self._logger.info('Backing up %s done' % tgt.name)
- result.target_results.append(res)
+ result.target_results[tgt.name] = res
if gen_par2:
self._logger.info('Generating par2 files...')
@@ -88,7 +87,7 @@ class Repo:
capture_output = True)
self._logger.info('Generating par2 files done')
- result.par2_result = StepResult(res.returncode,
+ result.par2_result = StepResult(res.returncode == 0,
res.stderr + res.stdout)
finally:
self._logger.debug('Releasing repository lock')
diff --git a/lbup/targets.py b/lbup/targets.py
index d3c724a..9801bc4 100644
--- a/lbup/targets.py
+++ b/lbup/targets.py
@@ -110,7 +110,7 @@ class Target(ABC):
retcode = res_save.returncode
output += res_save.stderr + res_save.stdout
- result = repository.StepResult(retcode, output)
+ result = repository.StepResult(retcode == 0, output)
return result