Browse Source

remove old deprecated backend system

flashmob 8 years ago
parent
commit
60494c11ed
4 changed files with 23 additions and 286 deletions
  1. 7 17
      backends/backend.go
  2. 0 37
      backends/dummy.go
  3. 16 16
      backends/p_guerrilla_db_redis.go
  4. 0 216
      backends/proxy.go

+ 7 - 17
backends/backend.go

@@ -14,12 +14,10 @@ import (
 var (
 var (
 	Svc *Service
 	Svc *Service
 
 
-	// deprecated backends system
-	backends = map[string]Backend{}
 	// Store the constructor for making an new processor decorator.
 	// Store the constructor for making an new processor decorator.
 	processors map[string]processorConstructor
 	processors map[string]processorConstructor
 
 
-	b Backend // todo make sure legacy works
+	b Backend
 )
 )
 
 
 func init() {
 func init() {
@@ -129,21 +127,13 @@ func (e Errors) Error() string {
 // backendConfig
 // backendConfig
 func New(backendName string, backendConfig BackendConfig, l log.Logger) (Backend, error) {
 func New(backendName string, backendConfig BackendConfig, l log.Logger) (Backend, error) {
 	Svc.StoreMainlog(l)
 	Svc.StoreMainlog(l)
-	if backend, found := backends[backendName]; found {
-		err := backend.Initialize(backendConfig)
-		if err != nil {
-			return nil, fmt.Errorf("error while initializing the backend: %s", err)
-		}
-		b = backend
-	} else {
-		gateway := &BackendGateway{config: backendConfig}
-		err := gateway.Initialize(backendConfig)
-		if err != nil {
-			return nil, fmt.Errorf("error while initializing the backend: %s", err)
-		}
-		gateway.State = BackendStateRunning
-		b = Backend(gateway)
+	gateway := &BackendGateway{config: backendConfig}
+	err := gateway.Initialize(backendConfig)
+	if err != nil {
+		return nil, fmt.Errorf("error while initializing the backend: %s", err)
 	}
 	}
+	gateway.State = BackendStateRunning
+	b = Backend(gateway)
 	return b, nil
 	return b, nil
 }
 }
 
 

+ 0 - 37
backends/dummy.go

@@ -1,37 +0,0 @@
-package backends
-
-func init() {
-	// decorator pattern
-	backends["dummy"] = &AbstractBackend{
-		extend: &DummyBackend{},
-	}
-}
-
-// custom configuration we will parse from the json
-// see guerrillaDBAndRedisConfig struct for a more complete example
-type dummyConfig struct {
-	LogReceivedMails bool `json:"log_received_mails"`
-}
-
-// putting all the paces we need together
-type DummyBackend struct {
-	config dummyConfig
-	// embed functions form AbstractBackend so that DummyBackend satisfies the Backend interface
-	AbstractBackend
-}
-
-// Backends should implement this method and set b.config field with a custom config struct
-// Therefore, your implementation would have a custom config type instead of dummyConfig
-func (b *DummyBackend) loadConfig(backendConfig BackendConfig) (err error) {
-	// Load the backend config for the backend. It has already been unmarshalled
-	// from the main config file 'backend' config "backend_config"
-	// Now we need to convert each type and copy into the dummyConfig struct
-	configType := baseConfig(&dummyConfig{})
-	bcfg, err := b.extractConfig(backendConfig, configType)
-	if err != nil {
-		return err
-	}
-	m := bcfg.(*dummyConfig)
-	b.config = *m
-	return nil
-}

+ 16 - 16
backends/p_guerrilla_db_redis.go

@@ -68,7 +68,7 @@ func convertError(name string) error {
 // from the main config file 'backend' config "backend_config"
 // from the main config file 'backend' config "backend_config"
 // Now we need to convert each type and copy into the guerrillaDBAndRedisConfig struct
 // Now we need to convert each type and copy into the guerrillaDBAndRedisConfig struct
 func (g *GuerrillaDBAndRedisBackend) loadConfig(backendConfig BackendConfig) (err error) {
 func (g *GuerrillaDBAndRedisBackend) loadConfig(backendConfig BackendConfig) (err error) {
-	configType := baseConfig(&guerrillaDBAndRedisConfig{})
+	configType := BaseConfig(&guerrillaDBAndRedisConfig{})
 	bcfg, err := Svc.ExtractConfig(backendConfig, configType)
 	bcfg, err := Svc.ExtractConfig(backendConfig, configType)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
@@ -164,7 +164,7 @@ func (g *GuerrillaDBAndRedisBackend) prepareInsertQuery(rows int, db *sql.DB) *s
 	}
 	}
 	stmt, sqlErr := db.Prepare(sqlstr)
 	stmt, sqlErr := db.Prepare(sqlstr)
 	if sqlErr != nil {
 	if sqlErr != nil {
-		mainlog.WithError(sqlErr).Fatalf("failed while db.Prepare(INSERT...)")
+		Log().WithError(sqlErr).Fatalf("failed while db.Prepare(INSERT...)")
 	}
 	}
 	// cache it
 	// cache it
 	g.cache[rows-1] = stmt
 	g.cache[rows-1] = stmt
@@ -176,14 +176,14 @@ func (g *GuerrillaDBAndRedisBackend) doQuery(c int, db *sql.DB, insertStmt *sql.
 	defer func() {
 	defer func() {
 		if r := recover(); r != nil {
 		if r := recover(); r != nil {
 			//logln(1, fmt.Sprintf("Recovered in %v", r))
 			//logln(1, fmt.Sprintf("Recovered in %v", r))
-			mainlog.Error("Recovered form panic:", r, string(debug.Stack()))
+			Log().Error("Recovered form panic:", r, string(debug.Stack()))
 			sum := 0
 			sum := 0
 			for _, v := range *vals {
 			for _, v := range *vals {
 				if str, ok := v.(string); ok {
 				if str, ok := v.(string); ok {
 					sum = sum + len(str)
 					sum = sum + len(str)
 				}
 				}
 			}
 			}
-			mainlog.Errorf("panic while inserting query [%s] size:%d, err %v", r, sum, execErr)
+			Log().Errorf("panic while inserting query [%s] size:%d, err %v", r, sum, execErr)
 			panic("query failed")
 			panic("query failed")
 		}
 		}
 	}()
 	}()
@@ -191,7 +191,7 @@ func (g *GuerrillaDBAndRedisBackend) doQuery(c int, db *sql.DB, insertStmt *sql.
 	insertStmt = g.prepareInsertQuery(c, db)
 	insertStmt = g.prepareInsertQuery(c, db)
 	_, execErr = insertStmt.Exec(*vals...)
 	_, execErr = insertStmt.Exec(*vals...)
 	if execErr != nil {
 	if execErr != nil {
-		mainlog.WithError(execErr).Error("There was a problem the insert")
+		Log().WithError(execErr).Error("There was a problem the insert")
 	}
 	}
 }
 }
 
 
@@ -225,7 +225,7 @@ func (g *GuerrillaDBAndRedisBackend) insertQueryBatcher(feeder chan []interface{
 	}
 	}
 	defer func() {
 	defer func() {
 		if r := recover(); r != nil {
 		if r := recover(); r != nil {
-			mainlog.Error("insertQueryBatcher caught a panic", r)
+			Log().Error("insertQueryBatcher caught a panic", r)
 		}
 		}
 	}()
 	}()
 	// Keep getting values from feeder and add to batch.
 	// Keep getting values from feeder and add to batch.
@@ -237,14 +237,14 @@ func (g *GuerrillaDBAndRedisBackend) insertQueryBatcher(feeder chan []interface{
 		// it may panic when reading on a closed feeder channel. feederOK detects if it was closed
 		// it may panic when reading on a closed feeder channel. feederOK detects if it was closed
 		case row, feederOk := <-feeder:
 		case row, feederOk := <-feeder:
 			if row == nil {
 			if row == nil {
-				mainlog.Info("Query batchaer exiting")
+				Log().Info("Query batchaer exiting")
 				// Insert any remaining rows
 				// Insert any remaining rows
 				insert(count)
 				insert(count)
 				return feederOk
 				return feederOk
 			}
 			}
 			vals = append(vals, row...)
 			vals = append(vals, row...)
 			count++
 			count++
-			mainlog.Debug("new feeder row:", row, " cols:", len(row), " count:", count, " worker", workerId)
+			Log().Debug("new feeder row:", row, " cols:", len(row), " count:", count, " worker", workerId)
 			if count >= GuerrillaDBAndRedisBatchMax {
 			if count >= GuerrillaDBAndRedisBatchMax {
 				insert(GuerrillaDBAndRedisBatchMax)
 				insert(GuerrillaDBAndRedisBatchMax)
 			}
 			}
@@ -283,7 +283,7 @@ func (g *GuerrillaDBAndRedisBackend) mysqlConnect() (*sql.DB, error) {
 		Params:       map[string]string{"collation": "utf8_general_ci"},
 		Params:       map[string]string{"collation": "utf8_general_ci"},
 	}
 	}
 	if db, err := sql.Open("mysql", conf.FormatDSN()); err != nil {
 	if db, err := sql.Open("mysql", conf.FormatDSN()); err != nil {
-		mainlog.Error("cannot open mysql", err)
+		Log().Error("cannot open mysql", err)
 		return nil, err
 		return nil, err
 	} else {
 	} else {
 		return db, nil
 		return db, nil
@@ -326,7 +326,7 @@ func GuerrillaDbReddis() Decorator {
 		g.config = bcfg.(*guerrillaDBAndRedisConfig)
 		g.config = bcfg.(*guerrillaDBAndRedisConfig)
 		db, err = g.mysqlConnect()
 		db, err = g.mysqlConnect()
 		if err != nil {
 		if err != nil {
-			mainlog.Fatalf("cannot open mysql: %s", err)
+			Log().Fatalf("cannot open mysql: %s", err)
 		}
 		}
 		return nil
 		return nil
 	}))
 	}))
@@ -338,11 +338,11 @@ func GuerrillaDbReddis() Decorator {
 	go func() {
 	go func() {
 		for {
 		for {
 			if feederOK := g.insertQueryBatcher(feeder, db); !feederOK {
 			if feederOK := g.insertQueryBatcher(feeder, db); !feederOK {
-				mainlog.Debug("insertQueryBatcher exited")
+				Log().Debug("insertQueryBatcher exited")
 				return
 				return
 			}
 			}
 			// if insertQueryBatcher panics, it can recover and go in again
 			// if insertQueryBatcher panics, it can recover and go in again
-			mainlog.Debug("resuming insertQueryBatcher")
+			Log().Debug("resuming insertQueryBatcher")
 		}
 		}
 
 
 	}()
 	}()
@@ -350,11 +350,11 @@ func GuerrillaDbReddis() Decorator {
 	defer func() {
 	defer func() {
 		if r := recover(); r != nil {
 		if r := recover(); r != nil {
 			//recover form closed channel
 			//recover form closed channel
-			mainlog.Error("panic recovered in saveMailWorker", r)
+			Log().Error("panic recovered in saveMailWorker", r)
 		}
 		}
 		db.Close()
 		db.Close()
 		if redisClient.conn != nil {
 		if redisClient.conn != nil {
-			mainlog.Infof("closed redis")
+			Log().Infof("closed redis")
 			redisClient.conn.Close()
 			redisClient.conn.Close()
 		}
 		}
 		// close the feeder & wait for query batcher to exit.
 		// close the feeder & wait for query batcher to exit.
@@ -368,7 +368,7 @@ func GuerrillaDbReddis() Decorator {
 	return func(c Processor) Processor {
 	return func(c Processor) Processor {
 		return ProcessWith(func(e *envelope.Envelope, task SelectTask) (Result, error) {
 		return ProcessWith(func(e *envelope.Envelope, task SelectTask) (Result, error) {
 			if task == TaskSaveMail {
 			if task == TaskSaveMail {
-				mainlog.Debug("Got mail from chan", e.RemoteAddress)
+				Log().Debug("Got mail from chan", e.RemoteAddress)
 				to = trimToLimit(strings.TrimSpace(e.RcptTo[0].User)+"@"+g.config.PrimaryHost, 255)
 				to = trimToLimit(strings.TrimSpace(e.RcptTo[0].User)+"@"+g.config.PrimaryHost, 255)
 				e.Helo = trimToLimit(e.Helo, 255)
 				e.Helo = trimToLimit(e.Helo, 255)
 				e.RcptTo[0].Host = trimToLimit(e.RcptTo[0].Host, 255)
 				e.RcptTo[0].Host = trimToLimit(e.RcptTo[0].Host, 255)
@@ -402,7 +402,7 @@ func GuerrillaDbReddis() Decorator {
 						data.clear()   // blank
 						data.clear()   // blank
 					}
 					}
 				} else {
 				} else {
-					mainlog.WithError(redisErr).Warn("Error while connecting redis")
+					Log().WithError(redisErr).Warn("Error while connecting redis")
 				}
 				}
 
 
 				vals = []interface{}{} // clear the vals
 				vals = []interface{}{} // clear the vals

+ 0 - 216
backends/proxy.go

@@ -1,216 +0,0 @@
-package backends
-
-import (
-	"errors"
-	"fmt"
-	"github.com/flashmob/go-guerrilla/envelope"
-	"github.com/flashmob/go-guerrilla/log"
-	"sync"
-)
-
-// Deprecated: ProxyBackend makes it possible to use the old backend system
-type ProxyBackend struct {
-	config       proxyConfig
-	extend       proxy
-	saveMailChan chan *savePayload
-	State        backendState
-	// waits for backend workers to start/stop
-	wg sync.WaitGroup
-}
-
-// Deprecated: Use workerMsg instead
-type savePayload struct {
-	mail        *envelope.Envelope
-	from        *envelope.EmailAddress
-	recipient   *envelope.EmailAddress
-	savedNotify chan *saveStatus
-}
-
-// Deprecated: Use notifyMsg instead
-type saveStatus struct {
-	err  error
-	hash string
-}
-
-// Deprecated: Kept for compatibility, use BackendGateway instead
-// AbstractBackend is an alias ProxyBackend for back-compatibility.
-type AbstractBackend struct {
-	extend proxy
-	ProxyBackend
-}
-
-// extractConfig for compatibility only. Forward to Svc.ExtractConfig
-func (ac *AbstractBackend) extractConfig(configData BackendConfig, configType BaseConfig) (interface{}, error) {
-	return Svc.ExtractConfig(configData, configType)
-}
-
-// copy the extend field down to the Proxy
-func (ac *AbstractBackend) Initialize(config BackendConfig) error {
-	if ac.extend != nil {
-		ac.ProxyBackend.extend = ac.extend
-	}
-	return ac.ProxyBackend.Initialize(config)
-}
-
-// Deprecated: backeConfig is an alias to BaseConfig, use BaseConfig instead
-type baseConfig BaseConfig
-
-// Deprecated: Use Log() instead to get a hold of a logger
-var mainlog log.Logger
-
-// Deprecated: proxy may implement backend interface or any of the interfaces below
-type proxy interface{}
-
-//
-type saveMailWorker interface {
-	// start save mail worker(s)
-	saveMailWorker(chan *savePayload)
-}
-
-type numberOfWorkersGetter interface {
-	// get the number of workers that will be stared
-	getNumberOfWorkers() int
-}
-
-type settingsTester interface {
-	// test database settings, permissions, correct paths, etc, before starting workers
-	testSettings() error
-}
-
-type configLoader interface {
-	// parse the configuration files
-	loadConfig(BackendConfig) error
-}
-
-type proxyConfig struct {
-	LogReceivedMails bool `json:"log_received_mails"`
-}
-
-// Your backend should implement this method and set b.config field with a custom config struct
-// Therefore, your implementation would have your own custom config type instead of dummyConfig
-func (pb *ProxyBackend) loadConfig(backendConfig BackendConfig) (err error) {
-	// Load the backend config for the backend. It has already been unmarshalled
-	// from the main config file 'backend' config "backend_config"
-	// Now we need to convert each type and copy into the dummyConfig struct
-	configType := BaseConfig(&proxyConfig{})
-	bcfg, err := Svc.ExtractConfig(backendConfig, configType)
-	if err != nil {
-		return err
-	}
-	m := bcfg.(*proxyConfig)
-	pb.config = *m
-	return nil
-}
-
-func (pb *ProxyBackend) initialize(config BackendConfig) error {
-	if cl, ok := pb.extend.(configLoader); ok {
-		cl.loadConfig(config)
-	}
-	err := pb.loadConfig(config)
-	if err != nil {
-		return err
-	}
-	return nil
-}
-
-func (pb *ProxyBackend) Initialize(cfg BackendConfig) error {
-	err := pb.initialize(cfg)
-	if err == nil {
-		workersSize := pb.getNumberOfWorkers()
-		if workersSize < 1 {
-			pb.State = BackendStateError
-			return errors.New("Must have at least 1 worker")
-		}
-		if err := pb.testSettings(); err != nil {
-			pb.State = BackendStateError
-			return err
-		}
-		pb.saveMailChan = make(chan *savePayload, workersSize)
-		// start our savemail workers
-		pb.wg.Add(workersSize)
-		for i := 0; i < workersSize; i++ {
-			go func() {
-				pb.saveMailWorker(pb.saveMailChan)
-				pb.wg.Done()
-			}()
-		}
-	} else {
-		pb.State = BackendStateError
-	}
-	return err
-}
-
-func (pb *ProxyBackend) Shutdown() error {
-	if b, ok := pb.extend.(Backend); ok {
-		return b.Shutdown()
-	}
-	return nil
-}
-
-func (pb *ProxyBackend) ValidateRcpt(mail *envelope.Envelope) RcptError {
-	if b, ok := pb.extend.(Backend); ok {
-		return b.ValidateRcpt(mail)
-	}
-	return nil
-}
-
-func (pb *ProxyBackend) Process(mail *envelope.Envelope) Result {
-	if b, ok := pb.extend.(Backend); ok {
-		return b.Process(mail)
-	}
-	mail.ParseHeaders()
-
-	if pb.config.LogReceivedMails {
-		Log().Infof("Mail from: %s / to: %v", mail.MailFrom.String(), mail.RcptTo)
-		Log().Info("Headers are: %s", mail.Header)
-
-	}
-	return NewResult("250 OK")
-}
-
-func (pb *ProxyBackend) saveMailWorker(saveMailChan chan *savePayload) {
-	if s, ok := pb.extend.(saveMailWorker); ok {
-		s.saveMailWorker(saveMailChan)
-		return
-	}
-
-	defer func() {
-		if r := recover(); r != nil {
-			// recover form closed channel
-			fmt.Println("Recovered in f", r)
-		}
-		// close any connections / files
-		// ...
-
-	}()
-	for {
-		payload := <-saveMailChan
-		if payload == nil {
-			Log().Debug("No more saveMailChan payload")
-			return
-		}
-		// process the email here
-		result := pb.Process(payload.mail)
-		// if all good
-		if result.Code() < 300 {
-			payload.savedNotify <- &saveStatus{nil, "s0m3l337Ha5hva1u3LOL"}
-		} else {
-			payload.savedNotify <- &saveStatus{errors.New(result.String()), "s0m3l337Ha5hva1u3LOL"}
-		}
-
-	}
-}
-
-func (pb *ProxyBackend) getNumberOfWorkers() int {
-	if n, ok := pb.extend.(numberOfWorkersGetter); ok {
-		return n.getNumberOfWorkers()
-	}
-	return 1
-}
-
-func (b *ProxyBackend) testSettings() error {
-	if t, ok := b.extend.(settingsTester); ok {
-		return t.testSettings()
-	}
-	return nil
-}