in config/package_resource.go [196:327]
func (p *packageResouce) validate(ctx context.Context) (*ManagedResources, error) {
switch p.GetSystemPackage().(type) {
case *agentendpointpb.OSPolicy_Resource_PackageResource_Apt:
pr := p.GetApt()
if !packages.AptExists {
return nil, fmt.Errorf("cannot manage Apt package %q because apt-get does not exist on the system", pr.GetName())
}
p.managedPackage.Apt = &AptPackage{DesiredState: p.GetDesiredState(), PackageResource: pr}
case *agentendpointpb.OSPolicy_Resource_PackageResource_Deb_:
pr := p.GetDeb()
if !packages.DpkgExists {
return nil, fmt.Errorf("cannot manage Deb package because dpkg does not exist on the system")
}
if p.GetDesiredState() != agentendpointpb.OSPolicy_Resource_PackageResource_INSTALLED {
return nil, fmt.Errorf("desired state of %q not applicable for deb package", p.GetDesiredState())
}
if err := p.validateFile(pr.GetSource()); err != nil {
return nil, err
}
var localPath string
var err error
source := p.GetDeb().GetSource()
info := getPackageInfoFromCache(ctx, source)
if info == nil {
localPath, err = p.download(ctx, "pkg.deb", source)
if err != nil {
return nil, err
}
info, err = packages.DebPkgInfo(ctx, localPath)
if err != nil {
return nil, err
}
}
// Always update the cache to update the timestamps.
updatePackageInfoCache(ctx, info, source)
p.managedPackage.Deb = &DebPackage{PackageResource: pr, localPath: localPath, name: info.Name}
case *agentendpointpb.OSPolicy_Resource_PackageResource_Googet:
pr := p.GetGooget()
if !packages.GooGetExists {
return nil, fmt.Errorf("cannot manage GooGet package %q because googet does not exist on the system", pr.GetName())
}
p.managedPackage.GooGet = &GooGetPackage{DesiredState: p.GetDesiredState(), PackageResource: pr}
case *agentendpointpb.OSPolicy_Resource_PackageResource_Msi:
pr := p.GetMsi()
if !packages.MSIExists {
return nil, fmt.Errorf("cannot manage MSI package because msiexec does not exist on the system")
}
if p.GetDesiredState() != agentendpointpb.OSPolicy_Resource_PackageResource_INSTALLED {
return nil, fmt.Errorf("desired state of %q not applicable for MSI package", p.GetDesiredState())
}
if err := p.validateFile(pr.GetSource()); err != nil {
return nil, err
}
var localPath string
var err error
source := p.GetMsi().GetSource()
info := getPackageInfoFromCache(ctx, source)
if info == nil {
localPath, err = p.download(ctx, "pkg.msi", source)
if err != nil {
return nil, err
}
productName, productCode, err := packages.MSIInfo(localPath)
if err != nil {
return nil, err
}
// We store productCode as version in the packageinfo struct.
info = &packages.PkgInfo{Name: productName, Version: productCode}
}
// Always update the cache to update the timestamps.
updatePackageInfoCache(ctx, info, source)
p.managedPackage.MSI = &MSIPackage{PackageResource: pr, localPath: localPath, productName: info.Name, productCode: info.Version}
case *agentendpointpb.OSPolicy_Resource_PackageResource_Yum:
pr := p.GetYum()
if !packages.YumExists {
return nil, fmt.Errorf("cannot manage Yum package %q because yum does not exist on the system", pr.GetName())
}
p.managedPackage.Yum = &YumPackage{DesiredState: p.GetDesiredState(), PackageResource: pr}
case *agentendpointpb.OSPolicy_Resource_PackageResource_Zypper_:
pr := p.GetZypper()
if !packages.ZypperExists {
return nil, fmt.Errorf("cannot manage Zypper package %q because zypper does not exist on the system", pr.GetName())
}
p.managedPackage.Zypper = &ZypperPackage{DesiredState: p.GetDesiredState(), PackageResource: pr}
case *agentendpointpb.OSPolicy_Resource_PackageResource_Rpm:
pr := p.GetRpm()
if !packages.RPMExists {
return nil, fmt.Errorf("cannot manage RPM package because rpm does not exist on the system")
}
if p.GetDesiredState() != agentendpointpb.OSPolicy_Resource_PackageResource_INSTALLED {
return nil, fmt.Errorf("desired state of %q not applicable for rpm package", p.GetDesiredState())
}
if err := p.validateFile(pr.GetSource()); err != nil {
return nil, err
}
var localPath string
var err error
source := p.GetRpm().GetSource()
info := getPackageInfoFromCache(ctx, source)
if info == nil {
localPath, err = p.download(ctx, "pkg.rpm", source)
if err != nil {
return nil, err
}
info, err = packages.RPMPkgInfo(ctx, localPath)
if err != nil {
return nil, err
}
}
// Always update the cache to update the timestamps.
updatePackageInfoCache(ctx, info, source)
p.managedPackage.RPM = &RPMPackage{PackageResource: pr, localPath: localPath, name: info.Name}
default:
return nil, fmt.Errorf("SystemPackage field not set or references unknown package manager: %v", p.GetSystemPackage())
}
return &ManagedResources{Packages: []ManagedPackage{p.managedPackage}}, nil
}