factory reset permissions bug
This commit is contained in:
parent
c6b4e840ac
commit
bef3ad4501
2 changed files with 43 additions and 2 deletions
|
|
@ -1127,6 +1127,39 @@ class ContainerManager:
|
||||||
else:
|
else:
|
||||||
yield False, "Some errors occurred during service restart", False
|
yield False, "Some errors occurred during service restart", False
|
||||||
|
|
||||||
|
async def clear_directory_with_container(self, path: Path) -> tuple[bool, str]:
|
||||||
|
"""Clear a directory using a container to handle container-owned files.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
path: The directory to clear (contents will be deleted, directory recreated)
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Tuple of (success, message)
|
||||||
|
"""
|
||||||
|
if not self.is_available():
|
||||||
|
return False, "No container runtime available"
|
||||||
|
|
||||||
|
if not path.exists():
|
||||||
|
return True, "Directory does not exist, nothing to clear"
|
||||||
|
|
||||||
|
path = path.absolute()
|
||||||
|
|
||||||
|
# Use alpine container to delete files owned by container user
|
||||||
|
cmd = [
|
||||||
|
"run", "--rm",
|
||||||
|
"-v", f"{path}:/work:Z",
|
||||||
|
"alpine",
|
||||||
|
"sh", "-c",
|
||||||
|
"rm -rf /work/* /work/.[!.]* 2>/dev/null; echo done"
|
||||||
|
]
|
||||||
|
|
||||||
|
success, stdout, stderr = await self._run_runtime_command(cmd)
|
||||||
|
|
||||||
|
if success and "done" in stdout:
|
||||||
|
return True, f"Cleared {path}"
|
||||||
|
else:
|
||||||
|
return False, f"Failed to clear {path}: {stderr or 'Unknown error'}"
|
||||||
|
|
||||||
async def clear_opensearch_data_volume(self) -> AsyncIterator[tuple[bool, str]]:
|
async def clear_opensearch_data_volume(self) -> AsyncIterator[tuple[bool, str]]:
|
||||||
"""Clear opensearch data using a temporary container with proper permissions."""
|
"""Clear opensearch data using a temporary container with proper permissions."""
|
||||||
if not self.is_available():
|
if not self.is_available():
|
||||||
|
|
|
||||||
|
|
@ -494,14 +494,22 @@ class MonitorScreen(Screen):
|
||||||
flows_backup_path = flows_path / "backup"
|
flows_backup_path = flows_path / "backup"
|
||||||
|
|
||||||
if config_path.exists():
|
if config_path.exists():
|
||||||
shutil.rmtree(config_path)
|
# Use container to handle files owned by container user
|
||||||
|
success, msg = await self.container_manager.clear_directory_with_container(config_path)
|
||||||
|
if not success:
|
||||||
|
# Fallback to regular rmtree if container method fails
|
||||||
|
shutil.rmtree(config_path)
|
||||||
# Recreate empty config directory
|
# Recreate empty config directory
|
||||||
config_path.mkdir(parents=True, exist_ok=True)
|
config_path.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
# Delete flow backups only if user chose to (and they actually exist)
|
# Delete flow backups only if user chose to (and they actually exist)
|
||||||
if self._check_flow_backups():
|
if self._check_flow_backups():
|
||||||
if delete_backups:
|
if delete_backups:
|
||||||
shutil.rmtree(flows_backup_path)
|
# Use container to handle files owned by container user
|
||||||
|
success, msg = await self.container_manager.clear_directory_with_container(flows_backup_path)
|
||||||
|
if not success:
|
||||||
|
# Fallback to regular rmtree if container method fails
|
||||||
|
shutil.rmtree(flows_backup_path)
|
||||||
# Recreate empty backup directory
|
# Recreate empty backup directory
|
||||||
flows_backup_path.mkdir(parents=True, exist_ok=True)
|
flows_backup_path.mkdir(parents=True, exist_ok=True)
|
||||||
self.notify("Flow backups deleted", severity="information")
|
self.notify("Flow backups deleted", severity="information")
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue