66 lines
2.2 KiB
Go
66 lines
2.2 KiB
Go
package app
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/miekg/dns"
|
|
|
|
"github.com/owen/vibedns/internal/auditlog"
|
|
"github.com/owen/vibedns/internal/cache"
|
|
)
|
|
|
|
// CacheStats returns the cache counters for the dashboard and cache page.
|
|
func (a *App) CacheStats() cache.Stats { return a.Cache.Stats() }
|
|
|
|
// CacheEntries browses the cache.
|
|
func (a *App) CacheEntries(search string, limit, offset int) ([]cache.EntryView, int) {
|
|
return a.Cache.Entries(search, limit, offset)
|
|
}
|
|
|
|
// FlushCache empties the resolver cache.
|
|
func (a *App) FlushCache(ctx context.Context, actor auditlog.Actor) (int, error) {
|
|
n := a.Cache.Flush()
|
|
a.Audit.Record(ctx, actor, "cache.flush", auditlog.ObjectCache, "", "resolver cache",
|
|
auditlog.Changes("entries", fmt.Sprint(n)))
|
|
return n, nil
|
|
}
|
|
|
|
// FlushCacheName removes every cached entry for one name.
|
|
func (a *App) FlushCacheName(ctx context.Context, actor auditlog.Actor, name string) (int, error) {
|
|
name = strings.TrimSpace(name)
|
|
if name == "" {
|
|
return 0, Invalid("Enter a name to remove from the cache.")
|
|
}
|
|
n := a.Cache.FlushName(name)
|
|
if n == 0 {
|
|
return 0, NotFound("%s is not in the cache.", strings.TrimSuffix(dns.Fqdn(name), "."))
|
|
}
|
|
a.Audit.Record(ctx, actor, "cache.flush_name", auditlog.ObjectCache, "", name,
|
|
auditlog.Changes("entries", fmt.Sprint(n)))
|
|
return n, nil
|
|
}
|
|
|
|
// DeleteCacheEntry removes one specific cached response.
|
|
func (a *App) DeleteCacheEntry(ctx context.Context, actor auditlog.Actor, name, qtype string, do bool) error {
|
|
name = strings.ToLower(dns.Fqdn(strings.TrimSpace(name)))
|
|
t, ok := dns.StringToType[strings.ToUpper(strings.TrimSpace(qtype))]
|
|
if !ok {
|
|
return Invalid("%q is not a known record type.", qtype)
|
|
}
|
|
key := cache.Key{Name: name, Type: t, Class: dns.ClassINET, DO: do}
|
|
if !a.Cache.Delete(key) {
|
|
return NotFound("%s %s is not in the cache.", strings.TrimSuffix(name, "."), strings.ToUpper(qtype))
|
|
}
|
|
a.Audit.Record(ctx, actor, "cache.delete_entry", auditlog.ObjectCache, "", key.String(), "")
|
|
return nil
|
|
}
|
|
|
|
// ResetStats zeroes the runtime counters.
|
|
func (a *App) ResetStats(ctx context.Context, actor auditlog.Actor) {
|
|
a.Metrics.Reset()
|
|
a.Cache.ResetStats()
|
|
a.Audit.Record(ctx, actor, "stats.reset", auditlog.ObjectCache, "", "statistics", "")
|
|
}
|