From 9b1f85479b9b792475cfed6875a803937b7a96e3 Mon Sep 17 00:00:00 2001 From: "Othman H. Suseno" Date: Wed, 14 Jan 2026 04:32:42 +0000 Subject: [PATCH] move work logs --- backend/internal/shares/service.go | 58 ++++++++++++++----- .../logs/BUILD-COMPLETE.md | 0 .../logs/CHECK-BACKEND-LOGS.md | 0 .../logs/COMPONENT-REVIEW.md | 0 .../logs/DATABASE-CHECK-REPORT.md | 0 .../logs/DATABASE-SETUP-COMPLETE.md | 0 .../logs/DATASET-MOUNTPOINT-VALIDATION.md | 0 .../logs/DEFAULT-USER-CREDENTIALS.md | 0 .../logs/FRONTEND-ACCESS-SETUP.md | 0 .../logs/MINIO-INSTALLATION-RECOMMENDATION.md | 0 .../logs/MINIO-INTEGRATION-COMPLETE.md | 0 .../logs/PASSWORD-UPDATE-COMPLETE.md | 0 .../logs/PERMISSIONS-FIX-COMPLETE.md | 0 .../logs/PERMISSIONS-FIX-SUMMARY.md | 0 .../logs/PERMISSIONS-FIX.md | 0 .../logs/PERMISSIONS-SETUP.md | 0 .../logs/POOL-DELETE-MOUNTPOINT-CLEANUP.md | 0 .../logs/POOL-REFRESH-FIX.md | 0 .../logs/REBUILD-SCRIPT.md | 0 .../logs/REFRESH-POOLS-BUTTON.md | 0 .../logs/REFRESH-POOLS-UX-IMPROVEMENT.md | 0 .../logs/SECRETS-ENV-SETUP.md | 0 .../logs/SYSTEMD-SERVICE-SETUP.md | 0 .../logs/ZFS-MOUNTPOINT-FIX.md | 0 .../logs/ZFS-POOL-DELETE-UI-FIX.md | 0 .../logs/ZFS-POOL-UI-FIX.md | 0 26 files changed, 43 insertions(+), 15 deletions(-) rename BUILD-COMPLETE.md => docs/logs/BUILD-COMPLETE.md (100%) rename CHECK-BACKEND-LOGS.md => docs/logs/CHECK-BACKEND-LOGS.md (100%) rename COMPONENT-REVIEW.md => docs/logs/COMPONENT-REVIEW.md (100%) rename DATABASE-CHECK-REPORT.md => docs/logs/DATABASE-CHECK-REPORT.md (100%) rename DATABASE-SETUP-COMPLETE.md => docs/logs/DATABASE-SETUP-COMPLETE.md (100%) rename DATASET-MOUNTPOINT-VALIDATION.md => docs/logs/DATASET-MOUNTPOINT-VALIDATION.md (100%) rename DEFAULT-USER-CREDENTIALS.md => docs/logs/DEFAULT-USER-CREDENTIALS.md (100%) rename FRONTEND-ACCESS-SETUP.md => docs/logs/FRONTEND-ACCESS-SETUP.md (100%) rename MINIO-INSTALLATION-RECOMMENDATION.md => docs/logs/MINIO-INSTALLATION-RECOMMENDATION.md (100%) rename MINIO-INTEGRATION-COMPLETE.md => docs/logs/MINIO-INTEGRATION-COMPLETE.md (100%) rename PASSWORD-UPDATE-COMPLETE.md => docs/logs/PASSWORD-UPDATE-COMPLETE.md (100%) rename PERMISSIONS-FIX-COMPLETE.md => docs/logs/PERMISSIONS-FIX-COMPLETE.md (100%) rename PERMISSIONS-FIX-SUMMARY.md => docs/logs/PERMISSIONS-FIX-SUMMARY.md (100%) rename PERMISSIONS-FIX.md => docs/logs/PERMISSIONS-FIX.md (100%) rename PERMISSIONS-SETUP.md => docs/logs/PERMISSIONS-SETUP.md (100%) rename POOL-DELETE-MOUNTPOINT-CLEANUP.md => docs/logs/POOL-DELETE-MOUNTPOINT-CLEANUP.md (100%) rename POOL-REFRESH-FIX.md => docs/logs/POOL-REFRESH-FIX.md (100%) rename REBUILD-SCRIPT.md => docs/logs/REBUILD-SCRIPT.md (100%) rename REFRESH-POOLS-BUTTON.md => docs/logs/REFRESH-POOLS-BUTTON.md (100%) rename REFRESH-POOLS-UX-IMPROVEMENT.md => docs/logs/REFRESH-POOLS-UX-IMPROVEMENT.md (100%) rename SECRETS-ENV-SETUP.md => docs/logs/SECRETS-ENV-SETUP.md (100%) rename SYSTEMD-SERVICE-SETUP.md => docs/logs/SYSTEMD-SERVICE-SETUP.md (100%) rename ZFS-MOUNTPOINT-FIX.md => docs/logs/ZFS-MOUNTPOINT-FIX.md (100%) rename ZFS-POOL-DELETE-UI-FIX.md => docs/logs/ZFS-POOL-DELETE-UI-FIX.md (100%) rename ZFS-POOL-UI-FIX.md => docs/logs/ZFS-POOL-UI-FIX.md (100%) diff --git a/backend/internal/shares/service.go b/backend/internal/shares/service.go index 1919146..78432cd 100644 --- a/backend/internal/shares/service.go +++ b/backend/internal/shares/service.go @@ -538,11 +538,11 @@ func (s *Service) applyNFSExport(ctx context.Context, mountPoint, options string clientList = strings.Join(clients, " ") } - // Build export line + // Build export line (format: /path client(options)) exportLine := fmt.Sprintf("%s %s(%s)", mountPoint, clientList, options) - // Read current /etc/exports - exportsPath := "/etc/exports" + // Read current exports file (use actual config file, not symlink) + exportsPath := "/opt/calypso/conf/nfs/exports" exportsContent, err := os.ReadFile(exportsPath) if err != nil && !os.IsNotExist(err) { return fmt.Errorf("failed to read exports file: %w", err) @@ -574,29 +574,43 @@ func (s *Service) applyNFSExport(ctx context.Context, mountPoint, options string newLines = append(newLines, exportLine) } - // Write back to file + // Write back to file (use sudo to ensure proper permissions) newContent := strings.Join(newLines, "\n") + "\n" - if err := os.WriteFile(exportsPath, []byte(newContent), 0644); err != nil { - return fmt.Errorf("failed to write exports file: %w", err) + tempFile := exportsPath + ".tmp" + if err := os.WriteFile(tempFile, []byte(newContent), 0644); err != nil { + return fmt.Errorf("failed to write temporary exports file: %w", err) + } + + // Move temp file to actual location using sudo + cmd := exec.CommandContext(ctx, "sudo", "mv", tempFile, exportsPath) + if output, err := cmd.CombinedOutput(); err != nil { + return fmt.Errorf("failed to move exports file: %s: %w", string(output), err) } - // Apply exports - cmd := exec.CommandContext(ctx, "sudo", "exportfs", "-ra") + // Apply exports (reload NFS exports) + cmd = exec.CommandContext(ctx, "sudo", "exportfs", "-ra") if output, err := cmd.CombinedOutput(); err != nil { return fmt.Errorf("failed to apply exports: %s: %w", string(output), err) } + + // Restart NFS service to ensure changes are picked up + cmd = exec.CommandContext(ctx, "sudo", "systemctl", "restart", "nfs-kernel-server") + if output, err := cmd.CombinedOutput(); err != nil { + s.logger.Warn("Failed to restart NFS service", "error", string(output)) + // Don't fail, as exportfs -ra should be sufficient + } s.logger.Info("NFS export applied", "mount_point", mountPoint, "clients", clientList) return nil } -// removeNFSExport removes an NFS export from /etc/exports +// removeNFSExport removes an NFS export from exports file func (s *Service) removeNFSExport(ctx context.Context, mountPoint string) error { if mountPoint == "" || mountPoint == "none" { return nil // Nothing to remove } - exportsPath := "/etc/exports" + exportsPath := "/opt/calypso/conf/nfs/exports" exportsContent, err := os.ReadFile(exportsPath) if err != nil { if os.IsNotExist(err) { @@ -623,20 +637,34 @@ func (s *Service) removeNFSExport(ctx context.Context, mountPoint string) error newLines = append(newLines, line) } - // Write back to file + // Write back to file (use sudo to ensure proper permissions) newContent := strings.Join(newLines, "\n") if newContent != "" && !strings.HasSuffix(newContent, "\n") { newContent += "\n" } - if err := os.WriteFile(exportsPath, []byte(newContent), 0644); err != nil { - return fmt.Errorf("failed to write exports file: %w", err) + tempFile := exportsPath + ".tmp" + if err := os.WriteFile(tempFile, []byte(newContent), 0644); err != nil { + return fmt.Errorf("failed to write temporary exports file: %w", err) + } + + // Move temp file to actual location using sudo + cmd := exec.CommandContext(ctx, "sudo", "mv", tempFile, exportsPath) + if output, err := cmd.CombinedOutput(); err != nil { + return fmt.Errorf("failed to move exports file: %s: %w", string(output), err) } - // Apply exports - cmd := exec.CommandContext(ctx, "sudo", "exportfs", "-ra") + // Apply exports (reload NFS exports) + cmd = exec.CommandContext(ctx, "sudo", "exportfs", "-ra") if output, err := cmd.CombinedOutput(); err != nil { return fmt.Errorf("failed to apply exports: %s: %w", string(output), err) } + + // Restart NFS service to ensure changes are picked up + cmd = exec.CommandContext(ctx, "sudo", "systemctl", "restart", "nfs-kernel-server") + if output, err := cmd.CombinedOutput(); err != nil { + s.logger.Warn("Failed to restart NFS service", "error", string(output)) + // Don't fail, as exportfs -ra should be sufficient + } s.logger.Info("NFS export removed", "mount_point", mountPoint) return nil diff --git a/BUILD-COMPLETE.md b/docs/logs/BUILD-COMPLETE.md similarity index 100% rename from BUILD-COMPLETE.md rename to docs/logs/BUILD-COMPLETE.md diff --git a/CHECK-BACKEND-LOGS.md b/docs/logs/CHECK-BACKEND-LOGS.md similarity index 100% rename from CHECK-BACKEND-LOGS.md rename to docs/logs/CHECK-BACKEND-LOGS.md diff --git a/COMPONENT-REVIEW.md b/docs/logs/COMPONENT-REVIEW.md similarity index 100% rename from COMPONENT-REVIEW.md rename to docs/logs/COMPONENT-REVIEW.md diff --git a/DATABASE-CHECK-REPORT.md b/docs/logs/DATABASE-CHECK-REPORT.md similarity index 100% rename from DATABASE-CHECK-REPORT.md rename to docs/logs/DATABASE-CHECK-REPORT.md diff --git a/DATABASE-SETUP-COMPLETE.md b/docs/logs/DATABASE-SETUP-COMPLETE.md similarity index 100% rename from DATABASE-SETUP-COMPLETE.md rename to docs/logs/DATABASE-SETUP-COMPLETE.md diff --git a/DATASET-MOUNTPOINT-VALIDATION.md b/docs/logs/DATASET-MOUNTPOINT-VALIDATION.md similarity index 100% rename from DATASET-MOUNTPOINT-VALIDATION.md rename to docs/logs/DATASET-MOUNTPOINT-VALIDATION.md diff --git a/DEFAULT-USER-CREDENTIALS.md b/docs/logs/DEFAULT-USER-CREDENTIALS.md similarity index 100% rename from DEFAULT-USER-CREDENTIALS.md rename to docs/logs/DEFAULT-USER-CREDENTIALS.md diff --git a/FRONTEND-ACCESS-SETUP.md b/docs/logs/FRONTEND-ACCESS-SETUP.md similarity index 100% rename from FRONTEND-ACCESS-SETUP.md rename to docs/logs/FRONTEND-ACCESS-SETUP.md diff --git a/MINIO-INSTALLATION-RECOMMENDATION.md b/docs/logs/MINIO-INSTALLATION-RECOMMENDATION.md similarity index 100% rename from MINIO-INSTALLATION-RECOMMENDATION.md rename to docs/logs/MINIO-INSTALLATION-RECOMMENDATION.md diff --git a/MINIO-INTEGRATION-COMPLETE.md b/docs/logs/MINIO-INTEGRATION-COMPLETE.md similarity index 100% rename from MINIO-INTEGRATION-COMPLETE.md rename to docs/logs/MINIO-INTEGRATION-COMPLETE.md diff --git a/PASSWORD-UPDATE-COMPLETE.md b/docs/logs/PASSWORD-UPDATE-COMPLETE.md similarity index 100% rename from PASSWORD-UPDATE-COMPLETE.md rename to docs/logs/PASSWORD-UPDATE-COMPLETE.md diff --git a/PERMISSIONS-FIX-COMPLETE.md b/docs/logs/PERMISSIONS-FIX-COMPLETE.md similarity index 100% rename from PERMISSIONS-FIX-COMPLETE.md rename to docs/logs/PERMISSIONS-FIX-COMPLETE.md diff --git a/PERMISSIONS-FIX-SUMMARY.md b/docs/logs/PERMISSIONS-FIX-SUMMARY.md similarity index 100% rename from PERMISSIONS-FIX-SUMMARY.md rename to docs/logs/PERMISSIONS-FIX-SUMMARY.md diff --git a/PERMISSIONS-FIX.md b/docs/logs/PERMISSIONS-FIX.md similarity index 100% rename from PERMISSIONS-FIX.md rename to docs/logs/PERMISSIONS-FIX.md diff --git a/PERMISSIONS-SETUP.md b/docs/logs/PERMISSIONS-SETUP.md similarity index 100% rename from PERMISSIONS-SETUP.md rename to docs/logs/PERMISSIONS-SETUP.md diff --git a/POOL-DELETE-MOUNTPOINT-CLEANUP.md b/docs/logs/POOL-DELETE-MOUNTPOINT-CLEANUP.md similarity index 100% rename from POOL-DELETE-MOUNTPOINT-CLEANUP.md rename to docs/logs/POOL-DELETE-MOUNTPOINT-CLEANUP.md diff --git a/POOL-REFRESH-FIX.md b/docs/logs/POOL-REFRESH-FIX.md similarity index 100% rename from POOL-REFRESH-FIX.md rename to docs/logs/POOL-REFRESH-FIX.md diff --git a/REBUILD-SCRIPT.md b/docs/logs/REBUILD-SCRIPT.md similarity index 100% rename from REBUILD-SCRIPT.md rename to docs/logs/REBUILD-SCRIPT.md diff --git a/REFRESH-POOLS-BUTTON.md b/docs/logs/REFRESH-POOLS-BUTTON.md similarity index 100% rename from REFRESH-POOLS-BUTTON.md rename to docs/logs/REFRESH-POOLS-BUTTON.md diff --git a/REFRESH-POOLS-UX-IMPROVEMENT.md b/docs/logs/REFRESH-POOLS-UX-IMPROVEMENT.md similarity index 100% rename from REFRESH-POOLS-UX-IMPROVEMENT.md rename to docs/logs/REFRESH-POOLS-UX-IMPROVEMENT.md diff --git a/SECRETS-ENV-SETUP.md b/docs/logs/SECRETS-ENV-SETUP.md similarity index 100% rename from SECRETS-ENV-SETUP.md rename to docs/logs/SECRETS-ENV-SETUP.md diff --git a/SYSTEMD-SERVICE-SETUP.md b/docs/logs/SYSTEMD-SERVICE-SETUP.md similarity index 100% rename from SYSTEMD-SERVICE-SETUP.md rename to docs/logs/SYSTEMD-SERVICE-SETUP.md diff --git a/ZFS-MOUNTPOINT-FIX.md b/docs/logs/ZFS-MOUNTPOINT-FIX.md similarity index 100% rename from ZFS-MOUNTPOINT-FIX.md rename to docs/logs/ZFS-MOUNTPOINT-FIX.md diff --git a/ZFS-POOL-DELETE-UI-FIX.md b/docs/logs/ZFS-POOL-DELETE-UI-FIX.md similarity index 100% rename from ZFS-POOL-DELETE-UI-FIX.md rename to docs/logs/ZFS-POOL-DELETE-UI-FIX.md diff --git a/ZFS-POOL-UI-FIX.md b/docs/logs/ZFS-POOL-UI-FIX.md similarity index 100% rename from ZFS-POOL-UI-FIX.md rename to docs/logs/ZFS-POOL-UI-FIX.md