func main()

in main/main.go [31:94]


func main() {

	// parse extension environment
	hEnv, handlerErr := vmextension.GetHandlerEnv()
	if handlerErr != nil {
		lg.eventError("Failed to parse handlerEnv file.", handlerErr)
		os.Exit(failureCode)
	}

	// Note that this should be logging to: hEnv.HandlerEnvironment.LogFolder, but
	// The original functionality had this logging at "./path" within the extension
	// directory, and we don't want to break this.
	lg = newLogger(logPath)
	noopLogger = newNoopLogger()
	
	// parse the command line arguments
	flag.Parse()
	cmd := parseCmd(flag.Args())
	lg.with("Operation: ", cmd.name)
	lg.customLog("Command: ", cmd.name)

	seqNum, seqErr := vmextension.FindSeqNum(hEnv.HandlerEnvironment.ConfigFolder)
	if seqErr != nil {
		lg.eventError("failed to find sequence number", seqErr)
		// only throw a fatal error if the command is not "install"
		if cmd.name != "install" {
			os.Exit(cmd.failExitCode)
		}
	}
	lg.event("seqNum: " + strconv.Itoa(seqNum))

	// check sub-command preconditions, if any, before executing
	lg.event("start operation")
	if cmd.pre != nil {
		lg.event("pre-check")
		if preErr := cmd.pre(lg, seqNum); preErr != nil {
			lg.eventError("pre-check failed", preErr)
			telemetry(TelemetryScenario, "enable pre-check failed: "+preErr.Error(), false, 0)
			os.Exit(cmd.failExitCode)
		}
	}

	// execute the command
	lg.event("Reporting transitioning status...")
	reportStatus(lg, hEnv, seqNum, status.StatusTransitioning, cmd, "Transitioning")

	if cmdErr := cmd.f(lg, hEnv, seqNum); cmdErr != nil {
		message := "Operation '" + cmd.name + "' failed."
		lg.eventError(message, cmdErr)
		telemetry(TelemetryScenario, message+" Error: '"+cmdErr.Error()+"'.", false, 0)
		// Never fail on disable due to a current bug in the Guest Agent
		if cmd.name != "disable" {
			reportStatus(lg, hEnv, seqNum, status.StatusError, cmd, cmdErr.Error())
			os.Exit(cmd.failExitCode)
		}
	} else {
		message := "Operation '" + cmd.name + "' succeeded."
		lg.event(message)
		telemetry(TelemetryScenario, message, false, 0)
	}

	reportStatus(lg, hEnv, seqNum, status.StatusSuccess, cmd, "")
	os.Exit(successCode)
}