github.com/weiwenhao/getter@v1.30.1/cmd/go-getter/main.go (about) 1 package main 2 3 import ( 4 "context" 5 "flag" 6 "log" 7 "os" 8 "os/signal" 9 "sync" 10 11 getter "github.com/weiwenhao/getter" 12 ) 13 14 func main() { 15 modeRaw := flag.String("mode", "any", "get mode (any, file, dir)") 16 progress := flag.Bool("progress", false, "display terminal progress") 17 insecure := flag.Bool("insecure", false, "do not verify server's certificate chain (not recommended)") 18 flag.Parse() 19 args := flag.Args() 20 if len(args) < 2 { 21 log.Fatalf("Expected two args: URL and dst") 22 os.Exit(1) 23 } 24 25 // Get the mode 26 var mode getter.ClientMode 27 switch *modeRaw { 28 case "any": 29 mode = getter.ClientModeAny 30 case "file": 31 mode = getter.ClientModeFile 32 case "dir": 33 mode = getter.ClientModeDir 34 default: 35 log.Fatalf("Invalid client mode, must be 'any', 'file', or 'dir': %s", *modeRaw) 36 os.Exit(1) 37 } 38 39 // Get the pwd 40 pwd, err := os.Getwd() 41 if err != nil { 42 log.Fatalf("Error getting wd: %s", err) 43 } 44 45 opts := []getter.ClientOption{} 46 if *progress { 47 opts = append(opts, getter.WithProgress(defaultProgressBar)) 48 } 49 50 if *insecure { 51 log.Println("WARNING: Using Insecure TLS transport!") 52 opts = append(opts, getter.WithInsecure()) 53 } 54 55 ctx, cancel := context.WithCancel(context.Background()) 56 // Build the client 57 client := &getter.Client{ 58 Ctx: ctx, 59 Src: args[0], 60 Dst: args[1], 61 Pwd: pwd, 62 Mode: mode, 63 Options: opts, 64 } 65 66 wg := sync.WaitGroup{} 67 wg.Add(1) 68 errChan := make(chan error, 2) 69 go func() { 70 defer wg.Done() 71 defer cancel() 72 if err := client.Get(); err != nil { 73 errChan <- err 74 } 75 }() 76 77 c := make(chan os.Signal) 78 signal.Notify(c, os.Interrupt) 79 80 select { 81 case sig := <-c: 82 signal.Reset(os.Interrupt) 83 cancel() 84 wg.Wait() 85 log.Printf("signal %v", sig) 86 case <-ctx.Done(): 87 wg.Wait() 88 log.Printf("success!") 89 case err := <-errChan: 90 wg.Wait() 91 log.Fatalf("Error downloading: %s", err) 92 } 93 }