You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

45 lines
1.1 KiB

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()
}