internal/plugin/config/config.go (55 lines of code) (raw):

// Copyright 2024 Google LLC // // 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 // // https://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 provides functions to setup the core plugin enabled // configuration and fetch the current value. package config import ( "fmt" "os" "path/filepath" "regexp" "runtime" "strconv" "github.com/GoogleCloudPlatform/galog" "github.com/GoogleCloudPlatform/google-guest-agent/internal/utils/file" ) const ( // DefaultIsCorePluginEnabled is the default value for the core plugin // enabled configuration knob. DefaultIsCorePluginEnabled = false ) var ( // CorePluginEnabledConfigFile is the path to the file that contains the // core plugin enabled or not configuration. CorePluginEnabledConfigFile = "/etc/google-guest-agent/core-plugin-enabled" ) func init() { if runtime.GOOS == "windows" { CorePluginEnabledConfigFile = `C:\ProgramData\Google\Compute Engine\google-guest-agent\core-plugin-enabled` } } // SetCorePluginEnabled sets the core plugin enabled configuration. func SetCorePluginEnabled(enableCorePlugin bool) error { dir := filepath.Dir(CorePluginEnabledConfigFile) if err := os.MkdirAll(dir, 0755); err != nil { return fmt.Errorf("unable to create directory [%q]: %w", dir, err) } if err := os.WriteFile(CorePluginEnabledConfigFile, []byte(fmt.Sprintf("enabled=%t", enableCorePlugin)), 0644); err != nil { return fmt.Errorf("unable to set core plugin enabled to [%t] in config file [%q]: %w", enableCorePlugin, CorePluginEnabledConfigFile, err) } galog.Infof("Successfully set core plugin enabled to [%t] in config file [%q]", enableCorePlugin, CorePluginEnabledConfigFile) return nil } // IsCorePluginEnabled returns whether the core plugin is enabled or not. In // case of any error, it defaults to false. func IsCorePluginEnabled() bool { exp := regexp.MustCompile(`enabled=(\w+)`) data, err := os.ReadFile(CorePluginEnabledConfigFile) if err != nil { galog.Errorf("Failed to read config file [%q]: %v, defaulting IsCorePluginEnabled to false", CorePluginEnabledConfigFile, err) return DefaultIsCorePluginEnabled } matches := exp.FindStringSubmatch(string(data)) if len(matches) != 2 { galog.Errorf("Parsed content [%q] from config file [%q] doesn't match expected format, defaulting IsCorePluginEnabled to false", string(data), CorePluginEnabledConfigFile) return DefaultIsCorePluginEnabled } enableCorePlugin, err := strconv.ParseBool(matches[1]) if err != nil { galog.Errorf("Failed to parse boolean [%q] from config file [%q]: %v, defaulting IsCorePluginEnabled to false", matches[1], CorePluginEnabledConfigFile, err) return DefaultIsCorePluginEnabled } return enableCorePlugin } // IsConfigFilePresent returns whether the core plugin enabled config file is // present or not. func IsConfigFilePresent() bool { return file.Exists(CorePluginEnabledConfigFile, file.TypeFile) }