122
// download writes an http.Request showing a progress.Meter
123
func download(name string, w io.Writer, req *http.Request, pbar progress.Meter) error {
124
client := &http.Client{}
126
resp, err := client.Do(req)
130
defer resp.Body.Close()
132
if resp.StatusCode != 200 {
133
return &ErrDownload{Code: resp.StatusCode, URL: req.URL}
137
pbar.Start(name, float64(resp.ContentLength))
138
mw := io.MultiWriter(w, pbar)
139
_, err = io.Copy(mw, resp.Body)
142
_, err = io.Copy(w, resp.Body)
148
// Download downloads the snap and returns the filename
149
func (s *RemoteSnapPart) Download(pbar progress.Meter) (string, error) {
150
w, err := ioutil.TempFile("", s.pkg.Name)
161
// try anonymous download first and fallback to authenticated
162
url := s.pkg.AnonDownloadURL
164
url = s.pkg.DownloadURL
166
req, err := http.NewRequest("GET", url, nil)
170
setUbuntuStoreHeaders(req)
172
if err := download(s.Name(), w, req, pbar); err != nil {
176
return w.Name(), w.Sync()
179
119
func (s *RemoteSnapPart) saveStoreManifest() error {
180
120
content, err := yaml.Marshal(s.pkg)
190
130
return helpers.AtomicWriteFile(RemoteManifestPath(s), content, 0644, 0)
193
// Install installs the snap
194
func (s *RemoteSnapPart) Install(pbar progress.Meter, flags InstallFlags) (string, error) {
195
downloadedSnap, err := s.Download(pbar)
199
defer os.Remove(downloadedSnap)
201
if err := s.saveStoreManifest(); err != nil {
205
sf, err := (&Overlord{}).Install(downloadedSnap, s.Origin(), flags, pbar)
210
return sf.Name(), nil
213
133
// SetActive sets the snap active
214
134
func (s *RemoteSnapPart) SetActive(bool, progress.Meter) error {
215
135
return ErrNotInstalled