-
Notifications
You must be signed in to change notification settings - Fork 4
/
update.go
120 lines (97 loc) · 2.78 KB
/
update.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package db
import (
"archive/tar"
"compress/gzip"
"io"
"net/http"
"os"
"path"
"path/filepath"
"github.com/carbonetes/jacked/internal/ui/bar"
"github.com/carbonetes/jacked/internal/ui/spinner"
"github.com/google/uuid"
)
// Download using the provided url from the root metadata latest version and returns file path to be used on generating checksums.
func download(url string) string {
spinner.OnPause()
spinner.OnDatabaseUpdateStart()
var fileExt string = ".tar.gz"
var tempFile string = path.Join(os.TempDir(), "jacked-tmp-"+uuid.New().String()+fileExt)
out, err := os.OpenFile(tempFile, os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Error("Error creating temporary file: %v", err)
}
defer out.Close()
resp, err := http.Get(url)
if err != nil {
log.Error("Error downloading database: %v", err)
}
bar.OnDownloading(resp.ContentLength)
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
log.Error("Error downloading database: %v", resp.Status)
}
_, err = io.Copy(io.MultiWriter(out, bar.GetBar()), resp.Body)
if err != nil {
log.Error("Error copying downloaded data into output tar file: %v", err)
}
defer out.Close()
return tempFile
}
// Read tar file, extract all files.
func extractTarGz(target, extractionPath string) {
reader, err := os.Open(target)
if err != nil {
log.Fatalf("Error opening tar file: %v", err)
}
defer reader.Close()
fileStat, err := reader.Stat()
if err != nil {
log.Fatalf("Error reading file stat: %v", err)
}
bar.OnExtracting(fileStat.Size())
gzipReader, err := gzip.NewReader(reader)
if err != nil {
log.Fatalf("Error creating gzip reader: %v", err)
}
defer gzipReader.Close()
tarReader := tar.NewReader(gzipReader)
for {
header, err := tarReader.Next()
if err == io.EOF {
break
}
if err != nil {
log.Fatalf("Error reading tar header: %v", err)
}
switch header.Typeflag {
case tar.TypeDir:
if err := os.Mkdir(header.Name, 0755); err != nil {
log.Fatalf("Error creating directory: %v", err)
}
case tar.TypeReg:
_filepath := path.Join(extractionPath, header.Name)
err := os.MkdirAll(filepath.Dir(_filepath), 0700)
if err != nil {
log.Fatalf("Error creating relative path: %v", err)
}
out, err := os.Create(_filepath)
if err != nil {
log.Fatalf("Error creating output file: %v", err)
}
if _, err := io.Copy(io.MultiWriter(out, bar.GetBar()), tarReader); err != nil {
log.Fatalf("Error copying uncompressed data into output file: %v", err)
}
defer out.Close()
default:
log.Fatalf("Unknown tar header type flag")
}
}
}
// Deleting temporary files after using it on integrity file checking to clear up space.
func deleteTempFile(target string) {
err := os.Remove(target)
if err != nil {
log.Fatalf("Error deleting temp file: %v", err)
}
}