main.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. //go:generate go-bindata template/
  2. package main
  3. import (
  4. "context"
  5. "fmt"
  6. "log"
  7. "net"
  8. "net/http"
  9. "os"
  10. "os/signal"
  11. "strconv"
  12. "syscall"
  13. "time"
  14. "google.golang.org/grpc"
  15. "github.com/Sirupsen/logrus"
  16. "github.com/cad/ovpm"
  17. "github.com/cad/ovpm/api"
  18. "github.com/grpc-ecosystem/grpc-gateway/runtime"
  19. "github.com/urfave/cli"
  20. )
  21. var action string
  22. func main() {
  23. app := cli.NewApp()
  24. app.Name = "ovpmd"
  25. app.Usage = "OpenVPN Manager Daemon"
  26. app.Version = ovpm.Version
  27. app.Flags = []cli.Flag{
  28. cli.BoolFlag{
  29. Name: "verbose",
  30. Usage: "verbose output",
  31. },
  32. cli.StringFlag{
  33. Name: "port",
  34. Usage: "port number for daemon to listen on",
  35. },
  36. }
  37. app.Before = func(c *cli.Context) error {
  38. logrus.SetLevel(logrus.InfoLevel)
  39. if c.GlobalBool("verbose") {
  40. logrus.SetLevel(logrus.DebugLevel)
  41. }
  42. ovpm.SetupDB("sqlite3", "")
  43. return nil
  44. }
  45. app.After = func(c *cli.Context) error {
  46. ovpm.CeaseDB()
  47. return nil
  48. }
  49. app.Action = func(c *cli.Context) error {
  50. port := c.String("port")
  51. if port == "" {
  52. port = "9090"
  53. }
  54. s := newServer(port)
  55. s.start()
  56. s.waitForInterrupt()
  57. s.stop()
  58. return nil
  59. }
  60. app.Run(os.Args)
  61. }
  62. type server struct {
  63. grpcPort string
  64. lis net.Listener
  65. grpcServer *grpc.Server
  66. restServer *runtime.ServeMux
  67. restCancel context.CancelFunc
  68. restPort string
  69. signal chan os.Signal
  70. done chan bool
  71. }
  72. func newServer(port string) *server {
  73. sigs := make(chan os.Signal, 1)
  74. done := make(chan bool, 1)
  75. signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
  76. go func() {
  77. sig := <-sigs
  78. fmt.Println()
  79. fmt.Println(sig)
  80. done <- true
  81. }()
  82. if !ovpm.Testing {
  83. lis, err := net.Listen("tcp", fmt.Sprintf(":%s", port))
  84. if err != nil {
  85. logrus.Fatalf("could not listen to port %s: %v", port, err)
  86. }
  87. rpcServer := api.NewRPCServer()
  88. restServer, restCancel, err := api.NewRESTServer()
  89. if err != nil {
  90. logrus.Fatalf("could not get new rest server :%v", err)
  91. }
  92. return &server{
  93. lis: lis,
  94. grpcServer: rpcServer,
  95. restServer: restServer,
  96. restCancel: context.CancelFunc(restCancel),
  97. restPort: increasePort(port),
  98. signal: sigs,
  99. done: done,
  100. grpcPort: port,
  101. }
  102. }
  103. return &server{}
  104. }
  105. func (s *server) start() {
  106. logrus.Infof("OVPM is running gRPC:%s, REST:%s ...", s.grpcPort, s.restPort)
  107. go s.grpcServer.Serve(s.lis)
  108. go http.ListenAndServe(":"+s.restPort, s.restServer)
  109. ovpm.StartVPNProc()
  110. }
  111. func (s *server) stop() {
  112. logrus.Info("OVPM is shutting down ...")
  113. s.grpcServer.Stop()
  114. s.restCancel()
  115. ovpm.StopVPNProc()
  116. }
  117. func (s *server) waitForInterrupt() {
  118. <-s.done
  119. go timeout(8 * time.Second)
  120. }
  121. func timeout(interval time.Duration) {
  122. time.Sleep(interval)
  123. log.Println("Timeout! Killing the main thread...")
  124. os.Exit(-1)
  125. }
  126. func stringInSlice(a string, list []string) bool {
  127. for _, b := range list {
  128. if b == a {
  129. return true
  130. }
  131. }
  132. return false
  133. }
  134. func increasePort(p string) string {
  135. i, err := strconv.Atoi(p)
  136. if err != nil {
  137. logrus.Panicf(fmt.Sprintf("can't convert %s to int: %v", p, err))
  138. }
  139. i++
  140. return fmt.Sprintf("%d", i)
  141. }