diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0daf6e8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.vscode +factorio-headless_linux_2.0.72 \ No newline at end of file diff --git a/backup.go b/backup.go new file mode 100644 index 0000000..ce25214 --- /dev/null +++ b/backup.go @@ -0,0 +1,33 @@ +package main + +import ( + "fmt" + "os/exec" + "time" +) + +func backUp(cmd string, c GoConfig) { + switch cmd { + case "full": + fmt.Println("Starting full server backup") + t := time.Now() + timeStamp := t.Format(time.RFC3339) + fullBackupName := fmt.Sprintf("%s/ServerBackup.%s.tgz", c.Config.BackupDir, timeStamp) + fullBackup := exec.Command("tar", "-czf", fullBackupName, c.Config.ServDir) + err := fullBackup.Run() + if err != nil { + fmt.Printf("Backup Failed: %s\n", err) + } + case "saves": + fmt.Println("Backing up saves") + t := time.Now() + timeStamp := t.Format(time.RFC3339) + savesBackupName := fmt.Sprintf("%s/SaveBackup.%s.tgz", c.Config.BackupDir, timeStamp) + saveDir := fmt.Sprintf("%s/saves", c.Config.ServDir) + savesBackup := exec.Command("tar", "-czf", savesBackupName, saveDir) + err := savesBackup.Run() + if err != nil { + fmt.Printf("Backup Failed: %s\n", err) + } + } +} diff --git a/config.go b/config.go new file mode 100644 index 0000000..aa0b415 --- /dev/null +++ b/config.go @@ -0,0 +1,38 @@ +package main + +import ( + "log" + "os" + + "gopkg.in/yaml.v3" +) + +const fmConfig = "config.yml" + +type GoConfig struct { + Config struct { + ServDir string `yaml:"serverFolder"` + ServPort int `yaml:"port"` + WorldFile string `yaml:"worldFile"` + ServCfg string `yaml:"serverSettings"` + ServExec string `yaml:"serverExec"` + BackupDir string `yaml:"backupDir"` + UseScreen bool `yaml:"screen"` + ScreenName string `yaml:"screenName"` + } `yaml:"server"` +} + +func readCfg(factCfg string) GoConfig { + //read config file (YAML) + fileBytes, err := os.ReadFile(factCfg) + if err != nil { + log.Fatalf("Error reading config file: %v", err) + } + // return Struct + var config GoConfig + err = yaml.Unmarshal(fileBytes, &config) + if err != nil { + log.Fatalf("Error unmarshalling YAML file: %v", err) + } + return config +} diff --git a/config.yml b/config.yml index 8da28ea..5cbafab 100644 --- a/config.yml +++ b/config.yml @@ -1,9 +1,9 @@ server: - serverFolder: "factorio" + serverFolder: "./factorio-headless_linux_2.0.72/factorio" port: 34197 - worldFile: "factorio/newworld.zip" - serverSettings: "factorio/data/server-settings.json" - backupDir: "backups" - serverExec: "factorio/bin/x64/factorio" + worldFile: "./factorio-headless_linux_2.0.72/factorio/Newworlds.zip" + serverSettings: "./factorio-headless_linux_2.0.72/factorio/data/server-settings.json" + backupDir: "./factorio-headless_linux_2.0.72/backups" + serverExec: "./factorio-headless_linux_2.0.72/factorio/bin/x64/factorio" screen: True - screenName: "Factorio" + screenName: "Factorio" \ No newline at end of file diff --git a/factoryman b/factoryman deleted file mode 100755 index 51e8981..0000000 Binary files a/factoryman and /dev/null differ diff --git a/launchserver.go b/launchserver.go new file mode 100644 index 0000000..657dfc3 --- /dev/null +++ b/launchserver.go @@ -0,0 +1,55 @@ +package main + +import ( + "fmt" + "log" + "os" + "os/exec" + "time" +) + +func startStopServer(cmd string, con GoConfig) { + switch cmd { + case "start": + x := fmt.Sprintf("%s --port %d --server-settings %s --start-server %s", con.Config.ServExec, con.Config.ServPort, con.Config.ServCfg, con.Config.WorldFile) + if con.Config.UseScreen { // if screen enabled in confing.yml + fmt.Println("Starting factorio server in screen session") + startScreenCmd := exec.Command("screen", "-dmS", con.Config.ScreenName, "bash", "-c", x, "; exec sh") + startScreenCmd.Stdout = os.Stdout + startScreenCmd.Stderr = os.Stderr + err := startScreenCmd.Run() + if err != nil { + log.Fatalf("Failed to start server: %s", err) + } else { + fmt.Printf("Started server on port %d, in screen named %s\n", con.Config.ServPort, con.Config.ScreenName) + y := exec.Command("screen", "-ls") + y.Stdout = os.Stdout + y.Stderr = os.Stderr + err = y.Run() + } + } else { + startSrvCmd := exec.Command("bash", "-c", x) + startSrvCmd.Stdout = os.Stdout + startSrvCmd.Stderr = os.Stdout + startSrvCmd.Stdin = os.Stdin + err := startSrvCmd.Run() + if err != nil { + log.Fatalf("Failed to start server: %s", err) + } + } + case "stop": + quitServerCmd := exec.Command("screen", "-S", con.Config.ScreenName, "-p", "0", "-X", "stuff", "/quit\n") + err := quitServerCmd.Run() + if err != nil { + log.Fatalf("Command failed: %s, Error: %v", quitServerCmd.Args, err) + } else { + fmt.Printf("Server in screen %s stopped\n", con.Config.ScreenName) + } + fmt.Println("Waiting for server to shutdown\r") + time.Sleep(10 * time.Second) + y := exec.Command("screen", "-ls") + y.Stdout = os.Stdout + y.Stderr = os.Stderr + err = y.Run() + } +} diff --git a/main.go b/main.go index db0bc0d..3b7c592 100644 --- a/main.go +++ b/main.go @@ -2,114 +2,9 @@ package main import ( "fmt" - "log" "os" - "os/exec" - "time" - - "gopkg.in/yaml.v3" ) -const fmConfig = "config.yml" - -type GoConfig struct { - Config struct { - ServDir string `yaml:"serverFolder"` - ServPort int `yaml:"port"` - WorldFile string `yaml:"worldFile"` - ServCfg string `yaml:"serverSettings"` - ServExec string `yaml:"serverExec"` - BackupDir string `yaml:"backupDir"` - UseScreen bool `yaml:"screen"` - ScreenName string `yaml:"screenName"` - } `yaml:"server"` -} - -func readCfg(factCfg string) GoConfig { - //read config file (YAML) - fileBytes, err := os.ReadFile(factCfg) - if err != nil { - log.Fatalf("Error reading config file: %v", err) - } - // return Struct - var config GoConfig - err = yaml.Unmarshal(fileBytes, &config) - if err != nil { - log.Fatalf("Error unmarshalling YAML file: %v", err) - } - return config -} - -func startStopServer(cmd string, con GoConfig) { - switch cmd { - case "start": - x := fmt.Sprintf("%s --port %d --server-settings %s --start-server %s", con.Config.ServExec, con.Config.ServPort, con.Config.ServCfg, con.Config.WorldFile) - - //x := fmt.Sprintf("%s --port %d --server-settings %s --start-server %s; exec sh", con.Config.ServExec, con.Config.ServPort, con.Config.ServCfg, con.Config.WorldFile) - ///home/raum/factorio-serverfmt.Println(x) - if con.Config.UseScreen { - fmt.Println("Starting factorio server in screen session") - startScreenCmd := exec.Command("screen", "-dmS", con.Config.ScreenName, "bash", "-c", x, "; exec sh") - err := startScreenCmd.Run() - if err != nil { - log.Fatalf("Failed to start server: %s", err) - } else { - fmt.Printf("Started server on port %d, in screen named %s\n", con.Config.ServPort, con.Config.ScreenName) - } - } else { - startSrvCmd := exec.Command(x) - err := startSrvCmd.Run() - if err != nil { - log.Fatalf("Failed to start server: %s", err) - } - } - case "stop": - quitServerCmd := exec.Command("screen", "-S", con.Config.ScreenName, "-p", "0", "-X", "stuff", "/quit\n") - err := quitServerCmd.Run() - if err != nil { - log.Fatalf("Command failed: %s, Error: %v", quitServerCmd.Args, err) - } else { - fmt.Printf("Server in screen %s stopped\n", con.Config.ScreenName) - } - fmt.Println("Waiting for server to shutdown\r") - //time.Sleep(20 * time.Second) - //fmt.Println("Closing screen session ", con.Config.ScreenName) - //stopScreenCmd := exec.Command("screen", "-S", con.Config.ScreenName, "-p", "0", "-X", "stuff", "exit\n") - //err = stopScreenCmd.Run() - //if err != nil { - // log.Fatalf("Command failed: %s, Error: %v", stopScreenCmd.Args, err) - //} else { - // fmt.Printf("Screen \"%s\" closed\n", con.Config.ScreenName) - //} - } -} - -func backUp(cmd string, c GoConfig) { - switch cmd { - case "full": - fmt.Println("Starting full server backup") - t := time.Now() - timeStamp := t.Format(time.RFC3339) - fullBackupName := fmt.Sprintf("%s/ServerBackup.%s.tgz", c.Config.BackupDir, timeStamp) - fullBackup := exec.Command("tar", "-czf", fullBackupName, c.Config.ServDir) - err := fullBackup.Run() - if err != nil { - fmt.Printf("Backup Failed: %s\n", err) - } - case "saves": - fmt.Println("Backing up saves") - t := time.Now() - timeStamp := t.Format(time.RFC3339) - savesBackupName := fmt.Sprintf("%s/SaveBackup.%s.tgz", c.Config.BackupDir, timeStamp) - saveDir := fmt.Sprintf("%s/saves", c.Config.ServDir) - savesBackup := exec.Command("tar", "-czf", savesBackupName, saveDir) - err := savesBackup.Run() - if err != nil { - fmt.Printf("Backup Failed: %s\n", err) - } - } -} - func main() { c := readCfg(fmConfig)