AzureMonitorAgent/ama_tst/modules/connect/check_endpts.py (119 lines of code) (raw):

import subprocess from error_codes import * from errors import error_info from helpers import geninfo_lookup, find_dce SSL_CMD = "echo | openssl s_client -connect {0}:443 -brief" CURL_CMD = "curl -s -S -k https://{0}/ping" GLOBAL_HANDLER_URL = "global.handler.control.monitor.azure.com" REGION_HANDLER_URL = "{0}.handler.control.monitor.azure.com" ODS_URL = "{0}.ods.opinsights.azure.com" ME_URL = "management.azure.com" ME_REGION_URL = "{0}.monitoring.azure.com" def check_endpt_ssl(ssl_cmd, endpoint): """ openssl connect to specific endpoint """ try: ssl_output = subprocess.check_output(ssl_cmd.format(endpoint), shell=True,\ stderr=subprocess.STDOUT, universal_newlines=True) ssl_output_lines = ssl_output.split('\n') (connected, verified) = (False, False) for line in ssl_output_lines: if (line == "CONNECTION ESTABLISHED"): connected = True continue if (line == "Verification: OK"): verified = True continue return (connected, verified, ssl_output) except Exception as e: return (False, False, e) def check_internet_connect(): """ check general internet connectivity """ (connected_docs, verified_docs, e) = check_endpt_ssl(SSL_CMD, "docs.microsoft.com") if (connected_docs and verified_docs): return NO_ERROR elif (connected_docs and not verified_docs): error_info.append((SSL_CMD.format("docs.microsoft.com"),)) return WARN_INTERNET else: error_info.append((SSL_CMD.format("docs.microsoft.com"),)) return WARN_INTERNET_CONN def resolve_ip(endpoint): try: result = subprocess.call(['nslookup', endpoint], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) if not result == 0: return False, "nslookup {0}".format(endpoint) else: return (True, None) except Exception as e: return (False, e) def check_endpt_curl(endpoint): command = CURL_CMD.format(endpoint) try: # check proxy proxy = geninfo_lookup('MDSD_PROXY_ADDRESS') username = geninfo_lookup('MDSD_PROXY_USERNAME') if not proxy == None: command = command + ' -x {0}'.format(proxy) if not username == None: password = geninfo_lookup('MDSD_PROXY_PASSWORD') command = command + ' -U {0}:{1}'.format(username, password) output = subprocess.check_output(command, shell=True,\ stderr=subprocess.STDOUT, universal_newlines=True) if output == "Healthy": return NO_ERROR else: if proxy == None: error_info.append((endpoint, command, output)) return ERR_ENDPT else: error_info.append((endpoint, command, output)) return ERR_ENDPT_PROXY except Exception as e: error_info.append((endpoint, command, e)) return ERR_ENDPT def check_ama_endpts(): # compose URLs to check endpoints = [GLOBAL_HANDLER_URL] regions = geninfo_lookup('DCR_REGION') workspace_ids = geninfo_lookup('DCR_WORKSPACE_ID') if regions == None or workspace_ids == None: return ERR_INFO_MISSING for region in regions: endpoints.append(REGION_HANDLER_URL.format(region)) for id in workspace_ids: endpoints.append(ODS_URL.format(id)) if not geninfo_lookup('ME_REGION') == None: endpoints.append(ME_URL) for me_region in geninfo_lookup('ME_REGION'): endpoints.append(ME_REGION_URL.format(me_region)) # modify URLs if URL suffix is .us(Azure Government) or .cn(Azure China) url_suffix = geninfo_lookup('URL_SUFFIX') if not url_suffix == '.com': for endpoint in endpoints: endpoint.replace('.com', url_suffix) dce, e = find_dce() if e != None: error_info.append((e,)) return ERR_DCE for endpoint in dce: endpoints.append(endpoint) for endpoint in endpoints: # check if IP address can be resolved using nslookup resolved, e = resolve_ip(endpoint) if not resolved: error_info.append((endpoint,e)) return ERR_RESOLVE_IP # check ssl handshake command = SSL_CMD # skip openssl check with authenticated proxy if not geninfo_lookup('MDSD_PROXY_USERNAME') == None: return WARN_OPENSSL_PROXY proxy = geninfo_lookup('MDSD_PROXY_ADDRESS') if not proxy == None: proxy = proxy.replace('http://', '') command = command + ' -proxy {0}'.format(proxy) if not geninfo_lookup('SSL_CERT_DIR') == None: command = command + " -CApath " + geninfo_lookup('SSL_CERT_DIR') if not geninfo_lookup('SSL_CERT_FILE') == None: command = command + " -CAfile " + geninfo_lookup('SSL_CERT_FILE') (connected, verified, e) = check_endpt_ssl(command, endpoint) if not connected or not verified: error_info.append((endpoint, command.format(endpoint), e)) return ERR_ENDPT # check AMCS ping results if "handler.control.monitor" in endpoint: checked_curl = check_endpt_curl(endpoint) if checked_curl != NO_ERROR: return checked_curl return NO_ERROR