11package cmd
22
33import (
4- "context"
5- "errors"
6- "fmt"
7- "net"
8- "net/http"
94 "os"
105 "os/signal"
11- "strconv"
12- "sync"
136 "syscall"
147 "time"
158
16- "github.com/OpenListTeam/OpenList/v4/cmd/flags"
179 "github.com/OpenListTeam/OpenList/v4/internal/bootstrap"
18- "github.com/OpenListTeam/OpenList/v4/internal/conf"
19- "github.com/OpenListTeam/OpenList/v4/internal/fs"
20- "github.com/OpenListTeam/OpenList/v4/pkg/utils"
21- "github.com/OpenListTeam/OpenList/v4/server"
22- "github.com/OpenListTeam/OpenList/v4/server/middlewares"
23- "github.com/OpenListTeam/sftpd-openlist"
24- ftpserver "github.com/fclairamb/ftpserverlib"
25- "github.com/gin-gonic/gin"
26- log "github.com/sirupsen/logrus"
2710 "github.com/spf13/cobra"
28- "golang.org/x/net/http2"
29- "golang.org/x/net/http2/h2c"
30-
31- "github.com/quic-go/quic-go/http3"
3211)
3312
3413// ServerCmd represents the server command
@@ -38,161 +17,9 @@ var ServerCmd = &cobra.Command{
3817 Long : `Start the server at the specified address
3918the address is defined in config file` ,
4019 Run : func (cmd * cobra.Command , args []string ) {
41- Init ()
42- if conf .Conf .DelayedStart != 0 {
43- utils .Log .Infof ("delayed start for %d seconds" , conf .Conf .DelayedStart )
44- time .Sleep (time .Duration (conf .Conf .DelayedStart ) * time .Second )
45- }
46- bootstrap .InitOfflineDownloadTools ()
47- bootstrap .LoadStorages ()
48- bootstrap .InitTaskManager ()
49- if ! flags .Debug && ! flags .Dev {
50- gin .SetMode (gin .ReleaseMode )
51- }
52- r := gin .New ()
53-
54- // gin log
55- if conf .Conf .Log .Filter .Enable {
56- r .Use (middlewares .FilteredLogger ())
57- } else {
58- r .Use (gin .LoggerWithWriter (log .StandardLogger ().Out ))
59- }
60- r .Use (gin .RecoveryWithWriter (log .StandardLogger ().Out ))
61-
62- server .Init (r )
63- var httpHandler http.Handler = r
64- if conf .Conf .Scheme .EnableH2c {
65- httpHandler = h2c .NewHandler (r , & http2.Server {})
66- }
67- var httpSrv , httpsSrv , unixSrv * http.Server
68- var quicSrv * http3.Server
69- if conf .Conf .Scheme .HttpPort != - 1 {
70- httpBase := fmt .Sprintf ("%s:%d" , conf .Conf .Scheme .Address , conf .Conf .Scheme .HttpPort )
71- fmt .Printf ("start HTTP server @ %s\n " , httpBase )
72- utils .Log .Infof ("start HTTP server @ %s" , httpBase )
73- httpSrv = & http.Server {Addr : httpBase , Handler : httpHandler }
74- go func () {
75- err := httpSrv .ListenAndServe ()
76- if err != nil && ! errors .Is (err , http .ErrServerClosed ) {
77- utils .Log .Fatalf ("failed to start http: %s" , err .Error ())
78- }
79- }()
80- }
81- if conf .Conf .Scheme .HttpsPort != - 1 {
82- httpsBase := fmt .Sprintf ("%s:%d" , conf .Conf .Scheme .Address , conf .Conf .Scheme .HttpsPort )
83- fmt .Printf ("start HTTPS server @ %s\n " , httpsBase )
84- utils .Log .Infof ("start HTTPS server @ %s" , httpsBase )
85- httpsSrv = & http.Server {Addr : httpsBase , Handler : r }
86- go func () {
87- err := httpsSrv .ListenAndServeTLS (conf .Conf .Scheme .CertFile , conf .Conf .Scheme .KeyFile )
88- if err != nil && ! errors .Is (err , http .ErrServerClosed ) {
89- utils .Log .Fatalf ("failed to start https: %s" , err .Error ())
90- }
91- }()
92- if conf .Conf .Scheme .EnableH3 {
93- fmt .Printf ("start HTTP3 (quic) server @ %s\n " , httpsBase )
94- utils .Log .Infof ("start HTTP3 (quic) server @ %s" , httpsBase )
95- r .Use (func (c * gin.Context ) {
96- if c .Request .TLS != nil {
97- port := conf .Conf .Scheme .HttpsPort
98- c .Header ("Alt-Svc" , fmt .Sprintf ("h3=\" :%d\" ; ma=86400" , port ))
99- }
100- c .Next ()
101- })
102- quicSrv = & http3.Server {Addr : httpsBase , Handler : r }
103- go func () {
104- err := quicSrv .ListenAndServeTLS (conf .Conf .Scheme .CertFile , conf .Conf .Scheme .KeyFile )
105- if err != nil && ! errors .Is (err , http .ErrServerClosed ) {
106- utils .Log .Fatalf ("failed to start http3 (quic): %s" , err .Error ())
107- }
108- }()
109- }
110- }
111- if conf .Conf .Scheme .UnixFile != "" {
112- fmt .Printf ("start unix server @ %s\n " , conf .Conf .Scheme .UnixFile )
113- utils .Log .Infof ("start unix server @ %s" , conf .Conf .Scheme .UnixFile )
114- unixSrv = & http.Server {Handler : httpHandler }
115- go func () {
116- listener , err := net .Listen ("unix" , conf .Conf .Scheme .UnixFile )
117- if err != nil {
118- utils .Log .Fatalf ("failed to listen unix: %+v" , err )
119- }
120- // set socket file permission
121- mode , err := strconv .ParseUint (conf .Conf .Scheme .UnixFilePerm , 8 , 32 )
122- if err != nil {
123- utils .Log .Errorf ("failed to parse socket file permission: %+v" , err )
124- } else {
125- err = os .Chmod (conf .Conf .Scheme .UnixFile , os .FileMode (mode ))
126- if err != nil {
127- utils .Log .Errorf ("failed to chmod socket file: %+v" , err )
128- }
129- }
130- err = unixSrv .Serve (listener )
131- if err != nil && ! errors .Is (err , http .ErrServerClosed ) {
132- utils .Log .Fatalf ("failed to start unix: %s" , err .Error ())
133- }
134- }()
135- }
136- if conf .Conf .S3 .Port != - 1 && conf .Conf .S3 .Enable {
137- s3r := gin .New ()
138- s3r .Use (gin .LoggerWithWriter (log .StandardLogger ().Out ), gin .RecoveryWithWriter (log .StandardLogger ().Out ))
139- server .InitS3 (s3r )
140- s3Base := fmt .Sprintf ("%s:%d" , conf .Conf .Scheme .Address , conf .Conf .S3 .Port )
141- fmt .Printf ("start S3 server @ %s\n " , s3Base )
142- utils .Log .Infof ("start S3 server @ %s" , s3Base )
143- go func () {
144- var err error
145- if conf .Conf .S3 .SSL {
146- httpsSrv = & http.Server {Addr : s3Base , Handler : s3r }
147- err = httpsSrv .ListenAndServeTLS (conf .Conf .Scheme .CertFile , conf .Conf .Scheme .KeyFile )
148- }
149- if ! conf .Conf .S3 .SSL {
150- httpSrv = & http.Server {Addr : s3Base , Handler : s3r }
151- err = httpSrv .ListenAndServe ()
152- }
153- if err != nil && ! errors .Is (err , http .ErrServerClosed ) {
154- utils .Log .Fatalf ("failed to start s3 server: %s" , err .Error ())
155- }
156- }()
157- }
158- var ftpDriver * server.FtpMainDriver
159- var ftpServer * ftpserver.FtpServer
160- if conf .Conf .FTP .Listen != "" && conf .Conf .FTP .Enable {
161- var err error
162- ftpDriver , err = server .NewMainDriver ()
163- if err != nil {
164- utils .Log .Fatalf ("failed to start ftp driver: %s" , err .Error ())
165- } else {
166- fmt .Printf ("start ftp server on %s\n " , conf .Conf .FTP .Listen )
167- utils .Log .Infof ("start ftp server on %s" , conf .Conf .FTP .Listen )
168- go func () {
169- ftpServer = ftpserver .NewFtpServer (ftpDriver )
170- err = ftpServer .ListenAndServe ()
171- if err != nil {
172- utils .Log .Fatalf ("problem ftp server listening: %s" , err .Error ())
173- }
174- }()
175- }
176- }
177- var sftpDriver * server.SftpDriver
178- var sftpServer * sftpd.SftpServer
179- if conf .Conf .SFTP .Listen != "" && conf .Conf .SFTP .Enable {
180- var err error
181- sftpDriver , err = server .NewSftpDriver ()
182- if err != nil {
183- utils .Log .Fatalf ("failed to start sftp driver: %s" , err .Error ())
184- } else {
185- fmt .Printf ("start sftp server on %s" , conf .Conf .SFTP .Listen )
186- utils .Log .Infof ("start sftp server on %s" , conf .Conf .SFTP .Listen )
187- go func () {
188- sftpServer = sftpd .NewSftpServer (sftpDriver )
189- err = sftpServer .RunServer ()
190- if err != nil {
191- utils .Log .Fatalf ("problem sftp server listening: %s" , err .Error ())
192- }
193- }()
194- }
195- }
20+ bootstrap .Init ()
21+ defer bootstrap .Release ()
22+ bootstrap .Start ()
19623 // Wait for interrupt signal to gracefully shutdown the server with
19724 // a timeout of 1 second.
19825 quit := make (chan os.Signal , 1 )
@@ -201,69 +28,7 @@ the address is defined in config file`,
20128 // kill -9 is syscall. SIGKILL but can"t be catch, so don't need add it
20229 signal .Notify (quit , syscall .SIGINT , syscall .SIGTERM )
20330 <- quit
204- utils .Log .Println ("Shutdown server..." )
205- fs .ArchiveContentUploadTaskManager .RemoveAll ()
206- Release ()
207- ctx , cancel := context .WithTimeout (context .Background (), 1 * time .Second )
208- defer cancel ()
209- var wg sync.WaitGroup
210- if conf .Conf .Scheme .HttpPort != - 1 {
211- wg .Add (1 )
212- go func () {
213- defer wg .Done ()
214- if err := httpSrv .Shutdown (ctx ); err != nil {
215- utils .Log .Fatal ("HTTP server shutdown err: " , err )
216- }
217- }()
218- }
219- if conf .Conf .Scheme .HttpsPort != - 1 {
220- wg .Add (1 )
221- go func () {
222- defer wg .Done ()
223- if err := httpsSrv .Shutdown (ctx ); err != nil {
224- utils .Log .Fatal ("HTTPS server shutdown err: " , err )
225- }
226- }()
227- if conf .Conf .Scheme .EnableH3 {
228- wg .Add (1 )
229- go func () {
230- defer wg .Done ()
231- if err := quicSrv .Shutdown (ctx ); err != nil {
232- utils .Log .Fatal ("HTTP3 (quic) server shutdown err: " , err )
233- }
234- }()
235- }
236- }
237- if conf .Conf .Scheme .UnixFile != "" {
238- wg .Add (1 )
239- go func () {
240- defer wg .Done ()
241- if err := unixSrv .Shutdown (ctx ); err != nil {
242- utils .Log .Fatal ("Unix server shutdown err: " , err )
243- }
244- }()
245- }
246- if conf .Conf .FTP .Listen != "" && conf .Conf .FTP .Enable && ftpServer != nil && ftpDriver != nil {
247- wg .Add (1 )
248- go func () {
249- defer wg .Done ()
250- ftpDriver .Stop ()
251- if err := ftpServer .Stop (); err != nil {
252- utils .Log .Fatal ("FTP server shutdown err: " , err )
253- }
254- }()
255- }
256- if conf .Conf .SFTP .Listen != "" && conf .Conf .SFTP .Enable && sftpServer != nil && sftpDriver != nil {
257- wg .Add (1 )
258- go func () {
259- defer wg .Done ()
260- if err := sftpServer .Close (); err != nil {
261- utils .Log .Fatal ("SFTP server shutdown err: " , err )
262- }
263- }()
264- }
265- wg .Wait ()
266- utils .Log .Println ("Server exit" )
31+ bootstrap .Shutdown (1 * time .Second )
26732 },
26833}
26934
0 commit comments