/
file_download.go
55 lines (43 loc) · 1.85 KB
/
file_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
package cmd
import (
"os"
"time"
"github.com/cheggaaa/pb"
"github.com/dpb587/metalink"
cliverification "github.com/dpb587/metalink/cli/verification"
"github.com/dpb587/metalink/file/metaurl"
"github.com/dpb587/metalink/file/url"
"github.com/dpb587/metalink/transfer"
"github.com/dpb587/metalink/verification"
"github.com/pkg/errors"
)
type FileDownload struct {
Meta4File
URLLoader url.Loader `no-flag:"true"`
MetaURLLoader metaurl.Loader `no-flag:"true"`
Verification cliverification.DynamicVerifier `no-flag:"true"`
SkipHashVerification bool `long:"skip-hash-verification" description:"Skip hash verification after download"`
SkipSignatureVerification bool `long:"skip-signature-verification" description:"Skip signature verification after download"`
SignatureTrustStore string `long:"signature-trust-store" description:"Path to file with signature trust store"`
Args FileDownloadArgs `positional-args:"true" required:"true"`
}
type FileDownloadArgs struct {
Local string `positional-arg-name:"PATH" description:"Path to the blob file"`
}
func (c *FileDownload) Execute(_ []string) error {
file, err := c.Meta4File.Get()
if err != nil {
return err
}
local, err := c.URLLoader.LoadURL(metalink.URL{URL: c.Args.Local})
if err != nil {
return errors.Wrap(err, "Parsing download destination")
}
progress := pb.New64(int64(file.Size)).Set(pb.Bytes, true).SetRefreshRate(time.Second).SetWidth(80)
verifier, err := c.Verification.GetVerifier(file, c.SkipHashVerification, c.SkipSignatureVerification, c.SignatureTrustStore)
if err != nil {
return errors.Wrap(err, "Preparing verification")
}
downloader := transfer.NewVerifiedTransfer(c.MetaURLLoader, c.URLLoader, verifier)
return downloader.TransferFile(file, local, progress, verification.NewSimpleVerificationResultReporter(os.Stdout))
}