AzureMonitorAgent/ama_tst/modules/errors.py (115 lines of code) (raw):

import copy import subprocess from error_codes import * # backwards compatible input() function for Python 2 vs 3 try: input = raw_input except NameError: pass # error info edited when error occurs error_info = [] # list of all errors called when script ran err_summary = [] # set of all errors which are actually warnings warnings = set([WARN_INTERNET_CONN, WARN_INTERNET, WARN_OPENSSL_PROXY, WARN_MDSD_ERR_FILE, WARN_RESTART_LOOP, WARN_LOGROTATE]) # dictionary correlating error codes to error messages error_messages = { WARN_INTERNET : "SSL connection couldn't be verified. Please run the command below for more information on this warning:\n"\ "\n $ {0}\n", WARN_INTERNET_CONN : "Machine is not connected to the internet: openssl command failed. "\ "Please run the command below for more information on the failure:\n"\ "\n $ {0}\n", ERR_SUDO_PERMS : "Couldn't access {0} due to inadequate permissions. Please run the troubleshooter "\ "as root in order to allow access.", ERR_FOUND : "Please go through the output above to find the errors caught by the troubleshooter.", ERR_BITS : "Couldn't get AMA if CPU is not 64-bit.", ERR_OS_VER : "This version of {0} ({1}) is not supported. Please download {2}. To see all "\ "supported Operating Systems, please go to:\n"\ "\n https://docs.microsoft.com/en-us/azure/azure-monitor/agents/agents-overview#linux\n", ERR_OS : "{0} is not a supported Operating System. To see all supported Operating "\ "Systems, please go to:\n"\ "\n https://docs.microsoft.com/en-us/azure/azure-monitor/agents/agents-overview#linux\n", ERR_FINDING_OS : "Coudln't determine Operating System. To see all supported Operating "\ "Systems, please go to:\n"\ "\n https://docs.microsoft.com/en-us/azure/azure-monitor/agents/agents-overview#linux\n" \ "\n\nError Details: \n{0}", ERR_FREE_SPACE : "There isn't enough space in directory {0} to install AMA - there needs to be at least 500MB free, "\ "but {0} has {1}MB free. Please free up some space and try installing again.", ERR_PKG_MANAGER : "This system does not have a supported package manager. Please install 'dpkg' or 'rpm' "\ "and run this troubleshooter again.", ERR_MULTIPLE_AMA : "There is more than one instance of AMA installed, please remove the extra AMA packages.", ERR_AMA_INSTALL : "AMA package isn't installed correctly.\n\nError Details: \n{0}", ERR_SUBCOMPONENT_INSTALL : "Subcomponents(s) {0} not installed correctly.", ERR_LOG_DAEMON : "No logging daemon found. Please install rsyslog or syslog-ng.", ERR_SYSLOG_USER : "Syslog user is not created successfully.", ERR_OLD_AMA_VER : "You are currently running AMA Version {0}. This troubleshooter only "\ "supports versions 1.9 and newer. Please upgrade to the newest version. You can find "\ "more information at the link below:\n"\ "\n https://docs.microsoft.com/en-us/azure/azure-monitor/agents/azure-monitor-agent-manage\n", ERR_GETTING_AMA_VER : "Couldn't get most current released version of AMA.\n\nError Details: \n{0}", ERR_COUNTER_FILE_MISSING : "metricCounters.json file is not found. Please check your perf counters configuration.", ERR_AMA_PARAMETERS : "Couldn't read and parse AMA configuration in /etc/default/azuremonitoragent.\n\nError Details:\n{0}", ERR_NO_DCR : "Couldn't parse DCR information on this VM. Please check your DCR configuration.\n\nError Details:{0}", ERR_INFO_MISSING: "NO DCR workspace id or region is found. Please check if DCR is configured correctly and match the information in"\ "/etc/opt/microsoft/azuremonitoragent/config-cache/configchunks.*.json", ERR_ENDPT : "Machine couldn't connect to {0}: curl/openssl command failed. "\ "\n\nError Details:\n $ {1} \n\n{2}", ERR_SUBCOMPONENT_STATUS : "Subcomponent {0} has not been started. Status details: {1}", ERR_CHECK_STATUS : "Couldn't get the status of subcomponents.\n\nError Details:{0}", ERR_RESOLVE_IP : "The endpoint {0} cannot be resolved. Please run the command below for more information on the failure:\n\n $ {1}", ERR_IMDS_METADATA : "Couldn't access {0} Instance Metadata Service when executing command\n $ {1}\n\nError Details:\n{2}", ERR_ACCESS_TOKEN : "Couldn't use managed identities to acquire an access token when executing command\n $ {0}\n\nError Details:\n{1}", ERR_ENDPT_PROXY : "Machine couldn't connect to {0} with proxy: curl/openssl command failed. Please check your proxy configuration."\ "\n\nError Details:\n $ {1} \n\n{2}", ERR_DCE : "Couldn't parse DCE information on this VM. Please check your DCE configuration.\n\nError Details:{0}", WARN_OPENSSL_PROXY : "Skip SSL handshake checks because AMA is configured with authenticated proxy.", WARN_MDSD_ERR_FILE : "Found errors in log file {0}, displaying last few lines of error messages:\n {1}", WARN_RESTART_LOOP : "Subcomponents might be in a restart loop. Details:\n\n{0}", ERR_FILE_MISSING : "{0} {1} doesn't exist.", ERR_LOGROTATE_SIZE : "Logrotate size limit for log {0} has invalid formatting. Please see {1} for more "\ "information.", WARN_LOGROTATE : "Logrotate isn't rotating log {0}: its current size is {1}, and it should have "\ "been rotated at {2}. Please see {3} for more information.", ERR_FILE_ACCESS : "Couldn't access or run {0} due to the following reason: {1}.", ERR_SYSLOG : "Couldn't find either 'rsyslog' or 'syslog-ng' on machine. Please download "\ "one of the two services and try again.", ERR_SERVICE_STATUS : "{0} current status is the following: '{1}'. Please check the status of {0} "\ "using {2} for more information.", ERR_FILE_EMPTY : "File {0} is empty.", ERR_CONF_FILE_PERMISSION : "{0} {1} is not accesible by syslog user. Please grant syslog user {2} permission.", ERR_CL_CONF : "Custom logs configuration file /etc/opt/microsoft/azuremonitoragent/config-cache/fluentbit/td-agent.conf "\ "cannot be parsed.\n\nError Details:\n{0}", ERR_CL_INPUT : "Custom logs input file path is either empty or invalid. Please check your input path in "\ "/etc/opt/microsoft/azuremonitoragent/config-cache/fluentbit/td-agent.conf.\n\nError Details:\n{0}" } # check if either has no error or is warning def is_error(err_code): not_errs = warnings.copy() not_errs.add(NO_ERROR) return (err_code not in not_errs) # for getting inputs from the user def get_input(question, check_ans, no_fit): answer = input(" {0}: ".format(question)) while (not check_ans(answer.lower())): print("Unclear input. {0}".format(no_fit)) answer = input(" {0}: ".format(question)) return answer def print_errors(err_code): not_errors = set([NO_ERROR, USER_EXIT]) if (err_code in not_errors): return err_code warning = False if (err_code in warnings): warning = True err_string = error_messages[err_code] # no formatting if (error_info == []): err_string = "ERROR FOUND: {0}".format(err_string) err_summary.append(err_string) # needs input else: while (len(error_info) > 0): tup = error_info.pop(0) temp_err_string = err_string.format(*tup) if (warning): final_err_string = "WARNING FOUND: {0}".format(temp_err_string) else: final_err_string = "ERROR FOUND: {0}".format(temp_err_string) err_summary.append(final_err_string) if (warning): print("WARNING(S) FOUND.") return NO_ERROR else: print("ERROR(S) FOUND.") return ERR_FOUND