~snappy-dev/snappy/trunk-github

« back to all changes in this revision

Viewing changes to snappy/snap_remote.go

  • Committer: Zygmunt Krynicki
  • Date: 2016-02-05 11:26:28 UTC
  • mfrom: (1131)
  • mto: This revision was merged to the branch mainline in revision 1137.
  • Revision ID: git-v1:2f4cd12f5eb1dde16f4e7b59561026d0d125f377
Merge branch 'master' of github.com:ubuntu-core/snappy into cmd-output-testing

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
package snappy
21
21
 
22
22
import (
23
 
        "io"
24
 
        "io/ioutil"
25
 
        "net/http"
26
23
        "os"
27
24
        "time"
28
25
 
119
116
        return p
120
117
}
121
118
 
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{}
125
 
 
126
 
        resp, err := client.Do(req)
127
 
        if err != nil {
128
 
                return err
129
 
        }
130
 
        defer resp.Body.Close()
131
 
 
132
 
        if resp.StatusCode != 200 {
133
 
                return &ErrDownload{Code: resp.StatusCode, URL: req.URL}
134
 
        }
135
 
 
136
 
        if pbar != nil {
137
 
                pbar.Start(name, float64(resp.ContentLength))
138
 
                mw := io.MultiWriter(w, pbar)
139
 
                _, err = io.Copy(mw, resp.Body)
140
 
                pbar.Finished()
141
 
        } else {
142
 
                _, err = io.Copy(w, resp.Body)
143
 
        }
144
 
 
145
 
        return err
146
 
}
147
 
 
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)
151
 
        if err != nil {
152
 
                return "", err
153
 
        }
154
 
        defer func() {
155
 
                if err != nil {
156
 
                        os.Remove(w.Name())
157
 
                }
158
 
        }()
159
 
        defer w.Close()
160
 
 
161
 
        // try anonymous download first and fallback to authenticated
162
 
        url := s.pkg.AnonDownloadURL
163
 
        if url == "" {
164
 
                url = s.pkg.DownloadURL
165
 
        }
166
 
        req, err := http.NewRequest("GET", url, nil)
167
 
        if err != nil {
168
 
                return "", err
169
 
        }
170
 
        setUbuntuStoreHeaders(req)
171
 
 
172
 
        if err := download(s.Name(), w, req, pbar); err != nil {
173
 
                return "", err
174
 
        }
175
 
 
176
 
        return w.Name(), w.Sync()
177
 
}
178
 
 
179
119
func (s *RemoteSnapPart) saveStoreManifest() error {
180
120
        content, err := yaml.Marshal(s.pkg)
181
121
        if err != nil {
190
130
        return helpers.AtomicWriteFile(RemoteManifestPath(s), content, 0644, 0)
191
131
}
192
132
 
193
 
// Install installs the snap
194
 
func (s *RemoteSnapPart) Install(pbar progress.Meter, flags InstallFlags) (string, error) {
195
 
        downloadedSnap, err := s.Download(pbar)
196
 
        if err != nil {
197
 
                return "", err
198
 
        }
199
 
        defer os.Remove(downloadedSnap)
200
 
 
201
 
        if err := s.saveStoreManifest(); err != nil {
202
 
                return "", err
203
 
        }
204
 
 
205
 
        sf, err := (&Overlord{}).Install(downloadedSnap, s.Origin(), flags, pbar)
206
 
        if err != nil {
207
 
                return "", err
208
 
        }
209
 
 
210
 
        return sf.Name(), nil
211
 
}
212
 
 
213
133
// SetActive sets the snap active
214
134
func (s *RemoteSnapPart) SetActive(bool, progress.Meter) error {
215
135
        return ErrNotInstalled