aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/updater/download.go118
-rw-r--r--tools/updater/main.go109
-rw-r--r--tools/updater/manifest.go56
3 files changed, 156 insertions, 127 deletions
diff --git a/tools/updater/download.go b/tools/updater/download.go
index b89703b..2adfe41 100644
--- a/tools/updater/download.go
+++ b/tools/updater/download.go
@@ -1,62 +1,90 @@
package main
import (
- "fmt"
- "strings"
- "os"
- "io"
- "net/http"
- "path/filepath"
+ "fmt"
+ "io"
+ "net/http"
+ "os"
+ "path/filepath"
+ "strings"
)
+func Min(x, y int64) int64 {
+ if x < y {
+ return x
+ }
+ return y
+}
+
+func Max(x, y int64) int64 {
+ if x > y {
+ return x
+ }
+ return y
+}
+
// WriteCounter counts the number of bytes written to it
type WriteCounter struct {
- Filepath string
- Total uint64
+ ContentLength int64
+ BytesWritten uint64
+
+ Step int64
+}
+
+func NewWriteCounter(contentLength int64) *WriteCounter {
+ ptr := new(WriteCounter)
+ ptr.ContentLength = contentLength
+ ptr.Step = Max(contentLength/20, 1)
+
+ return ptr
}
func (wc *WriteCounter) Write(p []byte) (int, error) {
- n := len(p)
- wc.Total += uint64(n)
- wc.PrintProgress()
- return n, nil
+ n := len(p)
+ wc.BytesWritten += uint64(n)
+ wc.PrintProgress()
+ return n, nil
}
func (wc *WriteCounter) PrintProgress() {
- // clear the line by using a character return to go back to the start of the
- // line and remove the remaining characters
- fmt.Printf("\r%s", strings.Repeat(" ", 35))
- fmt.Printf("\r[%s]... %d bytes complete", wc.Filepath, wc.Total)
+ // clear the line by using a character return to go back to the start of the
+ // line and remove the remaining characters
+ fmt.Printf("\r%s", strings.Repeat(" ", 35))
+
+ // steps can be at most 20 -> get the minimum of (n_steps) and 20
+ steps := int(Min(int64(wc.BytesWritten)/wc.Step, 20))
+
+ fmt.Printf("\r[%s%s] %d/%d bytes complete", strings.Repeat("#", steps), strings.Repeat(" ", 20-steps), wc.BytesWritten, wc.ContentLength)
}
func downloadFile(path string, url string) error {
- // make sure dir exists
- os.MkdirAll(filepath.Dir(path), 0777)
-
- // create .part file
- output, err := os.Create(path + ".part")
- if err != nil {
- return err
- }
- defer output.Close()
-
- // get data
- response, err := http.Get(url)
- if err != nil {
- return err
- }
- defer response.Body.Close()
-
- // create progress reporter
- counter := &WriteCounter{path, 0}
- _, err = io.Copy(output, io.TeeReader(response.Body, counter))
- if err != nil {
- return err
- }
-
- fmt.Printf("\n")
- //fmt.Printf("\r%s", strings.Repeat(" ", 40))
- os.Rename(path + ".part", path)
- //fmt.Printf("\r[%s] complete\n", path)
- return nil
+ // make sure dir exists
+ os.MkdirAll(filepath.Dir(path), 0755)
+
+ // create .part file
+ output, err := os.Create(path + ".part")
+ if err != nil {
+ return err
+ }
+ defer output.Close()
+
+ // get data
+ response, err := http.Get(url)
+ if err != nil {
+ return err
+ }
+ defer response.Body.Close()
+
+ // create progress reporter
+ counter := NewWriteCounter(response.ContentLength)
+ _, err = io.Copy(output, io.TeeReader(response.Body, counter))
+ if err != nil {
+ return err
+ }
+
+ fmt.Printf("\n")
+ //fmt.Printf("\r%s", strings.Repeat(" ", 40))
+ os.Rename(path+".part", path)
+ //fmt.Printf("\r[%s] complete\n", path)
+ return nil
}
diff --git a/tools/updater/main.go b/tools/updater/main.go
index f4feb62..1b2cc4c 100644
--- a/tools/updater/main.go
+++ b/tools/updater/main.go
@@ -1,63 +1,64 @@
package main
import (
- "flag"
- "fmt"
- "os"
- "net/http"
- "bufio"
- "strings"
+ "bufio"
+ "flag"
+ "fmt"
+ "net/http"
+ "os"
+ "strings"
)
func main() {
- helpFlag := flag.Bool("help", false, "Show help information")
- verboseFlag := flag.Bool("verbose", false, "Print more information")
- repoFlag := flag.String("repo", "https://neueland.iserlohn-fortress.net/smolbote/downloads", "Repository path")
- //dryRunFlag := flag.Bool("dry-run", false, "Dry run")
-
- flag.Parse()
-
- // help flag --> show usage and exit
- if *helpFlag {
- fmt.Println("Usage:")
- flag.PrintDefaults()
- os.Exit(0)
- }
-
- manifestPath := *repoFlag + "/windows-sha512.txt"
- repoPath := *repoFlag + "/windows/"
-
- if *verboseFlag {
- fmt.Println("repoFlag =", *repoFlag)
- fmt.Println("manifest =", manifestPath)
- fmt.Println("repoPath =", repoPath)
- }
-
- response, err := http.Get(manifestPath)
- if err != nil {
- panic(err)
- }
- defer response.Body.Close()
-
- scanner := bufio.NewScanner(response.Body)
- for scanner.Scan() {
- s := strings.Split(scanner.Text(), " ")
-
- filepath := s[1]
- checksum := s[0]
-
- state, err := checkFile(filepath, checksum)
- if err != nil {
- panic(err)
- }
-
- if(state) {
- fmt.Printf("[%s] passed\n", filepath)
- } else {
- fmt.Printf("[%s] missing or mismatching\n", filepath)
- downloadFile(filepath, repoPath + filepath)
- }
- }
+ helpFlag := flag.Bool("help", false, "Show help information")
+ verboseFlag := flag.Bool("verbose", false, "Print more information")
+ repoFlag := flag.String("repo", "https://neueland.iserlohn-fortress.net/smolbote/downloads", "Repository path")
+ dryRunFlag := flag.Bool("dry-run", false, "Dry run: only check files, do not download")
+ flag.Parse()
+
+ // help flag --> show usage and exit
+ if *helpFlag {
+ fmt.Println("Usage:")
+ flag.PrintDefaults()
+ os.Exit(0)
+ }
+
+ manifestPath := *repoFlag + "/windows-sha512.txt"
+ repoPath := *repoFlag + "/windows/"
+
+ if *verboseFlag {
+ fmt.Println("repoFlag =", *repoFlag)
+ fmt.Println("manifest =", manifestPath)
+ fmt.Println("repoPath =", repoPath)
+ }
+
+ response, err := http.Get(manifestPath)
+ if err != nil {
+ panic(err)
+ }
+ defer response.Body.Close()
+
+ scanner := bufio.NewScanner(response.Body)
+ for scanner.Scan() {
+ s := strings.Split(scanner.Text(), " ")
+
+ filepath := s[1]
+ checksum := s[0]
+
+ state, err := checkFile(filepath, checksum)
+ if err != nil {
+ panic(err)
+ }
+
+ if state {
+ fmt.Printf("[%s] passed\n", filepath)
+ } else {
+ fmt.Printf("[%s] missing or mismatching\n", filepath)
+ if !*dryRunFlag {
+ downloadFile(filepath, repoPath+filepath)
+ }
+ }
+ }
}
diff --git a/tools/updater/manifest.go b/tools/updater/manifest.go
index 942a5e7..0d8bfae 100644
--- a/tools/updater/manifest.go
+++ b/tools/updater/manifest.go
@@ -1,41 +1,41 @@
package main
import (
- "crypto/sha512"
- "os"
- "io"
- "fmt"
+ "crypto/sha512"
+ "fmt"
+ "io"
+ "os"
)
func checkFile(filepath string, checksum string) (bool, error) {
- if _, err := os.Stat(filepath); os.IsNotExist(err) {
- return false, nil
- }
+ if _, err := os.Stat(filepath); os.IsNotExist(err) {
+ return false, nil
+ }
- // file exists, check checksum
- lsum, err := hash(filepath)
- if err != nil {
- return false, err
- }
+ // file exists, check checksum
+ lsum, err := hash(filepath)
+ if err != nil {
+ return false, err
+ }
- if checksum != fmt.Sprintf("%x", lsum) {
- return false, nil
- }
+ if checksum != fmt.Sprintf("%x", lsum) {
+ return false, nil
+ }
- return true, nil
+ return true, nil
}
func hash(filepath string) ([]byte, error) {
- file, err := os.Open(filepath)
- if err != nil {
- return nil, err
- }
- defer file.Close()
-
- hasher := sha512.New()
- if _, err := io.Copy(hasher, file); err != nil {
- return nil, err
- }
-
- return hasher.Sum(nil), nil
+ file, err := os.Open(filepath)
+ if err != nil {
+ return nil, err
+ }
+ defer file.Close()
+
+ hasher := sha512.New()
+ if _, err := io.Copy(hasher, file); err != nil {
+ return nil, err
+ }
+
+ return hasher.Sum(nil), nil
}