Added internet check and warning when offline
This commit is contained in:
@@ -8,6 +8,9 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func startStopServer(cmd string, con UsrConfig) {
|
func startStopServer(cmd string, con UsrConfig) {
|
||||||
|
if hasInternet() != true {
|
||||||
|
fmt.Printf("WARNING!\n\tNot connected to internet, LAN access only\n")
|
||||||
|
}
|
||||||
switch cmd {
|
switch cmd {
|
||||||
case "start":
|
case "start":
|
||||||
x := fmt.Sprintf("%s --port %d --server-settings %s --start-server %s", con.Server.ServExec, con.Server.ServPort, con.Server.ServCfg, con.Server.WorldFile)
|
x := fmt.Sprintf("%s --port %d --server-settings %s --start-server %s", con.Server.ServExec, con.Server.ServPort, con.Server.ServCfg, con.Server.WorldFile)
|
||||||
|
|||||||
136
mods.go
136
mods.go
@@ -9,76 +9,80 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func downloadMods(c UsrConfig) {
|
func downloadMods(c UsrConfig) {
|
||||||
//var c = readCfg("config.yml")
|
if hasInternet() == true {
|
||||||
modlist := string(c.Server.ServDir) + "/mods/mod-list.json"
|
|
||||||
|
|
||||||
fmt.Printf("Updating mods from %s\n", modlist)
|
//var c = readCfg("config.yml")
|
||||||
|
modlist := string(c.Server.ServDir) + "/mods/mod-list.json"
|
||||||
|
|
||||||
//read from modlist
|
fmt.Printf("Updating mods from %s\n", modlist)
|
||||||
file, err := os.Open(modlist)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Error reading modlist: %v", err)
|
|
||||||
}
|
|
||||||
defer file.Close()
|
|
||||||
|
|
||||||
// create temp directory
|
//read from modlist
|
||||||
tempDir, err := os.MkdirTemp("", "factoryman-*")
|
file, err := os.Open(modlist)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln("Failed to create temporary directory")
|
log.Fatalf("Error reading modlist: %v", err)
|
||||||
}
|
|
||||||
defer os.RemoveAll(tempDir)
|
|
||||||
|
|
||||||
//decode json response from api
|
|
||||||
var modList ModList
|
|
||||||
decoder := json.NewDecoder(file)
|
|
||||||
if err := decoder.Decode(&modList); err != nil {
|
|
||||||
log.Fatalf("Error reading JSON: %v", err)
|
|
||||||
}
|
|
||||||
// Iterate over modlist.json
|
|
||||||
for _, mod := range modList.Mods {
|
|
||||||
switch mod.Name {
|
|
||||||
case "base":
|
|
||||||
fmt.Println("Skipping base...")
|
|
||||||
case "elevated-rails":
|
|
||||||
fmt.Println("Skipping elevated-rails...")
|
|
||||||
case "quality":
|
|
||||||
fmt.Println("Skipping quality...")
|
|
||||||
case "space-age":
|
|
||||||
fmt.Println("Skipping space-age...")
|
|
||||||
default:
|
|
||||||
// query mod on modportal api
|
|
||||||
modportalurl := fmt.Sprintf("https://mods.factorio.com/api/mods/%s", mod.Name)
|
|
||||||
resp, err := http.Get(modportalurl)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Error reading JSON: %v", err)
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
// decode json response
|
|
||||||
var moddata ModPortal
|
|
||||||
if err := json.NewDecoder(resp.Body).Decode(&moddata); err != nil {
|
|
||||||
log.Fatalf("Error reading JSON: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// query download url for mod
|
|
||||||
accessToken := fmt.Sprintf("?username=%s&token=%s", c.Factoryman.UserName, c.Factoryman.ApiToken)
|
|
||||||
modDownloadUrl := fmt.Sprintf("https://mods.factorio.com%s%s", moddata.Releases[len(moddata.Releases)-1].DownloadUrl, accessToken)
|
|
||||||
fileName := string(tempDir + "/" + moddata.Releases[len(moddata.Releases)-1].Filename)
|
|
||||||
//download mod archive
|
|
||||||
downloadErr := download(fileName, modDownloadUrl)
|
|
||||||
if downloadErr != nil {
|
|
||||||
log.Fatalf("Error downloading: %v", downloadErr)
|
|
||||||
}
|
|
||||||
fmt.Printf("Downloaded: %s\n", fileName)
|
|
||||||
fmt.Printf("extracting files to %s\n", c.Server.ServDir+"/mods/")
|
|
||||||
// extract archive to mods folder
|
|
||||||
//exec.Command("unzip", fileName, "-d", c.Server.ServDir+"/mods/")
|
|
||||||
_, extracterr := unzip(fileName, c.Server.ServDir+"/mods/")
|
|
||||||
if extracterr != nil {
|
|
||||||
log.Fatalf("Error extracting archive: %v", extracterr)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
// create temp directory
|
||||||
|
tempDir, err := os.MkdirTemp("", "factoryman-*")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln("Failed to create temporary directory")
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(tempDir)
|
||||||
|
|
||||||
|
//decode json response from api
|
||||||
|
var modList ModList
|
||||||
|
decoder := json.NewDecoder(file)
|
||||||
|
if err := decoder.Decode(&modList); err != nil {
|
||||||
|
log.Fatalf("Error reading JSON: %v", err)
|
||||||
|
}
|
||||||
|
// Iterate over modlist.json
|
||||||
|
for _, mod := range modList.Mods {
|
||||||
|
switch mod.Name {
|
||||||
|
case "base":
|
||||||
|
fmt.Println("Skipping base...")
|
||||||
|
case "elevated-rails":
|
||||||
|
fmt.Println("Skipping elevated-rails...")
|
||||||
|
case "quality":
|
||||||
|
fmt.Println("Skipping quality...")
|
||||||
|
case "space-age":
|
||||||
|
fmt.Println("Skipping space-age...")
|
||||||
|
default:
|
||||||
|
// query mod on modportal api
|
||||||
|
modportalurl := fmt.Sprintf("https://mods.factorio.com/api/mods/%s", mod.Name)
|
||||||
|
resp, err := http.Get(modportalurl)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Error reading JSON: %v", err)
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
// decode json response
|
||||||
|
var moddata ModPortal
|
||||||
|
if err := json.NewDecoder(resp.Body).Decode(&moddata); err != nil {
|
||||||
|
log.Fatalf("Error reading JSON: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// query download url for mod
|
||||||
|
accessToken := fmt.Sprintf("?username=%s&token=%s", c.Factoryman.UserName, c.Factoryman.ApiToken)
|
||||||
|
modDownloadUrl := fmt.Sprintf("https://mods.factorio.com%s%s", moddata.Releases[len(moddata.Releases)-1].DownloadUrl, accessToken)
|
||||||
|
fileName := string(tempDir + "/" + moddata.Releases[len(moddata.Releases)-1].Filename)
|
||||||
|
//download mod archive
|
||||||
|
downloadErr := download(fileName, modDownloadUrl)
|
||||||
|
if downloadErr != nil {
|
||||||
|
log.Fatalf("Error downloading: %v", downloadErr)
|
||||||
|
}
|
||||||
|
fmt.Printf("Downloaded: %s\n", fileName)
|
||||||
|
fmt.Printf("extracting files to %s\n", c.Server.ServDir+"/mods/")
|
||||||
|
// extract archive to mods folder
|
||||||
|
//exec.Command("unzip", fileName, "-d", c.Server.ServDir+"/mods/")
|
||||||
|
_, extracterr := unzip(fileName, c.Server.ServDir+"/mods/")
|
||||||
|
if extracterr != nil {
|
||||||
|
log.Fatalf("Error extracting archive: %v", extracterr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
fmt.Println("Unable to access internet, please check connection.")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"archive/tar"
|
"archive/tar"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
@@ -13,37 +14,40 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func downloadHeadless(c UsrConfig) {
|
func downloadHeadless(c UsrConfig) {
|
||||||
//var c = readCfg("config.yml")
|
if hasInternet() == true {
|
||||||
headlessQuery := "https://www.factorio.com/get-download/latest/headless/linux64"
|
headlessQuery := "https://www.factorio.com/get-download/latest/headless/linux64"
|
||||||
|
|
||||||
url := headlessQuery
|
url := headlessQuery
|
||||||
resp, err := http.Get(url)
|
resp, err := http.Get(url)
|
||||||
if err != nil || resp.StatusCode != http.StatusOK {
|
if err != nil || resp.StatusCode != http.StatusOK {
|
||||||
log.Fatal("Download failed")
|
log.Fatal("Download failed")
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
// Wrap stream in XZ and Tar readers
|
|
||||||
xzReader, _ := xz.NewReader(resp.Body, 0)
|
|
||||||
tr := tar.NewReader(xzReader)
|
|
||||||
|
|
||||||
for {
|
|
||||||
header, err := tr.Next()
|
|
||||||
if err == io.EOF {
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
target := filepath.Join(".", header.Name)
|
// Wrap stream in XZ and Tar readers
|
||||||
switch header.Typeflag {
|
xzReader, _ := xz.NewReader(resp.Body, 0)
|
||||||
case tar.TypeDir:
|
tr := tar.NewReader(xzReader)
|
||||||
os.MkdirAll(target, 0755)
|
|
||||||
case tar.TypeReg:
|
for {
|
||||||
os.MkdirAll(filepath.Dir(target), 0755)
|
header, err := tr.Next()
|
||||||
outFile, _ := os.Create(target)
|
if err == io.EOF {
|
||||||
io.Copy(outFile, tr)
|
break
|
||||||
outFile.Close()
|
}
|
||||||
|
|
||||||
|
target := filepath.Join(".", header.Name)
|
||||||
|
switch header.Typeflag {
|
||||||
|
case tar.TypeDir:
|
||||||
|
os.MkdirAll(target, 0755)
|
||||||
|
case tar.TypeReg:
|
||||||
|
os.MkdirAll(filepath.Dir(target), 0755)
|
||||||
|
outFile, _ := os.Create(target)
|
||||||
|
io.Copy(outFile, tr)
|
||||||
|
outFile.Close()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
// zip does not preserve permissions correctly so i have to do this
|
||||||
|
exec.Command("chmod", "+x", c.Server.ServExec)
|
||||||
|
} else {
|
||||||
|
fmt.Println("Unable to access internet, please check connection.")
|
||||||
}
|
}
|
||||||
// zip does not preserve permissions correctly so i have to do this
|
|
||||||
exec.Command("chmod", "+x", c.Server.ServExec)
|
|
||||||
}
|
}
|
||||||
|
|||||||
12
utils.go
12
utils.go
@@ -4,10 +4,12 @@ import (
|
|||||||
"archive/zip"
|
"archive/zip"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
//Utilities
|
//Utilities
|
||||||
@@ -91,3 +93,13 @@ func unzip(src, dest string) ([]string, error) {
|
|||||||
|
|
||||||
return filenames, nil
|
return filenames, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func hasInternet() bool {
|
||||||
|
timeout := 2 * time.Second
|
||||||
|
conn, err := net.DialTimeout("tcp", "8.8.8.8:53", timeout)
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
conn.Close()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user