diff --git a/src/GamCommands.txt b/src/GamCommands.txt index 35a0accd..9970bf22 100644 --- a/src/GamCommands.txt +++ b/src/GamCommands.txt @@ -531,6 +531,7 @@ gam update group sync [owner|manager|member] gam update group update [owner|manager|member] gam delete group gam info group [nousers] [noaliases] [groups] +gam update group clear [owner] [manager] [member] gam print groups [todrive] ([domain ] [member ]) [maxresults ] [delimiter ] diff --git a/src/gam.py b/src/gam.py index c838e83a..85d6daf1 100755 --- a/src/gam.py +++ b/src/gam.py @@ -6181,12 +6181,13 @@ def doRemoveUsersGroups(users): def doUpdateGroup(): cd = buildGAPIObject(u'directory') group = sys.argv[3] - if sys.argv[4].lower() in [u'add', u'update', u'sync', u'remove']: + myarg = sys.argv[4].lower() + if myarg in [u'add', u'update', u'sync', u'remove', u'clear']: if group[0:3].lower() == u'uid:': group = group[4:] elif group.find(u'@') == -1: group = u'%s@%s' % (group, GC_Values[GC_DOMAIN]) - if sys.argv[4].lower() in [u'add', u'update']: + if myarg in [u'add', u'update']: role = sys.argv[5].upper() i = 6 if role not in [u'OWNER', u'MANAGER', u'MEMBER']: @@ -6200,16 +6201,16 @@ def doUpdateGroup(): for user_email in users_email: if user_email != u'*' and user_email.find(u'@') == -1: user_email = u'%s@%s' % (user_email, GC_Values[GC_DOMAIN]) - sys.stderr.write(u' %sing %s %s...\n' % (sys.argv[4].lower(), role.lower(), user_email)) + sys.stderr.write(u' %sing %s %s...\n' % (myarg, role.lower(), user_email)) try: - if sys.argv[4].lower() == u'add': + if myarg == u'add': body = {u'role': role, u'email': user_email} callGAPI(cd.members(), u'insert', soft_errors=True, groupKey=group, body=body) - elif sys.argv[4].lower() == u'update': + else: callGAPI(cd.members(), u'update', soft_errors=True, groupKey=group, memberKey=user_email, body=body) except googleapiclient.errors.HttpError: pass - elif sys.argv[4].lower() == u'sync': + elif myarg == u'sync': role = sys.argv[5].upper() i = 6 if role not in [u'OWNER', u'MANAGER', u'MEMBER']: @@ -6228,7 +6229,7 @@ def doUpdateGroup(): for user_email in to_remove: items.append([u'update', u'group', group, u'remove', user_email]) run_batch(items) - elif sys.argv[4].lower() == u'remove': + elif myarg == u'remove': i = 5 if sys.argv[i].lower() in [u'member', u'manager', u'owner']: i += 1 @@ -6243,6 +6244,25 @@ def doUpdateGroup(): user_email = u'%s@%s' % (user_email, GC_Values[GC_DOMAIN]) sys.stderr.write(u' removing %s\n' % user_email) callGAPI(cd.members(), u'delete', soft_errors=True, groupKey=group, memberKey=user_email) + else: # clear + roles = [] + i = 5 + while i < len(sys.argv): + role = sys.argv[i].upper() + if role in [u'OWNER', u'MANAGER', u'MEMBER']: + roles.append(role) + i += 1 + else: + print u'ERROR: %s is not a valid argument for "gam update group clear"' % sys.argv[i] + sys.exit(2) + if roles: + roles = u','.join(sorted(set(roles))) + else: + roles = u'MEMBER' + user_emails = getUsersToModify(entity_type=u'group', entity=group, member_type=roles) + for user_email in user_emails: + sys.stderr.write(u' removing %s\n' % user_email) + callGAPI(cd.members(), u'delete', soft_errors=True, groupKey=group, memberKey=user_email) else: i = 4 use_cd_api = False diff --git a/src/whatsnew.txt b/src/whatsnew.txt index fa02420c..98bbeeb9 100644 --- a/src/whatsnew.txt +++ b/src/whatsnew.txt @@ -15,6 +15,7 @@ GAM 3.66 -Add domain and member arguments to gam print group-members to allow selecting subsets of groups -Add showcounts argument to gam show labels to allow seeing message counts for each label -Add arguments to gam show fileinfo * to allow field selection + -Add option to gam update group to allow clearing members: gam update group clear [owner] [manager] [member] GAM 3.65 -fix vacation issues (Ross)