woe.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package main
  2. // import "fmt"
  3. import "github.com/beoran/woe/server"
  4. import "github.com/beoran/woe/monolog"
  5. import "os"
  6. import "os/exec"
  7. import "flag"
  8. import "fmt"
  9. type serverLogLevels []string;
  10. var server_loglevels serverLogLevels = serverLogLevels {
  11. "FATAL", "ERROR", "WARNING", "INFO",
  12. }
  13. /* Command line flags. */
  14. var server_mode = flag.Bool("s", false, "Run in server mode");
  15. var server_tcpip = flag.String("l", ":7000", "TCP/IP Address where the server will listen");
  16. var enable_logs = flag.String("el", "FATAL,ERROR,WARNING,INFO", "Log levels to enable");
  17. var disable_logs = flag.String("dl", "", "Log levels to disable");
  18. func enableDisableLogs() {
  19. monolog.EnableLevels(*enable_logs)
  20. monolog.EnableLevels(*disable_logs)
  21. }
  22. /* Need to restart the server or not? */
  23. var server_restart = true
  24. func runServer() (status int) {
  25. monolog.Setup("woe.log", true, false)
  26. defer monolog.Close()
  27. enableDisableLogs()
  28. monolog.Info("Starting WOE server...")
  29. monolog.Info("Server will run at %s.", *server_tcpip)
  30. woe, err := server.NewServer(*server_tcpip)
  31. if err != nil {
  32. monolog.Error("Could not initialize server!")
  33. monolog.Error(err.Error())
  34. panic(err)
  35. }
  36. monolog.Info("Server at %s init ok.", *server_tcpip)
  37. defer woe.Close()
  38. status, err = woe.Serve()
  39. if err != nil {
  40. monolog.Error("Error while running WOE server!")
  41. monolog.Error(err.Error())
  42. panic(err)
  43. }
  44. monolog.Info("Server shut down without error indication.", *server_tcpip)
  45. return status
  46. }
  47. func runSupervisor() (status int) {
  48. monolog.Setup("woe.log", true, false)
  49. defer monolog.Close()
  50. enableDisableLogs()
  51. monolog.Info("Starting WOE supervisor.")
  52. for (server_restart) {
  53. // wd , _ := os.Getwd()
  54. exe := fmt.Sprintf("%s", os.Args[0])
  55. argp := fmt.Sprintf("-l=%s", *server_tcpip)
  56. argel:= fmt.Sprintf("-el=%s", *enable_logs)
  57. argdl:= fmt.Sprintf("-dl=%s", *disable_logs)
  58. cmd := exec.Command(exe, "-s=true", argp, argel, argdl)
  59. monolog.Info("Starting server %s at %s.", exe, *server_tcpip)
  60. cmd.Stderr = os.Stderr
  61. cmd.Stdout = os.Stdout
  62. monolog.Debug("Server command line: %s.", cmd.Args)
  63. err := cmd.Run()
  64. monolog.Info("Server at %s shut down.", *server_tcpip)
  65. if (err != nil ) {
  66. monolog.Error("Server shut down with error %s!", err)
  67. server_restart = false;
  68. return 1
  69. }
  70. }
  71. return 0
  72. }
  73. /* Woe can be run in supervisor mode (the default) or server mode (-s).
  74. * Server mode is the mode in which the real server is run. In supervisor mode,
  75. * woe runs a single woe server in server mode using os/exec. This is used to
  76. * be able to restart the server gracefully on recompile of the sources.
  77. */
  78. func main() {
  79. defer func () {
  80. pani := recover()
  81. if (pani != nil) {
  82. monolog.Fatal("Panic: %s", pani)
  83. os.Exit(255)
  84. }
  85. } ()
  86. flag.Parse()
  87. if *server_mode {
  88. os.Exit(runServer())
  89. } else {
  90. os.Exit(runSupervisor())
  91. }
  92. }