| skipped 1 lines |
2 | 2 | | |
3 | 3 | | import ( |
4 | 4 | | "fmt" |
| 5 | + | "os" |
5 | 6 | | "time" |
| 7 | + | |
| 8 | + | "github.com/cavaliergopher/grab/v3" |
| 9 | + | "github.com/zan8in/afrog/pkg/upgrade" |
6 | 10 | | ) |
7 | 11 | | |
8 | | - | // Bar ... |
9 | | - | type Bar struct { |
10 | | - | percent int64 // progress percentage |
11 | | - | cur int64 // current progress |
12 | | - | total int64 // total value for progress |
13 | | - | rate string // the actual progress bar to be printed |
14 | | - | graph string // the fill value for progress bar |
| 12 | + | func VersionOrdinal(version string) string { |
| 13 | + | // ISO/IEC 14651:2011 |
| 14 | + | const maxByte = 1<<8 - 1 |
| 15 | + | vo := make([]byte, 0, len(version)+8) |
| 16 | + | j := -1 |
| 17 | + | for i := 0; i < len(version); i++ { |
| 18 | + | b := version[i] |
| 19 | + | if '0' > b || b > '9' { |
| 20 | + | vo = append(vo, b) |
| 21 | + | j = -1 |
| 22 | + | continue |
| 23 | + | } |
| 24 | + | if j == -1 { |
| 25 | + | vo = append(vo, 0x00) |
| 26 | + | j = len(vo) - 1 |
| 27 | + | } |
| 28 | + | if vo[j] == 1 && vo[j+1] == '0' { |
| 29 | + | vo[j+1] = b |
| 30 | + | continue |
| 31 | + | } |
| 32 | + | if vo[j]+1 > maxByte { |
| 33 | + | panic("VersionOrdinal: invalid version") |
| 34 | + | } |
| 35 | + | vo = append(vo, b) |
| 36 | + | vo[j]++ |
| 37 | + | } |
| 38 | + | return string(vo) |
15 | 39 | | } |
16 | 40 | | |
17 | | - | func (bar *Bar) NewOption(start, total int64) { |
18 | | - | bar.cur = start |
19 | | - | bar.total = total |
20 | | - | if bar.graph == "" { |
21 | | - | bar.graph = "█" |
22 | | - | } |
23 | | - | bar.percent = bar.getPercent() |
24 | | - | for i := 0; i < int(bar.percent); i += 2 { |
25 | | - | bar.rate += bar.graph // initial progress position |
26 | | - | } |
27 | | - | } |
| 41 | + | func main() { |
| 42 | + | fmt.Println("1.2" > "1.1.1") |
| 43 | + | |
| 44 | + | return |
| 45 | + | upgrade := upgrade.New() |
| 46 | + | upgrade.UpgradeAfrogPocs() |
| 47 | + | return |
| 48 | + | // uz := utils.NewUnzip() |
| 49 | + | |
| 50 | + | // files, err := uz.Extract("./afrog-pocs.zip", "./cmd/download/") |
| 51 | + | // if err != nil { |
| 52 | + | // fmt.Println(err) |
| 53 | + | // } |
| 54 | + | |
| 55 | + | // fmt.Printf("extracted files count: %d", len(files)) |
| 56 | + | // fmt.Printf("files list: %v", files) |
| 57 | + | // create client |
| 58 | + | client := grab.NewClient() |
| 59 | + | req, _ := grab.NewRequest(".", "http://binbin.run/afrog-pocs.zip") |
| 60 | + | |
| 61 | + | // start download |
| 62 | + | fmt.Printf("Downloading %v...\n", req.URL()) |
| 63 | + | resp := client.Do(req) |
| 64 | + | fmt.Printf(" %v\n", resp.HTTPResponse.Status) |
| 65 | + | |
| 66 | + | // start UI loop |
| 67 | + | t := time.NewTicker(500 * time.Millisecond) |
| 68 | + | defer t.Stop() |
28 | 69 | | |
29 | | - | func (bar *Bar) getPercent() int64 { |
30 | | - | return int64((float32(bar.cur) / float32(bar.total)) * 100) |
31 | | - | } |
| 70 | + | Loop: |
| 71 | + | for { |
| 72 | + | select { |
| 73 | + | case <-t.C: |
| 74 | + | fmt.Printf("\rtransferred %v / %v bytes (%.2f%%)\n", |
| 75 | + | resp.BytesComplete(), |
| 76 | + | resp.Size, |
| 77 | + | 100*resp.Progress()) |
32 | 78 | | |
33 | | - | func (bar *Bar) Play(cur int64) { |
34 | | - | bar.cur = cur |
35 | | - | last := bar.percent |
36 | | - | bar.percent = bar.getPercent() |
37 | | - | if bar.percent != last && bar.percent%2 == 0 { |
38 | | - | bar.rate += bar.graph |
| 79 | + | case <-resp.Done: |
| 80 | + | // download is complete |
| 81 | + | break Loop |
| 82 | + | } |
39 | 83 | | } |
40 | | - | fmt.Printf("\r%-50s%3d%% %8d/%d", bar.rate, bar.percent, bar.cur, bar.total) |
41 | | - | } |
42 | 84 | | |
43 | | - | func (bar *Bar) Finish() { |
44 | | - | fmt.Println() |
45 | | - | } |
| 85 | + | // check for errors |
| 86 | + | if err := resp.Err(); err != nil { |
| 87 | + | fmt.Fprintf(os.Stderr, "Download failed: %v\n", err) |
| 88 | + | os.Exit(1) |
| 89 | + | } |
| 90 | + | |
| 91 | + | fmt.Printf("Download saved to %v \n", resp.Filename) |
46 | 92 | | |
47 | | - | func main() { |
48 | | - | var bar Bar |
49 | | - | bar.NewOption(0, 100) |
50 | | - | for i := 0; i <= 100; i++ { |
51 | | - | time.Sleep(100 * time.Millisecond) |
52 | | - | bar.Play(int64(i)) |
53 | | - | } |
54 | | - | bar.Finish() |
| 93 | + | // Output: |
| 94 | + | // Downloading http://www.golang-book.com/public/pdf/gobook.pdf... |
| 95 | + | // 200 OK |
| 96 | + | // transferred 42970 / 2893557 bytes (1.49%) |
| 97 | + | // transferred 1207474 / 2893557 bytes (41.73%) |
| 98 | + | // transferred 2758210 / 2893557 bytes (95.32%) |
| 99 | + | // Download saved to ./gobook.pdf |
55 | 100 | | } |
56 | 101 | | |