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
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]
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
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
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]
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)
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