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()
}