Compare commits
3 Commits
Author | SHA1 | Date | |
---|---|---|---|
f908be29b9 | |||
ccce234ae3 | |||
92153508b3 |
3
.gitignore
vendored
3
.gitignore
vendored
@ -21,3 +21,6 @@
|
||||
# Go workspace file
|
||||
go.work
|
||||
|
||||
# Compiled Go binary
|
||||
mcst
|
||||
|
||||
|
31
.woodpecker.yml
Normal file
31
.woodpecker.yml
Normal file
@ -0,0 +1,31 @@
|
||||
pipeline:
|
||||
build_test:
|
||||
image: golang:1.16
|
||||
commands:
|
||||
- go build
|
||||
|
||||
test:
|
||||
image: golang:1.16
|
||||
commands:
|
||||
- go test -v ./...
|
||||
|
||||
build_release:
|
||||
image: golang:1.16
|
||||
commands:
|
||||
- go mod vendor
|
||||
- GOOS=linux GOARCH=amd64 go build -ldflags "-X git.metaunix.net/BitGoblin/mcst/cmd.version=${CI_COMMIT_TAG}" -o "dist/mcst-linux-amd64-${CI_COMMIT_TAG}"
|
||||
- GOOS=windows GOARCH=amd64 go build -ldflags "-X git.metaunix.net/BitGoblin/mcst/cmd.version=${CI_COMMIT_TAG}" -o "dist/mcst-windows-amd64-${CI_COMMIT_TAG}.exe"
|
||||
when:
|
||||
event: tag
|
||||
|
||||
gitea_release:
|
||||
image: plugins/gitea-release
|
||||
settings:
|
||||
api_key:
|
||||
from_secret: gitea_api_key
|
||||
base_url: https://git.metaunix.net
|
||||
title: "${CI_COMMIT_TAG}"
|
||||
files:
|
||||
- dist/mcst-*
|
||||
when:
|
||||
event: tag
|
2
LICENSE
2
LICENSE
@ -1,4 +1,4 @@
|
||||
Copyright (c) <year> <owner>
|
||||
Copyright (c) 2022 Bit Goblin
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
|
19
README.md
19
README.md
@ -1,3 +1,18 @@
|
||||
# mcst
|
||||
# MCST
|
||||
|
||||
Bit Goblin minecraft server tool
|
||||
Bit Goblin minecraft server management tool
|
||||
|
||||
## Installation
|
||||
|
||||
Build dependencies:
|
||||
* go
|
||||
* make
|
||||
|
||||
To install dependencies on Ubuntu: `apt install golang make`
|
||||
To install dependencies on Red Hat/AlmaLinux: `dnf install go make`
|
||||
|
||||
To install MCST as a system utility: `make build && sudo make install`
|
||||
|
||||
## Uninstallation
|
||||
|
||||
To uninstall MCST (if it was installed through make): `sudo make uninstall`
|
||||
|
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)
|
||||
}
|
30
cmd/root.go
Normal file
30
cmd/root.go
Normal file
@ -0,0 +1,30 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"log"
|
||||
"os"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var (
|
||||
version string
|
||||
)
|
||||
|
||||
var rootCmd = &cobra.Command{
|
||||
Use: "mcst",
|
||||
Short: "MCST is a tool to manage Minecraft Java edition servers.",
|
||||
Long: `A flexible yet user-friendly tool to manage Minecraft Java edition server.
|
||||
Source code available at https://git.metaunix.net/BitGoblin/mcst`,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
log.Printf("This is a test.")
|
||||
},
|
||||
Version: version,
|
||||
}
|
||||
|
||||
func Start() {
|
||||
if err := rootCmd.Execute(); err != nil {
|
||||
log.Println(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
14
go.mod
Normal file
14
go.mod
Normal file
@ -0,0 +1,14 @@
|
||||
module git.metaunix.net/BitGoblin/mcst
|
||||
|
||||
go 1.18
|
||||
|
||||
require (
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.0.0 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
github.com/spf13/cobra v1.5.0 // indirect
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
github.com/stretchr/objx v0.4.0 // indirect
|
||||
github.com/stretchr/testify v1.8.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
24
go.sum
Normal file
24
go.sum
Normal file
@ -0,0 +1,24 @@
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
|
||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU=
|
||||
github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM=
|
||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4=
|
||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
9
mcst.go
Normal file
9
mcst.go
Normal file
@ -0,0 +1,9 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"git.metaunix.net/BitGoblin/mcst/cmd"
|
||||
)
|
||||
|
||||
func main() {
|
||||
cmd.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