mirror of
https://github.com/GAM-team/GAM.git
synced 2025-05-12 12:17:20 +00:00
Updated gam print group-members ... recursive
and gam print cigroup-members ... recursive
This commit is contained in:
parent
e95fcbaa38
commit
24db5cc886
@ -1,3 +1,8 @@
|
|||||||
|
7.06.13
|
||||||
|
|
||||||
|
Updated `gam print group-members ... recursive` and `gam print cigroup-members ... recursive`
|
||||||
|
to expand groups representing chat spaces.
|
||||||
|
|
||||||
7.06.12
|
7.06.12
|
||||||
|
|
||||||
Deleted commands to display Analytic UA properties; the API has been deprecated.
|
Deleted commands to display Analytic UA properties; the API has been deprecated.
|
||||||
|
@ -25,7 +25,7 @@ https://github.com/GAM-team/GAM/wiki
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
__author__ = 'GAM Team <google-apps-manager@googlegroups.com>'
|
__author__ = 'GAM Team <google-apps-manager@googlegroups.com>'
|
||||||
__version__ = '7.06.12'
|
__version__ = '7.06.13'
|
||||||
__license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
|
__license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
|
||||||
|
|
||||||
#pylint: disable=wrong-import-position
|
#pylint: disable=wrong-import-position
|
||||||
@ -5981,7 +5981,7 @@ def getCIGroupMemberRoleFixType(member):
|
|||||||
else:
|
else:
|
||||||
member['type'] = Ent.TYPE_OTHER
|
member['type'] = Ent.TYPE_OTHER
|
||||||
roles = {}
|
roles = {}
|
||||||
memberRoles = member.get('roles', [{'name': Ent.MEMBER}])
|
memberRoles = member.get('roles', [{'name': Ent.ROLE_MEMBER}])
|
||||||
for role in memberRoles:
|
for role in memberRoles:
|
||||||
roles[role['name']] = role
|
roles[role['name']] = role
|
||||||
for a_role in [Ent.ROLE_OWNER, Ent.ROLE_MANAGER, Ent.ROLE_MEMBER]:
|
for a_role in [Ent.ROLE_OWNER, Ent.ROLE_MANAGER, Ent.ROLE_MEMBER]:
|
||||||
@ -6019,7 +6019,7 @@ def getCIGroupTransitiveMemberRoleFixType(groupName, tmember):
|
|||||||
trole['name'] = Ent.ROLE_MANAGER
|
trole['name'] = Ent.ROLE_MANAGER
|
||||||
memberRoles.append(trole)
|
memberRoles.append(trole)
|
||||||
else:
|
else:
|
||||||
memberRoles = [{'name': Ent.MEMBER}]
|
memberRoles = [{'name': Ent.ROLE_MEMBER}]
|
||||||
roles = {}
|
roles = {}
|
||||||
for role in memberRoles:
|
for role in memberRoles:
|
||||||
roles[role['name']] = role
|
roles[role['name']] = role
|
||||||
@ -26478,6 +26478,64 @@ def _getChatMemberEmail(cd, member):
|
|||||||
_, memberUid = member['groupMember']['name'].split('/')
|
_, memberUid = member['groupMember']['name'].split('/')
|
||||||
member['groupMember']['email'], _ = convertUIDtoEmailAddressWithType(f'uid:{memberUid}', cd, None, emailTypes=['group'])
|
member['groupMember']['email'], _ = convertUIDtoEmailAddressWithType(f'uid:{memberUid}', cd, None, emailTypes=['group'])
|
||||||
|
|
||||||
|
def _getChatSpaceMembers(cd, chatSpace, ciGroupName):
|
||||||
|
if chatSpace.startswith('space/'):
|
||||||
|
_, chatSpace = chatSpace.split('/', 1)
|
||||||
|
chatSpace = 'spaces/'+chatSpace
|
||||||
|
kwargsUAA = {'useAdminAccess': True, 'filter': 'member.type != "BOT"'}
|
||||||
|
user, chat, kvList = buildChatServiceObject(API.CHAT_MEMBERSHIPS_ADMIN, _getAdminEmail(), 0, 0, [Ent.CHAT_SPACE, chatSpace], True)
|
||||||
|
memberList = []
|
||||||
|
if not chat:
|
||||||
|
return memberList
|
||||||
|
fields = getItemFieldsFromFieldsList('memberships', [])
|
||||||
|
qfilter = f'{Ent.Singular(Ent.CHAT_SPACE)}: {chatSpace}, {kwargsUAA["filter"]}'
|
||||||
|
try:
|
||||||
|
members = callGAPIpages(chat.spaces().members(), 'list', 'memberships',
|
||||||
|
pageMessage=_getChatPageMessage(Ent.CHAT_MEMBER, user, 0, 0, qfilter),
|
||||||
|
throwReasons=[GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED],
|
||||||
|
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
|
||||||
|
parent=chatSpace, fields=fields, pageSize=CHAT_PAGE_SIZE, **kwargsUAA)
|
||||||
|
for member in members:
|
||||||
|
_getChatMemberEmail(cd, member)
|
||||||
|
gmember = {}
|
||||||
|
if 'member' in member:
|
||||||
|
if member['member']['type'] == 'HUMAN':
|
||||||
|
_, memberUid = member['member']['name'].split('/')
|
||||||
|
gmember['type'] = Ent.TYPE_USER
|
||||||
|
email, _ = convertUIDtoEmailAddressWithType(f'uid:{memberUid}', cd, None, emailTypes=['user'])
|
||||||
|
role = Ent.ROLE_MANAGER if member['role'] == 'ROLE_MANAGER' else Ent.ROLE_MEMBER
|
||||||
|
if not ciGroupName:
|
||||||
|
gmember['id'] = memberUid
|
||||||
|
gmember['email'] = email
|
||||||
|
gmember['role'] = role
|
||||||
|
gmember['status'] = member['state']
|
||||||
|
else:
|
||||||
|
gmember['name'] = f'{ciGroupName}/memberships/{memberUid}'
|
||||||
|
gmember['preferredMemberKey'] = {'id': email}
|
||||||
|
gmember['roles'] = [{'name': role}]
|
||||||
|
gmember['createTime'] = member['createTime']
|
||||||
|
memberList.append(gmember)
|
||||||
|
elif 'groupMember' in member:
|
||||||
|
_, memberUid = member['groupMember']['name'].split('/')
|
||||||
|
gmember['type'] = Ent.TYPE_GROUP
|
||||||
|
role = Ent.ROLE_MANAGER if member['role'] == 'ROLE_MANAGER' else Ent.ROLE_MEMBER
|
||||||
|
email, _ = convertUIDtoEmailAddressWithType(f'uid:{memberUid}', cd, None, emailTypes=['group'])
|
||||||
|
if not ciGroupName:
|
||||||
|
gmember['id'] = memberUid
|
||||||
|
gmember['email'] = email
|
||||||
|
gmember['role'] = role
|
||||||
|
gmember['status'] = member['state']
|
||||||
|
else:
|
||||||
|
gmember['name'] = f'{ciGroupName}/memberships/{memberUid}'
|
||||||
|
gmember['preferredMemberKey'] = {'id': email}
|
||||||
|
gmember['roles'] = [{'name': role}]
|
||||||
|
gmember['createTime'] = member['createTime']
|
||||||
|
memberList.append(gmember)
|
||||||
|
return memberList
|
||||||
|
except (GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied) as e:
|
||||||
|
exitIfChatNotConfigured(chat, kvList, str(e), 0, 0)
|
||||||
|
return memberList
|
||||||
|
|
||||||
def normalizeUserMember(user, userList):
|
def normalizeUserMember(user, userList):
|
||||||
userList.append(normalizeEmailAddressOrUID(user))
|
userList.append(normalizeEmailAddressOrUID(user))
|
||||||
|
|
||||||
@ -34138,15 +34196,18 @@ def getGroupMembers(cd, groupEmail, memberRoles, membersList, membersSet, i, cou
|
|||||||
|
|
||||||
printGettingAllEntityItemsForWhom(memberRoles if memberRoles else Ent.ROLE_MANAGER_MEMBER_OWNER, groupEmail, i, count)
|
printGettingAllEntityItemsForWhom(memberRoles if memberRoles else Ent.ROLE_MANAGER_MEMBER_OWNER, groupEmail, i, count)
|
||||||
validRoles, listRoles, listFields = _getRoleVerification(memberRoles, 'nextPageToken,members(email,id,role,status,type,delivery_settings)')
|
validRoles, listRoles, listFields = _getRoleVerification(memberRoles, 'nextPageToken,members(email,id,role,status,type,delivery_settings)')
|
||||||
try:
|
if not groupEmail.startswith('space/'):
|
||||||
groupMembers = callGAPIpages(cd.members(), 'list', 'members',
|
try:
|
||||||
pageMessage=getPageMessageForWhom(),
|
groupMembers = callGAPIpages(cd.members(), 'list', 'members',
|
||||||
throwReasons=GAPI.MEMBERS_THROW_REASONS, retryReasons=GAPI.MEMBERS_RETRY_REASONS,
|
pageMessage=getPageMessageForWhom(),
|
||||||
includeDerivedMembership=memberOptions[MEMBEROPTION_INCLUDEDERIVEDMEMBERSHIP],
|
throwReasons=GAPI.MEMBERS_THROW_REASONS, retryReasons=GAPI.MEMBERS_RETRY_REASONS,
|
||||||
groupKey=groupEmail, roles=listRoles, fields=listFields, maxResults=GC.Values[GC.MEMBER_MAX_RESULTS])
|
includeDerivedMembership=memberOptions[MEMBEROPTION_INCLUDEDERIVEDMEMBERSHIP],
|
||||||
except (GAPI.groupNotFound, GAPI.domainNotFound, GAPI.domainCannotUseApis, GAPI.invalid, GAPI.forbidden, GAPI.serviceNotAvailable):
|
groupKey=groupEmail, roles=listRoles, fields=listFields, maxResults=GC.Values[GC.MEMBER_MAX_RESULTS])
|
||||||
entityUnknownWarning(Ent.GROUP, groupEmail, i, count)
|
except (GAPI.groupNotFound, GAPI.domainNotFound, GAPI.domainCannotUseApis, GAPI.invalid, GAPI.forbidden, GAPI.serviceNotAvailable):
|
||||||
return
|
entityUnknownWarning(Ent.GROUP, groupEmail, i, count)
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
groupMembers = _getChatSpaceMembers(cd, groupEmail, '')
|
||||||
checkCategory = memberDisplayOptions['showCategory']
|
checkCategory = memberDisplayOptions['showCategory']
|
||||||
if not memberOptions[MEMBEROPTION_RECURSIVE]:
|
if not memberOptions[MEMBEROPTION_RECURSIVE]:
|
||||||
if memberOptions[MEMBEROPTION_NODUPLICATES]:
|
if memberOptions[MEMBEROPTION_NODUPLICATES]:
|
||||||
@ -34170,8 +34231,7 @@ def getGroupMembers(cd, groupEmail, memberRoles, membersList, membersSet, i, cou
|
|||||||
elif memberOptions[MEMBEROPTION_NODUPLICATES]:
|
elif memberOptions[MEMBEROPTION_NODUPLICATES]:
|
||||||
groupMemberList = []
|
groupMemberList = []
|
||||||
for member in groupMembers:
|
for member in groupMembers:
|
||||||
namespace = member['email'].find('@') == -1
|
if member['type'] != Ent.TYPE_GROUP:
|
||||||
if member['type'] != Ent.TYPE_GROUP or namespace:
|
|
||||||
if ((member['type'] in typesSet and
|
if ((member['type'] in typesSet and
|
||||||
checkMemberMatch(member, memberOptions) and
|
checkMemberMatch(member, memberOptions) and
|
||||||
_checkMemberRoleIsSuspendedIsArchived(member, validRoles, memberOptions[MEMBEROPTION_ISSUSPENDED], memberOptions[MEMBEROPTION_ISARCHIVED]) and
|
_checkMemberRoleIsSuspendedIsArchived(member, validRoles, memberOptions[MEMBEROPTION_ISSUSPENDED], memberOptions[MEMBEROPTION_ISARCHIVED]) and
|
||||||
@ -34200,8 +34260,7 @@ def getGroupMembers(cd, groupEmail, memberRoles, membersList, membersSet, i, cou
|
|||||||
memberOptions, memberDisplayOptions, level+1, typesSet)
|
memberOptions, memberDisplayOptions, level+1, typesSet)
|
||||||
else:
|
else:
|
||||||
for member in groupMembers:
|
for member in groupMembers:
|
||||||
namespace = member['email'].find('@') == -1
|
if member['type'] != Ent.TYPE_GROUP:
|
||||||
if member['type'] != Ent.TYPE_GROUP or namespace:
|
|
||||||
if ((member['type'] in typesSet) and
|
if ((member['type'] in typesSet) and
|
||||||
checkMemberMatch(member, memberOptions) and
|
checkMemberMatch(member, memberOptions) and
|
||||||
_checkMemberRoleIsSuspendedIsArchived(member, validRoles,
|
_checkMemberRoleIsSuspendedIsArchived(member, validRoles,
|
||||||
@ -36253,7 +36312,7 @@ def getCIGroupTransitiveMembers(ci, groupName, membersList, i, count):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def getCIGroupMembers(ci, groupName, memberRoles, membersList, membersSet, i, count,
|
def getCIGroupMembers(ci, groupName, memberRoles, membersList, membersSet, i, count,
|
||||||
memberOptions, memberDisplayOptions, level, typesSet, groupEmail, kwargs):
|
memberOptions, memberDisplayOptions, level, typesSet, groupEmail, kwargs, cd):
|
||||||
nameToPrint = groupEmail if groupEmail else groupName
|
nameToPrint = groupEmail if groupEmail else groupName
|
||||||
printGettingAllEntityItemsForWhom(memberRoles if memberRoles else Ent.ROLE_MANAGER_MEMBER_OWNER, nameToPrint, i, count)
|
printGettingAllEntityItemsForWhom(memberRoles if memberRoles else Ent.ROLE_MANAGER_MEMBER_OWNER, nameToPrint, i, count)
|
||||||
validRoles = _getCIRoleVerification(memberRoles)
|
validRoles = _getCIRoleVerification(memberRoles)
|
||||||
@ -36266,16 +36325,21 @@ def getCIGroupMembers(ci, groupName, memberRoles, membersList, membersSet, i, co
|
|||||||
if member['type'] in typesSet and checkCIMemberMatch(member, memberOptions):
|
if member['type'] in typesSet and checkCIMemberMatch(member, memberOptions):
|
||||||
membersList.append(member)
|
membersList.append(member)
|
||||||
return
|
return
|
||||||
try:
|
if not groupEmail.startswith('space/'):
|
||||||
groupMembers = callGAPIpages(ci.groups().memberships(), 'list', 'memberships',
|
try:
|
||||||
pageMessage=getPageMessageForWhom(),
|
groupMembers = callGAPIpages(ci.groups().memberships(), 'list', 'memberships',
|
||||||
throwReasons=GAPI.CIGROUP_LIST_THROW_REASONS, retryReasons=GAPI.CIGROUP_RETRY_REASONS,
|
pageMessage=getPageMessageForWhom(),
|
||||||
parent=groupName, **kwargs)
|
throwReasons=GAPI.CIGROUP_LIST_THROW_REASONS, retryReasons=GAPI.CIGROUP_RETRY_REASONS,
|
||||||
except (GAPI.resourceNotFound, GAPI.domainNotFound, GAPI.domainCannotUseApis,
|
parent=groupName, **kwargs)
|
||||||
GAPI.forbidden, GAPI.badRequest, GAPI.invalid, GAPI.invalidArgument, GAPI.systemError,
|
except (GAPI.resourceNotFound, GAPI.domainNotFound, GAPI.domainCannotUseApis,
|
||||||
GAPI.permissionDenied, GAPI.serviceNotAvailable):
|
GAPI.forbidden, GAPI.badRequest, GAPI.invalid, GAPI.invalidArgument, GAPI.systemError,
|
||||||
entityUnknownWarning(Ent.CLOUD_IDENTITY_GROUP, nameToPrint, i, count)
|
GAPI.permissionDenied, GAPI.serviceNotAvailable):
|
||||||
return
|
entityUnknownWarning(Ent.CLOUD_IDENTITY_GROUP, nameToPrint, i, count)
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
if cd is None:
|
||||||
|
cd = buildGAPIObject(API.DIRECTORY)
|
||||||
|
groupMembers = _getChatSpaceMembers(cd, groupEmail, groupName)
|
||||||
checkCategory = memberDisplayOptions['showCategory']
|
checkCategory = memberDisplayOptions['showCategory']
|
||||||
if not memberOptions[MEMBEROPTION_RECURSIVE]:
|
if not memberOptions[MEMBEROPTION_RECURSIVE]:
|
||||||
if memberOptions[MEMBEROPTION_NODUPLICATES]:
|
if memberOptions[MEMBEROPTION_NODUPLICATES]:
|
||||||
@ -36300,8 +36364,7 @@ def getCIGroupMembers(ci, groupName, memberRoles, membersList, membersSet, i, co
|
|||||||
for member in groupMembers:
|
for member in groupMembers:
|
||||||
getCIGroupMemberRoleFixType(member)
|
getCIGroupMemberRoleFixType(member)
|
||||||
memberName = member.get('preferredMemberKey', {}).get('id', '')
|
memberName = member.get('preferredMemberKey', {}).get('id', '')
|
||||||
namespace = member.get('preferredMemberKey', {}).get('namespace', '')
|
if member['type'] != Ent.TYPE_GROUP:
|
||||||
if member['type'] != Ent.TYPE_GROUP or namespace:
|
|
||||||
if (member['type'] in typesSet and
|
if (member['type'] in typesSet and
|
||||||
checkCIMemberMatch(member, memberOptions) and
|
checkCIMemberMatch(member, memberOptions) and
|
||||||
_checkMemberRole(member, validRoles) and
|
_checkMemberRole(member, validRoles) and
|
||||||
@ -36324,13 +36387,12 @@ def getCIGroupMembers(ci, groupName, memberRoles, membersList, membersSet, i, co
|
|||||||
groupMemberList.append((f'groups/{gname}', memberName))
|
groupMemberList.append((f'groups/{gname}', memberName))
|
||||||
for member in groupMemberList:
|
for member in groupMemberList:
|
||||||
getCIGroupMembers(ci, member[0], memberRoles, membersList, membersSet, i, count,
|
getCIGroupMembers(ci, member[0], memberRoles, membersList, membersSet, i, count,
|
||||||
memberOptions, memberDisplayOptions, level+1, typesSet, member[1], kwargs)
|
memberOptions, memberDisplayOptions, level+1, typesSet, member[1], kwargs, cd)
|
||||||
else:
|
else:
|
||||||
for member in groupMembers:
|
for member in groupMembers:
|
||||||
getCIGroupMemberRoleFixType(member)
|
getCIGroupMemberRoleFixType(member)
|
||||||
memberName = member.get('preferredMemberKey', {}).get('id', '')
|
memberName = member.get('preferredMemberKey', {}).get('id', '')
|
||||||
namespace = member.get('preferredMemberKey', {}).get('namespace', '')
|
if member['type'] != Ent.TYPE_GROUP:
|
||||||
if member['type'] != Ent.TYPE_GROUP or namespace:
|
|
||||||
if (member['type'] in typesSet and
|
if (member['type'] in typesSet and
|
||||||
checkCIMemberMatch(member, memberOptions) and
|
checkCIMemberMatch(member, memberOptions) and
|
||||||
_checkMemberRole(member, validRoles) and
|
_checkMemberRole(member, validRoles) and
|
||||||
@ -36347,7 +36409,7 @@ def getCIGroupMembers(ci, groupName, memberRoles, membersList, membersSet, i, co
|
|||||||
membersList.append(member)
|
membersList.append(member)
|
||||||
_, gname = member['name'].rsplit('/', 1)
|
_, gname = member['name'].rsplit('/', 1)
|
||||||
getCIGroupMembers(ci, f'groups/{gname}', memberRoles, membersList, membersSet, i, count,
|
getCIGroupMembers(ci, f'groups/{gname}', memberRoles, membersList, membersSet, i, count,
|
||||||
memberOptions, memberDisplayOptions, level+1, typesSet, memberName, kwargs)
|
memberOptions, memberDisplayOptions, level+1, typesSet, memberName, kwargs, cd)
|
||||||
|
|
||||||
CIGROUPMEMBERS_FIELDS_CHOICE_MAP = {
|
CIGROUPMEMBERS_FIELDS_CHOICE_MAP = {
|
||||||
'createtime': 'createTime',
|
'createtime': 'createTime',
|
||||||
@ -36511,7 +36573,7 @@ def doPrintCIGroupMembers():
|
|||||||
membersList = []
|
membersList = []
|
||||||
membersSet = set()
|
membersSet = set()
|
||||||
getCIGroupMembers(ci, groupEntity['name'], getRoles, membersList, membersSet, i, count,
|
getCIGroupMembers(ci, groupEntity['name'], getRoles, membersList, membersSet, i, count,
|
||||||
memberOptions, memberDisplayOptions, level, typesSet, groupEmail, kwargs)
|
memberOptions, memberDisplayOptions, level, typesSet, groupEmail, kwargs, None)
|
||||||
if showOwnedBy and not checkCIGroupShowOwnedBy(showOwnedBy, membersList):
|
if showOwnedBy and not checkCIGroupShowOwnedBy(showOwnedBy, membersList):
|
||||||
continue
|
continue
|
||||||
for member in membersList:
|
for member in membersList:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user