Feature: ZFS Pool-Aktionen (Scrub, Resilver, Clear Errors) + Product-Spalte fix

- Backend: neue Endpoints POST /api/pools/{name}/clear und /resilver
- Frontend: Pool ⋮-Menü mit Scrub, Resilver, Clear Errors
- Product-Spalte im Status-Tab bricht jetzt korrekt um statt abgeschnitten zu werden

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-05 00:45:35 +02:00
parent 1dc55b189b
commit 6f6e8555af
3 changed files with 89 additions and 2 deletions
+32
View File
@@ -93,6 +93,38 @@ async def scrub_pool(pool_name: str, current_user: str = Depends(get_current_use
raise HTTPException(status_code=500, detail=str(e))
@router.post("/{pool_name}/clear")
async def clear_pool_errors(pool_name: str, current_user: str = Depends(get_current_user)):
"""
Clear error counters on pool
"""
try:
stdout, stderr, rc = zfs_runner.run_command(["zpool", "clear", pool_name])
if rc != 0:
raise HTTPException(status_code=400, detail=stderr.strip() or "Failed to clear errors")
return {"status": "success", "message": f"Errors cleared on {pool_name}"}
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.post("/{pool_name}/resilver")
async def resilver_pool(pool_name: str, current_user: str = Depends(get_current_user)):
"""
Start resilver on pool
"""
try:
stdout, stderr, rc = zfs_runner.run_command(["zpool", "resilver", pool_name])
if rc != 0:
raise HTTPException(status_code=400, detail=stderr.strip() or "Failed to start resilver")
return {"status": "success", "message": f"Resilver started on {pool_name}"}
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.post("/clear-cache")
async def clear_cache(current_user: str = Depends(get_current_user)):
"""