Created
May 16, 2024 17:29
-
-
Save jdiverp/fc481aefad4ab3c6b1bc9a0a8e3c4763 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python3 | |
import sys | |
import time | |
import json | |
import argparse | |
import urllib3, urllib.parse | |
import csv | |
GWS_HOST = 'eval.groups.uw.edu' | |
GWS_HOST = 'groups.uw.edu' | |
GWS_PORT = 443 | |
KEY_FILE = '' | |
CERT_FILE = '' | |
GWS_HEAD = { "Content-type": "application/json", "Accept": "application/json" } | |
GWS_UPDATE_HEAD = { "Content-type": "application/json", "Accept": "*/*", "If-Match": "*" } | |
METHOD = 'GET' | |
GWS_BASE = 'https://'+GWS_HOST+'/group_sws/v3' | |
registry_source_text = '/?source=registry' | |
http = urllib3.PoolManager( key_file=KEY_FILE, cert_file=CERT_FILE ) | |
group = '' | |
class GWSMember: | |
def __init__(self, id, type = "uwnetid"): | |
self.id = id | |
self.type= type | |
class GWSMemberEncode(json.JSONEncoder): | |
def default(self, obj): | |
if isinstance(obj, GWSMember): | |
return {"id": obj.id, "type": obj.type} | |
return super().default(obj) | |
parser = argparse.ArgumentParser(prog='gws_put-members.py') | |
parser.add_argument('--group',help='group id to update',required=True) | |
parser.add_argument('--memberfile',help='filename with members to add',required=True) | |
parser.add_argument('--debug',help='show debuging timing information', action='store_true') | |
parser.add_argument('--add',help='insert new members', action='store_true') | |
parser.add_argument('--delete',help='insert remove members', action='store_true') | |
parser.add_argument('--registry',help='source group members from registry', action='store_true') | |
#parser.print_help() | |
args = parser.parse_args() | |
#print(args.group) | |
t_ = time.time() | |
def read_member_file(): | |
members = [] | |
with open(args.memberfile, 'r') as source_list_file: | |
reader = csv.reader(source_list_file) | |
for row in reader: | |
members.append(urllib.parse.quote_plus(row[0])) | |
return members | |
def filter_set (list1, list2): | |
list_to_filter = list1[:] | |
items_to_filter = list2[:] | |
for item in items_to_filter: | |
if item in list_to_filter: | |
list_to_filter.remove(item) | |
return list(list_to_filter) | |
def get_membership(): | |
membership = [] | |
groupsData = [] | |
REQUEST = GWS_BASE + '/group/%s/member' % args.group | |
if args.registry: | |
REQUEST = REQUEST + registry_source_text | |
response = http.request(METHOD, REQUEST, headers=GWS_HEAD) | |
if response.status != 200: | |
print("GWS get membership error. Reason %s") % response.reason | |
return 1 | |
groupsData = json.loads(response.data) | |
group_members = [] | |
if groupsData["data"] is None: | |
return list() | |
for value in groupsData["data"]: | |
if value["type"] == "uwnetid": | |
membership.append(str(value["id"])) | |
return list(membership) | |
def update_group_members(member_list, call='PUT'): | |
t2_ = time.time() | |
METHOD = call | |
body = None | |
code = None | |
REQUEST = GWS_BASE + '/group/' + args.group + '/member/' + ','.join(member_list) | |
if member_list is None: | |
print ("Member list for %s is empty" % args.group) | |
return False | |
response = http.request(METHOD, REQUEST, headers=GWS_UPDATE_HEAD) | |
try: | |
code = response.status | |
body = response.data | |
except Exception as e: | |
print(">>> error encountered! {}".format(str(e))) | |
if args.debug: | |
print ("HTTP code: "+code) | |
print ("BODY: "+body) | |
duration = (time.time() - t2_) | |
if args.debug: | |
print (METHOD+" "+REQUEST) | |
print (METHOD + ": members %s for group %s. Response %s" % (' '.join(member_list), args.group, code)) | |
if code != 200: | |
print ("received error %s from GWS" % code) | |
else: | |
print ("%.02f seconds elapsed, %s speed is %.2f seconds / member" % (duration, METHOD, duration / len(batches))) | |
def divide_chunks(l, n): | |
# looping till length l | |
for i in range(0, len(l), n): | |
yield l[i:i + n] | |
# main | |
ExistingMembers = get_membership() | |
print ( "currently there are %s members in %s" % (len(ExistingMembers), args.group)) | |
NewMembers = read_member_file() | |
AddMembers = filter_set(NewMembers,ExistingMembers) | |
DelMembers = filter_set(ExistingMembers,NewMembers) | |
print ( "%s people need to be added to this group %s" % (len(AddMembers), args.group)) | |
print ( "%s people need to be removed from this group %s" % (len(DelMembers), args.group)) | |
if args.debug: | |
print (NewMembers) | |
print ("add ", AddMembers) | |
print ("del ", DelMembers) | |
if AddMembers and args.add: | |
for batches in list(divide_chunks(AddMembers,100)): | |
update_group_members(batches, 'PUT') | |
if DelMembers and args.delete: | |
for batches in list(divide_chunks(DelMembers,100)): | |
update_group_members(batches, 'DELETE') | |
print ("total time was %.2f" % (time.time() - t_)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment