diff --git a/factoryman b/factoryman index 674a33f..fe45087 100755 Binary files a/factoryman and b/factoryman differ diff --git a/serv-install.go b/serv-install.go index f362810..820908e 100644 --- a/serv-install.go +++ b/serv-install.go @@ -1,35 +1,46 @@ package main import ( + "archive/tar" "fmt" + "io" "log" + "net/http" "os" - "os/exec" + "path/filepath" + + "github.com/therootcompany/xz" ) func downloadHeadless() { - var c = readCfg("config.yml") - headlessQuery := fmt.Sprintf("https://www.factorio.com/get-download/latest/headless/linux64?username=%s&token=%s", c.Factoryman.UserName, c.Factoryman.ApiToken) + headlessQuery := fmt.Sprintf("https://www.factorio.com/get-download/latest/headless/linux64") - dlerr := download("./factorio.tar.xz", headlessQuery) - if dlerr != nil { - log.Fatalf("Unable to download: %v", dlerr) + url := headlessQuery + resp, err := http.Get(url) + if err != nil || resp.StatusCode != http.StatusOK { + log.Fatal("Download failed") } + defer resp.Body.Close() - err := os.MkdirAll(c.Server.ServDir, os.ModePerm) - if err != nil { - fmt.Printf("Error creating directory: %v\n", err) - return + // 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 + } + + 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() + } } - - fmt.Println("tar", "-xf", "factorio.tar.xz", "-C", c.Server.ServDir+"/") - cmd := exec.Command("tar", "-xf", "factorio.tar.xz", "-C") - - // 2. Run and capture Standard Output - out, err := cmd.Output() - if err != nil { - log.Fatal(err) - } - fmt.Println(err) - fmt.Println(string(out)) }