in google_metadata_script_runner/main.go [419:494]
func main() {
ctx := context.Background()
opts := logger.LogOpts{LoggerName: programName}
if runtime.GOOS == "windows" {
opts.Writers = []io.Writer{&utils.SerialPort{Port: "COM1"}, os.Stdout}
opts.FormatFunction = logFormatWindows
} else {
opts.Writers = []io.Writer{os.Stdout}
opts.FormatFunction = func(e logger.LogEntry) string { return e.Message }
// Local logging is syslog; we will just use stdout in Linux.
opts.DisableLocalLogging = true
}
var err error
if err := cfg.Load(nil); err != nil {
fmt.Fprintf(os.Stderr, "Failed to load instance configuration: %+v", err)
os.Exit(1)
}
if !cfg.Get().Core.CloudLoggingEnabled {
opts.DisableCloudLogging = true
}
// The keys to check vary based on the argument and the OS. Also functions to validate arguments.
wantedKeys, err := getWantedKeys(os.Args, runtime.GOOS)
if err != nil {
fmt.Printf("%s\n", err.Error())
os.Exit(2)
}
projectID, err := getMetadataKey(ctx, "/project/project-id")
if err == nil {
opts.ProjectName = projectID
}
createdBy, err := getMetadataKey(ctx, "/instance/attributes/created-by")
if err == nil {
opts.MIG = createdBy
}
if err := logger.Init(ctx, opts); err != nil {
fmt.Printf("Error initializing logger: %+v", err)
os.Exit(1)
}
// Try flushing logs before exiting, if not flushed logs could go missing.
defer logger.Close()
logger.Infof("Starting %s scripts (version %s).", os.Args[1], version)
scripts, err := getExistingKeys(ctx, wantedKeys)
if err != nil {
logger.Fatalf(err.Error())
}
if len(scripts) == 0 {
logger.Infof("No %s scripts to run.", os.Args[1])
return
}
for _, wantedKey := range wantedKeys {
value, ok := scripts[wantedKey]
if !ok {
continue
}
logger.Infof("Found %s in metadata.", wantedKey)
if err := setupAndRunScript(ctx, wantedKey, value); err != nil {
logger.Warningf("Script %q failed with error: %v", wantedKey, err)
continue
}
logger.Infof("%s exit status 0", wantedKey)
}
logger.Infof("Finished running %s scripts.", os.Args[1])
}