mcst/cmd/new.go

93 lines
2.5 KiB
Go
Raw Permalink Normal View History

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)
}