From 2475f5a8b92ef0dd28e7af5f36d01b25243ed778 Mon Sep 17 00:00:00 2001 From: Leonardo Bishop Date: Thu, 6 Feb 2025 15:22:34 +0000 Subject: Initial commit --- pkg/store/service.go | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 pkg/store/service.go (limited to 'pkg/store') diff --git a/pkg/store/service.go b/pkg/store/service.go new file mode 100644 index 0000000..3a042fb --- /dev/null +++ b/pkg/store/service.go @@ -0,0 +1,81 @@ +package store + +import ( + "strings" + "time" + + "github.com/LMBishop/gunnel/pkg/wireguard" + "github.com/tjarratt/babble" +) + +type ForwardingRule struct { + Slug string + Peer *wireguard.Peer + Port string + LastUsed time.Time +} + +type Service interface { + GetRuleBySlug(slug string) *ForwardingRule + NewForwardingRule(slug string, peer *wireguard.Peer, port string) *ForwardingRule + RemoveForwardingRule(slug string) + GetUnusedSlug() string + GetUnusedRulesSince(since time.Time) []*ForwardingRule +} + +type service struct { + forwardingRules map[string]*ForwardingRule +} + +func NewService() Service { + return &service{ + forwardingRules: make(map[string]*ForwardingRule), + } +} + +func (s *service) GetRuleBySlug(slug string) *ForwardingRule { + return s.forwardingRules[slug] +} + +func (s *service) NewForwardingRule(slug string, peer *wireguard.Peer, port string) *ForwardingRule { + if s.forwardingRules[slug] != nil { + return nil + } + + rule := &ForwardingRule{ + Slug: slug, + Peer: peer, + Port: port, + } + s.forwardingRules[slug] = rule + return rule +} + +func (s *service) GetUnusedSlug() string { + b := babble.NewBabbler() + b.Count = 3 + b.Separator = "-" + + for i := 0; i < 10; i++ { + slug := strings.Replace(strings.ToLower(b.Babble()), "'", "", -1) + if s.forwardingRules[slug] == nil { + return slug + } + } + + return "" +} + +func (s *service) GetUnusedRulesSince(since time.Time) []*ForwardingRule { + var rules []*ForwardingRule + for _, rule := range s.forwardingRules { + if rule.LastUsed.Before(since) { + rules = append(rules, rule) + } + } + return rules +} + +func (s *service) RemoveForwardingRule(slug string) { + delete(s.forwardingRules, slug) +} -- cgit v1.2.3-70-g09d2