func performGreengrassSteps()

in agent/setupcli/setupcli.go [188:316]


func performGreengrassSteps(log log.T, packageManager packagemanagers.IPackageManager, serviceManager servicemanagers.IServiceManager) {
	var err error

	// Check whether the SSM Setup CLI is running with elevated permissions or not
	err = hasElevatedPermissions()
	if err != nil {
		osExit(1, log, "ssm-setup-cli is not executed by root")
	}

	// download and install
	if install {
		// Configure ssm agent using configuration in artifacts folder if not already configured
		configManager := getConfigurationManager()
		log.Infof("Resolving agent config file")
		if err = configurationmanager.ConfigureAgent(log, configManager, artifactsDir); err != nil {
			errMessage := fmt.Sprintf("failed to configure agent. Err: %v", err)
			osExit(1, log, errMessage)
		}

		if err = configManager.CreateUpdateAgentConfigWithOnPremIdentity(); err != nil {
			log.Warnf("Failed to configure agent with On-prem identity: %v", err)
		}

		log.Info("Starting amazon-ssm-agent install")
		var isInstalled bool
		var reInstallAgent bool
		if isInstalled, err = packageManager.IsAgentInstalled(); err != nil {
			osExit(1, log, "Failed to determine if agent is installed: %w", err)
		} else if isInstalled {
			log.Infof("Agent already installed, checking version")
			if version, err := packageManager.GetInstalledAgentVersion(); err != nil {
				log.Warnf("Failed to get agent version, falling back to re-installation: %w", err)
				reInstallAgent = true
			} else {
				log.Infof("Agent version installed is %s", version)
				if isVersionAlreadyInstalled, err := hasAgentAlreadyInstalled(version); err != nil || !isVersionAlreadyInstalled {
					log.Warnf("Installed version is older/higher than expected Agent Version or Failed to compare, attempting to reinstall the agent: %w", err)
					reInstallAgent = true
				} else if isVersionAlreadyInstalled {
					osExit(0, log, "Version is already installed, not attempting to install agent")
				}
			}
		}

		if reInstallAgent {
			log.Infof("Starting agent uninstallation")
			if err := helperUnInstallAgent(log, packageManager, serviceManager, ""); err != nil {
				osExit(1, log, "Failed to uninstall the agent: %v", err)
			}
			log.Infof("Agent uninstalled successfully")

			log.Infof("Starting agent installation")
			if err := helperInstallAgent(log, packageManager, serviceManager, artifactsDir); err != nil {
				osExit(1, log, "Failed to install agent: %v", err)
			}
			log.Infof("Agent installed successfully")
		} else {
			log.Infof("Agent is not installed on the system, Starting agent installation")
			if err := helperInstallAgent(log, packageManager, serviceManager, artifactsDir); err != nil {
				osExit(1, log, "Failed to install agent: %v", err)
			}
			log.Infof("Agent installed successfully")
		}
	}

	// register
	if register {
		log.Info("Verifying agent is installed before attempting to register")
		if isInstalled, err := packageManager.IsAgentInstalled(); err != nil {
			osExit(1, log, "Failed to determine if agent is installed: %v", err)
		} else if !isInstalled {
			osExit(1, log, "Agent must be installed before attempting to register")
		}

		log.Info("Verified agent is installed")

		registrationInfo := getRegistrationInfo()
		instanceId := registrationInfo.InstanceID(log, "", registration.RegVaultKey)

		if instanceId != "" {
			log.Infof("Agent already registered with instance id %s", instanceId)
		} else {
			log.Info("Agent is not registered")
		}

		if instanceId != "" && !override {
			log.Info("skipping registration because override flag is not set, just starting agent")
			if err = startAgent(serviceManager, log); err != nil {
				osExit(1, log, "Failed to start agent: %v", err)
			}
			return
		}

		log.Infof("Stopping agent before registering")
		if err = servicemanagers.StopAgent(serviceManager, log); err != nil {
			osExit(1, log, "Failed to stop agent: %v", err)
		}

		log.Infof("Registering agent")
		if err = getRegisterManager().RegisterAgent(registerInputModel); err != nil {
			osExit(1, log, "Failed to register agent: %v", err)
		}

		log.Infof("Successfully registered the agent, starting agent")
		if err = startAgent(serviceManager, log); err != nil {
			osExit(1, log, "Failed to start agent: %v", err)
		}

		log.Infof("Successfully started agent, reloading registration info")
		registrationInfo.ReloadInstanceInfo(log, "", registration.RegVaultKey)
		instanceId = registrationInfo.InstanceID(log, "", registration.RegVaultKey)
		if instanceId == "" {
			osExit(1, log, "Failed to get new instance id from registration info after registration")
		} else {
			log.Infof("Instance id after registration is %s", instanceId)
		}
	}

	// shutdown
	if shutdown {
		log.Info("Shutting down amazon-ssm-agent")
		if err = svcMgrStopAgent(serviceManager, log); err != nil {
			osExit(1, log, "Failed to shut down agent: %v", err)
		}
	}

	log.Flush()
	log.Close()
}