@@ -222,10 +222,50 @@ func (g *LightningTerminal) Run() error {
222222 return fmt .Errorf ("error starting UI HTTP server: %v" , err )
223223 }
224224
225+ // Attempt to start Lit and all of its sub-servers.
226+ if err = g .start (); err != nil {
227+ g .statusServer .setServerErrored (
228+ LitSubServer , "could not start Lit: %v" , err ,
229+ )
230+ }
231+
232+ // Now block until we receive an error or the main shutdown
233+ // signal.
234+ <- shutdownInterceptor .ShutdownChannel ()
235+ log .Infof ("Shutdown signal received" )
236+
237+ if g .rpcProxy != nil {
238+ if err := g .rpcProxy .Stop (); err != nil {
239+ log .Errorf ("Error stopping rpc proxy: %v" , err )
240+ }
241+ }
242+
243+ if g .httpServer != nil {
244+ if err := g .httpServer .Close (); err != nil {
245+ log .Errorf ("Error stopping UI server: %v" , err )
246+ }
247+ }
248+
249+ if err := g .statusServer .Stop (); err != nil {
250+ log .Errorf ("Error stopping status server: %v" , err )
251+ }
252+
253+ g .wg .Wait ()
254+
255+ return nil
256+ }
257+
258+ // start attempts to start all the various components of Litd. Only Litd and
259+ // LND errors are considered fatal and will result in an error being returned.
260+ // If any of the sub-servers managed by the subServerMgr error while starting
261+ // up, these are considered non-fatal and will not result in an error being
262+ // returned.
263+ func (g * LightningTerminal ) start () error {
225264 // Create the instances of our subservers now so we can hook them up to
226265 // lnd once it's fully running.
227266 g .initSubServers ()
228267
268+ var err error
229269 g .sessionRpcServer , err = newSessionRPCServer (& sessionRpcServerConfig {
230270 basicAuth : g .rpcProxy .basicAuth ,
231271 dbDir : filepath .Join (g .cfg .LitDir , g .cfg .Network ),
@@ -300,9 +340,7 @@ func (g *LightningTerminal) Run() error {
300340 go func () {
301341 defer g .wg .Done ()
302342
303- err := lnd .Main (
304- g .cfg .Lnd , lisCfg , implCfg , shutdownInterceptor ,
305- )
343+ err := lnd .Main (g .cfg .Lnd , lisCfg , implCfg , interceptor )
306344 if e , ok := err .(* flags.Error ); err != nil &&
307345 (! ok || e .Type != flags .ErrHelp ) {
308346
@@ -344,24 +382,30 @@ func (g *LightningTerminal) Run() error {
344382 return err
345383
346384 case <- lndQuit :
347- return nil
385+ g .statusServer .setServerErrored (
386+ LNDSubServer , "lndQuit channel closed" ,
387+ )
388+ return fmt .Errorf ("LND has stopped" )
348389
349- case <- shutdownInterceptor .ShutdownChannel ():
350- return errors . New ( "shutting down " )
390+ case <- interceptor .ShutdownChannel ():
391+ return fmt . Errorf ( "received the shutdown signal " )
351392 }
352393
353394 // We now know that starting lnd was successful. If we now run into an
354395 // error, we must shut down lnd correctly.
355396 defer func () {
356- err := g .shutdown ()
397+ err := g .shutdownSubServers ()
357398 if err != nil {
358399 log .Errorf ("Error shutting down: %v" , err )
359400 }
360401 }()
361402
362403 // Connect to LND.
363404 if err = g .connectLND (bufRpcListener ); err != nil {
364- return fmt .Errorf ("could not connect to LND: %v" , err )
405+ g .statusServer .setServerErrored (
406+ LNDSubServer , "could not connect to LND: %v" , err ,
407+ )
408+ return fmt .Errorf ("could not connect to LND" )
365409 }
366410
367411 // Initialise any connections to sub-servers that we are running in
@@ -389,12 +433,18 @@ func (g *LightningTerminal) Run() error {
389433 return err
390434
391435 case <- lndQuit :
392- return nil
436+ g .statusServer .setServerErrored (
437+ LNDSubServer , "lndQuit channel closed" ,
438+ )
439+ return fmt .Errorf ("LND is not running" )
393440
394- case <- shutdownInterceptor .ShutdownChannel ():
441+ case <- interceptor .ShutdownChannel ():
395442 return errors .New ("shutting down" )
396443 }
397444
445+ // We can now set the status of LND as running.
446+ g .statusServer .setServerRunning (LNDSubServer )
447+
398448 // If we're in integrated mode, we'll need to wait for lnd to send the
399449 // macaroon after unlock before going any further.
400450 if g .cfg .LndMode == ModeIntegrated {
@@ -405,8 +455,10 @@ func (g *LightningTerminal) Run() error {
405455 // Set up all the LND clients required by LiT.
406456 err = g .setUpLNDClients ()
407457 if err != nil {
408- log .Errorf ("Could not set up LND clients: %v" , err )
409- return err
458+ g .statusServer .setServerErrored (
459+ LNDSubServer , "could not set up LND clients: %v" , err ,
460+ )
461+ return fmt .Errorf ("could not start LND" )
410462 }
411463
412464 // If we're in integrated and stateless init mode, we won't create
@@ -433,22 +485,28 @@ func (g *LightningTerminal) Run() error {
433485 return fmt .Errorf ("could not start litd sub-servers: %v" , err )
434486 }
435487
488+ // We can now set the status of LiT as running.
489+ g .statusServer .setServerRunning (LitSubServer )
490+
436491 // Now block until we receive an error or the main shutdown signal.
437492 select {
438493 case err := <- g .errQueue .ChanOut ():
439494 if err != nil {
440- log .Errorf ("Received critical error from subsystem, " +
441- "shutting down: %v" , err )
495+ return fmt .Errorf ("received critical error from " +
496+ "subsystem, shutting down: %v" , err ,
497+ )
442498 }
443499
444500 case <- lndQuit :
445- return nil
501+ g .statusServer .setServerErrored (
502+ LNDSubServer , "lndQuit channel closed" ,
503+ )
504+ return fmt .Errorf ("LND is not running" )
446505
447- case <- shutdownInterceptor .ShutdownChannel ():
448- log .Infof ("Shutdown signal received" )
506+ case <- interceptor .ShutdownChannel ():
449507 }
450508
451- return nil
509+ return fmt . Errorf ( "received the shutdown signal" )
452510}
453511
454512// initSubServers registers the faraday, loop and pool sub-servers with the
@@ -899,8 +957,9 @@ func (g *LightningTerminal) BuildWalletConfig(ctx context.Context,
899957 )
900958}
901959
902- // shutdown stops all subservers that were started and attached to lnd.
903- func (g * LightningTerminal ) shutdown () error {
960+ // shutdownSubServers stops all subservers that were started and attached to
961+ // lnd.
962+ func (g * LightningTerminal ) shutdownSubServers () error {
904963 var returnErr error
905964
906965 err := g .subServerMgr .Stop ()
@@ -934,37 +993,13 @@ func (g *LightningTerminal) shutdown() error {
934993 g .restCancel ()
935994 }
936995
937- if g .rpcProxy != nil {
938- if err := g .rpcProxy .Stop (); err != nil {
939- log .Errorf ("Error stopping lnd proxy: %v" , err )
940- returnErr = err
941- }
942- }
943-
944996 if g .lndConn != nil {
945997 if err := g .lndConn .Close (); err != nil {
946998 log .Errorf ("Error closing lnd connection: %v" , err )
947999 returnErr = err
9481000 }
9491001 }
9501002
951- if g .httpServer != nil {
952- if err := g .httpServer .Close (); err != nil {
953- log .Errorf ("Error stopping UI server: %v" , err )
954- returnErr = err
955- }
956- }
957-
958- if err := g .statusServer .Stop (); err != nil {
959- log .Errorf ("Error stopping status server: %v" , err )
960- returnErr = err
961- }
962-
963- // In case the error wasn't thrown by lnd, make sure we stop it too.
964- interceptor .RequestShutdown ()
965-
966- g .wg .Wait ()
967-
9681003 // Do we have any last errors to display? We use an anonymous function,
9691004 // so we can use return instead of breaking to a label in the default
9701005 // case.
0 commit comments