|
|
|
|
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{}
|
|
|
|
|
s.linkClear = linkClearState{}
|
|
|
|
|
return s.rebuildLocked()
|
|
|
|
|
}
|