package logstorage import ( "fmt" "os" "path/filepath" ) // FactoryReset removes every journal and export file, even corrupted segments. // Only fixed service-owned buckets are touched; no path comes from the caller. func (s *Store) FactoryReset() error { s.mu.Lock() defer s.mu.Unlock() for _, bucket := range []string{"audit", "system", "port", "index", "export"} { dir := filepath.Join(s.root, bucket) info, err := os.Lstat(dir) if err != nil { return err } if !info.IsDir() || info.Mode()&os.ModeSymlink != 0 { return fmt.Errorf("unsafe log bucket %s", dir) } entries, err := os.ReadDir(dir) if err != nil { return err } for _, entry := range entries { target := filepath.Join(dir, entry.Name()) if filepath.Dir(target) != dir { return fmt.Errorf("unsafe log entry %s", target) } // RemoveAll unlinks symlinks; it never follows them outside the bucket. if err := os.RemoveAll(target); err != nil { return err } } if err := syncDirectory(dir); err != nil { return err } } s.portClears = portClearState{} s.systemClear = systemClearState{} return s.rebuildLocked() }