api.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package guerrilla
  2. import (
  3. "errors"
  4. "fmt"
  5. _ "fmt"
  6. "github.com/flashmob/go-guerrilla/backends"
  7. "github.com/flashmob/go-guerrilla/log"
  8. "io/ioutil"
  9. "os"
  10. )
  11. type SMTP struct {
  12. config *AppConfig
  13. logger log.Logger
  14. backend backends.Backend
  15. g Guerrilla
  16. }
  17. const defaultInterface = "127.0.0.1:2525"
  18. // configureDefaults fills in default server settings for values that were not configured
  19. func (s *SMTP) configureDefaults() error {
  20. if s.config.LogFile == "" {
  21. s.config.LogFile = log.OutputStderr.String()
  22. }
  23. if s.config.LogLevel == "" {
  24. s.config.LogLevel = "debug"
  25. }
  26. if len(s.config.AllowedHosts) == 0 {
  27. if h, err := os.Hostname(); err != nil {
  28. return err
  29. } else {
  30. s.config.AllowedHosts = append(s.config.AllowedHosts, h)
  31. }
  32. }
  33. h, err := os.Hostname()
  34. if err != nil {
  35. return err
  36. }
  37. if len(s.config.Servers) == 0 {
  38. sc := ServerConfig{}
  39. sc.LogFile = s.config.LogFile
  40. sc.ListenInterface = defaultInterface
  41. sc.IsEnabled = true
  42. sc.Hostname = h
  43. sc.MaxClients = 100
  44. sc.Timeout = 30
  45. sc.MaxSize = 10 << 20 // 10 Mebibytes
  46. s.config.Servers = append(s.config.Servers, sc)
  47. } else {
  48. // make sure each server has defaults correctly configured
  49. for i := range s.config.Servers {
  50. if s.config.Servers[i].Hostname == "" {
  51. s.config.Servers[i].Hostname = h
  52. }
  53. if s.config.Servers[i].MaxClients == 0 {
  54. s.config.Servers[i].MaxClients = 100
  55. }
  56. if s.config.Servers[i].Timeout == 0 {
  57. s.config.Servers[i].Timeout = 20
  58. }
  59. if s.config.Servers[i].MaxSize == 0 {
  60. s.config.Servers[i].MaxSize = 10 << 20 // 10 Mebibytes
  61. }
  62. if s.config.Servers[i].ListenInterface == "" {
  63. return errors.New(fmt.Sprintf("Listen interface not specified for server at index %d", i))
  64. }
  65. if s.config.Servers[i].LogFile == "" {
  66. s.config.Servers[i].LogFile = s.config.LogFile
  67. }
  68. // validate the server config
  69. err = s.config.Servers[i].Validate()
  70. if err != nil {
  71. return err
  72. }
  73. }
  74. }
  75. return nil
  76. }
  77. func (s *SMTP) configureDefaultBackend() error {
  78. h, err := os.Hostname()
  79. if err != nil {
  80. return err
  81. }
  82. if len(s.config.BackendConfig) == 0 {
  83. bcfg := backends.BackendConfig{
  84. "log_received_mails": true,
  85. "save_workers_size": 1,
  86. "process_stack": "HeadersParser|Header|Debugger",
  87. "primary_mail_host": h,
  88. }
  89. s.backend, err = backends.New(bcfg, s.logger)
  90. if err != nil {
  91. return err
  92. }
  93. } else {
  94. if _, ok := s.config.BackendConfig["process_stack"]; !ok {
  95. s.config.BackendConfig["process_stack"] = "HeadersParser|Header|Debugger"
  96. }
  97. if _, ok := s.config.BackendConfig["primary_mail_host"]; !ok {
  98. s.config.BackendConfig["primary_mail_host"] = h
  99. }
  100. if _, ok := s.config.BackendConfig["save_workers_size"]; !ok {
  101. s.config.BackendConfig["save_workers_size"] = 1
  102. }
  103. if _, ok := s.config.BackendConfig["log_received_mails"]; !ok {
  104. s.config.BackendConfig["log_received_mails"] = false
  105. }
  106. s.backend, err = backends.New(s.config.BackendConfig, s.logger)
  107. if err != nil {
  108. return err
  109. }
  110. }
  111. return nil
  112. }
  113. func (s *SMTP) Start() (err error) {
  114. if s.g == nil {
  115. if s.config == nil {
  116. s.config = &AppConfig{}
  117. }
  118. err = s.configureDefaults()
  119. if err != nil {
  120. return err
  121. }
  122. if s.logger == nil {
  123. s.logger, err = log.GetLogger(s.config.LogFile)
  124. if err != nil {
  125. return err
  126. }
  127. }
  128. if s.backend == nil {
  129. err = s.configureDefaultBackend()
  130. if err != nil {
  131. return
  132. }
  133. }
  134. s.g, err = New(s.config, s.backend, s.logger)
  135. if err != nil {
  136. return err
  137. }
  138. }
  139. return s.g.Start()
  140. }
  141. func (s *SMTP) Shutdown() {
  142. s.g.Shutdown()
  143. }
  144. // ReadConfig reads in the config from a json file.
  145. func (s *SMTP) ReadConfig(path string) error {
  146. data, err := ioutil.ReadFile(path)
  147. if err != nil {
  148. return fmt.Errorf("Could not read config file: %s", err.Error())
  149. }
  150. if s.config == nil {
  151. s.config = &AppConfig{}
  152. }
  153. if err := s.config.Load(data); err != nil {
  154. return err
  155. }
  156. return nil
  157. }