This repository has been archived by the owner on Feb 9, 2022. It is now read-only.
/
package_installer.go
79 lines (64 loc) · 1.61 KB
/
package_installer.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
package eirinistaging
import (
"fmt"
"io"
"net/http"
"os"
"path/filepath"
"github.com/pkg/errors"
)
type ReaderFrom func(io.Reader) io.Reader
type PackageInstaller struct {
client *http.Client
downloadURL string
downloadDir string
readerFrom ReaderFrom
}
func NewPackageManager(
client *http.Client,
downloadURL,
downloadDir string,
readerFrom ReaderFrom,
) Installer {
return &PackageInstaller{
client: client,
downloadURL: downloadURL,
downloadDir: downloadDir,
readerFrom: readerFrom,
}
}
func (d *PackageInstaller) Install() error {
if d.downloadURL == "" {
return errors.New("empty downloadURL provided")
}
if d.downloadDir == "" {
return errors.New("empty downloadDir provided")
}
downloadPath := filepath.Join(d.downloadDir, AppBits)
err := d.download(d.downloadURL, downloadPath)
return errors.Wrap(err, "download from "+d.downloadURL)
}
func (d *PackageInstaller) download(downloadURL string, filepath string) error {
file, err := os.Create(filepath)
if err != nil {
return fmt.Errorf("failed to create file: %w", err)
}
defer file.Close()
resp, err := d.client.Get(downloadURL)
if err != nil {
return errors.Wrapf(err, "failed to perform get request on: %s", downloadURL)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("download failed. status code %d", resp.StatusCode)
}
var responseReader io.Reader = resp.Body
if d.readerFrom != nil {
responseReader = d.readerFrom(resp.Body)
}
_, err = io.Copy(file, responseReader)
if err != nil {
return errors.Wrap(err, "failed to copy content to file")
}
return nil
}