github.com/simpleiot/simpleiot@v0.18.3/cmd/fetch/main.go (about)

     1  // test download program
     2  package main
     3  
     4  import (
     5  	"flag"
     6  	"fmt"
     7  	"io"
     8  	"log"
     9  	"net/http"
    10  	"net/url"
    11  	"os"
    12  	"path"
    13  	"time"
    14  
    15  	"github.com/cavaliercoder/grab"
    16  )
    17  
    18  // test app to evaluate the grab http client for downloading OS updates
    19  // we've had trouble downloading over Cat-M connections where the download
    20  // will stall, so the this app is used to debug these downloads.
    21  
    22  func httpDownload(url, fn string) {
    23  
    24  	file, err := os.Create(fn)
    25  	if err != nil {
    26  		log.Println("App update: error creating file:", err)
    27  		return
    28  	}
    29  
    30  	defer file.Close()
    31  
    32  	var netClient = &http.Client{
    33  		Timeout: 30 * time.Minute,
    34  	}
    35  
    36  	// Get the data
    37  	resp, err := netClient.Get(url)
    38  	if err != nil {
    39  		log.Println("App update: error getting update file:", err)
    40  		return
    41  	}
    42  	defer resp.Body.Close()
    43  
    44  	// copy to file
    45  	_, err = io.Copy(file, resp.Body)
    46  
    47  	if err != nil {
    48  		log.Println("App update: error downloading update file:", err)
    49  		return
    50  	}
    51  
    52  	log.Println("Download finished")
    53  
    54  }
    55  
    56  func grabDownload(url, fn string) {
    57  	file, err := os.Create(fn)
    58  	if err != nil {
    59  		log.Println("App update: error creating file:", err)
    60  		return
    61  	}
    62  
    63  	defer file.Close()
    64  
    65  	client := grab.NewClient()
    66  	req, _ := grab.NewRequest(fn, url)
    67  	// ...
    68  	resp := client.Do(req)
    69  
    70  	t := time.NewTicker(time.Second)
    71  	defer t.Stop()
    72  
    73  	for {
    74  		select {
    75  		case <-t.C:
    76  			fmt.Printf("%.02f%% complete, %.02f B/sec\n",
    77  				resp.Progress()*100,
    78  				resp.BytesPerSecond())
    79  
    80  		case <-resp.Done:
    81  			if err := resp.Err(); err != nil {
    82  				log.Println("Error downloading:", err)
    83  			}
    84  			return
    85  		}
    86  	}
    87  }
    88  
    89  func usage() {
    90  	fmt.Println("Usage: ")
    91  	flag.PrintDefaults()
    92  	os.Exit(-1)
    93  }
    94  
    95  func main() {
    96  
    97  	flagGohttp := flag.Bool("gohttp", false, "use Go http client")
    98  	flagGrab := flag.Bool("grab", false, "use grab http client")
    99  	flagURL := flag.String("url", "", "URL of file to download")
   100  
   101  	flag.Parse()
   102  
   103  	if *flagURL == "" {
   104  		log.Println("Must set URL")
   105  	}
   106  
   107  	if !*flagGohttp && !*flagGrab {
   108  		log.Println("Must set -gohttp or -grab option", *flagGohttp, *flagGrab)
   109  		usage()
   110  	}
   111  
   112  	url, err := url.Parse(*flagURL)
   113  
   114  	if err != nil {
   115  		log.Println("Error parsing url:", err)
   116  		os.Exit(-1)
   117  	}
   118  
   119  	urlPath := url.EscapedPath()
   120  	_, fn := path.Split(urlPath)
   121  
   122  	if *flagGohttp {
   123  		httpDownload(url.String(), fn)
   124  	}
   125  
   126  	if *flagGrab {
   127  		grabDownload(url.String(), fn)
   128  	}
   129  }