import re from error_codes import * from errors import error_info, is_error, get_input, print_errors from helpers import geninfo_lookup, get_curr_oms_version, update_omsadmin from .check_pkgs import get_package_version from connect.check_endpts import check_internet_connect OMSAGENT_URL = "https://raw.github.com/microsoft/OMS-Agent-for-Linux/master/docs/OMS-Agent-for-Linux.md" # get current OMS version running on machine def get_oms_version(): version = get_package_version('omsagent') # couldn't find OMSAgent if (version == None): return None return version # compare two versions, see if the first is newer than / the same as the second def comp_versions_ge(v1, v2): # split on '.' and '-' v1_split = v1.split('.|-') v2_split = v2.split('.|-') # get rid of trailing zeroes (e.g. 1.12.0 is the same as 1.12) while (v1_split[-1] == '0'): v1_split = v1_split[:-1] while (v2_split[-1] == '0'): v2_split = v2_split[:-1] # iterate through version elements for (v1_elt, v2_elt) in (zip(v1_split, v2_split)): # curr version elements are same if (v1_elt == v2_elt): continue try: # parse as integers return (int(v1_elt) >= int(v2_elt)) except: # contains wild card characters if ((v1_elt in ['x','X','*']) or (v2_elt in ['x','X','*'])): return True # remove non-numeric characters, try again v1_nums = [int(n) for n in re.findall('\d+', v1_elt)] v2_nums = [int(n) for n in re.findall('\d+', v2_elt)] return all([(i>=j) for i,j in zip(v1_nums, v2_nums)]) # check if subversion is newer (e.g. 1.11.3 to 1.11) return (len(v1_split) >= len(v2_split)) def ask_update_old_version(oms_version, curr_oms_version, cpu_bits): print("--------------------------------------------------------------------------------") print("You are currently running OMS Verion {0}. There is a newer version\n"\ "available which may fix your issue (version {1}).".format(oms_version, curr_oms_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 head to the Github link below and click on 'Download Latest OMS Agent\n"\ "for Linux ({0})' in order to update to the newest version:".format(cpu_bits)) print("\n https://github.com/microsoft/OMS-Agent-for-Linux\n") print("And follow the instructions given here:") print("\n https://github.com/microsoft/OMS-Agent-for-Linux/blob/master/docs/"\ "OMS-Agent-for-Linux.md#upgrade-from-a-previous-release\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_oms(interactive): cpu_bits = geninfo_lookup('CPU_BITS') oms_version = get_oms_version() if (oms_version == None): return ERR_OMS_INSTALL # check if version is >= 1.11 if (not comp_versions_ge(oms_version, '1.11')): error_info.append((oms_version, cpu_bits)) return ERR_OLD_OMS_VER # get most recent version (curr_oms_version, e) = get_curr_oms_version(OMSAGENT_URL) # getting current version failed if (curr_oms_version == None): # could connect, just formatting issue if (e == None): return ERR_GETTING_OMS_VER # couldn't connect else: checked_internet = check_internet_connect() # issue with connecting to Github specifically if (checked_internet == NO_ERROR): print("WARNING: can't connect to {0}: {1}\n Skipping this check...".format(OMSAGENT_URL, e)) print("--------------------------------------------------------------------------------") # issue with general internet connectivity else: return checked_internet # got current version else: # if not most recent version, ask if want to update if (interactive and (not comp_versions_ge(oms_version, curr_oms_version))): if (ask_update_old_version(oms_version, curr_oms_version, cpu_bits) == USER_EXIT): return USER_EXIT return update_omsadmin()