forked from arduino/arduino-create-agent
/
download.go
124 lines (101 loc) · 3.07 KB
/
download.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
121
122
123
124
// download.go
package main
import (
"encoding/json"
"errors"
log "github.com/Sirupsen/logrus"
"io"
"io/ioutil"
"net/http"
"os"
"path/filepath"
"runtime"
"strings"
)
func saveFileonTempDir(filename string, sketch io.Reader) (path string, err error) {
// create tmp dir
tmpdir, err := ioutil.TempDir("", "arduino-create-agent")
if err != nil {
return "", errors.New("Could not create temp directory to store downloaded file. Do you have permissions?")
}
filename, _ = filepath.Abs(tmpdir + "/" + filename)
output, err := os.Create(filename)
if err != nil {
log.Println("Error while creating", filename, "-", err)
return filename, err
}
defer output.Close()
n, err := io.Copy(output, sketch)
if err != nil {
log.Println("Error while copying", err)
return filename, err
}
log.Println(n, "bytes saved")
return filename, nil
}
func downloadFromUrl(url string) (filename string, err error) {
// clean up url
// remove newlines and space at end
url = strings.TrimSpace(url)
// create tmp dir
tmpdir, err := ioutil.TempDir("", "arduino-create-agent")
if err != nil {
return "", errors.New("Could not create temp directory to store downloaded file. Do you have permissions?")
}
tokens := strings.Split(url, "/")
filePrefix := tokens[len(tokens)-1]
log.Println("The filePrefix is", filePrefix)
fileName, _ := filepath.Abs(tmpdir + "/" + filePrefix)
log.Println("Downloading", url, "to", fileName)
// TODO: check file existence first with io.IsExist
output, err := os.Create(fileName)
if err != nil {
log.Println("Error while creating", fileName, "-", err)
return fileName, err
}
defer output.Close()
response, err := http.Get(url)
if err != nil {
log.Println("Error while downloading", url, "-", err)
return fileName, err
}
defer response.Body.Close()
n, err := io.Copy(output, response.Body)
if err != nil {
log.Println("Error while downloading", url, "-", err)
return fileName, err
}
log.Println(n, "bytes downloaded.")
return fileName, nil
}
func spDownloadTool(name string, url string) {
if _, err := os.Stat(tempToolsPath + "/" + name); err != nil {
fileName, err := downloadFromUrl(url + "/" + name + "-" + runtime.GOOS + "-" + runtime.GOARCH + ".zip")
if err != nil {
log.Error("Could not download flashing tools!")
mapD := map[string]string{"DownloadStatus": "Error", "Msg": err.Error()}
mapB, _ := json.Marshal(mapD)
h.broadcastSys <- mapB
return
}
err = UnzipWrapper(fileName, tempToolsPath)
if err != nil {
log.Error("Could not unzip flashing tools!")
mapD := map[string]string{"DownloadStatus": "Error", "Msg": err.Error()}
mapB, _ := json.Marshal(mapD)
h.broadcastSys <- mapB
return
}
} else {
log.Info("Tool already present, skipping download")
}
folders, _ := ioutil.ReadDir(tempToolsPath)
for _, f := range folders {
globalToolsMap["{runtime.tools."+f.Name()+".path}"] = filepath.ToSlash(tempToolsPath + "/" + f.Name())
}
log.Info("Map Updated")
mapD := map[string]string{"DownloadStatus": "Success", "Msg": "Map Updated"}
mapB, _ := json.Marshal(mapD)
h.broadcastSys <- mapB
return
}