in main.go [99:193]
func run(ctx context.Context) {
// Setup logging.
opts := logger.LogOpts{LoggerName: "OSConfigAgent", UserAgent: agentconfig.UserAgent(), DisableLocalLogging: agentconfig.DisableLocalLogging()}
if agentconfig.Stdout() {
opts.Writers = []io.Writer{os.Stdout}
}
if runtime.GOOS == "windows" {
opts.Writers = append(opts.Writers, &serialPort{"COM1"})
}
// If this call to WatchConfig fails (like a metadata error) we can't continue.
if err := agentconfig.WatchConfig(ctx); err != nil {
logger.Init(ctx, opts)
logger.Fatalf("Error parsing metadata, agent cannot start: %v", err.Error())
}
opts.Debug = agentconfig.Debug()
clog.DebugEnabled = agentconfig.Debug()
opts.ProjectName = agentconfig.ProjectID()
if err := logger.Init(ctx, opts); err != nil {
fmt.Printf("Error initializing logger: %v", err)
os.Exit(1)
}
ctx = clog.WithLabels(ctx, map[string]string{"instance_name": agentconfig.Name()})
// Remove any existing restart file.
if err := os.Remove(agentconfig.RestartFile()); err != nil && !os.IsNotExist(err) {
clog.Errorf(ctx, "Error removing restart signal file: %v", err)
}
// On shutdown if the old restart file exists, and there is nothing else in that old directory,
// cleanup that directory ignoring all errors.
// This ensures we only cleanup this directory if we were using it with an old version of the agent.
deferredFuncs = append(deferredFuncs, func() {
if runtime.GOOS == "linux" && util.Exists(agentconfig.OldRestartFile()) {
os.Remove(agentconfig.OldRestartFile())
files, err := ioutil.ReadDir(filepath.Dir(agentconfig.OldRestartFile()))
if err != nil || len(files) > 0 {
return
}
os.RemoveAll(filepath.Dir(agentconfig.OldRestartFile()))
}
})
deferredFuncs = append(deferredFuncs, logger.Close, func() { clog.Infof(ctx, "OSConfig Agent (version %s) shutting down.", agentconfig.Version()) })
obtainLock()
// obtainLock adds functions to clear the lock at close.
logger.DeferredFatalFuncs = append(logger.DeferredFatalFuncs, deferredFuncs...)
clog.Infof(ctx, "OSConfig Agent (version %s) started.", agentconfig.Version())
// Call RegisterAgent at least once every day, on start calling
// of RegisterAgent is handled in the service loop.
go func() {
c := time.Tick(24 * time.Hour)
for range c {
if agentconfig.TaskNotificationEnabled() || agentconfig.GuestPoliciesEnabled() {
registerAgent(ctx)
}
}
}()
switch action := flag.Arg(0); action {
case "", "run", "noservice":
runServiceLoop(ctx)
case "inventory", "osinventory":
client, err := agentendpoint.NewClient(ctx)
if err != nil {
logger.Fatalf("%v", err.Error())
}
tasker.Enqueue(ctx, "Report OSInventory", func() {
client.ReportInventory(ctx)
})
tasker.Close()
return
case "gp", "policies", "guestpolicies", "ospackage":
policies.Run(ctx)
tasker.Close()
return
case "w", "waitfortasknotification", "ospatch":
client, err := agentendpoint.NewClient(ctx)
if err != nil {
logger.Fatalf("%v", err.Error())
}
client.WaitForTaskNotification(ctx)
select {
case <-ctx.Done():
}
default:
logger.Fatalf("Unknown arg %q", action)
}
}