bundles/backup-server: improve

This commit is contained in:
Franzi 2025-04-16 09:02:18 +02:00
parent c905b7dc13
commit a15740c899
Signed by: kunsi
GPG key ID: 12E3D2136B818350
2 changed files with 22 additions and 46 deletions

View file

@ -15,16 +15,15 @@ for line in check_output('LC_ALL=C zfs list -H -t snapshot -o name', shell=True)
line = line.decode('UTF-8') line = line.decode('UTF-8')
if line.startswith('{}/'.format(server_settings['zfs-base'])): if line.startswith('{}/'.format(server_settings['zfs-base'])):
dataset, snapname = line.split('@', 1) try:
dataset, snapname = line.split('@', 1)
dataset = dataset.split('/')[-1] dataset = dataset.split('/')[-1]
ts, bucket = snapname.split('-', 1) ts, bucket = snapname.split('-', 1)
if not ts.isdigit(): snapshots[dataset].add(int(ts))
# garbage, ignore except Exception as e:
continue print(f"Exception while parsing snapshot name {line!r}: {e!r}")
snapshots[dataset].add(int(ts))
backups = {} backups = {}
for dataset, snaps in snapshots.items(): for dataset, snaps in snapshots.items():

View file

@ -83,47 +83,24 @@ def zfs_pool(metadata):
devices = metadata.get('backup-server/encrypted-devices') devices = metadata.get('backup-server/encrypted-devices')
# TODO remove this once we have migrated all systems pool_devices = set()
if isinstance(devices, dict):
pool_devices = set()
for number, (device, passphrase) in enumerate(sorted(devices.items())): for device, dconfig in devices.items():
crypt_devices[device] = { crypt_devices[dconfig['device']] = {
'dm-name': f'backup{number}', 'dm-name': f'backup-{device}',
'passphrase': passphrase, 'passphrase': dconfig['passphrase'],
} }
pool_devices.add(f'/dev/mapper/backup{number}') pool_devices.add(f'/dev/mapper/backup-{device}')
unlock_actions.add(f'action:dm-crypt_open_backup{number}') unlock_actions.add(f'action:dm-crypt_open_backup-{device}')
pool_config = [{ pool_config = [{
'devices': pool_devices, 'devices': pool_devices,
}] }]
if len(pool_devices) > 2: if len(pool_devices) > 2:
pool_config[0]['type'] = 'raidz' pool_config[0]['type'] = 'raidz'
elif len(pool_devices) > 1: elif len(pool_devices) > 1:
pool_config[0]['type'] = 'mirror' pool_config[0]['type'] = 'mirror'
elif isinstance(devices, list):
pool_config = []
for idx, intended_pool in enumerate(devices):
pool_devices = set()
for number, (device, passphrase) in enumerate(sorted(intended_pool.items())):
crypt_devices[device] = {
'dm-name': f'backup{idx}-{number}',
'passphrase': passphrase,
}
pool_devices.add(f'/dev/mapper/backup{idx}-{number}')
unlock_actions.add(f'action:dm-crypt_open_backup{idx}-{number}')
pool_config.append({
'devices': pool_devices,
'type': 'raidz',
})
else:
raise BundleError(f'{node.name}: unsupported configuration for backup-server/encrypted-devices')
return { return {
'backup-server': { 'backup-server': {