AzureMonitorAgent/ama_tst/modules/install/check_ama.py (94 lines of code) (raw):
import re
import sys
import xml.dom.minidom
if sys.version_info[0] == 3:
import urllib.request as urllib
import urllib.error as urlerror
elif sys.version_info[0] == 2:
import urllib2 as urllib
import urllib2 as urlerror
try:
import requests
except ImportError:
pass
from error_codes import *
from errors import error_info, get_input
from helpers import get_package_version
from connect.check_endpts import check_internet_connect
AMA_URL = 'https://docs.microsoft.com/en-us/azure/azure-monitor/agents/azure-monitor-agent-extension-versions'
def get_latest_ama_version(curr_version):
# python2 and python3 compatible
try:
r = urllib.urlopen(AMA_URL).read()
except AttributeError:
r = requests.get(AMA_URL).text
except (urlerror.HTTPError, OSError) as e:
return(None, e)
try:
tbody = r.split("<tbody>")[1].split("</tbody>")[0]
tbody = "<tbody>" + tbody + "</tbody>"
with xml.dom.minidom.parseString(tbody) as dom:
rows = dom.getElementsByTagName("tr")
for row in rows:
cell = row.getElementsByTagName("td")[3]
version = cell.firstChild.nodeValue
version = re.sub('[A-Za-z ]+', '', version)
if (version == ''):
continue
if (comp_versions_ge(curr_version, version)):
return (None, None)
else:
return (version, None)
except Exception as e:
return (None, e)
return (None, None)
#
def comp_versions_ge(version1, version2):
"""
compare two versions, see if the first is newer than / the same as the second
"""
versions1 = [int(v) for v in version1.split(".")]
versions2 = [int(v) for v in version2.split(".")]
for i in range(max(len(versions1), len(versions2))):
v1 = versions1[i] if i < len(versions1) else 0
v2 = versions2[i] if i < len(versions2) else 0
if v1 > v2:
return True
elif v1 < v2:
return False
return True
def ask_update_old_version(ama_version, curr_ama_version):
print("--------------------------------------------------------------------------------")
print("You are currently running AMA Verion {0}. There is a newer version\n"\
"available which may fix your issue (version {1}).".format(ama_version, curr_ama_version))
answer = get_input("Do you want to update? (y/n)", (lambda x : x.lower() in ['y','yes','n','no']),\
"Please type either 'y'/'yes' or 'n'/'no' to proceed.")
# user does want to update
if (answer.lower() in ['y', 'yes']):
print("--------------------------------------------------------------------------------")
print("Please follow the instructions given here:")
print("\n https://docs.microsoft.com/en-us/azure/azure-monitor/agents/azure-monitor-agent-manage\n")
return USER_EXIT
# user doesn't want to update
elif (answer.lower() in ['n', 'no']):
print("Continuing on with troubleshooter...")
print("--------------------------------------------------------------------------------")
return NO_ERROR
def check_ama(interactive):
(ama_version, e) = get_package_version('azuremonitoragent')
if (not e == None):
error_info.append((e,))
return ERR_AMA_INSTALL
ama_version = ama_version.split('-')[0]
if (not comp_versions_ge(ama_version, '1.21.0')):
error_info.append((ama_version,))
return ERR_OLD_AMA_VER
(newer_ama_version, e) = get_latest_ama_version(ama_version)
if (newer_ama_version == None):
if (e == None):
return NO_ERROR
else:
checked_internet = check_internet_connect()
if checked_internet != NO_ERROR:
print("WARNING: can't connect to {0}: {1}\n Skipping this check...".format(AMA_URL, e))
print("--------------------------------------------------------------------------------")
# issue with general internet connectivity
else:
return checked_internet
else:
# if not most recent version, ask if want to update
if (interactive):
if (ask_update_old_version(ama_version, newer_ama_version) == USER_EXIT):
return USER_EXIT
return NO_ERROR