Added the 'new' command, which creates a new minecraft server instance
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
This commit is contained in:
parent
92153508b3
commit
ccce234ae3
92
cmd/new.go
Normal file
92
cmd/new.go
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
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)
|
||||||
|
}
|
@ -7,6 +7,10 @@ import (
|
|||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
version string
|
||||||
|
)
|
||||||
|
|
||||||
var rootCmd = &cobra.Command{
|
var rootCmd = &cobra.Command{
|
||||||
Use: "mcst",
|
Use: "mcst",
|
||||||
Short: "MCST is a tool to manage Minecraft Java edition servers.",
|
Short: "MCST is a tool to manage Minecraft Java edition servers.",
|
||||||
@ -15,6 +19,7 @@ var rootCmd = &cobra.Command{
|
|||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
log.Printf("This is a test.")
|
log.Printf("This is a test.")
|
||||||
},
|
},
|
||||||
|
Version: version,
|
||||||
}
|
}
|
||||||
|
|
||||||
func Start() {
|
func Start() {
|
||||||
|
23
util/env.go
Normal file
23
util/env.go
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package util
|
||||||
|
|
||||||
|
import (
|
||||||
|
"path/filepath"
|
||||||
|
"os/user"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func ResolveTilde(path string) string {
|
||||||
|
usr, _ := user.Current()
|
||||||
|
dir := usr.HomeDir
|
||||||
|
|
||||||
|
if path == "~" {
|
||||||
|
// In case of "~", which won't be caught by the "else if"
|
||||||
|
path = dir
|
||||||
|
} else if strings.HasPrefix(path, "~/") {
|
||||||
|
// Use strings.HasPrefix so we don't match paths like
|
||||||
|
// "/something/~/something/"
|
||||||
|
path = filepath.Join(dir, path[2:])
|
||||||
|
}
|
||||||
|
|
||||||
|
return path
|
||||||
|
}
|
29
util/env_test.go
Normal file
29
util/env_test.go
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
package util
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/suite"
|
||||||
|
)
|
||||||
|
|
||||||
|
// define our test suite struct
|
||||||
|
type EnvTestSuite struct {
|
||||||
|
suite.Suite
|
||||||
|
}
|
||||||
|
|
||||||
|
// the tilde should expand to user's home directory
|
||||||
|
func (s *EnvTestSuite) TestResolveTilde() {
|
||||||
|
resolvedPath := ResolveTilde("~")
|
||||||
|
assert.NotEqual(s.T(), resolvedPath, "~")
|
||||||
|
}
|
||||||
|
|
||||||
|
// ensure the tilde + relative path gets expanded fully
|
||||||
|
func (s *EnvTestSuite) TestResolveTildePath() {
|
||||||
|
resolvedPath := ResolveTilde("~/test")
|
||||||
|
assert.NotEqual(s.T(), resolvedPath, "~/test")
|
||||||
|
}
|
||||||
|
|
||||||
|
// this is needed to run the test suite
|
||||||
|
func TestEnvTestSuite(t *testing.T) {
|
||||||
|
suite.Run(t, new(EnvTestSuite))
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user