| // Copyright 2021 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 |
| // |
| // 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. |
| |
| /* |
| This file implements the client for the COS(Container-Optimized OS) Image update control plane. |
| It is reponsible for collecting and reporting the current instance status. |
| |
| When run with the "monitor" command, it will perform initialization and then |
| periodically fetch update config from the API backend by sending the instance |
| status to the API. |
| |
| When run with the "show_config" command, the current config applied to the system |
| is written to stdout. |
| Example Output: |
| update_strategy: "" |
| metrics_enabled: true |
| health_monitor_config: < |
| enforced: false |
| logging_enabled: false |
| monitoring_enabled: false |
| > |
| |
| */ |
| |
| package main |
| |
| import ( |
| "flag" |
| "fmt" |
| |
| "policy-manager/cmd/getstatus" |
| "policy-manager/cmd/monitor" |
| "policy-manager/cmd/showconfig" |
| |
| "github.com/golang/glog" |
| ) |
| |
| // Command line flags for monitor mode. |
| var monitorModeFlags *flag.FlagSet |
| |
| // Command line flags for show_config mode. |
| var showConfigModeFlags *flag.FlagSet |
| |
| // Command line flags for get_status mode. |
| var getStatusModeFlags *flag.FlagSet |
| |
| const ( |
| // Command names. |
| monitorModeCommand = "monitor" |
| showConfigCommand = "show_config" |
| getStatusCommand = "get_status" |
| ) |
| |
| func init() { |
| // Flags for monitor mode. |
| monitorModeFlags = flag.NewFlagSet(monitorModeCommand, flag.ExitOnError) |
| monitorModeFlags.Usage = func() { |
| fmt.Println("Initialize and monitor changes to instance config periodically without terminating") |
| } |
| |
| // Flags for show_config. |
| showConfigModeFlags = flag.NewFlagSet(showConfigCommand, flag.ExitOnError) |
| showConfigModeFlags.Usage = func() { |
| fmt.Println("Prints the current device policy for this instance to stdout.") |
| } |
| |
| // Flags for get_status. |
| getStatusModeFlags = flag.NewFlagSet(getStatusCommand, flag.ExitOnError) |
| getStatusModeFlags.Usage = func() { |
| fmt.Println("Prints the status of updates available to stdout.") |
| } |
| |
| // Log to stderr only by default |
| flag.Set("logtostderr", "true") |
| } |
| |
| func main() { |
| flag.Usage = func() { |
| fmt.Println("Usage: device_policy_manager [logging flags] command [args...]") |
| fmt.Println("") |
| |
| fmt.Println("Supported logging flags:") |
| flag.PrintDefaults() |
| fmt.Println("") |
| |
| fmt.Printf("Supported commands:\n%s,%s,%s\n", |
| monitorModeCommand, showConfigCommand, getStatusCommand) |
| } |
| |
| // Parse the glog flags. |
| flag.Parse() |
| |
| // If no flags are left after the glog flags are processed, print usage |
| // message and exit. |
| if flag.NArg() == 0 { |
| flag.Usage() |
| return |
| } |
| |
| // Get the command and the arguments for the command. |
| command := flag.Arg(0) |
| switch command { |
| case monitorModeCommand: |
| monitor.InitDevicePolicy() |
| monitor.HandleMonitorCmd() |
| case showConfigCommand: |
| showconfig.HandleShowConfigCmd() |
| case getStatusCommand: |
| getstatus.HandleGetStatusCmd() |
| default: |
| glog.Errorf("Unrecognized command: %s\n", command) |
| flag.Usage() |
| } |
| } |