|
1 | 1 | package main |
2 | 2 |
|
3 | 3 | import ( |
4 | | - "context" |
5 | | - "flag" |
6 | | - "github.com/0xJacky/Nginx-UI/server/analytic" |
7 | | - "github.com/0xJacky/Nginx-UI/server/model" |
8 | | - "github.com/0xJacky/Nginx-UI/server/router" |
9 | | - "github.com/0xJacky/Nginx-UI/server/settings" |
10 | | - "github.com/0xJacky/Nginx-UI/server/tool" |
11 | | - "github.com/0xJacky/Nginx-UI/server/tool/nginx" |
12 | | - "github.com/gin-gonic/gin" |
13 | | - "log" |
14 | | - "mime" |
15 | | - "net/http" |
16 | | - "os/signal" |
17 | | - "syscall" |
18 | | - "time" |
| 4 | + "context" |
| 5 | + "flag" |
| 6 | + "github.com/0xJacky/Nginx-UI/server/analytic" |
| 7 | + "github.com/0xJacky/Nginx-UI/server/model" |
| 8 | + "github.com/0xJacky/Nginx-UI/server/router" |
| 9 | + "github.com/0xJacky/Nginx-UI/server/settings" |
| 10 | + "github.com/0xJacky/Nginx-UI/server/tool" |
| 11 | + "github.com/0xJacky/Nginx-UI/server/tool/nginx" |
| 12 | + "github.com/gin-gonic/gin" |
| 13 | + "github.com/go-co-op/gocron" |
| 14 | + "log" |
| 15 | + "mime" |
| 16 | + "net/http" |
| 17 | + "os/signal" |
| 18 | + "syscall" |
| 19 | + "time" |
19 | 20 | ) |
20 | 21 |
|
21 | 22 | func main() { |
22 | | - // Create context that listens for the interrupt signal from the OS. |
23 | | - ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) |
24 | | - defer stop() |
25 | | - |
26 | | - // Hack: fix wrong Content Type of .js file on some OS platforms |
27 | | - // See https://github.com/golang/go/issues/32350 |
28 | | - _ = mime.AddExtensionType(".js", "text/javascript; charset=utf-8") |
29 | | - |
30 | | - var confPath string |
31 | | - flag.StringVar(&confPath, "config", "app.ini", "Specify the configuration file") |
32 | | - flag.Parse() |
33 | | - |
34 | | - gin.SetMode(settings.ServerSettings.RunMode) |
35 | | - |
36 | | - settings.Init(confPath) |
37 | | - log.Printf("nginx config dir path: %s", nginx.GetNginxConfPath("")) |
38 | | - if "" != settings.ServerSettings.JwtSecret { |
39 | | - model.Init() |
40 | | - go tool.AutoCert() |
41 | | - go analytic.RecordServerAnalytic() |
42 | | - } |
43 | | - |
44 | | - srv := &http.Server{ |
45 | | - Addr: ":" + settings.ServerSettings.HttpPort, |
46 | | - Handler: router.InitRouter(), |
47 | | - } |
48 | | - |
49 | | - // Initializing the server in a goroutine so that |
50 | | - // it won't block the graceful shutdown handling below |
51 | | - go func() { |
52 | | - if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { |
53 | | - log.Fatalf("listen: %s\n", err) |
54 | | - } |
55 | | - }() |
56 | | - |
57 | | - // Listen for the interrupt signal. |
58 | | - <-ctx.Done() |
59 | | - |
60 | | - // Restore default behavior on the interrupt signal and notify user of shutdown. |
61 | | - stop() |
62 | | - log.Println("shutting down gracefully, press Ctrl+C again to force") |
63 | | - |
64 | | - // The context is used to inform the server it has 5 seconds to finish |
65 | | - // the request it is currently handling |
66 | | - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) |
67 | | - defer cancel() |
68 | | - if err := srv.Shutdown(ctx); err != nil { |
69 | | - log.Fatal("Server forced to shutdown: ", err) |
70 | | - } |
71 | | - |
72 | | - log.Println("Server exiting") |
| 23 | + // Create context that listens for the interrupt signal from the OS. |
| 24 | + ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) |
| 25 | + defer stop() |
| 26 | + |
| 27 | + // Hack: fix wrong Content Type of .js file on some OS platforms |
| 28 | + // See https://github.com/golang/go/issues/32350 |
| 29 | + _ = mime.AddExtensionType(".js", "text/javascript; charset=utf-8") |
| 30 | + |
| 31 | + var confPath string |
| 32 | + flag.StringVar(&confPath, "config", "app.ini", "Specify the configuration file") |
| 33 | + flag.Parse() |
| 34 | + |
| 35 | + gin.SetMode(settings.ServerSettings.RunMode) |
| 36 | + |
| 37 | + settings.Init(confPath) |
| 38 | + log.Printf("nginx config dir path: %s", nginx.GetNginxConfPath("")) |
| 39 | + if "" != settings.ServerSettings.JwtSecret { |
| 40 | + model.Init() |
| 41 | + |
| 42 | + s := gocron.NewScheduler(time.UTC) |
| 43 | + job, err := s.Every(1).Hour().SingletonMode().Do(tool.AutoCert) |
| 44 | + |
| 45 | + if err != nil { |
| 46 | + log.Fatalf("AutoCert Job: %v, Err: %v\n", job, err) |
| 47 | + } |
| 48 | + |
| 49 | + s.StartAsync() |
| 50 | + |
| 51 | + go analytic.RecordServerAnalytic() |
| 52 | + } |
| 53 | + |
| 54 | + srv := &http.Server{ |
| 55 | + Addr: ":" + settings.ServerSettings.HttpPort, |
| 56 | + Handler: router.InitRouter(), |
| 57 | + } |
| 58 | + |
| 59 | + // Initializing the server in a goroutine so that |
| 60 | + // it won't block the graceful shutdown handling below |
| 61 | + go func() { |
| 62 | + if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { |
| 63 | + log.Fatalf("listen: %s\n", err) |
| 64 | + } |
| 65 | + }() |
| 66 | + |
| 67 | + // Listen for the interrupt signal. |
| 68 | + <-ctx.Done() |
| 69 | + |
| 70 | + // Restore default behavior on the interrupt signal and notify user of shutdown. |
| 71 | + stop() |
| 72 | + log.Println("shutting down gracefully, press Ctrl+C again to force") |
| 73 | + |
| 74 | + // The context is used to inform the server it has 5 seconds to finish |
| 75 | + // the request it is currently handling |
| 76 | + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) |
| 77 | + defer cancel() |
| 78 | + if err := srv.Shutdown(ctx); err != nil { |
| 79 | + log.Fatal("Server forced to shutdown: ", err) |
| 80 | + } |
| 81 | + |
| 82 | + log.Println("Server exiting") |
73 | 83 |
|
74 | 84 | } |
0 commit comments