diff options
Diffstat (limited to 'tools/updater')
| -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  } | 
