93 lines
2.5 KiB
Go
93 lines
2.5 KiB
Go
|
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)
|
||
|
}
|