diff --git a/cmd/mbf/main.go b/cmd/mbf/main.go index a4da0b84..ea10d3b7 100644 --- a/cmd/mbf/main.go +++ b/cmd/mbf/main.go @@ -506,6 +506,8 @@ func main() { flagExport string flagRemote bool flagNoReply bool + flagFaults bool + flagPop bool flagBoot bool flagStd bool @@ -614,6 +616,49 @@ func main() { } return err + + case flagFaults: + var faults []pkg.Fault + if err := cm.Do(func(cache *pkg.Cache) (err error) { + faults, err = cache.ReadFaults(t.Load(p)) + return + }); err != nil { + return err + } + + for _, fault := range faults { + log.Printf("%s: %s ago", fault.String(), time.Since(fault.Time())) + } + return nil + + case flagPop: + var faults []pkg.Fault + if err := cm.Do(func(cache *pkg.Cache) (err error) { + faults, err = cache.ReadFaults(t.Load(p)) + return + }); err != nil { + return err + } + + if len(faults) == 0 { + return errors.New("no fault entries found") + } + fault := faults[len(faults)-1] + r, err := fault.Open() + if err != nil { + return err + } + if _, err = io.Copy(os.Stdout, r); err != nil { + _ = r.Close() + return err + } + fmt.Println() + if err = r.Close(); err != nil { + return err + } + + log.Printf("faulting cure terminated %s ago", time.Since(fault.Time())) + return fault.Destroy() } }, ).Flag( @@ -644,9 +689,40 @@ func main() { &flagStd, "std", command.BoolFlag(false), "Build on the intermediate toolchain", + ).Flag( + &flagFaults, + "faults", command.BoolFlag(false), + "Display fault entries of the specified artifact", + ).Flag( + &flagPop, + "pop", command.BoolFlag(false), + "Display and destroy the most recent fault entry", ) } + c.NewCommand( + "clear", + "Remove all fault entries from the cache", + func([]string) error { + return cm.Do(func(*pkg.Cache) error { + pathname := filepath.Join(cm.base, "fault") + dents, err := os.ReadDir(pathname) + if err != nil { + return err + } + + for _, dent := range dents { + msg.Verbosef("destroying entry %s", dent.Name()) + if err = os.Remove(filepath.Join(pathname, dent.Name())); err != nil { + return err + } + } + log.Printf("destroyed %d fault entries", len(dents)) + return nil + }) + }, + ) + c.NewCommand( "abort", "Abort all pending cures on the daemon",