diff options
-rw-r--r-- | tools/updater/download.go | 118 | ||||
-rw-r--r-- | tools/updater/main.go | 109 | ||||
-rw-r--r-- | tools/updater/manifest.go | 56 |
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 } |