Skip to content

Commit

Permalink
Merge pull request #9 from systemli/Add-Logging-and-extract-Config
Browse files Browse the repository at this point in the history
♻️ Add Logging and extract Config
  • Loading branch information
0x46616c6b authored Oct 3, 2024
2 parents 322abaf + 5cf1a3e commit 57a6e59
Show file tree
Hide file tree
Showing 8 changed files with 195 additions and 57 deletions.
21 changes: 12 additions & 9 deletions adapter.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@ package main

import (
"bytes"
"errors"
"fmt"
"net"
"strings"

log "github.com/sirupsen/logrus"
)

// PostfixAdapter is an adapter for postfix postmap commands.
Expand All @@ -26,14 +29,14 @@ func (p *PostfixAdapter) AliasHandler(conn net.Conn) {

payload, err := p.payload(conn)
if err != nil {
fmt.Println("Error getting payload:", err.Error())
log.WithError(err).Error("Error getting payload")
_, _ = conn.Write([]byte("400 Error getting payload\n"))
return
}
email := strings.TrimSuffix(payload, "\n")
aliases, err := p.client.GetAliases(string(email))
if err != nil {
fmt.Println("Error fetching aliases:", err.Error())
log.WithError(err).WithField("email", email).Error("Error fetching aliases")
_, _ = conn.Write([]byte("400 Error fetching aliases\n"))
return
}
Expand All @@ -54,15 +57,15 @@ func (p *PostfixAdapter) DomainHandler(conn net.Conn) {

payload, err := p.payload(conn)
if err != nil {
fmt.Println("Error getting payload:", err.Error())
log.WithError(err).Error("Error getting payload")
_, _ = conn.Write([]byte("400 Error getting payload\n"))
return
}

domain := strings.TrimSuffix(payload, "\n")
exists, err := p.client.GetDomain(string(domain))
if err != nil {
fmt.Println("Error fetching domain:", err.Error())
log.WithError(err).WithField("domain", domain).Error("Error fetching domain")
_, _ = conn.Write([]byte("400 Error fetching domain\n"))
return
}
Expand All @@ -83,15 +86,15 @@ func (p *PostfixAdapter) MailboxHandler(conn net.Conn) {

payload, err := p.payload(conn)
if err != nil {
fmt.Println("Error getting payload:", err.Error())
log.WithError(err).Error("Error getting payload")
_, _ = conn.Write([]byte("400 Error getting payload\n"))
return
}

email := strings.TrimSuffix(payload, "\n")
exists, err := p.client.GetMailbox(string(email))
if err != nil {
fmt.Println("Error fetching mailbox:", err.Error())
log.WithError(err).WithField("email", email).Error("Error fetching mailbox")
_, _ = conn.Write([]byte("400 Error fetching mailbox\n"))
return
}
Expand All @@ -112,15 +115,15 @@ func (p *PostfixAdapter) SendersHandler(conn net.Conn) {

payload, err := p.payload(conn)
if err != nil {
fmt.Println("Error getting payload:", err.Error())
log.WithError(err).Error("Error getting payload")
_, _ = conn.Write([]byte("400 Error getting payload\n"))
return
}

email := strings.TrimSuffix(payload, "\n")
senders, err := p.client.GetSenders(string(email))
if err != nil {
fmt.Println("Error fetching senders:", err.Error())
log.WithError(err).WithField("email", email).Error("Error fetching senders")
_, _ = conn.Write([]byte("400 Error fetching senders\n"))
return
}
Expand All @@ -145,7 +148,7 @@ func (h *PostfixAdapter) payload(conn net.Conn) (string, error) {
data = bytes.Trim(data, "\x00")
parts := strings.Split(string(data), " ")
if len(parts) < 2 || parts[0] != "get" {
return "", fmt.Errorf("invalid command")
return "", errors.New("invalid or unsupported command")
}

return parts[1], nil
Expand Down
4 changes: 4 additions & 0 deletions adapter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import (
"context"
"crypto/rand"
"errors"
"io"
"log"
"math/big"
"net"
"sync"
Expand All @@ -23,6 +25,8 @@ type AdapterTestSuite struct {
func (s *AdapterTestSuite) SetupTest() {
s.wg = &sync.WaitGroup{}
s.ctx = context.Background()

log.SetOutput(io.Discard)
}

func (s *AdapterTestSuite) AfterTest(_, _ string) {
Expand Down
92 changes: 92 additions & 0 deletions config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package main

import (
"os"

log "github.com/sirupsen/logrus"
)

// Config is the configuration for the application.
type Config struct {
// UserliToken is the token for the userli service.
UserliToken string

// UserliBaseURL is the base URL for the userli service.
UserliBaseURL string

// AliasListenAddr is the address to listen for alias requests.
AliasListenAddr string

// DomainListenAddr is the address to listen for domain requests.
DomainListenAddr string

// MailboxListenAddr is the address to listen for mailbox requests.
MailboxListenAddr string

// SendersListenAddr is the address to listen for senders requests.
SendersListenAddr string
}

// NewConfig creates a new Config with default values.
func NewConfig() *Config {
logLevel := os.Getenv("LOG_LEVEL")
if logLevel == "" {
logLevel = "info"
}

logFormat := os.Getenv("LOG_FORMAT")
if logFormat == "" {
logFormat = "text"
}

level, err := log.ParseLevel(logLevel)
if err != nil {
log.WithError(err).Fatal("Failed to parse log level")
}
log.SetLevel(level)

if logFormat == "json" {
log.SetFormatter(&log.JSONFormatter{})
} else {
log.SetFormatter(&log.TextFormatter{})
}

userliBaseURL := os.Getenv("USERLI_BASE_URL")
if userliBaseURL == "" {
userliBaseURL = "http://localhost:8000"
}

userliToken := os.Getenv("USERLI_TOKEN")
if userliToken == "" {
log.Fatal("USERLI_TOKEN is required")
}

aliasListenAddr := os.Getenv("ALIAS_LISTEN_ADDR")
if aliasListenAddr == "" {
aliasListenAddr = ":10001"
}

domainListenAddr := os.Getenv("DOMAIN_LISTEN_ADDR")
if domainListenAddr == "" {
domainListenAddr = ":10002"
}

mailboxListenAddr := os.Getenv("MAILBOX_LISTEN_ADDR")
if mailboxListenAddr == "" {
mailboxListenAddr = ":10003"
}

sendersListenAddr := os.Getenv("SENDERS_LISTEN_ADDR")
if sendersListenAddr == "" {
sendersListenAddr = ":10004"
}

return &Config{
UserliBaseURL: userliBaseURL,
UserliToken: userliToken,
AliasListenAddr: aliasListenAddr,
DomainListenAddr: domainListenAddr,
MailboxListenAddr: mailboxListenAddr,
SendersListenAddr: sendersListenAddr,
}
}
61 changes: 61 additions & 0 deletions config_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package main

import (
"os"
"testing"

"github.com/stretchr/testify/suite"

log "github.com/sirupsen/logrus"
)

type ConfigTestSuite struct {
suite.Suite
}

func (s *ConfigTestSuite) TestNewConfig() {
s.Run("fail when userli token not set", func() {
defer func() { log.StandardLogger().ExitFunc = nil }()
var fatal bool
log.StandardLogger().ExitFunc = func(int) { fatal = true }

_ = NewConfig()

s.True(fatal)
})

s.Run("default config", func() {
os.Setenv("USERLI_TOKEN", "token")

config := NewConfig()

s.Equal("token", config.UserliToken)
s.Equal("http://localhost:8000", config.UserliBaseURL)
s.Equal(":10001", config.AliasListenAddr)
s.Equal(":10002", config.DomainListenAddr)
s.Equal(":10003", config.MailboxListenAddr)
s.Equal(":10004", config.SendersListenAddr)
})

s.Run("custom config", func() {
os.Setenv("USERLI_TOKEN", "token")
os.Setenv("USERLI_BASE_URL", "http://example.com")
os.Setenv("ALIAS_LISTEN_ADDR", ":20001")
os.Setenv("DOMAIN_LISTEN_ADDR", ":20002")
os.Setenv("MAILBOX_LISTEN_ADDR", ":20003")
os.Setenv("SENDERS_LISTEN_ADDR", ":20004")

config := NewConfig()

s.Equal("token", config.UserliToken)
s.Equal("http://example.com", config.UserliBaseURL)
s.Equal(":20001", config.AliasListenAddr)
s.Equal(":20002", config.DomainListenAddr)
s.Equal(":20003", config.MailboxListenAddr)
s.Equal(":20004", config.SendersListenAddr)
})
}

func TestConfig(t *testing.T) {
suite.Run(t, new(ConfigTestSuite))
}
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/stretchr/objx v0.5.2 // indirect
golang.org/x/sys v0.25.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
9 changes: 9 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/h2non/gock v1.2.0 h1:K6ol8rfrRkUOefooBC8elXoaNGYkpp7y2qcxGG6BzUE=
Expand All @@ -8,11 +9,19 @@ github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32 h1:W6apQkHrMkS0Muv8G/TipAy
github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
52 changes: 8 additions & 44 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,52 +2,16 @@ package main

import (
"context"
"fmt"
"os"
"os/signal"
"sync"
"syscall"
)

var (
userliToken string
userliBaseURL string
aliasListenAddr string
log "github.com/sirupsen/logrus"
)

func main() {
userliBaseURL = os.Getenv("USERLI_BASE_URL")
if userliBaseURL == "" {
userliBaseURL = "http://localhost:8000"
}

userliToken = os.Getenv("USERLI_TOKEN")
if userliToken == "" {
fmt.Println("USERLI_TOKEN is required")
os.Exit(1)
}

aliasListenAddr = os.Getenv("ALIAS_LISTEN_ADDR")
if aliasListenAddr == "" {
aliasListenAddr = ":10001"
}

domainListenAddr := os.Getenv("DOMAIN_LISTEN_ADDR")
if domainListenAddr == "" {
domainListenAddr = ":10002"
}

mailboxListenAddr := os.Getenv("MAILBOX_LISTEN_ADDR")
if mailboxListenAddr == "" {
mailboxListenAddr = ":10003"
}

sendersListenAddr := os.Getenv("SENDERS_LISTEN_ADDR")
if sendersListenAddr == "" {
sendersListenAddr = ":10004"
}

userli := NewUserli(userliToken, userliBaseURL)
config := NewConfig()
userli := NewUserli(config.UserliToken, config.UserliBaseURL)
adapter := NewPostfixAdapter(userli)

ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
Expand All @@ -56,11 +20,11 @@ func main() {
var wg sync.WaitGroup

wg.Add(4)
go StartTCPServer(ctx, &wg, aliasListenAddr, adapter.AliasHandler)
go StartTCPServer(ctx, &wg, domainListenAddr, adapter.DomainHandler)
go StartTCPServer(ctx, &wg, mailboxListenAddr, adapter.MailboxHandler)
go StartTCPServer(ctx, &wg, sendersListenAddr, adapter.SendersHandler)
go StartTCPServer(ctx, &wg, config.AliasListenAddr, adapter.AliasHandler)
go StartTCPServer(ctx, &wg, config.DomainListenAddr, adapter.DomainHandler)
go StartTCPServer(ctx, &wg, config.MailboxListenAddr, adapter.MailboxHandler)
go StartTCPServer(ctx, &wg, config.SendersListenAddr, adapter.SendersHandler)

wg.Wait()
fmt.Println("Servers stopped")
log.Info("All servers stopped")
}
Loading

0 comments on commit 57a6e59

Please sign in to comment.