serve.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package main
  2. import (
  3. "os"
  4. "os/signal"
  5. "syscall"
  6. log "github.com/Sirupsen/logrus"
  7. "github.com/spf13/cobra"
  8. "fmt"
  9. guerrilla "github.com/flashmob/go-guerrilla"
  10. "github.com/flashmob/go-guerrilla/backends"
  11. "github.com/flashmob/go-guerrilla/config"
  12. "github.com/flashmob/go-guerrilla/server"
  13. )
  14. var (
  15. iface string
  16. configFile string
  17. pidFile string
  18. serveCmd = &cobra.Command{
  19. Use: "serve",
  20. Short: "start the small SMTP server",
  21. Run: serve,
  22. }
  23. mainConfig = guerrilla.Config{}
  24. signalChannel = make(chan os.Signal, 1) // for trapping SIG_HUB
  25. )
  26. func init() {
  27. serveCmd.PersistentFlags().StringVarP(&iface, "if", "", "",
  28. "Interface and port to listen on, eg. 127.0.0.1:2525 ")
  29. serveCmd.PersistentFlags().StringVarP(&configFile, "config", "c",
  30. "goguerrilla.conf", "Path to the configuration file")
  31. serveCmd.PersistentFlags().StringVarP(&pidFile, "pidFile", "p",
  32. "/var/run/go-guerrilla.pid", "Path to the pid file")
  33. rootCmd.AddCommand(serveCmd)
  34. }
  35. func sigHandler() {
  36. // handle SIGHUP for reloading the configuration while running
  37. signal.Notify(signalChannel, syscall.SIGHUP)
  38. for sig := range signalChannel {
  39. if sig == syscall.SIGHUP {
  40. err := config.ReadConfig(configFile, iface, verbose, &mainConfig)
  41. if err != nil {
  42. log.WithError(err).Error("Error while ReadConfig (reload)")
  43. } else {
  44. log.Infof("Configuration is reloaded at %s", guerrilla.ConfigLoadTime)
  45. }
  46. // TODO: reinitialize
  47. } else {
  48. os.Exit(0)
  49. }
  50. }
  51. }
  52. func serve(cmd *cobra.Command, args []string) {
  53. logVersion()
  54. err := config.ReadConfig(configFile, iface, verbose, &mainConfig)
  55. if err != nil {
  56. log.WithError(err).Fatal("Error while ReadConfig")
  57. }
  58. // write out our PID
  59. if len(pidFile) > 0 {
  60. if f, err := os.Create(pidFile); err == nil {
  61. defer f.Close()
  62. if _, err := f.WriteString(fmt.Sprintf("%d", os.Getpid())); err == nil {
  63. f.Sync()
  64. } else {
  65. log.WithError(err).Fatalf("Error while writing pidFile (%s)", pidFile)
  66. }
  67. } else {
  68. log.WithError(err).Fatalf("Error while creating pidFile (%s)", pidFile)
  69. }
  70. }
  71. backend, err := backends.New(mainConfig.BackendName, mainConfig.BackendConfig)
  72. if err != nil {
  73. log.WithError(err).Fatalf("Error while loading the backend %q",
  74. mainConfig.BackendName)
  75. }
  76. // run our servers
  77. for _, serverConfig := range mainConfig.Servers {
  78. if serverConfig.IsEnabled {
  79. log.Infof("Starting server on %s", serverConfig.ListenInterface)
  80. go func(sConfig guerrilla.ServerConfig) {
  81. err := server.RunServer(mainConfig, sConfig, backend)
  82. if err != nil {
  83. log.WithError(err).Fatalf("Error while starting server on %s", serverConfig.ListenInterface)
  84. }
  85. }(serverConfig)
  86. }
  87. }
  88. sigHandler()
  89. }