in config/package_resource.go [479:614]
func (p *packageResouce) enforceState(ctx context.Context) (inDesiredState bool, err error) {
var (
installing = "installing"
removing = "removing"
enforcePackage struct {
actionFunc func() error
installedCache *packageCache
name string
action string
packageType string
}
)
switch {
case p.managedPackage.Apt != nil:
enforcePackage.name = p.managedPackage.Apt.PackageResource.GetName()
enforcePackage.packageType = "apt"
enforcePackage.installedCache = aptInstalled
switch p.managedPackage.Apt.DesiredState {
case agentendpointpb.OSPolicy_Resource_PackageResource_INSTALLED:
enforcePackage.action, enforcePackage.actionFunc = installing, func() error {
if _, err := packages.AptUpdate(ctx); err != nil {
return err
}
return packages.InstallAptPackages(ctx, []string{enforcePackage.name})
}
case agentendpointpb.OSPolicy_Resource_PackageResource_REMOVED:
enforcePackage.action, enforcePackage.actionFunc = removing, func() error { return packages.RemoveAptPackages(ctx, []string{enforcePackage.name}) }
}
case p.managedPackage.Deb != nil:
enforcePackage.name = p.managedPackage.Deb.name
enforcePackage.packageType = "deb"
enforcePackage.installedCache = debInstalled
enforcePackage.action = installing
// Check if we have not pulled the package yet.
if p.managedPackage.Deb.localPath == "" {
localPath, err := p.download(ctx, "pkg.deb", p.GetDeb().GetSource())
if err != nil {
return false, err
}
p.managedPackage.Deb.localPath = localPath
}
if p.GetDeb().GetPullDeps() {
enforcePackage.actionFunc = func() error { return packages.InstallAptPackages(ctx, []string{p.managedPackage.Deb.localPath}) }
} else {
enforcePackage.actionFunc = func() error { return packages.DpkgInstall(ctx, p.managedPackage.Deb.localPath) }
}
case p.managedPackage.GooGet != nil:
enforcePackage.name = p.managedPackage.GooGet.PackageResource.GetName()
enforcePackage.packageType = "googet"
enforcePackage.installedCache = gooInstalled
switch p.managedPackage.GooGet.DesiredState {
case agentendpointpb.OSPolicy_Resource_PackageResource_INSTALLED:
enforcePackage.action, enforcePackage.actionFunc = installing, func() error { return packages.InstallGooGetPackages(ctx, []string{enforcePackage.name}) }
case agentendpointpb.OSPolicy_Resource_PackageResource_REMOVED:
enforcePackage.action, enforcePackage.actionFunc = removing, func() error { return packages.RemoveGooGetPackages(ctx, []string{enforcePackage.name}) }
}
case p.managedPackage.MSI != nil:
enforcePackage.name = p.managedPackage.MSI.productName
enforcePackage.packageType = "msi"
enforcePackage.action = installing
enforcePackage.installedCache = &packageCache{} // No package cache for msi.
// Check if we have not pulled the package yet.
if p.managedPackage.MSI.localPath == "" {
localPath, err := p.download(ctx, "pkg.msi", p.GetMsi().GetSource())
if err != nil {
return false, err
}
p.managedPackage.MSI.localPath = localPath
}
enforcePackage.actionFunc = func() error {
return packages.InstallMSIPackage(ctx, p.managedPackage.MSI.localPath, p.managedPackage.MSI.PackageResource.GetProperties())
}
case p.managedPackage.Yum != nil:
enforcePackage.name = p.managedPackage.Yum.PackageResource.GetName()
enforcePackage.packageType = "yum"
enforcePackage.installedCache = yumInstalled
switch p.managedPackage.Yum.DesiredState {
case agentendpointpb.OSPolicy_Resource_PackageResource_INSTALLED:
enforcePackage.action, enforcePackage.actionFunc = installing, func() error { return packages.InstallYumPackages(ctx, []string{enforcePackage.name}) }
case agentendpointpb.OSPolicy_Resource_PackageResource_REMOVED:
enforcePackage.action, enforcePackage.actionFunc = removing, func() error { return packages.RemoveYumPackages(ctx, []string{enforcePackage.name}) }
}
case p.managedPackage.Zypper != nil:
enforcePackage.name = p.managedPackage.Zypper.PackageResource.GetName()
enforcePackage.packageType = "zypper"
enforcePackage.installedCache = zypperInstalled
switch p.managedPackage.Zypper.DesiredState {
case agentendpointpb.OSPolicy_Resource_PackageResource_INSTALLED:
enforcePackage.action, enforcePackage.actionFunc = installing, func() error { return packages.InstallZypperPackages(ctx, []string{enforcePackage.name}) }
case agentendpointpb.OSPolicy_Resource_PackageResource_REMOVED:
enforcePackage.action, enforcePackage.actionFunc = removing, func() error { return packages.RemoveZypperPackages(ctx, []string{enforcePackage.name}) }
}
case p.managedPackage.RPM != nil:
enforcePackage.name = p.managedPackage.RPM.name
enforcePackage.packageType = "rpm"
enforcePackage.installedCache = rpmInstalled
enforcePackage.action = installing
// Check if we have not pulled the package yet.
if p.managedPackage.RPM.localPath == "" {
localPath, err := p.download(ctx, "pkg.rpm", p.GetRpm().GetSource())
if err != nil {
return false, err
}
p.managedPackage.RPM.localPath = localPath
}
if p.GetRpm().GetPullDeps() {
switch {
case packages.YumExists:
enforcePackage.actionFunc = func() error { return packages.InstallYumPackages(ctx, []string{p.managedPackage.RPM.localPath}) }
case packages.ZypperExists:
enforcePackage.actionFunc = func() error { return packages.InstallZypperPackages(ctx, []string{p.managedPackage.RPM.localPath}) }
default:
return false, fmt.Errorf("cannot install rpm %q with 'PullDeps' option as neither yum or zypper exist on system", enforcePackage.name)
}
} else {
enforcePackage.actionFunc = func() error { return packages.RPMInstall(ctx, p.managedPackage.RPM.localPath) }
}
}
clog.Infof(ctx, "%s %s package %q", strings.Title(enforcePackage.action), enforcePackage.packageType, enforcePackage.name)
// Reset the cache as we are taking action on.
enforcePackage.installedCache.cache = nil
if err := enforcePackage.actionFunc(); err != nil {
return false, fmt.Errorf("error %s %s package %q", enforcePackage.action, enforcePackage.packageType, enforcePackage.name)
}
return true, nil
}