backup: fix naming qubes.xml.000 in the archive

Restore old code for calculating subdir within the archive. The new one
had two problems:
 - set '/' for empty input subdir - which caused qubes.xml.000 to be
 named '/qubes.xml.000' (and then converted to '../../qubes.xml.000');
 among other things, this results in the wrong path used for encryption
 passphrase
 - resolved symlinks, which breaks calculating path for any symlinks
 within VM's directory (symlinks there should be treated as normal files
 to be sure that actual content is included in the backup)

This partially reverts 4e49b951ce.

Fixes QubesOS/qubes-issues#4493
This commit is contained in:
Marek Marczykowski-Górecki 2018-11-11 01:12:00 +01:00
parent 85a20428a6
commit f023b3dd6e
No known key found for this signature in database
GPG Key ID: 063938BA42CFA724

View File

@ -29,7 +29,6 @@ import grp
import itertools import itertools
import logging import logging
import os import os
import pathlib
import pwd import pwd
import re import re
import shutil import shutil
@ -260,14 +259,17 @@ class Backup:
size = qubes.storage.file.get_disk_usage(file_path) size = qubes.storage.file.get_disk_usage(file_path)
if subdir is None: if subdir is None:
abs_file_dir = pathlib.Path(file_path).resolve().parent abs_file_path = os.path.abspath(file_path)
abs_base_dir = pathlib.Path( abs_base_dir = os.path.abspath(
qubes.config.system_path["qubes_base_dir"]).resolve() qubes.config.system_path["qubes_base_dir"]) + '/'
# this raises ValueError if abs_file_dir is not in abs_base_dir abs_file_dir = os.path.dirname(abs_file_path) + '/'
subdir = str(abs_file_dir.relative_to(abs_base_dir)) (nothing, directory, subdir) = \
abs_file_dir.partition(abs_base_dir)
if not subdir.endswith(os.path.sep): assert nothing == ""
subdir += os.path.sep assert directory == abs_base_dir
else:
if subdir and not subdir.endswith('/'):
subdir += '/'
#: real path to the file #: real path to the file
self.path = file_path self.path = file_path