def enable()

in OmsAgent/omsagent.py [0:0]


def enable():
    """
    Onboard the OMSAgent to the specified OMS workspace.
    This includes enabling the OMS process on the VM.
    This call will return non-zero or throw an exception if
    the settings provided are incomplete or incorrect.
    Note: enable operation times out from WAAgent at 5 minutes
    """
    exit_if_vm_not_supported('Enable')

    public_settings, protected_settings = get_settings()

    if public_settings is None:
        raise ParameterMissingException('Public configuration must be ' \
                                        'provided')
    if protected_settings is None:
        raise ParameterMissingException('Private configuration must be ' \
                                        'provided')

    vmResourceId = protected_settings.get('vmResourceId')

    # If vmResourceId is not provided in private settings, get it from metadata API
    if vmResourceId is None or not vmResourceId:
        vmResourceId = get_vmresourceid_from_metadata()
        hutil_log_info('vmResourceId from Metadata API is {0}'.format(vmResourceId))

    if vmResourceId is None:
        hutil_log_info('This may be a classic VM')

    enableAutomaticManagement = public_settings.get('enableAutomaticManagement')

    if (enableAutomaticManagement is not None
           and enableAutomaticManagement is True):
        hutil_log_info('enableAutomaticManagement is set to true; the ' \
                       'workspace ID and key will be determined by the OMS ' \
                       'service.')

        workspaceInfo = retrieve_managed_workspace(vmResourceId)
        if (workspaceInfo is None or 'WorkspaceId' not in workspaceInfo
                or 'WorkspaceKey' not in workspaceInfo):
            raise OneClickException('Workspace info was not determined')
        else:
            # Note: do NOT log workspace keys!
            hutil_log_info('Managed workspaceInfo has been retrieved')
            workspaceId = workspaceInfo['WorkspaceId']
            workspaceKey = workspaceInfo['WorkspaceKey']
            try:
                check_workspace_id_and_key(workspaceId, workspaceKey)
            except InvalidParameterError as e:
                raise OMSServiceOneClickException('Received invalid ' \
                                                  'workspace info: ' \
                                                  '{0}'.format(e))

    else:
        workspaceId = public_settings.get('workspaceId')
        workspaceKey = protected_settings.get('workspaceKey')
        check_workspace_id_and_key(workspaceId, workspaceKey)

    # Check if omsadmin script is available
    if not os.path.exists(OMSAdminPath):
        log_and_exit('Enable', EnableCalledBeforeSuccessfulInstall,
                     'OMSAgent onboarding script {0} does not exist. Enable ' \
                     'cannot be called before install.'.format(OMSAdminPath))

    vmResourceIdParam = '-a {0}'.format(vmResourceId)

    proxy = protected_settings.get('proxy')
    proxyParam = ''
    if proxy is not None:
        proxyParam = '-p {0}'.format(proxy)

    # get domain from protected settings
    domain = protected_settings.get('domain')
    if domain is None:
        # detect opinsights domain using IMDS
        domain = get_azure_cloud_domain()
    else:
        hutil_log_info("Domain retrieved from protected settings '{0}'".format(domain))

    domainParam = ''
    if domain:
        domainParam = '-d {0}'.format(domain)

    optionalParams = '{0} {1} {2}'.format(domainParam, proxyParam, vmResourceIdParam)
    onboard_cmd = OnboardCommandWithOptionalParams.format(OMSAdminPath,
                                                          workspaceId,
                                                          workspaceKey,
                                                          optionalParams)

    hutil_log_info('Handler initiating onboarding.')
    exit_code, output = run_command_with_retries_output(onboard_cmd, retries = 5,
                                         retry_check = retry_onboarding,
                                         final_check = raise_if_no_internet,
                                         check_error = True, log_cmd = False)

    # now ensure the permissions and ownership is set recursively
    try:
        workspaceId = public_settings.get('workspaceId')
        etc_final_path = os.path.join(EtcOMSAgentPath, workspaceId)
        if (os.path.isdir(etc_final_path)):
            uid = pwd.getpwnam(AgentUser).pw_uid
            gid = grp.getgrnam(AgentGroup).gr_gid
            os.chown(etc_final_path, uid, gid)
            os.system('chmod {1} {0}'.format(etc_final_path, 750))

            for root, dirs, files in os.walk(etc_final_path):
                for d in dirs:
                    os.chown(os.path.join(root, d), uid, gid)
                    os.system('chmod {1} {0}'.format(os.path.join(root, d), 750))
                for f in files:
                    os.chown(os.path.join(root, f), uid, gid)
                    os.system('chmod {1} {0}'.format(os.path.join(root, f), 640))
    except:
        hutil_log_info('Failed to set permissions for OMS directories, could potentially have issues uploading.')

    if exit_code == 0:
        # Create a marker file to denote the workspace that was
        # onboarded using the extension. This will allow supporting
        # multi-homing through the extension like Windows does
        extension_marker_path = os.path.join(EtcOMSAgentPath, workspaceId,
                                             'conf/.azure_extension_marker')
        if os.path.exists(extension_marker_path):
            hutil_log_info('Extension marker file {0} already ' \
                           'created'.format(extension_marker_path))
        else:
            try:
                open(extension_marker_path, 'w').close()
                hutil_log_info('Created extension marker file ' \
                               '{0}'.format(extension_marker_path))
            except IOError as e:
                try:
                    open(extension_marker_path, 'w+').close()
                    hutil_log_info('Created extension marker file ' \
                               '{0}'.format(extension_marker_path))
                except IOError as ex:
                    hutil_log_error('Error creating {0} with error: ' \
                                '{1}'.format(extension_marker_path, ex))
                    # we are having some kind of permissions issue creating the marker file
                    output = "Couldn't create marker file"
                    exit_code = 52 # since it is a missing dependency

        # Sleep to prevent bombarding the processes, then restart all processes
        # to resolve any issues with auto-started processes from --upgrade
        time.sleep(PostOnboardingSleepSeconds)
        if HUtilObject and HUtilObject.is_seq_smaller():
            log_output = "Current sequence number {0} is smaller than or egual to the sequence number of the most recent executed configuration, skipping omsagent process restart.".format(HUtilObject._context._seq_no)
            hutil_log_info(log_output)
        else:
            hutil_log_info('Restart omsagent service via service_control script.')
            run_command_and_log(RestartOMSAgentServiceCommand)
            #start telemetry process if enable is successful
            start_telemetry_process()
            
        #save sequence number
        HUtilObject.save_seq()

    return exit_code, output