// Init a new Server object func New() *Server { // TODO is two filestores better/worse than sharing w/ smtpd? ds := smtpd.DefaultFileDataStore() cfg := config.GetPop3Config() return &Server{domain: cfg.Domain, dataStore: ds, maxIdleSeconds: cfg.MaxIdleSeconds, waitgroup: new(sync.WaitGroup)} }
// New creates a new Server struct func New(shutdownChan chan bool) *Server { // Get a new instance of the the FileDataStore - the locking and counting // mechanisms are both global variables in the smtpd package. If that // changes in the future, this should be modified to use the same DataStore // instance. ds := smtpd.DefaultFileDataStore() cfg := config.GetPOP3Config() return &Server{ domain: cfg.Domain, dataStore: ds, maxIdleSeconds: cfg.MaxIdleSeconds, globalShutdown: shutdownChan, localShutdown: make(chan bool), waitgroup: new(sync.WaitGroup), } }
func main() { config.VERSION = VERSION config.BUILD_DATE = BUILD_DATE flag.Parse() if *help { flag.Usage() return } // Load & Parse config if flag.NArg() != 1 { flag.Usage() os.Exit(1) } err := config.LoadConfig(flag.Arg(0)) if err != nil { fmt.Fprintf(os.Stderr, "Failed to parse config: %v\n", err) os.Exit(1) } // Setup signal handler sigChan := make(chan os.Signal) signal.Notify(sigChan, syscall.SIGHUP, syscall.SIGTERM) go signalProcessor(sigChan) // Configure logging, close std* fds level, _ := config.Config.String("logging", "level") log.SetLogLevel(level) if *logfile != "stderr" { // stderr is the go logging default if *logfile == "stdout" { // set to stdout golog.SetOutput(os.Stdout) } else { err = openLogFile() if err != nil { fmt.Fprintf(os.Stderr, "%v", err) os.Exit(1) } defer closeLogFile() // close std* streams os.Stdout.Close() os.Stderr.Close() // Warning: this will hide panic() output os.Stdin.Close() os.Stdout = logf os.Stderr = logf } } log.LogInfo("Inbucket %v (%v) starting...", config.VERSION, config.BUILD_DATE) // Write pidfile if requested // TODO: Probably supposed to remove pidfile during shutdown if *pidfile != "none" { pidf, err := os.Create(*pidfile) if err != nil { log.LogError("Failed to create %v: %v", *pidfile, err) os.Exit(1) } defer pidf.Close() fmt.Fprintf(pidf, "%v\n", os.Getpid()) } // Grab our datastore ds := smtpd.DefaultFileDataStore() // Start HTTP server web.Initialize(config.GetWebConfig(), ds) go web.Start() // Start POP3 server pop3Server = pop3d.New() go pop3Server.Start() // Startup SMTP server, block until it exits smtpServer = smtpd.NewSmtpServer(config.GetSmtpConfig(), ds) smtpServer.Start() // Wait for active connections to finish smtpServer.Drain() pop3Server.Drain() }