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
|
package sources
import (
"errors"
"fmt"
"net/url"
"path/filepath"
"github.com/lxc/distrobuilder/shared"
)
type funtoo struct {
common
}
// Run downloads a Funtoo stage3 tarball.
func (s *funtoo) Run() error {
topLevelArch := s.definition.Image.ArchitectureMapped
switch topLevelArch {
case "generic_32":
topLevelArch = "x86-32bit"
case "generic_64":
topLevelArch = "x86-64bit"
case "armv7a_vfpv3_hardfp":
topLevelArch = "arm-32bit"
case "arm64_generic":
topLevelArch = "arm-64bit"
}
// Keep release backward compatible to old implementation
// and to permit to have yet the funtoo/1.4 alias.
if s.definition.Image.Release == "1.4" {
s.definition.Image.Release = "1.4-release-std"
}
baseURL := fmt.Sprintf("%s/%s/%s/%s",
s.definition.Source.URL, s.definition.Image.Release,
topLevelArch, s.definition.Image.ArchitectureMapped)
// Get the latest release tarball.
fname := "stage3-latest.tar.xz"
tarball := fmt.Sprintf("%s/%s", baseURL, fname)
url, err := url.Parse(tarball)
if err != nil {
return fmt.Errorf("Failed to parse URL %q: %w", tarball, err)
}
if !s.definition.Source.SkipVerification && url.Scheme != "https" &&
len(s.definition.Source.Keys) == 0 {
return errors.New("GPG keys are required if downloading from HTTP")
}
var fpath string
fpath, err = s.DownloadHash(s.definition.Image, tarball, "", nil)
if err != nil {
return fmt.Errorf("Failed to download %q: %w", tarball, err)
}
// Force gpg checks when using http
if !s.definition.Source.SkipVerification && url.Scheme != "https" {
_, err = s.DownloadHash(s.definition.Image, tarball+".gpg", "", nil)
if err != nil {
return fmt.Errorf("Failed to download %q: %w", tarball+".gpg", err)
}
valid, err := s.VerifyFile(
filepath.Join(fpath, fname),
filepath.Join(fpath, fname+".gpg"))
if err != nil {
return fmt.Errorf("Failed to verify file: %w", err)
}
if !valid {
return fmt.Errorf("Invalid signature for %q", filepath.Join(fpath, fname))
}
}
s.logger.WithField("file", filepath.Join(fpath, fname)).Info("Unpacking image")
// Unpack
err = shared.Unpack(filepath.Join(fpath, fname), s.rootfsDir)
if err != nil {
return fmt.Errorf("Failed to unpack %q: %w", filepath.Join(fpath, fname), err)
}
return nil
}
|