package hostguard import ( "context" "os" "path/filepath" "strings" ) func (g Guard) PendingFences(ctx context.Context) ([]FenceTarget, error) { return g.pendingFences(ctx, true) } func (g Guard) PendingStopFences(ctx context.Context) ([]FenceTarget, error) { return g.pendingFences(ctx, false) } func (g Guard) pendingFences(ctx context.Context, handovers bool) ([]FenceTarget, error) { if g.FenceView != nil { return nil, ErrUnsupported } names, err := g.recordNames() if err != nil { return nil, err } var out []FenceTarget for _, name := range names { if !strings.HasSuffix(name, ".json") { continue } host := strings.TrimSuffix(name, ".json") err := g.readLocked(ctx, host, func(d *recordDir) error { r, err := d.read(host) if err != nil { return err } if r.ActiveFence == nil || (!handovers && r.root && r.barrier != nil && *r.barrier == *r.ActiveFence) { return nil } for _, receipt := range r.FenceJournal { if receipt.Target == *r.ActiveFence { return nil } } out = append(out, *r.ActiveFence) return nil }) if err != nil { return nil, err } } return out, nil } func (g Guard) ResumeFence(ctx context.Context, target FenceTarget) error { return g.fenceLocked(ctx, target.Host, Captured{Incarnation: target.Incarnation, Stamp: target.Stamp}, func(d *recordDir) error { r, err := d.read(target.Host) if err != nil { return err } if r.ActiveFence == nil || *r.ActiveFence != target { return ErrFenceTarget } return nil }) } func (g Guard) ExistingFence(ctx context.Context, want FenceTarget) (FenceTarget, error) { var found FenceTarget err := g.fenceLocked(ctx, want.Host, Captured{Incarnation: want.Incarnation, Stamp: want.Stamp}, func(d *recordDir) error { r, err := d.read(want.Host) if err != nil { return err } if r.ActiveFence == nil || !r.ActiveFence.sameAuthority(want) { return ErrFenceTarget } found = *r.ActiveFence return nil }) return found, err } func (g Guard) recordNames() ([]string, error) { if g.Root != nil { return g.Root.store.Names() } entries, err := os.ReadDir(filepath.Join(g.DataDir, "hostguard")) if err != nil { return nil, err } var names []string for _, entry := range entries { if !entry.IsDir() { names = append(names, entry.Name()) } } return names, nil }