func MakeCliApp( diegoVersion string, latticeVersion string, ltcConfigRoot string, exitHandler exit_handler.ExitHandler, config *config.Config, logger lager.Logger, receptorClientCreator receptor_client.Creator, targetVerifier target_verifier.TargetVerifier, cliStdout io.Writer, ) *cli.App { config.Load() app := cli.NewApp() app.Name = AppName app.Author = latticeCliAuthor app.Version = defaultVersion(diegoVersion, latticeVersion) app.Usage = LtcUsage app.Email = "*****@*****.**" ui := terminal.NewUI(os.Stdin, cliStdout, terminal.NewPasswordReader()) app.Writer = ui app.Before = func(context *cli.Context) error { args := context.Args() command := app.Command(args.First()) if command == nil { return nil } if _, ok := nonTargetVerifiedCommandNames[command.Name]; ok || len(args) == 0 { return nil } for _, arg := range args { if arg == "-h" || arg == "--help" { return nil } } if receptorUp, authorized, err := targetVerifier.VerifyTarget(config.Receptor()); !receptorUp { ui.SayLine(fmt.Sprintf("Error connecting to the receptor. Make sure your lattice target is set, and that lattice is up and running.\n\tUnderlying error: %s", err)) return err } else if !authorized { ui.SayLine("Could not authenticate with the receptor. Please run ltc target with the correct credentials.") return errors.New("Could not authenticate with the receptor.") } return nil } app.Action = defaultAction app.CommandNotFound = func(c *cli.Context, command string) { ui.SayLine(fmt.Sprintf(unknownCommand, command)) exitHandler.Exit(1) } app.Commands = cliCommands(ltcConfigRoot, exitHandler, config, logger, receptorClientCreator, targetVerifier, ui, latticeVersion) return app }
go exitHandler.Run() exitHandler.OnExit(func() { buffer.Write([]byte("handler1 ")) }) exitHandler.OnExit(func() { buffer.Write([]byte("handler2 ")) }) }) Context("Signals", func() { It("Executes exit handlers on os.Interupts", func() { signalChan <- os.Interrupt Eventually(buffer).Should(gbytes.Say("handler1 handler2 Exit-Code=160")) }) It("Executes exit handlers on SIGTERM", func() { signalChan <- syscall.SIGTERM Eventually(buffer).Should(gbytes.Say("handler1 handler2 Exit-Code=160")) }) }) Describe("Exit", func() { It("triggers a system exit after calling all the exit funcs ", func() { exitHandler.Exit(222) Eventually(buffer).Should(gbytes.Say("handler1 handler2 Exit-Code=222")) }) }) })