Skip to content

Instantly share code, notes, and snippets.

@jdiverp
Created May 16, 2024 17:29
Show Gist options
  • Save jdiverp/fc481aefad4ab3c6b1bc9a0a8e3c4763 to your computer and use it in GitHub Desktop.
Save jdiverp/fc481aefad4ab3c6b1bc9a0a8e3c4763 to your computer and use it in GitHub Desktop.
#!/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