in main/main.go [37:93]
func main() {
ctx := log.NewContext(log.NewSyncLogger(log.NewLogfmtLogger(
os.Stdout))).With("time", log.DefaultTimestamp).With("version", VersionString())
// parse command line arguments
cmd := parseCmd(os.Args)
ctx = ctx.With("operation", strings.ToLower(cmd.name))
// parse extension environment
hEnv, err := GetHandlerEnv()
if err != nil {
ctx.Log("message", "failed to parse handlerenv", "error", err)
os.Exit(cmd.failExitCode)
}
seqNum := -1
// Agent should set env variable sequence number
seqNumVariable := os.Getenv(configSequenceNumber)
if seqNumVariable != "" {
seqNum, err = strconv.Atoi(seqNumVariable)
if err != nil {
ctx.Log("message", "failed to parse env variable ConfigSequenceNumber:"+seqNumVariable, "error", err)
os.Exit(cmd.failExitCode)
}
}
// Read the seqNum from latest config file in case VMAgent did not set it as env variable (old agent versions)
if seqNum == -1 {
seqNum, err = FindSeqNumConfig(hEnv.HandlerEnvironment.ConfigFolder)
if err != nil {
ctx.Log("messsage", "failed to find sequence number", "error", err)
os.Exit(cmd.failExitCode)
}
}
ctx = ctx.With("seq", seqNum)
// check sub-command preconditions, if any, before executing
ctx.Log("event", "start")
if cmd.pre != nil {
ctx.Log("event", "pre-check")
if err := cmd.pre(ctx, hEnv, seqNum); err != nil {
ctx.Log("event", "pre-check failed", "error", err)
os.Exit(cmd.failExitCode)
}
}
// execute the subcommand
reportStatus(ctx, hEnv, seqNum, StatusTransitioning, cmd, "")
msg, err := cmd.f(ctx, hEnv, seqNum)
if err != nil {
ctx.Log("event", "failed to handle", "error", err)
reportStatus(ctx, hEnv, seqNum, StatusError, cmd, err.Error()+msg)
os.Exit(cmd.failExitCode)
}
reportStatus(ctx, hEnv, seqNum, StatusSuccess, cmd, msg)
ctx.Log("event", "end")
}