backup/datastore: prevent protected snapshots to be removed
by throwing an error for remove_backup_dir, and skipping for remove_backup_group Signed-off-by: Dominik Csapak <d.csapak@proxmox.com> Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
		
				
					committed by
					
						 Wolfgang Bumiller
						Wolfgang Bumiller
					
				
			
			
				
	
			
			
			
						parent
						
							fe9c47ab4f
						
					
				
				
					commit
					de91418b79
				
			| @ -266,8 +266,9 @@ impl DataStore { | ||||
|         full_path | ||||
|     } | ||||
|  | ||||
|     /// Remove a complete backup group including all snapshots | ||||
|     pub fn remove_backup_group(&self, backup_group: &BackupGroup) ->  Result<(), Error> { | ||||
|     /// Remove a complete backup group including all snapshots, returns true | ||||
|     /// if all snapshots were removed, and false if some were protected | ||||
|     pub fn remove_backup_group(&self, backup_group: &BackupGroup) ->  Result<bool, Error> { | ||||
|  | ||||
|         let full_path = self.group_path(backup_group); | ||||
|  | ||||
| @ -275,11 +276,18 @@ impl DataStore { | ||||
|  | ||||
|         log::info!("removing backup group {:?}", full_path); | ||||
|  | ||||
|         let mut removed_all = true; | ||||
|  | ||||
|         // remove all individual backup dirs first to ensure nothing is using them | ||||
|         for snap in backup_group.list_backups(&self.base_path())? { | ||||
|             if snap.backup_dir.is_protected(self.base_path()) { | ||||
|                 removed_all = false; | ||||
|                 continue; | ||||
|             } | ||||
|             self.remove_backup_dir(&snap.backup_dir, false)?; | ||||
|         } | ||||
|  | ||||
|         if removed_all { | ||||
|             // no snapshots left, we can now safely remove the empty folder | ||||
|             std::fs::remove_dir_all(&full_path) | ||||
|                 .map_err(|err| { | ||||
| @ -289,8 +297,9 @@ impl DataStore { | ||||
|                         err, | ||||
|                     ) | ||||
|                 })?; | ||||
|         } | ||||
|  | ||||
|         Ok(()) | ||||
|         Ok(removed_all) | ||||
|     } | ||||
|  | ||||
|     /// Remove a backup directory including all content | ||||
| @ -304,6 +313,10 @@ impl DataStore { | ||||
|             _manifest_guard = self.lock_manifest(backup_dir)?; | ||||
|         } | ||||
|  | ||||
|         if backup_dir.is_protected(self.base_path()) { | ||||
|             bail!("cannot remove protected snapshot"); | ||||
|         } | ||||
|  | ||||
|         log::info!("removing backup snapshot {:?}", full_path); | ||||
|         std::fs::remove_dir_all(&full_path) | ||||
|             .map_err(|err| { | ||||
|  | ||||
		Reference in New Issue
	
	Block a user