func main() { for Args = os.Args[1:]; Args != nil && len(Args) > 0 && Args[0][0] == '-'; Args = Args[1:] { switch Args[0] { case "--no-color": color = false slog.DisableColor() case "--log": tracefile, err := os.OpenFile(Args[1], os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666) if err == nil { slog.TraceLogger = slog.NewTraceLogger(tracefile) Args = Args[1:] } else { fmt.Printf("Could not open trace file %s", Args[1]) return } case "--file-change-delay": if len(Args) > 1 { delay, err := time.ParseDuration(Args[1]) if err != nil { execManPage("zeus") } Args = Args[1:] restarter.FileChangeWindow = delay } else { execManPage("zeus") } case "--version": printVersion() return } } if len(Args) == 0 { execManPage("zeus") } if generalHelpRequested(Args) { execManPage("zeus") } else if Args[0] == "help" { commandSpecificHelp(Args) } else if Args[0] == "version" { printVersion() } else if Args[0] == "start" { zeusmaster.Run() } else if Args[0] == "init" { zeusInit() } else if Args[0] == "commands" { zeusCommands() } else { tree := config.BuildProcessTree() for _, name := range tree.AllCommandsAndAliases() { if Args[0] == name { zeusclient.Run() return } } commandNotFound(Args[0]) } }
func main() { if len(os.Args) == 1 { execManPage("zeus") } var args []string if os.Args[1] == "--no-color" { color = false slog.DisableColor() args = os.Args[2:] } else { args = os.Args[1:] } if generalHelpRequested(args) { execManPage("zeus") } else if args[0] == "help" { commandSpecificHelp(args) } else if args[0] == "version" || args[0] == "--version" { println("Zeus version " + zeusversion.VERSION) } else if args[0] == "start" { zeusmaster.Run() } else if args[0] == "init" { zeusInit() } else if args[0] == "commands" { zeusCommands() } else { tree := zeusmaster.BuildProcessTree() for _, name := range tree.AllCommandsAndAliases() { if args[0] == name { zeusclient.Run() return } } commandNotFound(args[0]) } }
func main() { args := os.Args[1:] configFile := "zeus.json" fileChangeDelay := filemonitor.DefaultFileChangeDelay for ; args != nil && len(args) > 0 && args[0][0] == '-'; args = args[1:] { switch args[0] { case "--no-color": color = false slog.DisableColor() case "--log": tracefile, err := os.OpenFile(args[1], os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666) if err == nil { slog.SetTraceLogger(slog.NewTraceLogger(tracefile)) args = args[1:] } else { fmt.Printf("Could not open trace file %s\n", args[1]) return } case "--file-change-delay": if len(args) > 1 { delay, err := time.ParseDuration(args[1]) if err != nil { execManPage("zeus") } args = args[1:] fileChangeDelay = delay } else { execManPage("zeus") } case "--config": _, err := os.Stat(args[1]) if err != nil { fmt.Printf("Config file doesn't exist: %s (%e)\n", args[1], err) return } configFile = args[1] args = args[1:] case "--version": printVersion() return } } if len(args) == 0 { execManPage("zeus") return } if generalHelpRequested(args) { execManPage("zeus") } else if args[0] == "help" { commandSpecificHelp(args) } else if args[0] == "version" { printVersion() } else if args[0] == "start" { os.Exit(zeusmaster.Run(configFile, fileChangeDelay)) } else if args[0] == "init" { zeusInit() } else if args[0] == "commands" { zeusCommands(configFile) } else { tree := config.BuildProcessTree(configFile, nil) for _, name := range tree.AllCommandsAndAliases() { if args[0] == name { // Don't confuse the master by sending *full* args to // it; just those that are not zeus-specific. os.Exit(zeusclient.Run(args, os.Stdin, os.Stdout)) } } commandNotFound(args[0]) } }
func TestZeusBoots(t *testing.T) { if os.Getenv("ZEUS_LISTENER_BINARY") == "" { t.Fatal("Missing ZEUS_LISTENER_BINARY env var") } dir, err := ioutil.TempDir("", "zeus_test") if err != nil { t.Fatal(err) } defer os.RemoveAll(dir) if err := writeTestFiles(dir); err != nil { t.Fatal(err) } config.ConfigFile = filepath.Join(dir, "zeus.json") unixsocket.SetZeusSockName(filepath.Join(dir, ".zeus.sock")) connections := map[string]*net.UnixConn{ "cmd": nil, "data": nil, "code": nil, } for name := range connections { sockName := filepath.Join(dir, fmt.Sprintf("%s.sock", name)) c, err := net.ListenUnixgram("unixgram", &net.UnixAddr{ Name: sockName, Net: "unixgram", }) if err != nil { t.Fatalf("Error opening %q socket: %v", sockName, err) } defer c.Close() connections[name] = c } me, err := os.FindProcess(os.Getpid()) if err != nil { t.Fatal(err) } if err := os.Chdir(dir); err != nil { t.Fatal(err) } // TODO: Find a way to redirect stdout so we can look for crashed // processes. enableTracing() zexit := make(chan int) go func() { zexit <- zeusmaster.Run() }() expects := map[string]string{ // TODO: Use the zeusclient to spawn a command to test // that path. // "cmd": "pong", "data": "YAML the Camel is a Mammal with Enamel", "code": "Hello, world!", } for name, want := range expects { if err := readAndCompare(connections[name], want); err != nil { t.Fatalf("%s: %v", name, err) } } // TODO: It appears the filewatcher takes some time to initialize // so we need to wait for it to propagate before changing things. // Even then there appears to be a bad enough race somewhere that // we get flaky tests if we change more than one file. time.Sleep(1 * time.Second) for _, f := range []string{"code.rb" /*, "data.yaml"*/} { from := filepath.Join(dir, fmt.Sprintf("other-%s", f)) to := filepath.Join(dir, f) if err := os.Rename(from, to); err != nil { t.Fatalf("Error renaming %s: %v", f, err) } } expects = map[string]string{ // "data": "Hi", "code": "there!", } for name, want := range expects { if err := readAndCompare(connections[name], want); err != nil { t.Fatalf("%s: %v", name, err) } } // The zeusmaster catches the interrupt and exits gracefully me.Signal(os.Interrupt) if code := <-zexit; code != 0 { t.Fatalf("Zeus exited with %d", code) } }
func main() { for Args = os.Args[1:]; Args != nil && len(Args) > 0 && Args[0][0] == '-'; Args = Args[1:] { switch Args[0] { case "--no-color": color = false slog.DisableColor() case "--log": tracefile, err := os.OpenFile(Args[1], os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666) if err == nil { slog.SetTraceLogger(slog.NewTraceLogger(tracefile)) Args = Args[1:] } else { fmt.Printf("Could not open trace file %s\n", Args[1]) return } case "--file-change-delay": if len(Args) > 1 { delay, err := time.ParseDuration(Args[1]) if err != nil { execManPage("zeus") } Args = Args[1:] restarter.FileChangeWindow = delay } else { execManPage("zeus") } case "--config": _, err := os.Stat(Args[1]) if err != nil { fmt.Printf("Config file doesn't exist: %s (%e)\n", Args[1], err) return } config.ConfigFile = Args[1] Args = Args[1:] case "--version": printVersion() return } } if len(Args) == 0 { execManPage("zeus") } // Don't confuse the master by sending *full* args to it; just those that are // not zeus-specific. config.Args = Args if generalHelpRequested(Args) { execManPage("zeus") } else if Args[0] == "help" { commandSpecificHelp(Args) } else if Args[0] == "version" { printVersion() } else if Args[0] == "start" { zeusmaster.Run() } else if Args[0] == "init" { zeusInit() } else if Args[0] == "commands" { zeusCommands() } else { tree := config.BuildProcessTree() for _, name := range tree.AllCommandsAndAliases() { if Args[0] == name { zeusclient.Run() return } } commandNotFound(Args[0]) } }