internal.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package updates
  2. import (
  3. "archive/tar"
  4. "compress/gzip"
  5. "errors"
  6. "io"
  7. "net/http"
  8. "os"
  9. "path/filepath"
  10. "strconv"
  11. )
  12. func getFileSize(filename string) int64 {
  13. fi, err := os.Stat(filename)
  14. if err != nil {
  15. return -1
  16. }
  17. // get the size
  18. return fi.Size()
  19. }
  20. func getDownloadFileSize(url string) (int, error) {
  21. headResp, err := http.Head(url)
  22. if err != nil {
  23. return -1, err
  24. }
  25. defer headResp.Body.Close()
  26. return strconv.Atoi(headResp.Header.Get("Content-Length"))
  27. }
  28. func downloadFile(url string, dest string) error {
  29. out, err := os.Create(dest)
  30. if err != nil {
  31. return err
  32. }
  33. defer out.Close()
  34. if err != nil {
  35. return err
  36. }
  37. resp, err := http.Get(url)
  38. if err != nil {
  39. return err
  40. }
  41. defer resp.Body.Close()
  42. _, err = io.Copy(out, resp.Body)
  43. if err != nil {
  44. return err
  45. }
  46. return nil
  47. }
  48. func extractTarGz(gzipStream io.Reader, unzipPath string, progressUpdateFunction func(int, float64, string)) error {
  49. uncompressedStream, err := gzip.NewReader(gzipStream)
  50. if err != nil {
  51. return err
  52. }
  53. tarReader := tar.NewReader(uncompressedStream)
  54. for {
  55. header, err := tarReader.Next()
  56. if err == io.EOF {
  57. break
  58. }
  59. if err != nil {
  60. return err
  61. }
  62. switch header.Typeflag {
  63. case tar.TypeDir:
  64. if err := os.Mkdir(filepath.Join(unzipPath, header.Name), 0755); err != nil {
  65. return err
  66. }
  67. case tar.TypeReg:
  68. progressUpdateFunction(2, 100, "Extracting: "+header.Name)
  69. outFile, err := os.Create(filepath.Join(unzipPath, header.Name))
  70. if err != nil {
  71. return err
  72. }
  73. if _, err := io.Copy(outFile, tarReader); err != nil {
  74. return err
  75. }
  76. outFile.Close()
  77. default:
  78. return errors.New("Unable to decode .tar.gz")
  79. }
  80. }
  81. return nil
  82. }