@@ -20,10 +20,7 @@ import (
2020 "context"
2121 "fmt"
2222 "io/ioutil"
23- "log"
24- "os"
2523 "path/filepath"
26- "strconv"
2724 "time"
2825
2926 "github.com/go-openapi/loads"
@@ -38,18 +35,18 @@ import (
3835var serverCmd = cli.Command {
3936 Name : "server" ,
4037 Aliases : []string {"srv" },
41- Usage : "starts Console server" ,
38+ Usage : "Start MinIO Console server" ,
4239 Action : StartServer ,
4340 Flags : []cli.Flag {
4441 cli.StringFlag {
4542 Name : "host" ,
4643 Value : restapi .GetHostname (),
47- Usage : "hostname" ,
44+ Usage : "bind to a specific HOST, HOST can be an IP or hostname" ,
4845 },
4946 cli.IntFlag {
5047 Name : "port" ,
5148 Value : restapi .GetPort (),
52- Usage : "HTTP port" ,
49+ Usage : "bind to specific HTTP port" ,
5350 },
5451 // This is kept here for backward compatibility,
5552 // hostname's do not have HTTP or HTTPs
@@ -58,52 +55,52 @@ var serverCmd = cli.Command{
5855 cli.StringFlag {
5956 Name : "tls-host" ,
6057 Value : restapi .GetHostname (),
61- Usage : "HTTPS hostname" ,
6258 Hidden : true ,
6359 },
60+ cli.StringFlag {
61+ Name : "certs-dir" ,
62+ Value : certs .GlobalCertsCADir .Get (),
63+ Usage : "path to certs directory" ,
64+ },
6465 cli.IntFlag {
6566 Name : "tls-port" ,
6667 Value : restapi .GetTLSPort (),
67- Usage : "HTTPS port" ,
68+ Usage : "bind to specific HTTPS port" ,
6869 },
6970 cli.StringFlag {
7071 Name : "tls-redirect" ,
7172 Value : restapi .GetTLSRedirect (),
7273 Usage : "toggle HTTP->HTTPS redirect" ,
7374 },
7475 cli.StringFlag {
75- Name : "certs-dir" ,
76- Value : certs .GlobalCertsCADir .Get (),
77- Usage : "path to certs directory" ,
78- },
79- cli.StringFlag {
80- Name : "tls-certificate" ,
81- Value : "" ,
82- Usage : "path to TLS public certificate" ,
76+ Name : "tls-certificate" ,
77+ Value : "" ,
78+ Usage : "path to TLS public certificate" ,
79+ Hidden : true ,
8380 },
8481 cli.StringFlag {
85- Name : "tls-key" ,
86- Value : "" ,
87- Usage : "path to TLS private key" ,
82+ Name : "tls-key" ,
83+ Value : "" ,
84+ Usage : "path to TLS private key" ,
85+ Hidden : true ,
8886 },
8987 cli.StringFlag {
90- Name : "tls-ca" ,
91- Value : "" ,
92- Usage : "path to TLS Certificate Authority" ,
88+ Name : "tls-ca" ,
89+ Value : "" ,
90+ Usage : "path to TLS Certificate Authority" ,
91+ Hidden : true ,
9392 },
9493 },
9594}
9695
97- // StartServer starts the console service
98- func StartServer (ctx * cli.Context ) error {
96+ func buildServer () (* restapi.Server , error ) {
9997 swaggerSpec , err := loads .Embedded (restapi .SwaggerJSON , restapi .FlatSwaggerJSON )
10098 if err != nil {
101- log . Fatalln ( err )
99+ return nil , err
102100 }
103101
104102 api := operations .NewConsoleAPI (swaggerSpec )
105103 server := restapi .NewServer (api )
106- defer server .Shutdown ()
107104
108105 parser := flags .NewParser (server , flags .Default )
109106 parser .ShortDescription = "MinIO Console Server"
@@ -114,33 +111,31 @@ func StartServer(ctx *cli.Context) error {
114111 for _ , optsGroup := range api .CommandLineOptionsGroups {
115112 _ , err := parser .AddGroup (optsGroup .ShortDescription , optsGroup .LongDescription , optsGroup .Options )
116113 if err != nil {
117- log . Fatalln ( err )
114+ return nil , err
118115 }
119116 }
120117
121118 if _ , err := parser .Parse (); err != nil {
122- code := 1
123- if fe , ok := err .(* flags.Error ); ok {
124- if fe .Type == flags .ErrHelp {
125- code = 0
126- }
127- }
128- os .Exit (code )
119+ return nil , err
129120 }
130121
131- server .Host = ctx .String ("host" )
132- server .Port = ctx .Int ("port" )
133- restapi .Hostname = server .Host
134- restapi .Port = strconv .Itoa (server .Port )
122+ return server , nil
123+ }
135124
125+ func loadAllCerts (ctx * cli.Context ) error {
126+ var err error
136127 // Set all certs and CAs directories path
137- certs .GlobalCertsDir , _ = certs .NewConfigDirFromCtx (ctx , "certs-dir" , certs .DefaultCertsDir .Get )
138- certs .GlobalCertsCADir = & certs.ConfigDir {Path : filepath .Join (certs .GlobalCertsDir .Get (), certs .CertsCADir )}
128+ certs .GlobalCertsDir , _ , err = certs .NewConfigDirFromCtx (ctx , "certs-dir" , certs .DefaultCertsDir .Get )
129+ if err != nil {
130+ return err
131+ }
139132
133+ certs .GlobalCertsCADir = & certs.ConfigDir {Path : filepath .Join (certs .GlobalCertsDir .Get (), certs .CertsCADir )}
140134 // check if certs and CAs directories exists or can be created
141- if err : = certs .MkdirAllIgnorePerm (certs .GlobalCertsCADir .Get ()); err != nil {
142- log . Println ( fmt .Sprintf ("Unable to create certs CA directory at %s" , certs .GlobalCertsCADir .Get ()) )
135+ if err = certs .MkdirAllIgnorePerm (certs .GlobalCertsCADir .Get ()); err != nil {
136+ return fmt .Errorf ("Unable to create certs CA directory at %s: with %w " , certs .GlobalCertsCADir .Get (), err )
143137 }
138+
144139 // load the certificates and the CAs
145140 restapi .GlobalRootCAs , restapi .GlobalPublicCerts , restapi .GlobalTLSCertsManager = certs .GetAllCertificatesAndCAs ()
146141
@@ -153,7 +148,7 @@ func StartServer(ctx *cli.Context) error {
153148 if swaggerServerCertificate != "" && swaggerServerCertificateKey != "" {
154149 if err = certs .AddCertificate (context .Background (),
155150 restapi .GlobalTLSCertsManager , swaggerServerCertificate , swaggerServerCertificateKey ); err != nil {
156- log . Fatalln ( err )
151+ return err
157152 }
158153 if x509Certs , err := certs .ParsePublicCertFile (swaggerServerCertificate ); err == nil {
159154 restapi .GlobalPublicCerts = append (restapi .GlobalPublicCerts , x509Certs ... )
@@ -169,25 +164,40 @@ func StartServer(ctx *cli.Context) error {
169164 }
170165 }
171166
172- if len (restapi .GlobalPublicCerts ) > 0 {
173- // If TLS certificates are provided enforce the HTTPS schema, meaning console will redirect
174- // plain HTTP connections to HTTPS server
175- server .EnabledListeners = []string {"http" , "https" }
176- server .TLSPort = ctx .Int ("tls-port" )
177- // Need to store tls-port, tls-host un config variables so secure.middleware can read from there
178- restapi .TLSPort = strconv .Itoa (server .TLSPort )
179- restapi .Hostname = ctx .String ("host" )
180- restapi .TLSRedirect = ctx .String ("tls-redirect" )
167+ return nil
168+ }
169+
170+ // StartServer starts the console service
171+ func StartServer (ctx * cli.Context ) error {
172+ if err := loadAllCerts (ctx ); err != nil {
173+ restapi .LogError ("Unable to load certs: %v" , err )
174+ return err
175+ }
176+
177+ var rctx restapi.Context
178+ if err := rctx .Load (ctx ); err != nil {
179+ restapi .LogError ("argument validation failed: %v" , err )
180+ return err
181181 }
182182
183- server .ConfigureAPI ()
183+ server , err := buildServer ()
184+ if err != nil {
185+ restapi .LogError ("Unable to initialize console server: %v" , err )
186+ return err
187+ }
188+
189+ s := server .Configure (rctx )
190+ defer s .Shutdown ()
184191
185192 // subnet license refresh process
186193 go func () {
194+ // start refreshing subnet license after 5 seconds..
195+ time .Sleep (time .Second * 5 )
196+
187197 failedAttempts := 0
188198 for {
189199 if err := restapi .RefreshLicense (); err != nil {
190- log . Println ( err )
200+ restapi . LogError ( "Refreshing subnet license failed: %v" , err )
191201 failedAttempts ++
192202 // end license refresh after 3 consecutive failed attempts
193203 if failedAttempts >= 3 {
@@ -204,8 +214,5 @@ func StartServer(ctx *cli.Context) error {
204214 }
205215 }()
206216
207- if err := server .Serve (); err != nil {
208- log .Fatalln (err )
209- }
210- return nil
217+ return s .Serve ()
211218}
0 commit comments