-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.go
99 lines (80 loc) · 1.75 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package main
import (
"fmt"
"io/ioutil"
"log"
"os"
"os/exec"
"strconv"
"strings"
"sync"
"time"
"github.com/sethgrid/multibar"
"gopkg.in/yaml.v2"
)
func poll(cmd string) (int, int) {
out, err := exec.Command("sh", "-c", cmd).Output()
if err != nil {
fmt.Printf("[OUTUT] %s\n", out)
log.Fatal(err)
}
parts := strings.Split(string(out), "/")
if len(parts) != 2 {
log.Fatalf("Command should have returned <actual>/<total> instead it was:", out)
}
act, err := strconv.Atoi(strings.TrimSpace(parts[0]))
if err != nil {
log.Fatal(err)
}
summ, err := strconv.Atoi(strings.TrimSpace(parts[1]))
if err != nil {
log.Fatal(err)
}
return act, summ
}
func main() {
log.Println("poll progress ...")
if len(os.Args) < 2 {
log.Fatal("yaml file is required")
}
data, err := ioutil.ReadFile(os.Args[1])
if err != nil {
log.Fatalf("Cloudn't read file: %v", err)
}
var obj map[string]string
err = yaml.Unmarshal([]byte(data), &obj)
progressBars, _ := multibar.New()
progressBars.Println("Azure blob copy progress:")
wg := &sync.WaitGroup{}
wg.Add(len(obj))
totals := map[string]int{}
for task, cmd := range obj {
go func(task, cmd string) {
_, summ := poll(cmd)
totals[task] = summ
wg.Done()
}(task, cmd)
}
wg.Wait()
wg.Add(len(obj))
for task, cmd := range obj {
p := progressBars.MakeBar(totals[task], fmt.Sprintf("%-30s", task))
go func(task, cmd string, progressFn multibar.ProgressFunc) {
act, summ := poll(cmd)
progressFn(act)
for act < summ {
act, _ = poll(cmd)
progressFn(act)
}
wg.Done()
}(task, cmd, p)
}
go progressBars.Listen()
//time.Sleep(time.Second * 3)
for _, b := range progressBars.Bars {
b.Update(0)
}
wg.Wait()
time.Sleep(time.Second * 1)
fmt.Println("DONE")
}