service.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package main
  2. import (
  3. "log"
  4. "os"
  5. "path/filepath"
  6. "github.com/kardianos/service"
  7. "github.com/slackhq/nebula"
  8. )
  9. var logger service.Logger
  10. type program struct {
  11. exit chan struct{}
  12. configPath *string
  13. configTest *bool
  14. build string
  15. }
  16. func (p *program) Start(s service.Service) error {
  17. logger.Info("Nebula service starting.")
  18. p.exit = make(chan struct{})
  19. // Start should not block.
  20. go p.run()
  21. return nil
  22. }
  23. func (p *program) run() error {
  24. nebula.Main(*p.configPath, *p.configTest, Build)
  25. return nil
  26. }
  27. func (p *program) Stop(s service.Service) error {
  28. logger.Info("Nebula service stopping.")
  29. close(p.exit)
  30. return nil
  31. }
  32. func doService(configPath *string, configTest *bool, build string, serviceFlag *string) {
  33. if *configPath == "" {
  34. ex, err := os.Executable()
  35. if err != nil {
  36. panic(err)
  37. }
  38. *configPath = filepath.Dir(ex) + "/config.yaml"
  39. }
  40. svcConfig := &service.Config{
  41. Name: "Nebula",
  42. DisplayName: "Nebula Network Service",
  43. Description: "Nebula network connectivity daemon for encrypted communications",
  44. Arguments: []string{"-service", "run", "-config", *configPath},
  45. }
  46. prg := &program{
  47. configPath: configPath,
  48. configTest: configTest,
  49. build: build,
  50. }
  51. s, err := service.New(prg, svcConfig)
  52. if err != nil {
  53. log.Fatal(err)
  54. }
  55. errs := make(chan error, 5)
  56. logger, err = s.Logger(errs)
  57. if err != nil {
  58. log.Fatal(err)
  59. }
  60. go func() {
  61. for {
  62. err := <-errs
  63. if err != nil {
  64. log.Print(err)
  65. }
  66. }
  67. }()
  68. switch *serviceFlag {
  69. case "run":
  70. err = s.Run()
  71. if err != nil {
  72. logger.Error(err)
  73. }
  74. default:
  75. err := service.Control(s, *serviceFlag)
  76. if err != nil {
  77. log.Printf("Valid actions: %q\n", service.ControlAction)
  78. log.Fatal(err)
  79. }
  80. return
  81. }
  82. }