package main import ( "fmt" "log" "os" "os/exec" "time" ) func startStopServer(cmd string, con GoConfig) { switch cmd { case "start": x := fmt.Sprintf("%s --port %d --server-settings %s --start-server %s", con.Config.ServExec, con.Config.ServPort, con.Config.ServCfg, con.Config.WorldFile) if con.Config.UseScreen { // if screen enabled in confing.yml fmt.Println("Starting factorio server in screen session") startScreenCmd := exec.Command("screen", "-dmS", con.Config.ScreenName, "bash", "-c", x, "; exec sh") startScreenCmd.Stdout = os.Stdout startScreenCmd.Stderr = os.Stderr err := startScreenCmd.Run() if err != nil { log.Fatalf("Failed to start server: %s", err) } else { fmt.Printf("Started server on port %d, in screen named %s\n", con.Config.ServPort, con.Config.ScreenName) y := exec.Command("screen", "-ls") y.Stdout = os.Stdout y.Stderr = os.Stderr err = y.Run() } } else { startSrvCmd := exec.Command("bash", "-c", x) startSrvCmd.Stdout = os.Stdout startSrvCmd.Stderr = os.Stdout startSrvCmd.Stdin = os.Stdin err := startSrvCmd.Run() if err != nil { log.Fatalf("Failed to start server: %s", err) } } case "stop": quitServerCmd := exec.Command("screen", "-S", con.Config.ScreenName, "-p", "0", "-X", "stuff", "/quit\n") err := quitServerCmd.Run() if err != nil { log.Fatalf("Command failed: %s, Error: %v", quitServerCmd.Args, err) } else { fmt.Printf("Server in screen %s stopped\n", con.Config.ScreenName) } fmt.Println("Waiting for server to shutdown\r") time.Sleep(10 * time.Second) y := exec.Command("screen", "-ls") y.Stdout = os.Stdout y.Stderr = os.Stderr err = y.Run() } }