package cmd import ( "fmt" "io" "log" "net/http" "os" "github.com/spf13/cobra" "git.metaunix.net/BitGoblin/mcst/util" ) var ( serverName string minecraftVersion string ) var newCmd = &cobra.Command{ Use: "new", Short: "Create a new Minecraft server instance.", Long: `Create a new Minecraft server instance.`, Run: func(cmd *cobra.Command, args []string) { log.Printf("Creating new server with name '%s', and version '%s'\n", serverName, minecraftVersion) serverDirectoryPath := util.ResolveTilde(fmt.Sprintf("~/%s", serverName)) err := os.Mkdir(serverDirectoryPath, 0755) if err != nil && !os.IsExist(err) { log.Fatal(err) } var serverJarURL string = "https://piston-data.mojang.com/v1/objects/f69c284232d7c7580bd89a5a4931c3581eae1378/server.jar" var serverFilePath string = fmt.Sprintf("%s/server_%s.jar", serverDirectoryPath, minecraftVersion) log.Printf("Downloading %s to %s\n", serverJarURL, serverFilePath) file, err := os.Create(serverFilePath) if err != nil { log.Fatal(err) } client := http.Client{ CheckRedirect: func(r *http.Request, via []*http.Request) error { r.URL.Opaque = r.URL.Path return nil }, } // Put content on file resp, err := client.Get(serverJarURL) if err != nil { log.Fatal(err) } defer resp.Body.Close() _, err = io.Copy(file, resp.Body) defer file.Close() // create the shell script to start the server log.Printf("Creating start.sh shell script.\n") var scriptFilePath string = fmt.Sprintf("%s/start.sh", serverDirectoryPath) scriptFile, err := os.Create(scriptFilePath) if err != nil { log.Fatalf("Unable to open file: %v", err) } defer scriptFile.Close() // add text to the file _, err = scriptFile.WriteString(fmt.Sprintf("#!/bin/sh\n\ncd %s\njava -Xmx2048M -Xms2048M -jar server_%s.jar nogui", serverDirectoryPath, minecraftVersion)) if err != nil { log.Fatalf("Unable to write data: %v", err) } // set permissions on the script err = os.Chmod(scriptFilePath, 0755) if err != nil { log.Fatalf("Unable to change script permissions: %v", err) } }, } func init() { // bind flags to variables newCmd.Flags().StringVarP(&serverName, "server-name", "n", "", "The name for your new server.") newCmd.MarkFlagRequired("server-name") newCmd.Flags().StringVarP(&minecraftVersion, "minecraft-version", "m", "", "Minecraft Java Edition server version to use.") newCmd.MarkFlagRequired("minecraft-version") // add this command to the command root rootCmd.AddCommand(newCmd) }