config/config.go (81 lines of code) (raw):

// Copyright 2020 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 config import ( "context" "errors" "fmt" "runtime" "cloud.google.com/go/osconfig/agentendpoint/apiv1/agentendpointpb" ) var goos = runtime.GOOS // OSPolicyResource is a single OSPolicy resource. type OSPolicyResource struct { resource *agentendpointpb.OSPolicy_Resource managedResources *ManagedResources inDesiredState bool } // InDesiredState reports whether this resource is in the desired state. // CheckState or EnforceState should be run prior to calling InDesiredState. func (r *OSPolicyResource) InDesiredState() bool { return r.inDesiredState } // ManagedResources returns the resources that this OSPolicyResource manages. func (r *OSPolicyResource) ManagedResources() *ManagedResources { return r.managedResources } type resource interface { validate(context.Context) (*ManagedResources, error) checkState(context.Context) (bool, error) enforceState(context.Context) (bool, error) populateOutput(*agentendpointpb.OSPolicyResourceCompliance) cleanup(context.Context) error } // ManagedResources are the resources that an OSPolicyResource manages. type ManagedResources struct { Packages []ManagedPackage Repositories []ManagedRepository Files []ManagedFile } // Validate validates this resource. // Validate must be called before other methods. func (r *OSPolicyResource) Validate(ctx context.Context) error { switch x := r.GetResourceType().(type) { case *agentendpointpb.OSPolicy_Resource_Pkg: r.resource = resource(&packageResouce{OSPolicy_Resource_PackageResource: x.Pkg}) case *agentendpointpb.OSPolicy_Resource_Repository: r.resource = resource(&repositoryResource{OSPolicy_Resource_RepositoryResource: x.Repository}) case *agentendpointpb.OSPolicy_Resource_File_: r.resource = resource(&fileResource{OSPolicy_Resource_FileResource: x.File}) case *agentendpointpb.OSPolicy_Resource_Exec: r.resource = resource(&execResource{OSPolicy_Resource_ExecResource: x.Exec}) case nil: return errors.New("ResourceType field not set") default: return fmt.Errorf("ResourceType has unexpected type: %T", x) } var err error r.managedResources, err = r.validate(ctx) return err } // CheckState checks this resources state. // Validate must be called prior to running CheckState. func (r *OSPolicyResource) CheckState(ctx context.Context) error { if r.resource == nil { return errors.New("CheckState run before Validate") } inDesiredState, err := r.checkState(ctx) r.inDesiredState = inDesiredState return err } // EnforceState enforces this resources state. // Validate must be called prior to running EnforceState. func (r *OSPolicyResource) EnforceState(ctx context.Context) error { if r.resource == nil { return errors.New("EnforceState run before Validate") } inDesiredState, err := r.enforceState(ctx) r.inDesiredState = inDesiredState return err } // PopulateOutput populates the output field of the provided // OSPolicyResourceCompliance for this resource. func (r *OSPolicyResource) PopulateOutput(rCompliance *agentendpointpb.OSPolicyResourceCompliance) error { if r.resource == nil { return errors.New("PopulateOutput run before Validate") } r.populateOutput(rCompliance) return nil } // Cleanup cleans up any temporary files that this resource may have created. func (r *OSPolicyResource) Cleanup(ctx context.Context) error { if r.resource == nil { return errors.New("Cleanup run before Validate") } return r.cleanup(ctx) }