aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/store
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/store')
-rw-r--r--pkg/store/service.go81
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)
+}