diff options
Diffstat (limited to 'pkg/store/service.go')
| -rw-r--r-- | pkg/store/service.go | 81 |
1 files changed, 81 insertions, 0 deletions
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) +} |
