backup: make pylint happy, remove dead settings

After removing backup-restore code the remaining part of backup.py is
not that bad - lets fix it and no longer exclude it from pylint.
This commit is contained in:
Marek Marczykowski-Górecki 2017-07-17 15:12:43 +02:00
parent 61519014cb
commit 2ace5901df
No known key found for this signature in database
GPG Key ID: 063938BA42CFA724
2 changed files with 42 additions and 52 deletions

View File

@ -1,6 +1,6 @@
[MASTER]
persistent=no
ignore=tests,backup.py
ignore=tests
[MESSAGES CONTROL]
# abstract-class-little-used: see http://www.logilab.org/ticket/111138

View File

@ -26,7 +26,6 @@ import functools
import termios
from qubes.utils import size_to_human
import sys
import stat
import os
import fcntl
@ -37,7 +36,6 @@ import tempfile
import time
import grp
import pwd
import errno
import datetime
from multiprocessing import Queue, Process
import qubes
@ -173,15 +171,15 @@ class BackupHeader(object):
"Unsupported backup version {}".format(self.version))
def save(self, filename):
with open(filename, "w") as f:
with open(filename, "w") as f_header:
# make sure 'version' is the first key
f.write('version={}\n'.format(self.version))
f_header.write('version={}\n'.format(self.version))
for key, attr in self.header_keys.items():
if key == 'version':
continue
if getattr(self, attr) is None:
continue
f.write("{!s}={!s}\n".format(key, getattr(self, attr)))
f_header.write("{!s}={!s}\n".format(key, getattr(self, attr)))
class SendWorker(Process):
@ -195,7 +193,7 @@ class SendWorker(Process):
def run(self):
self.log.debug("Started sending thread")
self.log.debug("Moving to temporary dir".format(self.base_dir))
self.log.debug("Moving to temporary dir %s", self.base_dir)
os.chdir(self.base_dir)
for filename in iter(self.queue.get, None):
@ -308,26 +306,29 @@ class Backup(object):
See attributes of this object for all available options.
'''
# pylint: disable=too-many-instance-attributes
class FileToBackup(object):
# pylint: disable=too-few-public-methods
def __init__(self, file_path, subdir=None, name=None):
sz = qubes.storage.file.get_disk_usage(file_path)
file_size = qubes.storage.file.get_disk_usage(file_path)
if subdir is None:
abs_file_path = os.path.abspath(file_path)
abs_base_dir = os.path.abspath(
qubes.config.system_path["qubes_base_dir"]) + '/'
abs_file_dir = os.path.dirname(abs_file_path) + '/'
(nothing, directory, subdir) = abs_file_dir.partition(abs_base_dir)
(nothing, directory, subdir) = \
abs_file_dir.partition(abs_base_dir)
assert nothing == ""
assert directory == abs_base_dir
else:
if len(subdir) > 0 and not subdir.endswith('/'):
if subdir and not subdir.endswith('/'):
subdir += '/'
#: real path to the file
self.path = file_path
#: size of the file
self.size = sz
self.size = file_size
#: directory in backup archive where file should be placed
self.subdir = subdir
#: use this name in the archive (aka rename)
@ -336,6 +337,7 @@ class Backup(object):
self.name = name
class VMToBackup(object):
# pylint: disable=too-few-public-methods
def __init__(self, vm, files, subdir):
self.vm = vm
self.files = files
@ -365,17 +367,11 @@ class Backup(object):
self.tmpdir = None
# Backup settings - defaults
#: should the backup be encrypted?
self.encrypted = True
#: should the backup be compressed?
self.compressed = True
#: what passphrase should be used to intergrity protect (and encrypt)
#: the backup; required
self.passphrase = None
#: custom hmac algorithm
self.hmac_algorithm = DEFAULT_HMAC_ALGORITHM
#: custom encryption algorithm
self.crypto_algorithm = DEFAULT_CRYPTO_ALGORITHM
#: custom compression filter; a program which process stdin to stdout
self.compression_filter = DEFAULT_COMPRESSION_FILTER
#: VM to which backup should be sent (if any)
@ -404,10 +400,6 @@ class Backup(object):
self.log = logging.getLogger('qubes.backup')
if not self.encrypted:
self.log.warning('\'encrypted\' option is ignored, backup is '
'always encrypted')
if exclude_list is None:
exclude_list = []
@ -442,10 +434,7 @@ class Backup(object):
# handle dom0 later
continue
if self.encrypted:
subdir = 'vm%d/' % vm.qid
else:
subdir = None
subdir = 'vm%d/' % vm.qid
vm_files = []
if vm.volumes['private'] is not None:
@ -500,48 +489,48 @@ class Backup(object):
]
# Display the header
for f in fields_to_display:
fmt = "{{0:-^{0}}}-+".format(f["width"] + 1)
for field in fields_to_display:
fmt = "{{0:-^{0}}}-+".format(field["width"] + 1)
summary += fmt.format('-')
summary += "\n"
for f in fields_to_display:
fmt = "{{0:>{0}}} |".format(f["width"] + 1)
summary += fmt.format(f["name"])
for field in fields_to_display:
fmt = "{{0:>{0}}} |".format(field["width"] + 1)
summary += fmt.format(field["name"])
summary += "\n"
for f in fields_to_display:
fmt = "{{0:-^{0}}}-+".format(f["width"] + 1)
for field in fields_to_display:
fmt = "{{0:-^{0}}}-+".format(field["width"] + 1)
summary += fmt.format('-')
summary += "\n"
files_to_backup = self._files_to_backup
for qid, vm_info in files_to_backup.items():
s = ""
summary_line = ""
fmt = "{{0:>{0}}} |".format(fields_to_display[0]["width"] + 1)
s += fmt.format(vm_info['vm'].name)
summary_line += fmt.format(vm_info['vm'].name)
fmt = "{{0:>{0}}} |".format(fields_to_display[1]["width"] + 1)
if qid == 0:
s += fmt.format("User home")
summary_line += fmt.format("User home")
elif isinstance(vm_info['vm'], qubes.vm.templatevm.TemplateVM):
s += fmt.format("Template VM")
summary_line += fmt.format("Template VM")
else:
s += fmt.format("VM" + (" + Sys" if vm_info['vm'].updateable
else ""))
summary_line += fmt.format("VM" + (" + Sys" if
vm_info['vm'].updateable else ""))
vm_size = vm_info['size']
fmt = "{{0:>{0}}} |".format(fields_to_display[2]["width"] + 1)
s += fmt.format(size_to_human(vm_size))
summary_line += fmt.format(size_to_human(vm_size))
if qid != 0 and vm_info['vm'].is_running():
s += " <-- The VM is running, please shut it down before proceeding " \
"with the backup!"
summary_line += " <-- The VM is running, please shut down it " \
"before proceeding with the backup!"
summary += s + "\n"
summary += summary_line + "\n"
for f in fields_to_display:
fmt = "{{0:-^{0}}}-+".format(f["width"] + 1)
for field in fields_to_display:
fmt = "{{0:-^{0}}}-+".format(field["width"] + 1)
summary += fmt.format('-')
summary += "\n"
@ -553,8 +542,8 @@ class Backup(object):
summary += fmt.format(size_to_human(self.total_backup_bytes))
summary += "\n"
for f in fields_to_display:
fmt = "{{0:-^{0}}}-+".format(f["width"] + 1)
for field in fields_to_display:
fmt = "{{0:-^{0}}}-+".format(field["width"] + 1)
summary += fmt.format('-')
summary += "\n"
@ -569,9 +558,8 @@ class Backup(object):
header_file_path = os.path.join(self.tmpdir, HEADER_FILENAME)
backup_header = BackupHeader(
version=CURRENT_BACKUP_FORMAT_VERSION,
hmac_algorithm=self.hmac_algorithm,
crypto_algorithm=self.crypto_algorithm,
encrypted=self.encrypted,
hmac_algorithm=DEFAULT_HMAC_ALGORITHM,
encrypted=True,
compressed=self.compressed,
compression_filter=self.compression_filter,
backup_id=self.backup_id,
@ -609,6 +597,7 @@ class Backup(object):
progress = (
100 * (self._done_vms_bytes + self._current_vm_bytes) /
self.total_backup_bytes)
# pylint: disable=not-callable
self.progress_callback(progress)
def _add_vm_progress(self, bytes_done):
@ -616,6 +605,7 @@ class Backup(object):
self._send_progress_update()
def backup_do(self):
# pylint: disable=too-many-statements
if self.passphrase is None:
raise qubes.exc.QubesException("No passphrase set")
qubes_xml = self.app.store
@ -685,8 +675,8 @@ class Backup(object):
send_proc = SendWorker(to_send, self.tmpdir, backup_stdout)
send_proc.start()
for f in header_files:
to_send.put(f)
for file_name in header_files:
to_send.put(file_name)
qubes_xml_info = self.VMToBackup(
None,
@ -879,7 +869,7 @@ def handle_streams(stream_in, streams_out, processes, size_limit=None,
else:
to_copy = buffer_size
buf = stream_in.read(to_copy)
if not len(buf):
if not buf:
# done
return None