From c169ce95ee20d8cbab793c4f656d5eea4650612a Mon Sep 17 00:00:00 2001 From: lalyos Date: Thu, 25 Feb 2016 15:39:30 +0100 Subject: [PATCH] initial version --- main.go | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 main.go diff --git a/main.go b/main.go new file mode 100644 index 0000000..b6f3f73 --- /dev/null +++ b/main.go @@ -0,0 +1,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 / 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") +}