Merge remote-tracking branch 'qubesos/pr/198'
* qubesos/pr/198: backup.py: add vmN/empty file if no other files to backup Allow include=None to be passed to admin.backup.Info Add include_in_backups property for AdminVM Use !auto_cleanup as DispVM include_in_backups default
This commit is contained in:
commit
81aea0c2c7
@ -1,3 +1,4 @@
|
|||||||
d /var/run/qubes 2770 root qubes
|
d /var/run/qubes 2770 root qubes
|
||||||
f /var/run/qubes/xl-lock 0660 root qubes
|
f /var/run/qubes/xl-lock 0660 root qubes
|
||||||
|
f /var/run/qubes/empty 0444 root qubes
|
||||||
d /var/run/xen-hotplug 0755 root root
|
d /var/run/xen-hotplug 0755 root root
|
||||||
|
@ -1293,8 +1293,9 @@ class QubesAdminAPI(qubes.api.AbstractQubesAPI):
|
|||||||
dest_vm = profile_data['destination_vm']
|
dest_vm = profile_data['destination_vm']
|
||||||
dest_path = profile_data['destination_path']
|
dest_path = profile_data['destination_path']
|
||||||
include_vms = profile_data['include']
|
include_vms = profile_data['include']
|
||||||
# convert old keywords to new keywords
|
if include_vms is not None:
|
||||||
include_vms = [vm.replace('$', '@') for vm in include_vms]
|
# convert old keywords to new keywords
|
||||||
|
include_vms = [vm.replace('$', '@') for vm in include_vms]
|
||||||
exclude_vms = profile_data.get('exclude', [])
|
exclude_vms = profile_data.get('exclude', [])
|
||||||
# convert old keywords to new keywords
|
# convert old keywords to new keywords
|
||||||
exclude_vms = [vm.replace('$', '@') for vm in exclude_vms]
|
exclude_vms = [vm.replace('$', '@') for vm in exclude_vms]
|
||||||
@ -1339,14 +1340,17 @@ class QubesAdminAPI(qubes.api.AbstractQubesAPI):
|
|||||||
'specify passphrase_text or passphrase_vm')
|
'specify passphrase_text or passphrase_vm')
|
||||||
|
|
||||||
# handle include
|
# handle include
|
||||||
vms_to_backup = set(vm for vm in self.app.domains
|
if include_vms is None:
|
||||||
if any(qubes.utils.match_vm_name_with_special(vm, name)
|
vms_to_backup = None
|
||||||
for name in include_vms))
|
else:
|
||||||
|
vms_to_backup = set(vm for vm in self.app.domains
|
||||||
|
if any(qubes.utils.match_vm_name_with_special(vm, name)
|
||||||
|
for name in include_vms))
|
||||||
|
|
||||||
# handle exclude
|
# handle exclude
|
||||||
vms_to_backup.difference_update(vm for vm in self.app.domains
|
vms_to_backup.difference_update(vm for vm in self.app.domains
|
||||||
if any(qubes.utils.match_vm_name_with_special(vm, name)
|
if any(qubes.utils.match_vm_name_with_special(vm, name)
|
||||||
for name in exclude_vms))
|
for name in exclude_vms))
|
||||||
|
|
||||||
kwargs = {
|
kwargs = {
|
||||||
'target_vm': dest_vm,
|
'target_vm': dest_vm,
|
||||||
|
@ -381,6 +381,15 @@ class Backup(object):
|
|||||||
if os.path.exists(firewall_conf):
|
if os.path.exists(firewall_conf):
|
||||||
vm_files.append(self.FileToBackup(firewall_conf, subdir))
|
vm_files.append(self.FileToBackup(firewall_conf, subdir))
|
||||||
|
|
||||||
|
if not vm_files:
|
||||||
|
# subdir/ is needed in the tar file, otherwise restore
|
||||||
|
# of a (Disp)VM without any backed up files is going
|
||||||
|
# to fail. Adding a zero-sized file here happens to be
|
||||||
|
# more straightforward than adding an empty directory.
|
||||||
|
empty = self.FileToBackup("/var/run/qubes/empty", subdir)
|
||||||
|
assert empty.size == 0
|
||||||
|
vm_files.append(empty)
|
||||||
|
|
||||||
files_to_backup[vm.qid] = self.VMToBackup(vm, vm_files, subdir)
|
files_to_backup[vm.qid] = self.VMToBackup(vm, vm_files, subdir)
|
||||||
|
|
||||||
# Dom0 user home
|
# Dom0 user home
|
||||||
|
@ -50,6 +50,10 @@ class AdminVM(qubes.vm.BaseVM):
|
|||||||
default=(lambda self: self.app.default_dispvm),
|
default=(lambda self: self.app.default_dispvm),
|
||||||
doc='Default VM to be used as Disposable VM for service calls.')
|
doc='Default VM to be used as Disposable VM for service calls.')
|
||||||
|
|
||||||
|
include_in_backups = qubes.property('include_in_backups',
|
||||||
|
default=True, type=bool,
|
||||||
|
doc='If this domain is to be included in default backup.')
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
@ -41,6 +41,10 @@ class DispVM(qubes.vm.qubesvm.QubesVM):
|
|||||||
auto_cleanup = qubes.property('auto_cleanup', type=bool, default=False,
|
auto_cleanup = qubes.property('auto_cleanup', type=bool, default=False,
|
||||||
doc='automatically remove this VM upon shutdown')
|
doc='automatically remove this VM upon shutdown')
|
||||||
|
|
||||||
|
include_in_backups = qubes.property('include_in_backups', type=bool,
|
||||||
|
default=(lambda self: not self.auto_cleanup),
|
||||||
|
doc='If this domain is to be included in default backup.')
|
||||||
|
|
||||||
def __init__(self, app, xml, *args, **kwargs):
|
def __init__(self, app, xml, *args, **kwargs):
|
||||||
self.volume_config = {
|
self.volume_config = {
|
||||||
'root': {
|
'root': {
|
||||||
|
Loading…
Reference in New Issue
Block a user