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  }