mirror of
https://github.com/clearlinux/mixer-tools.git
synced 2026-10-03 15:29:44 +00:00
builder: clean up BuildUpdate
Main changes: - Rename parameters to reflect better their intention. In particular "signflag" -> "skipSigning" - Remove unnecessary Stat check for dir creation: MkdirAll will do that and not fail if the directory already exists. - Changed commands to do like the swupd_create_update and their output the error directly to the os.Stdout/os.Stderr. - Changed most of file path building to use filepath.Join. - Inline setVersion, since these two steps make sense at build update level. - Only create upstreamver file if we create an upstreamurl file, and do that before the final publishing step. - Added comments to clarify some of the steps. Signed-off-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
This commit is contained in:
committed by
tmarcu
parent
81795d59a4
commit
6047d2e363
+91
-108
@@ -522,136 +522,119 @@ func (b *Builder) BuildChroots(template *x509.Certificate, privkey *rsa.PrivateK
|
||||
return nil
|
||||
}
|
||||
|
||||
// Set the published versions to what was just built
|
||||
func (b *Builder) setVersion(publish bool) {
|
||||
if publish == false {
|
||||
return
|
||||
}
|
||||
|
||||
// Create the www/version/format# dir if it doesn't exist
|
||||
formatdir := b.Statedir + "/www/version/format" + b.Format
|
||||
if _, err := os.Stat(formatdir); os.IsNotExist(err) {
|
||||
if err = os.MkdirAll(formatdir, 0777); err != nil {
|
||||
helpers.PrintError(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Println("Setting latest version to " + b.Mixver)
|
||||
err := ioutil.WriteFile(formatdir+"/latest", []byte(b.Mixver), 0644)
|
||||
if err != nil {
|
||||
helpers.PrintError(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
err = ioutil.WriteFile(b.Statedir+"/image/LAST_VER", []byte(b.Mixver), 0644)
|
||||
if err != nil {
|
||||
helpers.PrintError(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
if b.Upstreamurl != "" {
|
||||
fmt.Println("Saving the upstream version URL " + b.Upstreamurl)
|
||||
upstreamurl := b.Statedir + "/www/" + b.Mixver + "/upstreamurl"
|
||||
err = ioutil.WriteFile(upstreamurl, []byte(b.Upstreamurl), 0644)
|
||||
if err != nil {
|
||||
helpers.PrintError(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
fmt.Println("Saving the upstream version " + b.Clearver)
|
||||
upstreamver := b.Statedir + "/www/" + b.Mixver + "/upstreamver"
|
||||
err = ioutil.WriteFile(upstreamver, []byte(b.Clearver), 0644)
|
||||
if err != nil {
|
||||
helpers.PrintError(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// CleanChroots will remove chroots based on what bundles are defined
|
||||
func (b *Builder) CleanChroots() {
|
||||
files := helpers.GetDirContents(b.Bundledir)
|
||||
basedir := b.Statedir + "/image/" + b.Mixver + "/"
|
||||
|
||||
for _, f := range files {
|
||||
if f.Name() == "full" {
|
||||
continue
|
||||
}
|
||||
err := os.RemoveAll(basedir + f.Name())
|
||||
if err != nil {
|
||||
helpers.PrintError(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// BuildUpdate will produce an update consumable by the swupd client
|
||||
func (b *Builder) BuildUpdate(prefixflag string, minvflag int, formatflag string, signflag bool, publishflag bool, keepchrootsflag bool) error {
|
||||
if formatflag != "" {
|
||||
b.Format = formatflag
|
||||
func (b *Builder) BuildUpdate(prefixflag string, minVersion int, format string, skipSigning bool, publish bool, keepChroots bool) error {
|
||||
if format != "" {
|
||||
b.Format = format
|
||||
}
|
||||
|
||||
if _, err := os.Stat(b.Statedir + "/www/version/format" + b.Format); os.IsNotExist(err) {
|
||||
if err = os.MkdirAll(b.Statedir+"/www/version/format"+b.Format, 0777); err != nil {
|
||||
helpers.PrintError(err)
|
||||
return err
|
||||
}
|
||||
// Ensure the format dir exists.
|
||||
formatDir := filepath.Join(b.Statedir, "www", "version", "format"+b.Format)
|
||||
err := os.MkdirAll(formatDir, 0777)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "couldn't create the format directory")
|
||||
}
|
||||
|
||||
// Step 1: create update content for the current mix
|
||||
updatecmd := exec.Command(prefixflag+"swupd_create_update", "-S", b.Statedir, "--minversion", strconv.Itoa(minvflag), "-F", b.Format, "--osversion", b.Mixver)
|
||||
// Create update metadata for the mix.
|
||||
updatecmd := exec.Command(prefixflag+"swupd_create_update", "-S", b.Statedir, "--minversion", strconv.Itoa(minVersion), "-F", b.Format, "--osversion", b.Mixver)
|
||||
updatecmd.Stdout = os.Stdout
|
||||
updatecmd.Stderr = os.Stderr
|
||||
err := updatecmd.Run()
|
||||
err = updatecmd.Run()
|
||||
if err != nil {
|
||||
helpers.PrintError(err)
|
||||
return err
|
||||
return errors.Wrapf(err, "failed to create update metadata")
|
||||
}
|
||||
|
||||
// We only need the full chroot from this point on, so cleanup the others to save space
|
||||
if keepchrootsflag == false {
|
||||
b.CleanChroots()
|
||||
// Clean up the bundle chroots as only the full chroot is needed from this point on.
|
||||
if !keepChroots {
|
||||
var files []os.FileInfo
|
||||
files, err = ioutil.ReadDir(b.Bundledir)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Ignored error when cleaning bundle chroots: %s", err)
|
||||
}
|
||||
basedir := filepath.Join(b.Statedir, "image", b.Mixver)
|
||||
for _, f := range files {
|
||||
if f.Name() == "full" {
|
||||
continue
|
||||
}
|
||||
err = os.RemoveAll(filepath.Join(basedir, f.Name()))
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Ignored error when cleaning bundle chroots: %s", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Step 1.5: sign the Manifest.MoM that was just created
|
||||
if signflag == false {
|
||||
// Sign the Manifest.MoM that was just created.
|
||||
if !skipSigning {
|
||||
err = b.SignManifestMoM()
|
||||
if err != nil {
|
||||
helpers.PrintError(err)
|
||||
return err
|
||||
}
|
||||
fmt.Println("Signed Manifest.MoM")
|
||||
}
|
||||
|
||||
// Step 2: create fullfiles
|
||||
output, err := exec.Command(prefixflag+"swupd_make_fullfiles", "-S", b.Statedir, b.Mixver).Output()
|
||||
// Create full files.
|
||||
fullfilecmd := exec.Command(prefixflag+"swupd_make_fullfiles", "-S", b.Statedir, b.Mixver)
|
||||
fullfilecmd.Stdout = os.Stdout
|
||||
fullfilecmd.Stderr = os.Stderr
|
||||
err = fullfilecmd.Run()
|
||||
if err != nil {
|
||||
helpers.PrintError(err)
|
||||
return err
|
||||
}
|
||||
fmt.Println(string(output))
|
||||
|
||||
// Step 3: create zero packs
|
||||
if prefixflag == "" {
|
||||
output, err = exec.Command("mixer-pack-maker.sh", "--to", b.Mixver, "-S", b.Statedir).Output()
|
||||
} else {
|
||||
output, err = exec.Command("mixer-pack-maker.sh", "--to", b.Mixver, "-S", b.Statedir, "--repodir", prefixflag).Output()
|
||||
}
|
||||
if err != nil {
|
||||
helpers.PrintError(err)
|
||||
return err
|
||||
}
|
||||
fmt.Println(string(output))
|
||||
|
||||
// Step 4: hardlink relevant dirs
|
||||
_, err = exec.Command("hardlink", "-f", b.Statedir+"/image/"+b.Mixver+"/").Output()
|
||||
if err != nil {
|
||||
helpers.PrintError(err)
|
||||
os.Exit(1)
|
||||
return errors.Wrapf(err, "couldn't create fullfiles")
|
||||
}
|
||||
|
||||
// Step 5: update the latest version
|
||||
b.setVersion(publishflag)
|
||||
// Create zero packs.
|
||||
zeropackArgs := []string{"--to", b.Mixver, "-S", b.Statedir}
|
||||
if prefixflag != "" {
|
||||
zeropackArgs = append(zeropackArgs, "--repodir", prefixflag)
|
||||
}
|
||||
zeropackcmd := exec.Command("mixer-pack-maker.sh", zeropackArgs...)
|
||||
zeropackcmd.Stdout = os.Stdout
|
||||
zeropackcmd.Stderr = os.Stderr
|
||||
err = zeropackcmd.Run()
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "couldn't create zero packs")
|
||||
}
|
||||
|
||||
// Hardlink the duplicate files. This helps when keeping the bundle chroots.
|
||||
hardlinkcmd := exec.Command("hardlink", "-f", b.Statedir+"/image/"+b.Mixver+"/")
|
||||
hardlinkcmd.Stdout = os.Stdout
|
||||
hardlinkcmd.Stderr = os.Stderr
|
||||
err = hardlinkcmd.Run()
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "couldn't perform hardlink step")
|
||||
}
|
||||
|
||||
// Save upstream information.
|
||||
if b.Upstreamurl != "" {
|
||||
fmt.Printf("Saving the upstream URL: %s\n", b.Upstreamurl)
|
||||
upstreamURLFile := filepath.Join(b.Statedir, "www", b.Mixver, "/upstreamurl")
|
||||
err = ioutil.WriteFile(upstreamURLFile, []byte(b.Upstreamurl), 0644)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "couldn't write upstreamurl file")
|
||||
}
|
||||
fmt.Printf("Saving the upstream version: %s\n", b.Clearver)
|
||||
upstreamVerFile := filepath.Join(b.Statedir, "www", b.Mixver, "upstreamver")
|
||||
err = ioutil.WriteFile(upstreamVerFile, []byte(b.Clearver), 0644)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "couldn't write upstreamver file")
|
||||
}
|
||||
}
|
||||
|
||||
// Publish. Update the latest version both in the format (used by update itself) and in LAST_VER
|
||||
// (used to create newer manifests).
|
||||
if !publish {
|
||||
return nil
|
||||
}
|
||||
|
||||
fmt.Printf("Setting latest version to %s\n", b.Mixver)
|
||||
|
||||
err = ioutil.WriteFile(filepath.Join(formatDir, "latest"), []byte(b.Mixver), 0644)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "couldn't update the latest version")
|
||||
}
|
||||
err = ioutil.WriteFile(filepath.Join(b.Statedir, "image", "LAST_VER"), []byte(b.Mixver), 0644)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "couldn't update the latest version")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -222,18 +222,6 @@ func Download(filename string, url string) (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetDirContents is an an assert-style helper to get the contents of a
|
||||
// directory, or to exit on failure.
|
||||
func GetDirContents(dirname string) []os.FileInfo {
|
||||
files, err := ioutil.ReadDir(dirname)
|
||||
if err != nil {
|
||||
PrintError(err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
return files
|
||||
}
|
||||
|
||||
// Git runs git with arguments and exits in case of failure.
|
||||
// IMPORTANT: the 'args' passed to this function _must_ be validated,
|
||||
// as to avoid cases where input is received from a third party source.
|
||||
|
||||
+1
-1
@@ -86,7 +86,7 @@ var buildUpdateCmd = &cobra.Command{
|
||||
b := builder.NewFromConfig(config)
|
||||
err := b.BuildUpdate(buildFlags.prefix, buildFlags.minVersion, buildFlags.format, buildFlags.noSigning, !buildFlags.noPublish, buildFlags.keepChroot)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "Error building update")
|
||||
return errors.Wrap(err, "couldn't build update")
|
||||
}
|
||||
|
||||
if buildFlags.increment {
|
||||
|
||||
Reference in New Issue
Block a user