ospatch/googet_update.go (66 lines of code) (raw):

// Copyright 2019 Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package ospatch import ( "context" "fmt" "github.com/GoogleCloudPlatform/osconfig/clog" "github.com/GoogleCloudPlatform/osconfig/packages" ) type googetUpdateOpts struct { exclusivePackages []string excludes []*Exclude dryrun bool } // GooGetUpdateOption is an option for apt-get update. type GooGetUpdateOption func(*googetUpdateOpts) // GooGetExcludes excludes these packages from upgrade. func GooGetExcludes(excludes []*Exclude) GooGetUpdateOption { return func(args *googetUpdateOpts) { args.excludes = excludes } } // GooGetExclusivePackages includes only these packages in the upgrade. func GooGetExclusivePackages(exclusivePackages []string) GooGetUpdateOption { return func(args *googetUpdateOpts) { args.exclusivePackages = exclusivePackages } } // GooGetDryRun performs a dry run. func GooGetDryRun(dryrun bool) GooGetUpdateOption { return func(args *googetUpdateOpts) { args.dryrun = dryrun } } // RunGooGetUpdate runs googet update. func RunGooGetUpdate(ctx context.Context, opts ...GooGetUpdateOption) error { googetOpts := &googetUpdateOpts{} for _, opt := range opts { opt(googetOpts) } pkgs, err := packages.GooGetUpdates(ctx) if err != nil { return err } fPkgs, err := filterPackages(pkgs, googetOpts.exclusivePackages, googetOpts.excludes) if err != nil { return err } if len(fPkgs) == 0 { clog.Infof(ctx, "No packages to update.") return nil } var pkgNames []string for _, pkg := range fPkgs { pkgNames = append(pkgNames, pkg.Name) } msg := fmt.Sprintf("%d packages: %q", len(pkgNames), fPkgs) if googetOpts.dryrun { clog.Infof(ctx, "Running in dryrun mode, not updating %s", msg) return nil } ops := opsToReport{ packages: fPkgs, } logOps(ctx, ops) err = packages.InstallGooGetPackages(ctx, pkgNames) if err == nil { logSuccess(ctx, ops) } else { logFailure(ctx, ops, err) } return err }