Exemplo n.º 1
0
def _find_user(path, userName):
    '''
    Find a user object in the local directory by their username
    '''
    node = _get_node(path)

    if not node:
        raise SaltInvocationError(
            'directory services query not possible, cannot get reference to node at path: {}'.format(path)
        )

    query, err = ODQuery.alloc().initWithNode_forRecordTypes_attribute_matchType_queryValues_returnAttributes_maximumResults_error_(
        node,
        kODRecordTypeUsers,
        kODAttributeTypeRecordName,
        kODMatchEqualTo,
        userName,
        kODAttributeTypeStandardOnly,
        1,
        None
    )

    if err:
        raise SaltInvocationError(
            'Failed to construct query: {}'.format(err)
        )

    results, err = query.resultsAllowingPartial_error_(False, None)

    if err:
        raise SaltInvocationError(
            'Failed to query opendirectory: {}'.format(err)
        )

    return results
Exemplo n.º 2
0
def _find_user(path, userName):
    '''
    Find a user object in the local directory by their username.
    '''
    node = _get_node(path)

    if not node:
        raise SaltInvocationError(
            'directory services query not possible, cannot get reference to node at path: {}'
            .format(path))

    query, err = ODQuery.alloc(
    ).initWithNode_forRecordTypes_attribute_matchType_queryValues_returnAttributes_maximumResults_error_(
        node, kODRecordTypeUsers, kODAttributeTypeRecordName, kODMatchEqualTo,
        userName, kODAttributeTypeStandardOnly, 1, None)

    if err:
        raise SaltInvocationError('Failed to construct query: {}'.format(err))

    results, err = query.resultsAllowingPartial_error_(False, None)

    if err:
        raise SaltInvocationError(
            'Failed to query opendirectory: {}'.format(err))

    if results is None or len(results) == 0:
        return None

    if len(results) > 1:
        raise CommandExecutionError(
            'Expected user name {} to match only a single user, matched: {} result(s)'
            .format(userName, len(user)))

    return results[0]
Exemplo n.º 3
0
def _find_gid(path, gid):
    '''
    Find a group object in the local directory by its unique id (gid)
    '''
    node = _get_node(path)

    if not node:
        raise SaltInvocationError(
            'directory services query not possible, cannot get reference to node at path: {}'.format(path)
        )

    query, err = ODQuery.alloc().initWithNode_forRecordTypes_attribute_matchType_queryValues_returnAttributes_maximumResults_error_(
        node,
        kODRecordTypeGroups,
        kODAttributeTypeUniqueID,
        kODMatchEqualTo,
        gid,
        kODAttributeTypeStandardOnly,
        1,
        None
    )

    if err:
        raise SaltInvocationError(
            'Failed to construct query: {}'.format(err)
        )

    results, err = query.resultsAllowingPartial_error_(False, None)
    if err:
        raise SaltInvocationError(
            'Failed to query opendirectory: {}'.format(err)
        )

    return results
Exemplo n.º 4
0
def _find_group(path, groupName):
    '''
    Search for groups using the given criteria.

    CLI Example::

        salt '*' group._find_group <path> <name>
    '''
    node = _get_node(path)

    if not node:
        raise SaltInvocationError(
            'directory services query not possible, cannot get reference to node at path: {}'
            .format(path))

    query, err = ODQuery.alloc(
    ).initWithNode_forRecordTypes_attribute_matchType_queryValues_returnAttributes_maximumResults_error_(
        node, kODRecordTypeGroups, kODAttributeTypeRecordName, kODMatchEqualTo,
        groupName, kODAttributeTypeStandardOnly, 1, None)

    if err:
        raise SaltInvocationError('Failed to construct query: {}'.format(err))

    results, err = query.resultsAllowingPartial_error_(False, None)
    if err:
        raise SaltInvocationError(
            'Failed to query opendirectory: {}'.format(err))

    return results
Exemplo n.º 5
0
def getent(refresh=False):
    '''
    Return info on all groups

    CLI Example:

    .. code-block:: bash

        salt '*' group.getent
    '''
    if 'group.getent' in __context__ and not refresh:
        return __context__['group.getent']

    node = _get_node('/Local/Default')
    if not node:
        raise SaltInvocationError(
            'directory services query not possible, cannot get reference to node at path: /Local/Default'
        )

    query, err = ODQuery.alloc().initWithNode_forRecordTypes_attribute_matchType_queryValues_returnAttributes_maximumResults_error_(
        node,
        kODRecordTypeGroups,
        kODAttributeTypeAllTypes,
        kODMatchAny,
        None,
        kODAttributeTypeStandardOnly,
        200,  # TODO: hard coded limit bad
        None
    )

    if err:
        raise SaltInvocationError(
            'Failed to construct query: {}'.format(err)
        )

    results, err = query.resultsAllowingPartial_error_(False, None)

    if err:
        raise SaltInvocationError(
            'Failed to query opendirectory: {}'.format(err)
        )

    groupAttrs = []
    for result in results:
        attrs, err = result.recordDetailsForAttributes_error_(None, None)
        groupAttrs.append(attrs)

    return [_format_info(attrs) for attrs in groupAttrs]
Exemplo n.º 6
0
def search(path, searchValue):
    '''
    List records that match the given query.
    '''
    node = _get_node(path)

    if not node:
        log.error('Query not possible, cannot get reference to node at path: {}'.format(path))
        return None

    # @objc.callbackFor("CFOpenDirectory.ODQuerySetCallback")
    # def query_callback(query, value, context, error, info):
    #     log.warning('got callback')
    #     pass

    query, err = ODQuery.queryWithNode_forRecordTypes_attribute_matchType_queryValues_returnAttributes_maximumResults_error_(
        node,
        kODRecordTypeUsers,
        kODAttributeTypeRecordName,
        kODMatchContains,
        searchValue,
        kODAttributeTypeStandardOnly,
        0,
        None
    )

    if err:
        log.error('Failed to construct query: {}'.format(err))
        return None

    ODQueryDelegate = objc.protocolNamed('ODQueryDelegate')

    class QueryDelegate(NSObject, ODQueryDelegate):
        def query_foundResults_error_(self, inQuery, inResults, inError):
            log.error('FOUND RESULTS')

    qd = QueryDelegate()
    query.setDelegate_(qd)
    query.scheduleInRunLoop_forMode_(NSRunLoop.currentRunLoop(), NSDefaultRunLoopMode)
Exemplo n.º 7
0
def _find_group(path, groupName):
    '''
    Search for groups using the given criteria.

    CLI Example::

        salt '*' group._find_group <path> <name>
    '''
    node = _get_node(path)

    if not node:
        raise SaltInvocationError(
            'directory services query not possible, cannot get reference to node at path: {}'.format(path)
        )

    query, err = ODQuery.alloc().initWithNode_forRecordTypes_attribute_matchType_queryValues_returnAttributes_maximumResults_error_(
        node,
        kODRecordTypeGroups,
        kODAttributeTypeRecordName,
        kODMatchEqualTo,
        groupName,
        kODAttributeTypeStandardOnly,
        1,
        None
    )

    if err:
        raise SaltInvocationError(
            'Failed to construct query: {}'.format(err)
        )

    results, err = query.resultsAllowingPartial_error_(False, None)
    if err:
        raise SaltInvocationError(
            'Failed to query opendirectory: {}'.format(err)
        )

    return results